Implement folder page.
authorJan Schneider <jan@horde.org>
Mon, 15 Nov 2010 21:59:24 +0000 (22:59 +0100)
committerJan Schneider <jan@horde.org>
Mon, 15 Nov 2010 22:22:14 +0000 (23:22 +0100)
framework/Tree/lib/Horde/Tree/Jquerymobile.php [new file with mode: 0644]
framework/Tree/package.xml
imp/lib/Imap/Tree.php
imp/mobile.php
imp/templates/mobile/folders.html.php
imp/templates/mobile/mailbox.html.php

diff --git a/framework/Tree/lib/Horde/Tree/Jquerymobile.php b/framework/Tree/lib/Horde/Tree/Jquerymobile.php
new file mode 100644 (file)
index 0000000..6c138e5
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+/**
+ * The Horde_Tree_Jquerymobile class provides rendering of a tree as a jQuery
+ * Mobile list view.
+ *
+ * Copyright 2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author   Michael Slusarz <slusarz@horde.org>
+ * @author   Jan Schneider <jan@horde.org>
+ * @category Horde
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @package  Tree
+ */
+class Horde_Tree_Jquerymobile extends Horde_Tree_Base
+{
+    /**
+     * Allowed parameters for nodes.
+     *
+     * @var array
+     */
+    protected $_allowed = array(
+        'icon',
+        'special',
+        'url',
+    );
+
+    /**
+     * Returns the tree.
+     *
+     * @return string  The HTML code of the rendered tree.
+     */
+    public function getTree($static = false)
+    {
+        $tree = '';
+        foreach (array(true, false) as $special) {
+            foreach ($this->_root_nodes as $node_id) {
+                $tree .= $this->_buildTree($node_id, $special);
+            }
+        }
+
+        return $tree;
+    }
+
+    /**
+     * Recursive function to walk through the tree array and build the output.
+     *
+     * @param string $node_id  The Node ID.
+     *
+     * @return string  The tree rendering.
+     */
+    protected function _buildTree($node_id, $special)
+    {
+        $node = $this->_nodes[$node_id];
+        $output = '';
+
+        if ($node['special'] == $special) {
+            $output = '<li>';
+            if (isset($node['extra'][Horde_Tree::EXTRA_LEFT])) {
+                $output .= implode(' ', $node['extra'][Horde_Tree::EXTRA_LEFT]);
+            }
+            if (!empty($node['url'])) {
+                $output .= '<a href="#mailbox" foo="' . strval($node['url']) . '">';
+            }
+            $output .= $this->_getIcon($node_id) . $node['label'];
+            if (!empty($node['url'])) {
+                $output .= '</a>';
+            }
+            if (isset($node['extra'][Horde_Tree::EXTRA_RIGHT])) {
+                $output .= '<span class="ui-li-count">' . implode(' ', $node['extra'][Horde_Tree::EXTRA_RIGHT]) . '</span>';
+            }
+            $output .= '</li>';
+        }
+
+        if (isset($node['children'])) {
+            foreach ($node['children'] as $val) {
+                $output .= $this->_buildTree($val, $special);
+            }
+        }
+
+        return $output;
+    }
+
+    /**
+     * Sets the icon for the node.
+     *
+     * @param string $node_id  The Node ID.
+     *
+     * @return string  The node icon for the tree line.
+     */
+    protected function _getIcon($node_id)
+    {
+        $node = $this->_nodes[$node_id];
+        if (empty($node['icon'])) {
+            return '';
+        }
+        return '<img src="' . $node['icon'] . '" class="ui-li-icon">';
+    }
+
+}
index e300abb..8e0247d 100644 (file)
@@ -1,13 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<package packagerversion="1.4.9" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
-http://pear.php.net/dtd/tasks-1.0.xsd
-http://pear.php.net/dtd/package-2.0
-http://pear.php.net/dtd/package-2.0.xsd">
+<package packagerversion="1.9.1" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
  <name>Tree</name>
  <channel>pear.horde.org</channel>
  <summary>Horde Tree API</summary>
- <description>This package provides a tree view of hierarchical information. It allows for expanding/collapsing of branches and maintains their state.
- </description>
+ <description>This package provides a tree view of hierarchical information. It allows for expanding/collapsing of branches and maintains their state.</description>
  <lead>
   <name>Chuck Hagenbuch</name>
   <user>chuck</user>
@@ -26,7 +22,8 @@ http://pear.php.net/dtd/package-2.0.xsd">
   <email>slusarz@horde.org</email>
   <active>yes</active>
  </lead>
- <date>2009-12-15</date>
+ <date>2010-11-15</date>
+ <time>20:08:17</time>
  <version>
   <release>0.1.0</release>
   <api>0.1.0</api>
@@ -36,27 +33,30 @@ http://pear.php.net/dtd/package-2.0.xsd">
   <api>beta</api>
  </stability>
  <license uri="http://www.gnu.org/copyleft/gpl.html">GPL</license>
