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:
parent
17354a88e3
commit
64174f4fac
5 changed files with 66 additions and 46 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
?>
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue