diff options
Diffstat (limited to 'modules/server_add')
-rw-r--r-- | modules/server_add/controllers/admin_server_add.php | 15 | ||||
-rw-r--r-- | modules/server_add/controllers/server_add.php | 22 | ||||
-rw-r--r-- | modules/server_add/helpers/server_add_event.php | 3 | ||||
-rw-r--r-- | modules/server_add/js/server_add.js | 179 | ||||
-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 | 21 |
6 files changed, 159 insertions, 93 deletions
diff --git a/modules/server_add/controllers/admin_server_add.php b/modules/server_add/controllers/admin_server_add.php index fac2aa44..38190fee 100644 --- a/modules/server_add/controllers/admin_server_add.php +++ b/modules/server_add/controllers/admin_server_add.php @@ -34,15 +34,17 @@ class Admin_Server_Add_Controller extends Admin_Controller { $form = $this->_get_admin_form(); $paths = unserialize(module::get_var("server_add", "authorized_paths", "a:0:{}")); if ($form->validate()) { - if (is_readable($form->add_path->path->value)) { + if (is_link($form->add_path->path->value)) { + $form->add_path->path->add_error("is_symlink", 1); + } else if (!is_readable($form->add_path->path->value)) { + $form->add_path->path->add_error("not_readable", 1); + } else { $path = $form->add_path->path->value; $paths[$path] = 1; module::set_var("server_add", "authorized_paths", serialize($paths)); message::success(t("Added path %path", array("path" => $path))); server_add::check_config($paths); url::redirect("admin/server_add"); - } else { - $form->add_path->path->add_error("not_readable", 1); } } @@ -71,7 +73,7 @@ class Admin_Server_Add_Controller extends Admin_Controller { $directories = array(); $path_prefix = $this->input->get("q"); foreach (glob("{$path_prefix}*") as $file) { - if (is_dir($file)) { + if (is_dir($file) && !is_link($file)) { $directories[] = $file; } } @@ -84,9 +86,10 @@ class Admin_Server_Add_Controller extends Admin_Controller { array("id" => "gServerAddAdminForm")); $add_path = $form->group("add_path"); $add_path->input("path")->label(t("Path"))->rules("required") - ->error_messages("not_readable", t("This directory is not readable by the webserver")); + ->error_messages("not_readable", t("This directory is not readable by the webserver")) + ->error_messages("is_symlink", t("Symbolic links are not allowed")); $add_path->submit("add")->value(t("Add Path")); return $form; } -}
\ No newline at end of file +} diff --git a/modules/server_add/controllers/server_add.php b/modules/server_add/controllers/server_add.php index 26b3bd08..9769cd6f 100644 --- a/modules/server_add/controllers/server_add.php +++ b/modules/server_add/controllers/server_add.php @@ -137,17 +137,25 @@ class Server_Add_Controller extends Admin_Controller { // form [path, parent_id] where the parent_id refers to another Server_Add_File_Model. We // have this extra level of abstraction because we don't know its Item_Model id yet. $queue = $task->get("queue"); + $paths = unserialize(module::get_var("server_add", "authorized_paths")); + while ($queue && microtime(true) - $start < 0.5) { list($file, $parent_entry_id) = array_shift($queue); - $entry = ORM::factory("server_add_file"); - $entry->task_id = $task->id; - $entry->file = $file; - $entry->parent_id = $parent_entry_id; - $entry->save(); + // Ignore the staging directories as directories to be imported. + if (empty($paths[$file])) { + $entry = ORM::factory("server_add_file"); + $entry->task_id = $task->id; + $entry->file = $file; + $entry->parent_id = $parent_entry_id; + $entry->save(); + $entry_id = $entry->id; + } else { + $entry_id = null; + } foreach (glob("$file/*") as $child) { if (is_dir($child)) { - $queue[] = array($child, $entry->id); + $queue[] = array($child, $entry_id); } else { $ext = strtolower(pathinfo($child, PATHINFO_EXTENSION)); if (in_array($ext, array("gif", "jpeg", "jpg", "png", "flv", "mp4")) && @@ -155,7 +163,7 @@ class Server_Add_Controller extends Admin_Controller { $child_entry = ORM::factory("server_add_file"); $child_entry->task_id = $task->id; $child_entry->file = $child; - $child_entry->parent_id = $entry->id; + $child_entry->parent_id = $entry_id; $child_entry->save(); } } diff --git a/modules/server_add/helpers/server_add_event.php b/modules/server_add/helpers/server_add_event.php index b9dd8c28..4db83f74 100644 --- a/modules/server_add/helpers/server_add_event.php +++ b/modules/server_add/helpers/server_add_event.php @@ -30,7 +30,8 @@ class server_add_event_Core { $item = $theme->item(); $paths = unserialize(module::get_var("server_add", "authorized_paths")); - if ($item && user::active()->admin && $item->is_album() && !empty($paths)) { + if ($item && user::active()->admin && $item->is_album() && !empty($paths) && + is_writable($item->is_album() ? $item->file_path() : $item->parent()->file_path())) { $menu->get("add_menu") ->append(Menu::factory("dialog") ->id("server_add") diff --git a/modules/server_add/js/server_add.js b/modules/server_add/js/server_add.js index 51ef41a7..50a8c36b 100644 --- a/modules/server_add/js/server_add.js +++ b/modules/server_add/js/server_add.js @@ -1,64 +1,125 @@ -/** - * Manage file selection state. - */ -function select_file(li) { - $(li).toggleClass("selected"); - if ($("#gServerAdd span.selected").length) { - $("#gServerAddAddButton").enable(true).removeClass("ui-state-disabled"); - } else { - $("#gServerAddAddButton").enable(false).addClass("ui-state-disabled"); - } -} +(function($) { + $.widget("ui.gallery_server_add", { + _init: function() { + var self = this; + $("#gServerAddAddButton", this.element).click(function(event) { + event.preventDefault(); + $(".gProgressBar", this.element). + progressbar(). + progressbar("value", 0); + $("#gServerAddProgress", this.element).slideDown("fast", function() { self.start_add(); }); + }); + $("#gServerAddPauseButton", this.element).click(function(event) { + self.pause = true; + $("#gServerAddPauseButton", this.element).hide(); + $("#gServerAddContinueButton", this.element).show(); + }); + $("#gServerAddContinueButton", this.element).click(function(event) { + self.pause = false; + $("#gServerAddPauseButton", this.element).show(); + $("#gServerAddContinueButton", this.element).hide(); + self.run_add(); + }); + $("#gServerAddCloseButton", this.element).click(function(event) { + $("#gDialog").dialog("close"); + window.location.reload(); + }); + $("#gServerAddTree span.gDirectory", this.element).dblclick(function(event) { + self.open_dir(event); + }); + $("#gServerAddTree span.gFile, #gServerAddTree span.gDirectory", this.element).click(function(event) { + self.select_file(event); + }); + $("#gServerAddTree span.gDirectory", this.element).dblclick(function(event) { + self.open_dir(event); + }); + $("#gDialog").bind("dialogclose", function(event, ui) { + window.location.reload(); + }); + }, -/** - * Load a new directory - */ -function open_dir(path) { - $.ajax({ - url: GET_CHILDREN_URL.replace("__PATH__", path), - success: function(data, textStatus) { - $("#gServerAddTree").html(data); - } - }); -} + taskURL: null, + pause: false, -function start_add() { - var paths = []; - $.each($("#gServerAdd span.selected"), - function () { - paths.push($(this).attr("file")); - } - ); + start_add: function() { + var self = this; + var paths = []; + $.each($("span.selected", self.element), function () { + paths.push($(this).attr("ref")); + }); - $.ajax({ - url: START_URL, - type: "POST", - async: false, - data: { "paths[]": paths }, - dataType: "json", - success: function(data, textStatus) { - $("#gStatus").html(data.status); - $("#gServerAdd .gProgressBar").progressbar("value", data.percent_complete); - setTimeout(function() { run_add(data.url); }, 0); - } - }); - return false; -} + $("#gServerAddAddButton", this.element).hide(); + $("#gServerAddPauseButton", this.element).show(); -function run_add(url) { - $.ajax({ - url: url, - async: false, - dataType: "json", - success: function(data, textStatus) { - $("#gStatus").html(data.status); - $("#gServerAdd .gProgressBar").progressbar("value", data.percent_complete); - if (data.done) { - $("#gServerAddProgress").slideUp(); - } else { - setTimeout(function() { run_add(url); }, 0); - } - } - }); -} + $.ajax({ + url: START_URL, + type: "POST", + async: false, + data: { "paths[]": paths }, + dataType: "json", + success: function(data, textStatus) { + $("#gStatus").html(data.status); + $(".gProgressBar", self.element).progressbar("value", data.percent_complete); + self.taskURL = data.url; + setTimeout(function() { self.run_add(); }, 25); + } + }); + return false; + }, + run_add: function () { + var self = this; + $.ajax({ + url: self.taskURL, + async: false, + dataType: "json", + success: function(data, textStatus) { + $("#gStatus").html(data.status); + $(".gProgressBar", self.element).progressbar("value", data.percent_complete); + if (data.done) { + $("#gServerAddProgress", this.element).slideUp(); + $("#gServerAddAddButton", this.element).show(); + $("#gServerAddPauseButton", this.element).hide(); + $("#gServerAddContinueButton", this.element).hide(); + } else { + if (!self.pause) { + setTimeout(function() { self.run_add(); }, 25); + } + } + } + }); + }, + + /** + * Load a new directory + */ + open_dir: function(event) { + var self = this; + var path = $(event.target).attr("ref"); + $.ajax({ + url: GET_CHILDREN_URL.replace("__PATH__", path), + success: function(data, textStatus) { + $("#gServerAddTree", self.element).html(data); + $("#gServerAddTree span.gDirectory", self.element).dblclick(function(event) { + self.open_dir(event); + }); + $("#gServerAddTree span.gFile, #gServerAddTree span.gDirectory", this.element).click(function(event) { + self.select_file(event); + }); + } + }); + }, + + /** + * Manage file selection state. + */ + select_file: function (event) { + $(event.target).toggleClass("selected"); + if ($("#gServerAdd span.selected").length) { + $("#gServerAddAddButton").enable(true).removeClass("ui-state-disabled"); + } else { + $("#gServerAddAddButton").enable(false).addClass("ui-state-disabled"); + } + } + }); +})(jQuery); diff --git a/modules/server_add/views/server_add_tree.html.php b/modules/server_add/views/server_add_tree.html.php index 918fbdc7..4e5bf601 100644 --- a/modules/server_add/views/server_add_tree.html.php +++ b/modules/server_add/views/server_add_tree.html.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access.") ?> <li class="ui-icon-left"> <span class="ui-icon ui-icon-folder-open"></span> - <span ondblclick="open_dir('')"> + <span class="gDirectory" ref=""> <?= t("All") ?> </span> <ul> @@ -9,7 +9,7 @@ <? foreach ($parents as $dir): ?> <li class="ui-icon-left"> <span class="ui-icon ui-icon-folder-open"></span> - <span ondblclick='open_dir(<?= html::js_string($dir) ?>)'> + <span class="gDirectory" ref="<?= html::clean_attribute($dir) ?>"> <?= html::clean(basename($dir)) ?> </span> <ul> @@ -18,12 +18,8 @@ <? foreach ($files as $file): ?> <li class="ui-icon-left"> <span class="ui-icon <?= is_dir($file) ? "ui-icon-folder-collapsed" : "ui-icon-document" ?>"></span> - <span onclick="select_file(this)" - <? if (is_dir($file)): ?> - ondblclick="open_dir($(this).attr('file'))" - <? endif ?> - file="<?= html::clean_attribute($file) ?>" - > + <span class="<?= is_dir($file) ? "gDirectory" : "gFile" ?>" + ref="<?= html::clean_attribute($file) ?>" > <?= html::clean(basename($file)) ?> </span> </li> 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 8eb6e4df..fdb66d1c 100644 --- a/modules/server_add/views/server_add_tree_dialog.html.php +++ b/modules/server_add/views/server_add_tree_dialog.html.php @@ -33,24 +33,21 @@ disabled="disabled"> <?= t("Add") ?> </button> + <button id="gServerAddPauseButton" class="ui-state-default ui-corner-all" style="display:none"> + <?= t("Pause") ?> + </button> + <button id="gServerAddContinueButton" class="ui-state-default ui-corner-all" style="display:none"> + <?= t("Continue") ?> + </button> - <button id="gServerCloseButton" class="ui-state-default ui-corner-all"> + <button id="gServerAddCloseButton" class="ui-state-default ui-corner-all"> <?= t("Close") ?> </button> </span> <script type="text/javascript"> - $("#gServerAddAddButton").ready(function() { - $("#gServerAddAddButton").click(function(event) { - event.preventDefault(); - $("#gServerAdd .gProgressBar"). - progressbar(). - progressbar("value", 0); - $("#gServerAddProgress").slideDown("fast", function() { start_add() }); - }); - $("#gServerCloseButton").click(function(event) { - $("#gDialog").dialog("close"); - }); + $("#gServerAdd").ready(function() { + $("#gServerAdd").gallery_server_add(); }); </script> |