From d07b4c2e8ccaf7acc0ddd5be14da12216bf6d538 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 6 Oct 2015 12:04:44 +0200 Subject: [PATCH] Implement folders searching and subscriptions support (T163) --- plugins/kolab_files/kolab_files.js | 308 +++++++++++++++++- .../kolab_files/lib/kolab_files_engine.php | 26 +- plugins/kolab_files/localization/en_US.inc | 2 + .../skins/larry/images/listicons.png | Bin 0 -> 2582 bytes 4 files changed, 329 insertions(+), 7 deletions(-) create mode 100644 plugins/kolab_files/skins/larry/images/listicons.png diff --git a/plugins/kolab_files/kolab_files.js b/plugins/kolab_files/kolab_files.js index 3044d6e8..1759ee47 100644 --- a/plugins/kolab_files/kolab_files.js +++ b/plugins/kolab_files/kolab_files.js @@ -141,6 +141,7 @@ function kolab_files_init() sort_reverse: false, search_threads: rcmail.env.search_threads, resources_dir: rcmail.assets_path('program/resources'), + caps: rcmail.env.files_caps, supported_mimetypes: rcmail.env.file_mimetypes }); @@ -1188,7 +1189,7 @@ function kolab_files_ui() searchbox = $('#foldersearch', body); } - elem.html('').append(list); + elem.html(''); this.env.folders = this.folder_list_parse(response.result && response.result.list ? response.result.list : response.result); @@ -1211,7 +1212,15 @@ function kolab_files_ui() rows.push(row); }); - list.append(rows); + list.append(rows).appendTo(elem) + .on('click', 'a.subscription', function(e) { + return file_api.folder_list_subscription_button_click(this); + }); + + if (rcmail.folder_list) { + rcmail.folder_list.reset(); + this.search_results_widget = null; + } // init treelist widget rcmail.folder_list = new rcube_treelist_widget(list, { @@ -1232,7 +1241,12 @@ function kolab_files_ui() .addEventListener('collapse', function(node) { file_api.folder_collapsed(node); }) .addEventListener('expand', function(node) { file_api.folder_collapsed(node); }) .addEventListener('beforeselect', function(node) { return !rcmail.busy; }) - .addEventListener('select', function(node) { file_api.folder_select(node.id); }); + .addEventListener('search', function(search) { file_api.folder_search(search); }) + .addEventListener('select', function(node) { + if (file_api.search_results_widget) + file_api.search_results_widget.select(); + file_api.folder_select(node.id); + }); // select first folder? if (response.result.auth_errors) { } @@ -1312,10 +1326,12 @@ function kolab_files_ui() row = $('
  • '), id = 'rcmli' + rcmail.html_identifier_encode(i); - row.attr('id', id).append($('').text(folder.name)); + row.attr('id', id).append($('').text(folder.name)); if (folder.virtual) row.addClass('virtual'); + else if (folder.subscribed !== undefined) + row.append(this.folder_list_subscription_button(folder.subscribed)); folder.ref = row; @@ -1346,6 +1362,290 @@ function kolab_files_ui() } }; + // create subscription button element + this.folder_list_subscription_button = function(subscribed) + { + return $('').attr({ + title: rcmail.gettext('kolab_files.listpermanent'), + class: 'subscription' + (subscribed ? ' subscribed' : ''), + 'aria-checked': subscribed, + role: 'checkbox' + }); + }; + + // subscription button handler + this.folder_list_subscription_button_click = function(elem) + { + var folder = $(elem).parent('li').prop('id').replace(/^rcmli/, ''), + selected = $(elem).hasClass('subscribed'); + + folder = folder.replace(/--xsR$/, ''); // this might be a search result + folder = rcmail.html_identifier_decode(folder); + file_api['folder_' + (selected ? 'unsubscribe' : 'subscribe')](folder); + return false; + }; + + // sets subscription button status + this.folder_list_subscription_state = function(elem, status) + { + $(elem).children('a.subscription') + .prop('aria-checked', status)[status ? 'addClass' : 'removeClass']('subscribed'); + }; + + // Folder searching handler (for unsubscribed folders) + this.folder_search = function(search) + { + // hide search results + if (this.search_results_widget) { + this.search_results_container.hide(); + this.search_results_widget.reset(); + } + this.search_results = {}; + + // send search request to the server + if (search.query && search.execute) { + // cancel previous search request + if (this.listsearch_request) { + this.listsearch_request.abort(); + this.listsearch_request = null; + } + + var params = {search: search.query, unsubscribed: 1}; + + this.req = this.set_busy(true, rcmail.gettext('searching')); + this.listsearch_request = this.request('folder_list', params, 'folder_search_response'); + } + else if (!search.query) { + if (this.listsearch_request) { + this.listsearch_request.abort(); + this.listsearch_request = null; + } + + // any subscription changed, make sure the newly added records + // are listed before collections not after + if (this.folder_subscribe) { + var r, last, move = [], rows = $(rcmail.folder_list.container).children('li'); + + if (rows.length && !$(rows[rows.length-1]).hasClass('collection')) { + // collect all folders to move + while (rows.length--) { + r = $(rows[rows.length]); + if (r.hasClass('collection')) + last = r; + else if (last) + break; + else + move.push(r); + } + + if (last) + $.each(move, function() { + this.remove(); + last.before(this); + }); + } + } + } + }; + + // folder search response handler + this.folder_search_response = function(response) + { + if (!this.response(response)) + return; + + var folders = response.result && response.result.list ? response.result.list : response.result; + + if (!folders.length) + return; + + folders = this.folder_list_parse(folders, 10000, false); + + if (!this.search_results_widget) { + var list = rcmail.folder_list.container, + title = rcmail.gettext('kolab_files.additionalfolders'), + list_id = list.attr('id') || '0'; + + this.search_results_container = $('
    ') + .append($('

    ').text(title)) + .insertAfter(list); + + this.search_results_widget = new rcube_treelist_widget('