Merge pull request #881 from twetech/0.1.8.3

0.1.8.3 (Calendar Update)
This commit is contained in:
Johnny 2024-02-15 12:16:51 -05:00 committed by GitHub
commit b8f8cca54c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
133 changed files with 33325 additions and 4152 deletions

View File

@ -8,7 +8,7 @@ if (isset($_GET['calendar_id'])) {
}
?>
<link href='plugins/fullcalendar/main.min.css' rel='stylesheet' />
<link href='plugins/fullcalendar-6.1.10/dist/index.global.js' rel='stylesheet' />
<!-- So that when hovering over a created event it turns into a hand instead of cursor -->
<style>
@ -48,7 +48,7 @@ while ($row = mysqli_fetch_array($sql)) {
<?php require_once "footer.php";
?>
<script src='plugins/fullcalendar/main.min.js'></script>
<script src='plugins/fullcalendar-6.1.10/dist/index.global.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
@ -59,12 +59,14 @@ while ($row = mysqli_fetch_array($sql)) {
defaultView: 'dayGridMonth',
customButtons: {
addEvent: {
text: 'Add Event',
bootstrapFontAwesome: 'fa fa-plus',
click: function() {
$("#addCalendarEventModal").modal();
}
},
addCalendar: {
text: 'Add Calendar',
bootstrapFontAwesome: 'fa fa-calendar-plus',
click: function() {
$("#addCalendarModal").modal();
@ -76,104 +78,156 @@ while ($row = mysqli_fetch_array($sql)) {
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listMonth addEvent addCalendar'
},
events: [
<?php
$sql = mysqli_query($mysqli, "SELECT * FROM events LEFT JOIN calendars ON event_calendar_id = calendar_id");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['event_id']);
$event_title = json_encode($row['event_title']);
$event_start = json_encode($row['event_start']);
$event_end = json_encode($row['event_end']);
$calendar_id = intval($row['calendar_id']);
$calendar_name = json_encode($row['calendar_name']);
$calendar_color = json_encode($row['calendar_color']);
<?php if (!$session_mobile) {
?>aspectRatio: 2.5,
<?php } else { ?>
aspectRatio: 0.7,
<?php } ?>
navLinks: true, // can click day/week names to navigate views
selectable: true,
height: '90vh',
echo "{ id: $event_id, title: $event_title, start: $event_start, end: $event_end, color: $calendar_color },";
}
selectMirror: true,
eventClick: function(editEvent) {
$('#editEventModal' + editEvent.event.id).modal();
},
dayMaxEvents: true, // allow "more" link when too many events
views: {
timeGrid: {
dayMaxEventRows: 3, // adjust to 6 only for timeGridWeek/timeGridDay
expandRows: true,
nowIndicator: true,
eventMaxStack: 1,
},
dayGrid: {
dayMaxEvents: 3, // adjust to 6 only for timeGridWeek/timeGridDay
expandRows: true,
},
//Invoices Created
$sql = mysqli_query($mysqli, "SELECT * FROM clients LEFT JOIN invoices ON client_id = invoice_client_id");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['invoice_id']);
$event_title = json_encode($row['invoice_prefix'] . $row['invoice_number'] . " " . $row['invoice_scope']);
$event_start = json_encode($row['invoice_date']);
},
events: [
<?php
$sql = mysqli_query($mysqli, "SELECT * FROM events LEFT JOIN calendars ON event_calendar_id = calendar_id");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['event_id']);
$event_title = json_encode($row['event_title']);
$event_start = json_encode($row['event_start']);
$event_end = json_encode($row['event_end']);
$calendar_id = intval($row['calendar_id']);
$calendar_name = json_encode($row['calendar_name']);
$calendar_color = json_encode($row['calendar_color']);
echo "{ id: $event_id, title: $event_title, start: $event_start, color: 'blue', url: 'invoice.php?invoice_id=$event_id' },";
}
//Quotes Created
$sql = mysqli_query($mysqli, "SELECT * FROM clients LEFT JOIN quotes ON client_id = quote_client_id");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['quote_id']);
$event_title = json_encode($row['quote_prefix'] . $row['quote_number'] . " " . $row['quote_scope']);
$event_start = json_encode($row['quote_date']);
echo "{ id: $event_id, title: $event_title, start: $event_start, color: 'purple', url: 'quote.php?quote_id=$event_id' },";
}
//Tickets Created
$sql = mysqli_query($mysqli, "SELECT * FROM clients LEFT JOIN tickets ON client_id = ticket_client_id");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['ticket_id']);
$event_title = json_encode($row['ticket_prefix'] . $row['ticket_number'] . " " . $row['ticket_subject']);
$event_start = json_encode($row['ticket_created_at']);
echo "{ id: $event_id, title: $event_title, start: $event_start, color: 'orange', url: 'ticket.php?ticket_id=$event_id' },";
}
//Tickets Scheduled
$sql = mysqli_query($mysqli, "SELECT * FROM clients LEFT JOIN tickets ON client_id = ticket_client_id LEFT JOIN users ON ticket_assigned_to = user_id WHERE ticket_schedule IS NOT NULL");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['ticket_id']);
if (empty($username)) {
$username = "Unassigned";
} else {
$username = $row['user_name'];
}
if (strtotime($row['ticket_schedule']) < time()) {
if ($row['ticket_status'] == 'Scheduled') {
$event_color = "red";
} else {
$event_color = "green";
}
} else {
$event_color = "grey";
}
$event_title = json_encode($row['ticket_prefix'] . $row['ticket_number'] . " " . $row['ticket_subject'] . " [" . $username . "]");
$event_start = json_encode($row['ticket_schedule']);
echo "{ id: $event_id, title: $event_title, start: $event_start, color: '$event_color', url: 'ticket.php?ticket_id=$event_id' },";
}
//Vendors Added Created
$sql = mysqli_query($mysqli, "SELECT * FROM clients LEFT JOIN vendors ON client_id = vendor_client_id WHERE vendor_template = 0");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['vendor_id']);
$client_id = intval($row['client_id']);
$event_title = json_encode($row['vendor_name']);
$event_start = json_encode($row['vendor_created_at']);
echo "{ id: $event_id, title: $event_title, start: $event_start, color: 'brown', url: 'client_vendors.php?client_id=$client_id' },";
}
//Clients Added
$sql = mysqli_query($mysqli, "SELECT * FROM clients");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['client_id']);
$event_title = json_encode($row['client_name']);
$event_start = json_encode($row['client_created_at']);
echo "{ id: $event_id, title: $event_title, start: $event_start, color: 'green', url: 'client_overview.php?client_id=$event_id' },";
}
?>
],
eventClick: function(editEvent) {
$('#editEventModal' + editEvent.event.id).modal();
echo "{ id: $event_id, title: $event_title, start: $event_start, end: $event_end, color: $calendar_color },";
}
//Invoices Created
$sql = mysqli_query($mysqli, "SELECT * FROM clients LEFT JOIN invoices ON client_id = invoice_client_id");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['invoice_id']);
$scope = strval($row['invoice_scope']);
if (empty($scope)) {
$scope = "Not Set";
}
$event_title = json_encode($row['invoice_prefix'] . $row['invoice_number'] . " created -scope: " . $scope);
$event_start = json_encode($row['invoice_date']);
echo "{ id: $event_id, title: $event_title, start: $event_start, display: 'list-item', color: 'blue', url: 'invoice.php?invoice_id=$event_id' },";
}
//Quotes Created
$sql = mysqli_query($mysqli, "SELECT * FROM clients LEFT JOIN quotes ON client_id = quote_client_id");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['quote_id']);
$event_title = json_encode($row['quote_prefix'] . $row['quote_number'] . " " . $row['quote_scope']);
$event_start = json_encode($row['quote_date']);
echo "{ id: $event_id, title: $event_title, start: $event_start, display: 'list-item', color: 'purple', url: 'quote.php?quote_id=$event_id' },";
}
//Tickets Created
$sql = mysqli_query($mysqli, "SELECT * FROM clients LEFT JOIN tickets ON client_id = ticket_client_id LEFT JOIN users ON ticket_assigned_to = user_id");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['ticket_id']);
$ticket_status = strval($row['ticket_status']);
$username = $row['user_name'];
if (empty($username)) {
$username = "";
} else {
//Limit to characters and add ...
$username = "[". substr($row['user_name'], 0, 9) . "...]";
}
$event_title = json_encode($row['ticket_prefix'] . $row['ticket_number'] . " created - " . $row['ticket_subject'] . " " . $username . "{" . $ticket_status . "}");
$event_start = json_encode($row['ticket_created_at']);
if ($ticket_status == "Closed") {
$event_color = "black";
} else if ($ticket_status == "Scheduled") {
$event_color = "grey";
} else if ($ticket_status == "Pending-Assignment") {
$event_color = "red";
} else {
$event_color = "blue";
}
echo "{ id: $event_id, title: $event_title, start: $event_start, color: '$event_color', url: 'ticket.php?ticket_id=$event_id' },";
}
//Tickets Scheduled
$sql = mysqli_query($mysqli, "SELECT * FROM clients LEFT JOIN tickets ON client_id = ticket_client_id LEFT JOIN users ON ticket_assigned_to = user_id WHERE ticket_schedule IS NOT NULL");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['ticket_id']);
$username = $row['user_name'];
if (empty($username)) {
$username = "";
} else {
//Limit to characters and add ...
$username = substr($row['user_name'], 0, 9) . "...";
}
if (strtotime($row['ticket_schedule']) < time()) {
if ($row['ticket_status'] == 'Scheduled') {
$event_color = "red";
} else {
$event_color = "green";
}
} else {
$event_color = "grey";
}
$ticket_status = strval($row['ticket_status']);
$event_title = json_encode($row['ticket_prefix'] . $row['ticket_number'] . " scheduled - " . $row['ticket_subject'] . " [" . $username . "]{" . $ticket_status . "}");
$event_start = json_encode($row['ticket_schedule']);
echo "{ id: $event_id, title: $event_title, start: $event_start, color: '$event_color', url: 'ticket.php?ticket_id=$event_id' },";
}
//Vendors Added Created
$sql = mysqli_query($mysqli, "SELECT * FROM clients LEFT JOIN vendors ON client_id = vendor_client_id WHERE vendor_template = 0");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['vendor_id']);
$client_id = intval($row['client_id']);
$event_title = json_encode("Vendor : '" . $row['vendor_name'] . "' created");
$event_start = json_encode($row['vendor_created_at']);
echo "{ id: $event_id, title: $event_title, start: $event_start, color: 'brown', url: 'client_vendors.php?client_id=$client_id' },";
}
//Clients Added
$sql = mysqli_query($mysqli, "SELECT * FROM clients");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['client_id']);
$event_title = json_encode("Client: '" . $row['client_name'] . "' created");
$event_start = json_encode($row['client_created_at']);
echo "{ id: $event_id, title: $event_title, start: $event_start, color: 'brown', url: 'client_overview.php?client_id=$event_id' },";
}
?>
],
eventOrder: 'allDay,start,-duration,title',
});
calendar.render();

View File

@ -75,6 +75,9 @@ if ($iPod || $iPhone || $iPad) {
$session_map_source = "google";
}
//Check if mobile device
$session_mobile = isMobile();
//Get Notification Count for the badge on the top nav
$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('notification_id') AS num FROM notifications WHERE (notification_user_id = $session_user_id OR notification_user_id = 0) AND notification_dismissed_at IS NULL"));
$num_notifications = $row['num'];

View File

@ -9,7 +9,7 @@ if (isset($_GET['calendar_id'])) {
?>
<link href='plugins/fullcalendar/main.min.css' rel='stylesheet' />
<link href='plugins/fullcalendar-6.1.10/dist/index.global.js' rel='stylesheet' />
<!-- So that when hovering over a created event it turns into a hand instead of cursor -->
<style>
@ -48,10 +48,9 @@ while ($row = mysqli_fetch_array($sql)) {
?>
<script src='plugins/fullcalendar/main.min.js'></script>
<script src='plugins/fullcalendar-6.1.10/dist/index.global.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
@ -60,13 +59,15 @@ while ($row = mysqli_fetch_array($sql)) {
defaultView: 'dayGridMonth',
customButtons: {
addEvent: {
bootstrapFontAwesome: 'fa fa-fw fa-plus',
text: 'Add Event',
bootstrapFontAwesome: 'fa fa-plus',
click: function() {
$("#addCalendarEventModal").modal();
}
},
addCalendar: {
bootstrapFontAwesome: 'fa fa-fw fa-calendar-plus',
text: 'Add Calendar',
bootstrapFontAwesome: 'fa fa-calendar-plus',
click: function() {
$("#addCalendarModal").modal();
}
@ -77,6 +78,33 @@ while ($row = mysqli_fetch_array($sql)) {
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listMonth addEvent addCalendar'
},
<?php if (!$session_mobile) {
?>aspectRatio: 2.5,
<?php } else { ?>
aspectRatio: 0.7,
<?php } ?>
navLinks: true, // can click day/week names to navigate views
selectable: true,
height: '90vh',
selectMirror: true,
eventClick: function(editEvent) {
$('#editEventModal' + editEvent.event.id).modal();
},
dayMaxEvents: true, // allow "more" link when too many events
views: {
timeGrid: {
dayMaxEventRows: 3, // adjust to 6 only for timeGridWeek/timeGridDay
expandRows: true,
nowIndicator: true,
eventMaxStack: 1,
},
dayGrid: {
dayMaxEvents: 3, // adjust to 6 only for timeGridWeek/timeGridDay
expandRows: true,
},
},
events: [
<?php
$sql = mysqli_query($mysqli, "SELECT * FROM calendars LEFT JOIN events ON calendar_id = event_calendar_id WHERE event_client_id = $client_id");
@ -91,11 +119,98 @@ while ($row = mysqli_fetch_array($sql)) {
echo "{ id: $event_id, title: $event_title, start: $event_start, end: $event_end, color: $calendar_color },";
}
//Invoices Created
$sql = mysqli_query($mysqli, "SELECT * FROM clients LEFT JOIN invoices ON client_id = invoice_client_id WHERE client_id = $client_id");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['invoice_id']);
$scope = strval($row['invoice_scope']);
if (empty($scope)) {
$scope = "Not Set";
}
$event_title = json_encode($row['invoice_prefix'] . $row['invoice_number'] . " created -scope: " . $scope);
$event_start = json_encode($row['invoice_date']);
echo "{ id: $event_id, title: $event_title, start: $event_start, display: 'list-item', color: 'blue', url: 'invoice.php?invoice_id=$event_id' },";
}
//Quotes Created
$sql = mysqli_query($mysqli, "SELECT * FROM clients LEFT JOIN quotes ON client_id = quote_client_id WHERE client_id = $client_id");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['quote_id']);
$event_title = json_encode($row['quote_prefix'] . $row['quote_number'] . " " . $row['quote_scope']);
$event_start = json_encode($row['quote_date']);
echo "{ id: $event_id, title: $event_title, start: $event_start, display: 'list-item', color: 'purple', url: 'quote.php?quote_id=$event_id' },";
}
//Tickets Created
$sql = mysqli_query($mysqli, "SELECT * FROM clients LEFT JOIN tickets ON client_id = ticket_client_id LEFT JOIN users ON ticket_assigned_to = user_id WHERE client_id = $client_id");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['ticket_id']);
$ticket_status = strval($row['ticket_status']);
$username = $row['user_name'];
if (empty($username)) {
$username = "";
} else {
//Limit to characters and add ...
$username = "[". substr($row['user_name'], 0, 9) . "...]";
}
$event_title = json_encode($row['ticket_prefix'] . $row['ticket_number'] . " created - " . $row['ticket_subject'] . " " . $username . "{" . $ticket_status . "}");
$event_start = json_encode($row['ticket_created_at']);
if ($ticket_status == "Closed") {
$event_color = "black";
} else if ($ticket_status == "Scheduled") {
$event_color = "grey";
} else if ($ticket_status == "Pending-Assignment") {
$event_color = "red";
} else {
$event_color = "blue";
}
echo "{ id: $event_id, title: $event_title, start: $event_start, color: '$event_color', url: 'ticket.php?ticket_id=$event_id' },";
}
//Tickets Scheduled
$sql = mysqli_query($mysqli, "SELECT * FROM clients LEFT JOIN tickets ON client_id = ticket_client_id LEFT JOIN users ON ticket_assigned_to = user_id WHERE ticket_schedule IS NOT NULL AND client_id = $client_id");
while ($row = mysqli_fetch_array($sql)) {
$event_id = intval($row['ticket_id']);
$username = $row['user_name'];
if (empty($username)) {
$username = "";
} else {
//Limit to characters and add ...
$username = substr($row['user_name'], 0, 9) . "...";
}
if (strtotime($row['ticket_schedule']) < time()) {
if ($row['ticket_status'] == 'Scheduled') {
$event_color = "red";
} else {
$event_color = "green";
}
} else {
$event_color = "grey";
}
$ticket_status = strval($row['ticket_status']);
$event_title = json_encode($row['ticket_prefix'] . $row['ticket_number'] . " scheduled - " . $row['ticket_subject'] . " [" . $username . "]{" . $ticket_status . "}");
$event_start = json_encode($row['ticket_schedule']);
echo "{ id: $event_id, title: $event_title, start: $event_start, color: '$event_color', url: 'ticket.php?ticket_id=$event_id' },";
}
?>
],
eventClick: function(editEvent) {
$('#editEventModal'+editEvent.event.id).modal();
}
},
eventOrder: 'allDay,start,-duration,title',
});
calendar.render();

