From eb1e330bc4bc7bc80b5a42aa45f788e81dc34748 Mon Sep 17 00:00:00 2001 From: Ben Roberts Date: Mon, 22 Aug 2011 18:47:45 +0100 Subject: [PATCH 1/2] Added ajax support, and verified with an ajaxified Delete Source feature --- source/lib/RippingCluster/Main.class.php | 3 + webui/_inc.php | 9 +- webui/a.php | 22 +++ webui/scripts/main.js | 141 ++++++++++++++++++ webui/source/pages/ajax/delete-source.php | 35 +++++ webui/source/pages/ajax/source-list.php | 9 ++ .../pages/rips/{setup-rip.php => setup.php} | 2 +- .../details.php} | 0 .../{rips/sources.php => sources/list.php} | 0 webui/source/templates/ajax.tpl | 11 ++ webui/source/templates/ajax/delete-source.tpl | 37 +++++ webui/source/templates/ajax/source-list.tpl | 6 + .../templates/fragments/delete-source.tpl | 3 + .../templates/fragments/source-list.tpl | 25 ++++ webui/source/templates/index.tpl | 24 +++ .../rips/{setup-rip.tpl => setup.tpl} | 2 +- webui/source/templates/rips/sources.tpl | 41 ----- webui/source/templates/sidebar.tpl | 2 +- .../details.tpl} | 0 webui/source/templates/sources/list.tpl | 18 +++ webui/styles/normal.css | 49 ++++++ 21 files changed, 394 insertions(+), 45 deletions(-) create mode 100644 webui/a.php create mode 100644 webui/scripts/main.js create mode 100644 webui/source/pages/ajax/delete-source.php create mode 100644 webui/source/pages/ajax/source-list.php rename webui/source/pages/rips/{setup-rip.php => setup.php} (95%) rename webui/source/pages/{rips/source-details.php => sources/details.php} (100%) rename webui/source/pages/{rips/sources.php => sources/list.php} (100%) create mode 100644 webui/source/templates/ajax.tpl create mode 100644 webui/source/templates/ajax/delete-source.tpl create mode 100644 webui/source/templates/ajax/source-list.tpl create mode 100644 webui/source/templates/fragments/delete-source.tpl create mode 100644 webui/source/templates/fragments/source-list.tpl rename webui/source/templates/rips/{setup-rip.tpl => setup.tpl} (98%) delete mode 100644 webui/source/templates/rips/sources.tpl rename webui/source/templates/{rips/source-details.tpl => sources/details.tpl} (100%) create mode 100644 webui/source/templates/sources/list.tpl diff --git a/source/lib/RippingCluster/Main.class.php b/source/lib/RippingCluster/Main.class.php index 88a25a0..23547ab 100644 --- a/source/lib/RippingCluster/Main.class.php +++ b/source/lib/RippingCluster/Main.class.php @@ -17,6 +17,7 @@ class RippingCluster_Main extends SihnonFramework_Main { $this->request = new RippingCluster_RequestParser($request_string); switch (HBC_File) { + case 'ajax': case 'index': { $smarty_tmp = '/tmp/ripping-cluster'; $this->smarty = new Smarty(); @@ -32,6 +33,8 @@ class RippingCluster_Main extends SihnonFramework_Main { $this->smarty->assign('messages', array()); $this->smarty->assign('base_uri', $this->base_uri); + $this->smarty->assign('base_url', static::absoluteUrl('')); + } break; } diff --git a/webui/_inc.php b/webui/_inc.php index d80eca9..0994fd2 100644 --- a/webui/_inc.php +++ b/webui/_inc.php @@ -1,6 +1,13 @@ smarty(); + + $page = new RippingCluster_Page($smarty, $main->request()); + if ($page->evaluate()) { + //header('Content-Type: text/json'); + $smarty->display('ajax.tpl'); + } + +} catch (RippingCluster_Exception $e) { + die("Uncaught Exception: " . $e->getMessage()); +} + +?> diff --git a/webui/scripts/main.js b/webui/scripts/main.js new file mode 100644 index 0000000..660f16c --- /dev/null +++ b/webui/scripts/main.js @@ -0,0 +1,141 @@ +var rc = { + + init: function() { + rc.ajax.init(); + rc.dialog.init(); + rc.page.init(); + }, + + ajax: { + + init: function() { + + }, + + get: function(url) { + $.ajax({ + url: url, + type: "GET", + dataType: "json", + success: rc.ajax.success, + error: rc.ajax.failure + }); + }, + + post: function(url, data) { + $.ajax(url, { + type: "POST", + dataType: "json", + data: data, + success: rc.ajax.success, + error: rc.ajax.failure + }); + }, + + success: function(d, s, x) { + rc.page.update(d); + rc.dialog.prepare(d); + }, + + failure: function(x, s, e) { + console.log("Ajax Failure: " + s, e); + console.log(x.responseText); + } + }, + + dialog: { + + init: function() { + $("#dialogheaderclose").click(rc.dialog.close); + }, + + prepare: function(d) { + if (d.dialog && d.dialog.show) { + + if (d.dialog.buttons) { + switch (d.dialog.buttons.type) { + case 'yesno': + $("#dialogfooteryes").click( + function() { + rc.trigger(d.dialog.buttons.actions.yes, d.dialog.buttons.params); + } + ); + $("#dialogfooterno").click( + function() { + rc.trigger(d.dialog.buttons.actions.no, d.dialog.buttons.params); + } + ); + $("#dialogfooteryesno").show(); + break; + } + } + + $("#dialog").show(); + } + }, + + close: function() { + $("#dialog").hide(); + $(".dialogfooterbuttonset").hide(); + $("#dialogcontent").html(); + } + + }, + + page: { + + init: function() { + + }, + + update: function(d) { + for ( var f in d.page_replacements) { + $("#" + f).html(d.page_replacements[f].content); + } + } + }, + + sources: { + + remove: function(plugin, source) { + rc.ajax.get(base_url + "ajax/delete-source/plugin/" + plugin + "/id/" + source); + }, + + remove_confirmed: function(plugin, source) { + rc.ajax.get(base_url + "ajax/delete-source/plugin/" + plugin + "/id/" + source + "/confirm/"); + } + + }, + + actions: { + + 'close-dialog': function(params) { + rc.dialog.close(); + }, + + 'delete-source-confirm': function(params) { + rc.sources.remove_confirmed(params['plugin'], params['id']); + } + + }, + + trigger: function(action, params) { + // Handle a list of actions by repeated calling self for each argument + if (action instanceof Array) { + for(i in action) { + rc.trigger(action[i], params); + } + return; + } + + // Check if action is supported, and execute it + if (rc.actions[action]) { + rc.actions[action](params); + } else { + console.log("Action not supported: " +action); + } + } + +}; + +$(document).ready(rc.init); diff --git a/webui/source/pages/ajax/delete-source.php b/webui/source/pages/ajax/delete-source.php new file mode 100644 index 0000000..c43e37f --- /dev/null +++ b/webui/source/pages/ajax/delete-source.php @@ -0,0 +1,35 @@ +request(); +$config = $main->config(); + +// Grab the name of this source +$encoded_filename = null; +if ($req->exists('confirm')) { + $this->smarty->assign('confirmed', true); + + $plugin = $req->get('plugin', 'RippingCluster_Exception_InvalidParameters'); + $encoded_filename = $req->get('id', 'RippingCluster_Exception_InvalidParameters'); + + $source = RippingCluster_Source_PluginFactory::loadEncoded($plugin, $encoded_filename, false); + $source->delete(); + + // Generate a new list of sources to update the page with + $all_sources = RippingCluster_Source_PluginFactory::enumerateAll(); + $this->smarty->assign('all_sources', $all_sources); + +} else { + $this->smarty->assign('confirmed', false); + + $plugin = $req->get('plugin', 'RippingCluster_Exception_InvalidParameters'); + $encoded_filename = $req->get('id', 'RippingCluster_Exception_InvalidParameters'); + + $source = RippingCluster_Source_PluginFactory::loadEncoded($plugin, $encoded_filename, false); + + $this->smarty->assign('source', $source); + $this->smarty->assign('source_plugin', $plugin); + $this->smarty->assign('source_id', $encoded_filename); +} + +?> \ No newline at end of file diff --git a/webui/source/pages/ajax/source-list.php b/webui/source/pages/ajax/source-list.php new file mode 100644 index 0000000..483dceb --- /dev/null +++ b/webui/source/pages/ajax/source-list.php @@ -0,0 +1,9 @@ +config(); + +$all_sources = RippingCluster_Source_PluginFactory::enumerateAll(); +$this->smarty->assign('all_sources', $all_sources); + +?> \ No newline at end of file diff --git a/webui/source/pages/rips/setup-rip.php b/webui/source/pages/rips/setup.php similarity index 95% rename from webui/source/pages/rips/setup-rip.php rename to webui/source/pages/rips/setup.php index 08ca181..34c04db 100644 --- a/webui/source/pages/rips/setup-rip.php +++ b/webui/source/pages/rips/setup.php @@ -15,7 +15,7 @@ if ($req->exists('submit')) { // Spawn the background client process to run all the jobs RippingCluster_Job::runAllJobs(); - RippingCluster_Page::redirect('rips/setup-rip/queued'); + RippingCluster_Page::redirect('rips/setup/queued'); } elseif ($req->exists('queued')) { $this->smarty->assign('rips_submitted', true); diff --git a/webui/source/pages/rips/source-details.php b/webui/source/pages/sources/details.php similarity index 100% rename from webui/source/pages/rips/source-details.php rename to webui/source/pages/sources/details.php diff --git a/webui/source/pages/rips/sources.php b/webui/source/pages/sources/list.php similarity index 100% rename from webui/source/pages/rips/sources.php rename to webui/source/pages/sources/list.php diff --git a/webui/source/templates/ajax.tpl b/webui/source/templates/ajax.tpl new file mode 100644 index 0000000..99362e6 --- /dev/null +++ b/webui/source/templates/ajax.tpl @@ -0,0 +1,11 @@ +{ + {if $messages} + messages: [ + {foreach from=$messages item=message} + '{$message}', + {/foreach} + ], + {/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 new file mode 100644 index 0000000..1177770 --- /dev/null +++ b/webui/source/templates/ajax/delete-source.tpl @@ -0,0 +1,37 @@ + +"page_replacements": { + {if $confirmed} + "source-list": { + {include file="fragments/source-list.tpl" assign="sources_html"} + "content": {$sources_html|json_encode} + } + {else} + "dialogcontent": { + {include file="fragments/delete-source.tpl" assign="delete_source_html"} + "content": {$delete_source_html|json_encode} + } + {/if} + +{if ! $confirmed} +}, + +"dialog": { + "show": true, + "buttons": { + "type": "yesno", + "actions": { + "yes": [ + "delete-source-confirm", + "close-dialog" + ], + "no": "close-dialog" + }, + "params": { + "plugin": {$source_plugin|json_encode}, + "id": {$source_id|json_encode} + } + } +} +{else} +} +{/if} diff --git a/webui/source/templates/ajax/source-list.tpl b/webui/source/templates/ajax/source-list.tpl new file mode 100644 index 0000000..082f2ce --- /dev/null +++ b/webui/source/templates/ajax/source-list.tpl @@ -0,0 +1,6 @@ +"page_replacements": { + "source-list": { + {include file="fragments/source-list.tpl" assign="sources_html"} + "content": {$sources_html|json_encode} + } +} \ No newline at end of file diff --git a/webui/source/templates/fragments/delete-source.tpl b/webui/source/templates/fragments/delete-source.tpl new file mode 100644 index 0000000..60f383f --- /dev/null +++ b/webui/source/templates/fragments/delete-source.tpl @@ -0,0 +1,3 @@ +

+ Are you sure you want to delete {$source->plugin()|escape:"html"}:{$source->filename()|escape:"html"}? +

diff --git a/webui/source/templates/fragments/source-list.tpl b/webui/source/templates/fragments/source-list.tpl new file mode 100644 index 0000000..69491e1 --- /dev/null +++ b/webui/source/templates/fragments/source-list.tpl @@ -0,0 +1,25 @@ +{foreach from=$all_sources key=type item=sources} +
  • {$type} + {if $sources} + + {else} +

    + There are no {$type} sources available to rip. +

    + {/if} +
  • +{/foreach} + diff --git a/webui/source/templates/index.tpl b/webui/source/templates/index.tpl index 0a54450..559f0f9 100644 --- a/webui/source/templates/index.tpl +++ b/webui/source/templates/index.tpl @@ -6,9 +6,15 @@ + + + @@ -49,6 +55,24 @@ + +
    +
    +
    +
    Dialog
    +
    X
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    diff --git a/webui/source/templates/rips/setup-rip.tpl b/webui/source/templates/rips/setup.tpl similarity index 98% rename from webui/source/templates/rips/setup-rip.tpl rename to webui/source/templates/rips/setup.tpl index 8c948c0..b8a4061 100644 --- a/webui/source/templates/rips/setup-rip.tpl +++ b/webui/source/templates/rips/setup.tpl @@ -10,7 +10,7 @@ {else}

    {$source->filename()|escape:"html"}

    -
    +
    Configure global rip options diff --git a/webui/source/templates/rips/sources.tpl b/webui/source/templates/rips/sources.tpl deleted file mode 100644 index 882982b..0000000 --- a/webui/source/templates/rips/sources.tpl +++ /dev/null @@ -1,41 +0,0 @@ -

    Sources

    - -{if $all_sources} -

    - The list below contains all the DVD sources that are available and ready for ripping. -

    -

    - Sources that have recently been scanned are marked (cached) and will load fairly quickly. - Sources that have not been cached will be scanned when the link is clicked, and this may take several minutes so please be patient. -

    -
      - {foreach from=$all_sources key=type item=sources} -
    • {$type} - {if $sources} -
        - {foreach from=$sources item=source} - {assign var='source_plugin' value=$source->plugin()} - {assign var='source_filename' value=$source->filename()} - {assign var='source_filename_encoded' value=$source->filenameEncoded()} - {assign var='source_cached' value=$source->isCached()} -
      • - [ Browse | - Rip | - Delete ] - {$source_filename|escape:'html'}{if $source_cached} (cached){/if} -
      • - {/foreach} -
      - {else} -

      - There are no {$type} sources available to rip. -

      - {/if} -
    • - {/foreach} -
    -{else} -

    - There are currently no sources available to rip. -

    -{/if} diff --git a/webui/source/templates/sidebar.tpl b/webui/source/templates/sidebar.tpl index ee632e8..b1fa6e5 100644 --- a/webui/source/templates/sidebar.tpl +++ b/webui/source/templates/sidebar.tpl @@ -5,7 +5,7 @@
  • Browse
  • diff --git a/webui/source/templates/rips/source-details.tpl b/webui/source/templates/sources/details.tpl similarity index 100% rename from webui/source/templates/rips/source-details.tpl rename to webui/source/templates/sources/details.tpl diff --git a/webui/source/templates/sources/list.tpl b/webui/source/templates/sources/list.tpl new file mode 100644 index 0000000..5684f7a --- /dev/null +++ b/webui/source/templates/sources/list.tpl @@ -0,0 +1,18 @@ +

    Sources

    + +{if $all_sources} +

    + The list below contains all the DVD sources that are available and ready for ripping. +

    +

    + Sources that have recently been scanned are marked (cached) and will load fairly quickly. + Sources that have not been cached will be scanned when the link is clicked, and this may take several minutes so please be patient. +

    +
      + {include file="fragments/source-list.tpl"} +
    +{else} +

    + There are currently no sources available to rip. +

    +{/if} diff --git a/webui/styles/normal.css b/webui/styles/normal.css index 89dafec..58bf818 100644 --- a/webui/styles/normal.css +++ b/webui/styles/normal.css @@ -93,6 +93,55 @@ label { margin: 1em; } +/* Centred dialog taken from http://stackoverflow.com/questions/1205457/how-to-design-a-css-for-a-centered-floating-confirm-dialog */ +#centrepoint { + top: 50%; + left: 50%; + position: absolute; +} +#dialog { + position: relative; + width: 600px; + margin-left: -300px; + /*height: 20em;*/ + margin-top: -20em; + + display: none; + background: #eeeeee; + border: 2px solid #a7a09a; +} +#dialogheader { + height: 2em; + width: 100%; + margin: 0.3em; +} +#dialogheadertitle { + color: black; + font-weight: bold; + float: left; +} +#dialogheaderclose { + width: 1.2em; + height: 1.2em; + background-color: crimson; + color: white; + border: 1px solid fireBrick; + float: right; + margin-right: 1em; + text-align: center; + vertical-align: middle; + display: table-cell; + font-weight: bold; + cursor: pointer; +} +#dialogcontent { + padding: 0.5em; +} +.dialogfooterbuttonset { + display: none; + text-align: right; +} + .default { background: beige; color: darkgray; From a061c23041b7a2ea6a14a54c63c538b36c419e9a Mon Sep 17 00:00:00 2001 From: Ben Roberts Date: Mon, 22 Aug 2011 19:03:36 +0100 Subject: [PATCH 2/2] Bumped version number to 0.2 --- source/lib/RippingCluster/Main.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/lib/RippingCluster/Main.class.php b/source/lib/RippingCluster/Main.class.php index 23547ab..b2b4389 100644 --- a/source/lib/RippingCluster/Main.class.php +++ b/source/lib/RippingCluster/Main.class.php @@ -29,7 +29,7 @@ class RippingCluster_Main extends SihnonFramework_Main { $this->smarty->registerPlugin('modifier', 'formatDuration', array('RippingCluster_Main', 'formatDuration')); $this->smarty->registerPlugin('modifier', 'formatFilesize', array('RippingCluster_Main', 'formatFilesize')); - $this->smarty->assign('version', '0.1'); + $this->smarty->assign('version', '0.2'); $this->smarty->assign('messages', array()); $this->smarty->assign('base_uri', $this->base_uri);