Branch 'roundcubemail-plugins-kolab-3.1' - 5 commits - plugins/tasklist

Thomas Brüderli bruederli at kolabsys.com
Thu May 1 18:07:45 CEST 2014


 plugins/tasklist/drivers/database/tasklist_database_driver.php |    7 
 plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php       |  146 +++++++++-
 plugins/tasklist/drivers/tasklist_driver.php                   |   10 
 plugins/tasklist/localization/de_CH.inc                        |    1 
 plugins/tasklist/localization/de_DE.inc                        |   16 -
 plugins/tasklist/localization/en_US.inc                        |    1 
 plugins/tasklist/skins/larry/tasklist.css                      |   17 +
 plugins/tasklist/skins/larry/templates/kolabacl.html           |   26 +
 plugins/tasklist/skins/larry/templates/mainview.html           |    9 
 plugins/tasklist/tasklist.js                                   |  103 ++++---
 plugins/tasklist/tasklist.php                                  |    7 
 plugins/tasklist/tasklist_ui.php                               |    5 
 12 files changed, 280 insertions(+), 68 deletions(-)

New commits:
commit 5be7b5bb93ab30b22d7537c42cc18e4acebd7906
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Thu May 1 18:07:14 2014 +0200

    Fix pass-by-reference warnings