View File

@ -1085,3 +1085,39 @@ function createiCalStr($datetime, $title, $description, $location)
// Return the iCal string
return $cal_event->export();
}
function isMobile()
{
// Check if the user agent is a mobile device
return preg_match('/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|opera mini|palm|phone|pie|tablet|up.browser|up.link|webos|wos)/i', $_SERVER['HTTP_USER_AGENT']);
}
function createiCalStrCancel($originaliCalStr) {
require_once "plugins/zapcal/zapcallib.php";
// Import the original iCal string
$cal_event = new ZCiCal($originaliCalStr);
// Iterate through the iCalendar object to find VEVENT nodes
foreach($cal_event->tree->child as $node) {
if($node->getName() == "VEVENT") {
// Check if STATUS node exists, update it, or add a new one
$statusFound = false;
foreach($node->data as $key => $value) {
if($key == "STATUS") {
$value->setValue("CANCELLED");
$statusFound = true;
break; // Exit the loop once the STATUS is updated
}
}
// If STATUS node is not found, add a new STATUS node
if (!$statusFound) {
$node->addNode(new ZCiCalDataNode("STATUS:CANCELLED"));
}
}
}
// Return the modified iCal string
return $cal_event->export();
}

View File

@ -0,0 +1,22 @@
MIT License
Copyright (c) 2021 Adam Shaw
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,64 @@
/*!
FullCalendar Bootstrap 4 Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/bootstrap4
(c) 2023 Adam Shaw
*/
FullCalendar.Bootstrap = (function (exports, core, internal$1) {
'use strict';
class BootstrapTheme extends internal$1.Theme {
}
BootstrapTheme.prototype.classes = {
root: 'fc-theme-bootstrap',
table: 'table-bordered',
tableCellShaded: 'table-active',
buttonGroup: 'btn-group',
button: 'btn btn-primary',
buttonActive: 'active',
popover: 'popover',
popoverHeader: 'popover-header',
popoverContent: 'popover-body',
};
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.rtlIconClasses = {
prev: 'fa-chevron-right',
next: 'fa-chevron-left',
prevYear: 'fa-angle-double-right',
nextYear: 'fa-angle-double-left',
};
BootstrapTheme.prototype.iconOverrideOption = 'bootstrapFontAwesome'; // TODO: make TS-friendly. move the option-processing into this plugin
BootstrapTheme.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome';
BootstrapTheme.prototype.iconOverridePrefix = 'fa-';
var css_248z = ".fc-theme-bootstrap a:not([href]){color:inherit}.fc-theme-bootstrap .fc-more-link:hover{text-decoration:none}";
internal$1.injectStyles(css_248z);
var plugin = core.createPlugin({
name: '@fullcalendar/bootstrap',
themeClasses: {
bootstrap: BootstrapTheme,
},
});
var internal = {
__proto__: null,
BootstrapTheme: BootstrapTheme
};
core.globalPlugins.push(plugin);
exports.Internal = internal;
exports["default"] = plugin;
Object.defineProperty(exports, '__esModule', { value: true });
return exports;
})({}, FullCalendar, FullCalendar.Internal);

View File

