summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-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>