diff options
Diffstat (limited to 'modules/server_add')
-rw-r--r-- | modules/server_add/controllers/server_add.php | 45 | ||||
-rw-r--r-- | modules/server_add/helpers/server_add_theme.php | 6 | ||||
-rw-r--r-- | modules/server_add/js/server_add.js | 90 | ||||
-rw-r--r-- | modules/server_add/views/server_add_tree.html.php | 12 | ||||
-rw-r--r-- | modules/server_add/views/server_add_tree_dialog.html.php | 5 |
5 files changed, 116 insertions, 42 deletions
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 @@ <?php defined("SYSPATH") or die("No direct script access.") ?> <script type="text/javascript"> -$("#<?= $tree_id ?>").ready(function() { - $("#<?= $tree_id ?> span.ui-icon").click(function(event) { - open_close_branch(this, event); - }); - - $("#<?= $tree_id ?> :checkbox").click(function(event) { - checkbox_click(this, event); - }); -}); </script> <ul id="<?= $tree_id ?>" class="gCheckboxTree"> <? foreach ($data as $file => $file_info): ?> @@ -16,7 +7,8 @@ $("#<?= $tree_id ?>").ready(function() { <? if (!empty($file_info["is_dir"])): ?> <span class="ui-icon ui-icon-plus"></span> <? endif ?> - <label> <?= form::checkbox("checkbox[]", p::clean($file_info["path"])) . " " . p::clean($file) ?> </label> + <label> <?= form::checkbox("checkbox[]", p::clean($file_info["path"]), $checked) . " " . p::clean($file) ?> </label> + <div class="gServerAddChildren" style="display: none"></div> </li> <? endforeach ?> </ul> 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 @@ <script> var FATAL_ERROR = "<?= t("Fatal Error") ?>"; var FILE_IMPORT_WARNING = "<?= t("Add from server warning") ?>"; + $("#gServerAdd").ready(function() { + init_server_add_form(); + }); </script> -<?= html::script("modules/server_add/js/server_add.js"); ?> +<!-- ?= html::script("modules/server_add/js/server_add.js"); ? --> <div id="gServerAdd"> <h1 style="display: none;"><?= t("Add Photos to '%title'", array("title" => p::clean($album_title))) ?></h1> |