@ -0,0 +1,6 @@
/*!
FullCalendar Bootstrap 4 Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/bootstrap4
(c) 2023 Adam Shaw
*/
FullCalendar.Bootstrap=function(e,t,o){"use strict";class r extends o.Theme{}r.prototype.classes={root:"fc-theme-bootstrap",table:"table-bordered",tableCellShaded:"table-active",buttonGroup:"btn-group",button:"btn btn-primary",buttonActive:"active",popover:"popover",popoverHeader:"popover-header",popoverContent:"popover-body"},r.prototype.baseIconClass="fa",r.prototype.iconClasses={close:"fa-times",prev:"fa-chevron-left",next:"fa-chevron-right",prevYear:"fa-angle-double-left",nextYear:"fa-angle-double-right"},r.prototype.rtlIconClasses={prev:"fa-chevron-right",next:"fa-chevron-left",prevYear:"fa-angle-double-right",nextYear:"fa-angle-double-left"},r.prototype.iconOverrideOption="bootstrapFontAwesome",r.prototype.iconOverrideCustomButtonOption="bootstrapFontAwesome",r.prototype.iconOverridePrefix="fa-";o.injectStyles(".fc-theme-bootstrap a:not([href]){color:inherit}.fc-theme-bootstrap .fc-more-link:hover{text-decoration:none}");var a=t.createPlugin({name:"@fullcalendar/bootstrap",themeClasses:{bootstrap:r}}),n={__proto__:null,BootstrapTheme:r};return t.globalPlugins.push(a),e.Internal=n,e.default=a,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,29 @@
/*!
FullCalendar Core v6.1.10
Docs & License: https://fullcalendar.io
(c) 2023 Adam Shaw
*/
(function (index_js) {
'use strict';
var locale = {
code: 'en-au',
week: {
dow: 1,
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonHints: {
prev: 'Previous $0',
next: 'Next $0',
today: 'This $0',
},
viewHint: '$0 view',
navLinkHint: 'Go to $0',
moreLinkHint(eventCnt) {
return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`;
},
};
index_js.globalLocales.push(locale);
})(FullCalendar);

View File

@ -0,0 +1,6 @@
/*!
FullCalendar Core v6.1.10
Docs & License: https://fullcalendar.io
(c) 2023 Adam Shaw
*/
!function(e){"use strict";var n={code:"en-au",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`};FullCalendar.globalLocales.push(n)}();

View File

@ -0,0 +1,29 @@
/*!
FullCalendar Core v6.1.10
Docs & License: https://fullcalendar.io
(c) 2023 Adam Shaw
*/
(function (index_js) {
'use strict';
var locale = {
code: 'en-gb',
week: {
dow: 1,
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonHints: {
prev: 'Previous $0',
next: 'Next $0',
today: 'This $0',
},
viewHint: '$0 view',
navLinkHint: 'Go to $0',
moreLinkHint(eventCnt) {
return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`;
},
};
index_js.globalLocales.push(locale);
})(FullCalendar);

View File

@ -0,0 +1,6 @@
/*!
FullCalendar Core v6.1.10
Docs & License: https://fullcalendar.io
(c) 2023 Adam Shaw
*/
!function(e){"use strict";var n={code:"en-gb",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`};FullCalendar.globalLocales.push(n)}();

View File

@ -0,0 +1,29 @@
/*!
FullCalendar Core v6.1.10
Docs & License: https://fullcalendar.io
(c) 2023 Adam Shaw
*/
(function (index_js) {
'use strict';
var locale = {
code: 'en-nz',
week: {
dow: 1,
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonHints: {
prev: 'Previous $0',
next: 'Next $0',
today: 'This $0',
},
viewHint: '$0 view',
navLinkHint: 'Go to $0',
moreLinkHint(eventCnt) {
return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`;
},
};
index_js.globalLocales.push(locale);
})(FullCalendar);

View File

@ -0,0 +1,6 @@
/*!
FullCalendar Core v6.1.10
Docs & License: https://fullcalendar.io
(c) 2023 Adam Shaw
*/
!function(e){"use strict";var n={code:"en-nz",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`};FullCalendar.globalLocales.push(n)}();

View File

@ -0,0 +1,35 @@
/*!
FullCalendar Core v6.1.10
Docs & License: https://fullcalendar.io
(c) 2023 Adam Shaw
*/
(function (index_js) {
'use strict';
var locale = {
code: 'uk',
week: {
dow: 1,
doy: 7, // The week that contains Jan 1st is the first week of the year.
},
buttonText: {
prev: 'Попередній',
next: 'далі',
today: 'Сьогодні',
year: 'рік',
month: 'Місяць',
week: 'Тиждень',
day: 'День',
list: 'Порядок денний',
},
weekText: 'Тиж',
allDayText: 'Увесь день',
moreLinkText(n) {
return '+ще ' + n + '...';
},
noEventsText: 'Немає подій для відображення',
};
index_js.globalLocales.push(locale);
})(FullCalendar);

View File

@ -0,0 +1,6 @@
/*!
FullCalendar Core v6.1.10
Docs & License: https://fullcalendar.io
(c) 2023 Adam Shaw
*/
!function(e){"use strict";var t={code:"uk",week:{dow:1,doy:7},buttonText:{prev:"Попередній",next:"далі",today:"Сьогодні",year:"рік",month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},weekText:"Тиж",allDayText:"Увесь день",moreLinkText:e=>"+ще "+e+"...",noEventsText:"Немає подій для відображення"};FullCalendar.globalLocales.push(t)}();

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,150 @@
/*!
FullCalendar Google Calendar Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/google-calendar
(c) 2023 Adam Shaw
*/
FullCalendar.GoogleCalendar = (function (exports, core, internal) {
'use strict';
// TODO: expose somehow
const API_BASE = 'https://www.googleapis.com/calendar/v3/calendars';
const eventSourceDef = {
parseMeta(refined) {
let { googleCalendarId } = refined;
if (!googleCalendarId && refined.url) {
googleCalendarId = parseGoogleCalendarId(refined.url);
}
if (googleCalendarId) {
return {
googleCalendarId,
googleCalendarApiKey: refined.googleCalendarApiKey,
googleCalendarApiBase: refined.googleCalendarApiBase,
extraParams: refined.extraParams,
};
}
return null;
},
fetch(arg, successCallback, errorCallback) {
let { dateEnv, options } = arg.context;
let meta = arg.eventSource.meta;
let apiKey = meta.googleCalendarApiKey || options.googleCalendarApiKey;
if (!apiKey) {
errorCallback(new Error('Specify a googleCalendarApiKey. See https://fullcalendar.io/docs/google-calendar'));
}
else {
let url = buildUrl(meta);
// TODO: make DRY with json-feed-event-source
let { extraParams } = meta;
let extraParamsObj = typeof extraParams === 'function' ? extraParams() : extraParams;
let requestParams = buildRequestParams(arg.range, apiKey, extraParamsObj, dateEnv);
return internal.requestJson('GET', url, requestParams).then(([body, response]) => {
if (body.error) {
errorCallback(new core.JsonRequestError('Google Calendar API: ' + body.error.message, response));
}
else {
successCallback({
rawEvents: gcalItemsToRawEventDefs(body.items, requestParams.timeZone),
response,
});
}
}, errorCallback);
}
},
};
function parseGoogleCalendarId(url) {
let 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;
}
if ((match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^/]*)/.exec(url)) ||
(match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^/]*)/.exec(url))) {
return decodeURIComponent(match[1]);
}
return null;
}
function buildUrl(meta) {
let apiBase = meta.googleCalendarApiBase;
if (!apiBase) {
apiBase = API_BASE;
}
return apiBase + '/' + encodeURIComponent(meta.googleCalendarId) + '/events';
}
function buildRequestParams(range, apiKey, extraParams, dateEnv) {
let params;
let startStr;
let 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 = internal.addDays(range.start, -1).toISOString();
endStr = internal.addDays(range.end, 1).toISOString();
}
params = Object.assign(Object.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((item) => gcalItemToRawEventDef(item, gcalTimezone));
}
function gcalItemToRawEventDef(item, gcalTimezone) {
let 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,
location: item.location,
description: item.description,
attachments: item.attachments || [],
extendedProps: (item.extendedProperties || {}).shared || {},
};
}
// 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(/(\?.*?)?(#|$)/, (whole, qs, hash) => (qs ? qs + '&' : '?') + component + hash);
}
const OPTION_REFINERS = {
googleCalendarApiKey: String,
};
const EVENT_SOURCE_REFINERS = {
googleCalendarApiKey: String,
googleCalendarId: String,
googleCalendarApiBase: String,
extraParams: internal.identity,
};
var plugin = core.createPlugin({
name: '@fullcalendar/google-calendar',
eventSourceDefs: [eventSourceDef],
optionRefiners: OPTION_REFINERS,
eventSourceRefiners: EVENT_SOURCE_REFINERS,
});
core.globalPlugins.push(plugin);
exports["default"] = plugin;
Object.defineProperty(exports, '__esModule', { value: true });
return exports;
})({}, FullCalendar, FullCalendar.Internal);

View File

@ -0,0 +1,6 @@
/*!
FullCalendar Google Calendar Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/google-calendar
(c) 2023 Adam Shaw
*/
FullCalendar.GoogleCalendar=function(e,a,t){"use strict";const n={parseMeta(e){let{googleCalendarId:a}=e;return!a&&e.url&&(a=function(e){let a;if(/^[^/]+@([^/.]+\.)*(google|googlemail|gmail)\.com$/.test(e))return e;if((a=/^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^/]*)/.exec(e))||(a=/^https?:\/\/www.google.com\/calendar\/feeds\/([^/]*)/.exec(e)))return decodeURIComponent(a[1]);return null}(e.url)),a?{googleCalendarId:a,googleCalendarApiKey:e.googleCalendarApiKey,googleCalendarApiBase:e.googleCalendarApiBase,extraParams:e.extraParams}:null},fetch(e,n,r){let{dateEnv:o,options:l}=e.context,s=e.eventSource.meta,i=s.googleCalendarApiKey||l.googleCalendarApiKey;if(i){let l=function(e){let a=e.googleCalendarApiBase;a||(a="https://www.googleapis.com/calendar/v3/calendars");return a+"/"+encodeURIComponent(e.googleCalendarId)+"/events"}(s),{extraParams:d}=s,g="function"==typeof d?d():d,c=function(e,a,n,r){let o,l,s;r.canComputeOffset?(l=r.formatIso(e.start),s=r.formatIso(e.end)):(l=t.addDays(e.start,-1).toISOString(),s=t.addDays(e.end,1).toISOString());o=Object.assign(Object.assign({},n||{}),{key:a,timeMin:l,timeMax:s,singleEvents:!0,maxResults:9999}),"local"!==r.timeZone&&(o.timeZone=r.timeZone);return o}(e.range,i,g,o);return t.requestJson("GET",l,c).then(([e,t])=>{var o,l;e.error?r(new a.JsonRequestError("Google Calendar API: "+e.error.message,t)):n({rawEvents:(o=e.items,l=c.timeZone,o.map(e=>function(e,a){let t=e.htmlLink||null;t&&a&&(t=function(e,a){return e.replace(/(\?.*?)?(#|$)/,(e,t,n)=>(t?t+"&":"?")+a+n)}(t,"ctz="+a));return{id:e.id,title:e.summary,start:e.start.dateTime||e.start.date,end:e.end.dateTime||e.end.date,url:t,location:e.location,description:e.description,attachments:e.attachments||[],extendedProps:(e.extendedProperties||{}).shared||{}}}(e,l))),response:t})},r)}r(new Error("Specify a googleCalendarApiKey. See https://fullcalendar.io/docs/google-calendar"))}};const r={googleCalendarApiKey:String},o={googleCalendarApiKey:String,googleCalendarId:String,googleCalendarApiBase:String,extraParams:t.identity};var l=a.createPlugin({name:"@fullcalendar/google-calendar",eventSourceDefs:[n],optionRefiners:r,eventSourceRefiners:o});return a.globalPlugins.push(l),e.default=l,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal);

View File

@ -0,0 +1,225 @@
/*!
FullCalendar iCalendar Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/icalendar
(c) 2023 Adam Shaw
*/
FullCalendar.ICalendar = (function (exports, core, internal, ICAL) {
'use strict';
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n["default"] = e;
return n;
}
var ICAL__namespace = /*#__PURE__*/_interopNamespace(ICAL);
/* eslint-disable */
class IcalExpander {
constructor(opts) {
this.maxIterations = opts.maxIterations != null ? opts.maxIterations : 1000;
this.skipInvalidDates = opts.skipInvalidDates != null ? opts.skipInvalidDates : false;
this.jCalData = ICAL__namespace.parse(opts.ics);
this.component = new ICAL__namespace.Component(this.jCalData);
this.events = this.component.getAllSubcomponents('vevent').map(vevent => new ICAL__namespace.Event(vevent));
if (this.skipInvalidDates) {
this.events = this.events.filter((evt) => {
try {
evt.startDate.toJSDate();
evt.endDate.toJSDate();
return true;
}
catch (err) {
// skipping events with invalid time
return false;
}
});
}
}
between(after, before) {
function isEventWithinRange(startTime, endTime) {
return (!after || endTime >= after.getTime()) &&
(!before || startTime <= before.getTime());
}
function getTimes(eventOrOccurrence) {
const startTime = eventOrOccurrence.startDate.toJSDate().getTime();
let endTime = eventOrOccurrence.endDate.toJSDate().getTime();
// If it is an all day event, the end date is set to 00:00 of the next day
// So we need to make it be 23:59:59 to compare correctly with the given range
if (eventOrOccurrence.endDate.isDate && (endTime > startTime)) {
endTime -= 1;
}
return { startTime, endTime };
}
const exceptions = [];
this.events.forEach((event) => {
if (event.isRecurrenceException())
exceptions.push(event);
});
const ret = {
events: [],
occurrences: [],
};
this.events.filter(e => !e.isRecurrenceException()).forEach((event) => {
const exdates = [];
event.component.getAllProperties('exdate').forEach((exdateProp) => {
const exdate = exdateProp.getFirstValue();
exdates.push(exdate.toJSDate().getTime());
});
// Recurring event is handled differently
if (event.isRecurring()) {
const iterator = event.iterator();
let next;
let i = 0;
do {
i += 1;
next = iterator.next();
if (next) {
const occurrence = event.getOccurrenceDetails(next);
const { startTime, endTime } = getTimes(occurrence);
const isOccurrenceExcluded = exdates.indexOf(startTime) !== -1;
// TODO check that within same day?
const exception = exceptions.find(ex => ex.uid === event.uid && ex.recurrenceId.toJSDate().getTime() === occurrence.startDate.toJSDate().getTime());
// We have passed the max date, stop
if (before && startTime > before.getTime())
break;
// Check that we are within our range
if (isEventWithinRange(startTime, endTime)) {
if (exception) {
ret.events.push(exception);
}
else if (!isOccurrenceExcluded) {
ret.occurrences.push(occurrence);
}
}
}
} while (next && (!this.maxIterations || i < this.maxIterations));
return;
}
// Non-recurring event:
const { startTime, endTime } = getTimes(event);
if (isEventWithinRange(startTime, endTime))
ret.events.push(event);
});
return ret;
}
before(before) {
return this.between(undefined, before);
}
after(after) {
return this.between(after);
}
all() {
return this.between();
}
}
const eventSourceDef = {
parseMeta(refined) {
if (refined.url && refined.format === 'ics') {
return {
url: refined.url,
format: 'ics',
};
}
return null;
},
fetch(arg, successCallback, errorCallback) {
let meta = arg.eventSource.meta;
let { internalState } = meta;
/*
NOTE: isRefetch is a HACK. we would do the recurring-expanding in a separate plugin hook,
but we couldn't leverage built-in allDay-guessing, among other things.
*/
if (!internalState || arg.isRefetch) {
internalState = meta.internalState = {
response: null,
iCalExpanderPromise: fetch(meta.url, { method: 'GET' }).then((response) => {
return response.text().then((icsText) => {
internalState.response = response;
return new IcalExpander({
ics: icsText,
skipInvalidDates: true,
});
});
}),
};
}
internalState.iCalExpanderPromise.then((iCalExpander) => {
successCallback({
rawEvents: expandICalEvents(iCalExpander, arg.range),
response: internalState.response,
});
}, errorCallback);
},
};
function expandICalEvents(iCalExpander, range) {
// expand the range. because our `range` is timeZone-agnostic UTC
// or maybe because ical.js always produces dates in local time? i forget
let rangeStart = internal.addDays(range.start, -1);
let rangeEnd = internal.addDays(range.end, 1);
let iCalRes = iCalExpander.between(rangeStart, rangeEnd); // end inclusive. will give extra results
let expanded = [];
// TODO: instead of using startDate/endDate.toString to communicate allDay,
// we can query startDate/endDate.isDate. More efficient to avoid formatting/reparsing.
// single events
for (let iCalEvent of iCalRes.events) {
expanded.push(Object.assign(Object.assign({}, buildNonDateProps(iCalEvent)), { start: iCalEvent.startDate.toString(), end: (specifiesEnd(iCalEvent) && iCalEvent.endDate)
? iCalEvent.endDate.toString()
: null }));
}
// recurring event instances
for (let iCalOccurence of iCalRes.occurrences) {
let iCalEvent = iCalOccurence.item;
expanded.push(Object.assign(Object.assign({}, buildNonDateProps(iCalEvent)), { start: iCalOccurence.startDate.toString(), end: (specifiesEnd(iCalEvent) && iCalOccurence.endDate)
? iCalOccurence.endDate.toString()
: null }));
}
return expanded;
}
function buildNonDateProps(iCalEvent) {
return {
title: iCalEvent.summary,
url: extractEventUrl(iCalEvent),
extendedProps: {
location: iCalEvent.location,
organizer: iCalEvent.organizer,
description: iCalEvent.description,
},
};
}
function extractEventUrl(iCalEvent) {
let urlProp = iCalEvent.component.getFirstProperty('url');
return urlProp ? urlProp.getFirstValue() : '';
}
function specifiesEnd(iCalEvent) {
return Boolean(iCalEvent.component.getFirstProperty('dtend')) ||
Boolean(iCalEvent.component.getFirstProperty('duration'));
}
var plugin = core.createPlugin({
name: '@fullcalendar/icalendar',
eventSourceDefs: [eventSourceDef],
});
core.globalPlugins.push(plugin);
exports["default"] = plugin;
Object.defineProperty(exports, '__esModule', { value: true });
return exports;
})({}, FullCalendar, FullCalendar.Internal, ICAL);

View File

@ -0,0 +1,6 @@
/*!
FullCalendar iCalendar Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/icalendar
(c) 2023 Adam Shaw
*/
FullCalendar.ICalendar=function(e,t,n,r){"use strict";function a(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:function(){return e[n]}})}})),t.default=e,t}var s=a(r);class i{constructor(e){this.maxIterations=null!=e.maxIterations?e.maxIterations:1e3,this.skipInvalidDates=null!=e.skipInvalidDates&&e.skipInvalidDates,this.jCalData=s.parse(e.ics),this.component=new s.Component(this.jCalData),this.events=this.component.getAllSubcomponents("vevent").map(e=>new s.Event(e)),this.skipInvalidDates&&(this.events=this.events.filter(e=>{try{return e.startDate.toJSDate(),e.endDate.toJSDate(),!0}catch(e){return!1}}))}between(e,t){function n(n,r){return(!e||r>=e.getTime())&&(!t||n<=t.getTime())}function r(e){const t=e.startDate.toJSDate().getTime();let n=e.endDate.toJSDate().getTime();return e.endDate.isDate&&n>t&&(n-=1),{startTime:t,endTime:n}}const a=[];this.events.forEach(e=>{e.isRecurrenceException()&&a.push(e)});const s={events:[],occurrences:[]};return this.events.filter(e=>!e.isRecurrenceException()).forEach(e=>{const i=[];if(e.component.getAllProperties("exdate").forEach(e=>{const t=e.getFirstValue();i.push(t.toJSDate().getTime())}),e.isRecurring()){const o=e.iterator();let c,l=0;do{if(l+=1,c=o.next(),c){const o=e.getOccurrenceDetails(c),{startTime:l,endTime:u}=r(o),d=-1!==i.indexOf(l),p=a.find(t=>t.uid===e.uid&&t.recurrenceId.toJSDate().getTime()===o.startDate.toJSDate().getTime());if(t&&l>t.getTime())break;n(l,u)&&(p?s.events.push(p):d||s.occurrences.push(o))}}while(c&&(!this.maxIterations||l<this.maxIterations));return}const{startTime:o,endTime:c}=r(e);n(o,c)&&s.events.push(e)}),s}before(e){return this.between(void 0,e)}after(e){return this.between(e)}all(){return this.between()}}const o={parseMeta:e=>e.url&&"ics"===e.format?{url:e.url,format:"ics"}:null,fetch(e,t,n){let r=e.eventSource.meta,{internalState:a}=r;a&&!e.isRefetch||(a=r.internalState={response:null,iCalExpanderPromise:fetch(r.url,{method:"GET"}).then(e=>e.text().then(t=>(a.response=e,new i({ics:t,skipInvalidDates:!0}))))}),a.iCalExpanderPromise.then(n=>{t({rawEvents:c(n,e.range),response:a.response})},n)}};function c(e,t){let r=n.addDays(t.start,-1),a=n.addDays(t.end,1),s=e.between(r,a),i=[];for(let e of s.events)i.push(Object.assign(Object.assign({},l(e)),{start:e.startDate.toString(),end:d(e)&&e.endDate?e.endDate.toString():null}));for(let e of s.occurrences){let t=e.item;i.push(Object.assign(Object.assign({},l(t)),{start:e.startDate.toString(),end:d(t)&&e.endDate?e.endDate.toString():null}))}return i}function l(e){return{title:e.summary,url:u(e),extendedProps:{location:e.location,organizer:e.organizer,description:e.description}}}function u(e){let t=e.component.getFirstProperty("url");return t?t.getFirstValue():""}function d(e){return Boolean(e.component.getFirstProperty("dtend"))||Boolean(e.component.getFirstProperty("duration"))}var p=t.createPlugin({name:"@fullcalendar/icalendar",eventSourceDefs:[o]});return t.globalPlugins.push(p),e.default=p,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal,ICAL);

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,332 @@
/*!
FullCalendar List View Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/list-view
(c) 2023 Adam Shaw
*/
FullCalendar.List = (function (exports, core, internal$1, preact) {
'use strict';
class ListViewHeaderRow extends internal$1.BaseComponent {
constructor() {
super(...arguments);
this.state = {
textId: internal$1.getUniqueDomId(),
};
}
render() {
let { theme, dateEnv, options, viewApi } = this.context;
let { cellId, dayDate, todayRange } = this.props;
let { textId } = this.state;
let dayMeta = internal$1.getDateMeta(dayDate, todayRange);
// will ever be falsy?
let text = options.listDayFormat ? dateEnv.format(dayDate, options.listDayFormat) : '';
// will ever be falsy? also, BAD NAME "alt"
let sideText = options.listDaySideFormat ? dateEnv.format(dayDate, options.listDaySideFormat) : '';
let renderProps = Object.assign({ date: dateEnv.toDate(dayDate), view: viewApi, textId,
text,
sideText, navLinkAttrs: internal$1.buildNavLinkAttrs(this.context, dayDate), sideNavLinkAttrs: internal$1.buildNavLinkAttrs(this.context, dayDate, 'day', false) }, dayMeta);
// TODO: make a reusable HOC for dayHeader (used in daygrid/timegrid too)
return (preact.createElement(internal$1.ContentContainer, { elTag: "tr", elClasses: [
'fc-list-day',
...internal$1.getDayClassNames(dayMeta, theme),
], elAttrs: {
'data-date': internal$1.formatDayString(dayDate),
}, renderProps: renderProps, generatorName: "dayHeaderContent", customGenerator: options.dayHeaderContent, defaultGenerator: renderInnerContent, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContent) => ( // TODO: force-hide top border based on :first-child
preact.createElement("th", { scope: "colgroup", colSpan: 3, id: cellId, "aria-labelledby": textId },
preact.createElement(InnerContent, { elTag: "div", elClasses: [
'fc-list-day-cushion',
theme.getClass('tableCellShaded'),
] })))));
}
}
function renderInnerContent(props) {
return (preact.createElement(preact.Fragment, null,
props.text && (preact.createElement("a", Object.assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text)),
props.sideText && ( /* not keyboard tabbable */preact.createElement("a", Object.assign({ "aria-hidden": true, className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText))));
}
const DEFAULT_TIME_FORMAT = internal$1.createFormatter({
hour: 'numeric',
minute: '2-digit',
meridiem: 'short',
});
class ListViewEventRow extends internal$1.BaseComponent {
render() {
let { props, context } = this;
let { options } = context;
let { seg, timeHeaderId, eventHeaderId, dateHeaderId } = props;
let timeFormat = options.eventTimeFormat || DEFAULT_TIME_FORMAT;
return (preact.createElement(internal$1.EventContainer, Object.assign({}, props, { elTag: "tr", elClasses: [
'fc-list-event',
seg.eventRange.def.url && 'fc-event-forced-url',
], defaultGenerator: () => renderEventInnerContent(seg, context) /* weird */, seg: seg, timeText: "", disableDragging: true, disableResizing: true }), (InnerContent, eventContentArg) => (preact.createElement(preact.Fragment, null,
buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId),
preact.createElement("td", { "aria-hidden": true, className: "fc-list-event-graphic" },
preact.createElement("span", { className: "fc-list-event-dot", style: {
borderColor: eventContentArg.borderColor || eventContentArg.backgroundColor,
} })),
preact.createElement(InnerContent, { elTag: "td", elClasses: ['fc-list-event-title'], elAttrs: { headers: `${eventHeaderId} ${dateHeaderId}` } })))));
}
}
function renderEventInnerContent(seg, context) {
let interactiveAttrs = internal$1.getSegAnchorAttrs(seg, context);
return (preact.createElement("a", Object.assign({}, interactiveAttrs), seg.eventRange.def.title));
}
function buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId) {
let { options } = context;
if (options.displayEventTime !== false) {
let eventDef = seg.eventRange.def;
let eventInstance = seg.eventRange.instance;
let doAllDay = false;
let timeText;
if (eventDef.allDay) {
doAllDay = true;
}
else if (internal$1.isMultiDayRange(seg.eventRange.range)) { // TODO: use (!isStart || !isEnd) instead?
if (seg.isStart) {
timeText = internal$1.buildSegTimeText(seg, timeFormat, context, null, null, eventInstance.range.start, seg.end);
}
else if (seg.isEnd) {
timeText = internal$1.buildSegTimeText(seg, timeFormat, context, null, null, seg.start, eventInstance.range.end);
}
else {
doAllDay = true;
}
}
else {
timeText = internal$1.buildSegTimeText(seg, timeFormat, context);
}
if (doAllDay) {
let renderProps = {
text: context.options.allDayText,
view: context.viewApi,
};
return (preact.createElement(internal$1.ContentContainer, { elTag: "td", elClasses: ['fc-list-event-time'], elAttrs: {
headers: `${timeHeaderId} ${dateHeaderId}`,
}, renderProps: renderProps, generatorName: "allDayContent", customGenerator: options.allDayContent, defaultGenerator: renderAllDayInner, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }));
}
return (preact.createElement("td", { className: "fc-list-event-time" }, timeText));
}
return null;
}
function renderAllDayInner(renderProps) {
return renderProps.text;
}
/*
Responsible for the scroller, and forwarding event-related actions into the "grid".
*/
class ListView extends internal$1.DateComponent {
constructor() {
super(...arguments);
this.computeDateVars = internal$1.memoize(computeDateVars);
this.eventStoreToSegs = internal$1.memoize(this._eventStoreToSegs);
this.state = {
timeHeaderId: internal$1.getUniqueDomId(),
eventHeaderId: internal$1.getUniqueDomId(),
dateHeaderIdRoot: internal$1.getUniqueDomId(),
};
this.setRootEl = (rootEl) => {
if (rootEl) {
this.context.registerInteractiveComponent(this, {
el: rootEl,
});
}
else {
this.context.unregisterInteractiveComponent(this);
}
};
}
render() {
let { props, context } = this;
let { dayDates, dayRanges } = this.computeDateVars(props.dateProfile);
let eventSegs = this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges);
return (preact.createElement(internal$1.ViewContainer, { elRef: this.setRootEl, elClasses: [
'fc-list',
context.theme.getClass('table'),
context.options.stickyHeaderDates !== false ?
'fc-list-sticky' :
'',
], viewSpec: context.viewSpec },
preact.createElement(internal$1.Scroller, { liquid: !props.isHeightAuto, overflowX: props.isHeightAuto ? 'visible' : 'hidden', overflowY: props.isHeightAuto ? 'visible' : 'auto' }, eventSegs.length > 0 ?
this.renderSegList(eventSegs, dayDates) :
this.renderEmptyMessage())));
}
renderEmptyMessage() {
let { options, viewApi } = this.context;
let renderProps = {
text: options.noEventsText,
view: viewApi,
};
return (preact.createElement(internal$1.ContentContainer, { elTag: "div", elClasses: ['fc-list-empty'], renderProps: renderProps, generatorName: "noEventsContent", customGenerator: options.noEventsContent, defaultGenerator: renderNoEventsInner, classNameGenerator: options.noEventsClassNames, didMount: options.noEventsDidMount, willUnmount: options.noEventsWillUnmount }, (InnerContent) => (preact.createElement(InnerContent, { elTag: "div", elClasses: ['fc-list-empty-cushion'] }))));
}
renderSegList(allSegs, dayDates) {
let { theme, options } = this.context;
let { timeHeaderId, eventHeaderId, dateHeaderIdRoot } = this.state;
let segsByDay = groupSegsByDay(allSegs); // sparse array
return (preact.createElement(internal$1.NowTimer, { unit: "day" }, (nowDate, todayRange) => {
let innerNodes = [];
for (let dayIndex = 0; dayIndex < segsByDay.length; dayIndex += 1) {
let daySegs = segsByDay[dayIndex];
if (daySegs) { // sparse array, so might be undefined
let dayStr = internal$1.formatDayString(dayDates[dayIndex]);
let dateHeaderId = dateHeaderIdRoot + '-' + dayStr;
// append a day header
innerNodes.push(preact.createElement(ListViewHeaderRow, { key: dayStr, cellId: dateHeaderId, dayDate: dayDates[dayIndex], todayRange: todayRange }));
daySegs = internal$1.sortEventSegs(daySegs, options.eventOrder);
for (let seg of daySegs) {
innerNodes.push(preact.createElement(ListViewEventRow, Object.assign({ key: dayStr + ':' + seg.eventRange.instance.instanceId /* are multiple segs for an instanceId */, seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, timeHeaderId: timeHeaderId, eventHeaderId: eventHeaderId, dateHeaderId: dateHeaderId }, internal$1.getSegMeta(seg, todayRange, nowDate))));
}
}
}
return (preact.createElement("table", { className: 'fc-list-table ' + theme.getClass('table') },
preact.createElement("thead", null,
preact.createElement("tr", null,
preact.createElement("th", { scope: "col", id: timeHeaderId }, options.timeHint),
preact.createElement("th", { scope: "col", "aria-hidden": true }),
preact.createElement("th", { scope: "col", id: eventHeaderId }, options.eventHint))),
preact.createElement("tbody", null, innerNodes)));
}));
}
_eventStoreToSegs(eventStore, eventUiBases, dayRanges) {
return this.eventRangesToSegs(internal$1.sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.options.nextDayThreshold).fg, dayRanges);
}
eventRangesToSegs(eventRanges, dayRanges) {
let segs = [];
for (let eventRange of eventRanges) {
segs.push(...this.eventRangeToSegs(eventRange, dayRanges));
}
return segs;
}
eventRangeToSegs(eventRange, dayRanges) {
let { dateEnv } = this.context;
let { nextDayThreshold } = this.context.options;
let range = eventRange.range;
let allDay = eventRange.def.allDay;
let dayIndex;
let segRange;
let seg;
let segs = [];
for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex += 1) {
segRange = internal$1.intersectRanges(range, dayRanges[dayIndex]);
if (segRange) {
seg = {
component: this,
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,
};
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;
}
}
function renderNoEventsInner(renderProps) {
return renderProps.text;
}
function computeDateVars(dateProfile) {
let dayStart = internal$1.startOfDay(dateProfile.renderRange.start);
let viewEnd = dateProfile.renderRange.end;
let dayDates = [];
let dayRanges = [];
while (dayStart < viewEnd) {
dayDates.push(dayStart);
dayRanges.push({
start: dayStart,
end: internal$1.addDays(dayStart, 1),
});
dayStart = internal$1.addDays(dayStart, 1);
}
return { dayDates, dayRanges };
}
// Returns a sparse array of arrays, segs grouped by their dayIndex
function groupSegsByDay(segs) {
let segsByDay = []; // sparse array
let i;
let seg;
for (i = 0; i < segs.length; i += 1) {
seg = segs[i];
(segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))
.push(seg);
}
return segsByDay;
}
const OPTION_REFINERS = {
listDayFormat: createFalsableFormatter,
listDaySideFormat: createFalsableFormatter,
noEventsClassNames: internal$1.identity,
noEventsContent: internal$1.identity,
noEventsDidMount: internal$1.identity,
noEventsWillUnmount: internal$1.identity,
// noEventsText is defined in base options
};
function createFalsableFormatter(input) {
return input === false ? null : internal$1.createFormatter(input);
}
var css_248z = ":root{--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-theme-standard .fc-list{border:1px solid var(--fc-border-color)}.fc .fc-list-empty{align-items:center;background-color:var(--fc-neutral-bg-color);display:flex;height:100%;justify-content:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{border-style:hidden;width:100%}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{background:var(--fc-page-bg-color);position:sticky;top:0}.fc .fc-list-table thead{left:-10000px;position:absolute}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{clear:both;content:\"\";display:table}.fc-theme-standard .fc-list-day-cushion{background-color:var(--fc-neutral-bg-color)}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:var(--fc-list-event-hover-bg-color)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{border:calc(var(--fc-list-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-list-event-dot-width)/2);box-sizing:content-box;display:inline-block;height:0;width:0}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}";
internal$1.injectStyles(css_248z);
var plugin = core.createPlugin({
name: '@fullcalendar/list',
optionRefiners: OPTION_REFINERS,
views: {
list: {
component: 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 headerToolbar
},
listWeek: {
type: 'list',
duration: { weeks: 1 },
listDayFormat: { weekday: 'long' },
listDaySideFormat: { month: 'long', day: 'numeric', year: 'numeric' },
},
listMonth: {
type: 'list',
duration: { month: 1 },
listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have
},
listYear: {
type: 'list',
duration: { year: 1 },
listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have
},
},
});
var internal = {
__proto__: null,
ListView: ListView
};
core.globalPlugins.push(plugin);
exports.Internal = internal;
exports["default"] = plugin;
Object.defineProperty(exports, '__esModule', { value: true });
return exports;
})({}, FullCalendar, FullCalendar.Internal, FullCalendar.Preact);

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,128 @@
/*!
FullCalendar Luxon 1 Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/luxon1
(c) 2023 Adam Shaw
*/
FullCalendar.Luxon = (function (exports, core, luxon, internal) {
'use strict';
function toLuxonDateTime(date, calendar) {
if (!(calendar instanceof internal.CalendarImpl)) {
throw new Error('must supply a CalendarApi instance');
}
let { dateEnv } = calendar.getCurrentData();
return luxon.DateTime.fromJSDate(date, {
zone: dateEnv.timeZone,
locale: dateEnv.locale.codes[0],
});
}
function toLuxonDuration(duration, calendar) {
if (!(calendar instanceof internal.CalendarImpl)) {
throw new Error('must supply a CalendarApi instance');
}
let { dateEnv } = calendar.getCurrentData();
return luxon.Duration.fromObject(Object.assign(Object.assign({}, duration), { locale: dateEnv.locale.codes[0] }));
}
// Internal Utils
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,
year: arr[0],
month: arr[1] + 1,
day: arr[2],
hour: arr[3],
minute: arr[4],
second: arr[5],
millisecond: arr[6],
});
}
class LuxonNamedTimeZone extends internal.NamedTimeZoneImpl {
offsetForArray(a) {
return arrayToLuxon(a, this.timeZoneName).offset;
}
timestampToArray(ms) {
return luxonToArray(luxon.DateTime.fromMillis(ms, {
zone: this.timeZoneName,
}));
}
}
function formatWithCmdStr(cmdStr, arg) {
let cmd = parseCmdStr(cmdStr);
if (arg.end) {
let start = arrayToLuxon(arg.start.array, arg.timeZone, arg.localeCodes[0]);
let end = arrayToLuxon(arg.end.array, arg.timeZone, arg.localeCodes[0]);
return formatRange(cmd, start.toFormat.bind(start), end.toFormat.bind(end), arg.defaultSeparator);
}
return arrayToLuxon(arg.date.array, arg.timeZone, arg.localeCodes[0]).toFormat(cmd.whole);
}
function parseCmdStr(cmdStr) {
let parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
if (parts) {
let middle = parseCmdStr(parts[2]);
return {
head: parts[1],
middle,
tail: parts[3],
whole: parts[1] + middle.whole + parts[3],
};
}
return {
head: null,
middle: null,
tail: null,
whole: cmdStr,
};
}
function formatRange(cmd, formatStart, formatEnd, separator) {
if (cmd.middle) {
let startHead = formatStart(cmd.head);
let startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
let startTail = formatStart(cmd.tail);
let endHead = formatEnd(cmd.head);
let endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
let endTail = formatEnd(cmd.tail);
if (startHead === endHead && startTail === endTail) {
return startHead +
(startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
startTail;
}
}
let startWhole = formatStart(cmd.whole);
let endWhole = formatEnd(cmd.whole);
if (startWhole === endWhole) {
return startWhole;
}
return startWhole + separator + endWhole;
}
var plugin = core.createPlugin({
name: '@fullcalendar/luxon',
cmdFormatter: formatWithCmdStr,
namedTimeZonedImpl: LuxonNamedTimeZone,
});
core.globalPlugins.push(plugin);
exports["default"] = plugin;
exports.toLuxonDateTime = toLuxonDateTime;
exports.toLuxonDuration = toLuxonDuration;
Object.defineProperty(exports, '__esModule', { value: true });
return exports;
})({}, FullCalendar, luxon, FullCalendar.Internal);

View File

@ -0,0 +1,6 @@
/*!
FullCalendar Luxon 1 Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/luxon1
(c) 2023 Adam Shaw
*/
FullCalendar.Luxon=function(e,t,n,a){"use strict";function l(e,t,a){return n.DateTime.fromObject({zone:t,locale:a,year:e[0],month:e[1]+1,day:e[2],hour:e[3],minute:e[4],second:e[5],millisecond:e[6]})}class r extends a.NamedTimeZoneImpl{offsetForArray(e){return l(e,this.timeZoneName).offset}timestampToArray(e){return[(t=n.DateTime.fromMillis(e,{zone:this.timeZoneName})).year,t.month-1,t.day,t.hour,t.minute,t.second,t.millisecond];var t}}var o=t.createPlugin({name:"@fullcalendar/luxon",cmdFormatter:function(e,t){let n=function e(t){let n=t.match(/^(.*?)\{(.*)\}(.*)$/);if(n){let t=e(n[2]);return{head:n[1],middle:t,tail:n[3],whole:n[1]+t.whole+n[3]}}return{head:null,middle:null,tail:null,whole:t}}(e);if(t.end){let e=l(t.start.array,t.timeZone,t.localeCodes[0]),a=l(t.end.array,t.timeZone,t.localeCodes[0]);return function e(t,n,a,l){if(t.middle){let r=n(t.head),o=e(t.middle,n,a,l),i=n(t.tail),u=a(t.head),d=e(t.middle,n,a,l),m=a(t.tail);if(r===u&&i===m)return r+(o===d?o:o+l+d)+i}let r=n(t.whole),o=a(t.whole);if(r===o)return r;return r+l+o}(n,e.toFormat.bind(e),a.toFormat.bind(a),t.defaultSeparator)}return l(t.date.array,t.timeZone,t.localeCodes[0]).toFormat(n.whole)},namedTimeZonedImpl:r});return t.globalPlugins.push(o),e.default=o,e.toLuxonDateTime=function(e,t){if(!(t instanceof a.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return n.DateTime.fromJSDate(e,{zone:l.timeZone,locale:l.locale.codes[0]})},e.toLuxonDuration=function(e,t){if(!(t instanceof a.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return n.Duration.fromObject(Object.assign(Object.assign({},e),{locale:l.locale.codes[0]}))},Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,luxon,FullCalendar.Internal);

View File

@ -0,0 +1,131 @@
/*!
FullCalendar Luxon 2 Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/luxon2
(c) 2023 Adam Shaw
*/
FullCalendar.Luxon2 = (function (exports, core, luxon, internal) {
'use strict';
function toLuxonDateTime(date, calendar) {
if (!(calendar instanceof internal.CalendarImpl)) {
throw new Error('must supply a CalendarApi instance');
}
let { dateEnv } = calendar.getCurrentData();
return luxon.DateTime.fromJSDate(date, {
zone: dateEnv.timeZone,
locale: dateEnv.locale.codes[0],
});
}
function toLuxonDuration(duration, calendar) {
if (!(calendar instanceof internal.CalendarImpl)) {
throw new Error('must supply a CalendarApi instance');
}
let { dateEnv } = calendar.getCurrentData();
return luxon.Duration.fromObject(duration, {
locale: dateEnv.locale.codes[0],
});
}
// Internal Utils
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({
year: arr[0],
month: arr[1] + 1,
day: arr[2],
hour: arr[3],
minute: arr[4],
second: arr[5],
millisecond: arr[6],
}, {
locale,
zone: timeZone,
});
}
class LuxonNamedTimeZone extends internal.NamedTimeZoneImpl {
offsetForArray(a) {
return arrayToLuxon(a, this.timeZoneName).offset;
}
timestampToArray(ms) {
return luxonToArray(luxon.DateTime.fromMillis(ms, {
zone: this.timeZoneName,
}));
}
}
function formatWithCmdStr(cmdStr, arg) {
let cmd = parseCmdStr(cmdStr);
if (arg.end) {
let start = arrayToLuxon(arg.start.array, arg.timeZone, arg.localeCodes[0]);
let end = arrayToLuxon(arg.end.array, arg.timeZone, arg.localeCodes[0]);
return formatRange(cmd, start.toFormat.bind(start), end.toFormat.bind(end), arg.defaultSeparator);
}
return arrayToLuxon(arg.date.array, arg.timeZone, arg.localeCodes[0]).toFormat(cmd.whole);
}
function parseCmdStr(cmdStr) {
let parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
if (parts) {
let middle = parseCmdStr(parts[2]);
return {
head: parts[1],
middle,
tail: parts[3],
whole: parts[1] + middle.whole + parts[3],
};
}
return {
head: null,
middle: null,
tail: null,
whole: cmdStr,
};
}
function formatRange(cmd, formatStart, formatEnd, separator) {
if (cmd.middle) {
let startHead = formatStart(cmd.head);
let startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
let startTail = formatStart(cmd.tail);
let endHead = formatEnd(cmd.head);
let endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
let endTail = formatEnd(cmd.tail);
if (startHead === endHead && startTail === endTail) {
return startHead +
(startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
startTail;
}
}
let startWhole = formatStart(cmd.whole);
let endWhole = formatEnd(cmd.whole);
if (startWhole === endWhole) {
return startWhole;
}
return startWhole + separator + endWhole;
}
var plugin = core.createPlugin({
name: '@fullcalendar/luxon2',
cmdFormatter: formatWithCmdStr,
namedTimeZonedImpl: LuxonNamedTimeZone,
});
core.globalPlugins.push(plugin);
exports["default"] = plugin;
exports.toLuxonDateTime = toLuxonDateTime;
exports.toLuxonDuration = toLuxonDuration;
Object.defineProperty(exports, '__esModule', { value: true });
return exports;
})({}, FullCalendar, luxon, FullCalendar.Internal);

View File

@ -0,0 +1,6 @@
/*!
FullCalendar Luxon 2 Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/luxon2
(c) 2023 Adam Shaw
*/
FullCalendar.Luxon2=function(e,t,n,a){"use strict";function l(e,t,a){return n.DateTime.fromObject({year:e[0],month:e[1]+1,day:e[2],hour:e[3],minute:e[4],second:e[5],millisecond:e[6]},{locale:a,zone:t})}class r extends a.NamedTimeZoneImpl{offsetForArray(e){return l(e,this.timeZoneName).offset}timestampToArray(e){return[(t=n.DateTime.fromMillis(e,{zone:this.timeZoneName})).year,t.month-1,t.day,t.hour,t.minute,t.second,t.millisecond];var t}}var o=t.createPlugin({name:"@fullcalendar/luxon2",cmdFormatter:function(e,t){let n=function e(t){let n=t.match(/^(.*?)\{(.*)\}(.*)$/);if(n){let t=e(n[2]);return{head:n[1],middle:t,tail:n[3],whole:n[1]+t.whole+n[3]}}return{head:null,middle:null,tail:null,whole:t}}(e);if(t.end){let e=l(t.start.array,t.timeZone,t.localeCodes[0]),a=l(t.end.array,t.timeZone,t.localeCodes[0]);return function e(t,n,a,l){if(t.middle){let r=n(t.head),o=e(t.middle,n,a,l),i=n(t.tail),u=a(t.head),d=e(t.middle,n,a,l),m=a(t.tail);if(r===u&&i===m)return r+(o===d?o:o+l+d)+i}let r=n(t.whole),o=a(t.whole);if(r===o)return r;return r+l+o}(n,e.toFormat.bind(e),a.toFormat.bind(a),t.defaultSeparator)}return l(t.date.array,t.timeZone,t.localeCodes[0]).toFormat(n.whole)},namedTimeZonedImpl:r});return t.globalPlugins.push(o),e.default=o,e.toLuxonDateTime=function(e,t){if(!(t instanceof a.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return n.DateTime.fromJSDate(e,{zone:l.timeZone,locale:l.locale.codes[0]})},e.toLuxonDuration=function(e,t){if(!(t instanceof a.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return n.Duration.fromObject(e,{locale:l.locale.codes[0]})},Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,luxon,FullCalendar.Internal);

View File

@ -0,0 +1,131 @@
/*!
FullCalendar Luxon 3 Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/luxon
(c) 2023 Adam Shaw
*/
FullCalendar.Luxon3 = (function (exports, core, luxon, internal) {
'use strict';
function toLuxonDateTime(date, calendar) {
if (!(calendar instanceof internal.CalendarImpl)) {
throw new Error('must supply a CalendarApi instance');
}
let { dateEnv } = calendar.getCurrentData();
return luxon.DateTime.fromJSDate(date, {
zone: dateEnv.timeZone,
locale: dateEnv.locale.codes[0],
});
}
function toLuxonDuration(duration, calendar) {
if (!(calendar instanceof internal.CalendarImpl)) {
throw new Error('must supply a CalendarApi instance');
}
let { dateEnv } = calendar.getCurrentData();
return luxon.Duration.fromObject(duration, {
locale: dateEnv.locale.codes[0],
});
}
// Internal Utils
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({
year: arr[0],
month: arr[1] + 1,
day: arr[2],
hour: arr[3],
minute: arr[4],
second: arr[5],
millisecond: arr[6],
}, {
locale,
zone: timeZone,
});
}
class LuxonNamedTimeZone extends internal.NamedTimeZoneImpl {
offsetForArray(a) {
return arrayToLuxon(a, this.timeZoneName).offset;
}
timestampToArray(ms) {
return luxonToArray(luxon.DateTime.fromMillis(ms, {
zone: this.timeZoneName,
}));
}
}
function formatWithCmdStr(cmdStr, arg) {
let cmd = parseCmdStr(cmdStr);
if (arg.end) {
let start = arrayToLuxon(arg.start.array, arg.timeZone, arg.localeCodes[0]);
let end = arrayToLuxon(arg.end.array, arg.timeZone, arg.localeCodes[0]);
return formatRange(cmd, start.toFormat.bind(start), end.toFormat.bind(end), arg.defaultSeparator);
}
return arrayToLuxon(arg.date.array, arg.timeZone, arg.localeCodes[0]).toFormat(cmd.whole);
}
function parseCmdStr(cmdStr) {
let parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
if (parts) {
let middle = parseCmdStr(parts[2]);
return {
head: parts[1],
middle,
tail: parts[3],
whole: parts[1] + middle.whole + parts[3],
};
}
return {
head: null,
middle: null,
tail: null,
whole: cmdStr,
};
}
function formatRange(cmd, formatStart, formatEnd, separator) {
if (cmd.middle) {
let startHead = formatStart(cmd.head);
let startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
let startTail = formatStart(cmd.tail);
let endHead = formatEnd(cmd.head);
let endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
let endTail = formatEnd(cmd.tail);
if (startHead === endHead && startTail === endTail) {
return startHead +
(startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
startTail;
}
}
let startWhole = formatStart(cmd.whole);
let endWhole = formatEnd(cmd.whole);
if (startWhole === endWhole) {
return startWhole;
}
return startWhole + separator + endWhole;
}
var plugin = core.createPlugin({
name: '@fullcalendar/luxon3',
cmdFormatter: formatWithCmdStr,
namedTimeZonedImpl: LuxonNamedTimeZone,
});
core.globalPlugins.push(plugin);
exports["default"] = plugin;
exports.toLuxonDateTime = toLuxonDateTime;
exports.toLuxonDuration = toLuxonDuration;
Object.defineProperty(exports, '__esModule', { value: true });
return exports;
})({}, FullCalendar, luxon, FullCalendar.Internal);

View File

@ -0,0 +1,6 @@
/*!
FullCalendar Luxon 3 Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/luxon
(c) 2023 Adam Shaw
*/
FullCalendar.Luxon3=function(e,t,n,a){"use strict";function l(e,t,a){return n.DateTime.fromObject({year:e[0],month:e[1]+1,day:e[2],hour:e[3],minute:e[4],second:e[5],millisecond:e[6]},{locale:a,zone:t})}class r extends a.NamedTimeZoneImpl{offsetForArray(e){return l(e,this.timeZoneName).offset}timestampToArray(e){return[(t=n.DateTime.fromMillis(e,{zone:this.timeZoneName})).year,t.month-1,t.day,t.hour,t.minute,t.second,t.millisecond];var t}}var o=t.createPlugin({name:"@fullcalendar/luxon3",cmdFormatter:function(e,t){let n=function e(t){let n=t.match(/^(.*?)\{(.*)\}(.*)$/);if(n){let t=e(n[2]);return{head:n[1],middle:t,tail:n[3],whole:n[1]+t.whole+n[3]}}return{head:null,middle:null,tail:null,whole:t}}(e);if(t.end){let e=l(t.start.array,t.timeZone,t.localeCodes[0]),a=l(t.end.array,t.timeZone,t.localeCodes[0]);return function e(t,n,a,l){if(t.middle){let r=n(t.head),o=e(t.middle,n,a,l),i=n(t.tail),u=a(t.head),d=e(t.middle,n,a,l),m=a(t.tail);if(r===u&&i===m)return r+(o===d?o:o+l+d)+i}let r=n(t.whole),o=a(t.whole);if(r===o)return r;return r+l+o}(n,e.toFormat.bind(e),a.toFormat.bind(a),t.defaultSeparator)}return l(t.date.array,t.timeZone,t.localeCodes[0]).toFormat(n.whole)},namedTimeZonedImpl:r});return t.globalPlugins.push(o),e.default=o,e.toLuxonDateTime=function(e,t){if(!(t instanceof a.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return n.DateTime.fromJSDate(e,{zone:l.timeZone,locale:l.locale.codes[0]})},e.toLuxonDuration=function(e,t){if(!(t instanceof a.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return n.Duration.fromObject(e,{locale:l.locale.codes[0]})},Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,luxon,FullCalendar.Internal);

View File

@ -0,0 +1,35 @@
/*!
FullCalendar Moment Timezone Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/moment-timezone-plugin
(c) 2023 Adam Shaw
*/
FullCalendar.MomentTimezone = (function (exports, core, moment, internal) {
'use strict';
function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
var moment__default = /*#__PURE__*/_interopDefault(moment);
class MomentNamedTimeZone extends internal.NamedTimeZoneImpl {
offsetForArray(a) {
return moment__default["default"].tz(a, this.timeZoneName).utcOffset();
}
timestampToArray(ms) {
return moment__default["default"].tz(ms, this.timeZoneName).toArray();
}
}
var plugin = core.createPlugin({
name: '@fullcalendar/moment-timezone',
namedTimeZonedImpl: MomentNamedTimeZone,
});
core.globalPlugins.push(plugin);
exports["default"] = plugin;
Object.defineProperty(exports, '__esModule', { value: true });
return exports;
})({}, FullCalendar, moment, FullCalendar.Internal);

View File

@ -0,0 +1,6 @@
/*!
FullCalendar Moment Timezone Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/moment-timezone-plugin
(c) 2023 Adam Shaw
*/
FullCalendar.MomentTimezone=function(e,t,n,a){"use strict";function l(e){return e&&e.__esModule?e:{default:e}}var r=l(n);class u extends a.NamedTimeZoneImpl{offsetForArray(e){return r.default.tz(e,this.timeZoneName).utcOffset()}timestampToArray(e){return r.default.tz(e,this.timeZoneName).toArray()}}var m=t.createPlugin({name:"@fullcalendar/moment-timezone",namedTimeZonedImpl:u});return t.globalPlugins.push(m),e.default=m,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,moment,FullCalendar.Internal);

View File

@ -0,0 +1,113 @@
/*!
FullCalendar Moment Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/moment-plugin
(c) 2023 Adam Shaw
*/
FullCalendar.Moment = (function (exports, core, moment, internal) {
'use strict';
function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
var moment__default = /*#__PURE__*/_interopDefault(moment);
function toMoment(date, calendar) {
if (!(calendar instanceof internal.CalendarImpl)) {
throw new Error('must supply a CalendarApi instance');
}
let { dateEnv } = calendar.getCurrentData();
return convertToMoment(date, dateEnv.timeZone, null, dateEnv.locale.codes[0]);
}
function toMomentDuration(fcDuration) {
return moment__default["default"].duration(fcDuration); // moment accepts all the props that fc.Duration already has!
}
// Internal Utils
function convertToMoment(input, timeZone, timeZoneOffset, locale) {
let mom;
if (timeZone === 'local') {
mom = moment__default["default"](input);
}
else if (timeZone === 'UTC') {
mom = moment__default["default"].utc(input);
}
else if (moment__default["default"].tz) {
mom = moment__default["default"].tz(input, timeZone);
}
else {
mom = moment__default["default"].utc(input);
if (timeZoneOffset != null) {
mom.utcOffset(timeZoneOffset);
}
}
mom.locale(locale);
return mom;
}
function formatWithCmdStr(cmdStr, arg) {
let cmd = parseCmdStr(cmdStr);
if (arg.end) {
let startMom = convertToMoment(arg.start.array, arg.timeZone, arg.start.timeZoneOffset, arg.localeCodes[0]);
let endMom = convertToMoment(arg.end.array, arg.timeZone, arg.end.timeZoneOffset, arg.localeCodes[0]);
return formatRange(cmd, createMomentFormatFunc(startMom), createMomentFormatFunc(endMom), arg.defaultSeparator);
}
return convertToMoment(arg.date.array, arg.timeZone, arg.date.timeZoneOffset, arg.localeCodes[0]).format(cmd.whole); // TODO: test for this
}
function createMomentFormatFunc(mom) {
return (cmdStr) => (cmdStr ? mom.format(cmdStr) : '' // because calling with blank string results in ISO8601 :(
);
}
function parseCmdStr(cmdStr) {
let parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
if (parts) {
let middle = parseCmdStr(parts[2]);
return {
head: parts[1],
middle,
tail: parts[3],
whole: parts[1] + middle.whole + parts[3],
};
}
return {
head: null,
middle: null,
tail: null,
whole: cmdStr,
};
}
function formatRange(cmd, formatStart, formatEnd, separator) {
if (cmd.middle) {
let startHead = formatStart(cmd.head);
let startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
let startTail = formatStart(cmd.tail);
let endHead = formatEnd(cmd.head);
let endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
let endTail = formatEnd(cmd.tail);
if (startHead === endHead && startTail === endTail) {
return startHead +
(startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
startTail;
}
}
let startWhole = formatStart(cmd.whole);
let endWhole = formatEnd(cmd.whole);
if (startWhole === endWhole) {
return startWhole;
}
return startWhole + separator + endWhole;
}
var plugin = core.createPlugin({
name: '@fullcalendar/moment',
cmdFormatter: formatWithCmdStr,
});
core.globalPlugins.push(plugin);
exports["default"] = plugin;
exports.toMoment = toMoment;
exports.toMomentDuration = toMomentDuration;
Object.defineProperty(exports, '__esModule', { value: true });
return exports;
})({}, FullCalendar, moment, FullCalendar.Internal);

View File

@ -0,0 +1,6 @@
/*!
FullCalendar Moment Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/moment-plugin
(c) 2023 Adam Shaw
*/
FullCalendar.Moment=function(e,t,l,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}var r=a(l);function u(e,t,l,n){let a;return"local"===t?a=r.default(e):"UTC"===t?a=r.default.utc(e):r.default.tz?a=r.default.tz(e,t):(a=r.default.utc(e),null!=l&&a.utcOffset(l)),a.locale(n),a}function o(e){return t=>t?e.format(t):""}var d=t.createPlugin({name:"@fullcalendar/moment",cmdFormatter:function(e,t){let l=function e(t){let l=t.match(/^(.*?)\{(.*)\}(.*)$/);if(l){let t=e(l[2]);return{head:l[1],middle:t,tail:l[3],whole:l[1]+t.whole+l[3]}}return{head:null,middle:null,tail:null,whole:t}}(e);if(t.end){let e=u(t.start.array,t.timeZone,t.start.timeZoneOffset,t.localeCodes[0]),n=u(t.end.array,t.timeZone,t.end.timeZoneOffset,t.localeCodes[0]);return function e(t,l,n,a){if(t.middle){let r=l(t.head),u=e(t.middle,l,n,a),o=l(t.tail),d=n(t.head),i=e(t.middle,l,n,a),f=n(t.tail);if(r===d&&o===f)return r+(u===i?u:u+a+i)+o}let r=l(t.whole),u=n(t.whole);if(r===u)return r;return r+a+u}(l,o(e),o(n),t.defaultSeparator)}return u(t.date.array,t.timeZone,t.date.timeZoneOffset,t.localeCodes[0]).format(l.whole)}});return t.globalPlugins.push(d),e.default=d,e.toMoment=function(e,t){if(!(t instanceof n.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return u(e,l.timeZone,null,l.locale.codes[0])},e.toMomentDuration=function(e){return r.default.duration(e)},Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,moment,FullCalendar.Internal);

View File

@ -0,0 +1,249 @@
/*!
FullCalendar Multi-Month Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/multimonth-grid
(c) 2023 Adam Shaw
*/
FullCalendar.MultiMonth = (function (exports, core, internal$1, internal, preact) {
'use strict';
class SingleMonth extends internal.DateComponent {
constructor() {
super(...arguments);
this.buildDayTableModel = internal.memoize(internal$1.buildDayTableModel);
this.slicer = new internal$1.DayTableSlicer();
this.state = {
labelId: internal.getUniqueDomId(),
};
}
render() {
const { props, state, context } = this;
const { dateProfile, forPrint } = props;
const { options } = context;
const dayTableModel = this.buildDayTableModel(dateProfile, context.dateProfileGenerator);
const slicedProps = this.slicer.sliceProps(props, dateProfile, options.nextDayThreshold, context, dayTableModel);
// ensure single-month has aspect ratio
const tableHeight = props.tableWidth != null ? props.tableWidth / options.aspectRatio : null;
const rowCnt = dayTableModel.cells.length;
const rowHeight = tableHeight != null ? tableHeight / rowCnt : null;
return (preact.createElement("div", { ref: props.elRef, "data-date": props.isoDateStr, className: "fc-multimonth-month", style: { width: props.width }, role: "grid", "aria-labelledby": state.labelId },
preact.createElement("div", { className: "fc-multimonth-header", style: { marginBottom: rowHeight }, role: "presentation" },
preact.createElement("div", { className: "fc-multimonth-title", id: state.labelId }, context.dateEnv.format(props.dateProfile.currentRange.start, props.titleFormat)),
preact.createElement("table", { className: [
'fc-multimonth-header-table',
context.theme.getClass('table'),
].join(' '), role: "presentation" },
preact.createElement("thead", { role: "rowgroup" },
preact.createElement(internal.DayHeader, { dateProfile: props.dateProfile, dates: dayTableModel.headerDates, datesRepDistinctDays: false })))),
preact.createElement("div", { className: [
'fc-multimonth-daygrid',
'fc-daygrid',
'fc-daygrid-body',
!forPrint && 'fc-daygrid-body-balanced',
forPrint && 'fc-daygrid-body-unbalanced',
forPrint && 'fc-daygrid-body-natural',
].join(' '), style: { marginTop: -rowHeight } },
preact.createElement("table", { className: [
'fc-multimonth-daygrid-table',
context.theme.getClass('table'),
].join(' '), style: { height: forPrint ? '' : tableHeight }, role: "presentation" },
preact.createElement("tbody", { role: "rowgroup" },
preact.createElement(internal$1.TableRows, Object.assign({}, slicedProps, { dateProfile: dateProfile, cells: dayTableModel.cells, eventSelection: props.eventSelection, dayMaxEvents: !forPrint, dayMaxEventRows: !forPrint, showWeekNumbers: options.weekNumbers, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: forPrint })))))));
}
}
class MultiMonthView extends internal.DateComponent {
constructor() {
super(...arguments);
this.splitDateProfileByMonth = internal.memoize(splitDateProfileByMonth);
this.buildMonthFormat = internal.memoize(buildMonthFormat);
this.scrollElRef = preact.createRef();
this.firstMonthElRef = preact.createRef();
this.needsScrollReset = false;
this.handleSizing = (isForced) => {
if (isForced) {
this.updateSize();
}
};
}
render() {
const { context, props, state } = this;
const { options } = context;
const { clientWidth, clientHeight } = state;
const monthHPadding = state.monthHPadding || 0;
const colCount = Math.min(clientWidth != null ?
Math.floor(clientWidth / (options.multiMonthMinWidth + monthHPadding)) :
1, options.multiMonthMaxColumns) || 1;
const monthWidthPct = (100 / colCount) + '%';
const monthTableWidth = clientWidth == null ? null :
(clientWidth / colCount) - monthHPadding;
const isLegitSingleCol = clientWidth != null && colCount === 1;
const monthDateProfiles = this.splitDateProfileByMonth(context.dateProfileGenerator, props.dateProfile, context.dateEnv, isLegitSingleCol ? false : options.fixedWeekCount, options.showNonCurrentDates);
const monthTitleFormat = this.buildMonthFormat(options.multiMonthTitleFormat, monthDateProfiles);
const rootClassNames = [
'fc-multimonth',
isLegitSingleCol ?
'fc-multimonth-singlecol' :
'fc-multimonth-multicol',
(monthTableWidth != null && monthTableWidth < 400) ?
'fc-multimonth-compact' :
'',
];
return (preact.createElement(internal.ViewContainer, { elRef: this.scrollElRef, elClasses: rootClassNames, viewSpec: context.viewSpec }, monthDateProfiles.map((monthDateProfile, i) => {
const monthStr = internal.formatIsoMonthStr(monthDateProfile.currentRange.start);
return (preact.createElement(SingleMonth, Object.assign({}, props, { key: monthStr, isoDateStr: monthStr, elRef: i === 0 ? this.firstMonthElRef : undefined, titleFormat: monthTitleFormat, dateProfile: monthDateProfile, width: monthWidthPct, tableWidth: monthTableWidth, clientWidth: clientWidth, clientHeight: clientHeight })));
})));
}
componentDidMount() {
this.updateSize();
this.context.addResizeHandler(this.handleSizing);
this.requestScrollReset();
}
componentDidUpdate(prevProps) {
if (!internal.isPropsEqual(prevProps, this.props)) { // an external change?
this.handleSizing(false);
}
if (prevProps.dateProfile !== this.props.dateProfile) {
this.requestScrollReset();
}
else {
this.flushScrollReset();
}
}
componentWillUnmount() {
this.context.removeResizeHandler(this.handleSizing);
}
updateSize() {
const scrollEl = this.scrollElRef.current;
const firstMonthEl = this.firstMonthElRef.current;
if (scrollEl) {
this.setState({
clientWidth: scrollEl.clientWidth,
clientHeight: scrollEl.clientHeight,
});
}
if (firstMonthEl && scrollEl) {
if (this.state.monthHPadding == null) { // always remember initial non-zero value
this.setState({
monthHPadding: scrollEl.clientWidth - // go within padding
firstMonthEl.firstChild.offsetWidth,
});
}
}
}
requestScrollReset() {
this.needsScrollReset = true;
this.flushScrollReset();
}
flushScrollReset() {
if (this.needsScrollReset &&
this.state.monthHPadding != null // indicates sizing already happened
) {
const { currentDate } = this.props.dateProfile;
const scrollEl = this.scrollElRef.current;
const monthEl = scrollEl.querySelector(`[data-date="${internal.formatIsoMonthStr(currentDate)}"]`);
scrollEl.scrollTop = monthEl.getBoundingClientRect().top -
this.firstMonthElRef.current.getBoundingClientRect().top;
this.needsScrollReset = false;
}
}
// workaround for when queued setState render (w/ clientWidth) gets cancelled because
// subsequent update and shouldComponentUpdate says not to render :(
shouldComponentUpdate() {
return true;
}
}
// date profile
// -------------------------------------------------------------------------------------------------
const oneMonthDuration = internal.createDuration(1, 'month');
function splitDateProfileByMonth(dateProfileGenerator, dateProfile, dateEnv, fixedWeekCount, showNonCurrentDates) {
const { start, end } = dateProfile.currentRange;
let monthStart = start;
const monthDateProfiles = [];
while (monthStart.valueOf() < end.valueOf()) {
const monthEnd = dateEnv.add(monthStart, oneMonthDuration);
const currentRange = {
// yuck
start: dateProfileGenerator.skipHiddenDays(monthStart),
end: dateProfileGenerator.skipHiddenDays(monthEnd, -1, true),
};
let renderRange = internal$1.buildDayTableRenderRange({
currentRange,
snapToWeek: true,
fixedWeekCount,
dateEnv,
});
renderRange = {
// yuck
start: dateProfileGenerator.skipHiddenDays(renderRange.start),
end: dateProfileGenerator.skipHiddenDays(renderRange.end, -1, true),
};
const activeRange = dateProfile.activeRange ?
internal.intersectRanges(dateProfile.activeRange, showNonCurrentDates ? renderRange : currentRange) :
null;
monthDateProfiles.push({
currentDate: dateProfile.currentDate,
isValid: dateProfile.isValid,
validRange: dateProfile.validRange,
renderRange,
activeRange,
currentRange,
currentRangeUnit: 'month',
isRangeAllDay: true,
dateIncrement: dateProfile.dateIncrement,
slotMinTime: dateProfile.slotMaxTime,
slotMaxTime: dateProfile.slotMinTime,
});
monthStart = monthEnd;
}
return monthDateProfiles;
}
// date formatting
// -------------------------------------------------------------------------------------------------
const YEAR_MONTH_FORMATTER = internal.createFormatter({ year: 'numeric', month: 'long' });
const YEAR_FORMATTER = internal.createFormatter({ month: 'long' });
function buildMonthFormat(formatOverride, monthDateProfiles) {
return formatOverride ||
((monthDateProfiles[0].currentRange.start.getUTCFullYear() !==
monthDateProfiles[monthDateProfiles.length - 1].currentRange.start.getUTCFullYear())
? YEAR_MONTH_FORMATTER
: YEAR_FORMATTER);
}
const OPTION_REFINERS = {
multiMonthTitleFormat: internal.createFormatter,
multiMonthMaxColumns: Number,
multiMonthMinWidth: Number,
};
var css_248z = ".fc .fc-multimonth{border:1px solid var(--fc-border-color);display:flex;flex-wrap:wrap;overflow-x:hidden;overflow-y:auto}.fc .fc-multimonth-title{font-size:1.2em;font-weight:700;padding:1em 0;text-align:center}.fc .fc-multimonth-daygrid{background:var(--fc-page-bg-color)}.fc .fc-multimonth-daygrid-table,.fc .fc-multimonth-header-table{table-layout:fixed;width:100%}.fc .fc-multimonth-daygrid-table{border-top-style:hidden!important}.fc .fc-multimonth-singlecol .fc-multimonth{position:relative}.fc .fc-multimonth-singlecol .fc-multimonth-header{background:var(--fc-page-bg-color);position:relative;top:0;z-index:2}.fc .fc-multimonth-singlecol .fc-multimonth-daygrid{position:relative;z-index:1}.fc .fc-multimonth-singlecol .fc-multimonth-daygrid-table,.fc .fc-multimonth-singlecol .fc-multimonth-header-table{border-left-style:hidden;border-right-style:hidden}.fc .fc-multimonth-singlecol .fc-multimonth-month:last-child .fc-multimonth-daygrid-table{border-bottom-style:hidden}.fc .fc-multimonth-multicol{line-height:1}.fc .fc-multimonth-multicol .fc-multimonth-month{padding:0 1.2em 1.2em}.fc .fc-multimonth-multicol .fc-daygrid-more-link{border:1px solid var(--fc-event-border-color);display:block;float:none;padding:1px}.fc .fc-multimonth-compact{line-height:1}.fc .fc-multimonth-compact .fc-multimonth-daygrid-table,.fc .fc-multimonth-compact .fc-multimonth-header-table{font-size:.9em}.fc-media-screen .fc-multimonth-singlecol .fc-multimonth-header{position:sticky}.fc-media-print .fc-multimonth{overflow:visible}";
internal.injectStyles(css_248z);
var plugin = core.createPlugin({
name: '@fullcalendar/multimonth',
initialView: 'multiMonthYear',
optionRefiners: OPTION_REFINERS,
views: {
multiMonth: {
component: MultiMonthView,
dateProfileGeneratorClass: internal$1.TableDateProfileGenerator,
multiMonthMinWidth: 350,
multiMonthMaxColumns: 3,
},
multiMonthYear: {
type: 'multiMonth',
duration: { years: 1 },
fixedWeekCount: true,
showNonCurrentDates: false,
},
},
});
core.globalPlugins.push(plugin);
exports["default"] = plugin;
Object.defineProperty(exports, '__esModule', { value: true });
return exports;
})({}, FullCalendar, FullCalendar.DayGrid.Internal, FullCalendar.Internal, FullCalendar.Preact);

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,165 @@
/*!
FullCalendar RRule Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/rrule-plugin
(c) 2023 Adam Shaw
*/
FullCalendar.RRule = (function (exports, core, rruleLib, internal) {
'use strict';
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n["default"] = e;
return n;
}
var rruleLib__namespace = /*#__PURE__*/_interopNamespace(rruleLib);
const recurringType = {
parse(eventProps, dateEnv) {
if (eventProps.rrule != null) {
let eventRRuleData = parseEventRRule(eventProps, dateEnv);
if (eventRRuleData) {
return {
typeData: { rruleSet: eventRRuleData.rruleSet, isTimeZoneSpecified: eventRRuleData.isTimeZoneSpecified },
allDayGuess: !eventRRuleData.isTimeSpecified,
duration: eventProps.duration,
};
}
}
return null;
},
expand(eventRRuleData, framingRange, dateEnv) {
let dates;
if (eventRRuleData.isTimeZoneSpecified) {
dates = eventRRuleData.rruleSet.between(dateEnv.toDate(framingRange.start), // rrule lib will treat as UTC-zoned
dateEnv.toDate(framingRange.end), // (same)
true).map((date) => dateEnv.createMarker(date)); // convert UTC-zoned-date to locale datemarker
}
else {
// when no timezone in given start/end, the rrule lib will assume UTC,
// which is same as our DateMarkers. no need to manipulate
dates = eventRRuleData.rruleSet.between(framingRange.start, framingRange.end, true);
}
return dates;
},
};
function parseEventRRule(eventProps, dateEnv) {
let rruleSet;
let isTimeSpecified = false;
let isTimeZoneSpecified = false;
if (typeof eventProps.rrule === 'string') {
let res = parseRRuleString(eventProps.rrule);
rruleSet = res.rruleSet;
isTimeSpecified = res.isTimeSpecified;
isTimeZoneSpecified = res.isTimeZoneSpecified;
}
if (typeof eventProps.rrule === 'object' && eventProps.rrule) { // non-null object
let res = parseRRuleObject(eventProps.rrule, dateEnv);
rruleSet = new rruleLib__namespace.RRuleSet();
rruleSet.rrule(res.rrule);
isTimeSpecified = res.isTimeSpecified;
isTimeZoneSpecified = res.isTimeZoneSpecified;
}
// convery to arrays. TODO: general util?
let exdateInputs = [].concat(eventProps.exdate || []);
let exruleInputs = [].concat(eventProps.exrule || []);
for (let exdateInput of exdateInputs) {
let res = internal.parseMarker(exdateInput);
isTimeSpecified = isTimeSpecified || !res.isTimeUnspecified;
isTimeZoneSpecified = isTimeZoneSpecified || res.timeZoneOffset !== null;
rruleSet.exdate(new Date(res.marker.valueOf() - (res.timeZoneOffset || 0) * 60 * 1000));
}
// TODO: exrule is deprecated. what to do? (https://icalendar.org/iCalendar-RFC-5545/a-3-deprecated-features.html)
for (let exruleInput of exruleInputs) {
let res = parseRRuleObject(exruleInput, dateEnv);
isTimeSpecified = isTimeSpecified || res.isTimeSpecified;
isTimeZoneSpecified = isTimeZoneSpecified || res.isTimeZoneSpecified;
rruleSet.exrule(res.rrule);
}
return { rruleSet, isTimeSpecified, isTimeZoneSpecified };
}
function parseRRuleObject(rruleInput, dateEnv) {
let isTimeSpecified = false;
let isTimeZoneSpecified = false;
function processDateInput(dateInput) {
if (typeof dateInput === 'string') {
let markerData = internal.parseMarker(dateInput);
if (markerData) {
isTimeSpecified = isTimeSpecified || !markerData.isTimeUnspecified;
isTimeZoneSpecified = isTimeZoneSpecified || markerData.timeZoneOffset !== null;
return new Date(markerData.marker.valueOf() - (markerData.timeZoneOffset || 0) * 60 * 1000); // NOT DRY
}
return null;
}
return dateInput; // TODO: what about number timestamps?
}
let rruleOptions = Object.assign(Object.assign({}, rruleInput), { dtstart: processDateInput(rruleInput.dtstart), until: processDateInput(rruleInput.until), freq: convertConstant(rruleInput.freq), wkst: rruleInput.wkst == null
? (dateEnv.weekDow - 1 + 7) % 7 // convert Sunday-first to Monday-first
: convertConstant(rruleInput.wkst), byweekday: convertConstants(rruleInput.byweekday) });
return { rrule: new rruleLib__namespace.RRule(rruleOptions), isTimeSpecified, isTimeZoneSpecified };
}
function parseRRuleString(str) {
let rruleSet = rruleLib__namespace.rrulestr(str, { forceset: true });
let analysis = analyzeRRuleString(str);
return Object.assign({ rruleSet }, analysis);
}
function analyzeRRuleString(str) {
let isTimeSpecified = false;
let isTimeZoneSpecified = false;
function processMatch(whole, introPart, datePart) {
let result = internal.parseMarker(datePart);
isTimeSpecified = isTimeSpecified || !result.isTimeUnspecified;
isTimeZoneSpecified = isTimeZoneSpecified || result.timeZoneOffset !== null;
}
str.replace(/\b(DTSTART:)([^\n]*)/, processMatch);
str.replace(/\b(EXDATE:)([^\n]*)/, processMatch);
str.replace(/\b(UNTIL=)([^;\n]*)/, processMatch);
return { isTimeSpecified, isTimeZoneSpecified };
}
function convertConstants(input) {
if (Array.isArray(input)) {
return input.map(convertConstant);
}
return convertConstant(input);
}
function convertConstant(input) {
if (typeof input === 'string') {
return rruleLib__namespace.RRule[input.toUpperCase()];
}
return input;
}
const RRULE_EVENT_REFINERS = {
rrule: internal.identity,
exrule: internal.identity,
exdate: internal.identity,
duration: internal.createDuration,
};
var plugin = core.createPlugin({
name: '@fullcalendar/rrule',
recurringTypes: [recurringType],
eventRefiners: RRULE_EVENT_REFINERS,
});
core.globalPlugins.push(plugin);
exports["default"] = plugin;
Object.defineProperty(exports, '__esModule', { value: true });
return exports;
})({}, FullCalendar, rrule, FullCalendar.Internal);

View File

@ -0,0 +1,6 @@
/*!
FullCalendar RRule Plugin v6.1.10
Docs & License: https://fullcalendar.io/docs/rrule-plugin
(c) 2023 Adam Shaw
*/
FullCalendar.RRule=function(e,r,t,i){"use strict";function n(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var i=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,i.get?i:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,r}var l=n(t);const u={parse(e,r){if(null!=e.rrule){let t=function(e,r){let t,n=!1,u=!1;if("string"==typeof e.rrule){let r=function(e){let r=l.rrulestr(e,{forceset:!0}),t=function(e){let r=!1,t=!1;function n(e,n,l){let u=i.parseMarker(l);r=r||!u.isTimeUnspecified,t=t||null!==u.timeZoneOffset}return e.replace(/\b(DTSTART:)([^\n]*)/,n),e.replace(/\b(EXDATE:)([^\n]*)/,n),e.replace(/\b(UNTIL=)([^;\n]*)/,n),{isTimeSpecified:r,isTimeZoneSpecified:t}}(e);return Object.assign({rruleSet:r},t)}(e.rrule);t=r.rruleSet,n=r.isTimeSpecified,u=r.isTimeZoneSpecified}if("object"==typeof e.rrule&&e.rrule){let i=a(e.rrule,r);t=new l.RRuleSet,t.rrule(i.rrule),n=i.isTimeSpecified,u=i.isTimeZoneSpecified}let f=[].concat(e.exdate||[]),s=[].concat(e.exrule||[]);for(let e of f){let r=i.parseMarker(e);n=n||!r.isTimeUnspecified,u=u||null!==r.timeZoneOffset,t.exdate(new Date(r.marker.valueOf()-60*(r.timeZoneOffset||0)*1e3))}for(let e of s){let i=a(e,r);n=n||i.isTimeSpecified,u=u||i.isTimeZoneSpecified,t.exrule(i.rrule)}return{rruleSet:t,isTimeSpecified:n,isTimeZoneSpecified:u}}(e,r);if(t)return{typeData:{rruleSet:t.rruleSet,isTimeZoneSpecified:t.isTimeZoneSpecified},allDayGuess:!t.isTimeSpecified,duration:e.duration}}return null},expand(e,r,t){let i;return i=e.isTimeZoneSpecified?e.rruleSet.between(t.toDate(r.start),t.toDate(r.end),!0).map(e=>t.createMarker(e)):e.rruleSet.between(r.start,r.end,!0),i}};function a(e,r){let t=!1,n=!1;function u(e){if("string"==typeof e){let r=i.parseMarker(e);return r?(t=t||!r.isTimeUnspecified,n=n||null!==r.timeZoneOffset,new Date(r.marker.valueOf()-60*(r.timeZoneOffset||0)*1e3)):null}return e}let a=Object.assign(Object.assign({},e),{dtstart:u(e.dtstart),until:u(e.until),freq:s(e.freq),wkst:null==e.wkst?(r.weekDow-1+7)%7:s(e.wkst),byweekday:f(e.byweekday)});return{rrule:new l.RRule(a),isTimeSpecified:t,isTimeZoneSpecified:n}}function f(e){return Array.isArray(e)?e.map(s):s(e)}function s(e){return"string"==typeof e?l.RRule[e.toUpperCase()]:e}const c={rrule:i.identity,exrule:i.identity,exdate:i.identity,duration:i.createDuration};var o=r.createPlugin({name:"@fullcalendar/rrule",recurringTypes:[u],eventRefiners:c});return r.globalPlugins.push(o),e.default=o,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,rrule,FullCalendar.Internal);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,79 @@
/*!
FullCalendar Web Component v6.1.10
Docs & License: https://fullcalendar.io/docs/web-component
(c) 2023 Adam Shaw
*/
(function (core) {
'use strict';
class FullCalendarElement extends HTMLElement {
constructor() {
super(...arguments);
this._calendar = null;
this._options = null;
}
connectedCallback() {
this._handleOptionsStr(this.getAttribute('options'));
}
disconnectedCallback() {
this._handleOptionsStr(null);
}
attributeChangedCallback(name, oldVal, newVal) {
if (name === 'options' &&
this._calendar // initial render happened
) {
this._handleOptionsStr(newVal);
}
}
get options() {
return this._options;
}
set options(options) {
this._handleOptions(options);
}
getApi() {
return this._calendar;
}
_handleOptionsStr(optionsStr) {
this._handleOptions(optionsStr ? JSON.parse(optionsStr) : null);
}
_handleOptions(options) {
if (options) {
if (this._calendar) {
this._calendar.resetOptions(options);
}
else {
let root;
if (this.hasAttribute('shadow')) {
this.attachShadow({ mode: 'open' });
root = this.shadowRoot;
}
else {
// eslint-disable-next-line @typescript-eslint/no-this-alias
root = this;
}
root.innerHTML = '<div></div>';
let calendarEl = root.querySelector('div');
let calendar = new core.Calendar(calendarEl, options);
calendar.render();
this._calendar = calendar;
}
this._options = options;
}
else {
if (this._calendar) {
this._calendar.destroy();
this._calendar = null;
}
this._options = null;
}
}
static get observedAttributes() {
return ['options'];
}
}
globalThis.FullCalendarElement = FullCalendarElement;
customElements.define('full-calendar', FullCalendarElement);
})(FullCalendar);

View File

@ -0,0 +1,6 @@
/*!
FullCalendar Web Component v6.1.10
Docs & License: https://fullcalendar.io/docs/web-component
(c) 2023 Adam Shaw
*/
!function(t){"use strict";class e extends HTMLElement{constructor(){super(...arguments),this._calendar=null,this._options=null}connectedCallback(){this._handleOptionsStr(this.getAttribute("options"))}disconnectedCallback(){this._handleOptionsStr(null)}attributeChangedCallback(t,e,n){"options"===t&&this._calendar&&this._handleOptionsStr(n)}get options(){return this._options}set options(t){this._handleOptions(t)}getApi(){return this._calendar}_handleOptionsStr(t){this._handleOptions(t?JSON.parse(t):null)}_handleOptions(e){if(e){if(this._calendar)this._calendar.resetOptions(e);else{let n;this.hasAttribute("shadow")?(this.attachShadow({mode:"open"}),n=this.shadowRoot):n=this,n.innerHTML="<div></div>";let s=n.querySelector("div"),i=new t.Calendar(s,e);i.render(),this._calendar=i}this._options=e}else this._calendar&&(this._calendar.destroy(),this._calendar=null),this._options=null}static get observedAttributes(){return["options"]}}globalThis.FullCalendarElement=e,customElements.define("full-calendar",e)}(FullCalendar);

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -1,27 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var af = {
code: 'af',
week: {
dow: 1, // Maandag is die eerste dag van die week.
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',
},
allDayText: 'Heeldag',
moreLinkText: 'Addisionele',
noEventsText: 'Daar is geen gebeurtenisse nie',
};
return af;
}());

View File

@ -1,28 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var arDz = {
code: 'ar-dz',
week: {
dow: 0, // Sunday is the first day of the week.
doy: 4, // The week that contains Jan 1st is the first week of the year.
},
direction: 'rtl',
buttonText: {
prev: 'السابق',
next: 'التالي',
today: 'اليوم',
month: 'شهر',
week: 'أسبوع',
day: 'يوم',
list: 'أجندة',
},
weekText: 'أسبوع',
allDayText: 'اليوم كله',
moreLinkText: 'أخرى',
noEventsText: 'أي أحداث لعرض',
};
return arDz;
}());

View File

@ -1,28 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var arKw = {
code: 'ar-kw',
week: {
dow: 0, // Sunday is the first day of the week.
doy: 12, // The week that contains Jan 1st is the first week of the year.
},
direction: 'rtl',
buttonText: {
prev: 'السابق',
next: 'التالي',
today: 'اليوم',
month: 'شهر',
week: 'أسبوع',
day: 'يوم',
list: 'أجندة',
},
weekText: 'أسبوع',
allDayText: 'اليوم كله',
moreLinkText: 'أخرى',
noEventsText: 'أي أحداث لعرض',
};
return arKw;
}());

View File

@ -1,28 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var arLy = {
code: 'ar-ly',
week: {
dow: 6, // Saturday is the first day of the week.
doy: 12, // The week that contains Jan 1st is the first week of the year.
},
direction: 'rtl',
buttonText: {
prev: 'السابق',
next: 'التالي',
today: 'اليوم',
month: 'شهر',
week: 'أسبوع',
day: 'يوم',
list: 'أجندة',
},
weekText: 'أسبوع',
allDayText: 'اليوم كله',
moreLinkText: 'أخرى',
noEventsText: 'أي أحداث لعرض',
};
return arLy;
}());

View File

@ -1,28 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var arMa = {
code: 'ar-ma',
week: {
dow: 6, // Saturday is the first day of the week.
doy: 12, // The week that contains Jan 1st is the first week of the year.
},
direction: 'rtl',
buttonText: {
prev: 'السابق',
next: 'التالي',
today: 'اليوم',
month: 'شهر',
week: 'أسبوع',
day: 'يوم',
list: 'أجندة',
},
weekText: 'أسبوع',
allDayText: 'اليوم كله',
moreLinkText: 'أخرى',
noEventsText: 'أي أحداث لعرض',
};
return arMa;
}());

View File

@ -1,28 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var arSa = {
code: 'ar-sa',
week: {
dow: 0, // Sunday is the first day of the week.
doy: 6, // The week that contains Jan 1st is the first week of the year.
},
direction: 'rtl',
buttonText: {
prev: 'السابق',
next: 'التالي',
today: 'اليوم',
month: 'شهر',
week: 'أسبوع',
day: 'يوم',
list: 'أجندة',
},
weekText: 'أسبوع',
allDayText: 'اليوم كله',
moreLinkText: 'أخرى',
noEventsText: 'أي أحداث لعرض',
};
return arSa;
}());

View File

@ -1,28 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var arTn = {
code: 'ar-tn',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
direction: 'rtl',
buttonText: {
prev: 'السابق',
next: 'التالي',
today: 'اليوم',
month: 'شهر',
week: 'أسبوع',
day: 'يوم',
list: 'أجندة',
},
weekText: 'أسبوع',
allDayText: 'اليوم كله',
moreLinkText: 'أخرى',
noEventsText: 'أي أحداث لعرض',
};
return arTn;
}());

View File

@ -1,28 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var ar = {
code: 'ar',
week: {
dow: 6, // Saturday is the first day of the week.
doy: 12, // The week that contains Jan 1st is the first week of the year.
},
direction: 'rtl',
buttonText: {
prev: 'السابق',
next: 'التالي',
today: 'اليوم',
month: 'شهر',
week: 'أسبوع',
day: 'يوم',
list: 'أجندة',
},
weekText: 'أسبوع',
allDayText: 'اليوم كله',
moreLinkText: 'أخرى',
noEventsText: 'أي أحداث لعرض',
};
return ar;
}());

View File

@ -1,29 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var az = {
code: 'az',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'Həftə',
allDayText: 'Bütün Gün',
moreLinkText: function(n) {
return '+ daha çox ' + n
},
noEventsText: 'Göstərmək üçün hadisə yoxdur',
};
return az;
}());