- <notes>* Split driver code from main class into Base class.
- * Add simple HTML renderer.
- * Remove dependency on horde/Core.
- * Move javascript renderer to horde/Core.
- * Add Horde_Tree_Exception::.
- * Initial Horde 4 package.
+ <notes>
+* Add jQuery Mobile list view renderer.
+* Split driver code from main class into Base class.
+* Add simple HTML renderer.
+* Remove dependency on horde/Core.
+* Move javascript renderer to horde/Core.
+* Add Horde_Tree_Exception::.
+* Initial Horde 4 package.
  </notes>
  <contents>
-  <dir name="/">
+  <dir baseinstalldir="/" name="/">
    <dir name="lib">
     <dir name="Horde">
      <dir name="Tree">
       <file name="Base.php" role="php" />
       <file name="Exception.php" role="php" />
       <file name="Html.php" role="php" />
+      <file name="Jquerymobile.php" role="php" />
       <file name="Select.php" role="php" />
       <file name="Simplehtml.php" role="php" />
-     </dir> <!-- /lib/Horde/Tree -->
+     </dir> <!-- //lib/Horde/Tree -->
      <file name="Tree.php" role="php" />
-    </dir> <!-- /lib/Horde -->
-   </dir> <!-- /lib -->
+    </dir> <!-- //lib/Horde -->
+   </dir> <!-- //lib -->
   </dir> <!-- / -->
  </contents>
  <dependencies>
@@ -84,16 +84,32 @@ http://pear.php.net/dtd/package-2.0.xsd">
  </dependencies>
  <phprelease>
   <filelist>
-   <install name="lib/Horde/Tree/Base.php" as="Horde/Tree/Base.php" />
-   <install name="lib/Horde/Tree/Exception.php" as="Horde/Tree/Exception.php" />
-   <install name="lib/Horde/Tree/Html.php" as="Horde/Tree/Html.php" />
-   <install name="lib/Horde/Tree/Select.php" as="Horde/Tree/Select.php" />
-   <install name="lib/Horde/Tree/Simplehtml.php" as="Horde/Tree/Simplehtml.php" />
-   <install name="lib/Horde/Tree.php" as="Horde/Tree.php" />
+   <install as="Horde/Tree.php" name="lib/Horde/Tree.php" />
+   <install as="Horde/Tree/Base.php" name="lib/Horde/Tree/Base.php" />
+   <install as="Horde/Tree/Exception.php" name="lib/Horde/Tree/Exception.php" />
+   <install as="Horde/Tree/Html.php" name="lib/Horde/Tree/Html.php" />
+   <install as="Horde/Tree/Jquerymobile.php" name="lib/Horde/Tree/Jquerymobile.php" />
+   <install as="Horde/Tree/Select.php" name="lib/Horde/Tree/Select.php" />
+   <install as="Horde/Tree/Simplehtml.php" name="lib/Horde/Tree/Simplehtml.php" />
   </filelist>
  </phprelease>
  <changelog>
   <release>
+   <version>
+    <release>0.0.1</release>
+    <api>0.0.1</api>
+   </version>
+   <stability>
+    <release>alpha</release>
+    <api>alpha</api>
+   </stability>
+   <date>2003-07-05</date>
+   <license uri="http://www.gnu.org/copyleft/gpl.html">GPL</license>
+   <notes>
+Initial release as a PEAR package
+   </notes>
+  </release>
+  <release>
    <date>2006-05-08</date>
    <time>23:51:48</time>
    <version>
@@ -105,21 +121,28 @@ http://pear.php.net/dtd/package-2.0.xsd">
     <api>alpha</api>
    </stability>
    <license uri="http://www.gnu.org/copyleft/gpl.html">GPL</license>
-   <notes>Converted to package.xml 2.0 for pear.horde.org
+   <notes>
+Converted to package.xml 2.0 for pear.horde.org
    </notes>
   </release>
   <release>
    <version>
-    <release>0.0.1</release>
-    <api>0.0.1</api>
+    <release>0.1.0</release>
+    <api>0.1.0</api>
    </version>
    <stability>
-    <release>alpha</release>
-    <api>alpha</api>
+    <release>beta</release>
+    <api>beta</api>
    </stability>
-   <date>2003-07-05</date>
+   <date>2010-11-15</date>
    <license uri="http://www.gnu.org/copyleft/gpl.html">GPL</license>
-   <notes>Initial release as a PEAR package
+   <notes>
+* Split driver code from main class into Base class.
+ * Add simple HTML renderer.
+ * Remove dependency on horde/Core.
+ * Move javascript renderer to horde/Core.
+ * Add Horde_Tree_Exception::.
+ * Initial Horde 4 package.
    </notes>
   </release>
  </changelog>
index cba4d88..e7d0b3b 100644 (file)
@@ -1519,21 +1519,35 @@ class IMP_Imap_Tree implements ArrayAccess, Iterator, Serializable
                 $is_open = $val->is_open;
                 $label = htmlspecialchars(Horde_String::abbreviate($val->label, 30 - ($val->level * 2)));
                 break;
