From d865ec5cbef01eb067459a35396953e36d935e23 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 22 Dec 2016 11:07:47 +0100 Subject: [PATCH] Retain selected folder on page refresh (Bifrost#T18463) Use window.history.replaceState on folder selection, the same way is in Roundcube core. Conflicts: plugins/kolab_files/kolab_files.js plugins/kolab_files/lib/kolab_files_engine.php --- plugins/calendar/calendar_ui.js | 10 +++++++++- plugins/calendar/lib/calendar_ui.php | 1 + plugins/kolab_files/kolab_files.js | 6 ++++++ plugins/kolab_files/lib/kolab_files_engine.php | 5 +++++ plugins/tasklist/tasklist.js | 8 ++++++-- plugins/tasklist/tasklist_ui.php | 1 + 6 files changed, 28 insertions(+), 3 deletions(-) diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index 76ef0284..b766c809 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -732,6 +732,10 @@ function rcube_calendar_ui(settings) var invite = $('#edit-attendees-invite').get(0); var comment = $('#edit-attendees-comment'); + // make sure any calendar is selected + if (!calendars.val()) + calendars.val($('option:first', calendars).attr('value')); + invite.checked = settings.itip_notify & 1 > 0; notify.checked = has_attendees(event) && invite.checked; @@ -3517,6 +3521,8 @@ function rcube_calendar_ui(settings) rcmail.triggerEvent('selectfolder', { folder:id, prefix:'rcmlical' }); this.selected_calendar = id; + + rcmail.update_state({source: id}); }; // register the given calendar to the current view @@ -3723,7 +3729,9 @@ function rcube_calendar_ui(settings) }); // select default calendar - if (settings.default_calendar && this.calendars[settings.default_calendar] && this.calendars[settings.default_calendar].editable) + if (rcmail.env.source && this.calendars[rcmail.env.source]) + this.selected_calendar = rcmail.env.source; + else if (settings.default_calendar && this.calendars[settings.default_calendar] && this.calendars[settings.default_calendar].editable) this.selected_calendar = settings.default_calendar; if (this.selected_calendar) diff --git a/plugins/calendar/lib/calendar_ui.php b/plugins/calendar/lib/calendar_ui.php index 49594a79..1933a641 100644 --- a/plugins/calendar/lib/calendar_ui.php +++ b/plugins/calendar/lib/calendar_ui.php @@ -235,6 +235,7 @@ class calendar_ui ); } + $this->rc->output->set_env('source', rcube_utils::get_input_value('source', rcube_utils::INPUT_GET)); $this->rc->output->set_env('calendars', $jsenv); $this->rc->output->add_gui_object('calendarslist', $attrib['id']); diff --git a/plugins/kolab_files/kolab_files.js b/plugins/kolab_files/kolab_files.js index 81a618f8..a13abc48 100644 --- a/plugins/kolab_files/kolab_files.js +++ b/plugins/kolab_files/kolab_files.js @@ -118,6 +118,8 @@ window.rcmail && window.files_api && rcmail.addEventListener('init', function() rcmail.enable_command('files-get', 'files-delete', rcmail.env.file); } else { + file_api.env.folder = rcmail.env.folder; + file_api.env.collection = rcmail.env.collection; file_api.folder_list(); file_api.browser_capabilities_check(); rcmail.enable_command('folder-mount', rcmail.env.external_sources); @@ -1227,6 +1229,8 @@ function kolab_files_ui() rcmail.enable_command('files-folder-delete', 'folder-rename', 'files-upload', false); this.env.folder = null; rcmail.command('files-list', {collection: folder}); + if (rcmail.task == 'files' && !rcmail.env.action) + rcmail.update_state({collection: collection}); } else { var found = $('#' + this.env.folders[folder].id, list).addClass('selected'); @@ -1235,6 +1239,8 @@ function kolab_files_ui() this.env.folder = folder; this.env.collection = null; rcmail.command('files-list', {folder: folder}); + if (rcmail.task == 'files' && !rcmail.env.action) + rcmail.update_state({folder: folder}); } this.quota(); diff --git a/plugins/kolab_files/lib/kolab_files_engine.php b/plugins/kolab_files/lib/kolab_files_engine.php index f2a28d31..9fbd0285 100644 --- a/plugins/kolab_files/lib/kolab_files_engine.php +++ b/plugins/kolab_files/lib/kolab_files_engine.php @@ -771,6 +771,11 @@ class kolab_files_engine 'fileskip', 'fileskipall', 'fileoverwrite', 'fileoverwriteall' ); + if ($this->rc->task == 'files') { + $this->rc->output->set_env('folder', rcube_utils::get_input_value('folder', rcube_utils::INPUT_GET)); + $this->rc->output->set_env('collection', rcube_utils::get_input_value('collection', rcube_utils::INPUT_GET)); + } + $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()); diff --git a/plugins/tasklist/tasklist.js b/plugins/tasklist/tasklist.js index 5997e21c..abfd5933 100644 --- a/plugins/tasklist/tasklist.js +++ b/plugins/tasklist/tasklist.js @@ -156,6 +156,9 @@ function rcube_tasklist_ui(settings) } } + if (rcmail.env.source && me.tasklists[rcmail.env.source]) + me.selected_list = rcmail.env.source; + // initialize treelist widget that controls the tasklists list var widget_class = window.kolab_folderlist || rcube_treelist_widget; tasklists_widget = new widget_class(rcmail.gui_objects.tasklistslist, { @@ -176,6 +179,7 @@ function rcube_tasklist_ui(settings) rcmail.enable_command('list-remove', me.tasklists[node.id] && me.tasklists[node.id].removable); rcmail.enable_command('list-showurl', me.tasklists[node.id] && !!me.tasklists[node.id].caldavurl); me.selected_list = node.id; + rcmail.update_state({source: node.id}); }); tasklists_widget.addEventListener('subscribe', function(p) { var list; @@ -2936,7 +2940,7 @@ function rcube_tasklist_ui(settings) } } - return $.unqiqueStrings(itags); + return $.uniqueStrings(itags); } /** @@ -3412,7 +3416,7 @@ jQuery.fn.sortElements = (function(){ })(); // equivalent to $.unique() but working on arrays of strings -jQuery.unqiqueStrings = (function() { +jQuery.uniqueStrings = (function() { return function(arr) { var hash = {}, out = []; diff --git a/plugins/tasklist/tasklist_ui.php b/plugins/tasklist/tasklist_ui.php index 3e17db5d..c2ff8b1e 100644 --- a/plugins/tasklist/tasklist_ui.php +++ b/plugins/tasklist/tasklist_ui.php @@ -202,6 +202,7 @@ class tasklist_ui } } + $this->rc->output->set_env('source', rcube_utils::get_input_value('source', rcube_utils::INPUT_GET)); $this->rc->output->set_env('tasklists', $jsenv); $this->register_gui_object('tasklistslist', $attrib['id']);