View File

@ -1,28 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var bg = {
code: 'bg',
week: {
dow: 1, // Monday is the first day of the week.
doy: 7, // The week that contains Jan 1st is the first week of the year.
},
buttonText: {
prev: 'назад',
next: 'напред',
today: 'днес',
month: 'Месец',
week: 'Седмица',
day: 'Ден',
list: 'График',
},
allDayText: 'Цял ден',
moreLinkText: function(n) {
return '+още ' + n
},
noEventsText: 'Няма събития за показване',
};
return bg;
}());

View File

@ -1,29 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var bn = {
code: 'bn',
week: {
dow: 0, // Sunday is the first day of the week.
doy: 6, // The week that contains Jan 1st is the first week of the year.
},
buttonText: {
prev: 'পেছনে',
next: 'সামনে',
today: 'আজ',
month: 'মাস',
week: 'সপ্তাহ',
day: 'দিন',
list: 'তালিকা',
},
weekText: 'সপ্তাহ',
allDayText: 'সারাদিন',
moreLinkText: function(n) {
return '+অন্যান্য ' + n
},
noEventsText: 'কোনো ইভেন্ট নেই',
};
return bn;
}());

View File

@ -1,29 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var bs = {
code: 'bs',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'Sed',
allDayText: 'Cijeli dan',
moreLinkText: function(n) {
return '+ još ' + n
},
noEventsText: 'Nema događaja za prikazivanje',
};
return bs;
}());

