diff plugins/calendar/print.js @ 3:f6fe4b6ae66a

calendar plugin nearly as distributed
author Charlie Root
date Sat, 13 Jan 2018 08:56:12 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/calendar/print.js	Sat Jan 13 08:56:12 2018 -0500
@@ -0,0 +1,176 @@
+/**
+ * Print view for the Calendar plugin
+ *
+ * @author Thomas Bruederli <bruederli@kolabsys.com>
+ *
+ * @licstart  The following is the entire license notice for the
+ * JavaScript code in this file.
+ *
+ * Copyright (C) 2011, Kolab Systems AG <contact@kolabsys.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @licend  The above is the entire license notice
+ * for the JavaScript code in this file.
+ */
+
+
+/* calendar plugin printing code */
+window.rcmail && rcmail.addEventListener('init', function(evt) {
+
+  // quote html entities
+  var Q = function(str)
+  {
+    return String(str).replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
+  };
+  
+  var rc_loading;
+  var showdesc = true;
+  var settings = $.extend(rcmail.env.calendar_settings, rcmail.env.libcal_settings);
+  
+  // create list of event sources AKA calendars
+  var src, event_sources = [];
+  var add_url = (rcmail.env.search ? '&q='+escape(rcmail.env.search) : '');
+  for (var id in rcmail.env.calendars) {
+    if (!rcmail.env.calendars[id].active)
+      continue;
+
+    source = $.extend({
+      url: "./?_task=calendar&_action=load_events&source=" + escape(id) + add_url,
+      className: 'fc-event-cal-'+id,
+      id: id
+    }, rcmail.env.calendars[id]);
+
+    event_sources.push(source);
+  }
+  
+  var viewdate = new Date();
+  if (rcmail.env.date)
+    viewdate.setTime(rcmail.env.date * 1000);
+
+  // initalize the fullCalendar plugin
+  var fc = $('#calendar').fullCalendar({
+    header: {
+      left: '',
+      center: 'title',
+      right: 'agendaDay,agendaWeek,month,table'
+    },
+    aspectRatio: 0.85,
+    ignoreTimezone: true,  // will treat the given date strings as in local (browser's) timezone
+    date: viewdate.getDate(),
+    month: viewdate.getMonth(),
+    year: viewdate.getFullYear(),
+    defaultView: rcmail.env.view,
+    eventSources: event_sources,
+    monthNames : settings['months'],
+    monthNamesShort : settings['months_short'],
+    dayNames : settings['days'],
+    dayNamesShort : settings['days_short'],
+    firstDay : settings['first_day'],
+    firstHour : settings['first_hour'],
+    slotMinutes : 60/settings['timeslots'],
+    timeFormat: {
+      '': settings['time_format'],
+      agenda: settings['time_format'] + '{ - ' + settings['time_format'] + '}',
+      list: settings['time_format'] + '{ - ' + settings['time_format'] + '}',
+      table: settings['time_format'] + '{ - ' + settings['time_format'] + '}'
+    },
+    axisFormat : settings['time_format'],
+    columnFormat: {
+      month: 'ddd', // Mon
+      week: 'ddd ' + settings['date_short'], // Mon 9/7
+      day: 'dddd ' + settings['date_short'],  // Monday 9/7
+      list: settings['date_agenda'],
+      table: settings['date_agenda']
+    },
+    titleFormat: {
+      month: 'MMMM yyyy',
+      week: settings['dates_long'],
+      day: 'dddd ' + settings['date_long'],
+      list: settings['dates_long'],
+      table: settings['dates_long']
+    },
+    listSections: rcmail.env.listSections !== undefined ? rcmail.env.listSections : settings['agenda_sections'],
+    listRange: rcmail.env.listRange || settings['agenda_range'],
+    tableCols: ['handle', 'date', 'time', 'title', 'location'],
+    allDayText: rcmail.gettext('all-day', 'calendar'),
+    buttonText: {
+      day: rcmail.gettext('day', 'calendar'),
+      week: rcmail.gettext('week', 'calendar'),
+      month: rcmail.gettext('month', 'calendar'),
+      table: rcmail.gettext('agenda', 'calendar')
+    },
+    listTexts: {
+      until: rcmail.gettext('until', 'calendar'),
+      past: rcmail.gettext('pastevents', 'calendar'),
+      today: rcmail.gettext('today', 'calendar'),
+      tomorrow: rcmail.gettext('tomorrow', 'calendar'),
+      thisWeek: rcmail.gettext('thisweek', 'calendar'),
+      nextWeek: rcmail.gettext('nextweek', 'calendar'),
+      thisMonth: rcmail.gettext('thismonth', 'calendar'),
+      nextMonth: rcmail.gettext('nextmonth', 'calendar'),
+      future: rcmail.gettext('futureevents', 'calendar'),
+      week: rcmail.gettext('weekofyear', 'calendar')
+    },
+    loading: function(isLoading) {
+      rc_loading = rcmail.set_busy(isLoading, 'loading', rc_loading);
+    },
+    // event rendering
+    eventRender: function(event, element, view) {
+      if (view.name != 'month' && view.name != 'table') {
+        var cont = element.find('.fc-event-title');
+        if (event.location) {
+          cont.after('<div class="fc-event-location">@&nbsp;' + Q(event.location) + '</div>');
+          cont = cont.next();
+        }
+        if (event.description && showdesc) {
+          cont.after('<div class="fc-event-description">' + Q(event.description) + '</div>');
+        }
+/* TODO: create icons black on white
+        if (event.recurrence)
+          element.find('.fc-event-time').append('<i class="fc-icon-recurring"></i>');
+        if (event.alarms)
+          element.find('.fc-event-time').append('<i class="fc-icon-alarms"></i>');
+*/
+      }
+      if (view.name == 'table' && event.description && showdesc) {
+        var cols = element.children().css('border', 0).length;
+        element.after('<tr class="fc-event-row-secondary fc-event"><td colspan="'+cols+'" class="fc-event-description">' + Q(event.description) + '</td></tr>');
+      }
+    },
+    viewDisplay: function(view) {
+      // remove hard-coded hight and make contents visible
+      window.setTimeout(function(){
+        if (view.name == 'table') {
+          $('div.fc-list-content').css('overflow', 'visible').height('auto');
+        }
+        else {
+          $('div.fc-agenda-divider')
+            .next().css('overflow', 'visible').height('auto')
+            .children('div').css('overflow', 'visible').height('auto');
+          }
+          // adjust fixed height if vertical day slots
+          var h = $('table.fc-agenda-slots:visible').height() + $('table.fc-agenda-allday:visible').height() + 4;
+          if (h) $('table.fc-agenda-days td.fc-widget-content').children('div').height(h);
+         }, 20);
+    }
+  });
+  
+  // activate settings form
+  $('#propdescription').change(function(){
+    showdesc = this.checked;
+    fc.fullCalendar('render');
+  });
+
+});