Projects
Kolab:Winterfell
roundcubemail-plugins-kolab
Log In
Username
Password
We truncated the diff of some files because they were too big. If you want to see the full diff for every file,
click here
.
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 108
View file
roundcubemail-plugins-kolab.spec
Changed
@@ -41,7 +41,7 @@ %global dash_rel_suffix %{?rc_rel_suffix:-%{rc_rel_suffix}} Name: roundcubemail-plugins-kolab -Version: 3.4.2 +Version: 3.4.3 Release: 1%{?dot_rel_suffix}%{?dist} @@ -61,9 +61,6 @@ Source103: plesk.kolab_folders.inc.php Source104: plesk.libkolab.inc.php -Patch0001: 0001-Unbreak-de_DE-localization-file.patch -Patch0002: 0002-Elastic-Fix-Save-Edit-buttons-on-plain-text-editor-B.patch - Patch1001: roundcubemail-plugins-kolab-3.3-kolab-files-manticore-api.patch BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) @@ -1363,8 +1360,6 @@ cp -afv %{SOURCE104} plugins/libkolab/config.inc.php.dist %endif -%patch0001 -p1 -%patch0002 -p1 %patch1001 -p1 find -type d -name "helpdocs" -exec rm -rvf {} \; 2>/dev/null || : @@ -2670,6 +2665,9 @@ %defattr(-,root,root,-) %changelog +* Thu Mar 14 2019 Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com> - 3.4.3-1 +- Release of version 3.4.3 + * Sun Jan 27 2019 Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com> - 3.4.2-2 - Fix de_DE, save buttons
View file
0001-Unbreak-de_DE-localization-file.patch
Deleted
@@ -1,27 +0,0 @@ -From 5834133fadb9eaf798d98e2aabe159748a0bf9db Mon Sep 17 00:00:00 2001 -From: Aleksander Machniak <machniak@kolabsys.com> -Date: Tue, 22 Jan 2019 07:32:42 +0000 -Subject: [PATCH 1/3] Unbreak de_DE localization file - ---- - plugins/tasklist/localization/de_DE.inc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/plugins/tasklist/localization/de_DE.inc b/plugins/tasklist/localization/de_DE.inc -index 65d7e644..0d930c5d 100644 ---- a/plugins/tasklist/localization/de_DE.inc -+++ b/plugins/tasklist/localization/de_DE.inc -@@ -234,8 +234,8 @@ $labels['importsuccess'] = '$nr Aufgaben erfolgreich importiert'; - $labels['importerror'] = 'Fehler beim Importieren'; - $labels['newerversionexists'] = 'Eine neuere Version dieser Aufgabe existiert bereits! Abbruch.'; - $labels['nowritetasklistfound'] = 'Keine Aufgabenliste zum Speichern der Aufgabe gefunden'; --$labels['importedsuccessfully'] = 'Die Aufgabe wurde erfolgreich unter '$list' gespeichert'; --$labels['updatedsuccessfully'] = 'Die Aufgabe wurde erfolgreich in '$list' aktualisiert'; -+$labels['importedsuccessfully'] = 'Die Aufgabe wurde erfolgreich unter \'$list\' gespeichert'; -+$labels['updatedsuccessfully'] = 'Die Aufgabe wurde erfolgreich in \'$list\' aktualisiert'; - $labels['attendeupdateesuccess'] = 'Teilnehmerstatus erfolgreich aktualisiert'; - $labels['itipresponseerror'] = 'Senden der Antwort auf diese Aufgabenzuweisung fehlgeschlagen'; - $labels['itipinvalidrequest'] = 'Diese Einladung ist nicht mehr gültig.'; --- -2.20.1 -
View file
0002-Elastic-Fix-Save-Edit-buttons-on-plain-text-editor-B.patch
Deleted
@@ -1,111 +0,0 @@ -From 4b0562086724d6b4d5f1537a5d42a0a6034e8351 Mon Sep 17 00:00:00 2001 -From: Aleksander Machniak <machniak@kolabsys.com> -Date: Tue, 22 Jan 2019 09:44:45 +0000 -Subject: [PATCH 2/3] Elastic: Fix Save/Edit buttons on plain text editor - (Bifrost#T173153) - ---- - plugins/kolab_files/kolab_files.js | 11 ++++++---- - plugins/kolab_files/skins/elastic/ui.js | 27 ++++++++++++------------- - 2 files changed, 20 insertions(+), 18 deletions(-) - -diff --git a/plugins/kolab_files/kolab_files.js b/plugins/kolab_files/kolab_files.js -index 3a60ddb1..c32ea009 100644 ---- a/plugins/kolab_files/kolab_files.js -+++ b/plugins/kolab_files/kolab_files.js -@@ -1251,10 +1251,6 @@ function kolab_files_frame_load(frame) - } - catch (e) {}; - -- // on edit page switch immediately to edit mode -- if (rcmail.file_editor && rcmail.file_editor.editable && rcmail.env.action == 'edit') -- rcmail.files_edit(); -- - rcmail.enable_command('files-edit', (rcmail.file_editor && rcmail.file_editor.editable) - || rcmail.env.editor_type - || (file_api.file_type_supported(rcmail.env.file_data.type, rcmail.env.files_caps) & 4)); -@@ -1266,6 +1262,10 @@ function kolab_files_frame_load(frame) - rcmail.enable_command('image-scale', 'image-rotate', info && !!/^image\//.test(info.type)); - rcmail.gui_objects.messagepartframe = frame; - -+ // on edit page switch immediately to edit mode -+ if (rcmail.file_editor && rcmail.file_editor.editable && rcmail.env.action == 'edit') -+ rcmail.files_edit(); -+ - // detect Print button and check if it can be accessed - try { - if ($('#fileframe').contents().find('#print').length) -@@ -3895,6 +3895,9 @@ function kolab_files_ui() - _frame: 1 - }; - -+ if (rcmail.is_framed()) -+ args._framed = 1; -+ - if (params && params.session) - args._session = params.session; - -diff --git a/plugins/kolab_files/skins/elastic/ui.js b/plugins/kolab_files/skins/elastic/ui.js -index 48c23dfa..33edbb12 100644 ---- a/plugins/kolab_files/skins/elastic/ui.js -+++ b/plugins/kolab_files/skins/elastic/ui.js -@@ -78,9 +78,20 @@ function kolab_files_members_list(link) - }; - - --if (rcmail.env.action == 'open') { -+if (rcmail.env.action == 'open' || rcmail.env.action == 'edit') { - rcmail.addEventListener('enable-command', kolab_files_enable_command); - -+ if (rcmail.env.action == 'open') { -+ $('#toolbar-menu a.button.save').parent().hide(); -+ } -+ else if (rcmail.env.action == 'edit') { -+ if (rcmail.env.editor_type == 'wopi' && rcmail.is_framed()) { -+ parent.$('.ui-dialog:visible .ui-dialog-buttonpane').addClass('hidden'); -+ } -+ -+ rcmail.gui_object('exportmenu', 'export-menu'); -+ } -+ - // center and scale the image in preview frame - if (rcmail.env.mimetype.startsWith('image/')) { - $('#fileframe').on('load', function() { -@@ -92,7 +103,7 @@ if (rcmail.env.action == 'open') { - } - - // Elastic mobile preview uses an iframe in a dialog -- if (rcmail.is_framed()) { -+ if ((rcmail.env.action == 'open' || rcmail.env.editor_type != 'wopi') && rcmail.is_framed()) { - var edit_button = $('#filetoolbar a.button.edit'), - save_button = $('#filetoolbar a.button.save'); - -@@ -111,9 +122,6 @@ if (rcmail.env.action == 'open') { - ); - } - } --else if (rcmail.env.action == 'edit') { -- rcmail.gui_object('exportmenu', 'export-menu'); --} - else { - rcmail.addEventListener('files-folder-select', function(p) { - var is_sess = p.folder == 'folder-collection-sessions'; -@@ -126,15 +134,6 @@ else { - } - - $(document).ready(function() { -- if (rcmail.env.action == 'open') { -- $('#toolbar-menu a.button.save').parent().hide(); -- } -- else if (rcmail.env.action == 'edit') { -- if (rcmail.is_framed()) { -- parent.$('.ui-dialog:visible .ui-dialog-buttonpane').addClass('hidden'); -- } -- } -- - if ($('#dragfilemenu').length) { - rcmail.gui_object('file_dragmenu', 'dragfilemenu'); - } --- -2.20.1 -
View file
debian.changelog
Changed
@@ -1,3 +1,9 @@ +roundcubemail-plugins-kolab (1:3.4.3-0~kolab1) unstable; urgency=low + + * Release of version 3.4.3 + + -- Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com> Thu, 14 Mar 2019 11:11:11 +0200 + roundcubemail-plugins-kolab (1:3.4.2-0~kolab2) unstable; urgency=low * Fix de_DE, save button
View file
debian.series
Changed
@@ -1,3 +1,1 @@ roundcubemail-plugins-kolab-3.3-kolab-files-manticore-api.patch -p1 -0001-Unbreak-de_DE-localization-file.patch -p1 -0002-Elastic-Fix-Save-Edit-buttons-on-plain-text-editor-B.patch -p1
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/calendar/calendar.php -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/calendar/calendar.php
Changed
@@ -50,7 +50,6 @@ 'calendar_work_start' => 6, 'calendar_work_end' => 18, 'calendar_agenda_range' => 60, - 'calendar_agenda_sections' => 'smart', 'calendar_event_coloring' => 0, 'calendar_time_indicator' => true, 'calendar_allow_invite_shared' => false, @@ -296,7 +295,6 @@ return $calendar ?: $first; } - /** * Render the main calendar view from skin template */ @@ -304,9 +302,6 @@ { $this->rc->output->set_pagetitle($this->gettext('calendar')); - // Add CSS stylesheets to the page header - $this->ui->addCSS(); - // Add JS files to the page header $this->ui->addJS(); @@ -326,7 +321,7 @@ ))); $view = rcube_utils::get_input_value('view', rcube_utils::INPUT_GPC); - if (in_array($view, array('agendaWeek', 'agendaDay', 'month', 'table'))) + if (in_array($view, array('agendaWeek', 'agendaDay', 'month', 'list'))) $this->rc->output->set_env('view', $view); if ($date = rcube_utils::get_input_value('date', rcube_utils::INPUT_GPC)) @@ -378,14 +373,15 @@ } $field_id = 'rcmfd_default_view'; + $view = $this->rc->config->get('calendar_default_view', $this->defaults['calendar_default_view']); $select = new html_select(array('name' => '_default_view', 'id' => $field_id)); $select->add($this->gettext('day'), "agendaDay"); $select->add($this->gettext('week'), "agendaWeek"); $select->add($this->gettext('month'), "month"); - $select->add($this->gettext('agenda'), "table"); + $select->add($this->gettext('agenda'), "list"); $p['blocks']['view']['options']['default_view'] = array( 'title' => html::label($field_id, rcube::Q($this->gettext('default_view'))), - 'content' => $select->show($this->rc->config->get('calendar_default_view', $this->defaults['calendar_default_view'])), + 'content' => $select->show($view == 'table' ? 'list' : $view), ); } @@ -1323,12 +1319,21 @@ */ function load_events() { - $events = $this->driver->load_events( - rcube_utils::get_input_value('start', rcube_utils::INPUT_GET), - rcube_utils::get_input_value('end', rcube_utils::INPUT_GET), - ($query = rcube_utils::get_input_value('q', rcube_utils::INPUT_GET)), - rcube_utils::get_input_value('source', rcube_utils::INPUT_GET) - ); + $start = rcube_utils::get_input_value('start', rcube_utils::INPUT_GET); + $end = rcube_utils::get_input_value('end', rcube_utils::INPUT_GET); + $query = rcube_utils::get_input_value('q', rcube_utils::INPUT_GET); + $source = rcube_utils::get_input_value('source', rcube_utils::INPUT_GET); + + if (!is_numeric($start) || strpos($start, 'T')) { + $start = new DateTime($start, $this->timezone); + $start = $start->getTimestamp(); + } + if (!is_numeric($end) || strpos($end, 'T')) { + $end = new DateTime($end, $this->timezone); + $end = $end->getTimestamp(); + } + + $events = $this->driver->load_events($start, $end, $query, $source); echo $this->encode($events, !empty($query)); exit; } @@ -1767,15 +1772,12 @@ // configuration $settings['default_calendar'] = $this->rc->config->get('calendar_default_calendar'); $settings['default_view'] = (string)$this->rc->config->get('calendar_default_view', $this->defaults['calendar_default_view']); - $settings['date_agenda'] = (string)$this->rc->config->get('calendar_date_agenda', $this->defaults['calendar_date_agenda']); - $settings['timeslots'] = (int)$this->rc->config->get('calendar_timeslots', $this->defaults['calendar_timeslots']); $settings['first_day'] = (int)$this->rc->config->get('calendar_first_day', $this->defaults['calendar_first_day']); $settings['first_hour'] = (int)$this->rc->config->get('calendar_first_hour', $this->defaults['calendar_first_hour']); $settings['work_start'] = (int)$this->rc->config->get('calendar_work_start', $this->defaults['calendar_work_start']); $settings['work_end'] = (int)$this->rc->config->get('calendar_work_end', $this->defaults['calendar_work_end']); $settings['agenda_range'] = (int)$this->rc->config->get('calendar_agenda_range', $this->defaults['calendar_agenda_range']); - $settings['agenda_sections'] = $this->rc->config->get('calendar_agenda_sections', $this->defaults['calendar_agenda_sections']); $settings['event_coloring'] = (int)$this->rc->config->get('calendar_event_coloring', $this->defaults['calendar_event_coloring']); $settings['time_indicator'] = (int)$this->rc->config->get('calendar_time_indicator', $this->defaults['calendar_time_indicator']); $settings['invite_shared'] = (int)$this->rc->config->get('calendar_allow_invite_shared', $this->defaults['calendar_allow_invite_shared']); @@ -1889,24 +1891,32 @@ $event['description'] = trim($h2t->get_text()); } - // mapping url => vurl because of the fullcalendar client script + // mapping url => vurl, allday => allDay because of the fullcalendar client script $event['vurl'] = $event['url']; + $event['allDay'] = !empty($event['allday']); unset($event['url']); + unset($event['allday']); + + $event['className'] = $event['className'] ? explode(' ', $event['className']) : array(); + + if ($event['allDay']) { + $event['end'] = $event['end']->add(new DateInterval('P1D')); + } + + if ($_GET['mode'] == 'print') { + $event['editable'] = false; + } return array( '_id' => $event['calendar'] . ':' . $event['id'], // unique identifier for fullcalendar - 'start' => $this->lib->adjust_timezone($event['start'], $event['allday'])->format('c'), - 'end' => $this->lib->adjust_timezone($event['end'], $event['allday'])->format('c'), + 'start' => $this->lib->adjust_timezone($event['start'], $event['allDay'])->format('c'), + 'end' => $this->lib->adjust_timezone($event['end'], $event['allDay'])->format('c'), // 'changed' might be empty for event recurrences (Bug #2185) 'changed' => $event['changed'] ? $this->lib->adjust_timezone($event['changed'])->format('c') : null, 'created' => $event['created'] ? $this->lib->adjust_timezone($event['created'])->format('c') : null, 'title' => strval($event['title']), 'description' => strval($event['description']), 'location' => strval($event['location']), - 'className' => ($addcss ? 'fc-event-cal-'.asciiwords($event['calendar'], true).' ' : '') . - 'fc-event-cat-' . asciiwords(strtolower(join('-', (array)$event['categories'])), true) . - rtrim(' ' . $event['className']), - 'allDay' => ($event['allday'] == 1), ) + $event; } @@ -2056,7 +2066,8 @@ // convert dates into DateTime objects in user's current timezone $event['start'] = new DateTime($event['start'], $this->timezone); $event['end'] = new DateTime($event['end'], $this->timezone); - $event['allday'] = (bool)$event['allday']; + $event['allday'] = !empty($event['allDay']); + unset($event['allDay']); // start/end is all we need for 'move' action (#1480) if ($action == 'move') { @@ -2410,10 +2421,10 @@ $title = $this->gettext('print'); $view = rcube_utils::get_input_value('view', rcube_utils::INPUT_GPC); - if (!in_array($view, array('agendaWeek', 'agendaDay', 'month', 'table'))) + if (!in_array($view, array('agendaWeek', 'agendaDay', 'month', 'list'))) $view = 'agendaDay'; - $this->rc->output->set_env('view',$view); + $this->rc->output->set_env('view', $view); if ($date = rcube_utils::get_input_value('date', rcube_utils::INPUT_GPC)) $this->rc->output->set_env('date', $date); @@ -2421,28 +2432,19 @@ if ($range = rcube_utils::get_input_value('range', rcube_utils::INPUT_GPC)) $this->rc->output->set_env('listRange', intval($range)); - if (isset($_REQUEST['sections'])) - $this->rc->output->set_env('listSections', rcube_utils::get_input_value('sections', rcube_utils::INPUT_GPC)); - if ($search = rcube_utils::get_input_value('search', rcube_utils::INPUT_GPC)) { $this->rc->output->set_env('search', $search); $title .= ' "' . $search . '"'; } - // Add CSS stylesheets to the page header - $skin_path = $this->local_skin_path(); - $this->include_stylesheet($skin_path . '/fullcalendar.css'); - $this->include_stylesheet($skin_path . '/print.css'); - - // Add JS files to the page header - $this->include_script('print.js'); - $this->include_script('lib/js/fullcalendar.js'); - + // Add JS to the page + $this->ui->addJS(); + $this->register_handler('plugin.calendar_css', array($this->ui, 'calendar_css')); $this->register_handler('plugin.calendar_list', array($this->ui, 'calendar_list')); - + $this->rc->output->set_pagetitle($title); - $this->rc->output->send("calendar.print"); + $this->rc->output->send('calendar.print'); } /**
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/calendar/calendar_ui.js -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/calendar/calendar_ui.js
Changed
@@ -71,111 +71,103 @@ var sensitivitylabels = { 'public':rcmail.gettext('public','calendar'), 'private':rcmail.gettext('private','calendar'), 'confidential':rcmail.gettext('confidential','calendar') }; var ui_loading = rcmail.set_busy(true, 'loading'); - // general datepicker settings - var datepicker_settings = { - // translate from fullcalendar format to datepicker format - dateFormat: settings.date_format.replace(/M/g, 'm').replace(/mmmmm/, 'MM').replace(/mmm/, 'M').replace(/dddd/, 'DD').replace(/ddd/, 'D').replace(/yy/g, 'y'), - firstDay: settings.first_day, - // dayNamesMin: settings.days_short, - monthNames: settings.months, - monthNamesShort: settings.months, - changeMonth: false, - showWeek: settings.show_weekno >= 0, - showOtherMonths: true, - selectOtherMonths: true - }; - // global fullcalendar settings var fullcalendar_defaults = { + theme: false, aspectRatio: 1, - ignoreTimezone: true, // will treat the given date strings as in local (browser's) timezone - 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 - table: settings.date_agenda + timezone: false, // will treat the given date strings as in local (browser's) timezone + monthNames: settings.months, + monthNamesShort: settings.months_short, + dayNames: settings.days, + dayNamesShort: settings.days_short, + weekNumbers: settings.show_weekno > 0, + weekNumberTitle: rcmail.gettext('weekshort', 'calendar') + ' ', + firstDay: settings.first_day, + firstHour: settings.first_hour, + slotDuration: {minutes: 60/settings.timeslots}, + businessHours: { + start: settings.work_start + ':00', + end: settings.work_end + ':00' }, - titleFormat: { - month: 'MMMM yyyy', - week: settings.dates_long, - day: 'dddd ' + settings.date_long, - table: settings.dates_long + scrollTime: settings.work_start + ':00', + views: { + list: { + titleFormat: settings.dates_long, + listDayFormat: settings.date_long, + visibleRange: function(currentDate) { + return { + start: currentDate.clone(), + end: currentDate.clone().add(settings.agenda_range, 'days') + } + } + }, + month: { + columnFormat: 'ddd', // Mon + titleFormat: 'MMMM YYYY', + eventLimit: 4 + }, + week: { + columnFormat: 'ddd ' + settings.date_short, // Mon 9/7 + titleFormat: settings.dates_long + }, + day: { + columnFormat: 'dddd ' + settings.date_short, // Monday 9/7 + titleFormat: 'dddd ' + settings.date_long + } }, - listPage: 7, // advance one week in agenda view - listRange: settings.agenda_range, - listSections: settings.agenda_sections, - tableCols: ['handle', 'date', 'time', 'title', 'location'], + timeFormat: settings.time_format, + slotLabelFormat: settings.time_format, defaultView: rcmail.env.view || settings.default_view, allDayText: rcmail.gettext('all-day', 'calendar'), - weekNumbers: settings.show_weekno > 0, - weekNumberTitle: rcmail.gettext('weekshort', 'calendar') + ' ', buttonText: { - prev: ' ◄ ', - next: ' ► ', today: settings['today'], day: rcmail.gettext('day', 'calendar'), week: rcmail.gettext('week', 'calendar'), month: rcmail.gettext('month', 'calendar'), - table: rcmail.gettext('agenda', 'calendar') + list: 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') + buttonIcons: { + prev: 'left-single-arrow', + next: 'right-single-arrow' + }, + nowIndicator: settings.time_indicator, + eventLimitText: function(num) { + return rcmail.gettext('andnmore', 'calendar').replace('$nr', num); }, - currentTimeIndicator: settings.time_indicator, // event rendering eventRender: function(event, element, view) { - if (view.name != 'list' && view.name != 'table') { + if (view.name != 'list') { var prefix = event.sensitivity && event.sensitivity != 'public' ? String(sensitivitylabels[event.sensitivity]).toUpperCase()+': ' : ''; element.attr('title', prefix + event.title); } if (view.name != 'month') { - if (event.location) { - element.find('div.fc-event-title').after('<div class="fc-event-location">@ ' + Q(event.location) + '</div>'); + if (view.name == 'list') { + var loc = $('<td>').attr('class', 'fc-event-location'); + if (event.location) + loc.text(event.location); + element.find('.fc-list-item-title').after(loc); + } + else if (event.location) { + element.find('div.fc-title').after($('<div class="fc-event-location">').html('@ ' + Q(event.location))); } + var time_element = element.find('div.fc-time'); if (event.sensitivity && event.sensitivity != 'public') - element.find('div.fc-event-time').append('<i class="fc-icon-sensitive"></i>'); + time_element.append('<i class="fc-icon-sensitive"></i>'); if (event.recurrence) - element.find('div.fc-event-time').append('<i class="fc-icon-recurring"></i>'); + time_element.append('<i class="fc-icon-recurring"></i>'); if (event.alarms || (event.valarms && event.valarms.length)) - element.find('div.fc-event-time').append('<i class="fc-icon-alarms"></i>'); + time_element.append('<i class="fc-icon-alarms"></i>'); } if (event.status) { element.addClass('cal-event-status-' + String(event.status).toLowerCase()); } + set_event_colors(element, event, view.name); element.attr('aria-label', event.title + ', ' + me.event_date_text(event, true)); }, - // render element indicating more (invisible) events - overflowRender: function(data, element) { - element.html(rcmail.gettext('andnmore', 'calendar').replace('$nr', data.count)) - .click(function(e){ me.fisheye_view(data.date); }); - }, // callback when a specific event is clicked eventClick: function(event, ev, view) { - if (!event.temp && String(event.className).indexOf('fc-type-freebusy') < 0) + if (!event.temp && (!event.className || event.className.indexOf('fc-type-freebusy') < 0)) event_show_dialog(event, ev); } }; @@ -184,7 +176,6 @@ var Q = this.quote_html; var text2html = this.text2html; var event_date_text = this.event_date_text; - var parse_datetime = this.parse_datetime; var date2unixtime = this.date2unixtime; var fromunixtime = this.fromunixtime; var parseISO8601 = this.parseISO8601; @@ -226,8 +217,8 @@ // clone the given date object and optionally adjust time var clone_date = function(date, adjust) { - var d = new Date(date.getTime()); - + var d = 'toDate' in date ? date.toDate() : new Date(date.getTime()); + // set time to 00:00 if (adjust == 1) { d.setHours(0); @@ -238,7 +229,7 @@ d.setHours(23); d.setMinutes(59); } -
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/calendar/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/calendar/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Calendar plugin", "homepage": "https://git.kolab.org/diffusion/RPK/", "license": "AGPLv3", - "version": "3.4.2", + "version": "3.4.3", "authors": [ { "name": "Thomas Bruederli", @@ -20,7 +20,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/calendar/config.inc.php.dist -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/calendar/config.inc.php.dist
Changed
@@ -34,33 +34,6 @@ // show a birthdays calendar from the user's address book(s) $config['calendar_contact_birthdays'] = false; -// mapping of Roundcube date formats to calendar formats (long/short/agenda) -// should be in sync with 'date_formats' in main config -$config['calendar_date_format_sets'] = array( - 'yyyy-MM-dd' => array('MMM d yyyy', 'M-d', 'ddd MM-dd'), - 'dd-MM-yyyy' => array('d MMM yyyy', 'd-M', 'ddd dd-MM'), - 'yyyy/MM/dd' => array('MMM d yyyy', 'M/d', 'ddd MM/dd'), - 'MM/dd/yyyy' => array('MMM d yyyy', 'M/d', 'ddd MM/dd'), - 'dd/MM/yyyy' => array('d MMM yyyy', 'd/M', 'ddd dd/MM'), - 'dd.MM.yyyy' => array('dd. MMM yyyy', 'd.M', 'ddd dd.MM.'), - 'd.M.yyyy' => array('d. MMM yyyy', 'd.M', 'ddd d.MM.'), -); - -// general date format (only set if different from default date format and not user configurable) -// $config['calendar_date_format'] = "yyyy-MM-dd"; - -// time format (only set if different from default date format) -// $config['calendar_time_format'] = "HH:mm"; - -// short date format (used for column titles) -// $config['calendar_date_short'] = 'M-d'; - -// long date format (used for calendar title) -// $config['calendar_date_long'] = 'MMM d yyyy'; - -// date format used for agenda view -// $config['calendar_date_agenda'] = 'ddd MM-dd'; - // timeslots per hour (1, 2, 3, 4, 6) $config['calendar_timeslots'] = 2;
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/calendar/drivers/kolab/kolab_calendar.php -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/calendar/drivers/kolab/kolab_calendar.php
Changed
@@ -40,7 +40,7 @@ protected $cal; protected $events = array(); - protected $search_fields = array('title', 'description', 'location', 'attendees'); + protected $search_fields = array('title', 'description', 'location', 'attendees', 'categories'); /** * Factory method to instantiate a kolab_calendar object
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/calendar/lib/calendar_ui.php -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/calendar/lib/calendar_ui.php
Changed
@@ -60,9 +60,8 @@ $this->cal->include_script('calendar_base.js'); } - $skin_path = $this->cal->local_skin_path(); - $this->cal->include_stylesheet($skin_path . '/calendar.css'); - + $this->addCSS(); + $this->ready = true; } @@ -109,7 +108,17 @@ public function addCSS() { $skin_path = $this->cal->local_skin_path(); - $this->cal->include_stylesheet($skin_path . '/fullcalendar.css'); + + if ($this->rc->task == 'calendar' && (!$this->rc->action || in_array($this->rc->action, array('index', 'print')))) { + // Include fullCalendar style before skin file for simpler style overriding + $this->cal->include_stylesheet($skin_path . '/fullcalendar.css'); + } + + $this->cal->include_stylesheet($skin_path . '/calendar.css'); + + if ($this->rc->task == 'calendar' && $this->rc->action == 'print') { + $this->cal->include_stylesheet($skin_path . '/print.css'); + } } /** @@ -117,12 +126,18 @@ */ public function addJS() { - $this->cal->include_script('calendar_ui.js'); + $this->cal->include_script('lib/js/moment.js'); $this->cal->include_script('lib/js/fullcalendar.js'); - $this->rc->output->include_script('treelist.js'); - $this->cal->api->include_script('libkolab/libkolab.js'); - jqueryui::miniColors(); + if ($this->rc->task == 'calendar' && $this->rc->action == 'print') { + $this->cal->include_script('print.js'); + } + else { + $this->rc->output->include_script('treelist.js'); + $this->cal->api->include_script('libkolab/libkolab.js'); + $this->cal->include_script('calendar_ui.js'); + jqueryui::miniColors(); + } } /** @@ -130,41 +145,30 @@ */ function calendar_css($attrib = array()) { + $categories = $this->cal->driver->list_categories(); + $js_categories = array(); $mode = $this->rc->config->get('calendar_event_coloring', $this->cal->defaults['calendar_event_coloring']); - $categories = $this->cal->driver->list_categories(); - $css = "\n"; - + $css = "\n"; + foreach ((array)$categories as $class => $color) { - if (empty($color)) - continue; - - $class = 'cat-' . asciiwords(strtolower($class), true); - $css .= ".$class { color: #$color }\n"; - if ($mode > 0) { - if ($mode == 2) { - $css .= ".fc-event-$class .fc-event-bg {"; - $css .= " opacity: 0.9;"; - $css .= " filter: alpha(opacity=90);"; - } - else { - $css .= ".fc-event-$class.fc-event-skin, "; - $css .= ".fc-event-$class .fc-event-skin, "; - $css .= ".fc-event-$class .fc-event-inner {"; - } - $css .= " background-color: #" . $color . ";"; - if ($mode % 2) - $css .= " border-color: #$color;"; - $css .= "}\n"; + if (!empty($color)) { + $js_categories[$class] = $color; + + $color = ltrim($color, '#'); + $class = 'cat-' . asciiwords(strtolower($class), true); + $css .= ".$class { color: #$color; }\n"; } } - + + $this->rc->output->set_env('calendar_categories', $js_categories); + $calendars = $this->cal->driver->list_calendars(); foreach ((array)$calendars as $id => $prop) { - if (!$prop['color']) - continue; - $css .= $this->calendar_css_classes($id, $prop, $mode, $attrib); + if ($prop['color']) { + $css .= $this->calendar_css_classes($id, $prop, $mode, $attrib); + } } - + return html::tag('style', array('type' => 'text/css'), $css); } @@ -177,29 +181,12 @@ // replace white with skin-defined color if (!empty($attrib['folder-fallback-color']) && preg_match('/^f+$/i', $folder_color)) { - $folder_color = $attrib['folder-fallback-color']; + $folder_color = ltrim($attrib['folder-fallback-color'], '#'); } $class = 'cal-' . asciiwords($id, true); $css = str_replace('$class', $class, $attrib['folder-class']) ?: "li .$class"; - $css .= ", #eventshow .$class { color: #$folder_color; }\n"; - - if ($mode != 1) { - if ($mode == 3) { - $css .= ".fc-event-$class .fc-event-bg {"; - $css .= " opacity: 0.9;"; - $css .= " filter: alpha(opacity=90);"; - } - else { - $css .= ".fc-event-$class, "; - $css .= ".fc-event-$class .fc-event-inner {"; - } - if (!$prop['printmode']) - $css .= " background-color: #$color;"; - if ($mode % 2 == 0) - $css .= " border-color: #$color;"; - $css .= "}\n"; - } + $css .= " { color: #$folder_color; }\n"; return $css . ".$class .handle { background-color: #$color; }\n"; } @@ -321,7 +308,7 @@ $content = html::div(join(' ', $classes), html::a(array('class' => 'calname', 'id' => $label_id, 'title' => $title, 'href' => '#'), rcube::Q($prop['editname'] ?: $prop['listname'])) . ($prop['virtual'] ? '' : - html::tag('input', array('type' => 'checkbox', 'name' => '_cal[]', 'value' => $id, 'checked' => $prop['active'], 'aria-labelledby' => $label_id), '') . + html::tag('input', array('type' => 'checkbox', 'name' => '_cal[]', 'value' => $id, 'checked' => $prop['active'], 'aria-labelledby' => $label_id)) . html::span('actions', ($prop['removable'] ? html::a(array('href' => '#', 'class' => 'remove', 'title' => $this->cal->gettext('removelist')), ' ') : '') . html::a(array('href' => '#', 'class' => 'quickview', 'title' => $this->cal->gettext('quickview'), 'role' => 'checkbox', 'aria-checked' => 'false'), '') . @@ -354,17 +341,6 @@ . $select_range->show($this->rc->config->get('calendar_agenda_range', $this->cal->defaults['calendar_agenda_range'])) ); - $select_sections = new html_select(array('name' => 'listsections', 'id' => 'agenda-listsections', 'class' => 'form-control custom-select')); - $select_sections->add('---', ''); - foreach (array('day' => 'libcalendaring.days', 'week' => 'libcalendaring.weeks', 'month' => 'libcalendaring.months', 'smart' => 'calendar.smartsections') as $val => $label) - $select_sections->add(preg_replace('/\(|\)/', '', ucfirst($this->rc->gettext($label))), $val); - - $html .= html::span('input-group', - html::label(array('for' => 'agenda-listsections', 'class' => 'input-group-prepend'), - html::span('input-group-text', $this->cal->gettext('listsections'))) - . $select_sections->show($this->rc->config->get('calendar_agenda_sections', $this->cal->defaults['calendar_agenda_sections'])) - ); - return html::div($attrib, $html); } @@ -537,6 +513,7 @@ } $input = new html_inputfield(array( + 'id' => 'importfile', 'type' => 'file', 'name' => '_data', 'size' => $attrib['uploadfieldsize'], @@ -557,7 +534,7 @@ $html = html::div('form-section form-group row', html::label(array('class' => 'col-sm-4 col-form-label', 'for' => 'importfile'), rcube::Q($this->rc->gettext('importfromfile'))) . html::div('col-sm-8', $input->show() - . html::div('hint', $this->rc->gettext(array('id' => 'importfile', 'name' => 'maxuploadsize', 'vars' => array('size' => $max_filesize))))) + . html::div('hint', $this->rc->gettext(array('name' => 'maxuploadsize', 'vars' => array('size' => $max_filesize))))) ); $html .= html::div('form-section form-group row',
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/calendar/lib/js/fullcalendar.js -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/calendar/lib/js/fullcalendar.js
Changed
@@ -1,6845 +1,15010 @@ /*! - * FullCalendar v1.6.4-rcube-1.1.3 - * Docs & License: http://arshaw.com/fullcalendar/ - * (c) 2013 Adam Shaw, 2014 Kolab Systems AG + * FullCalendar v3.9.0 + * Docs & License: https://fullcalendar.io/ + * (c) 2018 Adam Shaw */ - -/* - * Use fullcalendar.css for basic styling. - * For event drag & drop, requires jQuery UI draggable. - * For event resizing, requires jQuery UI resizable. - */ - -(function($, undefined) { - - -;; - -var defaults = { - - // display - defaultView: 'month', - aspectRatio: 1.35, - header: { - left: 'title', - center: '', - right: 'today prev,next' - }, - weekends: true, - weekNumbers: false, - weekNumberCalculation: 'iso', - weekNumberTitle: 'W', - currentTimeIndicator: false, - - // editing - //editable: false, - //disableDragging: false, - //disableResizing: false, - - allDayDefault: true, - ignoreTimezone: true, - - // event ajax - lazyFetching: true, - startParam: 'start', - endParam: 'end', - - // time formats - titleFormat: { - month: 'MMMM yyyy', - week: "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", - day: 'dddd, MMM d, yyyy', - list: 'MMM d, yyyy', - table: 'MMM d, yyyy' - }, - columnFormat: { - month: 'ddd', - week: 'ddd M/d', - day: 'dddd M/d', - list: 'dddd, MMM d, yyyy', - table: 'MMM d, yyyy' - }, - timeFormat: { // for event elements - '': 'h(:mm)t' // default - }, - - // locale - isRTL: false, - firstDay: 0, - monthNames: ['January','February','March','April','May','June','July','August','September','October','November','December'], - monthNamesShort: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'], - dayNames: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'], - dayNamesShort: ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'], - buttonText: { - prev: "<span class='fc-text-arrow'>‹</span>", - next: "<span class='fc-text-arrow'>›</span>", - prevYear: "<span class='fc-text-arrow'>«</span>", - nextYear: "<span class='fc-text-arrow'>»</span>", - today: 'today', - month: 'month', - week: 'week', - day: 'day', - list: 'list', - table: 'table' - }, - listTexts: { - until: 'until', - past: 'Past events', - today: 'Today', - tomorrow: 'Tomorrow', - thisWeek: 'This week', - nextWeek: 'Next week', - thisMonth: 'This month', - nextMonth: 'Next month', - future: 'Future events', - week: 'W' - }, - - // list/table options - listSections: 'month', // false|'day'|'week'|'month'|'smart' - listRange: 30, // number of days to be displayed - listPage: 7, // number of days to jump when paging - tableCols: ['handle', 'date', 'time', 'title'], - - // jquery-ui theming - theme: false, - buttonIcons: { - prev: 'circle-triangle-w', - next: 'circle-triangle-e' - }, - - //selectable: false, - unselectAuto: true, - - dropAccept: '*', - - handleWindowResize: true - -}; - -// right-to-left defaults -var rtlDefaults = { - header: { - left: 'next,prev today', - center: '', - right: 'title' - }, - buttonText: { - prev: "<span class='fc-text-arrow'>›</span>", - next: "<span class='fc-text-arrow'>‹</span>", - prevYear: "<span class='fc-text-arrow'>»</span>", - nextYear: "<span class='fc-text-arrow'>«</span>" - }, - buttonIcons: { - prev: 'circle-triangle-e', - next: 'circle-triangle-w' - } -}; - - - -;; - -var fc = $.fullCalendar = { version: "1.6.4-rcube-1.1.3" }; -var fcViews = fc.views = {}; - - -$.fn.fullCalendar = function(options) { - - - // method calling - if (typeof options == 'string') { - var args = Array.prototype.slice.call(arguments, 1); - var res; - this.each(function() { - var calendar = $.data(this, 'fullCalendar'); - if (calendar && $.isFunction(calendar[options])) { - var r = calendar[options].apply(calendar, args); - if (res === undefined) { - res = r; - } - if (options == 'destroy') { - $.removeData(this, 'fullCalendar'); - } - } - }); - if (res !== undefined) { - return res; - } - return this; - } - - options = options || {}; - - // would like to have this logic in EventManager, but needs to happen before options are recursively extended - var eventSources = options.eventSources || []; - delete options.eventSources; - if (options.events) { - eventSources.push(options.events); - delete options.events; - } - - - options = $.extend(true, {}, - defaults, - (options.isRTL || options.isRTL===undefined && defaults.isRTL) ? rtlDefaults : {}, - options - ); - - - this.each(function(i, _element) { - var element = $(_element); - var calendar = new Calendar(element, options, eventSources); - element.data('fullCalendar', calendar); // TODO: look into memory leak implications - calendar.render(); - }); -
View file
roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/calendar/lib/js/moment.js
Added
@@ -0,0 +1,4511 @@ +//! moment.js + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + global.moment = factory() +}(this, (function () { 'use strict'; + + var hookCallback; + + function hooks () { + return hookCallback.apply(null, arguments); + } + + // This is done to register the method called with moment() + // without creating circular dependencies. + function setHookCallback (callback) { + hookCallback = callback; + } + + function isArray(input) { + return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; + } + + function isObject(input) { + // IE8 will treat undefined and null as object if it wasn't for + // input != null + return input != null && Object.prototype.toString.call(input) === '[object Object]'; + } + + function isObjectEmpty(obj) { + if (Object.getOwnPropertyNames) { + return (Object.getOwnPropertyNames(obj).length === 0); + } else { + var k; + for (k in obj) { + if (obj.hasOwnProperty(k)) { + return false; + } + } + return true; + } + } + + function isUndefined(input) { + return input === void 0; + } + + function isNumber(input) { + return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; + } + + function isDate(input) { + return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function hasOwnProp(a, b) { + return Object.prototype.hasOwnProperty.call(a, b); + } + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function createUTC (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, true).utc(); + } + + function defaultParsingFlags() { + // We need to deep clone this object. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso : false, + parsedDateParts : [], + meridiem : null, + rfc2822 : false, + weekdayMismatch : false + }; + } + + function getParsingFlags(m) { + if (m._pf == null) { + m._pf = defaultParsingFlags(); + } + return m._pf; + } + + var some; + if (Array.prototype.some) { + some = Array.prototype.some; + } else { + some = function (fun) { + var t = Object(this); + var len = t.length >>> 0; + + for (var i = 0; i < len; i++) { + if (i in t && fun.call(this, t[i], i, t)) { + return true; + } + } + + return false; + }; + } + + function isValid(m) { + if (m._isValid == null) { + var flags = getParsingFlags(m); + var parsedParts = some.call(flags.parsedDateParts, function (i) { + return i != null; + }); + var isNowValid = !isNaN(m._d.getTime()) && + flags.overflow < 0 && + !flags.empty && + !flags.invalidMonth && + !flags.invalidWeekday && + !flags.weekdayMismatch && + !flags.nullInput && + !flags.invalidFormat && + !flags.userInvalidated && + (!flags.meridiem || (flags.meridiem && parsedParts)); + + if (m._strict) { + isNowValid = isNowValid && + flags.charsLeftOver === 0 && + flags.unusedTokens.length === 0 && + flags.bigHour === undefined; + } + + if (Object.isFrozen == null || !Object.isFrozen(m)) { + m._isValid = isNowValid; + } + else { + return isNowValid; + } + } + return m._isValid; + } + + function createInvalid (flags) { + var m = createUTC(NaN); + if (flags != null) { + extend(getParsingFlags(m), flags); + } + else { + getParsingFlags(m).userInvalidated = true; + } + + return m; + } + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + var momentProperties = hooks.momentProperties = []; + + function copyConfig(to, from) { + var i, prop, val; + + if (!isUndefined(from._isAMomentObject)) { + to._isAMomentObject = from._isAMomentObject; + } + if (!isUndefined(from._i)) { + to._i = from._i; + } + if (!isUndefined(from._f)) { + to._f = from._f; + } + if (!isUndefined(from._l)) { + to._l = from._l;
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/calendar/localization/en_US.inc -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/calendar/localization/en_US.inc
Changed
@@ -44,7 +44,8 @@ $labels['categories'] = 'Categories'; $labels['addcalendar'] = 'Add calendar'; $labels['createcalendar'] = 'Create new calendar'; -$labels['editcalendar'] = 'Edit calendar properties'; +$labels['editcalendar'] = 'Edit/Share calendar'; +$labels['deletecalendar'] = 'Delete calendar'; $labels['name'] = 'Name'; $labels['color'] = 'Color'; $labels['day'] = 'Day'; @@ -248,6 +249,7 @@ $labels['errorsaving'] = 'Failed to save changes.'; $labels['operationfailed'] = 'The requested operation failed.'; $labels['invalideventdates'] = 'Invalid dates entered! Please check your input.'; +$labels['emptyeventtitle'] = 'Event summary cannot be empty.'; $labels['invalidcalendarproperties'] = 'Invalid calendar properties! Please set a valid name.'; $labels['searchnoresults'] = 'No events found in the selected calendars.'; $labels['successremoval'] = 'The event has been deleted successfully.';
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/calendar/print.js -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/calendar/print.js
Changed
@@ -37,12 +37,13 @@ var rc_loading; var showdesc = true; + var desc_elements = []; 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) { + var id, src, event_sources = []; + var add_url = '&mode=print' + (rcmail.env.search ? '&q='+escape(rcmail.env.search) : ''); + for (id in rcmail.env.calendars) { if (!rcmail.env.calendars[id].active) continue; @@ -54,6 +55,9 @@ source.color = '#' + source.color.replace(/^#/, ''); + if (source.color.match(/^#f+$/i)) + source.color = '#ccc'; + event_sources.push(source); } @@ -66,72 +70,89 @@ header: { left: '', center: 'title', - right: 'agendaDay,agendaWeek,month,table' + right: 'agendaDay,agendaWeek,month,list' }, + theme: false, 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'] + selectable: false, + editable: false, + timezone: false, // will treat the given date strings as in local (browser's) timezone + monthNames: settings.months, + monthNamesShort: settings.months_short, + dayNames: settings.days, + dayNamesShort: settings.days_short, + weekNumbers: settings.show_weekno > 0, + weekNumberTitle: rcmail.gettext('weekshort', 'calendar') + ' ', + firstDay: settings.first_day, + firstHour: settings.first_hour, + slotDuration: {minutes: 60/settings.timeslots}, + businessHours: { + start: settings.work_start + ':00', + end: settings.work_end + ':00' }, - titleFormat: { - month: 'MMMM yyyy', - week: settings['dates_long'], - day: 'dddd ' + settings['date_long'], - list: settings['dates_long'], - table: settings['dates_long'] + views: { + list: { + titleFormat: settings.dates_long, + listDayFormat: settings.date_long, + visibleRange: function(currentDate) { + return { + start: currentDate.clone(), + end: currentDate.clone().add(settings.agenda_range, 'days') + } + } + }, + month: { + columnFormat: 'ddd', // Mon + titleFormat: 'MMMM YYYY', + eventLimit: 10 + }, + week: { + columnFormat: 'ddd ' + settings.date_short, // Mon 9/7 + titleFormat: settings.dates_long + }, + day: { + columnFormat: 'dddd ' + settings.date_short, // Monday 9/7 + titleFormat: 'dddd ' + settings.date_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'], + timeFormat: settings.time_format, + slotLabelFormat: settings.time_format, allDayText: rcmail.gettext('all-day', 'calendar'), + defaultDate: viewdate, + defaultView: rcmail.env.view, + eventSources: event_sources, buttonText: { + today: settings['today'], day: rcmail.gettext('day', 'calendar'), week: rcmail.gettext('week', 'calendar'), month: rcmail.gettext('month', 'calendar'), - table: rcmail.gettext('agenda', 'calendar') + list: rcmail.gettext('agenda', 'calendar') + }, + buttonIcons: { + prev: 'left-single-arrow', + next: 'right-single-arrow' }, - 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') + eventLimitText: function(num) { + return rcmail.gettext('andnmore', 'calendar').replace('$nr', num); }, 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 (view.name == 'list') { + var loc = $('<td>').attr('class', 'fc-event-location'); + if (event.location) + loc.text(event.location); + element.find('.fc-list-item-title').after(loc); + + // we can't add HTML elements after the curent element, + // so we store it for later. + if (event.description && showdesc) + desc_elements.push({element: element[0], description: event.description}); + } + else if (view.name != 'month') { + var cont = element.find('div.fc-title'); if (event.location) { cont.after('<div class="fc-event-location">@ ' + Q(event.location) + '</div>'); cont = cont.next(); @@ -139,47 +160,35 @@ 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>'); + }, + eventAfterAllRender: function(view) { + if (view.name == 'list') { + // Fix colspan of headers after we added Location column + fc.find('tr.fc-list-heading > td').attr('colspan', 4); + + $.each(desc_elements, function() { + $(this.element).after('<tr class="fc-event-row-secondary fc-list-item"><td colspan="2"></td><td colspan="2" class="fc-event-description">' + Q(this.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')
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/calendar/skins/elastic/templates/calendar.html -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/calendar/skins/elastic/templates/calendar.html
Changed
@@ -54,10 +54,10 @@ <div id="searchcontrols" class="search-controls"></div> </div> <div class="footer toolbar content-frame-navigation" role="toolbar" data-hidden="big"> - <a href="#" class="button prev" onclick="$('.fc-button-prev').click()"><span class="inner"><roundcube:label name="previous" /></span></a> - <a href="#" class="button today" onclick="$('.fc-button-today').click()"><span class="inner"><roundcube:label name="today" /></span></a> + <a href="#" class="button prev" onclick="$('.fc-prev-button').click()"><span class="inner"><roundcube:label name="previous" /></span></a> + <a href="#" class="button today" onclick="$('.fc-today-button').click()"><span class="inner"><roundcube:label name="today" /></span></a> <a href="#" class="button date" onclick="window.calendar_datepicker()"><span class="inner"><roundcube:label name="date" /></span></a> - <a href="#" class="button next" onclick="$('.fc-button-next').click()"><span class="inner"><roundcube:label name="next" /></span></a> + <a href="#" class="button next" onclick="$('.fc-next-button').click()"><span class="inner"><roundcube:label name="next" /></span></a> </div> </div> @@ -142,8 +142,8 @@ <h3 id="aria-label-calendaroptions" class="voice"><roundcube:label name="calendar.calendaractions" /></h3> <ul class="toolbarmenu listing" role="menu" aria-labelledby="aria-label-calendaroptions"> <roundcube:button type="link-menuitem" command="calendar-create" label="calendar.addcalendar" class="create disabled" classAct="create active" /> - <roundcube:button type="link-menuitem" command="calendar-edit" label="calendar.edit" class="edit disabled" classAct="edit active" /> - <roundcube:button type="link-menuitem" command="calendar-delete" label="delete" class="delete disabled" classAct="delete active" /> + <roundcube:button type="link-menuitem" command="calendar-edit" label="calendar.editcalendar" class="edit disabled" classAct="edit active" /> + <roundcube:button type="link-menuitem" command="calendar-delete" label="calendar.deletecalendar" class="delete disabled" classAct="delete active" /> <roundcube:if condition="env:calendar_driver == 'kolab'" /> <roundcube:button type="link-menuitem" command="calendar-remove" label="calendar.removelist" class="remove disabled" classAct="remove active" /> <roundcube:endif />
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/calendar/skins/elastic/templates/print.html -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/calendar/skins/elastic/templates/print.html
Changed
@@ -13,7 +13,7 @@ <div id="calendar" data-view-selector="calendar-view-selector"></div> </div> -<roundcube:object name="plugin.calendar_list" activeonly="true" id="calendarlist" class="hidden" /> -<roundcube:object name="plugin.calendar_css" printmode="true" /> +<roundcube:object name="plugin.calendar_list" activeonly="true" id="calendarlist" /> +<roundcube:object name="plugin.calendar_css" printmode="true" folder-class="div.$class a.calname" folder-fallback-color="#000" /> <roundcube:include file="includes/footer.html" />
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/calendar/skins/larry/calendar.css -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/calendar/skins/larry/calendar.css
Changed
@@ -1581,12 +1581,9 @@ bottom: -1px; } -#resource-freebusy-calendar .fc-content { - top: 0; -} - -#resource-freebusy-calendar .fc-content .fc-event-bg { - background: 0; +#resource-freebusy-calendar .fc-toolbar { + height: 0; + margin: 0; } #resource-freebusy-calendar .fc-event.status-busy, @@ -1615,8 +1612,7 @@ #resourcesearchbox { width: 100%; height: 26px; - -moz-box-sizing: border-box; - box-sizing: border-box; + box-sizing: border-box; } #resourcequicksearch .iconbutton.searchoptions { @@ -1633,33 +1629,22 @@ } - /* fullcalendar style overrides */ -.rcube-fc-content { - overflow: hidden; - border: 0; - border-radius: 4px; -} - -.calendarmain .fc-content { - position: absolute !important; - top: 40px; - left: 0; - right: 0; - bottom: 0; +.calendarmain .fc-body, +.fc-scroller { background: #fff; } -.calendarmain.quickview-active .fc-content { +.calendarmain.quickview-active .fc-view .fc-scroller { background-image: url('images/focusview.png'); background-position: center; background-repeat: no-repeat; } -#fish-eye-view .fc-content { - top: 2px; - bottom: 2px; +.fc-unthemed .fc-list-heading td { + background: rgba(0, 0, 0, .05); + padding: 8px; } #quickview-calendar { @@ -1676,9 +1661,9 @@ .calendarmain #calendar .fc-button, .calendarmain #calendar .fc-button.fc-state-default, .calendarmain #calendar .fc-button.fc-state-hover { - margin: -2px 0 0 0; - height: 24px; - line-height: 24px; + margin-top: -2px; + height: 26px; + line-height: 26px; color: #333; border: 1px solid #ababab; background: #f1f1f1; @@ -1704,15 +1689,12 @@ margin-right: 0; } -.calendarmain #calendar .fc-header-left .fc-button { - display: inline-block; - margin: 0; - text-align: center; +.calendarmain #calendar .fc-left .fc-button { font-size: 10px; color: #555; min-width: 50px; max-width: 75px; - height: 13px; + height: 40px; line-height: 1em; overflow: hidden; text-overflow: ellipsis; @@ -1723,89 +1705,91 @@ border: 0; background: url(images/toolbar.png) center 100px no-repeat; box-shadow: none; - -o-box-shadow: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; outline: none; + transition: none; } -.calendarmain #calendar .fc-header-left .fc-button:focus { +.calendarmain #calendar .fc-left .fc-button:focus { color: #fff; text-shadow: 0px 1px 1px #666; background-color: rgba(30,150,192, 0.5); border-radius: 3px; } -.calendarmain #calendar .fc-header-left .fc-button.fc-state-active { +.calendarmain #calendar .fc-left .fc-button::-moz-focus-inner { + border: 0; +} + +.calendarmain #calendar .fc-left .fc-button.fc-state-active { font-weight: bold; color: #222; text-shadow: none; background-color: transparent; } -.calendarmain #calendar .fc-header-left .fc-button-agendaDay { +.calendarmain #calendar .fc-left .fc-agendaDay-button { background-position: center -120px; } -.calendarmain #calendar .fc-header-left .fc-button-agendaDay.fc-state-active { +.calendarmain #calendar .fc-left .fc-agendaDay-button.fc-state-active { background-position: center -160px; } -.calendarmain #calendar .fc-header-left .fc-button-agendaWeek { +.calendarmain #calendar .fc-left .fc-agendaWeek-button { background-position: center -200px; } -.calendarmain #calendar .fc-header-left .fc-button-agendaWeek.fc-state-active { +.calendarmain #calendar .fc-left .fc-agendaWeek-button.fc-state-active { background-position: center -240px; } -.calendarmain #calendar .fc-header-left .fc-button-month { +.calendarmain #calendar .fc-left .fc-month-button { background-position: center -280px; } -.calendarmain #calendar .fc-header-left .fc-button-month.fc-state-active { +.calendarmain #calendar .fc-left .fc-month-button.fc-state-active { background-position: center -320px; } -.calendarmain #calendar .fc-header-left .fc-button-table { +.calendarmain #calendar .fc-left .fc-list-button { background-position: center -360px; } -.calendarmain #calendar .fc-header-left .fc-button-table.fc-state-active { +.calendarmain #calendar .fc-left .fc-list-button.fc-state-active { background-position: center -400px; } -.calendarmain #calendar .fc-header-right { - padding-right: 252px; +.calendarmain #calendar .fc-header-toolbar .fc-right { padding-top: 4px; } +.calendarmain #calendar .fc-header-toolbar .fc-center { + line-height: 2.5em; + overflow: hidden; + text-align: center; + display: block; +} + +.calendarmain #calendar .fc-header-toolbar .fc-center h2 { + float: none; +} + .calendarmain #calendar .fc-header-title { padding-top: 5px; } +.calendarmain #calendar .fc-toolbar.fc-header-toolbar { + margin-bottom: 7px; + margin-right: 250px; +} + .fc-event { font-size: 1em !important; } -.fc-event-hori.fc-type-freebusy, -.fc-event-vert.fc-type-freebusy {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/calendar/skins/larry/fullcalendar.css -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/calendar/skins/larry/fullcalendar.css
Changed
@@ -1,711 +1,1293 @@ /*! - * FullCalendar v1.6.4-rcube-1.0 Stylesheet - * Docs & License: http://arshaw.com/fullcalendar/ - * (c) 2013 Adam Shaw, 2014 Kolab Systems AG + * FullCalendar v3.9.0 + * Docs & License: https://fullcalendar.io/ + * (c) 2018 Adam Shaw */ - - .fc { - direction: ltr; - text-align: left; - } - -.fc table { - border-collapse: collapse; - border-spacing: 0; - } - -html .fc, -.fc table { - font-size: 1em; - } - -.fc td, -.fc th { - padding: 0; - vertical-align: top; - } - - - -/* Header -------------------------------------------------------------------------*/ - -.fc-header td { - white-space: nowrap; - } - -.fc-header-left { - width: 25%; - text-align: left; - } - -.fc-header-center { - text-align: center; - } - -.fc-header-right { - width: 25%; - text-align: right; - } - -.fc-header-title { - display: inline-block; - vertical-align: top; - } - -.fc-header-title h2 { - margin-top: 0; - white-space: nowrap; - } - -.fc .fc-header-space { - padding-left: 10px; - } - -.fc-header .fc-button { - margin-bottom: 1em; - vertical-align: top; - } - -/* buttons edges butting together */ - -.fc-header .fc-button { - margin-right: -1px; - } - -.fc-header .fc-corner-right, /* non-theme */ -.fc-header .ui-corner-right { /* theme */ - margin-right: 0; /* back to normal */ - } - -/* button layering (for border precedence) */ - -.fc-header .fc-state-hover, -.fc-header .ui-state-hover { - z-index: 2; - } - -.fc-header .fc-state-down { - z-index: 3; - } - -.fc-header .fc-state-active, -.fc-header .ui-state-active { - z-index: 4; - } - - - -/* Content -------------------------------------------------------------------------*/ - -.fc-content { - clear: both; - zoom: 1; /* for IE7, gives accurate coordinates for [un]freezeContentHeight */ - } - -.fc-view { - width: 100%; - overflow: hidden; - } - - - -/* Cell Styles -------------------------------------------------------------------------*/ - -.fc-widget-header, /* <th>, usually */ -.fc-widget-content { /* <td>, usually */ - border: 1px solid #ddd; - } - -.fc-state-highlight { /* <td> today cell */ /* TODO: add .fc-today to <th> */ - background: #fcf8e3; - } - -.fc-cell-overlay { /* semi-transparent rectangle while dragging */ - background: #bce8f1; - opacity: .3; - filter: alpha(opacity=30); /* for IE */ - } - - - -/* Buttons -------------------------------------------------------------------------*/ - -.fc-button { - position: relative; - display: inline-block; - padding: 0 .6em; - overflow: hidden; - height: 1.9em; - line-height: 1.9em; - white-space: nowrap; - cursor: pointer; - } - -.fc-state-default { /* non-theme */ - border: 1px solid; - } - -.fc-state-default.fc-corner-left { /* non-theme */ - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; - } - -.fc-state-default.fc-corner-right { /* non-theme */ - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; - } + direction: ltr; + text-align: left; } + +.fc-rtl { + text-align: right; } + +body .fc { + /* extra precedence to overcome jqui */ + font-size: 1em; } + +/* Colors +--------------------------------------------------------------------------------------------------*/ +.fc-highlight { + /* when user is selecting cells */ + background: #bce8f1; + opacity: .3; } + +.fc-bgevent { + /* default look for background events */ + background: #8fdf82; + opacity: .3; } + +.fc-nonbusiness { + /* default look for non-business-hours areas */ + /* will inherit .fc-bgevent's styles */ + background: #d7d7d7; } + +/* Buttons (styled <button> tags, normalized to work cross-browser) +--------------------------------------------------------------------------------------------------*/ +.fc button { + /* force height to include the border and padding */ + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + /* dimensions */
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/calendar/skins/larry/print.css -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/calendar/skins/larry/print.css
Changed
@@ -79,6 +79,11 @@ padding-bottom: 1em; } +#calendarlist li div a { + color: inherit; + text-decoration: none; +} + #calendarlist input, #calendarlist .handle { display: none; @@ -101,7 +106,7 @@ @media print { .noprint, - .fc-header-right span { + .fc-right { display: none; } @@ -116,33 +121,20 @@ overflow: visible; } -.fc-event-skin, -.fc-event-inner .fc-event-skin { +.fc-unthemed td.fc-day.fc-today { + background: transparent; +} + +a.fc-event, +a.fc-event:hover { color: black; background-color: #fff !important; } -.fc-event-title { +.fc-title { font-weight: bold; } -.fc-event-hori .fc-event-title { - font-weight: normal; - white-space: nowrap; -} - -.fc-event-hori .fc-event-time { - white-space: nowrap; - font-weight: normal !important; - font-size: 10px; - padding-right: 0.6em; -} - -.fc-grid .fc-event-time { - font-weight: normal !important; - padding-right: 0.3em; -} - .fc-event-cateories { font-style: italic; } @@ -155,6 +147,13 @@ height: 1.4em; } +.fc-axis, +.fc-week-number, +.fc-day-number, +.fc-view thead th.fc-widget-header { + color: #444; +} + .fc-widget-header, .fc-mon, .fc-tue, .fc-wed, .fc-thu, .fc-fri { background-color: #fff; @@ -164,66 +163,34 @@ border-color: #ccc; } -.fc-icon-alarms, -.fc-icon-recurring { - display: inline-block; - width: 11px; - height: 11px; - background: url('images/eventicons.gif') 0 0 no-repeat; - margin-left: 3px; - line-height: 10px; +.fc-list-table tr.fc-list-item td, +.fc-list-view { + border: 0 !important; } -.fc-icon-alarms { - background-position: 0 -13px; -} - -.fc-view-list, .fc-view-table { - border: 0; +.fc-list-table tr:first-child td { + border-top-width: 1px; } -.fc-view-list div.fc-list-header, -.fc-view-table td.fc-list-header { - padding: 0.3em; - background: #fff; - font-weight: bold; - font-size: 1.2em; - color: #333; - border-color: #333; - border-style: solid; - border-width: 1px 0; - filter: none; -} - -.fc-list-section .fc-event { - cursor: auto; +.fc-event-description { + font-size: 90%; } -.fc-view-table tr.fc-event td, -.fc-view-table tr.fc-event td.fc-event-handle { - border-color: #999; - padding-top: 0.5em; - padding-bottom: 0.5em; +col.fc-event-location { + width: 20%; } -.fc-view-table tr.fc-last td { +.fc-event-row-secondary td { border: 0; + padding-top: 0 !important; } -.fc-view-table tr.fc-event .fc-event-description { - padding-left: 2em; - padding-top: 0em; -} - -.fc-event-vert .fc-event-description { - font-size: 90%; - font-style: italic; +.fc-scroller { + overflow: visible !important; + height: auto !important; } - -.fc-view-month .fc-event-hori .fc-event-inner { - background: #fff !important; -} - -.fc-view-table col.fc-event-location { - width: 20%; +.fc-head .fc-row, +.fc-day-grid .fc-row { + margin-right: 0 !important; + border-right-width: 0 !important; }
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/html_converter/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/html_converter/composer.json
Changed
@@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_2fa/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_2fa/composer.json
Changed
@@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_activesync/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_activesync/composer.json
Changed
@@ -20,7 +20,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_addressbook/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_addressbook/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Kolab addressbook", "homepage": "https://git.kolab.org/diffusion/RPK/", "license": "AGPLv3", - "version": "3.4.2", + "version": "3.4.3", "authors": [ { "name": "Thomas Bruederli", @@ -20,7 +20,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_addressbook/skins/elastic/templates/search_addon.html -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_addressbook/skins/elastic/templates/search_addon.html
Changed
@@ -11,7 +11,7 @@ rcmail.addEventListener('init', function() { // Make checkboxes pretty rcmail.treelist.addEventListener('add-item', function(prop) { - UI.pretty_checkbox($(prop.li).find('input').addClass('flex-checkbox')); + UI.pretty_checkbox($(prop.li).find('input')); }); }); }
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_auth/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_auth/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Kolab authentication", "homepage": "https://git.kolab.org/diffusion/RPK/", "license": "AGPLv3", - "version": "3.4.0", + "version": "3.4.3", "authors": [ { "name": "Thomas Bruederli", @@ -20,7 +20,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_auth_proxy
Added
+(directory)
View file
roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_auth_proxy/LICENSE
Added
@@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the
View file
roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_auth_proxy/README
Added
@@ -0,0 +1,31 @@ +Proxy authentication for Kolab +------------------------------ + +This plugin adds ability for configured external app/user to impersonate +as another user in services based on Roundcube Framework. + +Currently it works with Kolab iRony only, with one limitation - external file storages +are not accessible. + +CONFIGURATION +------------- + +1. In iRony config set: + + $config['kolabdav_plugins'] = array('kolab_auth_proxy', 'kolab_auth'); + + Note: kolab_auth_proxy MUST be before kolab_auth. + +2. In plugin config set: + + $config['kolab_auth_proxy_user'] = 'proxy'; + $config['kolab_auth_proxy_pass'] = '12345'; + $config['kolab_auth_proxy_imap_user'] = 'cyrus-admin'; + $config['kolab_auth_proxy_imap_pass'] = 'password'; + +After this you should be able to use *DAV services using HTTP basic authentication +with login: proxy**username and password: 12345, where "username" is the login of +the user you want to impersonate as. + +Note that there are more options in config if you need working functionality +that involves accessing SMTP or LDAP.
View file
roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_auth_proxy/composer.json
Added
@@ -0,0 +1,25 @@ +{ + "name": "kolab/kolab_auth_proxy", + "type": "roundcube-plugin", + "description": "Proxy authentication for Kolab", + "homepage": "https://git.kolab.org/diffusion/RPK/", + "license": "AGPLv3", + "version": "3.4.2", + "authors": [ + { + "name": "Aleksander Machniak", + "email": "machniak@kolabsys.com", + "role": "Lead" + } + ], + "repositories": [ + { + "type": "composer", + "url": "https://plugins.roundcube.net" + } + ], + "require": { + "php": ">=5.3.0", + "roundcube/plugin-installer": ">=0.1.3" + } +}
View file
roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_auth_proxy/config.inc.php.dist
Added
@@ -0,0 +1,30 @@ +<?php + +// Proxy user login +// Note: that you should log using form of: <proxy_login>**<username> +$config['kolab_auth_proxy_user'] = ''; + +// Proxy user password +$config['kolab_auth_proxy_pass'] = ''; + +// IMAP (master) user +$config['kolab_auth_proxy_imap_user'] = 'cyrus-admin'; + +// IMAP (master) password +$config['kolab_auth_proxy_imap_pass'] = ''; + +// SMTP server host +// To override the SMTP port or connection method, provide a full URL like 'tls://somehost:587' +$config['kolab_auth_proxy_smtp_server'] = ''; + +// SMTP username +$config['kolab_auth_proxy_smtp_user'] = ''; + +// SMTP password +$config['kolab_auth_proxy_smtp_pass'] = ''; + +// LDAP user DN +$config['kolab_auth_proxy_ldap_user'] = 'uid=kolab-service,ou=Special Users,dc=example,dc=org'; + +// LDAP password +$config['kolab_auth_proxy_ldap_pass'] = '';
View file
roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_auth_proxy/kolab_auth_proxy.php
Added
@@ -0,0 +1,113 @@ +<?php + +/** + * Allow specific user to impersonate as any other user + * to services based on Roundcube Framework. + * + * @author Aleksander Machniak <machniak@kolabsys.com> + * + * Copyright (C) 2019, 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/>. + */ +class kolab_auth_proxy extends rcube_plugin +{ + /** + * Plugin initialization + */ + public function init() + { + // Only iRony for now + if (defined('KOLAB_DAV_VERSION')) { + $this->add_hook('authenticate', array($this, 'authenticate')); + } + } + + /** + * Authenticate hook handler + */ + public function authenticate($args) + { + $this->load_config(); + $this->rc = rcube::get_instance(); + + $proxy_user = $this->rc->config->get('kolab_auth_proxy_user'); + $proxy_pass = $this->rc->config->get('kolab_auth_proxy_pass'); + + // Login is in a form of: <proxy_user>**<username> + + if ($proxy_user && $args['pass'] === $proxy_pass + && strpos($args['user'], $proxy_user . '**') === 0 + && ($target = substr($args['user'], strlen($proxy_user . '**'))) + ) { + $args['user'] = $target; + $args['pass'] = '-dummy-'; // cannot be empty + + // Disable iRony's auth cache, otherwise 'authenticate' hook will not + // be executed on each request + $args['no-cache'] = true; + + $this->add_hook('storage_connect', array($this, 'storage_connect')); +// $this->add_hook('managesieve_connect', array($this, 'storage_connect')); + $this->add_hook('smtp_connect', array($this, 'smtp_connect')); + $this->add_hook('ldap_connected', array($this, 'ldap_connected')); + } + + return $args; + } + + /** + * Storage_connect/managesieve_connect hook handler + */ + public function storage_connect($args) + { + $imap_user = $this->rc->config->get('kolab_auth_proxy_imap_user'); + $imap_pass = $this->rc->config->get('kolab_auth_proxy_imap_pass'); + + $args['auth_cid'] = $imap_user; + $args['auth_pw'] = $imap_pass; + $args['auth_type'] = 'PLAIN'; + + return $args; + } + + /** + * Smtp_connect hook handler + */ + public function smtp_connect($args) + { + foreach (array('smtp_server', 'smtp_user', 'smtp_pass') as $prop) { + $args[$prop] = $this->rc->config->get("kolab_auth_proxy_$prop", $args[$prop]); + } + + return $args; + } + + /** + * ldap_connected hook handler + */ + public function ldap_connected($args) + { + $ldap_user = $this->rc->config->get('kolab_auth_proxy_ldap_user'); + $ldap_pass = $this->rc->config->get('kolab_auth_proxy_ldap_pass'); + + if ($ldap_user && $ldap_pass && $args['user_specific']) { + $args['bind_dn'] = $ldap_user; + $args['bind_pass'] = $ldap_pass; + $args['search_filter'] = null; + } + + return $args; + } +}
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_chat/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_chat/composer.json
Changed
@@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_config/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_config/composer.json
Changed
@@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_delegation/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_delegation/composer.json
Changed
@@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_files/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_files/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "User interface for Kolab File Manager (Chwala)", "homepage": "https://git.kolab.org/diffusion/RPK/", "license": "AGPLv3", - "version": "3.4.2", + "version": "3.4.3", "authors": [ { "name": "Aleksander Machniak", @@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_files/kolab_files.js -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_files/kolab_files.js
Changed
@@ -185,7 +185,7 @@ } else if (rcmail.env.action == 'open') { // initialize folders list (for dialogs) - file_api.folder_list(); + // file_api.folder_list(); // get ongoing sessions file_api.request('folder_info', {folder: file_api.file_path(rcmail.env.file), sessions: 1}, 'folder_info_response'); @@ -259,6 +259,11 @@ document_editor = new document_editor_api(editor_config); else document_editor = new manticore_api(editor_config); + + rcmail.addEventListener('responseafterreset', function(o) { + // update caps/mountpoints on reset + file_api.set_env({caps: rcmail.env.files_caps}); + }); }; // returns API authorization token @@ -911,7 +916,8 @@ params.close = function(e, ui) { var elem, stack = rcmail.dialog_stack; - content.appendTo(document.body).hide(); + content.appendTo(document.body); + content.hide(); // for Larry's dialogs $(this).parent().remove(); // remove dialog // focus previously focused element (guessed) @@ -927,10 +933,11 @@ rcmail.ksearch_blur(); }; - // display it as popup - var dialog = rcmail.show_popup_dialog('', params.title, params.buttons, params); + // This is required for Larry's dialogs + params.create = function() { content.show(); }; - content.appendTo(dialog).show().find('input[type!="hidden"]:not(:hidden):first').focus(); + // display it as popup + var dialog = rcmail.show_popup_dialog(content, params.title, params.buttons, params); if (onopen) onopen(content); @@ -1251,10 +1258,6 @@ } catch (e) {}; - // on edit page switch immediately to edit mode - if (rcmail.file_editor && rcmail.file_editor.editable && rcmail.env.action == 'edit') - rcmail.files_edit(); - rcmail.enable_command('files-edit', (rcmail.file_editor && rcmail.file_editor.editable) || rcmail.env.editor_type || (file_api.file_type_supported(rcmail.env.file_data.type, rcmail.env.files_caps) & 4)); @@ -1266,6 +1269,10 @@ rcmail.enable_command('image-scale', 'image-rotate', info && !!/^image\//.test(info.type)); rcmail.gui_objects.messagepartframe = frame; + // on edit page switch immediately to edit mode + if (rcmail.file_editor && rcmail.file_editor.editable && rcmail.env.action == 'edit') + rcmail.files_edit(); + // detect Print button and check if it can be accessed try { if ($('#fileframe').contents().find('#print').length) @@ -1858,9 +1865,14 @@ // create folder selector popup rcube_webmail.prototype.files_folder_selector = function(event, callback) { + if (this.folder_selector_reset) + this.destroy_entity_selector('folder-selector'); + + // The list is incomplete, reset needed before next use + this.folder_selector_reset = file_api.list_updates > 0; + this.entity_selector('folder-selector', callback, file_api.env.folders, function(folder, a, folder_fullname) { var n = folder.depth || 0, - id = folder.id, row = $('<li>'); if (folder.virtual || folder.readonly) @@ -2092,6 +2104,7 @@ this.requests = {}; this.uploads = []; this.workers = {}; + this.list_updates = 0; /* // Called on "session expired" session @@ -2155,28 +2168,39 @@ var root = folder.split(this.env.directory_separator)[0], caps = this.env.caps; - if (this.env.caps.MOUNTPOINTS && this.env.caps.MOUNTPOINTS[root]) + if (this.env.caps.MOUNTPOINTS[root]) caps = root != folder ? this.env.caps.MOUNTPOINTS[root] : {}; return !!caps.ACL; }; // folders list request - this.folder_list = function(params) + this.folder_list = function(params, update) { if (!params) params = {} params.permissions = 1; - params.req = this.set_busy(true, 'loading'); - this.request('folder_list', this.list_params = params, 'folder_list_response'); + if (params.level === undefined) + params.level = -1; + + if (update) { + this.list_updates++; + params.req = rcmail.display_message('', 'loading'); + } + else { + params.req = this.set_busy(true, 'loading'); + this.list_params = params; + } + + this.request('folder_list', params, update ? 'folder_list_update_response' : 'folder_list_response'); }; // folder list response handler - this.folder_list_response = function(response) + this.folder_list_response = function(response, params) { - rcmail.hide_message(this.list_params.req); + rcmail.hide_message(params.req); if (!this.response(response)) return; @@ -2197,12 +2221,14 @@ searchbox = $(search_selector, body); } + this.list_element = list; + if (elem.data('no-collections') == true) collections = []; this.env.folders = this.folder_list_parse(response.result && response.result.list ? response.result.list : response.result); - rcmail.enable_command('files-create', true); + rcmail.enable_command('files-create', response.result && response.result.list && response.result.list.length > 0); if (!elem.length) return; @@ -2288,8 +2314,10 @@ else if (this.env.collection) rcmail.folder_list.select('folder-collection-' + this.env.collection); else if (folder = this.env.init_folder) { - this.env.init_folder = null; - rcmail.folder_list.select(folder); + if (this.env.folders[folder]) { + this.env.init_folder = null; + rcmail.folder_list.select(folder); + } } else if (folder = this.env.init_collection) { this.env.init_collection = null; @@ -2298,12 +2326,19 @@ else if (first) rcmail.folder_list.select(first); - // add tree icons -// this.folder_list_tree(this.env.folders); - // handle authentication errors on external sources this.folder_list_auth_errors(response.result); + // Fetch 2 levels of folder hierarchy for all mount points that + // do not support fast folders list + if (rcmail.env.files_api_version > 4) { + var ref = this; + $.each(rcmail.env.files_caps.MOUNTPOINTS || [], function(k, v) { + if (!v.FAST_FOLDER_LIST) + ref.folder_list({level: 2, folder: k}, true); + }); + } + // Elastic: Set notree class on the folder list var callback = function() { list[list.find('.treetoggle').length > 0 ? 'removeClass' : 'addClass']('notree'); @@ -2313,6 +2348,34 @@ callback(); }; + // folder list response handler + this.folder_list_update_response = function(response, params) + { + rcmail.hide_message(params.req); + + this.list_updates--;
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_files/kolab_files.php -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_files/kolab_files.php
Changed
@@ -51,6 +51,7 @@ $this->register_action('open', array($this, 'actions')); $this->register_action('edit', array($this, 'actions')); $this->register_action('share', array($this, 'actions')); + $this->register_action('reset', array($this, 'actions')); $this->register_action('autocomplete', array($this, 'autocomplete')); // we use libkolab::http_request() from libkolab with its configuration
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_files/lib/kolab_files_engine.php -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_files/lib/kolab_files_engine.php
Changed
@@ -131,10 +131,7 @@ ), 'taskbar'); } - if ($_SESSION['kolab_files_caps']['MANTICORE'] || $_SESSION['kolab_files_caps']['WOPI']) { - $_SESSION['kolab_files_caps']['DOCEDIT'] = true; - $_SESSION['kolab_files_caps']['DOCTYPE'] = $_SESSION['kolab_files_caps']['MANTICORE'] ? 'manticore' : 'wopi'; - } + $caps = $this->capabilities(); $this->plugin->include_stylesheet($this->plugin->local_skin_path().'/style.css'); $this->plugin->include_script($this->url . '/js/files_api.js'); @@ -142,11 +139,11 @@ $this->rc->output->set_env('files_url', $this->url . '/api/'); $this->rc->output->set_env('files_token', $this->get_api_token()); - $this->rc->output->set_env('files_caps', $_SESSION['kolab_files_caps']); - $this->rc->output->set_env('files_api_version', $_SESSION['kolab_files_caps']['VERSION'] ?: 3); + $this->rc->output->set_env('files_caps', $caps); + $this->rc->output->set_env('files_api_version', $caps['VERSION'] ?: 3); $this->rc->output->set_env('files_user', $this->rc->get_user_name()); - if ($_SESSION['kolab_files_caps']['DOCEDIT']) { + if ($caps['DOCEDIT']) { $this->plugin->add_label('declinednotice', 'invitednotice', 'acceptedownernotice', 'declinedownernotice', 'requestednotice', 'acceptednotice', 'declinednotice', 'more', 'accept', 'decline', 'join', 'status', 'when', 'file', 'comment', @@ -350,11 +347,10 @@ 'name' => 'store_passwords', 'value' => '1', 'class' => 'pretty-checkbox', - 'id' => 'auth-pass-checkbox' . $attrib['suffix'], )); - return html::div('auth-options', $checkbox->show(). ' ' - . html::label('auth-pass-checkbox' . $attrib['suffix'], $this->plugin->gettext('storepasswords')) + return html::div('auth-options', + html::label(null, $checkbox->show() . ' ' . $this->plugin->gettext('storepasswords')) . html::p('description hint', $this->plugin->gettext('storepasswordsdesc')) ); } @@ -1031,6 +1027,46 @@ return $token; } + protected function capabilities() + { + if (empty($_SESSION['kolab_files_caps'])) { + $token = $this->get_api_token(); + + if (empty($_SESSION['kolab_files_caps'])) { + $request = $this->get_request(array('method' => 'capabilities'), $token); + + // send request to the API + try { + $response = $request->send(); + $status = $response->getStatus(); + $body = @json_decode($response->getBody(), true); + + if ($status == 200 && $body['status'] == 'OK') { + $_SESSION['kolab_files_caps'] = $body['result']; + } + else { + throw new Exception($body['reason'] ?: "Failed to get capabilities. Status: $status"); + } + } + catch (Exception $e) { + rcube::raise_error($e, true, false); + return array(); + } + } + } + + if ($_SESSION['kolab_files_caps']['MANTICORE'] || $_SESSION['kolab_files_caps']['WOPI']) { + $_SESSION['kolab_files_caps']['DOCEDIT'] = true; + $_SESSION['kolab_files_caps']['DOCTYPE'] = $_SESSION['kolab_files_caps']['MANTICORE'] ? 'manticore' : 'wopi'; + } + + if (!empty($_SESSION['kolab_files_caps']) && !isset($_SESSION['kolab_files_caps']['MOUNTPOINTS'])) { + $_SESSION['kolab_files_caps']['MOUNTPOINTS'] = array(); + } + + return $_SESSION['kolab_files_caps']; + } + /** * Initialize HTTP_Request object */ @@ -1131,17 +1167,30 @@ $this->rc->output->set_env('collection', rcube_utils::get_input_value('collection', rcube_utils::INPUT_GET)); } + $caps = $this->capabilities(); + $this->rc->output->add_label('uploadprogress', 'GB', 'MB', 'KB', 'B'); $this->rc->output->set_pagetitle($this->plugin->gettext('files')); $this->rc->output->set_env('file_mimetypes', $this->get_mimetypes()); - $this->rc->output->set_env('files_quota', $_SESSION['kolab_files_caps']['QUOTA']); - $this->rc->output->set_env('files_max_upload', $_SESSION['kolab_files_caps']['MAX_UPLOAD']); - $this->rc->output->set_env('files_progress_name', $_SESSION['kolab_files_caps']['PROGRESS_NAME']); - $this->rc->output->set_env('files_progress_time', $_SESSION['kolab_files_caps']['PROGRESS_TIME']); + $this->rc->output->set_env('files_quota', $caps['QUOTA']); + $this->rc->output->set_env('files_max_upload', $caps['MAX_UPLOAD']); + $this->rc->output->set_env('files_progress_name', $caps['PROGRESS_NAME']); + $this->rc->output->set_env('files_progress_time', $caps['PROGRESS_TIME']); $this->rc->output->send('kolab_files.files'); } /** + * Handler for resetting some session/cached information + */ + protected function action_reset() + { + $this->rc->session->remove('kolab_files_caps'); + if (($caps = $this->capabilities()) && !empty($caps)) { + $this->rc->output->set_env('files_caps', $caps); + } + } + + /** * Handler for preferences save action */ protected function action_prefs() @@ -1624,6 +1673,7 @@ $this->mimetypes = false; $token = $this->get_api_token(); + $caps = $this->capabilities(); $request = $this->get_request(array('method' => 'mimetypes'), $token); $response = $request->send(); $status = $response->getStatus(); @@ -1647,7 +1697,7 @@ 'text/plain' => 'txt', 'text/html' => 'html', ); - if (!empty($_SESSION['kolab_files_caps']['MANTICORE'])) { + if (!empty($caps['MANTICORE'])) { $mimetypes = array_merge(array('application/vnd.oasis.opendocument.text' => 'odt'), $mimetypes); }
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_files/skins/elastic/ui.js -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_files/skins/elastic/ui.js
Changed
@@ -78,9 +78,20 @@ }; -if (rcmail.env.action == 'open') { +if (rcmail.env.action == 'open' || rcmail.env.action == 'edit') { rcmail.addEventListener('enable-command', kolab_files_enable_command); + if (rcmail.env.action == 'open') { + $('#toolbar-menu a.button.save').parent().hide(); + } + else if (rcmail.env.action == 'edit') { + if (rcmail.env.editor_type == 'wopi' && rcmail.is_framed()) { + parent.$('.ui-dialog:visible .ui-dialog-buttonpane').addClass('hidden'); + } + + rcmail.gui_object('exportmenu', 'export-menu'); + } + // center and scale the image in preview frame if (rcmail.env.mimetype.startsWith('image/')) { $('#fileframe').on('load', function() { @@ -92,7 +103,7 @@ } // Elastic mobile preview uses an iframe in a dialog - if (rcmail.is_framed()) { + if ((rcmail.env.action == 'open' || rcmail.env.editor_type != 'wopi') && rcmail.is_framed()) { var edit_button = $('#filetoolbar a.button.edit'), save_button = $('#filetoolbar a.button.save'); @@ -111,9 +122,6 @@ ); } } -else if (rcmail.env.action == 'edit') { - rcmail.gui_object('exportmenu', 'export-menu'); -} else { rcmail.addEventListener('files-folder-select', function(p) { var is_sess = p.folder == 'folder-collection-sessions'; @@ -126,15 +134,6 @@ } $(document).ready(function() { - if (rcmail.env.action == 'open') { - $('#toolbar-menu a.button.save').parent().hide(); - } - else if (rcmail.env.action == 'edit') { - if (rcmail.is_framed()) { - parent.$('.ui-dialog:visible .ui-dialog-buttonpane').addClass('hidden'); - } - } - if ($('#dragfilemenu').length) { rcmail.gui_object('file_dragmenu', 'dragfilemenu'); }
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_folders/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_folders/composer.json
Changed
@@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_notes/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_notes/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Notes module for Roundcube connecting to a Kolab server for storage", "homepage": "https://git.kolab.org/diffusion/RPK/", "license": "AGPLv3", - "version": "3.4.0", + "version": "3.4.3", "authors": [ { "name": "Thomas Bruederli", @@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_notes/localization/en_US.inc -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_notes/localization/en_US.inc
Changed
@@ -27,7 +27,8 @@ $labels['sortby'] = 'Sort by'; $labels['newnotebook'] = 'Create a new notebook'; $labels['addnotebook'] = 'Add notebook'; -$labels['editlist'] = 'Edit Notebook'; +$labels['deletelist'] = 'Delete notebook'; +$labels['editlist'] = 'Edit/Share notebook'; $labels['listname'] = 'Name'; $labels['tabsharing'] = 'Sharing'; $labels['discard'] = 'Discard';
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_notes/notes.js -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_notes/notes.js
Changed
@@ -170,7 +170,7 @@ // Make Elastic checkboxes pretty if (window.UI && UI.pretty_checkbox) { notebookslist.addEventListener('add-item', function(prop) { - UI.pretty_checkbox($(prop.li).find('input').addClass('flex-checkbox')); + UI.pretty_checkbox($(prop.li).find('input')); }); }
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_notes/skins/elastic/templates/notes.html -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_notes/skins/elastic/templates/notes.html
Changed
@@ -119,8 +119,8 @@ <h3 id="aria-label-actionsmenu" class="voice"><roundcube:label name="kolab_notes.arialabelnotesoptionsmenu" /></h3> <ul class="toolbarmenu listing" role="menu" aria-labelledby="aria-label-actionsmenu"> <roundcube:button type="link-menuitem" command="list-create" label="kolab_notes.addnotebook" class="create disabled" classAct="create active" /> - <roundcube:button type="link-menuitem" command="list-edit" label="edit" class="edit disabled" classAct="edit active" /> - <roundcube:button type="link-menuitem" command="list-delete" label="delete" class="delete disabled" classAct="delete active" /> + <roundcube:button type="link-menuitem" command="list-edit" label="kolab_notes.editlist" class="edit disabled" classAct="edit active" /> + <roundcube:button type="link-menuitem" command="list-delete" label="kolab_notes.deletelist" class="delete disabled" classAct="delete active" /> <roundcube:button type="link-menuitem" command="list-remove" label="kolab_notes.removelist" class="remove disabled" classAct="remove active" /> <roundcube:button type="link-menuitem" command="folders" task="settings" label="managefolders" class="folders disabled" classAct="folders active" /> </ul>
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_shortcuts/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_shortcuts/composer.json
Changed
@@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_sso/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_sso/composer.json
Changed
@@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/kolab_tags/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/kolab_tags/composer.json
Changed
@@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/ldap_authentication/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/ldap_authentication/composer.json
Changed
@@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/libcalendaring/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/libcalendaring/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Library providing common functions for calendaring plugins", "homepage": "https://git.kolab.org/diffusion/RPK/", "license": "AGPLv3", - "version": "3.4.2", + "version": "3.4.3", "authors": [ { "name": "Thomas Bruederli", @@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/libcalendaring/libcalendaring.js -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/libcalendaring/libcalendaring.js
Changed
@@ -43,15 +43,19 @@ var me = this; var gmt_offset = (new Date().getTimezoneOffset() / -60) - (settings.timezone || 0) - (settings.dst || 0); var client_timezone = new Date().getTimezoneOffset(); + var color_map = {}; // general datepicker settings - var datepicker_settings = { - // translate from fullcalendar format to datepicker format - dateFormat: settings.date_format.replace(/M/g, 'm').replace(/mmmmm/, 'MM').replace(/mmm/, 'M').replace(/dddd/, 'DD').replace(/ddd/, 'D').replace(/yy/g, 'y'), + this.datepicker_settings = { + // translate from fullcalendar (MomentJS) format to datepicker format + dateFormat: settings.date_format.replace(/M/g, 'm').replace(/mmmm/, 'MM').replace(/mmm/, 'M') + .replace(/dddd/, 'DD').replace(/ddd/, 'D').replace(/DD/, 'dd') + .replace(/Y/g, 'y').replace(/yyyy/, 'yy'), firstDay : settings.first_day, dayNamesMin: settings.days_short, monthNames: settings.months, monthNamesShort: settings.months, + showWeek: settings.show_weekno >= 0, changeMonth: false, showOtherMonths: true, selectOtherMonths: true @@ -76,19 +80,27 @@ if (!event.end) event.end = event.start; - var fromto, duration = event.end.getTime() / 1000 - event.start.getTime() / 1000, + // Support Moment.js objects + var start = 'toDate' in event.start ? event.start.toDate() : event.start, + end = event.end && 'toDate' in event.end ? event.end.toDate() : event.end; + + var fromto, duration = end.getTime() / 1000 - start.getTime() / 1000, until = voice ? ' ' + rcmail.gettext('until','libcalendaring') + ' ' : ' — '; + if (event.allDay) { - fromto = this.format_datetime(event.start, 1, voice) - + (duration > 86400 || event.start.getDay() != event.end.getDay() ? until + this.format_datetime(event.end, 1, voice) : ''); + // fullcalendar end dates of all-day events are exclusive + end = new Date(end.getTime() - 1000*60*60*24*1); + duration = end.getTime() / 1000 - start.getTime() / 1000; + fromto = this.format_datetime(start, 1, voice) + + (duration > 86400 || start.getDay() != end.getDay() ? until + this.format_datetime(end, 1, voice) : ''); } - else if (duration < 86400 && event.start.getDay() == event.end.getDay()) { - fromto = this.format_datetime(event.start, 0, voice) - + (duration > 0 ? until + this.format_datetime(event.end, 2, voice) : ''); + else if (duration < 86400 && start.getDay() == end.getDay()) { + fromto = this.format_datetime(start, 0, voice) + + (duration > 0 ? until + this.format_datetime(end, 2, voice) : ''); } else { - fromto = this.format_datetime(event.start, 0, voice) - + (duration > 0 ? until + this.format_datetime(event.end, 0, voice) : ''); + fromto = this.format_datetime(start, 0, voice) + + (duration > 0 ? until + this.format_datetime(end, 0, voice) : ''); } return fromto; @@ -154,7 +166,7 @@ this.parse_datetime = function(time, date) { // we use the utility function from datepicker to parse dates - var date = date ? $.datepicker.parseDate(datepicker_settings.dateFormat, date, datepicker_settings) : new Date(); + var date = date ? $.datepicker.parseDate(this.datepicker_settings.dateFormat, date, this.datepicker_settings) : new Date(); var time_arr = time.replace(/\s*[ap][.m]*/i, '').replace(/0([0-9])/g, '$1').split(/[:.]/); if (!isNaN(time_arr[0])) { @@ -229,6 +241,12 @@ */ this.date2ISO8601 = function(date) { + if (!date) + return null; + + if ('toDate' in date) + return date.format('YYYY-MM-DD[T]HH:mm:ss'); // MomentJS + var zeropad = function(num) { return (num < 10 ? '0' : '') + num; }; return date.getFullYear() + '-' + zeropad(date.getMonth()+1) + '-' + zeropad(date.getDate()) @@ -242,7 +260,7 @@ { var res = ''; if (!mode || mode == 1) { - res += $.datepicker.formatDate(voice ? 'MM d yy' : datepicker_settings.dateFormat, date, datepicker_settings); + res += $.datepicker.formatDate(voice ? 'MM d yy' : this.datepicker_settings.dateFormat, date, this.datepicker_settings); } if (!mode) { res += voice ? ' ' + rcmail.gettext('at','libcalendaring') + ' ' : ' '; @@ -269,10 +287,8 @@ hh : function(d) { return zeroPad(d.getHours() % 12 || 12) }, H : function(d) { return d.getHours() }, HH : function(d) { return zeroPad(d.getHours()) }, - t : function(d) { return d.getHours() < 12 ? 'a' : 'p' }, - tt : function(d) { return d.getHours() < 12 ? 'am' : 'pm' }, - T : function(d) { return d.getHours() < 12 ? 'A' : 'P' }, - TT : function(d) { return d.getHours() < 12 ? 'AM' : 'PM' } + a : function(d) { return d.getHours() < 12 ? 'am' : 'pm' }, + A : function(d) { return d.getHours() < 12 ? 'AM' : 'PM' } }; var i, i2, c, formatter, res = '', @@ -299,8 +315,10 @@ */ this.date2unixtime = function(date) { - var dst_offset = (client_timezone - date.getTimezoneOffset()) * 60; // adjust DST offset - return Math.round(date.getTime()/1000 + gmt_offset * 3600 + dst_offset); + var dt = date && 'toDate' in date ? date.toDate() : date, + dst_offset = (client_timezone - dt.getTimezoneOffset()) * 60; // adjust DST offset + + return Math.round(dt.getTime()/1000 + gmt_offset * 3600 + dst_offset); } /** @@ -317,6 +335,33 @@ } /** + * Finds text color for specified background color + */ + this.text_color = function(color) + { + var res = '#222'; + + if (!color) { + return res; + } + + if (!color_map[color]) { + color_map[color] = '#fff'; + + if (/^#?([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})$/i.test(color)) { + // use information about brightness calculation found at + // http://javascriptrules.com/2009/08/05/css-color-brightness-contrast-using-javascript/ + brightness = (parseInt(RegExp.$1, 16) * 299 + parseInt(RegExp.$2, 16) * 587 + parseInt(RegExp.$3, 16) * 114) / 1000; + if (brightness > 125) { + color_map[color] = res; + } + } + } + + return color_map[color]; + } + + /** * Simple plaintext to HTML converter, makig URLs clickable */ this.text2html = function(str, maxlen, maxlines) @@ -396,7 +441,7 @@ parent.find('.edit-alarm-related')[val === '@' ? 'hide' : 'show'](); }); - $(prefix+' .edit-alarm-date').removeClass('hasDatepicker').removeAttr('id').datepicker(datepicker_settings); + $(prefix+' .edit-alarm-date').removeClass('hasDatepicker').removeAttr('id').datepicker(this.datepicker_settings); if (rcmail.env.action != 'print') this.init_time_autocomplete($(prefix+' .edit-alarm-time')[0], {}); @@ -847,9 +892,9 @@ return false; }); - $('#edit-recurrence-enddate').datepicker(datepicker_settings).click(function(){ $("#edit-recurrence-repeat-until").prop('checked', true) }); + $('#edit-recurrence-enddate').datepicker(this.datepicker_settings).click(function(){ $("#edit-recurrence-repeat-until").prop('checked', true) }); $('#edit-recurrence-repeat-times').change(function(e){ $('#edit-recurrence-repeat-count').prop('checked', true); }); - $('#edit-recurrence-rdate-input').datepicker(datepicker_settings); + $('#edit-recurrence-rdate-input').datepicker(this.datepicker_settings); }; /** @@ -857,7 +902,7 @@ */ this.set_recurrence_edit = function(rec) { - var recurrence = $('#edit-recurrence-frequency').val(rec.recurrence ? rec.recurrence.FREQ || (rec.recurrence.RDATE ? 'RDATE' : '') : '').change(), + var date, recurrence = $('#edit-recurrence-frequency').val(rec.recurrence ? rec.recurrence.FREQ || (rec.recurrence.RDATE ? 'RDATE' : '') : '').change(), interval = $('.recurrence-form select.edit-recurrence-interval').val(rec.recurrence ? rec.recurrence.INTERVAL || 1 : 1), rrtimes = $('#edit-recurrence-repeat-times').val(rec.recurrence ? rec.recurrence.COUNT || 1 : 1), rrenddate = $('#edit-recurrence-enddate').val(rec.recurrence && rec.recurrence.UNTIL ? this.format_datetime(this.parseISO8601(rec.recurrence.UNTIL), 1) : ''); @@ -887,13 +932,15 @@ $('input.edit-recurrence-'+section+'-mode').val(['BYDAY']); } else if (rec.start) { - $('#edit-recurrence-monthly-byday').val(weekdays[rec.start.getDay()]); + date = 'toDate' in rec.start ? rec.start.toDate() : rec.start; + $('#edit-recurrence-monthly-byday').val(weekdays[date.getDay()]); } if (rec.recurrence && rec.recurrence.BYMONTH) { $('input.edit-recurrence-yearly-bymonth').val(String(rec.recurrence.BYMONTH).split(',')); } else if (rec.start) { - $('input.edit-recurrence-yearly-bymonth').val([String(rec.start.getMonth()+1)]); + date = 'toDate' in rec.start ? rec.start.toDate() : rec.start; + $('input.edit-recurrence-yearly-bymonth').val([String(date.getMonth()+1)]); } if (rec.recurrence && rec.recurrence.RDATE) { $.each(rec.recurrence.RDATE, function(i,rdate){ @@ -1264,36 +1311,25 @@ /**
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/libcalendaring/libcalendaring.php -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/libcalendaring/libcalendaring.php
Changed
@@ -40,21 +40,21 @@ public $ical_message; public $defaults = array( - 'calendar_date_format' => "yyyy-MM-dd", - 'calendar_date_short' => "M-d", - 'calendar_date_long' => "MMM d yyyy", - 'calendar_date_agenda' => "ddd MM-dd", - 'calendar_time_format' => "HH:mm", + 'calendar_date_format' => "Y-m-d", + 'calendar_date_short' => "M-j", + 'calendar_date_long' => "F j Y", + 'calendar_date_agenda' => "l M-d", + 'calendar_time_format' => "H:m", 'calendar_first_day' => 1, 'calendar_first_hour' => 6, 'calendar_date_format_sets' => array( - 'yyyy-MM-dd' => array('MMM d yyyy', 'M-d', 'ddd MM-dd'), - 'dd-MM-yyyy' => array('d MMM yyyy', 'd-M', 'ddd dd-MM'), - 'yyyy/MM/dd' => array('MMM d yyyy', 'M/d', 'ddd MM/dd'), - 'MM/dd/yyyy' => array('MMM d yyyy', 'M/d', 'ddd MM/dd'), - 'dd/MM/yyyy' => array('d MMM yyyy', 'd/M', 'ddd dd/MM'), - 'dd.MM.yyyy' => array('dd. MMM yyyy', 'd.M', 'ddd dd.MM.'), - 'd.M.yyyy' => array('d. MMM yyyy', 'd.M', 'ddd d.MM.'), + 'Y-m-d' => array('d M Y', 'm-d', 'l m-d'), + 'd-m-Y' => array('d M Y', 'd-m', 'l d-m'), + 'Y/m/d' => array('M d Y', 'm/d', 'l m/d'), + 'm/d/Y' => array('M d Y', 'm/d', 'l m/d'), + 'd/m/Y' => array('d M Y', 'd/m', 'l d/m'), + 'd.m.Y' => array('d. M Y', 'd.m', 'l d.m.'), + 'd.m.Y' => array('d. M Y', 'd.m', 'l d.m.'), ), ); @@ -207,14 +207,14 @@ $this->date_format_defaults(); $settings = array(); - $keys = array('date_format', 'time_format', 'date_short', 'date_long'); + $keys = array('date_format', 'time_format', 'date_short', 'date_long', 'date_agenda'); foreach ($keys as $key) { $settings[$key] = (string)$this->rc->config->get('calendar_' . $key, $this->defaults['calendar_' . $key]); - $settings[$key] = str_replace('Y', 'y', $settings[$key]); + $settings[$key] = self::from_php_date_format($settings[$key]); } - $settings['dates_long'] = str_replace(' yyyy', '[ yyyy]', $settings['date_long']) . "{ '—' " . $settings['date_long'] . '}'; + $settings['dates_long'] = $settings['date_long']; $settings['first_day'] = (int)$this->rc->config->get('calendar_first_day', $this->defaults['calendar_first_day']); $settings['timezone'] = $this->timezone_offset; $settings['dst'] = $this->dst_active; @@ -265,8 +265,8 @@ if (isset($defaults['date_format'])) return; - $defaults['date_format'] = $this->rc->config->get('calendar_date_format', self::from_php_date_format($this->rc->config->get('date_format'))); - $defaults['time_format'] = $this->rc->config->get('calendar_time_format', self::from_php_date_format($this->rc->config->get('time_format'))); + $defaults['date_format'] = $this->rc->config->get('calendar_date_format', $this->rc->config->get('date_format')); + $defaults['time_format'] = $this->rc->config->get('calendar_time_format', $this->rc->config->get('time_format')); // override defaults if ($defaults['date_format']) @@ -1477,8 +1477,8 @@ 'M' => 'n', 'dddd' => 'l', 'ddd' => 'D', - 'dd' => 'd', - 'd' => 'j', + 'DD' => 'd', + 'D' => 'j', 'HH' => '**', 'hh' => '%%', 'H' => 'G', @@ -1497,20 +1497,20 @@ } /** - * Convert from PHP date() format to fullcalendar format string + * Convert from PHP date() format to fullcalendar (MomentJS) format string */ public static function from_php_date_format($from) { // "d.m.Y H:i:s" => "dd.MM.yyyy HH:mm:ss" return strtr($from, array( - 'y' => 'yy', - 'Y' => 'yyyy', + 'y' => 'YY', + 'Y' => 'YYYY', 'M' => 'MMM', 'F' => 'MMMM', 'm' => 'MM', 'n' => 'M', - 'j' => 'd', - 'd' => 'dd', + 'j' => 'D', + 'd' => 'DD', 'D' => 'ddd', 'l' => 'dddd', 'H' => 'HH', @@ -1519,9 +1519,7 @@ 'g' => 'h', 'i' => 'mm', 's' => 'ss', - 'A' => 'TT', - 'a' => 'tt', - 'c' => 'u', + 'c' => '', )); }
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/libkolab/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/libkolab/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Plugin to setup a basic environment for the interaction with a Kolab server.", "homepage": "https://git.kolab.org/diffusion/RPK/", "license": "AGPLv3", - "version": "3.4.2", + "version": "3.4.3", "authors": [ { "name": "Thomas Bruederli", @@ -20,7 +20,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/libkolab/lib/kolab_storage.php -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/libkolab/lib/kolab_storage.php
Changed
@@ -79,10 +79,10 @@ return true; $rcmail = rcube::get_instance(); - self::$config = $rcmail->config; + self::$config = $rcmail->config; self::$version = strval($rcmail->config->get('kolab_format_version', self::$version)); - self::$imap = $rcmail->get_storage(); - self::$ready = class_exists('kolabformat') && + self::$imap = $rcmail->get_storage(); + self::$ready = class_exists('kolabformat') && (self::$imap->get_capability('METADATA') || self::$imap->get_capability('ANNOTATEMORE') || self::$imap->get_capability('ANNOTATEMORE2')); if (self::$ready) { @@ -96,8 +96,7 @@ } else { rcube::raise_error(array( - 'code' => 900, 'type' => 'php', - 'message' => "IMAP server doesn't support METADATA or ANNOTATEMORE" + 'code' => 900, 'type' => 'php', 'message' => "IMAP error" ), true); }
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/libkolab/skins/elastic/images/eye.svg -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/libkolab/skins/elastic/images/eye.svg
Changed
@@ -1,1 +1,1 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="#f0f3f4" d="M569.354 231.631C512.969 135.949 407.81 72 288 72 168.14 72 63.004 135.994 6.646 231.631a47.999 47.999 0 0 0 0 48.739C63.031 376.051 168.19 440 288 440c119.86 0 224.996-63.994 281.354-159.631a47.997 47.997 0 0 0 0-48.738zM288 392c-75.162 0-136-60.827-136-136 0-75.162 60.826-136 136-136 75.162 0 136 60.826 136 136 0 75.162-60.826 136-136 136zm104-136c0 57.438-46.562 104-104 104s-104-46.562-104-104c0-17.708 4.431-34.379 12.236-48.973l-.001.032c0 23.651 19.173 42.823 42.824 42.823s42.824-19.173 42.824-42.823c0-23.651-19.173-42.824-42.824-42.824l-.032.001C253.621 156.431 270.292 152 288 152c57.438 0 104 46.562 104 104z"/></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="#f2f2f2" d="M569.354 231.631C512.969 135.949 407.81 72 288 72 168.14 72 63.004 135.994 6.646 231.631a47.999 47.999 0 0 0 0 48.739C63.031 376.051 168.19 440 288 440c119.86 0 224.996-63.994 281.354-159.631a47.997 47.997 0 0 0 0-48.738zM288 392c-75.162 0-136-60.827-136-136 0-75.162 60.826-136 136-136 75.162 0 136 60.826 136 136 0 75.162-60.826 136-136 136zm104-136c0 57.438-46.562 104-104 104s-104-46.562-104-104c0-17.708 4.431-34.379 12.236-48.973l-.001.032c0 23.651 19.173 42.823 42.824 42.823s42.824-19.173 42.824-42.823c0-23.651-19.173-42.824-42.824-42.824l-.032.001C253.621 156.431 270.292 152 288 152c57.438 0 104 46.562 104 104z"/></svg> \ No newline at end of file
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/libkolab/skins/elastic/include/calendar.less -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/libkolab/skins/elastic/include/calendar.less
Changed
@@ -204,645 +204,174 @@ } } -body.quickview-active .fc-content { - background: data-uri("image/svg+xml;charset=utf-8", "../images/eye.svg") center no-repeat; - background-size: 50%; -} - // Fullcalendar styles +@import "fullcalendar"; + @color-calendar-border: @color-layout-border; -@color-calendar-free-bg: fadeout(@color-black-shade-text, 97%); +@color-calendar-free-bg: fadeout(@color-black-shade-text, 80%); +@color-calendar-today: fadeout(@color-warning, 80%); +@color-event-default: #c00; .fc { - flex: auto !important; + body.quickview-active & .fc-scroller { + background: data-uri("image/svg+xml;charset=utf-8", "../images/eye.svg") center no-repeat; + background-size: 50%; + } - .fc-header { - tr { - background-color: @color-black-shade-bg; + .fc-header-toolbar { + display: flex; + background-color: @color-black-shade-bg; + margin: 0; + + & > * > * { + float: none; + margin: 0; } } - .fc-header-left { - width: 25%; + .fc-left { + order: 1; - span { + .fc-button-group { display: none; } - } - .fc-header-center { + .fc-center { + flex: 1; + order: 2; text-align: center; + padding: .25rem; h2 { margin: 0; color: @color-black-shade-text; white-space: nowrap; - } - } - - .fc-header-right { - width: 25%; - text-align: right; - - span { - display: none; - } - } - - .btn-group { - padding: .5rem; - } - - .fc-header-title { - h2 { font-size: 1.25rem; font-weight: bold; } } - .fc-view { - width: 100%; - overflow: hidden; - } - - // Cell Styles - - .fc-widget-header, // <th>, usually - .fc-widget-content { // <td>, usually - border: 1px solid @color-calendar-border; - } - - .fc-cell-overlay { // semi-transparent rectangle while dragging - background: #bce8f1; - opacity: .3; - } - - // Buttons - - .fc-button { - position: relative; - display: inline-block; - padding: 0 .6em; - overflow: hidden; - height: 1.9em; - line-height: 1.9em; - white-space: nowrap; - cursor: pointer; - } - - // Button states - // borrowed from twitter bootstrap (http://twitter.github.com/bootstrap/) - - .fc-state-highlight { // <td> today cell, TODO: add .fc-today to <th> - background: fadeout(@color-main, 92%); - } - -/* - .fc-state-default { - border: 1px solid; - background-color: #f4f4f4; - } - - .fc-state-hover, - .fc-state-down, - .fc-state-active, - .fc-state-disabled { - color: #333333; - background-color: #e6e6e6; - } - .fc-state-hover { - color: #333333; - text-decoration: none; - } - - .fc-state-down, - .fc-state-active { - background-color: #cccccc; - outline: 0; - } -*/ - .fc-state-disabled { - cursor: default; - opacity: 0.65; - } - - // Global Event Styles - - .fc-event-container { - & > * { - z-index: 8; - } - - & > .ui-draggable-dragging, - & > .ui-resizable-resizing { - z-index: 9; - } - } - - .fc-event { - border: 1px solid #3a87ad; // default BORDER color - background-color: #3a87ad; // default BACKGROUND color - color: #fff; // default TEXT color - font-size: .85em; - cursor: default; - - .fc-rtl & { - text-align: right; - } - } - - a.fc-event { - text-decoration: none; - } - - a.fc-event, - .fc-event-draggable { - cursor: pointer; - } - - .fc-event-inner { - width: 100%; - height: 100%; - overflow: hidden; - } - - .fc-event-time, - .fc-event-title { - padding: 0 1px; - } - - .ui-resizable-handle { - z-index: 99999; - } -
View file
roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/libkolab/skins/elastic/include/fullcalendar.less
Added
@@ -0,0 +1,1246 @@ +/* + * FullCalendar v3.9.0 + * Docs & License: https://fullcalendar.io/ + * (c) 2018 Adam Shaw + */ +.fc { + direction: ltr; + text-align: left; } + +.fc-rtl { + text-align: right; } + +body .fc { + /* extra precedence to overcome jqui */ + font-size: 1em; } + +/* Colors +--------------------------------------------------------------------------------------------------*/ +.fc-highlight { + /* when user is selecting cells */ + background: #bce8f1; + opacity: .3; } + +.fc-bgevent { + /* default look for background events */ + background: #8fdf82; + opacity: .3; } + +.fc-nonbusiness { + /* default look for non-business-hours areas */ + /* will inherit .fc-bgevent's styles */ + background: #d7d7d7; } + +/* Buttons (styled <button> tags, normalized to work cross-browser) +--------------------------------------------------------------------------------------------------*/ +.fc button { + /* force height to include the border and padding */ + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + /* dimensions */ + margin: 0; + height: 2.1em; + padding: 0 .6em; + /* text & cursor */ + font-size: 1em; + /* normalize */ + white-space: nowrap; + cursor: pointer; } + +/* Firefox has an annoying inner border */ +.fc button::-moz-focus-inner { + margin: 0; + padding: 0; } + +.fc-state-default { + /* non-theme */ + border: 1px solid; } + +.fc-state-default.fc-corner-left { + /* non-theme */ + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; } + +.fc-state-default.fc-corner-right { + /* non-theme */ + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; } + +/* icons in buttons */ +.fc button .fc-icon { + /* non-theme */ + position: relative; + top: -0.05em; + /* seems to be a good adjustment across browsers */ + margin: 0 .2em; + vertical-align: middle; } + +/* + button states + borrowed from twitter bootstrap (http://twitter.github.com/bootstrap/) +*/ +.fc-state-default { + background-color: #f5f5f5; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + color: #333; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); } + +.fc-state-hover, +.fc-state-down, +.fc-state-active, +.fc-state-disabled { + color: #333333; + background-color: #e6e6e6; } + +.fc-state-hover { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; } + +.fc-state-down, +.fc-state-active { + background-color: #cccccc; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); } + +.fc-state-disabled { + cursor: default; + background-image: none; + opacity: 0.65; + box-shadow: none; } + +/* Buttons Groups +--------------------------------------------------------------------------------------------------*/ +.fc-button-group { + display: inline-block; } + +/* +every button that is not first in a button group should scootch over one pixel and cover the +previous button's border... +*/ +.fc .fc-button-group > * { + /* extra precedence b/c buttons have margin set to zero */ + float: left; + margin: 0 0 0 -1px; } + +.fc .fc-button-group > :first-child { + /* same */ + margin-left: 0; } + +/* Popover +--------------------------------------------------------------------------------------------------*/ +.fc-popover { + position: absolute; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15); } + +.fc-popover .fc-header { + /* TODO: be more consistent with fc-head/fc-body */ + padding: 2px 4px; } + +.fc-popover .fc-header .fc-title { + margin: 0 2px; } + +.fc-popover .fc-header .fc-close { + cursor: pointer; } + +.fc-ltr .fc-popover .fc-header .fc-title, +.fc-rtl .fc-popover .fc-header .fc-close { + float: left; } + +.fc-rtl .fc-popover .fc-header .fc-title, +.fc-ltr .fc-popover .fc-header .fc-close { + float: right; } + +/* Misc Reusable Components +--------------------------------------------------------------------------------------------------*/ +.fc-divider { + border-style: solid; + border-width: 1px; } + +hr.fc-divider { + height: 0; + margin: 0; + padding: 0 0 2px; + /* height is unreliable across browsers, so use padding */ + border-width: 1px 0; } + +.fc-clear { + clear: both; } + +.fc-bg, +.fc-bgevent-skeleton, +.fc-highlight-skeleton, +.fc-helper-skeleton { + /* these element should always cling to top-left/right corners */ + position: absolute; + top: 0; + left: 0; + right: 0; } + +.fc-bg { + bottom: 0; + /* strech bg to bottom edge */ } + +.fc-bg table { + height: 100%; + /* strech bg to bottom edge */ }
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/libkolab/skins/elastic/include/kolab_files.less -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/libkolab/skins/elastic/include/kolab_files.less
Changed
@@ -88,7 +88,7 @@ a.subscription { cursor: pointer; // reset listing's link style - padding: 0; + padding: 0 !important; border-left: 0; width: auto;
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/libkolab/skins/elastic/include/libcalendaring.less -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/libkolab/skins/elastic/include/libcalendaring.less
Changed
@@ -265,10 +265,10 @@ } } + td.invite { - label:before { - line-height: 1.6; - height: 1.5em; + .custom-switch { + margin-top: .15rem; } } @@ -337,19 +337,7 @@ } select { - padding: 0 .5rem; - } - - } -} - -html.touch { - .edit-attendees-table { - td.invite { - label:before { - line-height: 1.2; - height: 1.2em; - } + padding-left: .5rem; } } }
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/libkolab/skins/elastic/include/tasklist.less -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/libkolab/skins/elastic/include/tasklist.less
Changed
@@ -217,18 +217,11 @@ } } - input + label, - input.complete { + .custom-switch { position: absolute; - right: .25rem; - bottom: 0; - top: auto; - padding: 0 .2em 0 0; - cursor: pointer; + top: 1.4rem; z-index: 1; - line-height: 1; - height: 1.5em; - font-size: 1.15em; + height: 2.3em; } .actions { @@ -255,7 +248,7 @@ span.flagged, input[type=checkbox], - .icon-checkbox + label { + .custom-switch { display: none; }
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/libkolab/skins/elastic/libkolab.less -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/libkolab/skins/elastic/libkolab.less
Changed
@@ -65,6 +65,10 @@ } } + .custom-switch { + position: relative; + } + &.folder .listname:before { &:extend(.font-icon-class); content: @fa-var-sticky-note; @@ -116,7 +120,7 @@ .subscribed { cursor: pointer; // reset listing's link style - padding: 0; + padding: 0 !important; border-left: 0; width: auto; @@ -193,18 +197,6 @@ } } - input.flex-checkbox { - position: relative !important; - margin: 0 0 0 .25em !important; - - & + label { - position: relative !important; - margin: 0 .3em 0 -1em !important; - right: 0 !important; - font-size: 1.15em; - } - } - li.droptarget > div { background-color: @color-list-droptarget-background; } @@ -381,13 +373,6 @@ label { order: 10; } - - .icon-checkbox + label { - order: unset; - min-width: 2em; - padding: 0; - line-height: 1; - } } button.btn.save.notify:before { @@ -416,6 +401,7 @@ } .prop { + line-height: 2; margin-left: .5rem; display: inline-block; vertical-align: middle; @@ -423,11 +409,6 @@ label { margin: 0; } - - label:before { - line-height: 1.25; - margin-right: .25rem; - } } @media print {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/logon_page/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/logon_page/composer.json
Changed
@@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/odfviewer/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/odfviewer/composer.json
Changed
@@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/pdfviewer/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/pdfviewer/composer.json
Changed
@@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/tasklist/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/tasklist/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Task management plugin", "homepage": "https://git.kolab.org/diffusion/RPK/", "license": "AGPLv3", - "version": "3.4.2", + "version": "3.4.3", "authors": [ { "name": "Thomas Bruederli", @@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/tasklist/localization/de_DE.inc -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/tasklist/localization/de_DE.inc
Changed
@@ -234,8 +234,8 @@ $labels['importerror'] = 'Fehler beim Importieren'; $labels['newerversionexists'] = 'Eine neuere Version dieser Aufgabe existiert bereits! Abbruch.'; $labels['nowritetasklistfound'] = 'Keine Aufgabenliste zum Speichern der Aufgabe gefunden'; -$labels['importedsuccessfully'] = 'Die Aufgabe wurde erfolgreich unter '$list' gespeichert'; -$labels['updatedsuccessfully'] = 'Die Aufgabe wurde erfolgreich in '$list' aktualisiert'; +$labels['importedsuccessfully'] = 'Die Aufgabe wurde erfolgreich unter \'$list\' gespeichert'; +$labels['updatedsuccessfully'] = 'Die Aufgabe wurde erfolgreich in \'$list\' aktualisiert'; $labels['attendeupdateesuccess'] = 'Teilnehmerstatus erfolgreich aktualisiert'; $labels['itipresponseerror'] = 'Senden der Antwort auf diese Aufgabenzuweisung fehlgeschlagen'; $labels['itipinvalidrequest'] = 'Diese Einladung ist nicht mehr gültig.';
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/tasklist/localization/en_US.inc -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/tasklist/localization/en_US.inc
Changed
@@ -93,7 +93,8 @@ $labels['tabattachments'] = 'Attachments'; $labels['tabsharing'] = 'Sharing'; -$labels['editlist'] = 'Edit list'; +$labels['editlist'] = 'Edit/Share list'; +$labels['deletelist'] = 'Delete list'; $labels['createlist'] = 'Add list'; $labels['listactions'] = 'List options...'; $labels['listname'] = 'Name';
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/tasklist/skins/elastic/templates/mainview.html -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/tasklist/skins/elastic/templates/mainview.html
Changed
@@ -255,8 +255,8 @@ <h3 id="aria-label-tasklistoptions" class="voice"><roundcube:label name="tasklist.listactions" /></h3> <ul class="toolbarmenu listing" role="menu" aria-labelledby="aria-label-tasklistoptions"> <roundcube:button type="link-menuitem" command="list-create" label="tasklist.createlist" class="create disabled" classAct="create active" /> - <roundcube:button type="link-menuitem" command="list-edit" label="edit" class="edit disabled" classAct="edit active" /> - <roundcube:button type="link-menuitem" command="list-delete" label="delete" class="delete disabled" classAct="delete active" /> + <roundcube:button type="link-menuitem" command="list-edit" label="tasklist.editlist" class="edit disabled" classAct="edit active" /> + <roundcube:button type="link-menuitem" command="list-delete" label="tasklist.deletelist" class="delete disabled" classAct="delete active" /> <roundcube:if condition="env:tasklist_driver == 'kolab'" /> <roundcube:button type="link-menuitem" command="list-remove" label="tasklist.removelist" class="remove disabled" classAct="remove active" /> <roundcube:endif />
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/tasklist/tasklist.js -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/tasklist/tasklist.js
Changed
@@ -87,19 +87,6 @@ var task_attendees = []; var attendees_list; var me = this; - - // general datepicker settings - var datepicker_settings = { - // translate from PHP format to datepicker format - dateFormat: settings.date_format.replace(/M/g, 'm').replace(/mmmmm/, 'MM').replace(/mmm/, 'M').replace(/dddd/, 'DD').replace(/ddd/, 'D').replace(/yy/g, 'y'), - firstDay : settings.first_day, -// dayNamesMin: settings.days_short, -// monthNames: settings.months, -// monthNamesShort: settings.months, - changeMonth: false, - showOtherMonths: true, - selectOtherMonths: true - }; var extended_datepicker_settings; /* public members */ @@ -127,10 +114,6 @@ /* imports */ var Q = this.quote_html; var text2html = this.text2html; - var event_date_text = this.event_date_text; - var parse_datetime = this.parse_datetime; - var date2unixtime = this.date2unixtime; - var fromunixtime = this.fromunixtime; var render_message_links = this.render_message_links; /** @@ -236,10 +219,10 @@ // Make Elastic checkboxes pretty if (window.UI && UI.pretty_checkbox) { $(rcmail.gui_objects.tasklistslist).find('input[type=checkbox]').each(function() { - UI.pretty_checkbox($(this).addClass('flex-checkbox')); + UI.pretty_checkbox(this); }); tasklists_widget.addEventListener('add-item', function(prop) { - UI.pretty_checkbox($(prop.li).find('input').addClass('flex-checkbox')); + UI.pretty_checkbox($(prop.li).find('input')); }); } @@ -377,16 +360,19 @@ }).find('input[type=text]').placeholder(rcmail.gettext('createnewtask','tasklist')); // click-handler on task list items (delegate) - $(rcmail.gui_objects.resultlist).on('click', function(e){ - var item = $(e.target); - var className = e.target.className; + $(rcmail.gui_objects.resultlist).on('click', function(e) { + var item = $(e.target), className = e.target.className; if (item.hasClass('childtoggle')) { item = item.parent().find('.taskhead'); className = 'childtoggle'; } - else if (!item.hasClass('taskhead')) - item = item.closest('div.taskhead'); + else { + if (!item.hasClass('taskhead')) + item = item.closest('div.taskhead'); + + className = String(className).split(' ')[0]; + } // ignore if (!item.length) @@ -639,7 +625,7 @@ }); }, 1); } - }, datepicker_settings); + }, me.datepicker_settings); rcmail.addEventListener('kolab-tags-search', filter_tasks) .addEventListener('kolab-tags-drop-data', function(e) { return listdata[e.id]; }) @@ -743,7 +729,7 @@ me.init_alarms_edit('#taskedit-alarms'); me.init_recurrence_edit('#eventedit'); - $('#taskedit-date, #taskedit-startdate').datepicker(datepicker_settings); + $('#taskedit-date, #taskedit-startdate').datepicker(me.datepicker_settings); $('a.edit-nodate').click(function(){ var sel = $(this).attr('rel'); @@ -876,6 +862,16 @@ loadstate.lists = active_lists(); } + var init_cloned_form = function(form) { + // update element IDs after clone + $('select,input,label', form).each(function() { + if (this.htmlFor) + this.htmlFor += '-clone'; + else if (this.id) + this.id += '-clone'; + }); + } + // open a dialog to upload an .ics file with tasks to be imported this.import_tasks = function(tasklist) { @@ -890,6 +886,8 @@ if (tasklist) $('#task-import-list').val(tasklist); + init_cloned_form(form); + buttons[rcmail.gettext('import', 'tasklist')] = function() { if (form && form.elements._data.value) { rcmail.async_upload_form(form, 'import', function(e) { @@ -953,22 +951,22 @@ this.export_tasks = function() { // close show dialog first - var $dialog = $("#tasksexport").clone(true).removeClass('uidialog'), + var list, $dialog = $("#tasksexport").clone(true).removeClass('uidialog'), form = $dialog.find('form').get(0), buttons = {}; if ($dialog.is(':ui-dialog')) $dialog.dialog('close'); - $("#task-export-list").val(''); + list = $("#task-export-list").val(''); + + init_cloned_form(form); buttons[rcmail.gettext('export', 'tasklist')] = function() { - var data = {}, - source = $('#task-export-list').val(), - form_elements = $('select, input', form); + var data = {}, form_elements = $('select, input', form); // "current view" export, use hidden form to POST task IDs - if (source === '') { + if (list.val() === '') { var cache = {}, tasks = [], inputs = [], postform = $('#tasks-export-form-post'); @@ -2594,8 +2592,8 @@ return false; } else if (data.startdate && data.date) { - var startdate = $.datepicker.parseDate(datepicker_settings.dateFormat, data.startdate, datepicker_settings); - var duedate = $.datepicker.parseDate(datepicker_settings.dateFormat, data.date, datepicker_settings); + var startdate = $.datepicker.parseDate(me.datepicker_settings.dateFormat, data.startdate, me.datepicker_settings); + var duedate = $.datepicker.parseDate(me.datepicker_settings.dateFormat, data.date, me.datepicker_settings); if (startdate > duedate) { rcmail.alert_dialog(rcmail.gettext('invalidstartduedates', 'tasklist')); return false;
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/tasklist/tasklist_ui.php -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/tasklist/tasklist_ui.php
Changed
@@ -500,6 +500,7 @@ } $input = new html_inputfield(array( + 'id' => 'importfile', 'type' => 'file', 'name' => '_data', 'size' => $attrib['uploadfieldsize'], @@ -509,7 +510,7 @@ $html = html::div('form-section form-group row', html::label(array('class' => 'col-sm-4 col-form-label', 'for' => 'importfile'), rcube::Q($this->rc->gettext('importfromfile'))) . html::div('col-sm-8', $input->show() - . html::div('hint', $this->rc->gettext(array('id' => 'importfile', 'name' => 'maxuploadsize', 'vars' => array('size' => $max_filesize))))) + . html::div('hint', $this->rc->gettext(array('name' => 'maxuploadsize', 'vars' => array('size' => $max_filesize))))) ); $html .= html::div('form-section form-group row', @@ -550,7 +551,7 @@ ); $checkbox = new html_checkbox(array('name' => 'attachments', 'id' => 'task-export-attachments', 'value' => 1, 'class' => 'form-check-input pretty-checkbox')); - $html .= html::div('form-section form-group row form-check', + $html .= html::div('form-section row form-check', html::label(array('for' => 'task-export-attachments', 'class' => 'col-sm-4 col-form-label'), $this->plugin->gettext('exportattachments')) . html::div('col-sm-8', $checkbox->show(1)) );
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/tinymce_config/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/tinymce_config/composer.json
Changed
@@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab-3.4.2.tar.gz/plugins/wap_client/composer.json -> roundcubemail-plugins-kolab-3.4.3.tar.gz/plugins/wap_client/composer.json
Changed
@@ -15,7 +15,7 @@ "repositories": [ { "type": "composer", - "url": "http://plugins.roundcube.net" + "url": "https://plugins.roundcube.net" } ], "require": {
View file
roundcubemail-plugins-kolab.dsc
Changed
@@ -2,7 +2,7 @@ Source: roundcubemail-plugins-kolab Binary: roundcubemail-plugins-kolab Architecture: all -Version: 1:3.4.2-0~kolab2 +Version: 1:3.4.3-0~kolab1 Maintainer: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com> Uploaders: Paul Klos <kolab@klos2day.nl> Standards-Version: 3.9.3 @@ -35,5 +35,5 @@ roundcubemail-plugin-tinymce-config deb web extra roundcubemail-plugin-wap-client deb web extra Files: - 00000000000000000000000000000000 0 roundcubemail-plugins-kolab-3.4.2.tar.gz + 00000000000000000000000000000000 0 roundcubemail-plugins-kolab-3.4.3.tar.gz 00000000000000000000000000000000 0 debian.tar.gz
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.