View File

@ -1,27 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var ca = {
code: 'ca',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'Set',
allDayText: 'Tot el dia',
moreLinkText: 'més',
noEventsText: 'No hi ha esdeveniments per mostrar',
};
return ca;
}());

View File

@ -1,29 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var cs = {
code: 'cs',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'Týd',
allDayText: 'Celý den',
moreLinkText: function(n) {
return '+další: ' + n
},
noEventsText: 'Žádné akce k zobrazení',
};
return cs;
}());

View File

@ -1,28 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var cy = {
code: 'cy',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonText: {
prev: 'Blaenorol',
next: 'Nesaf',
today: 'Heddiw',
year: 'Blwyddyn',
month: 'Mis',
week: 'Wythnos',
day: 'Dydd',
list: 'Rhestr',
},
weekText: 'Wythnos',
allDayText: 'Trwy\'r dydd',
moreLinkText: 'Mwy',
noEventsText: 'Dim digwyddiadau',
};
return cy;
}());

View File

@ -1,27 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var da = {
code: 'da',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'Uge',
allDayText: 'Hele dagen',
moreLinkText: 'flere',
noEventsText: 'Ingen arrangementer at vise',
};
return da;
}());

View File

@ -1,65 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
function affix(buttonText) {
return (buttonText === 'Tag' || buttonText === 'Monat') ? 'r' :
buttonText === 'Jahr' ? 's' : ''
}
var deAt = {
code: 'de-at',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'KW',
weekTextLong: 'Woche',
allDayText: 'Ganztägig',
moreLinkText: function(n) {
return '+ weitere ' + n
},
noEventsText: 'Keine Ereignisse anzuzeigen',
buttonHints: {
prev(buttonText) {
return `Vorherige${affix(buttonText)} ${buttonText}`
},
next(buttonText) {
return `Nächste${affix(buttonText)} ${buttonText}`
},
today(buttonText) {
// → Heute, Diese Woche, Dieser Monat, Dieses Jahr
if (buttonText === 'Tag') {
return 'Heute'
}
return `Diese${affix(buttonText)} ${buttonText}`
},
},
viewHint(buttonText) {
// → Tagesansicht, Wochenansicht, Monatsansicht, Jahresansicht
const glue = buttonText === 'Woche' ? 'n' : buttonText === 'Monat' ? 's' : 'es';
return buttonText + glue + 'ansicht'
},
navLinkHint: 'Gehe zu $0',
moreLinkHint(eventCnt) {
return 'Zeige ' + (eventCnt === 1 ?
'ein weiteres Ereignis' :
eventCnt + ' weitere Ereignisse')
},
closeHint: 'Schließen',
timeHint: 'Uhrzeit',
eventHint: 'Ereignis',
};
return deAt;
}());

