diff --git a/source/lib/RippingCluster/Main.class.php b/source/lib/RippingCluster/Main.class.php index ea2bb98..e4d1cc5 100644 --- a/source/lib/RippingCluster/Main.class.php +++ b/source/lib/RippingCluster/Main.class.php @@ -25,6 +25,7 @@ class RippingCluster_Main extends SihnonFramework_Main { $this->smarty->compile_dir = static::makeAbsolutePath($smarty_tmp . '/tmp/templates'); $this->smarty->cache_dir = static::makeAbsolutePath($smarty_tmp . '/tmp/cache'); $this->smarty->config_dir = static::makeAbsolutePath($smarty_tmp . '/config'); + $this->smarty->plugins_dir[]= static::makeAbsolutePath('./source/smarty/plugins'); $this->smarty->registerPlugin('modifier', 'formatDuration', array('RippingCluster_Main', 'formatDuration')); $this->smarty->registerPlugin('modifier', 'formatFilesize', array('RippingCluster_Main', 'formatFilesize')); diff --git a/webui/scripts/main.js b/webui/scripts/main.js index 660f16c..718e849 100644 --- a/webui/scripts/main.js +++ b/webui/scripts/main.js @@ -23,7 +23,8 @@ var rc = { }, post: function(url, data) { - $.ajax(url, { + $.ajax({ + url: url, type: "POST", dataType: "json", data: data, @@ -54,6 +55,14 @@ var rc = { if (d.dialog.buttons) { switch (d.dialog.buttons.type) { + case 'ok': + $("#dialogfooterok").click( + function() { + rc.trigger(d.dialog.buttons.actions.ok, d.dialog.buttons.params); + } + ); + $("#dialogfooterok").show(); + break; case 'yesno': $("#dialogfooteryes").click( function() { @@ -134,6 +143,77 @@ var rc = { } else { console.log("Action not supported: " +action); } + }, + + settings: { + + init: function() { + $("#settings_save").click( + function() { + rc.settings.save(); + } + ); + }, + + add_stringlist_field: function(id) { + var container = $('#container_'+id); + var next = $('#settings_'+id+'_next'); + var next_value = next.val(); + + var line = $('
'); + line.attr('id', 'settings_'+id+'_line'+next.val()); + line.append($('')); + line.append(' '); + var button = $(''); + button.click(function() { + rc.settings.remove_field(id, next_value); + }); + line.append(button); + + // Add the new item + container.append(line); + + // Increment the next counter + next.val(parseInt(next_value)+1); + + }, + + remove_field: function(id, line) { + $("#settings_"+id+"_line"+line).remove(); + }, + + save: function() { + + var settings = {}; + + var fields = $("input.setting").get(); + for (var i in fields) { + var setting = fields[i]; + var name = setting.name; + var value; + + switch(setting.type) { + case 'checkbox': + value = $(setting).is(':checked') ? 1 : 0; + break; + default: + value = setting.value; + } + + if (/\[\]$/.test(name)) { + if (! settings[name]) { + settings[name] = []; + } + settings[name].push(value); + } else { + settings[name] = value; + } + } + + rc.ajax.post(base_url + "ajax/update-settings/", settings); + + } + } }; diff --git a/webui/source/pages/admin/settings.php b/webui/source/pages/admin/settings.php new file mode 100644 index 0000000..dc5a4f5 --- /dev/null +++ b/webui/source/pages/admin/settings.php @@ -0,0 +1,10 @@ +config(); + +$settings = $config->enumerateAll(); +$this->smarty->assign('settings', $settings); +$this->smarty->assign('config', $config); + +?> \ No newline at end of file diff --git a/webui/source/pages/ajax/update-settings.php b/webui/source/pages/ajax/update-settings.php new file mode 100644 index 0000000..a58875c --- /dev/null +++ b/webui/source/pages/ajax/update-settings.php @@ -0,0 +1,22 @@ +config(); + +$messages = array(); + +// Iterate over the settings and store each one back to the backend +foreach($_POST as $key => $value) { + // Convert - to . (to work around the PHP register global backwards compatibility that renames input variables) + $key = str_replace("-", ".", $key); + + if ($config->exists($key)) { + $config->set($key, $value); + } else { + $messages[] = "Unknown config key '{$key}', value not updated."; + } +} + +$this->smarty->assign('messages', $messages); + +?> \ No newline at end of file diff --git a/webui/source/smarty/plugins/compiler.switch.php b/webui/source/smarty/plugins/compiler.switch.php new file mode 100644 index 0000000..bf1cd55 --- /dev/null +++ b/webui/source/smarty/plugins/compiler.switch.php @@ -0,0 +1,292 @@ + + * $this->smartyObj->loadPlugin('smarty_compiler_switch'); + * + * + * @author Jeremy Pyne + * - Donations: Accepted via PayPal at the above address. + * - Updated: 02/10/2010 - Version 3.2 + * - File: smarty/plugins/compiler.switch.php + * - Licence: CC:BY/NC/SA http://creativecommons.org/licenses/by-nc-sa/3.0/ + * + * - Updates + * Version 2: + * Changed the break attribute to cause a break to be printed before the next case, instead of before this + * case. This way makes more sense and simplifies the code. This change in incompatible with code in + * from version one. This is written to support nested switches and will work as expected. + * Version 2.1: + * Added {/case} tag, this is identical to {break}. + * Version 3: + * Updated switch statment to support Smarty 3. This update is NOT backwards compatible but the old version is still maintained. + * Version 3.1: + * Added a prefilter to re-enable the shorthand {switch $myvar} support. To use the shorthand form you will need to add the following line to your code. + * $smarty->loadPlugin('smarty_compiler_switch'); + * Version 3.2: + * Fixed a bug when chaining multiple {case} statements without a {break}. + * Version 3.5: + * Updated to work with Smarty 3.0 release. (Tested and working with 3.0.5, no longer compatible with 3.0rcx releases.) + * + * - Bugs/Notes: + * + * @package Smarty + * @subpackage plugins + * + * Sample usage: + * + * {foreach item=$debugItem from=$debugData} + * // Switch on $debugItem.type + * {switch $debugItem.type} + * {case 1} + * {case "invalid_field"} + * // Case checks for string and numbers. + * {/case} + * {case $postError} + * {case $getError|cat:"_ajax"|lower} + * // Case checks can also use variables and modifiers. + * {break} + * {default} + * // Default case is supported. + * {/switch} + * {/foreach} + * + * + * Note in the above example that the break statements work exactly as expected. Also the switch and default + * tags can take the break attribute. If set they will break automatically before the next case is printed. + * + * Both blocks produce the same switch logic: + * + * {case 1 break} + * Code 1 + * {case 2} + * Code 2 + * {default break} + * Code 3 + * + * + * + * {case 1} + * Code 1 + * {break} + * {case 2} + * Code 2 + * {default} + * Code 3 + * {break} + * + * + * Finally, there is an alternate long hand style for the switch statments that you may need to use in some cases. + * + * + * {switch var=$type} + * {case value="box" break} + * {case value="line"} + * {break} + * {default} + * {/switch} + * + */ + +//Register the post and pre filters as they are not auto-registered. +$this->registerFilter('post', 'smarty_postfilter_switch'); + +class Smarty_Compiler_Switch extends Smarty_Internal_CompileBase { + public $required_attributes = array('var'); + public $optional_attributes = array(); + public $shorttag_order = array('var'); + +/** + * Start a new switch statement. + * A variable must be passed to switch on. + * Also, the switch can only directly contain {case} and {default} tags. + * + * @param string $tag_arg + * @param Smarty_Compiler $smarty + * @return string + */ + public function compile($args, $compiler){ + $this->compiler = $compiler; + $attr = $this->_get_attributes($args); + $_output = ''; + + $this->_open_tag('switch',array($compiler->tag_nocache)); + + if (is_array($attr['var'])) { + $_output .= "tpl_vars[".$attr['var']['var']."])) \$_smarty_tpl->tpl_vars[".$attr['var']['var']."] = new Smarty_Variable;"; + $_output .= "switch (\$_smarty_tpl->tpl_vars[".$attr['var']['var']."]->value = ".$attr['var']['value']."){?>"; + } else { + $_output .= ''; + } + return $_output; + } +} + +class Smarty_Compiler_Case extends Smarty_Internal_CompileBase { + public $required_attributes = array('value'); + public $optional_attributes = array('break'); + public $shorttag_order = array('value', 'break'); + +/** + * Print out a case line for this switch. + * A condition must be passed to match on. + * This can only go in {switch} tags. + * If break is passed, a {break} will be rendered before the next case. + * + * @param string $tag_arg + * @param Smarty_Compiler $smarty + * @return string + */ + public function compile($args, $compiler){ + $this->compiler = $compiler; + $attr = $this->_get_attributes($args); + $_output = ''; + + list($last_tag, $last_attr) = $this->compiler->_tag_stack[count($this->compiler->_tag_stack) - 1]; + + if($last_tag == 'case') + { + list($break, $compiler->tag_nocache) = $this->_close_tag(array('case')); + if($last_attr[0]) + $_output .= ''; + } + $this->_open_tag('case', array(isset($attr['break']) ? $attr['break'] : false, $compiler->tag_nocache)); + + if (is_array($attr['value'])) { + $_output .= "tpl_vars[".$attr['value']['var']."])) \$_smarty_tpl->tpl_vars[".$attr['value']['var']."] = new Smarty_Variable;"; + $_output .= "case \$_smarty_tpl->tpl_vars[".$attr['value']['var']."]->value = ".$attr['value']['value'].":?>"; + } else { + $_output .= ''; + } + return $_output; + } +} + +class Smarty_Compiler_Default extends Smarty_Internal_CompileBase { + public $required_attributes = array(); + public $optional_attributes = array('break'); + public $shorttag_order = array('break'); + +/** + * Print out a default line for this switch. + * This can only go in {switch} tags. + * If break is passed, a {break} will be rendered before the next case. + * + * @param string $tag_arg + * @param Smarty_Compiler $smarty + * @return string + */ + public function compile($args, $compiler){ + $this->compiler = $compiler; + $attr = $this->_get_attributes($args); + $_output = ''; + + list($last_tag, $last_attr) = $this->compiler->_tag_stack[count($this->compiler->_tag_stack) - 1]; + if($last_tag == 'case') + { + list($break, $compiler->tag_nocache) = $this->_close_tag(array('case')); + if($last_attr[0]) + $_output .= ''; + } + $this->_open_tag('case', array(isset($attr['break']) ? $attr['break'] : false, $compiler->tag_nocache)); + + $_output .= ''; + + return $_output; + } +} + + +class Smarty_Compiler_Break extends Smarty_Internal_CompileBase { + public $required_attributes = array(); + public $optional_attributes = array(); + public $shorttag_order = array(); + +/** + * Print out a break command for the switch. + * This can only go inside of {case} tags. + * + * @param string $tag_arg + * @param Smarty_Compiler $smarty + * @return string + */ + + public function compile($args, $compiler){ + $this->compiler = $compiler; + $attr = $this->_get_attributes($args); + + list($break, $compiler->tag_nocache) = $this->_close_tag(array('case')); + + return ''; + } +} + +class Smarty_Compiler_Caseclose extends Smarty_Internal_CompileBase { + public $required_attributes = array(); + public $optional_attributes = array(); + public $shorttag_order = array(); + +/** + * Print out a break command for the switch. + * This can only go inside of {case} tags. + * + * @param string $tag_arg + * @param Smarty_Compiler $smarty + * @return string + */ + + public function compile($args, $compiler){ + $this->compiler = $compiler; + $attr = $this->_get_attributes($args); + + list($break, $compiler->tag_nocache) = $this->_close_tag(array('case')); + + return ''; + } +} + +class Smarty_Compiler_Switchclose extends Smarty_Internal_CompileBase { + public $required_attributes = array(); + public $optional_attributes = array(); + public $shorttag_order = array(); + +/** + * End a switch statement. + * + * @param string $tag_arg + * @param Smarty_Compiler $smarty + * @return string + */ + + public function compile($args, $compiler){ + $this->compiler = $compiler; + $attr = $this->_get_attributes($args); + + list($last_tag, $last_attr) = $this->compiler->_tag_stack[count($this->compiler->_tag_stack) - 1]; + if(($last_tag == 'case' || $last_tag == 'default')) + list($break, $compiler->tag_nocache) = $this->_close_tag(array('case')); + list($compiler->tag_nocache) = $this->_close_tag(array('switch')); + + return ''; + } +} + +/** + * Filter the template after it is generated to fix switch bugs. + * Remove any spaces after the 'switch () {' code and before the first case. Any tabs or spaces + * for layout would cause php errors witch this reged will fix. + * + * @param string $compiled + * @param Smarty_Compiler $smarty + * @return string + */ +function smarty_postfilter_switch($compiled, &$smarty) { + // Remove the extra spaces after the start of the switch tag and before the first case statement. + return preg_replace('/({ ?\?>)\s+(<\?php case)/', "$1\n$2", $compiled); +} +?> \ No newline at end of file diff --git a/webui/source/templates/admin/settings.tpl b/webui/source/templates/admin/settings.tpl index f99b905..ea646de 100644 --- a/webui/source/templates/admin/settings.tpl +++ b/webui/source/templates/admin/settings.tpl @@ -1 +1,56 @@ -Not yet implemented. \ No newline at end of file +

Settings

+ + + + + + + + {foreach from=$settings item=name} + {assign var='value' value=$config->get($name)} + {assign var='type' value=$config->type($name)} + {assign var='id' value=str_replace('.', '-',$name)} + + + + + {/foreach} + + + + + + +
NameValue
{$name} + {switch $type} + {case Sihnon_Config::TYPE_BOOL} + + {/case} + {case Sihnon_Config::TYPE_INT} + + {/case} + {case Sihnon_Config::TYPE_STRING} + + {/case} + {case Sihnon_Config::TYPE_STRING_LIST} +
+ {foreach from=$value item=line name=settings} +
+ + +
+ {/foreach} +
+
+ + +
+ {/case} + {/switch} +
+ +
+ + \ No newline at end of file diff --git a/webui/source/templates/ajax.tpl b/webui/source/templates/ajax.tpl index 99362e6..7c0aecf 100644 --- a/webui/source/templates/ajax.tpl +++ b/webui/source/templates/ajax.tpl @@ -1,11 +1,12 @@ { {if $messages} - messages: [ - {foreach from=$messages item=message} - '{$message}', + "messages": [ + {foreach from=$messages item=message name=messages} + {$message|json_encode}{if ! $smarty.foreach.messages.last},{/if} {/foreach} - ], + ]{if $page_content},{/if} {/if} {$page_content} + } \ No newline at end of file diff --git a/webui/source/templates/ajax/delete-source.tpl b/webui/source/templates/ajax/delete-source.tpl index 1177770..a498329 100644 --- a/webui/source/templates/ajax/delete-source.tpl +++ b/webui/source/templates/ajax/delete-source.tpl @@ -6,6 +6,10 @@ "content": {$sources_html|json_encode} } {else} + "dialogheadertitle" { + "content": "Delete Source" + }, + "dialogcontent": { {include file="fragments/delete-source.tpl" assign="delete_source_html"} "content": {$delete_source_html|json_encode} diff --git a/webui/source/templates/ajax/update-settings.tpl b/webui/source/templates/ajax/update-settings.tpl new file mode 100644 index 0000000..3fa938f --- /dev/null +++ b/webui/source/templates/ajax/update-settings.tpl @@ -0,0 +1,22 @@ +"page_replacements": { + + "dialogheadertitle": { + "content": "Update Settings" + }, + + "dialogcontent": { + {include file="fragments/update-settings-dialog.tpl" assign=dialog_content} + "content": {$dialog_content|json_encode} + } + +}, + +"dialog": { + "show": true, + "buttons": { + "type": "ok", + "actions": { + "ok": "close-dialog" + } + } +} diff --git a/webui/source/templates/fragments/messages.tpl b/webui/source/templates/fragments/messages.tpl new file mode 100644 index 0000000..6f3f273 --- /dev/null +++ b/webui/source/templates/fragments/messages.tpl @@ -0,0 +1,7 @@ +{if $messages} + +{/if} diff --git a/webui/source/templates/fragments/update-settings-dialog.tpl b/webui/source/templates/fragments/update-settings-dialog.tpl new file mode 100644 index 0000000..d0c2214 --- /dev/null +++ b/webui/source/templates/fragments/update-settings-dialog.tpl @@ -0,0 +1,10 @@ +

+ Settings have been saved. +

+ +{if $messages} +

+ Some messages were generated during this operation: + {include file="fragments/messages.tpl"} +

+{/if} diff --git a/webui/source/templates/index.tpl b/webui/source/templates/index.tpl index 559f0f9..412f558 100644 --- a/webui/source/templates/index.tpl +++ b/webui/source/templates/index.tpl @@ -64,6 +64,11 @@
+
+
+ +
+
diff --git a/webui/source/templates/sidebar.tpl b/webui/source/templates/sidebar.tpl index b1fa6e5..16af89d 100644 --- a/webui/source/templates/sidebar.tpl +++ b/webui/source/templates/sidebar.tpl @@ -8,4 +8,10 @@
  • Sources
  • + +
  • Admin + +
  • diff --git a/webui/styles/normal.css b/webui/styles/normal.css index 58bf818..773ab72 100644 --- a/webui/styles/normal.css +++ b/webui/styles/normal.css @@ -142,6 +142,23 @@ label { text-align: right; } +table#settings { + +} + +table#settings td { + padding: 1.0em; + border: 1px solid; + border-collapse: collapse; +} + +table#settings input[type=text] { + width: 40em; +} +.settings_addfieldcontainer { + text-align: right; +} + .default { background: beige; color: darkgray;