+
+            case 'Jquerymobile':
+                $is_open = true;
+                $label = htmlspecialchars($val->display);
+                $icon = $val->icon;
+                $params['icon'] = $icon->icon;
+                $params['special'] = $val->special;
+                break;
             }
 
             if (!empty($opts['poll_info']) && $val->polled) {
                 $poll_info = $val->poll_info;
 
-                if ($poll_info->unseen) {
-                    $this->unseen += $poll_info->unseen;
-                    if ($poll_info->recent) {
-                        $recent[$val->value] = $poll_info->recent;
+                if ($opts['render_type'] == 'Jquerymobile') {
+                    if ($poll_info->unseen) {
+                        $after = $poll_info->unseen;
                     }
+                } else {
+                    if ($poll_info->unseen) {
+                        $this->unseen += $poll_info->unseen;
+                        if ($poll_info->recent) {
+                            $recent[$val->value] = $poll_info->recent;
+                        }
 
-                    $label = '<strong>' . $label . '</strong>';
-                }
+                        $label = '<strong>' . $label . '</strong>';
+                    }
 
-                $after = '&nbsp;(' . $poll_info->unseen . '/' . $poll_info->msgs . ')';
+                    $after = '&nbsp;(' . $poll_info->unseen . '/' . $poll_info->msgs . ')';
+                }
             }
 
             if (!$val->container) {
index 48c63d5..31123c7 100644 (file)
  */
 
 require_once dirname(__FILE__) . '/lib/Application.php';
-Horde_Registry::appInit('imp', array('impmode' => 'mimp'));
+Horde_Registry::appInit('imp', array('impmode' => 'imp'));
 
 $view = new Horde_View(array('templatePath' => IMP_TEMPLATES . '/mobile'));
 new Horde_View_Helper_Text($view);
-$view->logout = Horde::getServiceLink('logout')->setRaw(false);
 
+if (empty($conf['user']['allow_folders'])) {
+    $view->allowFolders = false;
+} else {
+    $view->allowFolders = true;
+
+    /* Initialize the IMP_Imap_Tree object. */
+    $imptree = $injector->getInstance('IMP_Imap_Tree');
+    $imptree->setIteratorFilter(IMP_Imap_Tree::FLIST_NOCONTAINER);
+    $tree = $imptree->createTree('mobile_folders', array(
+        'poll_info' => true,
+        'render_type' => 'Jquerymobile'
+    ));
+    $view->tree = $tree->getTree(true);
+}
+
+$view->portal = Horde::getServiceLink('portal', 'horde')->setRaw(false);
+$view->logout = Horde::getServiceLink('logout')->setRaw(false);
 $title = _("Mobile Mail");
 
 require $registry->get('templates', 'horde') . '/common-header-mobile.inc';
 echo $view->render('head.html.php');
-echo $view->render('folders.html.php');
+if (!empty($conf['user']['allow_folders'])) {
+    echo $view->render('folders.html.php');
+}
 echo $view->render('mailbox.html.php');
 echo $view->render('message.html.php');
 require $registry->get('templates', 'horde') . '/common-footer-mobile.inc';
index c1b6781..2f5fe06 100644 (file)
@@ -1,6 +1,6 @@
 <div id="folders" data-role="page">
   <div data-role="header">
-    <a href="<?php echo Horde::getServiceLink('portal', 'horde')?>" class="ui-btn-left"><?php echo _("Portal")?></a>
+    <a href="<?php echo $this->portal ?>" class="ui-btn-left"><?php echo _("Portal")?></a>
     <h1><?php echo _("Folders") ?></h1>
     <?php if ($this->logout): ?>
     <a href="<?php echo $this->logout ?>" rel="external" data-theme="e" data-icon="delete" class="ui-btn-right"><?php echo _("Log out") ?></a>
@@ -8,10 +8,7 @@
   </div>
   <div data-role="content">
     <ul data-role="listview">
-      <li><a href="#mailbox"><img src="themes/graphics/folders/inbox.png" class="ui-li-icon" />Inbox<span class="ui-li-count">99</span></a></li>
-      <li><a href="#mailbox"><img src="themes/graphics/folders/folder.png" class="ui-li-icon" />Another Folder</a></li>
-      <li><a href="#mailbox"><img src="themes/graphics/folders/folder.png" class="ui-li-icon" />&nbsp;&nbsp;Sub folder</a></li>
-      <li><a href="#"><img src="themes/graphics/folders/trash.png" class="ui-li-icon" />Trash</a></li>
+      <?php echo $this->tree ?>
     </ul>
   </div>
 </div>
index 0d0ff51..1c30a09 100644 (file)
@@ -1,5 +1,8 @@
 <div id="mailbox" data-role="page">
   <div data-role="header">
+    <?php if (!$this->allowFolders): ?>
+    <a href="<?php echo $this->portal ?>" class="ui-btn-left"><?php echo _("Portal")?></a>
+    <?php endif ?>
     <h1><?php echo _("Inbox") ?></h1>
     <?php if ($this->logout): ?>
     <a href="<?php echo $this->logout ?>" rel="external" data-theme="e" data-icon="delete" class="ui-btn-right"><?php echo _("Log out") ?></a>