From c49c35ca0fdd4d3972748a8846c0c71f50c80b16 Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Sat, 28 Sep 2013 06:03:20 -0400
Subject: [PATCH] Generate settings tabs with a template object 'settingstabs' and let plugins register themselves there using the 'settings_actions' hook

---
 program/include/rcmail_output_html.php   |    2 
 skins/classic/functions.js               |    4 +-
 program/steps/settings/func.inc          |   57 ++++++++++++++++++++++++++++
 skins/classic/includes/settingstabs.html |    6 +--
 skins/larry/includes/header.html         |    2 
 skins/larry/includes/settingstabs.html   |    4 -
 6 files changed, 64 insertions(+), 11 deletions(-)

diff --git a/program/include/rcmail_output_html.php b/program/include/rcmail_output_html.php
index 6db5593..7cab372 100644
--- a/program/include/rcmail_output_html.php
+++ b/program/include/rcmail_output_html.php
@@ -1055,7 +1055,7 @@
         // these commands can be called directly via url
         $a_static_commands = array('compose', 'list', 'preferences', 'folders', 'identities');
 
-        if (!($attrib['command'] || $attrib['name'])) {
+        if (!($attrib['command'] || $attrib['name'] || $attrib['href'])) {
             return '';
         }
 
diff --git a/program/steps/settings/func.inc b/program/steps/settings/func.inc
index f117017..af278e5 100644
--- a/program/steps/settings/func.inc
+++ b/program/steps/settings/func.inc
@@ -1246,9 +1246,66 @@
             $name_utf8, $display_name, $protected, $class_name);
 }
 
