summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Almdal <tnalmdal@shaw.ca>2009-06-04 23:23:11 +0800
committerBharat Mediratta <bharat@menalto.com>2009-06-05 03:13:14 +0800
commite1ce3196f48c53580d7aa29ca0dba376e223b88f (patch)
tree31ffac99ea04c116e6f2f5caee0206e9d366935e
parent13b12f410e92d09d3071b0d55dc55de65996d975 (diff)
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 <bharat@menalto.com>
-rw-r--r--modules/server_add/controllers/server_add.php45
-rw-r--r--modules/server_add/helpers/server_add_theme.php6
-rw-r--r--modules/server_add/js/server_add.js90
-rw-r--r--modules/server_add/views/server_add_tree.html.php12
-rw-r--r--modules/server_add/views/server_add_tree_dialog.html.php5
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>