From 8d77bf1c0a8408f847739ac0fbb2a329e6a6f292 Mon Sep 17 00:00:00 2001
From: Michael M Slusarz
Date: Wed, 7 Apr 2010 00:49:08 -0600
Subject: [PATCH] Convert gollem to new preferences UI code
---
framework/Core/lib/Horde/Core/Prefs/Ui/Widgets.php | 72 +++++---
gollem/config/prefs.php.dist | 25 +--
gollem/js/columnselect.js | 187 ---------------------
gollem/lib/Application.php | 74 +++++++-
gollem/templates/prefs/columnselect.html | 39 -----
gollem/templates/prefs/columnselect.inc | 46 -----
horde/js/sourceselect.js | 69 ++++++--
horde/templates/prefs/source.html | 12 ++
8 files changed, 194 insertions(+), 330 deletions(-)
delete mode 100644 gollem/js/columnselect.js
delete mode 100644 gollem/templates/prefs/columnselect.html
delete mode 100644 gollem/templates/prefs/columnselect.inc
diff --git a/framework/Core/lib/Horde/Core/Prefs/Ui/Widgets.php b/framework/Core/lib/Horde/Core/Prefs/Ui/Widgets.php
index b4a43eea6..99f132555 100644
--- a/framework/Core/lib/Horde/Core/Prefs/Ui/Widgets.php
+++ b/framework/Core/lib/Horde/Core/Prefs/Ui/Widgets.php
@@ -30,13 +30,15 @@ class Horde_Core_Prefs_Ui_Widgets
* Create code needed for source selection.
*
* @param Horde_Core_Prefs_Ui $ui The UI object.
- * @param array $data REQUIRED data items:
+ * @param array $data Data items:
*
- * 'mainlabel'
- * 'selected'
- * 'selectlabel'
- * 'unselected'
- * 'unselectlabel'
+ * 'mainlabel' - (string) Main label.
+ * 'selectlabel' - (array) Selected label.
+ * 'sourcelabel' - (string) [OPTIONAL] Source selection label.
+ * 'sources' - (array) List of sources - keys are source names. Each
+ * source is an array with two entries - selected and
+ * unselected.
+ * 'unselectlabel' - (array) Unselected label.
*
*
* @return string HTML UI code.
@@ -44,29 +46,49 @@ class Horde_Core_Prefs_Ui_Widgets
static public function source($ui, $data = array())
{
$t = $GLOBALS['injector']->createInstance('Horde_Template');
- $t->setOption('gettext', true);
$t->set('mainlabel', $data['mainlabel']);
$t->set('selectlabel', $data['selectlabel']);
$t->set('unselectlabel', $data['unselectlabel']);
- $unselected = array();
- foreach ($data['unselected'] as $key => $val) {
- $unselected[] = array(
- 'l' => $val,
- 'v' => $key
- );
+ $sources = array();
+ foreach ($data['sources'] as $key => $val) {
+ $selected = $unselected = array();
+
+ foreach ($data['selected'] as $key2 => $val2) {
+ $selected[] = array(
+ 'l' => $val2,
+ 'v' => $key2
+ );
+ }
+
+ foreach ($data['unselected'] as $key2 => $val2) {
+ $unselected[] = array(
+ 'l' => $val2,
+ 'v' => $key2
+ );
+ }
+
+ $sources[$key] = array($selected, $unselected);
}
- $t->set('unselected', $unselected);
-
- $selected = array();
- foreach ($data['selected'] as $key => $val) {
- $selected[] = array(
- 'l' => $val,
- 'v' => $key
- );
+
+ if (count($sources) == 1) {
+ $val = reset($sources);
+ $t->set('selected', $val[0]);
+ $t->set('unselected', $val[1]);
+ } else {
+ $js = array();
+ foreach ($sources as $key => $val) {
+ $js[] = array(
+ 'selected' => $val[0],
+ 'source' => $key,
+ 'unselected' => $val[1]
+ );
+ }
+ Horde::addInlineScript(array(
+ 'HordeSourceSelectPrefs.source_list = ' . Horde_Serialize::serialize($js, Horde_Serialize::JSON, Horde_Nls::getCharset())
+ ));
}
- $t->set('selected', $selected);
$t->set('addimg', Horde::img(isset($GLOBALS['nls']['rtl'][$GLOBALS['language']]) ? 'lhand.png' : 'rhand.png', _("Add source")));
$t->set('removeimg', Horde::img(isset($GLOBALS['nls']['rtl'][$GLOBALS['language']]) ? 'rhand.png' : 'lhand.png', _("Remove source")));
@@ -145,9 +167,11 @@ class Horde_Core_Prefs_Ui_Widgets
if (!empty($selected) || !empty($unselected)) {
$out = Horde_Core_Prefs_Ui_Widgets::source($ui, array(
'mainlabel' => _("Choose the order of address books to search when expanding addresses."),
- 'selected' => $selected,
'selectlabel' => _("Selected address books:"),
- 'unselected' => $unselected,
+ 'sources' => array(array(
+ 'selected' => $selected,
+ 'unselected' => $unselected
+ )),
'unselectlabel' => _("Available address books:")
));
diff --git a/gollem/config/prefs.php.dist b/gollem/config/prefs.php.dist
index 5f6efa2da..45248cc76 100644
--- a/gollem/config/prefs.php.dist
+++ b/gollem/config/prefs.php.dist
@@ -9,8 +9,11 @@ $prefGroups['display'] = array(
'column' => _("User Interface"),
'label' => _("File Display"),
'desc' => _("Change your file sorting options."),
- 'members' => array('show_dotfiles', 'sortdirsfirst', 'columnselect',
- 'sortby', 'sortdir', 'perpage'));
+ 'members' => array(
+ 'show_dotfiles', 'sortdirsfirst', 'columnselect', 'sortby', 'sortdir',
+ 'perpage'
+ )
+);
$prefGroups['settings'] = array(
'column' => _("User Interface"),
@@ -21,31 +24,23 @@ $prefGroups['settings'] = array(
// show dotfiles?
$_prefs['show_dotfiles'] = array(
'value' => 1,
- 'locked' => false,
- 'shared' => false,
'type' => 'checkbox',
'desc' => _("Show dotfiles?")
);
// columns selection widget
$_prefs['columnselect'] = array(
- 'locked' => false,
'type' => 'special'
);
// columns to be displayed
$_prefs['columns'] = array(
- 'value' => "ftp\ttype\tname\tdownload\tmodified\tsize\tpermission\towner\tgroup",
- 'locked' => false,
- 'shared' => false,
- 'type' => 'implicit'
+ 'value' => "ftp\ttype\tname\tdownload\tmodified\tsize\tpermission\towner\tgroup"
);
// user preferred sorting column
$_prefs['sortby'] = array(
'value' => Gollem::SORT_TYPE,
- 'locked' => false,
- 'shared' => false,
'type' => 'enum',
'enum' => array(
Gollem::SORT_TYPE => _("File Type"),
@@ -59,8 +54,6 @@ $_prefs['sortby'] = array(
// user preferred sorting direction
$_prefs['sortdir'] = array(
'value' => 0,
- 'locked' => false,
- 'shared' => false,
'type' => 'enum',
'enum' => array(
Gollem::SORT_ASCEND => _("Ascending"),
@@ -72,8 +65,6 @@ $_prefs['sortdir'] = array(
// always sort directories before files
$_prefs['sortdirsfirst'] = array(
'value' => 0,
- 'locked' => false,
- 'shared' => false,
'type' => 'checkbox',
'desc' => _("List folders first?")
);
@@ -81,8 +72,6 @@ $_prefs['sortdirsfirst'] = array(
// number of items per page
$_prefs['perpage'] = array(
'value' => 20,
- 'locked' => false,
- 'shared' => true,
'type' => 'number',
'desc' => _("Items per page")
);
@@ -90,8 +79,6 @@ $_prefs['perpage'] = array(
// user preferred recursive deletes
$_prefs['recursive_deletes'] = array(
'value' => 'disabled',
- 'locked' => false,
- 'shared' => false,
'type' => 'enum',
'enum' => array(
'disabled' => _("No"),
diff --git a/gollem/js/columnselect.js b/gollem/js/columnselect.js
deleted file mode 100644
index 12a7bc066..000000000
--- a/gollem/js/columnselect.js
+++ /dev/null
@@ -1,187 +0,0 @@
-/**
- * Provides the javascript for the gollem column select preferences page.
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- */
-
-var columns = [];
-
-function selectSource()
-{
- var f = document.prefs;
- var fieldString = '';
-
- while (f.unselected_columns.length > 1) {
- f.unselected_columns.options[f.unselected_columns.length - 1] = null;
- }
- while (f.selected_columns.length > 1) {
- f.selected_columns.options[f.selected_columns.length - 1] = null;
- }
-
- if (f.source.selectedIndex < 1) {
- return;
- }
- var source = f.source.selectedIndex - 1;
-
- var selected = [];
- var unselected = [];
- for (var i = 1; i < columns[source].length; i++) {
- if (columns[source][i][2]) {
- selected[columns[source][i][3]] = [columns[source][i][1], columns[source][i][0]];
- } else {
- unselected[unselected.length] = [columns[source][i][1], columns[source][i][0]];
- }
- }
- for (i = 0; i < selected.length; i++) {
- f.selected_columns.options[i + 1] = new Option(selected[i][0], selected[i][1]);
- }
- for (i = 0; i < unselected.length; i++) {
- f.unselected_columns.options[i + 1] = new Option(unselected[i][0], unselected[i][1]);
- }
-}
-
-function deselectHeaders()
-{
- document.prefs.unselected_columns[0].selected = false;
- document.prefs.selected_columns[0].selected = false;
-}
-
-function resetHidden()
-{
- var tmp = '';
- for (var i = 0; i < columns.length; i++) {
- if (i > 0) {
- tmp += '\n';
- }
- tmp += columns[i][0];
- for (var j = 1; j < columns[i].length; j++) {
- if (columns[i][j][2]) {
- tmp += '\t' + columns[i][j][0];
- }
- }
- }
- document.prefs.columns.value = tmp;
-}
-
-function addColumn()
-{
- var f = document.prefs;
- var source = f.source.selectedIndex - 1;
-
- for (i = 1; i < f.unselected_columns.length; i++) {
- if (f.unselected_columns[i].selected) {
- for (var j = 1; j < columns[source].length; j++) {
- if (columns[source][j][0] == f.unselected_columns[i].value) {
- columns[source][j][2] = true;
- }
- }
- f.selected_columns[f.selected_columns.length] = new Option(f.unselected_columns[i].text, f.unselected_columns[i].value);
- f.unselected_columns[i] = null;
- i--;
- }
- }
-
- resetHidden();
-}
-
-function removeColumn()
-{
- var f = document.prefs;
- var source = f.source.selectedIndex - 1;
-
- for (i = 1; i < f.selected_columns.length; i++) {
- if (f.selected_columns[i].selected) {
- for (var j = 1; j < columns[source].length; j++) {
- if (columns[source][j][0] == f.selected_columns[i].value) {
- columns[source][j][2] = false;
- }
- }
- f.unselected_columns[f.unselected_columns.length] = new Option(f.selected_columns[i].text, f.selected_columns[i].value)
- f.selected_columns[i] = null;
- i--;
- }
- }
-
- resetHidden();
-}
-
-function moveColumnUp()
-{
- var f = document.prefs;
- var sel = f.selected_columns.selectedIndex;
- var source = f.source.selectedIndex - 1;
-
- if (sel <= 1 || f.selected_columns.length <= 2) return;
-
- // deselect everything but the first selected item
- f.selected_columns.selectedIndex = sel;
- var up = f.selected_columns[sel].value;
-
- tmp = [];
- for (i = 1; i < f.selected_columns.length; i++) {
- tmp[i - 1] = new Option(f.selected_columns[i].text, f.selected_columns[i].value)
- }
-
- for (i = 0; i < tmp.length; i++) {
- if (i + 1 == sel - 1) {
- f.selected_columns[i + 1] = tmp[i + 1];
- } else if (i + 1 == sel) {
- f.selected_columns[i + 1] = tmp[i - 1];
- } else {
- f.selected_columns[i + 1] = tmp[i];
- }
- }
-
- f.selected_columns.selectedIndex = sel - 1;
-
- for (i = 2; i < columns[source].length - 1; i++) {
- if (columns[source][i][0] == up) {
- column = columns[source][i];
- columns[source][i] = columns[source][i - 1];
- columns[source][i - 1] = column;
- }
- }
-
- resetHidden();
-}
-
-function moveColumnDown()
-{
- var f = document.prefs;
- var sel = f.selected_columns.selectedIndex;
- var source = f.source.selectedIndex - 1;
-
- if (sel == -1 || f.selected_columns.length <= 2 || sel == f.selected_columns.length - 1) return;
-
- // deselect everything but the first selected item
- f.selected_columns.selectedIndex = sel;
- var down = f.selected_columns[sel].value;
-
- tmp = [];
- for (i = 1; i < f.selected_columns.length; i++) {
- tmp[i - 1] = new Option(f.selected_columns[i].text, f.selected_columns[i].value)
- }
-
- for (i = 0; i < tmp.length; i++) {
- if (i + 1 == sel) {
- f.selected_columns[i + 1] = tmp[i + 1];
- } else if (i + 1 == sel + 1) {
- f.selected_columns[i + 1] = tmp[i - 1];
- } else {
- f.selected_columns[i + 1] = tmp[i];
- }
- }
-
- f.selected_columns.selectedIndex = sel + 1;
-
- for (i = columns[source].length - 2; i > 0; i--) {
- if (columns[source][i][0] == down || columns[source][i + 1][0] == down) {
- column = columns[source][i];
- columns[source][i] = columns[source][i + 1];
- columns[source][i + 1] = column;
- }
- }
-
- resetHidden();
-}
diff --git a/gollem/lib/Application.php b/gollem/lib/Application.php
index b58f0b34b..e7e7c25db 100644
--- a/gollem/lib/Application.php
+++ b/gollem/lib/Application.php
@@ -96,6 +96,70 @@ class Gollem_Application extends Horde_Registry_Application
}
/**
+ * Code to run on init when viewing prefs for this application.
+ *
+ * @param Horde_Core_Prefs_Ui $ui The UI object.
+ */
+ public function prefsInit($ui)
+ {
+ global $prefs;
+
+ switch ($ui->group) {
+ case 'display':
+ if (!$prefs->isLocked('columns')) {
+ Horde_Core_Prefs_Ui_Widgets::sourceInit($ui);
+ }
+ break;
+ }
+ }
+
+ /**
+ * Generate code used to display a special preference.
+ *
+ * @param Horde_Core_Prefs_Ui $ui The UI object.
+ * @param string $item The preference name.
+ *
+ * @return string The HTML code to display on the options page.
+ */
+ public function prefsSpecial($ui, $item)
+ {
+ switch ($item) {
+ case 'columnselect':
+ $cols = Gollem::displayColumns();
+ $sources = array();
+
+ foreach ($GLOBALS['gollem_backends'] as $source => $info) {
+ $selected = $unselected = array();
+ $selected_list = isset($cols[$source])
+ ? array_flip($cols[$source]) :
+ : array();
+
+ foreach ($info['attributes'] as $column) {
+ if (isset($selected_list[$column])) {
+ $selected[] = array($column, $column);
+ } else {
+ $unselected[] = array($column, $column);
+ }
+ }
+ $sources[$source] = array(
+ 'selected' => $selected,
+ 'unselected' => $unselected,
+ );
+ }
+
+ return Horde_Core_Prefs_Ui_Widgets::source($ui, array(
+ 'mainlabel' => _("Choose which address books to display, and in what order:"),
+ 'selectlabel' => _("These addressbooks will display in this order:"),
+ 'sourcelabel' => _("Select a backend:"),
+ 'sources' => $foo,
+ 'unselectlabel' => _("Address books that will not be displayed:")
+ ));
+ }
+
+ return '';
+ }
+
+ /**
* Special preferences handling on update.
*
* @param Horde_Core_Prefs_Ui $ui The UI object.
@@ -107,12 +171,18 @@ class Gollem_Application extends Horde_Registry_Application
{
switch ($item) {
case 'columnselect':
- if (isset($ui->vars->columns)) {
- $GLOBALS['prefs']->setValue('columns', $ui->vars->columns);
+ if (isset($ui->vars->sources)) {
+ $pref = array();
+ foreach (Horde_Serialize::unserialize($ui->vars->sources, Horde_Serialize::JSON) as $val) {
+ $pref[] = implode("\t", array_merge($val[0], $val[1]));
+ }
+ $GLOBALS['prefs']->setValue('columns', implode("\n", $pref));
return true;
}
break;
}
+
+ return false;
}
/**
diff --git a/gollem/templates/prefs/columnselect.html b/gollem/templates/prefs/columnselect.html
deleted file mode 100644
index 2a86c0d8c..000000000
--- a/gollem/templates/prefs/columnselect.html
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-Choose the columns to display in the file manager.
-
-
-
-
-
- |
-
- |
-
-
-
-
- |
-
-
- |
-
-
-
-
- |
-
-
diff --git a/gollem/templates/prefs/columnselect.inc b/gollem/templates/prefs/columnselect.inc
deleted file mode 100644
index a882f555f..000000000
--- a/gollem/templates/prefs/columnselect.inc
+++ /dev/null
@@ -1,46 +0,0 @@
-isLocked('columns')) {
- $js_columns = '';
- $sources = Gollem::displayColumns();
- $source_count = 0;
-
- foreach ($GLOBALS['gollem_backends'] as $source => $info) {
- $js_columns .= "columns[$source_count] = [];";
- $js_columns .= "columns[$source_count][0] = '$source';";
-
- $column_count = 1;
- $selected = isset($sources[$source]) ? array_flip($sources[$source]) : array();
- foreach ($info['attributes'] as $null => $column) {
- $marked = isset($selected[$column]) ? 'true' : 'false';
- $js_columns .= "columns[$source_count][$column_count] = ['$column', '" . addslashes($column) . "', $marked, " . (($marked === 'true') ? $selected[$column] : 'null') . "];";
- ++$column_count;
- }
- ++$source_count;
- }
-
- Horde::addScriptFile('columnselect.js', 'gollem');
- Horde::addInlineScript($js_columns);
-
- $t = $injector->createInstance('Horde_Template');
- $t->setOption('gettext', true);
-
- $be = array();
- foreach ($GLOBALS['gollem_backends'] as $key => $info) {
- $be[] = array('val' => $key, 'label' => $info['name']);
- }
- $t->set('be', $be);
-
- $t->set('columns', $prefs->getValue('columns'));
-
- $t->set('add', Horde::img('rhand.png', _("Add column")));
- $t->set('remove', Horde::img('lhand.png', _("Remove column")));
- $t->set('left', Horde::img('nav/up.png', _("Move left")));
- $t->set('right', Horde::img('nav/down.png', _("Move right")));
-
- echo $t->fetch(GOLLEM_TEMPLATES . '/prefs/columnselect.html');
-}
diff --git a/horde/js/sourceselect.js b/horde/js/sourceselect.js
index 0af423f53..b34b958f7 100644
--- a/horde/js/sourceselect.js
+++ b/horde/js/sourceselect.js
@@ -1,15 +1,32 @@
/**
* Provides the javascript for managing the source selection widget.
*
- * See the enclosed file COPYING for license information (GPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
*/
var HordeSourceSelectPrefs = {
- resetHidden: function()
+ // Vars defaulting to null: source_list
+
+ setSourcesHidden: function()
{
- $('sources').setValue($F('selected_sources').toJSON());
+ var out = [], ss;
+
+ if (this.source_list) {
+ ss = $F('source_select');
+ if (ss) {
+ this.source_list.each(function(s) {
+ if (s.source == ss) {
+ s.selected = $F('selected_sources');
+ }
+ out.push([ s.source, s.selected ]);
+ });
+ $('sources').setValue(out.toJSON());
+ }
+ } else {
+ $('sources').setValue($F('selected_sources').toJSON());
+ }
},
moveAction: function(from, to)
@@ -21,7 +38,7 @@ var HordeSourceSelectPrefs = {
}
});
- this.resetHidden();
+ this.setSourcesHidden();
},
moveSource: function(e, mode)
@@ -59,20 +76,46 @@ var HordeSourceSelectPrefs = {
break;
}
- this.resetHidden();
+ this.setSourcesHidden();
e.stop();
},
- onDomLoad: function()
+ changeSource: function()
{
- this.resetHidden();
+ var source,
+ sel = $('selected_sources'),
+ ss = $('source_select'),
+ unsel = $('unselected_sources'),
+ val = $F(ss);
+
+ sel.down().siblings().invoke('remove');
+ unsel.down().siblings().invoke('remove');
- if ($('unselected_sources')) {
- $('addsource').observe('click', this.moveAction.bind(this, 'unselected_sources', 'selected_sources'));
- $('removesource').observe('click', this.moveAction.bind(this, 'selected_sources', 'unselected_sources'));
- $('moveup').observe('click', this.moveSource.bindAsEventListener(this, 'up'));
- $('movedown').observe('click', this.moveSource.bindAsEventListener(this, 'down'));
+ if (val) {
+ source = this.source_list.find(function(s) {
+ return val == s.source;
+ });
+ source.selected.each(function(s) {
+ sel.insert(new Option(s.v, s.l));
+ });
+ source.unselected.each(function(u) {
+ unsel.insert(new Option(s.v, s.l));
+ });
}
+ },
+
+ onDomLoad: function()
+ {
+ if (this.source_list) {
+ $('source_select').observe('change', this.changeSource.bind(this));
+ }
+
+ this.setSourcesHidden();
+
+ $('addsource').observe('click', this.moveAction.bind(this, 'unselected_sources', 'selected_sources'));
+ $('removesource').observe('click', this.moveAction.bind(this, 'selected_sources', 'unselected_sources'));
+ $('moveup').observe('click', this.moveSource.bindAsEventListener(this, 'up'));
+ $('movedown').observe('click', this.moveSource.bindAsEventListener(this, 'down'));
}
};
diff --git a/horde/templates/prefs/source.html b/horde/templates/prefs/source.html
index cfa1dbcbb..4a958a496 100644
--- a/horde/templates/prefs/source.html
+++ b/horde/templates/prefs/source.html
@@ -4,15 +4,25 @@
+
+
+
+
+
+
|
|
@@ -24,9 +34,11 @@
|
--
2.11.0
|