Use a global function to sort folder names by namespace/name; add option to control the use of displayname folder annotations

This commit is contained in:
Thomas Bruederli 2013-07-18 17:47:49 +02:00
parent 17354a88e3
commit 64174f4fac
5 changed files with 66 additions and 46 deletions

View file

@ -72,19 +72,12 @@ class kolab_driver extends calendar_driver
if (isset($this->calendars))
return $this->calendars;
// get all folders that have "event" type
$folders = kolab_storage::get_folders('event');
// get all folders that have "event" type, sorted by namespace/name
$folders = kolab_storage::sort_folders(kolab_storage::get_folders('event'));
$this->calendars = array();
// convert to UTF8 and sort
$names = array();
foreach ($folders as $folder)
$names[$folder->name] = rcube_charset::convert($folder->name, 'UTF7-IMAP');
asort($names, SORT_LOCALE_STRING);
foreach (array_keys($names) as $utf7name) {
$calendar = new kolab_calendar($utf7name, $this->cal);
foreach ($folders as $folder) {
$calendar = new kolab_calendar($folder->name, $this->cal);
$this->calendars[$calendar->id] = $calendar;
if (!$calendar->readonly)
$this->has_writeable = true;

View file

@ -233,7 +233,7 @@ class kolab_addressbook extends rcube_plugin
}
// get all folders that have "contact" type
$this->folders = kolab_storage::get_folders('contact');
$this->folders = kolab_storage::sort_folders(kolab_storage::get_folders('contact'));
if (PEAR::isError($this->folders)) {
rcube::raise_error(array(
@ -245,15 +245,10 @@ class kolab_addressbook extends rcube_plugin
else {
// convert to UTF8 and sort
$names = array();
foreach ($this->folders as $c_folder)
$names[$c_folder->name] = rcube_charset::convert($c_folder->name, 'UTF7-IMAP');
asort($names, SORT_LOCALE_STRING);
foreach (array_keys($names) as $utf7name) {
foreach ($this->folders as $folder) {
// create instance of rcube_contacts
$abook_id = kolab_storage::folder_id($utf7name);
$abook = new rcube_kolab_contacts($utf7name);
$abook_id = kolab_storage::folder_id($folder->name);
$abook = new rcube_kolab_contacts($folder->name);
$this->sources[$abook_id] = $abook;
}
}

View file

@ -19,4 +19,8 @@ $rcmail_config['kolab_ssl_verify_peer'] = false;
// folders in calendar view or available addressbooks
$rcmail_config['kolab_use_subscriptions'] = false;
// Enables the use of displayname folder annotations as introduced in KEP:?
// for displaying resource folder names (experimental!)
$rcmail_config['kolab_custom_display_names'] = false;
?>

View file

@ -388,9 +388,11 @@ class kolab_storage
self::setup();
// find custom display name in folder METADATA
$metadata = self::$imap->get_metadata($folder, array(self::NAME_KEY_PRIVATE, self::NAME_KEY_SHARED));
if (($name = $metadata[$folder][self::NAME_KEY_PRIVATE]) || ($name = $metadata[$folder][self::NAME_KEY_SHARED])) {
return $name;
if (self::$config->get('kolab_custom_display_names', true)) {
$metadata = self::$imap->get_metadata($folder, array(self::NAME_KEY_PRIVATE, self::NAME_KEY_SHARED));
if (($name = $metadata[$folder][self::NAME_KEY_PRIVATE]) || ($name = $metadata[$folder][self::NAME_KEY_SHARED])) {
return $name;
}
}
$found = false;
@ -644,6 +646,36 @@ class kolab_storage
}
/**
* Sort the given list of kolab folders by namespace/name
*
* @param array List of kolab_storage_folder objects
* @return array Sorted list of folders
*/
public static function sort_folders($folders)
{
$nsnames = array('personal' => array(), 'shared' => array(), 'other' => array());
foreach ($folders as $folder) {
$folders[$folder->name] = $folder;
$ns = $folder->get_namespace();
$nsnames[$ns][$folder->name] = strtolower(html_entity_decode(self::object_name($folder->name, $ns), ENT_COMPAT, RCUBE_CHARSET)); // decode »
}
$names = array();
foreach ($nsnames as $ns => $dummy) {
asort($nsnames[$ns], SORT_LOCALE_STRING);
$names += $nsnames[$ns];
}
$out = array();
foreach ($names as $utf7name => $name) {
$out[] = $folders[$utf7name];
}
return $out;
}
/**
* Returns folder types indexed by folder name
*
@ -651,7 +683,7 @@ class kolab_storage
*
* @return array|bool List of folders, False on failure
*/
static function folders_typedata($prefix = '*')
public static function folders_typedata($prefix = '*')
{
if (!self::setup()) {
return false;
@ -670,7 +702,7 @@ class kolab_storage
/**
* Callback for array_map to select the correct annotation value
*/
static function folder_select_metadata($types)
public static function folder_select_metadata($types)
{
if (!empty($types[self::CTYPE_KEY_PRIVATE])) {
return $types[self::CTYPE_KEY_PRIVATE];
@ -690,7 +722,7 @@ class kolab_storage
*
* @return string Folder type
*/
static function folder_type($folder)
public static function folder_type($folder)
{
self::setup();
@ -716,7 +748,7 @@ class kolab_storage
*
* @return boolean True on success
*/
static function set_folder_type($folder, $type='mail')
public static function set_folder_type($folder, $type='mail')
{
self::setup();

View file

@ -62,26 +62,21 @@ class tasklist_kolab_driver extends tasklist_driver
return $this->lists;
// get all folders that have type "task"
$this->folders = kolab_storage::get_folders('task');
$this->lists = array();
$folders = kolab_storage::sort_folders(kolab_storage::get_folders('task'));
$this->lists = $this->folders = array();
// convert to UTF8 and sort
$names = array();
$default_folder = null;
foreach ($this->folders as $folder) {
$names[$folder->name] = rcube_charset::convert($folder->name, 'UTF7-IMAP');
$this->folders[$folder->name] = $folder;
// find default folder
$default_index = 0;
foreach ($folders as $i => $folder) {
if ($folder->default)
$default_folder = $folder->name;
$default_index = $i;
}
asort($names, SORT_LOCALE_STRING);
// put default folder (aka INBOX) on top of the list
if ($default_folder) {
$default_name = $names[$default_folder];
unset($names[$default_folder]);
$names = array_merge(array($default_folder => $default_name), $names);
if ($default_index > 0) {
$default_folder = $folders[$default_index];
unset($folders[$default_index]);
array_unshift($folders, $default_folder);
}
$delim = $this->rc->get_storage()->get_hierarchy_delimiter();
@ -89,11 +84,12 @@ class tasklist_kolab_driver extends tasklist_driver
$prefs = $this->rc->config->get('kolab_tasklists', array());
foreach ($names as $utf7name => $name) {
$folder = $this->folders[$utf7name];
foreach ($folders as $folder) {
$utf7name = $folder->name;
$this->folders[$folder->name] = $folder;
$path_imap = explode($delim, $name);
$editname = array_pop($path_imap); // pop off raw name part
$path_imap = explode($delim, $utf7name);
$editname = rcube_charset::convert(array_pop($path_imap), 'UTF7-IMAP'); // pop off raw name part
$path_imap = join($delim, $path_imap);
$name = kolab_storage::folder_displayname(kolab_storage::object_name($utf7name), $listnames);