Added namespace filter in Folder Manager
| | |
| | | CHANGELOG Roundcube Webmail |
| | | =========================== |
| | | |
| | | - Added namespace filter in Folder Manager |
| | | - Added folder searching in Folder Manager |
| | | - Added config option 'imap_log_session' to enable Roundcube <-> IMAP session ID logging |
| | | - Added config option 'log_session_id' to control the lengh of the session identifer in logs |
| | |
| | | row.attr({id: 'rcmli' + this.html_identifier_encode(id), 'class': class_name}); |
| | | |
| | | if (!refrow || !refrow.length) { |
| | | // remove old subfolders and toggle |
| | | // remove old data, subfolders and toggle |
| | | $('ul,div.treetoggle', row).remove(); |
| | | row.removeData('filtered'); |
| | | } |
| | | |
| | | // set folder name |
| | |
| | | this.subscription_list.expand(this.folder_id2name(parent.id)); |
| | | } |
| | | |
| | | row = row.get(0); |
| | | row = row.show().get(0); |
| | | if (row.scrollIntoView) |
| | | row.scrollIntoView(); |
| | | |
| | |
| | | $('#folder-size').replaceWith(size); |
| | | }; |
| | | |
| | | // filter folders by namespace |
| | | this.folder_filter = function(prefix) |
| | | { |
| | | this.subscription_list.reset_search(); |
| | | |
| | | this.subscription_list.container.children('li').each(function() { |
| | | var i, folder = ref.folder_id2name(this.id); |
| | | // show all folders |
| | | if (prefix == '---') { |
| | | } |
| | | // got namespace prefix |
| | | else if (prefix) { |
| | | if (folder !== prefix) { |
| | | $(this).data('filtered', true).hide(); |
| | | return |
| | | } |
| | | } |
| | | // no namespace prefix, filter out all other namespaces |
| | | else { |
| | | // first get all namespace roots |
| | | for (i in ref.env.ns_roots) { |
| | | if (folder === ref.env.ns_roots[i]) { |
| | | $(this).data('filtered', true).hide(); |
| | | return; |
| | | } |
| | | } |
| | | } |
| | | |
| | | $(this).removeData('filtered').show(); |
| | | }); |
| | | }; |
| | | |
| | | /*********************************************************/ |
| | | /********* GUI functionality *********/ |
| | |
| | | var li, sli; |
| | | if (!node.virtual && !node.deleted && String(node.text).toLowerCase().indexOf(q) >= 0 && hits.indexOf(node.id) < 0) { |
| | | li = id2dom(node.id); |
| | | |
| | | // skip already filtered nodes |
| | | if (li.data('filtered')) |
| | | return; |
| | | |
| | | sli = $('<li>') |
| | | .attr('id', li.attr('id') + '--xsR') |
| | | .attr('class', li.attr('class')) |
| | |
| | | searchfield.val(''); |
| | | |
| | | $(container).children('li.searchresult__').remove(); |
| | | $(container).children('li').show(); |
| | | $(container).children('li').filter(function() { return !$(this).data('filtered'); }).show(); |
| | | |
| | | search_active = false; |
| | | |
| | |
| | | $labels['otherfolder'] = 'Other User\'s Folder'; |
| | | $labels['sharedfolder'] = 'Public Folder'; |
| | | $labels['findfolders'] = 'Find folders'; |
| | | $labels['namespace.personal'] = 'Personal'; |
| | | $labels['namespace.other'] = 'Other users'; |
| | | $labels['namespace.shared'] = 'Shared'; |
| | | |
| | | $labels['sortby'] = 'Sort by'; |
| | | $labels['sortasc'] = 'Sort ascending'; |
| | |
| | | |
| | | // register UI objects |
| | | $OUTPUT->add_handlers(array( |
| | | 'foldersubscription' => 'rcube_subscription_form', |
| | | 'foldersubscription' => 'rcmail_subscription_form', |
| | | 'folderframe' => 'rcmail_folder_frame', |
| | | 'folderfilter' => 'rcmail_folder_filter', |
| | | 'quotadisplay' => array($RCMAIL, 'quota_display'), |
| | | )); |
| | | |
| | |
| | | |
| | | |
| | | // build table with all folders listed by server |
| | | function rcube_subscription_form($attrib) |
| | | function rcmail_subscription_form($attrib) |
| | | { |
| | | global $RCMAIL, $OUTPUT; |
| | | |
| | |
| | | return $OUTPUT->frame($attrib, true); |
| | | } |
| | | |
| | | function rcmail_folder_filter($attrib) |
| | | { |
| | | global $RCMAIL; |
| | | |
| | | $storage = $RCMAIL->get_storage(); |
| | | $namespace = $storage->get_namespace(); |
| | | |
| | | if (empty($namespace['personal']) && empty($namespace['shared']) && empty($namespace['other'])) { |
| | | return ''; |
| | | } |
| | | |
| | | if (!$attrib['id']) { |
| | | $attrib['id'] = 'rcmfolderfilter'; |
| | | } |
| | | |
| | | $attrib['onchange'] = rcmail_output::JS_OBJECT_NAME . '.folder_filter(this.value)'; |
| | | |
| | | $roots = array(); |
| | | $select = new html_select($attrib); |
| | | $select->add($RCMAIL->gettext('all'), '---'); |
| | | |
| | | foreach (array_keys($namespace) as $type) { |
| | | foreach ((array)$namespace[$type] as $ns) { |
| | | $root = rtrim($ns[0], $ns[1]); |
| | | $label = $RCMAIL->gettext('namespace.' . $type); |
| | | |
| | | if (count($namespace[$type]) > 1) { |
| | | $label .= ' (' . rcube_charset::convert($root, 'UTF7-IMAP', RCUBE_CHARSET) . ')'; |
| | | } |
| | | |
| | | $select->add($label, $root); |
| | | |
| | | if (strlen($root)) { |
| | | $roots[] = $root; |
| | | } |
| | | } |
| | | } |
| | | |
| | | $RCMAIL->output->add_gui_object('foldersfilter', $attrib['id']); |
| | | $RCMAIL->output->set_env('ns_roots', $roots); |
| | | |
| | | return $select->show(); |
| | | } |
| | | |
| | | function rcmail_rename_folder($oldname, $newname) |
| | | { |
| | | global $RCMAIL; |
| | |
| | | $('.boxtitle a.search', container).click(function(e) { |
| | | var title = $('.boxtitle', container), |
| | | box = $('.listsearchbox', container), |
| | | dir = box.is(':visible') ? -1 : 1; |
| | | dir = box.is(':visible') ? -1 : 1, |
| | | height = 24 + ($('select', box).length ? 24 : 0); |
| | | |
| | | box.slideToggle({ |
| | | duration: 160, |
| | | progress: function(animation, progress) { |
| | | if (dir < 0) progress = 1 - progress; |
| | | $('.boxlistcontent', container).css('top', (title.outerHeight() + 24 * progress) + 'px'); |
| | | $('.boxlistcontent', container).css('top', (title.outerHeight() + height * progress) + 'px'); |
| | | }, |
| | | complete: function() { |
| | | box.toggleClass('expanded'); |
| | |
| | | text-indent: 50000px; |
| | | } |
| | | |
| | | .listsearchbox select { |
| | | width: 100%; |
| | | margin: 1px 0; |
| | | } |
| | | |
| | | #identities-table, |
| | | #sections-table |
| | | { |
| | |
| | | <a class="iconbutton searchicon"></a> |
| | | <roundcube:button command="reset-foldersearch" id="folderlistsearch-reset" class="iconbutton reset" title="resetsearch" width="13" height="13" /> |
| | | </div> |
| | | <roundcube:object name="folderfilter" id="folderlist-filter" /> |
| | | </div> |
| | | <div id="folderlist-content" class="boxlistcontent"> |
| | | <roundcube:object name="foldersubscription" form="subscriptionform" id="subscription-table" |
| | |
| | | top: 34px; |
| | | } |
| | | |
| | | .listsearchbox select { |
| | | width: 100%; |
| | | margin: 3px 0; |
| | | } |
| | | |
| | | #folderslist, |
| | | #identitieslist { |
| | | position: absolute; |
| | |
| | | } |
| | | |
| | | .listsearchbox { |
| | | position: relative; |
| | | padding: 4px; |
| | | background: #c7e3ef; |
| | | display: none; |
| | |
| | | <a class="iconbutton searchicon"></a> |
| | | <roundcube:button command="reset-foldersearch" id="folderlistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> |
| | | </div> |
| | | <roundcube:object name="folderfilter" id="folderlist-filter" /> |
| | | </div> |
| | | <div id="folderslist-content" class="scroller withfooter"> |
| | | <roundcube:object name="foldersubscription" form="subscriptionform" id="subscription-table" class="treelist listing folderlist" /> |
| | |
| | | $('.boxtitle a.search', container).click(function(e) { |
| | | var title = $('.boxtitle', container), |
| | | box = $('.listsearchbox', container), |
| | | dir = box.is(':visible') ? -1 : 1; |
| | | dir = box.is(':visible') ? -1 : 1, |
| | | height = 34 + ($('select', box).length ? 24 : 0); |
| | | |
| | | box.slideToggle({ |
| | | duration: 160, |
| | | progress: function(animation, progress) { |
| | | if (dir < 0) progress = 1 - progress; |
| | | $('.scroller', container).css('top', (title.outerHeight() + 34 * progress) + 'px'); |
| | | $('.scroller', container).css('top', (title.outerHeight() + height * progress) + 'px'); |
| | | }, |
| | | complete: function() { |
| | | box.toggleClass('expanded'); |