diff --git a/plugins/tasklist/drivers/database/tasklist_database_driver.php b/plugins/tasklist/drivers/database/tasklist_database_driver.php
index 7d4c0f1..db05bde 100644
--- a/plugins/tasklist/drivers/database/tasklist_database_driver.php
+++ b/plugins/tasklist/drivers/database/tasklist_database_driver.php
@@ -89,7 +89,8 @@ class tasklist_database_driver extends tasklist_driver
     {
       // attempt to create a default list for this user
       if (empty($this->lists)) {
-        if ($this->create_list(array('name' => 'Default', 'color' => '000000')))
+        $prop = array('name' => 'Default', 'color' => '000000');
+        if ($this->create_list($prop))
           $this->_read_lists();
       }
 
diff --git a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
index 5767fa0..197d17b 100644
--- a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
+++ b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
@@ -156,7 +156,8 @@ class tasklist_kolab_driver extends tasklist_driver
     {
         // attempt to create a default list for this user
         if (empty($this->lists)) {
-            if ($this->create_list(array('name' => 'Tasks', 'color' => '0000CC', 'default' => true)))
+            $prop = array('name' => 'Tasks', 'color' => '0000CC', 'default' => true);
+            if ($this->create_list($prop))
                 $this->_read_lists(true);
         }
 


commit 6c0372f263dbebcf00457b3196d685b6dfe1ae3b
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Tue Apr 22 19:41:17 2014 +0200

    Remove deleted lists from selector in task edit dialog, too (#2985)

diff --git a/plugins/tasklist/tasklist.js b/plugins/tasklist/tasklist.js
index 37e94a7..0b0a561 100644
--- a/plugins/tasklist/tasklist.js
+++ b/plugins/tasklist/tasklist.js
@@ -1764,7 +1764,7 @@ function rcube_tasklist_ui(settings)
         var li, delete_ids = [],
             list = me.tasklists[prop.id];
 
-            // find sub-lists
+        // find sub-lists
         if (list && list.children) {
             for (var child_id in me.tasklists) {
                 if (String(child_id).indexOf(prop.id) == 0)
@@ -1790,6 +1790,7 @@ function rcube_tasklist_ui(settings)
                 unlock_saving();
                 remove_tasks(list.id);
             }
+            $("#taskedit-tasklist option[value='"+id+"']").remove();
         }
     }
 


commit ed5dd590d6956d1ec9823fed202ce5a2f8c18f10
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Tue Apr 22 19:35:48 2014 +0200

    Add new list to list selector in task edit dialog, too (#2985)

diff --git a/plugins/tasklist/tasklist.js b/plugins/tasklist/tasklist.js
index 905158b..37e94a7 100644
--- a/plugins/tasklist/tasklist.js
+++ b/plugins/tasklist/tasklist.js
@@ -1810,6 +1810,9 @@ function rcube_tasklist_ui(settings)
         $(rcmail.gui_objects.folderlist).append(li);
         me.tasklists[prop.id] = prop;
         init_tasklist_li(li.get(0), prop.id);
+
+        // append to list selector in task edit dialog, too (#2985)
+        $('<option>').attr('value', prop.id).html(Q(prop.name)).appendTo('#taskedit-tasklist');
     }
 
     /**


commit 57a23526c54eb9dbaa7b786bcf6422c94aa7b5aa
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Wed Apr 9 12:05:56 2014 +0200

    Reload task view after renaming folders

diff --git a/plugins/tasklist/drivers/database/tasklist_database_driver.php b/plugins/tasklist/drivers/database/tasklist_database_driver.php
index 3c5ad38..7d4c0f1 100644
--- a/plugins/tasklist/drivers/database/tasklist_database_driver.php
+++ b/plugins/tasklist/drivers/database/tasklist_database_driver.php
@@ -103,7 +103,7 @@ class tasklist_database_driver extends tasklist_driver
      * @return mixed ID of the new list on success, False on error
      * @see tasklist_driver::create_list()
      */
-    public function create_list($prop)
+    public function create_list(&$prop)
     {
         $result = $this->rc->db->query(
             "INSERT INTO " . $this->db_lists . "
@@ -128,7 +128,7 @@ class tasklist_database_driver extends tasklist_driver
      * @return boolean True on success, Fales on failure
      * @see tasklist_driver::edit_list()
      */
-    public function edit_list($prop)
+    public function edit_list(&$prop)
     {
         $query = $this->rc->db->query(
             "UPDATE " . $this->db_lists . "
diff --git a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
index 3954a27..5767fa0 100644
--- a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
+++ b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
@@ -172,7 +172,7 @@ class tasklist_kolab_driver extends tasklist_driver
      *  showalarms: True if alarms are enabled
      * @return mixed ID of the new list on success, False on error
      */
-    public function create_list($prop)
+    public function create_list(&$prop)
     {
         $prop['type'] = 'task' . ($prop['default'] ? '.default' : '');
         $prop['active'] = true; // activate folder by default
@@ -195,6 +195,10 @@ class tasklist_kolab_driver extends tasklist_driver
         if ($prefs['kolab_tasklists'][$id])
             $this->rc->user->save_prefs($prefs);
 
+        // force page reload to properly render folder hierarchy
+        if (!empty($prop['parent']))
+            $prop['_reload'] = true;
+
         return $id;
     }
 
@@ -208,7 +212,7 @@ class tasklist_kolab_driver extends tasklist_driver
      *  showalarms: True if alarms are enabled (if supported)
      * @return boolean True on success, Fales on failure
      */
-    public function edit_list($prop)
+    public function edit_list(&$prop)
     {
         if ($prop['id'] && ($folder = $this->folders[$prop['id']])) {
             $prop['oldname'] = $folder->name;
@@ -233,6 +237,10 @@ class tasklist_kolab_driver extends tasklist_driver
             if ($prefs['kolab_tasklists'][$id])
                 $this->rc->user->save_prefs($prefs);
 
+            // force page reload if folder name/hierarchy changed
+            if ($newfolder != $prop['oldname'])
+                $prop['_reload'] = true;
+
             return $id;
         }
 
diff --git a/plugins/tasklist/drivers/tasklist_driver.php b/plugins/tasklist/drivers/tasklist_driver.php
index 9e6fee8..ee5a161 100644
--- a/plugins/tasklist/drivers/tasklist_driver.php
+++ b/plugins/tasklist/drivers/tasklist_driver.php
@@ -75,7 +75,7 @@ abstract class tasklist_driver
      *  showalarms: True if alarms are enabled
      * @return mixed ID of the new list on success, False on error
      */
-    abstract function create_list($prop);
+    abstract function create_list(&$prop);
 
     /**
      * Update properties of an existing tasklist
@@ -87,7 +87,7 @@ abstract class tasklist_driver
      *  showalarms: True if alarms are enabled (if supported)
      * @return boolean True on success, Fales on failure
      */
-    abstract function edit_list($prop);
+    abstract function edit_list(&$prop);
 
     /**
      * Set active/subscribed state of a list
diff --git a/plugins/tasklist/tasklist.js b/plugins/tasklist/tasklist.js
index d23ecd4..905158b 100644
--- a/plugins/tasklist/tasklist.js
+++ b/plugins/tasklist/tasklist.js
@@ -1798,6 +1798,11 @@ function rcube_tasklist_ui(settings)
      */
     function insert_list(prop)
     {
+        if (prop._reload) {
+            rcmail.redirect(rcmail.url(''));
+            return;
+        }
+
         var li = $('<li>').attr('id', 'rcmlitasklist'+prop.id)
             .append('<input type="checkbox" name="_list[]" value="'+prop.id+'" checked="checked" />')
             .append('<span class="handle"> </span>')
@@ -1815,11 +1820,17 @@ function rcube_tasklist_ui(settings)
         var id = prop.oldid || prop.id,
             li = rcmail.get_folder_li(id, 'rcmlitasklist');
 
+        if (prop._reload) {
+            rcmail.redirect(rcmail.url(''));
+            return;
+        }
+
         if (me.tasklists[id] && li) {
             delete me.tasklists[id];
             me.tasklists[prop.id] = prop;
-            $(li).data('id', prop.id);
-            $('#'+li.id+' input').data('id', prop.id);
+            $(li).data('id', prop.id)
+                .attr('id', 'rcmlitasklist'+prop.id)
+                .find('input').data('id', prop.id);
             $('.listname', li).html(Q(prop.name));
         }
     }


commit f5870e3b35a0c04a9c734baeb65980f1eab1f509
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Wed Apr 9 11:12:50 2014 +0200

    Include sharing (acl) tab in task list edit dialog
    
    Conflicts:
    	plugins/tasklist/localization/de_CH.inc
    	plugins/tasklist/localization/de_DE.inc
    	plugins/tasklist/tasklist.js

diff --git a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
index 96a4288..3954a27 100644
--- a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
+++ b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
@@ -50,6 +50,8 @@ class tasklist_kolab_driver extends tasklist_driver
         if (kolab_storage::$version == '2.0') {
             $this->alarm_absolute = false;
         }
+
+        $this->plugin->register_action('folder-acl', array($this, 'folder_acl'));
     }
 
     /**
@@ -862,21 +864,132 @@ class tasklist_kolab_driver extends tasklist_driver
     /**
      * 
      */
-    public function tasklist_edit_form($fieldprop)
+    public function tasklist_edit_form($action, $list, $fieldprop)
     {
-        $select = kolab_storage::folder_selector('task', array('name' => 'parent', 'id' => 'taskedit-parentfolder'), null);
-        $fieldprop['parent'] = array(
-            'id' => 'taskedit-parentfolder',
-            'label' => $this->plugin->gettext('parentfolder'),
-            'value' => $select->show(''),
+        if ($list['id'] && ($list = $this->lists[$list['id']])) {
+            $folder_name = $this->folders[$list['id']]->name; // UTF7
+        }
+        else {
+            $folder_name = '';
+        }
+
+        $storage = $this->rc->get_storage();
+        $delim   = $storage->get_hierarchy_delimiter();
+        $form    = array();
+
+        if (strlen($folder_name)) {
+            $path_imap = explode($delim, $folder_name);
+            array_pop($path_imap);  // pop off name part
+            $path_imap = implode($path_imap, $delim);
+
+            $options = $storage->folder_info($folder_name);
+        }
+        else {
+            $path_imap = '';
+        }
+
+        $hidden_fields[] = array('name' => 'oldname', 'value' => $folder_name);
+
+        // folder name (default field)
+        $input_name = new html_inputfield(array('name' => 'name', 'id' => 'taskedit-tasklistame', 'size' => 20));
+        $fieldprop['name']['value'] = $input_name->show($list['editname'], array('disabled' => ($options['norename'] || $options['protected'])));
+
+        // prevent user from moving folder
+        if (!empty($options) && ($options['norename'] || $options['protected'])) {
+            $hidden_fields[] = array('name' => 'parent', 'value' => $path_imap);
+        }
+        else {
+            $select = kolab_storage::folder_selector('task', array('name' => 'parent', 'id' => 'taskedit-parentfolder'), $folder_name);
+            $fieldprop['parent'] = array(
+                'id'    => 'taskedit-parentfolder',
+                'label' => $this->plugin->gettext('parentfolder'),
+                'value' => $select->show($path_imap),
+            );
+        }
+
+        // General tab
+        $form['properties'] = array(
+            'name' => $this->rc->gettext('properties'),
+            'fields' => array(),
         );
 
-        $formfields = array();
         foreach (array('name','parent','showalarms') as $f) {
-            $formfields[$f] = $fieldprop[$f];
+            $form['properties']['fields'][$f] = $fieldprop[$f];
+        }
+
+        // add folder ACL tab
+        if ($action != 'form-new') {
+            $form['sharing'] = array(
+                'name'    => Q($this->plugin->gettext('tabsharing')),
+                'content' => html::tag('iframe', array(
+                    'src' => $this->rc->url(array('_action' => 'folder-acl', '_folder' => $folder_name, 'framed' => 1)),
+                    'width' => '100%',
+                    'height' => 280,
+                    'border' => 0,
+                    'style' => 'border:0'),
+                '')
+            );
+        }
+
+        $form_html = '';
+        if (is_array($hidden_fields)) {
+            foreach ($hidden_fields as $field) {
+                $hiddenfield = new html_hiddenfield($field);
+                $form_html .= $hiddenfield->show() . "\n";
+            }
         }
 
-        return parent::tasklist_edit_form($formfields);
+        // create form output
+        foreach ($form as $tab) {
+            if (is_array($tab['fields']) && empty($tab['content'])) {
+                $table = new html_table(array('cols' => 2));
+                foreach ($tab['fields'] as $col => $colprop) {
+                    $colprop['id'] = '_'.$col;
+                    $label = !empty($colprop['label']) ? $colprop['label'] : $this->plugin->gettext($col);
+
+                    $table->add('title', html::label($colprop['id'], Q($label)));
+                    $table->add(null, $colprop['value']);
+                }
+                $content = $table->show();
+            }
+            else {
+                $content = $tab['content'];
+            }
+
+            if (!empty($content)) {
+                $form_html .= html::tag('fieldset', null, html::tag('legend', null, Q($tab['name'])) . $content) . "\n";
+            }
+        }
+
+        return $form_html;
+    }
+
+    /**
+     * Handler to render ACL form for a notes folder
+     */
+    public function folder_acl()
+    {
+        $this->plugin->require_plugin('acl');
+        $this->rc->output->add_handler('folderacl', array($this, 'folder_acl_form'));
+        $this->rc->output->send('tasklist.kolabacl');
     }
 
+    /**
+     * Handler for ACL form template object
+     */
+    public function folder_acl_form()
+    {
+        $folder = rcube_utils::get_input_value('_folder', RCUBE_INPUT_GPC);
+
+        if (strlen($folder)) {
+            $storage = $this->rc->get_storage();
+            $options = $storage->folder_info($folder);
+
+            // get sharing UI from acl plugin
+            $acl = $this->rc->plugins->exec_hook('folder_form',
+                array('form' => array(), 'options' => $options, 'name' => $folder));
+        }
+
+        return $acl['form']['sharing']['content'] ?: html::div('hint', $this->plugin->gettext('aclnorights'));
+    }
 }
diff --git a/plugins/tasklist/drivers/tasklist_driver.php b/plugins/tasklist/drivers/tasklist_driver.php
index cc9a409..9e6fee8 100644
--- a/plugins/tasklist/drivers/tasklist_driver.php
+++ b/plugins/tasklist/drivers/tasklist_driver.php
@@ -260,10 +260,12 @@ abstract class tasklist_driver
      * Build the edit/create form for lists.
      * This gives the drivers the opportunity to add more list properties
      *
-     * @param array List with form fields to be rendered
+     * @param string  The action called this form
+     * @param array   Tasklist properties
+     * @param array   List with form fields to be rendered
      * @return string HTML content of the form
      */
-    public function tasklist_edit_form($formfields)
+    public function tasklist_edit_form($action, $list, $formfields)
     {
         $html = '';
         foreach ($formfields as $field) {
diff --git a/plugins/tasklist/localization/de_CH.inc b/plugins/tasklist/localization/de_CH.inc
index ab9a999..2534c0f 100644
--- a/plugins/tasklist/localization/de_CH.inc
+++ b/plugins/tasklist/localization/de_CH.inc
@@ -68,3 +68,4 @@ $labels['deletetasktconfirm'] = 'Möchten Sie diese Aufgabe wirklich löschen?';
 $labels['deleteparenttasktconfirm'] = 'Möchten Sie diese Aufgabe inklusive aller Teilaufgaben wirklich löschen?';
 $labels['deletelistconfirm'] = 'Möchten Sie diese Liste mit allen Aufgaben wirklich löschen?';
 $labels['deletelistconfirmrecursive'] = 'Möchten Sie diese Liste mit allen Aufgaben und Unter-Listen wirklich löschen?';
+$labels['aclnorights'] = 'Der Zugriff auf diese Liste erfordert Administrator-Rechte.';
diff --git a/plugins/tasklist/localization/de_DE.inc b/plugins/tasklist/localization/de_DE.inc
index b6d1cc3..ed0c975 100644
--- a/plugins/tasklist/localization/de_DE.inc
+++ b/plugins/tasklist/localization/de_DE.inc
@@ -60,11 +60,11 @@ $labels['this'] = 'diesen';
 $labels['next'] = 'nächsten';
 
 // mesages
-$labels['savingdata'] = 'Daten werden gespeichert...';
-$labels['errorsaving'] = 'Fehler beim Speichern.';
-$labels['notasksfound'] = 'Für die aktuellen Kriterien wurden keine Aufgaben gefunden.';
-$labels['invalidstartduedates'] = 'Beginn der Aufgabe darf nicht größer als das Enddatum sein.';
-$labels['deletetasktconfirm'] = 'Möchten Sie diese Aufgabe wirklich löschen?';
-$labels['deleteparenttasktconfirm'] = 'Möchten Sie diese Aufgabe inklusive aller Teilaufgaben wirklich löschen?';
-$labels['deletelistconfirm'] = 'Möchten Sie diese Liste mit allen Aufgaben wirklich löschen?';
-$labels['deletelistconfirmrecursive'] = 'Möchten Sie diese Liste mit allen Aufgaben und Unter-Listen wirklich löschen?';
\ No newline at end of file
+$labels['savingdata'] = 'Daten werden gespeichert…';
+$labels['errorsaving'] = 'Daten konnten nicht gespeichert werden.';
+$labels['notasksfound'] = 'Keine Aufgabe erfüllt die angelegten Kriterien';
+$labels['invalidstartduedates'] = 'Das Anfangsdatum muss vor dem Fälligkeitsdatum liegen.';
+$labels['deletetasktconfirm'] = 'Diese Aufgabe wirklich löschen?';
+$labels['deleteparenttasktconfirm'] = 'Diese Aufgabe wirklich mit allen Teilaufgaben löschen?';
+$labels['deletelistconfirm'] = 'Diese Aufgabenliste wirklich mit allen Aufgaben löschen?';
+$labels['aclnorights'] = 'Der Zugriff auf diese Liste erfordert Administrator-Rechte.';
diff --git a/plugins/tasklist/localization/en_US.inc b/plugins/tasklist/localization/en_US.inc
index ba331be..91360ce 100644
--- a/plugins/tasklist/localization/en_US.inc
+++ b/plugins/tasklist/localization/en_US.inc
@@ -69,3 +69,4 @@ $labels['deletetasktconfirm'] = 'Do you really want to delete this task?';
 $labels['deleteparenttasktconfirm'] = 'Do you really want to delete this task and all its subtasks?';
 $labels['deletelistconfirm'] = 'Do you really want to delete this list with all its tasks?';
 $labels['deletelistconfirmrecursive'] = 'Do you really want to delete this list with all its sub-lists and tasks?';
+$labels['aclnorights'] = 'You do not have administrator rights on this task list.';
diff --git a/plugins/tasklist/skins/larry/tasklist.css b/plugins/tasklist/skins/larry/tasklist.css
index 0db39c4..5c808ab 100644
--- a/plugins/tasklist/skins/larry/tasklist.css
+++ b/plugins/tasklist/skins/larry/tasklist.css
@@ -834,6 +834,23 @@ label.block {
 	outline: none;
 }
 
+.tasklistview .uidialog .tabbed {
+	margin: -12px -8px 0 -8px;
+	min-width: 600px;
+}
+
+.tasklistview .uidialog .propform fieldset.tab {
+	display: block;
+	background: #efefef;
+	margin-top: 0.5em;
+	padding: 0.5em 1em;
+	min-height: 290px;
+}
+
+.tasklistview .uidialog .propform #taskedit-tasklistame {
+	width: 20em;
+}
+
 
 /**
  * Styles of the tagedit inputsforms
diff --git a/plugins/tasklist/skins/larry/templates/kolabacl.html b/plugins/tasklist/skins/larry/templates/kolabacl.html
new file mode 100644
index 0000000..1cf26fc
--- /dev/null
+++ b/plugins/tasklist/skins/larry/templates/kolabacl.html
@@ -0,0 +1,26 @@
+<roundcube:object name="doctype" value="html5" />
+<html>
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<style type="text/css" media="screen">
+
+body.aclform {
+	background: #efefef;
+	margin: 0;
+}
+
+body.aclform .hint {
+	margin: 1em;
+}
+
+</style>
+</head>
+<body class="iframe aclform">
+
+<roundcube:object name="folderacl" />
+
+<roundcube:include file="/includes/footer.html" />
+
+</body>
+</html>
\ No newline at end of file
diff --git a/plugins/tasklist/skins/larry/templates/mainview.html b/plugins/tasklist/skins/larry/templates/mainview.html
index 40ae7bd..30fae50 100644
--- a/plugins/tasklist/skins/larry/templates/mainview.html
+++ b/plugins/tasklist/skins/larry/templates/mainview.html
@@ -146,7 +146,8 @@
 <roundcube:include file="/templates/taskedit.html" />
 
 <div id="tasklistform" class="uidialog">
-	<roundcube:object name="plugin.tasklist_editform" />
+	<roundcube:label name="loading" />
+	<roundcube:container name="tasklistform" id="tasklistform" />
 </div>
 
 <script type="text/javascript">
@@ -156,6 +157,12 @@ var UI = new rcube_mail_ui();
 
 $(document).ready(function(e){
 	UI.init();
+
+	rcmail.addEventListener('tasklist_editform_load', function(e){
+		if (rcmail.env.tasklist_driver == 'kolab')
+			UI.init_tabs($('#tasklistform > form').addClass('propform tabbed'));
+	});
+
 	new rcube_splitter({ id:'taskviewsplitter', p1:'#sidebar', p2:'#mainview-right',
 		orientation:'v', relative:true, start:240, min:180, size:16, offset:2 }).init();
 	new rcube_splitter({ id:'taskviewsplitterv', p1:'#tagsbox', p2:'#tasklistsbox',
diff --git a/plugins/tasklist/tasklist.js b/plugins/tasklist/tasklist.js
index 41ec403..d23ecd4 100644
--- a/plugins/tasklist/tasklist.js
+++ b/plugins/tasklist/tasklist.js
@@ -1670,8 +1670,7 @@ function rcube_tasklist_ui(settings)
     function list_edit_dialog(id)
     {
         var list = me.tasklists[id],
-            $dialog = $('#tasklistform');
-            editform = $('#tasklisteditform');
+            $dialog = $(rcmail.gui_containers.tasklistform);
 
         if ($dialog.is(':ui-dialog'))
             $dialog.dialog('close');
@@ -1679,50 +1678,67 @@ function rcube_tasklist_ui(settings)
         if (!list)
             list = { name:'', editable:true, showalarms:true };
 
-        // fill edit form
-        var name = $('#taskedit-tasklistame').prop('disabled', list.norename||false).val(list.editname || list.name),
-            alarms = $('#taskedit-showalarms').prop('checked', list.showalarms).get(0),
-            parent = $('#taskedit-parentfolder').val(list.parentfolder);
+        var editform, name, alarms;
+
+        $dialog.html(rcmail.get_label('loading'));
+        $.ajax({
+            type: 'GET',
+            dataType: 'html',
+            url: rcmail.url('tasklist'),
+            data: { action:(list.id ? 'form-edit' : 'form-new'), l:{ id:list.id } },
+            success: function(data) {
+                $dialog.html(data);
+                rcmail.triggerEvent('tasklist_editform_load', list);
+
+                // resize and reposition dialog window
+                editform = $('#tasklisteditform');
+                me.dialog_resize(rcmail.gui_containers.tasklistform, editform.height(), editform.width());
+
+                name = $('#taskedit-tasklistame').prop('disabled', list.norename||false).val(list.editname || list.name);
+                alarms = $('#taskedit-showalarms').prop('checked', list.showalarms).get(0);
+                name.select();
+            }
+        });
 
         // dialog buttons
         var buttons = {};
 
         buttons[rcmail.gettext('save','tasklist')] = function() {
-          // do some input validation
-          if (!name.val() || name.val().length < 2) {
-            alert(rcmail.gettext('invalidlistproperties', 'tasklist'));
-            name.select();
-            return;
-          }
+            // do some input validation
+            if (!name.val() || name.val().length < 2) {
+                alert(rcmail.gettext('invalidlistproperties', 'tasklist'));
+                name.select();
+                return;
+            }
 
-          // post data to server
-          var data = editform.serializeJSON();
-          if (list.id)
-            data.id = list.id;
-          if (alarms)
-            data.showalarms = alarms.checked ? 1 : 0;
-        if (parent.length)
-            data.parentfolder = $('option:selected', parent).val();
-
-          saving_lock = rcmail.set_busy(true, 'tasklist.savingdata');
-          rcmail.http_post('tasklist', { action:(list.id ? 'edit' : 'new'), l:data });
-          $dialog.dialog('close');
+            // post data to server
+            var data = editform.serializeJSON();
+            if (list.id)
+                data.id = list.id;
+            if (alarms)
+                data.showalarms = alarms.checked ? 1 : 0;
+
+            saving_lock = rcmail.set_busy(true, 'tasklist.savingdata');
+            rcmail.http_post('tasklist', { action:(list.id ? 'edit' : 'new'), l:data });
+            $dialog.dialog('close');
         };
 
         buttons[rcmail.gettext('cancel','tasklist')] = function() {
-          $dialog.dialog('close');
+            $dialog.dialog('close');
         };
 
         // open jquery UI dialog
         $dialog.dialog({
-          modal: true,
-          resizable: true,
-          closeOnEscape: false,
-          title: rcmail.gettext((list.id ? 'editlist' : 'createlist'), 'tasklist'),
-          close: function() { $dialog.dialog('destroy').hide(); },
-          buttons: buttons,
-          minWidth: 400,
-          width: 420
+            modal: true,
+            resizable: true,
+            closeOnEscape: false,
+            title: rcmail.gettext((list.id ? 'editlist' : 'createlist'), 'tasklist'),
+            close: function() {
+                $dialog.dialog('destroy').hide();
+            },
+            buttons: buttons,
+            minWidth: 400,
+            width: 420
         }).show();
     }
 
diff --git a/plugins/tasklist/tasklist.php b/plugins/tasklist/tasklist.php
index 2758626..6f77734 100644
--- a/plugins/tasklist/tasklist.php
+++ b/plugins/tasklist/tasklist.php
@@ -478,13 +478,18 @@ class tasklist extends rcube_plugin
     public function tasklist_action()
     {
         $action = get_input_value('action', RCUBE_INPUT_GPC);
-        $list  = get_input_value('l', RCUBE_INPUT_POST, true);
+        $list  = get_input_value('l', RCUBE_INPUT_GPC, true);
         $success = false;
 
         if (isset($list['showalarms']))
           $list['showalarms'] = intval($list['showalarms']);
 
         switch ($action) {
+        case 'form-new':
+        case 'form-edit':
+            echo $this->ui->tasklist_editform($action, $list);
+            exit;
+
         case 'new':
             $list += array('showalarms' => true, 'active' => true, 'editable' => true);
             if ($insert_id = $this->driver->create_list($list)) {
diff --git a/plugins/tasklist/tasklist_ui.php b/plugins/tasklist/tasklist_ui.php
index 21faba3..d3537ae 100644
--- a/plugins/tasklist/tasklist_ui.php
+++ b/plugins/tasklist/tasklist_ui.php
@@ -70,7 +70,6 @@ class tasklist_ui
         $this->plugin->register_handler('plugin.category_select', array($this, 'category_select'));
         $this->plugin->register_handler('plugin.searchform', array($this->rc->output, 'search_form'));
         $this->plugin->register_handler('plugin.quickaddform', array($this, 'quickadd_form'));
-        $this->plugin->register_handler('plugin.tasklist_editform', array($this, 'tasklist_editform'));
         $this->plugin->register_handler('plugin.tasks', array($this, 'tasks_resultview'));
         $this->plugin->register_handler('plugin.tagslist', array($this, 'tagslist'));
         $this->plugin->register_handler('plugin.tags_editline', array($this, 'tags_editline'));
@@ -146,7 +145,7 @@ class tasklist_ui
     }
 
 
-    function tasklist_editform($attrib = array())
+    function tasklist_editform($action, $list = array())
     {
         $fields = array(
             'name' => array(
@@ -169,7 +168,7 @@ class tasklist_ui
         );
 
         return html::tag('form', array('action' => "#", 'method' => "post", 'id' => 'tasklisteditform'),
-            $this->plugin->driver->tasklist_edit_form($fields)
+            $this->plugin->driver->tasklist_edit_form($action, $list, $fields)
         );
     }
 




More information about the commits mailing list