From e1ce3196f48c53580d7aa29ca0dba376e223b88f Mon Sep 17 00:00:00 2001 From: Tim Almdal Date: Thu, 4 Jun 2009 23:23:11 +0800 Subject: Rewrite the server_add to have the server format the selection when a branch is opened. Sub trees re only retrieved when the branch is opened. Changed the start task processing to fill in any subtrees that are selected, but were never expanded on the client. Added the loading icon. Signed-off-by: Bharat Mediratta --- modules/server_add/controllers/server_add.php | 45 ++++++++++- modules/server_add/helpers/server_add_theme.php | 6 +- modules/server_add/js/server_add.js | 90 +++++++++++++++------- modules/server_add/views/server_add_tree.html.php | 12 +-- .../views/server_add_tree_dialog.html.php | 5 +- 5 files changed, 116 insertions(+), 42 deletions(-) (limited to 'modules') diff --git a/modules/server_add/controllers/server_add.php b/modules/server_add/controllers/server_add.php index c37eab58..2c6eb5e0 100644 --- a/modules/server_add/controllers/server_add.php +++ b/modules/server_add/controllers/server_add.php @@ -33,6 +33,7 @@ class Server_Add_Controller extends Controller { $tree = new View("server_add_tree.html"); $tree->data = array(); + $tree->checked = false; $tree->tree_id = "tree_$id"; foreach (array_keys($paths) as $path) { $tree->data[$path] = array("path" => $path, "is_dir" => true); @@ -49,6 +50,7 @@ class Server_Add_Controller extends Controller { $paths = unserialize(module::get_var("server_add", "authorized_paths")); $path_valid = false; $path = $this->input->post("path"); + $checked = $this->input->post("checked") == "true"; foreach (array_keys($paths) as $valid_path) { if ($path_valid = strpos($path, $valid_path) === 0) { @@ -65,6 +67,7 @@ class Server_Add_Controller extends Controller { $tree = new View("server_add_tree.html"); $tree->data = $this->_get_children($path); + $tree->checked = $checked; $tree->tree_id = "tree_" . md5($path); print $tree; } @@ -78,18 +81,22 @@ class Server_Add_Controller extends Controller { $item = ORM::factory("item", $id); $paths = unserialize(module::get_var("server_add", "authorized_paths")); $input_files = $this->input->post("path"); + $collapsed = $this->input->post("collapsed"); $files = array(); $total_count = 0; foreach (array_keys($paths) as $valid_path) { $path_length = strlen($valid_path); foreach ($input_files as $key => $path) { - if ($valid_path != $path && strpos($path, $valid_path) === 0) { + if (!empty($path) && $valid_path != $path && strpos($path, $valid_path) === 0) { $relative_path = substr(dirname($path), $path_length); $name = basename($path); $files[$valid_path][] = array("path" => $relative_path, "parent_id" => $id, "name" => basename($path), "type" => is_dir($path) ? "album" : "file"); $total_count++; + if ($collapsed[$key] === "true") { + $total_count += $this->_select_children($id, $valid_path, $path, $files[$valid_path]); + } unset($input_files[$key]); } } @@ -129,6 +136,7 @@ class Server_Add_Controller extends Controller { access::verify_csrf(); $task = task::run($task_id); + // @todo the task is already run... its a little late to check the access if (!$task->loaded || $task->owner_id != user::active()->id) { access::forbidden(); } @@ -194,6 +202,41 @@ class Server_Add_Controller extends Controller { print json_encode(array("result" => "success")); } + private function _select_children($id, $valid_path, $path, &$files) { + $count = 0; + $children = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($path), + RecursiveIteratorIterator::SELF_FIRST); + + $path_length = strlen($valid_path); + foreach($children as $name => $file){ + if ($file->isLink()) { + continue; + } + $filename = $file->getFilename(); + if ($filename[0] != ".") { + if ($file->isDir()) { + $relative_path = substr(dirname($file->getPathname()), $path_length); + $files[] = array("path" => $relative_path, + "parent_id" => $id, "name" => $filename, "type" => "album"); + $count++; + } else { + $extension = strtolower(substr(strrchr($filename, '.'), 1)); + if ($file->isReadable() && + in_array($extension, array("gif", "jpeg", "jpg", "png", "flv", "mp4"))) { + $relative_path = substr(dirname($file->getPathname()), $path_length); + $files[] = array("path" => $relative_path, + "parent_id" => $id, "name" => $filename, "type" => "file"); + $count++; + } + } + } + + } + + return $count; + } + private function _get_children($path) { $directory_list = $file_list = array(); $files = new DirectoryIterator($path); diff --git a/modules/server_add/helpers/server_add_theme.php b/modules/server_add/helpers/server_add_theme.php index 56e85a25..ac7553de 100644 --- a/modules/server_add/helpers/server_add_theme.php +++ b/modules/server_add/helpers/server_add_theme.php @@ -18,6 +18,10 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ class server_add_theme_Core { + static function head($theme) { + return html::script("modules/server_add/js/server_add.js") . "\n";; + } + static function admin_head($theme) { $head = array(); if (strpos(Router::$current_uri, "admin/server_add") !== false) { @@ -30,7 +34,7 @@ class server_add_theme_Core { $head[] = html::script("lib/jquery.autocomplete.js"); $head[] = html::script("modules/server_add/js/admin.js"); } - + return implode("\n", $head); } } \ No newline at end of file diff --git a/modules/server_add/js/server_add.js b/modules/server_add/js/server_add.js index b98b7a86..e2526dbe 100644 --- a/modules/server_add/js/server_add.js +++ b/modules/server_add/js/server_add.js @@ -25,34 +25,56 @@ function init_server_add_form() { type: "POST", url: get_url("server_add/pause", task.id) }); + } else { + document.location.reload(); } }); + set_click_events(); +} + +function set_click_events() { + $(".ui-icon").unbind("click"); + $(":checkbox").unbind("click"); + $(".ui-icon").click(function(event) { + open_close_branch(this, event); + }); + + $("input[type=checkbox]").click(function(event) { + checkbox_click(this); + }); } function open_close_branch(icon, event) { var parent = icon.parentNode; - var children = $(parent).find(".gCheckboxTree"); var closed = $(icon).hasClass("ui-icon-plus"); + var children = $(parent).find(".gCheckboxTree"); if (closed) { if (children.length == 0) { - load_children(parent, function(data, textStatus) { - $(parent).append(data); - $(icon).addClass("ui-icon-minus"); - $(icon).removeClass("ui-icon-plus"); - }); + load_children(icon); } else { - $(icon).addClass("ui-icon-minus"); - $(icon).removeClass("ui-icon-plus"); + toggle_branch("open", icon); } - $(parent).children("ul").slideDown("fast"); } else { - $(icon).addClass("ui-icon-plus"); - $(icon).removeClass("ui-icon-minus"); - $(parent).children("ul").slideUp("fast"); + toggle_branch("close", icon); } } +function toggle_branch(direction, icon) { + var parent = icon.parentNode; + var branch = $(parent).children(".gServerAddChildren"); + $(branch).slideToggle("fast", function() { + if (direction == "open") { + $(icon).addClass("ui-icon-minus"); + $(icon).removeClass("ui-icon-plus"); + $(parent).removeClass("gCollapsed"); + } else { + $(icon).addClass("ui-icon-plus"); + $(icon).removeClass("ui-icon-minus"); + } + }); +} + function get_url(uri, task_id) { var url = $("#gServerAdd form").attr("action"); url = url.replace("__ARGS__", uri); @@ -60,24 +82,30 @@ function get_url(uri, task_id) { return url; } -function checkbox_click(checkbox, event) { - var _this = this; - var parents = $(checkbox).parents("li"); - var parent = parents.get(0); - if ($(parent).hasClass("gDirectory") && $(parent).find(".gCheckboxTree").length == 0) { - load_children(parent, function(data, textStatus) { - $(parent).append(data); - }); +function checkbox_click(checkbox) { + var parent = $(checkbox).parents("li").get(0); + var checked = $(checkbox).attr("checked"); + if (!$(parent).hasClass("gCollapsed")) { + $(parent).find(".gCheckboxTree input[type=checkbox]").attr("checked", checked); } - $(parent).find(".gCheckboxTree :checkbox").click(); - var checked = $("#gServerAdd :checkbox[checked]"); - $("#gServerAdd form :submit").attr("disabled", checked.length == 0); + var checkboxes = $("#gServerAdd :checkbox[checked]"); + $("#gServerAdd form :submit").attr("disabled", checkboxes.length == 0); } -function load_children(parent, callback) { - var parms = "&path=" + $(parent).find(":checkbox").attr("value"); - $.ajax({async: false, - success: callback, +function load_children(icon) { + $("#gDialog").addClass("gDialogLoadingLarge"); + var parent = icon.parentNode; + var checkbox = $(parent).find("input[type=checkbox]"); + var parms = "&path=" + $(checkbox).attr("value"); + parms += "&checked=" + $(checkbox).is(":checked"); + parms += "&collapsed=" + $(parent).hasClass("gCollapsed"); + + $.ajax({success: function(data, textStatus) { + $(parent).children(".gServerAddChildren").html(data); + set_click_events(); + $("#gDialog").removeClass("gDialogLoadingLarge"); + toggle_branch("open", icon); + }, data: parms, dataType: "html", type: "POST", @@ -91,16 +119,20 @@ function do_add(submit, event) { $("#gServerAdd #gServerAddButton").hide(); $("#gServerAdd #gServerPauseButton").show(); + var parms = ""; if (!paused) { $(".gProgressBar").progressbar("value", 0); $(".gProgressBar").css("visibility", "visible"); var check_list = $("#gServerAdd :checkbox[checked]"); - var parms = ""; + var paths = ""; + var collapsed = ""; $.each(check_list, function () { var parent = $(this).parents("li")[0]; - parms += "&path[]=" + this.value; + paths += "&path[]=" + this.value; + collapsed += "&collapsed[]=" + $(parent).hasClass("gCollapsed"); }); + parms = paths + collapsed; } paused = false; diff --git a/modules/server_add/views/server_add_tree.html.php b/modules/server_add/views/server_add_tree.html.php index b7b494e4..33047fb3 100644 --- a/modules/server_add/views/server_add_tree.html.php +++ b/modules/server_add/views/server_add_tree.html.php @@ -1,14 +1,5 @@ diff --git a/modules/server_add/views/server_add_tree_dialog.html.php b/modules/server_add/views/server_add_tree_dialog.html.php index f600ce60..0bfd52e6 100644 --- a/modules/server_add/views/server_add_tree_dialog.html.php +++ b/modules/server_add/views/server_add_tree_dialog.html.php @@ -2,8 +2,11 @@ - +

p::clean($album_title))) ?>

-- cgit v1.2.3