From 27df671c919da29acc98fad7423a9f4029af8f08 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Mon, 20 Jun 2016 10:09:36 +0200 Subject: [PATCH] Implemented Tasks Export (T147, #3861) Summary: Fixes T147 Reviewers: #roundcube_kolab_plugins_developers Maniphest Tasks: T147 Differential Revision: https://git.kolab.org/D165 --- .../database/tasklist_database_driver.php | 4 + .../drivers/kolab/tasklist_kolab_driver.php | 5 + plugins/tasklist/localization/en_US.inc | 4 + plugins/tasklist/skins/larry/buttons.png | Bin 3264 -> 0 bytes .../tasklist/skins/larry/images/buttons.png | Bin 0 -> 4645 bytes .../skins/larry/{ => images}/sprites.png | Bin plugins/tasklist/skins/larry/tasklist.css | 36 +++++--- .../skins/larry/templates/mainview.html | 5 + plugins/tasklist/tasklist.js | 87 ++++++++++++++++++ plugins/tasklist/tasklist.php | 74 +++++++++++++++ plugins/tasklist/tasklist_ui.php | 42 ++++++++- source/tasklist_buttons.psd | Bin 0 -> 530092 bytes source/tasklist_sprites.psd | Bin 0 -> 848770 bytes 13 files changed, 244 insertions(+), 13 deletions(-) delete mode 100644 plugins/tasklist/skins/larry/buttons.png create mode 100644 plugins/tasklist/skins/larry/images/buttons.png rename plugins/tasklist/skins/larry/{ => images}/sprites.png (100%) create mode 100644 source/tasklist_buttons.psd create mode 100644 source/tasklist_sprites.psd diff --git a/plugins/tasklist/drivers/database/tasklist_database_driver.php b/plugins/tasklist/drivers/database/tasklist_database_driver.php index 9dac99eb..e6bfb74c 100644 --- a/plugins/tasklist/drivers/database/tasklist_database_driver.php +++ b/plugins/tasklist/drivers/database/tasklist_database_driver.php @@ -332,6 +332,10 @@ class tasklist_database_driver extends tasklist_driver $sql_add .= ' AND changed >= ' . $this->rc->db->quote(date('Y-m-d H:i:s', $filter['since'])); } + if ($filter['uid']) { + $sql_add .= ' AND `uid` IN (' . implode(',', array_map(array($this->rc->db, 'quote'), $filter['uid'])) . ')'); + } + $tasks = array(); if (!empty($list_ids)) { $result = $this->rc->db->query(sprintf( diff --git a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php index 6f62819b..0e32039c 100644 --- a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php +++ b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php @@ -550,6 +550,7 @@ class tasklist_kolab_driver extends tasklist_driver * - from: Date range start as string (Y-m-d) * - to: Date range end as string (Y-m-d) * - search: Search query string + * - uid: Task UIDs * @param array List of lists to get tasks from * @return array List of tasks records matchin the criteria */ @@ -585,6 +586,10 @@ class tasklist_kolab_driver extends tasklist_driver $query[] = array('changed', '>=', $filter['since']); } + if ($filter['uid']) { + $query[] = array('uid', '=', (array) $filter['uid']); + } + foreach ($lists as $list_id) { if (!$folder = $this->get_folder($list_id)) { continue; diff --git a/plugins/tasklist/localization/en_US.inc b/plugins/tasklist/localization/en_US.inc index 7890683b..e42194c4 100644 --- a/plugins/tasklist/localization/en_US.inc +++ b/plugins/tasklist/localization/en_US.inc @@ -13,6 +13,10 @@ $labels['navtitle'] = 'Tasks'; $labels['lists'] = 'Tasklists'; $labels['list'] = 'Tasklist'; $labels['tags'] = 'Tags'; +$labels['export'] = 'Export'; +$labels['exporttitle'] = 'Export to iCalendar'; +$labels['exportattachments'] = 'With attachments'; +$labels['currentview'] = 'current view'; $labels['tasklistsubscribe'] = 'List permanently'; $labels['listsearchresults'] = 'Available Tasklists'; $labels['findlists'] = 'Find tasklists...'; diff --git a/plugins/tasklist/skins/larry/buttons.png b/plugins/tasklist/skins/larry/buttons.png deleted file mode 100644 index 7f1a2b6331a3f2aae7aff7a3288dc3a052b71fe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3264 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 b>^c4$A%LCdn+#_c00000NkvXXu0mjfVd)QB literal 0 HcmV?d00001 diff --git a/plugins/tasklist/skins/larry/sprites.png b/plugins/tasklist/skins/larry/images/sprites.png similarity index 100% rename from plugins/tasklist/skins/larry/sprites.png rename to plugins/tasklist/skins/larry/images/sprites.png diff --git a/plugins/tasklist/skins/larry/tasklist.css b/plugins/tasklist/skins/larry/tasklist.css index fc7982c8..29777e2b 100644 --- a/plugins/tasklist/skins/larry/tasklist.css +++ b/plugins/tasklist/skins/larry/tasklist.css @@ -11,7 +11,7 @@ */ #taskbar a.button-tasklist span.button-inner { - background-image: url(buttons.png); + background-image: url(images/buttons.png); background-position: 0 0; } @@ -22,10 +22,22 @@ ul.toolbarmenu li span.icon.taskadd, #attachmentmenu li a.tasklistlink span.icon.taskadd { - background-image: url(buttons.png); + background-image: url(images/buttons.png); background-position: -4px -90px; } +#taskstoolbar a.button.export { + background-image: url(images/buttons.png); + background-position: center -179px; + min-width: 50px; + max-width: 70px; +} + +#taskstoolbar a.button.import { + background-image: url(images/buttons.png); + background-position: center -139px; +} + #taskedit.uidialog, .tasklistview div.uidialog { display: none; @@ -296,7 +308,7 @@ ul.toolbarmenu li span.icon.taskadd, overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - background: url(sprites.png) right 20px no-repeat; + background: url(images/sprites.png) right 20px no-repeat; } .quickview-active #tasklistsbox .treelist li input, @@ -341,7 +353,7 @@ ul.toolbarmenu li span.icon.taskadd, height: 16px; padding: 0; margin-right: 4px; - background: url(sprites.png) -200px 0 no-repeat; + background: url(images/sprites.png) -200px 0 no-repeat; overflow: hidden; text-indent: -5000px; cursor: pointer; @@ -461,7 +473,7 @@ ul.toolbarmenu li span.icon.taskadd, } #taskstoolbar a.button.newtask { - background-image: url(buttons.png); + background-image: url(images/buttons.png); background-position: center -53px; } @@ -547,7 +559,7 @@ ul.toolbarmenu li span.icon.taskadd, .buttonbar-right a.iconbutton { padding: 0; - background-image: url(sprites.png); + background-image: url(images/sprites.png); background-position: 0 -238px; } @@ -599,7 +611,7 @@ ul.toolbarmenu li span.icon.taskadd, width: 14px; height: 14px; - background: url(sprites.png) -2px -80px no-repeat; + background: url(images/sprites.png) -2px -80px no-repeat; text-indent: -1000px; overflow: hidden; } @@ -648,7 +660,7 @@ ul.toolbarmenu li span.icon.taskadd, display: inline-block; width: 16px; height: 16px; - background: url(sprites.png) 1000px -3px no-repeat; + background: url(images/sprites.png) 1000px -3px no-repeat; margin: -3px 1em 0 0; vertical-align: middle; cursor: pointer; @@ -730,7 +742,7 @@ ul.toolbarmenu li span.icon.taskadd, right: 6px; width: 18px; height: 18px; - background: url(sprites.png) 1000px -80px no-repeat; + background: url(images/sprites.png) 1000px -80px no-repeat; text-indent: -5000px; overflow: hidden; cursor: pointer; @@ -772,7 +784,7 @@ ul.toolbarmenu li span.expand, ul.toolbarmenu li span.collapse, ul.toolbarmenu li span.history, ul.toolbarmenu.iconized .selected span.icon { - background-image: url(sprites.png); + background-image: url(images/sprites.png); } ul.toolbarmenu li span.add { @@ -1162,7 +1174,7 @@ label.block { #taskedit-links .attachmentslist li.message.eml, #task-links .attachmentslist li.message.eml { - background-image: url(sprites.png); + background-image: url(images/sprites.png); background-position: -2px -388px; } @@ -1411,7 +1423,7 @@ div.messagetasklinks::before { left: 8px; width: 18px; height: 18px; - background: url(buttons.png) -6px -115px no-repeat; + background: url(images/buttons.png) -6px -115px no-repeat; } div.messagetasklinks ul.tasklist { diff --git a/plugins/tasklist/skins/larry/templates/mainview.html b/plugins/tasklist/skins/larry/templates/mainview.html index 24f71015..20254c2e 100644 --- a/plugins/tasklist/skins/larry/templates/mainview.html +++ b/plugins/tasklist/skins/larry/templates/mainview.html @@ -17,6 +17,7 @@ @@ -320,6 +321,10 @@ +
+ +
+