From 624f3b169566ffa0ce2a98b722c67307825669dd Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Tue, 9 Sep 2014 13:29:28 +0200 Subject: [PATCH] Add action to remove a calendar/tasks/notes folders from the list which results in unsubscribing it (#3378) --- plugins/calendar/calendar.php | 4 ++-- plugins/calendar/calendar_ui.js | 15 ++++++++++--- plugins/calendar/drivers/calendar_driver.php | 2 +- .../drivers/database/database_driver.php | 4 ++-- .../calendar/drivers/kolab/kolab_driver.php | 16 ++++++++++++-- .../skins/classic/templates/calendar.html | 3 +++ .../skins/larry/templates/calendar.html | 3 +++ plugins/kolab_notes/kolab_notes.php | 10 +++++++++ plugins/kolab_notes/localization/en_US.inc | 1 + plugins/kolab_notes/notes.js | 22 ++++++++++++++----- .../skins/larry/templates/notes.html | 3 ++- .../database/tasklist_database_driver.php | 4 ++-- .../drivers/kolab/tasklist_kolab_driver.php | 15 +++++++++++-- plugins/tasklist/drivers/tasklist_driver.php | 2 +- plugins/tasklist/localization/en_US.inc | 1 + .../skins/larry/templates/mainview.html | 3 ++- plugins/tasklist/tasklist.js | 21 +++++++++++++++--- plugins/tasklist/tasklist.php | 4 ++-- 18 files changed, 106 insertions(+), 27 deletions(-) diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index e26c6dba..afcc0526 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -770,8 +770,8 @@ class calendar extends rcube_plugin $success = $this->driver->edit_calendar($cal); $reload = true; break; - case "remove": - if ($success = $this->driver->remove_calendar($cal)) + case "delete": + if ($success = $this->driver->delete_calendar($cal)) $this->rc->output->command('plugin.destroy_source', array('id' => $cal['id'])); break; case "subscribe": diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index b36e2a89..558a0145 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -2775,9 +2775,16 @@ function rcube_calendar_ui(settings) }; this.calendar_remove = function(calendar) + { + this.calendar_destroy_source(calendar.id); + rcmail.http_post('calendar', { action:'subscribe', c:{ id:calendar.id, active:0, permanent:0, recursive:1 } }); + return true; + }; + + this.calendar_delete = function(calendar) { if (confirm(rcmail.gettext(calendar.children ? 'deletecalendarconfirmrecursive' : 'deletecalendarconfirm', 'calendar'))) { - rcmail.http_post('calendar', { action:'remove', c:{ id:calendar.id } }); + rcmail.http_post('calendar', { action:'delete', c:{ id:calendar.id } }); return true; } return false; @@ -2803,8 +2810,8 @@ function rcube_calendar_ui(settings) // delete all calendars in the list for (var i=0; i < delete_ids.length; i++) { id = delete_ids[i]; + calendars_list.remove(id); fc.fullCalendar('removeEventSource', this.calendars[id]); - $('#rcmlical' + id).remove(); $('#edit-calendar option[value="'+id+'"]').remove(); delete this.calendars[id]; } @@ -3349,7 +3356,8 @@ function rcube_calendar_ui(settings) if (node && node.id && me.calendars[node.id]) { me.select_calendar(node.id, true); rcmail.enable_command('calendar-edit', 'calendar-showurl', true); - rcmail.enable_command('calendar-remove', !me.calendars[node.id].readonly); + rcmail.enable_command('calendar-delete', !me.calendars[node.id].readonly); + rcmail.enable_command('calendar-remove', me.calendars[node.id] && me.calendars[node.id].removable); } }); calendars_list.addEventListener('insert-item', function(p) { @@ -3903,6 +3911,7 @@ window.rcmail && rcmail.addEventListener('init', function(evt) { rcmail.register_command('calendar-create', function(){ cal.calendar_edit_dialog(null); }, true); rcmail.register_command('calendar-edit', function(){ cal.calendar_edit_dialog(cal.calendars[cal.selected_calendar]); }, false); rcmail.register_command('calendar-remove', function(){ cal.calendar_remove(cal.calendars[cal.selected_calendar]); }, false); + rcmail.register_command('calendar-delete', function(){ cal.calendar_delete(cal.calendars[cal.selected_calendar]); }, false); rcmail.register_command('events-import', function(){ cal.import_events(cal.calendars[cal.selected_calendar]); }, true); rcmail.register_command('calendar-showurl', function(){ cal.showurl(cal.calendars[cal.selected_calendar]); }, false); rcmail.register_command('event-download', function(){ cal.event_download(cal.selected_event); }, true); diff --git a/plugins/calendar/drivers/calendar_driver.php b/plugins/calendar/drivers/calendar_driver.php index 14b80c44..8872ed00 100644 --- a/plugins/calendar/drivers/calendar_driver.php +++ b/plugins/calendar/drivers/calendar_driver.php @@ -164,7 +164,7 @@ abstract class calendar_driver * id: Calendar Identifier * @return boolean True on success, Fales on failure */ - abstract function remove_calendar($prop); + abstract function delete_calendar($prop); /** * Search for shared or otherwise not listed calendars the user has access diff --git a/plugins/calendar/drivers/database/database_driver.php b/plugins/calendar/drivers/database/database_driver.php index d665e045..781f71e2 100644 --- a/plugins/calendar/drivers/database/database_driver.php +++ b/plugins/calendar/drivers/database/database_driver.php @@ -229,9 +229,9 @@ class database_driver extends calendar_driver /** * Delete the given calendar with all its contents * - * @see calendar_driver::remove_calendar() + * @see calendar_driver::delete_calendar() */ - public function remove_calendar($prop) + public function delete_calendar($prop) { if (!$this->calendars[$prop['id']]) return false; diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php index fec96f49..e7fff66d 100644 --- a/plugins/calendar/drivers/kolab/kolab_driver.php +++ b/plugins/calendar/drivers/kolab/kolab_driver.php @@ -177,6 +177,7 @@ class kolab_driver extends calendar_driver 'readonly' => true, 'group' => 'other', 'class' => 'user', + 'removable' => true, ); } else if ($cal->virtual) { @@ -209,6 +210,7 @@ class kolab_driver extends calendar_driver 'children' => true, // TODO: determine if that folder indeed has child folders 'parent' => $parent_id, 'caldavurl' => $cal->get_caldav_url(), + 'removable' => true, ); } @@ -418,6 +420,16 @@ class kolab_driver extends calendar_driver $ret |= $cal->storage->subscribe(intval($prop['permanent'])); if (isset($prop['active'])) $ret |= $cal->storage->activate(intval($prop['active'])); + + // apply to child folders, too + if ($prop['recursive']) { + foreach ((array)kolab_storage::list_folders($cal->storage->name, '*', 'event') as $subfolder) { + if (isset($prop['permanent'])) + ($prop['permanent'] ? kolab_storage::folder_subscribe($subfolder) : kolab_storage::folder_unsubscribe($subfolder)); + if (isset($prop['active'])) + ($prop['active'] ? kolab_storage::folder_activate($subfolder) : kolab_storage::folder_deactivate($subfolder)); + } + } return $ret; } else { @@ -435,9 +447,9 @@ class kolab_driver extends calendar_driver /** * Delete the given calendar with all its contents * - * @see calendar_driver::remove_calendar() + * @see calendar_driver::delete_calendar() */ - public function remove_calendar($prop) + public function delete_calendar($prop) { if ($prop['id'] && ($cal = $this->get_calendar($prop['id']))) { $folder = $cal->get_realname(); diff --git a/plugins/calendar/skins/classic/templates/calendar.html b/plugins/calendar/skins/classic/templates/calendar.html index 2df1ce71..516cf589 100644 --- a/plugins/calendar/skins/classic/templates/calendar.html +++ b/plugins/calendar/skins/classic/templates/calendar.html @@ -49,7 +49,10 @@
diff --git a/plugins/tasklist/drivers/database/tasklist_database_driver.php b/plugins/tasklist/drivers/database/tasklist_database_driver.php index 9ec930a2..a1e1c973 100644 --- a/plugins/tasklist/drivers/database/tasklist_database_driver.php +++ b/plugins/tasklist/drivers/database/tasklist_database_driver.php @@ -173,9 +173,9 @@ class tasklist_database_driver extends tasklist_driver * * @param array Hash array with list properties * @return boolean True on success, Fales on failure - * @see tasklist_driver::remove_list() + * @see tasklist_driver::delete_list() */ - public function remove_list($prop) + public function delete_list($prop) { $list_id = $prop['id']; diff --git a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php index d757cb72..5af57300 100644 --- a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php +++ b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php @@ -143,7 +143,8 @@ class tasklist_kolab_driver extends tasklist_driver 'virtual' => $folder->virtual, 'children' => true, // TODO: determine if that folder indeed has child folders 'subscribed' => (bool)$folder->is_subscribed(), - 'group' => $folder->default ? 'default' : $folder->get_namespace(), + 'removable' => !$folder->default, + 'group' => $folder->default ? 'default' : $folder->get_namespace(), 'class' => trim($folder->get_namespace() . ($folder->default ? ' default' : '')), ); } @@ -361,6 +362,16 @@ class tasklist_kolab_driver extends tasklist_driver $ret |= $folder->subscribe(intval($prop['permanent'])); if (isset($prop['active'])) $ret |= $folder->activate(intval($prop['active'])); + + // apply to child folders, too + if ($prop['recursive']) { + foreach ((array)kolab_storage::list_folders($folder->name, '*', 'task') as $subfolder) { + if (isset($prop['permanent'])) + ($prop['permanent'] ? kolab_storage::folder_subscribe($subfolder) : kolab_storage::folder_unsubscribe($subfolder)); + if (isset($prop['active'])) + ($prop['active'] ? kolab_storage::folder_activate($subfolder) : kolab_storage::folder_deactivate($subfolder)); + } + } return $ret; } return false; @@ -373,7 +384,7 @@ class tasklist_kolab_driver extends tasklist_driver * id: list Identifier * @return boolean True on success, Fales on failure */ - public function remove_list($prop) + public function delete_list($prop) { if ($prop['id'] && ($folder = $this->get_folder($prop['id']))) { if (kolab_storage::folder_delete($folder->name)) diff --git a/plugins/tasklist/drivers/tasklist_driver.php b/plugins/tasklist/drivers/tasklist_driver.php index 2775539f..cdaa76ba 100644 --- a/plugins/tasklist/drivers/tasklist_driver.php +++ b/plugins/tasklist/drivers/tasklist_driver.php @@ -124,7 +124,7 @@ abstract class tasklist_driver * id: list Identifier * @return boolean True on success, Fales on failure */ - abstract function remove_list($prop); + abstract function delete_list($prop); /** * Search for shared or otherwise not listed tasklists the user has access diff --git a/plugins/tasklist/localization/en_US.inc b/plugins/tasklist/localization/en_US.inc index 1dcba626..288bd711 100644 --- a/plugins/tasklist/localization/en_US.inc +++ b/plugins/tasklist/localization/en_US.inc @@ -19,6 +19,7 @@ $labels['findlists'] = 'Find tasklists...'; $labels['searchterms'] = 'Search terms'; $labels['notasklistsfound'] = 'No tasklists found'; $labels['nrtasklistsfound'] = '$nr tasklists found'; +$labels['removelist'] = 'Remove'; $labels['newtask'] = 'New Task'; $labels['createtask'] = 'Create Task '; diff --git a/plugins/tasklist/skins/larry/templates/mainview.html b/plugins/tasklist/skins/larry/templates/mainview.html index 124af6b6..f3fd5953 100644 --- a/plugins/tasklist/skins/larry/templates/mainview.html +++ b/plugins/tasklist/skins/larry/templates/mainview.html @@ -51,9 +51,10 @@

diff --git a/plugins/tasklist/tasklist.js b/plugins/tasklist/tasklist.js index d5a5778a..7743b847 100644 --- a/plugins/tasklist/tasklist.js +++ b/plugins/tasklist/tasklist.js @@ -116,6 +116,7 @@ function rcube_tasklist_ui(settings) this.quicksearch = quicksearch; this.reset_search = reset_search; this.expand_collapse = expand_collapse; + this.list_delete = list_delete; this.list_remove = list_remove; this.list_edit_dialog = list_edit_dialog; this.unlock_saving = unlock_saving; @@ -154,7 +155,8 @@ function rcube_tasklist_ui(settings) }); tasklists_widget.addEventListener('select', function(node) { var id = $(this).data('id'); - rcmail.enable_command('list-edit', 'list-remove', 'list-import', me.tasklists[node.id].editable); + rcmail.enable_command('list-edit', 'list-delete', 'list-import', me.tasklists[node.id].editable); + rcmail.enable_command('list-remove', me.tasklists[node.id] && me.tasklists[node.id].removable); me.selected_list = node.id; }); tasklists_widget.addEventListener('subscribe', function(p) { @@ -2560,17 +2562,29 @@ function rcube_tasklist_ui(settings) /** * */ - function list_remove(id) + function list_delete(id) { var list = me.tasklists[id]; if (list && !list.norename && confirm(rcmail.gettext(list.children ? 'deletelistconfirmrecursive' : 'deletelistconfirm', 'tasklist'))) { saving_lock = rcmail.set_busy(true, 'tasklist.savingdata'); - rcmail.http_post('tasklist', { action:'remove', l:{ id:list.id } }); + rcmail.http_post('tasklist', { action:'delete', l:{ id:list.id } }); return true; } return false; } + /** + * + */ + function list_remove(id) + { + var list = me.tasklists[id]; + if (list && list.removable) { + destroy_list(list); + rcmail.http_post('tasklist', { action:'subscribe', l:{ id:list.id, active:0, permanent:0, recursive:1 } }); + } + } + /** * Callback from server to finally remove the given list */ @@ -2877,6 +2891,7 @@ window.rcmail && rcmail.addEventListener('init', function(evt) { rcmail.register_command('list-create', function(){ rctasks.list_edit_dialog(null); }, true); rcmail.register_command('list-edit', function(){ rctasks.list_edit_dialog(rctasks.selected_list); }, false); + rcmail.register_command('list-delete', function(){ rctasks.list_delete(rctasks.selected_list); }, false); rcmail.register_command('list-remove', function(){ rctasks.list_remove(rctasks.selected_list); }, false); rcmail.register_command('search', function(){ rctasks.quicksearch(); }, true); diff --git a/plugins/tasklist/tasklist.php b/plugins/tasklist/tasklist.php index fb881391..5b8e6ee6 100644 --- a/plugins/tasklist/tasklist.php +++ b/plugins/tasklist/tasklist.php @@ -837,8 +837,8 @@ class tasklist extends rcube_plugin $success = $this->driver->subscribe_list($list); break; - case 'remove': - if (($success = $this->driver->remove_list($list))) + case 'delete': + if (($success = $this->driver->delete_list($list))) $this->rc->output->command('plugin.destroy_tasklist', $list); break;