From 761c79dbadc33cbe37e8ccca52acc2d8e0ab8f65 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Mon, 17 Mar 2014 21:11:36 +0100 Subject: [PATCH] Fix resolving and displaying tree structure of resource records loaded from the server --- plugins/calendar/calendar_ui.js | 43 ++++++++++++++----- .../drivers/ldap/resources_driver_ldap.php | 5 +++ 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index 9d039879..f74880e0 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -1333,7 +1333,7 @@ function rcube_calendar_ui(settings) var event = me.selected_event, eventstart = clone_date(event.start, event.allDay ? 1 : 0).getTime(), // calculate with integers eventend = clone_date(event.end, event.allDay ? 2 : 0).getTime(), - duration = eventend - eventstart - (event.allDay ? HOUR_MS : 0), // make sure we don't cross day borders on DST change + duration = eventend - eventstart - (event.allDay ? HOUR_MS : 0), /* make sure we don't cross day borders on DST change */ sinterval = freebusy_data.interval * 60000, intvlslots = 1, numslots = Math.ceil(duration / sinterval), @@ -1769,25 +1769,46 @@ function rcube_calendar_ui(settings) // callback from server for resource listing var resource_data_load = function(data) { - data.sort(function(a,b) { - var j = a._type == 'collection' ? 1 : 0, - k = b._type == 'collection' ? 1 : 0; - return k != j ? (j - k) : (a.name < b.name ? 1 : 0); - }); + var resources_tree = {}; - // assign parent-relations + // store data by ID $.each(data, function(i, rec) { resources_data[rec.ID] = rec; - resources_index.push(rec.ID); + // assign parent-relations if (rec.members) { $.each(rec.members, function(j, m){ - resources_data[m].parent_id = rec.ID; + resources_tree[m] = rec.ID; }); } }); - resources_index.reverse(); + // walk the parent-child tree to determine the depth of each node + $.each(data, function(i, rec) { + rec._depth = 0; + if (resources_tree[rec.ID]) + rec.parent_id = resources_tree[rec.ID]; + + var parent_id = resources_tree[rec.ID]; + while (parent_id) { + rec._depth++; + parent_id = resources_tree[parent_id]; + } + }); + + // sort by depth, collection and name + data.sort(function(a,b) { + var j = a._type == 'collection' ? 1 : 0, + k = b._type == 'collection' ? 1 : 0, + d = a._depth - b._depth; + if (!d) d = (k - j); + if (!d) d = b.name < a.name ? 1 : -1; + return d; + }); + + $.each(data, function(i, rec) { + resources_index.push(rec.ID); + }); // apply search filter... if ($('#resourcesearchbox').val() != '') @@ -2130,7 +2151,7 @@ function rcube_calendar_ui(settings) date: date.getDate(), month: date.getMonth(), year: date.getFullYear(), - ignoreTimezone: true, // will treat the given date strings as in local (browser's) timezone + ignoreTimezone: true, /* will treat the given date strings as in local (browser's) timezone */ eventSources: sources, monthNames : settings['months'], monthNamesShort : settings['months_short'], diff --git a/plugins/calendar/drivers/ldap/resources_driver_ldap.php b/plugins/calendar/drivers/ldap/resources_driver_ldap.php index 2f10a1ea..c377393d 100644 --- a/plugins/calendar/drivers/ldap/resources_driver_ldap.php +++ b/plugins/calendar/drivers/ldap/resources_driver_ldap.php @@ -127,6 +127,11 @@ class resources_driver_ldap extends resources_driver $rec['attributes'] = $attributes; } + // force $rec['members'] to be an array + if (!empty($rec['members']) && !is_array($rec['members'])) { + $rec['members'] = array($rec['members']); + } + // remove unused cruft unset($rec['_raw_attrib']);