Fix listing of other user's calendars and sub-folders
This commit is contained in:
parent
df08826c03
commit
715b2b790a
8 changed files with 99 additions and 48 deletions
|
@ -2705,7 +2705,7 @@ function rcube_calendar_ui(settings)
|
||||||
// insert to #calendar-select options if writeable
|
// insert to #calendar-select options if writeable
|
||||||
select = $('#edit-calendar');
|
select = $('#edit-calendar');
|
||||||
if (fc && !cal.readonly && select.length && !select.find('option[value="'+id+'"]').length) {
|
if (fc && !cal.readonly && select.length && !select.find('option[value="'+id+'"]').length) {
|
||||||
$('<option>').attr('value', id).text(Q(cal.name)).appendTo(select);
|
$('<option>').attr('value', id).html(cal.name).appendTo(select);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2751,7 +2751,6 @@ function rcube_calendar_ui(settings)
|
||||||
calendars_list.addEventListener('insert-item', function(p) {
|
calendars_list.addEventListener('insert-item', function(p) {
|
||||||
var cal = p.data;
|
var cal = p.data;
|
||||||
if (cal && cal.id) {
|
if (cal && cal.id) {
|
||||||
cal.active = true;
|
|
||||||
add_calendar_source(cal);
|
add_calendar_source(cal);
|
||||||
|
|
||||||
// add css classes related to this calendar to document
|
// add css classes related to this calendar to document
|
||||||
|
|
|
@ -33,6 +33,8 @@ class kolab_calendar
|
||||||
public $alarms = false;
|
public $alarms = false;
|
||||||
public $categories = array();
|
public $categories = array();
|
||||||
public $storage;
|
public $storage;
|
||||||
|
|
||||||
|
public $type = 'event';
|
||||||
public $name;
|
public $name;
|
||||||
|
|
||||||
protected $cal;
|
protected $cal;
|
||||||
|
@ -197,6 +199,25 @@ class kolab_calendar
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update properties of this calendar folder
|
||||||
|
*
|
||||||
|
* @see calendar_driver::edit_calendar()
|
||||||
|
*/
|
||||||
|
public function update(&$prop)
|
||||||
|
{
|
||||||
|
$prop['oldname'] = $this->get_realname();
|
||||||
|
$newfolder = kolab_storage::folder_update($prop);
|
||||||
|
|
||||||
|
if ($newfolder === false) {
|
||||||
|
$this->cal->last_error = $this->cal->gettext(kolab_storage::$last_error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// create ID
|
||||||
|
return kolab_storage::folder_id($newfolder);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Getter for a single event object
|
* Getter for a single event object
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -129,7 +129,13 @@ class kolab_driver extends calendar_driver
|
||||||
$listname = $cal->get_foldername();
|
$listname = $cal->get_foldername();
|
||||||
$imap_path = explode('/', $cal->name);
|
$imap_path = explode('/', $cal->name);
|
||||||
$topname = array_pop($imap_path);
|
$topname = array_pop($imap_path);
|
||||||
$parent_id = kolab_storage::folder_id(join('/', $imap_path), true);
|
$parent_id = kolab_storage::folder_id(join('/', $imap_path));
|
||||||
|
|
||||||
|
// turn a kolab_storage_folder object into a kolab_calendar
|
||||||
|
if ($cal instanceof kolab_storage_folder) {
|
||||||
|
$cal = new kolab_calendar($cal->name, $this->cal);
|
||||||
|
$this->calendars[$cal->id] = $cal;
|
||||||
|
}
|
||||||
|
|
||||||
// special handling for user or virtual folders
|
// special handling for user or virtual folders
|
||||||
if ($cal instanceof kolab_storage_user_folder) {
|
if ($cal instanceof kolab_storage_user_folder) {
|
||||||
|
@ -141,7 +147,7 @@ class kolab_driver extends calendar_driver
|
||||||
'color' => $cal->get_color(),
|
'color' => $cal->get_color(),
|
||||||
'active' => $cal->is_active(),
|
'active' => $cal->is_active(),
|
||||||
'owner' => $cal->get_owner(),
|
'owner' => $cal->get_owner(),
|
||||||
'virtual' => false,
|
'virtual' => false,
|
||||||
'readonly' => true,
|
'readonly' => true,
|
||||||
'class_name' => 'user',
|
'class_name' => 'user',
|
||||||
);
|
);
|
||||||
|
@ -306,16 +312,7 @@ class kolab_driver extends calendar_driver
|
||||||
public function edit_calendar($prop)
|
public function edit_calendar($prop)
|
||||||
{
|
{
|
||||||
if ($prop['id'] && ($cal = $this->get_calendar($prop['id']))) {
|
if ($prop['id'] && ($cal = $this->get_calendar($prop['id']))) {
|
||||||
$prop['oldname'] = $cal->get_realname();
|
$id = $cal->update($prop);
|
||||||
$newfolder = kolab_storage::folder_update($prop);
|
|
||||||
|
|
||||||
if ($newfolder === false) {
|
|
||||||
$this->last_error = $this->cal->gettext(kolab_storage::$last_error);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// create ID
|
|
||||||
$id = kolab_storage::folder_id($newfolder);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$id = $prop['id'];
|
$id = $prop['id'];
|
||||||
|
|
|
@ -130,6 +130,20 @@ class kolab_user_calendar extends kolab_calendar
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update properties of this calendar folder
|
||||||
|
*
|
||||||
|
* @see calendar_driver::edit_calendar()
|
||||||
|
*/
|
||||||
|
public function update(&$prop)
|
||||||
|
{
|
||||||
|
// don't change anything.
|
||||||
|
// let kolab_driver save props in local prefs
|
||||||
|
return $prop['id'];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Getter for a single event object
|
* Getter for a single event object
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -229,7 +229,7 @@ class calendar_ui
|
||||||
if ($attrib['activeonly'] && !$prop['active'])
|
if ($attrib['activeonly'] && !$prop['active'])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
$html .= html::tag('li', array('id' => 'rcmlical' . rcube_utils::html_identifier($id)),
|
$html .= html::tag('li', array('id' => 'rcmlical' . $id),
|
||||||
$content = $this->calendar_list_item($id, $prop, $jsenv)
|
$content = $this->calendar_list_item($id, $prop, $jsenv)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -243,7 +243,7 @@ class calendar_ui
|
||||||
/**
|
/**
|
||||||
* Return html for a structured list <ul> for the folder tree
|
* Return html for a structured list <ul> for the folder tree
|
||||||
*/
|
*/
|
||||||
public function list_tree_html(&$node, &$data, &$jsenv, $attrib)
|
public function list_tree_html($node, $data, &$jsenv, $attrib)
|
||||||
{
|
{
|
||||||
$out = '';
|
$out = '';
|
||||||
foreach ($node->children as $folder) {
|
foreach ($node->children as $folder) {
|
||||||
|
|
|
@ -86,7 +86,7 @@ $labels['nmonthsback'] = '$nr months back';
|
||||||
$labels['showurl'] = 'Show calendar URL';
|
$labels['showurl'] = 'Show calendar URL';
|
||||||
$labels['showurldescription'] = 'Use the following address to access (read only) your calendar from other applications. You can copy and paste this into any calendar software that supports the iCal format.';
|
$labels['showurldescription'] = 'Use the following address to access (read only) your calendar from other applications. You can copy and paste this into any calendar software that supports the iCal format.';
|
||||||
$labels['caldavurldescription'] = 'Copy this address to a <a href="http://en.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a> client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.';
|
$labels['caldavurldescription'] = 'Copy this address to a <a href="http://en.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a> client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.';
|
||||||
$labels['calsearchresults'] = 'Additional Results';
|
$labels['calsearchresults'] = 'Available Calendars';
|
||||||
|
|
||||||
// agenda view
|
// agenda view
|
||||||
$labels['listrange'] = 'Range to display:';
|
$labels['listrange'] = 'Range to display:';
|
||||||
|
|
|
@ -297,6 +297,10 @@ pre {
|
||||||
padding: 2px 8px 2px 8px;
|
padding: 2px 8px 2px 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#calendars .searchresults .listing li {
|
||||||
|
background-color: #c7e3ef;
|
||||||
|
}
|
||||||
|
|
||||||
#calfeedurl,
|
#calfeedurl,
|
||||||
#caldavurl {
|
#caldavurl {
|
||||||
width: 98%;
|
width: 98%;
|
||||||
|
|
|
@ -62,39 +62,12 @@ function kolab_folderlist(node, p)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var li = $(this).closest('li'),
|
var li = $(this).closest('li'),
|
||||||
id = li.attr('id').replace(new RegExp('^'+p.id_prefix), ''),
|
id = li.attr('id').replace(new RegExp('^'+p.id_prefix), '')
|
||||||
node = search_results_widget.get_node(id),
|
node = search_results_widget.get_node(id),
|
||||||
prop = search_results[id],
|
has_children = node.children && node.children.length;
|
||||||
parent_id = prop.parent || null,
|
|
||||||
has_children = node.children && node.children.length,
|
|
||||||
dom_node = has_children ? li.children().first().clone(true, true) : li.children().first();
|
|
||||||
|
|
||||||
// find parent node and insert at the right place
|
// copy item to the main list
|
||||||
if (parent_id && $('#' + p.id_prefix + parent_id, me.container).length) {
|
add_result2list(id, li, true);
|
||||||
prop.listname = prop.editname;
|
|
||||||
dom_node.children('span,a').first().html(Q(prop.listname));
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: copy parent tree too
|
|
||||||
|
|
||||||
// replace virtual node with a real one
|
|
||||||
if (me.get_node(id)) {
|
|
||||||
$(me.get_item(id, true)).children().first()
|
|
||||||
.replaceWith(dom_node)
|
|
||||||
.removeClass('virtual');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// move this result item to the main list widget
|
|
||||||
me.insert({
|
|
||||||
id: id,
|
|
||||||
classes: [],
|
|
||||||
virtual: prop.virtual,
|
|
||||||
html: dom_node,
|
|
||||||
}, parent_id, parent_id ? true : false);
|
|
||||||
}
|
|
||||||
|
|
||||||
delete prop.html;
|
|
||||||
me.triggerEvent('insert-item', { id: id, data: prop, item: li });
|
|
||||||
|
|
||||||
if (has_children) {
|
if (has_children) {
|
||||||
li.find('input[type=checkbox]').first().prop('disabled', true).get(0).checked = true;
|
li.find('input[type=checkbox]').first().prop('disabled', true).get(0).checked = true;
|
||||||
|
@ -127,6 +100,49 @@ function kolab_folderlist(node, p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// helper method to (recursively) add a search result item to the main list widget
|
||||||
|
function add_result2list(id, li, active)
|
||||||
|
{
|
||||||
|
var node = search_results_widget.get_node(id),
|
||||||
|
prop = search_results[id],
|
||||||
|
parent_id = prop.parent || null,
|
||||||
|
has_children = node.children && node.children.length,
|
||||||
|
dom_node = has_children ? li.children().first().clone(true, true) : li.children().first();
|
||||||
|
|
||||||
|
// find parent node and insert at the right place
|
||||||
|
if (parent_id && me.get_node(parent_id)) {
|
||||||
|
dom_node.children('span,a').first().html(Q(prop.editname));
|
||||||
|
}
|
||||||
|
else if (parent_id && search_results[parent_id]) {
|
||||||
|
// copy parent tree from search results
|
||||||
|
add_result2list(parent_id, $(search_results_widget.get_item(parent_id)), false);
|
||||||
|
}
|
||||||
|
else if (parent_id) {
|
||||||
|
// use full name for list display
|
||||||
|
dom_node.children('span,a').first().html(Q(prop.name));
|
||||||
|
}
|
||||||
|
|
||||||
|
// replace virtual node with a real one
|
||||||
|
if (me.get_node(id)) {
|
||||||
|
$(me.get_item(id, true)).children().first()
|
||||||
|
.replaceWith(dom_node)
|
||||||
|
.removeClass('virtual');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// move this result item to the main list widget
|
||||||
|
me.insert({
|
||||||
|
id: id,
|
||||||
|
classes: [],
|
||||||
|
virtual: prop.virtual,
|
||||||
|
html: dom_node,
|
||||||
|
}, parent_id, parent_id ? true : false);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete prop.html;
|
||||||
|
prop.active = active;
|
||||||
|
me.triggerEvent('insert-item', { id: id, data: prop, item: li });
|
||||||
|
}
|
||||||
|
|
||||||
// do some magic when search is performed on the widget
|
// do some magic when search is performed on the widget
|
||||||
this.addEventListener('search', function(search) {
|
this.addEventListener('search', function(search) {
|
||||||
// hide search results
|
// hide search results
|
||||||
|
|
Loading…
Add table
Reference in a new issue