View File

@ -1,65 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
function affix(buttonText) {
return (buttonText === 'Tag' || buttonText === 'Monat') ? 'r' :
buttonText === 'Jahr' ? 's' : ''
}
var de = {
code: 'de',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'KW',
weekTextLong: 'Woche',
allDayText: 'Ganztägig',
moreLinkText: function(n) {
return '+ weitere ' + n
},
noEventsText: 'Keine Ereignisse anzuzeigen',
buttonHints: {
prev(buttonText) {
return `Vorherige${affix(buttonText)} ${buttonText}`
},
next(buttonText) {
return `Nächste${affix(buttonText)} ${buttonText}`
},
today(buttonText) {
// → Heute, Diese Woche, Dieser Monat, Dieses Jahr
if (buttonText === 'Tag') {
return 'Heute'
}
return `Diese${affix(buttonText)} ${buttonText}`
},
},
viewHint(buttonText) {
// → Tagesansicht, Wochenansicht, Monatsansicht, Jahresansicht
const glue = buttonText === 'Woche' ? 'n' : buttonText === 'Monat' ? 's' : 'es';
return buttonText + glue + 'ansicht'
},
navLinkHint: 'Gehe zu $0',
moreLinkHint(eventCnt) {
return 'Zeige ' + (eventCnt === 1 ?
'ein weiteres Ereignis' :
eventCnt + ' weitere Ereignisse')
},
closeHint: 'Schließen',
timeHint: 'Uhrzeit',
eventHint: 'Ereignis',
};
return de;
}());