+/**
+ * Render the list of settings sections (AKA tabs)
+ */
+function rcmail_settings_tabs($attrib)
+{
+    global $RCMAIL, $OUTPUT;
+
+    // add default attributes
+    $attrib += array('tagname' => 'span', 'idprefix' => 'settingstab', 'selclass' => 'selected');
+
+    $default_actions = array(
+        array('command' => 'preferences', 'type' => 'link', 'label' => 'preferences', 'title' => 'editpreferences'),
+        array('command' => 'folders',     'type' => 'link', 'label' => 'folders',     'title' => 'managefolders'),
+        array('command' => 'identities',  'type' => 'link', 'label' => 'identities',  'title' => 'manageidentities'),
+    );
+
+    // get all identites from DB and define list of cols to be displayed
+    $plugin = $RCMAIL->plugins->exec_hook('settings_actions', array(
+        'actions' => $default_actions,
+        'attrib' => $attrib,
+    ));
+
+    $attrib = $plugin['attrib'];
+    $tagname = $attrib['tagname'];
+    $tabs = array();
+
+    foreach ($plugin['actions'] as $k => $action) {
+        if (!$action['command'] && !$action['href'] && $action['action']) {
+            $action['href'] = $RCMAIL->url(array('_action' => $action['action']));
+        }
+
+        $button = $OUTPUT->button($action);
+        $attr = $attrib;
+
+        $cmd = $action['action'] ? $action['action'] : $action['command'];
+        $id = $action['id'] ? $action['id'] : $cmd;
+        if (!empty($id)) {
+            $attr['id'] = preg_replace('/[^a-z0-9]/i', '', $attrib['idprefix'] . $id);
+        }
+        $classnames = array($attrib['class']);
+        if (!empty($action['class'])) {
+            $classnames[] = $action['class'];
+        }
+        else if (!empty($cmd)) {
+            $classnames[] = $cmd;
+        }
+        if ($RCMAIL->action == $cmd) {
+            $classnames[] = $attrib['selclass'];
+        }
+        $attr['class'] = join(' ', $classnames);
+        $tabs[] = html::tag($tagname, $attr, $button, html::$common_attrib);
+    }
+
+    return join('', $tabs);
+}
+
 
 // register UI objects
 $OUTPUT->add_handlers(array(
+    'settingstabs' => 'rcmail_settings_tabs',
     'prefsframe' => 'rcmail_preferences_frame',
     'sectionslist' => 'rcmail_sections_list',
     'identitieslist' => 'rcmail_identities_list',
diff --git a/skins/classic/functions.js b/skins/classic/functions.js
index af561c3..4ad1313 100644
--- a/skins/classic/functions.js
+++ b/skins/classic/functions.js
@@ -10,7 +10,7 @@
 {
   var el, cl, container = $('#tabsbar'),
     last_tab = $('span:last', container),
-    tab = '#settingstabdefault',
+    tab = '#settingstabpreferences',
     action = window.rcmail && rcmail.env.action ? rcmail.env.action : null;
 
   // move About tab to the end
@@ -22,7 +22,7 @@
 
   // get selected tab
   if (action)
-    tab = '#settingstab' + (action == 'preferences' ? 'default' : (action.indexOf('identity')>0 ? 'identities' : action.replace(/\./g, '')));
+    tab = '#settingstab' + (action.indexOf('identity')>0 ? 'identities' : action.replace(/\./g, ''));
 
   $(tab).addClass('tablink-selected');
   $('a', tab).removeAttr('onclick').click(function() { return false; });
diff --git a/skins/classic/includes/settingstabs.html b/skins/classic/includes/settingstabs.html
index 0aea80b..a47db22 100644
--- a/skins/classic/includes/settingstabs.html
+++ b/skins/classic/includes/settingstabs.html
@@ -1,8 +1,6 @@
 <div id="tabsbar">
-<span id="settingstabdefault" class="tablink"><roundcube:button command="preferences" type="link" label="preferences" title="editpreferences" /></span>
-<span id="settingstabfolders" class="tablink"><roundcube:button command="folders" type="link" label="folders" title="managefolders" class="tablink" /></span>
-<span id="settingstabidentities" class="tablink"><roundcube:button command="identities" type="link" label="identities" title="manageidentities" class="tablink" /></span>
-<span id="settingstababout" class="tablink"><roundcube:button command="about" type="link" label="about" title="about" class="tablink" /></span>
+<roundcube:object name="settingstabs" class="tablink" selClass="tablink-selected" />
 <roundcube:container name="tabs" id="tabsbar" />
+<span id="settingstababout" class="tablink"><roundcube:button command="about" type="link" label="about" title="about" class="tablink" /></span>
 <script type="text/javascript"> if (window.rcmail) rcmail.add_onload(rcube_init_settings_tabs); </script>
 </div>
diff --git a/skins/larry/includes/header.html b/skins/larry/includes/header.html
index 5a934d8..69e8b8a 100644
--- a/skins/larry/includes/header.html
+++ b/skins/larry/includes/header.html
@@ -29,7 +29,7 @@
 	<roundcube:button command="logout" label="logout" class="button-logout" classSel="button-logout" innerClass="button-inner" />
 	<span class="minmodetoggle"></span>
 	</div>
-	<roundcube:object name="logo" src="/images/roundcube_logo.png" id="toplogo" alt="Logo" onclick="rcmail.command('switch-task','mail');return false;" />
+	<roundcube:object name="logo" src="/images/roundcube_logo.png" id="toplogo" alt="Logo" onclick="if(window.rcmail)rcmail.command('switch-task','mail')" />
 </div>
 <roundcube:endif />
 
diff --git a/skins/larry/includes/settingstabs.html b/skins/larry/includes/settingstabs.html
index bb26fc6..e626958 100644
--- a/skins/larry/includes/settingstabs.html
+++ b/skins/larry/includes/settingstabs.html
@@ -1,9 +1,7 @@
 <div id="settings-sections" class="uibox listbox">
 <h2 class="boxtitle"><roundcube:label name="settings" /></h2>
 <div id="settings-tabs" class="scroller">
-	<span id="settingstabpreferences" class="listitem preferences"><roundcube:button command="preferences" type="link" label="preferences" title="editpreferences" /></span>
-	<span id="settingstabfolders" class="listitem folders"><roundcube:button command="folders" type="link" label="folders" title="managefolders" /></span>
-	<span id="settingstabidentities" class="listitem identities"><roundcube:button command="identities" type="link" label="identities" title="manageidentities" /></span>
+	<roundcube:object name="settingstabs" class="listitem" />
 	<roundcube:container name="tabs" id="settings-tabs" />
 </div>
 </div>

--
Gitblit v1.9.1