View File

@ -1,27 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var el = {
code: 'el',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4st is the first week of the year.
},
buttonText: {
prev: 'Προηγούμενος',
next: 'Επόμενος',
today: 'Σήμερα',
month: 'Μήνας',
week: 'Εβδομάδα',
day: 'Ημέρα',
list: 'Ατζέντα',
},
weekText: 'Εβδ',
allDayText: 'Ολοήμερο',
moreLinkText: 'περισσότερα',
noEventsText: 'Δεν υπάρχουν γεγονότα προς εμφάνιση',
};
return el;
}());

View File

@ -1,24 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var enAu = {
code: 'en-au',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonHints: {
prev: 'Previous $0',
next: 'Next $0',
today: 'This $0',
},
viewHint: '$0 view',
navLinkHint: 'Go to $0',
moreLinkHint(eventCnt) {
return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`
},
};
return enAu;
}());

View File

@ -1,24 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var enGb = {
code: 'en-gb',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonHints: {
prev: 'Previous $0',
next: 'Next $0',
today: 'This $0',
},
viewHint: '$0 view',
navLinkHint: 'Go to $0',
moreLinkHint(eventCnt) {
return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`
},
};
return enGb;
}());

View File

@ -1,24 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var enNz = {
code: 'en-nz',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonHints: {
prev: 'Previous $0',
next: 'Next $0',
today: 'This $0',
},
viewHint: '$0 view',
navLinkHint: 'Go to $0',
moreLinkHint(eventCnt) {
return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`
},
};
return enNz;
}());

View File

@ -1,27 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var eo = {
code: 'eo',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonText: {
prev: 'Antaŭa',
next: 'Sekva',
today: 'Hodiaŭ',
month: 'Monato',
week: 'Semajno',
day: 'Tago',
list: 'Tagordo',
},
weekText: 'Sm',
allDayText: 'Tuta tago',
moreLinkText: 'pli',
noEventsText: 'Neniuj eventoj por montri',
};
return eo;
}());

View File

@ -1,27 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var esUs = {
code: 'es',
week: {
dow: 0, // Sunday is the first day of the week.
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',
},
weekText: 'Sm',
allDayText: 'Todo el día',
moreLinkText: 'más',
noEventsText: 'No hay eventos para mostrar',
};
return esUs;
}());

View File

@ -1,46 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var es = {
code: 'es',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
buttonHints: {
prev: '$0 antes',
next: '$0 siguiente',
today(buttonText) {
return (buttonText === 'Día') ? 'Hoy' :
((buttonText === 'Semana') ? 'Esta' : 'Este') + ' ' + buttonText.toLocaleLowerCase()
},
},
viewHint(buttonText) {
return 'Vista ' + (buttonText === 'Semana' ? 'de la' : 'del') + ' ' + buttonText.toLocaleLowerCase()
},
weekText: 'Sm',
weekTextLong: 'Semana',
allDayText: 'Todo el día',
moreLinkText: 'más',
moreLinkHint(eventCnt) {
return `Mostrar ${eventCnt} eventos más`
},
noEventsText: 'No hay eventos para mostrar',
navLinkHint: 'Ir al $0',
closeHint: 'Cerrar',
timeHint: 'La hora',
eventHint: 'Evento',
};
return es;
}());

View File

@ -1,29 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var et = {
code: 'et',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'näd',
allDayText: 'Kogu päev',
moreLinkText: function(n) {
return '+ veel ' + n
},
noEventsText: 'Kuvamiseks puuduvad sündmused',
};
return et;
}());

View File

@ -1,27 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var eu = {
code: 'eu',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'As',
allDayText: 'Egun osoa',
moreLinkText: 'gehiago',
noEventsText: 'Ez dago ekitaldirik erakusteko',
};
return eu;
}());

View File

@ -1,30 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var fa = {
code: 'fa',
week: {
dow: 6, // Saturday is the first day of the week.
doy: 12, // The week that contains Jan 1st is the first week of the year.
},
direction: 'rtl',
buttonText: {
prev: 'قبلی',
next: 'بعدی',
today: 'امروز',
month: 'ماه',
week: 'هفته',
day: 'روز',
list: 'برنامه',
},
weekText: 'هف',
allDayText: 'تمام روز',
moreLinkText: function(n) {
return 'بیش از ' + n
},
noEventsText: 'هیچ رویدادی به نمایش',
};
return fa;
}());

View File

@ -1,27 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var fi = {
code: 'fi',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'Vk',
allDayText: 'Koko päivä',
moreLinkText: 'lisää',
noEventsText: 'Ei näytettäviä tapahtumia',
};
return fi;
}());

View File

@ -1,24 +0,0 @@
FullCalendar.globalLocales.push(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',
},
weekText: 'Sem.',
allDayText: 'Toute la journée',
moreLinkText: 'en plus',
noEventsText: 'Aucun événement à afficher',
};
return frCa;
}());

View File

@ -1,28 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var frCh = {
code: 'fr-ch',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'Sm',
allDayText: 'Toute la journée',
moreLinkText: 'en plus',
noEventsText: 'Aucun événement à afficher',
};
return frCh;
}());

View File

@ -1,28 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var fr = {
code: 'fr',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'Sem.',
allDayText: 'Toute la journée',
moreLinkText: 'en plus',
noEventsText: 'Aucun événement à afficher',
};
return fr;
}());

View File

@ -1,27 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var gl = {
code: 'gl',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'Sm',
allDayText: 'Todo o día',
moreLinkText: 'máis',
noEventsText: 'Non hai eventos para amosar',
};
return gl;
}());

View File

@ -1,24 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var he = {
code: 'he',
direction: 'rtl',
buttonText: {
prev: 'הקודם',
next: 'הבא',
today: 'היום',
month: 'חודש',
week: 'שבוע',
day: 'יום',
list: 'סדר יום',
},
allDayText: 'כל היום',
moreLinkText: 'אחר',
noEventsText: 'אין אירועים להצגה',
weekText: 'שבוע',
};
return he;
}());

View File

@ -1,29 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var hi = {
code: 'hi',
week: {
dow: 0, // Sunday is the first day of the week.
doy: 6, // The week that contains Jan 1st is the first week of the year.
},
buttonText: {
prev: 'पिछला',
next: 'अगला',
today: 'आज',
month: 'महीना',
week: 'सप्ताह',
day: 'दिन',
list: 'कार्यसूची',
},
weekText: 'हफ्ता',
allDayText: 'सभी दिन',
moreLinkText: function(n) {
return '+अधिक ' + n
},
noEventsText: 'कोई घटनाओं को प्रदर्शित करने के लिए',
};
return hi;
}());

View File

@ -1,29 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var hr = {
code: 'hr',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'Tje',
allDayText: 'Cijeli dan',
moreLinkText: function(n) {
return '+ još ' + n
},
noEventsText: 'Nema događaja za prikaz',
};
return hr;
}());

View File

@ -1,27 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var hu = {
code: 'hu',
week: {
dow: 1, // Monday is the first day of the week.
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: 'Lista',
},
weekText: 'Hét',
allDayText: 'Egész nap',
moreLinkText: 'további',
noEventsText: 'Nincs megjeleníthető esemény',
};
return hu;
}());

View File

@ -1,29 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var hyAm = {
code: 'hy-am',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonText: {
prev: 'Նախորդ',
next: 'Հաջորդ',
today: 'Այսօր',
month: 'Ամիս',
week: 'Շաբաթ',
day: 'Օր',
list: 'Օրվա ցուցակ',
},
weekText: 'Շաբ',
allDayText: 'Ամբողջ օր',
moreLinkText: function(n) {
return '+ ևս ' + n
},
noEventsText: 'Բացակայում է իրադարձությունը ցուցադրելու',
};
return hyAm;
}());

View File

@ -1,27 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var id = {
code: 'id',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'Mg',
allDayText: 'Sehari penuh',
moreLinkText: 'lebih',
noEventsText: 'Tidak ada acara untuk ditampilkan',
};
return id;
}());

View File

@ -1,27 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var is = {
code: 'is',
week: {
dow: 1, // Monday is the first day of the week.
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á',
},
weekText: 'Vika',
allDayText: 'Allan daginn',
moreLinkText: 'meira',
noEventsText: 'Engir viðburðir til að sýna',
};
return is;
}());

View File

@ -1,29 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var it = {
code: 'it',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'Sm',
allDayText: 'Tutto il giorno',
moreLinkText: function(n) {
return '+altri ' + n
},
noEventsText: 'Non ci sono eventi da visualizzare',
};
return it;
}());

View File

@ -1,25 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var ja = {
code: 'ja',
buttonText: {
prev: '前',
next: '次',
today: '今日',
month: '月',
week: '週',
day: '日',
list: '予定リスト',
},
weekText: '週',
allDayText: '終日',
moreLinkText: function(n) {
return '他 ' + n + ' 件'
},
noEventsText: '表示する予定はありません',
};
return ja;
}());

View File

@ -1,29 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var ka = {
code: 'ka',
week: {
dow: 1,
doy: 7,
},
buttonText: {
prev: 'წინა',
next: 'შემდეგი',
today: 'დღეს',
month: 'თვე',
week: 'კვირა',
day: 'დღე',
list: 'დღის წესრიგი',
},
weekText: 'კვ',
allDayText: 'მთელი დღე',
moreLinkText: function(n) {
return '+ კიდევ ' + n
},
noEventsText: 'ღონისძიებები არ არის',
};
return ka;
}());

View File

@ -1,29 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var kk = {
code: 'kk',
week: {
dow: 1, // Monday is the first day of the week.
doy: 7, // The week that contains Jan 1st is the first week of the year.
},
buttonText: {
prev: 'Алдыңғы',
next: 'Келесі',
today: 'Бүгін',
month: 'Ай',
week: 'Апта',
day: 'Күн',
list: 'Күн тәртібі',
},
weekText: 'Не',
allDayText: 'Күні бойы',
moreLinkText: function(n) {
return '+ тағы ' + n
},
noEventsText: 'Көрсету үшін оқиғалар жоқ',
};
return kk;
}());

View File

@ -1,28 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var km = {
code: 'km',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonText: {
prev: 'មុន',
next: 'បន្ទាប់',
today: 'ថ្ងៃនេះ',
year: 'ឆ្នាំ',
month: 'ខែ',
week: 'សប្តាហ៍',
day: 'ថ្ងៃ',
list: 'បញ្ជី',
},
weekText: 'សប្តាហ៍',
allDayText: 'ពេញមួយថ្ងៃ',
moreLinkText: 'ច្រើនទៀត',
noEventsText: 'គ្មានព្រឹត្តិការណ៍ត្រូវបង្ហាញ',
};
return km;
}());

View File

@ -1,23 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var ko = {
code: 'ko',
buttonText: {
prev: '이전달',
next: '다음달',
today: '오늘',
month: '월',
week: '주',
day: '일',
list: '일정목록',
},
weekText: '주',
allDayText: '종일',
moreLinkText: '개',
noEventsText: '일정이 없습니다',
};
return ko;
}());

View File

@ -1,28 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var ku = {
code: 'ku',
week: {
dow: 6, // Saturday is the first day of the week.
doy: 12, // The week that contains Jan 1st is the first week of the year.
},
direction: 'rtl',
buttonText: {
prev: 'پێشتر',
next: 'دواتر',
today: 'ئەمڕو',
month: 'مانگ',
week: 'هەفتە',
day: 'ڕۆژ',
list: 'بەرنامە',
},
weekText: 'هەفتە',
allDayText: 'هەموو ڕۆژەکە',
moreLinkText: 'زیاتر',
noEventsText: 'هیچ ڕووداوێك نیە',
};
return ku;
}());

View File

@ -1,27 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var lb = {
code: 'lb',
week: {
dow: 1, // Monday is the first day of the week.
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',
},
weekText: 'W',
allDayText: 'Ganzen Dag',
moreLinkText: 'méi',
noEventsText: 'Nee Evenementer ze affichéieren',
};
return lb;
}());

View File

@ -1,27 +0,0 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var lt = {
code: 'lt',
week: {
dow: 1, // Monday is the first day of the week.
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ė',
},
weekText: 'SAV',
allDayText: 'Visą dieną',
moreLinkText: 'daugiau',
noEventsText: 'Nėra įvykių rodyti',
};
return lt;
}());

Some files were not shown because too many files have changed in this diff Show More