From a9e3692027dc767b340242ed18fe7184cbfd883d Mon Sep 17 00:00:00 2001 From: Tim Almdal Date: Thu, 21 May 2009 01:31:29 +0000 Subject: 1) This provides the editting functionality for albums and photos in the organize feature. 2) Remove the tag functionality at this point 3) Added a callback to handle validating conflicting names (only used by organize at this point. 4) Closes #231 --- core/controllers/core_organize.php | 99 +++++++++++++++ core/helpers/core_event.php | 13 +- core/helpers/core_organize.php | 63 +++++++++ core/helpers/item.php | 20 ++- core/views/organize_edit_general.html.php | 15 --- core/views/organize_edit_sort.html.php | 11 -- modules/organize/css/organize.css | 6 + modules/organize/js/organize.js | 141 +++++++++++++++------ modules/organize/views/organize.html.php | 25 ++-- .../organize/views/organize_button_pane.html.php | 75 ++++++----- modules/organize/views/organize_edit.html.php | 10 +- modules/tag/helpers/tag_event.php | 34 ----- modules/tag/views/tag_organize.html.php | 25 ---- 13 files changed, 350 insertions(+), 187 deletions(-) create mode 100644 core/controllers/core_organize.php create mode 100644 core/helpers/core_organize.php delete mode 100644 core/views/organize_edit_general.html.php delete mode 100644 core/views/organize_edit_sort.html.php delete mode 100644 modules/tag/views/tag_organize.html.php diff --git a/core/controllers/core_organize.php b/core/controllers/core_organize.php new file mode 100644 index 00000000..99f8b199 --- /dev/null +++ b/core/controllers/core_organize.php @@ -0,0 +1,99 @@ +post("item"); + $item = ORM::factory("item") + ->in("id", $itemids[0]) + ->find(); + access::required("edit", $item); + + $form = core_organize::getGeneralEditForm($item); + if ($form->validate()) { + $orig = clone $item; + $item->title = $form->title->value; + $item->description = $form->description->value; + $item->rename($form->dirname->value); + $item->save(); + + module::event("item_updated", $orig, $item); + + if ($item->is_album()) { + log::success("content", "Updated album", "id\">view"); + $message = t("Saved album %album_title", array("album_title" => $item->title)); + } else { + log::success("content", "Updated photo", "id\">view"); + $message = t("Saved photo %photo_title", array("photo_title" => $item->title)); + } + print json_encode(array("form" => $form->__toString(), "message" => $message)); + } else { + print json_encode(array("form" => $form->__toString())); + } + } + + public function sort() { + access::verify_csrf(); + + $itemids = Input::instance()->post("item"); + $item = ORM::factory("item") + ->in("id", $itemids[0]) + ->find(); + access::required("edit", $item); + + $form = core_organize::getSortEditForm($item); + if ($form->validate()) { + $orig = clone $item; + $item->sort_column = $form->column->value; + $item->sort_order = $form->direction->value; + $item->save(); + + module::event("item_updated", $orig, $item); + + log::success("content", "Updated album", "id\">view"); + $message = t("Saved album %album_title", array("album_title" => $item->title)); + print json_encode(array("form" => $form->__toString(), "message" => $message)); + } else { + print json_encode(array("form" => $form->__toString())); + } + } + + public function reset_general() { + $itemids = Input::instance()->get("item"); + $item = ORM::factory("item") + ->in("id", $itemids[0]) + ->find(); + access::required("edit", $item); + + print core_organize::getGeneralEditForm($item); + } + + public function reset_sort() { + $itemids = Input::instance()->get("item"); + $item = ORM::factory("item") + ->in("id", $itemids[0]) + ->find(); + access::required("edit", $item); + + print core_organize::getSortEditForm($item); + } + +} diff --git a/core/helpers/core_event.php b/core/helpers/core_event.php index c9e4e743..d1869360 100644 --- a/core/helpers/core_event.php +++ b/core/helpers/core_event.php @@ -44,19 +44,12 @@ class core_event_Core { ->in("id", $event_parms->itemids[0]) ->find(); - $generalPane = new View("organize_edit_general.html"); - $generalPane->item = $item; - $event_parms->panes[] = array("label" => $item->is_album() ? t("Edit Album") : t("Edit Photo"), - "content" => $generalPane); + "content" => core_organize::getGeneralEditForm($item)); if ($item->is_album()) { - $sortPane = new View("organize_edit_sort.html"); - $sortPane->sort_by = $item->sort_column; - $sortPane->sort_order = - empty($item->sort_order) || $item->sort_order == "ASC" ? t("Ascending") : t("Descending"); - - $event_parms->panes[] = array("label" => t("Sort Order"), "content" => $sortPane); + $event_parms->panes[] = array("label" => t("Sort Order"), + "content" => core_organize::getSortEditForm($item)); } } diff --git a/core/helpers/core_organize.php b/core/helpers/core_organize.php new file mode 100644 index 00000000..6ccc0197 --- /dev/null +++ b/core/helpers/core_organize.php @@ -0,0 +1,63 @@ + "gEditGeneral", "ref" => "general")); + // In this case we know there is only 1 item, but in general we should loop + // and create multiple hidden items. + $generalPane->hidden("item[]")->value($item->id); + $generalPane->input("title")->label(t("Title"))->value($item->title); + $generalPane->textarea("description")->label(t("Description"))->value($item->description); + $generalPane->input("dirname")->label(t("Path Name"))->value($item->name) + ->callback("item::validate_no_slashes") + ->error_messages("no_slashes", t("The directory name can't contain a \"/\"")) + ->callback("item::validate_no_trailing_period") + ->error_messages("no_trailing_period", t("The directory name can't end in \".\"")) + ->callback("item::validate_no_name_conflict") + ->error_messages("conflict", t("The path name is not unique")); + + return $generalPane; + } + + static function getSortEditForm($item) { + $sortPane = new Forge("core_organize/__FUNCTION__", "", "post", + array("id" => "gEditSort", "ref" => "sort")); + $sortPane->hidden("item[]")->value($item->id); + $sortPane->dropdown("column", array("id" => "gAlbumSortColumn")) + ->label(t("Sort by")) + ->options(array("weight" => t("Default"), + "captured" => t("Capture Date"), + "created" => t("Creation Date"), + "title" => t("Title"), + "updated" => t("Updated Date"), + "view_count" => t("Number of views"), + "rand_key" => t("Random"))) + ->selected($item->sort_column); + $sortPane->dropdown("direction", array("id" => "gAlbumSortDirection")) + ->label(t("Order")) + ->options(array("ASC" => t("Ascending"), + "DESC" => t("Descending"))) + ->selected($item->sort_order); + + return $sortPane; + } +} diff --git a/core/helpers/item.php b/core/helpers/item.php index 8ff09535..7daaf1e1 100644 --- a/core/helpers/item.php +++ b/core/helpers/item.php @@ -79,9 +79,27 @@ class item_Core { } } - static function validate_no_trailing_period($input) { + static function validate_no_trailing_period($input) { if (rtrim($input->value, ".") !== $input->value) { $input->add_error("no_trailing_period", 1); } } + + static function validate_no_name_conflict($input) { + $itemid = Input::instance()->post("item"); + if (is_array($itemid)) { + $itemid = $itemid[0]; + } + $item = ORM::factory("item") + ->in("id", $itemid) + ->find(); + if (Database::instance() + ->from("items") + ->where("parent_id", $item->parent_id) + ->where("id <>", $item->id) + ->where("name", $input->value) + ->count_records()) { + $input->add_error("conflict", 1); + } + } } \ No newline at end of file diff --git a/core/views/organize_edit_general.html.php b/core/views/organize_edit_general.html.php deleted file mode 100644 index 84e666d8..00000000 --- a/core/views/organize_edit_general.html.php +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/core/views/organize_edit_sort.html.php b/core/views/organize_edit_sort.html.php deleted file mode 100644 index 1151b014..00000000 --- a/core/views/organize_edit_sort.html.php +++ /dev/null @@ -1,11 +0,0 @@ - - diff --git a/modules/organize/css/organize.css b/modules/organize/css/organize.css index cef25f1c..0fdf5aef 100644 --- a/modules/organize/css/organize.css +++ b/modules/organize/css/organize.css @@ -170,12 +170,18 @@ width: 15px; } +#gOrganizeEditHandleButtonsMiddle, #gOrganizeEditHandleButtonsLeft { float: left; height: 20px; padding: 2px 10px; } +#gOrganizeEditHandleButtonsMiddle { + margin-left: 20px; +} + +#gOrganizeEditHandleButtonsMiddle a, #gOrganizeEditHandleButtonsLeft a { float: left; margin: 0 2.5px; diff --git a/modules/organize/js/organize.js b/modules/organize/js/organize.js index 538e366d..30b3f8b6 100644 --- a/modules/organize/js/organize.js +++ b/modules/organize/js/organize.js @@ -150,9 +150,7 @@ var selectable = { setDrawerButtonState(); }, stop: function(event, ui) { - if ($("#gMicroThumbGrid li.ui-selected").length > 0) { - getEditForm(); - } + getEditForm(); } }; @@ -197,11 +195,21 @@ function drawerHandleButtonsClick(event) { var operation = $(this).attr("ref"); switch (operation) { case "edit": + case "close": $("#gOrganizeEditDrawerPanel").animate( {"height": "toggle", "display": "block"}, {duration: "fast", complete: function() { setSelectedThumbs(); + if (operation == "close") { + $("#gOrganizeEditHandleButtonsLeft a[ref='edit']").css("display", "inline-block"); + $("#gOrganizeEditHandleButtonsLeft a[ref='close']").css("display", "none"); + $("#gOrganizeEditHandleButtonsMiddle a").css("display", "none"); + } else { + $("#gOrganizeEditHandleButtonsLeft a[ref='edit']").css("display", "none"); + $("#gOrganizeEditHandleButtonsLeft a[ref='close']").css("display", "inline-block"); + $("#gOrganizeEditHandleButtonsMiddle a").css("display", "inline-block"); + } }, step: function() { $("#gMicroThumbPanel").height(heightMicroThumbPanel - $(this).height()); @@ -209,22 +217,59 @@ function drawerHandleButtonsClick(event) { }); break; case "select-all": - $(".gMicroThumbContainer").addClass("ui-selected"); + $("#gMicroThumbGrid li").addClass("ui-selected"); $("#gMicroThumbSelectAll").hide(); $("#gMicroThumbUnselectAll").show(); + setDrawerButtonState(); + getEditForm(); break; case "unselect-all": - $(".gMicroThumbContainer").removeClass("ui-selected"); + $("#gMicroThumbGrid li").removeClass("ui-selected"); $("#gMicroThumbSelectAll").show(); $("#gMicroThumbUnselectAll").hide(); + setDrawerButtonState(); break; - case "close": + case "done": $("#gDialog").dialog("close"); break; + case "submit": + var currentTab = $("#gOrganizeEditForm").tabs("option", "selected"); + var form = $("#pane-"+currentTab+" form"); + var url = $(form).attr("action") + .replace("__FUNCTION__", $(form).attr("ref")); + $.ajax({ + data: $(form).serialize(), + dataType: "json", + success: function (data, textStatus) { + if (data.task) { + // @todo if task is sent then create a progress bar and run the task + } else { + $("#pane-"+currentTab).children("form").replaceWith(data.form); + if (data.message) { + $("#pane-"+currentTab + " form").before("
" + data.message +"
"); + } + } + }, + type: "POST", + url: url + }); + break; + case "reset": + currentTab = $("#gOrganizeEditForm").tabs("option", "selected"); + form = $("#pane-"+currentTab+" form"); + $.ajax({ + data: serializeItemIds("#gMicroThumbPanel li.ui-selected"), + dataType: "html", + success: function (data, textStatus) { + $("#pane-"+currentTab + " form").replaceWith(data); + }, + type: "GET", + url: $(form).attr("action").replace("__FUNCTION__", "reset_" + $(form).attr("ref")) + }); + break; default: - var postData = serializeItemIds("#gMicroThumbPanel li.ui-selected"); $.ajax({ - data: postData, + data: serializeItemIds("#gMicroThumbPanel li.ui-selected"), dataType: "json", success: operationCallback, type: "POST", @@ -408,25 +453,22 @@ function get_url(uri, parms) { function setDrawerButtonState() { $("#gOrganizeFormThumbStack").empty(); $("#gOrganizeEditForm").empty(); - switch ($("#gMicroThumbGrid li.ui-selected").length) { - case 0: + var selectedCount = $("#gMicroThumbGrid li.ui-selected").length; + if (selectedCount) { + $("#gOrganizeEditHandleButtonsLeft a").removeAttr("disabled"); + $("#gOrganizeEditHandleButtonsLeft a").removeClass("ui-state-disabled"); + + if (selectedCount > 1) { + $("#gOrganizeEditHandleButtonsLeft a[ref='albumCover']").attr("disabled", true); + $("#gOrganizeEditHandleButtonsLeft a[ref='albumCover']").addClass("ui-state-disabled"); + } + setSelectedThumbs(); + } else { if ($("#gOrganizeEditDrawerPanel::visible").length) { - $("#gOrganizeEditHandleButtonsLeft a[ref='edit']").trigger("click"); + $("#gOrganizeEditHandleButtonsLeft a[ref='close']").trigger("click"); } $("#gOrganizeEditHandleButtonsLeft a").attr("disabled", true); $("#gOrganizeEditHandleButtonsLeft a").addClass("ui-state-disabled"); - break; - case 1: - $("#gOrganizeEditHandleButtonsLeft a").removeAttr("disabled"); - $("#gOrganizeEditHandleButtonsLeft a").removeClass("ui-state-disabled"); - setSelectedThumbs(); -// getEditForm(); - break; - default: - $("#gOrganizeEditHandleButtonsLeft a[ref='albumCover']").attr("disabled", true); - $("#gOrganizeEditHandleButtonsLeft a[ref='albumCover']").addClass("ui-state-disabled"); - setSelectedThumbs(); -// getEditForm(); } } @@ -456,17 +498,25 @@ function setSelectedThumbs() { } function getEditForm() { - var postData = ""; - $("li.ui-selected").each(function(i) { - postData += "&item[]=" + $(this).attr("ref"); - }); - var url_data = get_url("organize/editForm", {}) + postData; - $.get(url_data, function(data, textStatus) { + if ($("#gMicroThumbGrid li.ui-selected").length > 0) { + var postData = serializeItemIds("li.ui-selected"); + var url_data = get_url("organize/editForm", {}) + postData; + $.get(url_data, function(data, textStatus) { + $("#gOrganizeEditForm").tabs("destroy"); + $("#gOrganizeEditForm").html(data); + if ($("#gOrganizeEditForm ul li").length) { + $("#gOrganizeEditForm").tabs(); + $("#gOrganizeEditHandleButtonsMiddle a").removeAttr("disabled"); + $("#gOrganizeEditHandleButtonsMiddle a").removeClass("ui-state-disabled"); + } else { + $("#gOrganizeEditHandleButtonsMiddle a").attr("disabled", true); + $("#gOrganizeEditHandleButtonsMiddle a").addClass("ui-state-disabled"); + } + }); + } else { $("#gOrganizeEditForm").tabs("destroy"); - //$("#gOrganizeEditForm").empty(); - $("#gOrganizeEditForm").html(data); - $("#gOrganizeEditForm").tabs(); - }); + $("#gOrganizeEditForm").empty(); + } } function serializeItemIds(selector) { @@ -478,6 +528,16 @@ function serializeItemIds(selector) { return postData; } +function submitCurrentForm(event) { + console.log("submitCurrentForm"); + return false; +} + +function resetCurrentForm(event) { + console.log("resetCurrentForm"); + return false; +} + function createProgressDialog(title) { $("body").append("
" + "
" + @@ -548,12 +608,13 @@ function getViewportSize() { function displayAjaxError(error) { $("body").append("
" + error + "
"); + $("#gAjaxError").dialog({ - autoOpen: true, - autoResize: false, - modal: true, - resizable: true, - width: 610, - height: $("#gDialog").height() - }); + autoOpen: true, + autoResize: false, + modal: true, + resizable: true, + width: 610, + height: $("#gDialog").height() + }); } diff --git a/modules/organize/views/organize.html.php b/modules/organize/views/organize.html.php index 60c4a524..b1f062a1 100644 --- a/modules/organize/views/organize.html.php +++ b/modules/organize/views/organize.html.php @@ -36,25 +36,18 @@ ref="">
-
-
-
-
    -
-
-
+
+
+
+
-
-
- -
-
- - - -
+
+
+ +
+
diff --git a/modules/organize/views/organize_button_pane.html.php b/modules/organize/views/organize_button_pane.html.php index 9902eafb..cd780d5e 100644 --- a/modules/organize/views/organize_button_pane.html.php +++ b/modules/organize/views/organize_button_pane.html.php @@ -1,39 +1,50 @@ +
+ "> + + -"> - - - - + " style="display: none"> + + - -"> - - - - + + "> + + -"> - - - - - + "> + + + -"> - - - - + "> + + -"> - - - - + "> + + +
+
+ " style="display: none" > + + + " style="display: none" > + + +
+
+ + + +
diff --git a/modules/organize/views/organize_edit.html.php b/modules/organize/views/organize_edit.html.php index c0fc43e5..1adf290f 100644 --- a/modules/organize/views/organize_edit.html.php +++ b/modules/organize/views/organize_edit.html.php @@ -5,6 +5,10 @@ - $pane): ?> -
- + 0): ?> + $pane): ?> +
+ + +
+ \ No newline at end of file diff --git a/modules/tag/helpers/tag_event.php b/modules/tag/helpers/tag_event.php index a13ae99c..735422b5 100644 --- a/modules/tag/helpers/tag_event.php +++ b/modules/tag/helpers/tag_event.php @@ -59,38 +59,4 @@ class tag_event_Core { "SELECT `tag_id` from {items_tags} WHERE `item_id` = $item->id)"); $db->delete("items_tags", array("item_id" => "$item->id")); } - - static function organize_form_creation($event_parms) { - $v = new View("tag_organize.html"); - $v->tags = array(); - - $ids = implode(", ", $event_parms->itemids); - $db = Database::instance(); - $tags = $db->query("SELECT it.tag_id, t.name, - COUNT(DISTINCT it.item_id) as item_count, - UPPER(SUBSTR(t.name, 1, 1)) as first_letter - FROM {items_tags} it, {tags} t - WHERE it.tag_id = t.id - AND it.item_id in($ids) - GROUP BY it.tag_id - ORDER BY first_letter ASC, t.name ASC"); - foreach ($tags as $tag) { - $v->tags[$tag->first_letter]["taglist"][] = - array("id" => $tag->tag_id, "tag" => $tag->name, "count" => $tag->item_count); - } - $v->tag_count = $tags->count(); - - $letters = $db->query("SELECT COUNT(DISTINCT it.item_id) as letter_count, - UPPER(SUBSTR(t.name, 1, 1)) as first_letter - FROM {items_tags} it, {tags} t - WHERE it.tag_id = t.id - AND it.item_id in($ids) - GROUP BY first_letter - ORDER BY first_letter ASC"); - foreach ($letters as $letter) { - $v->tags[$letter->first_letter]["count"] = $letter->letter_count; - } - - $event_parms->panes[] = array("label" => t("Manage Tags"), "content" => $v); - } } diff --git a/modules/tag/views/tag_organize.html.php b/modules/tag/views/tag_organize.html.php deleted file mode 100644 index bb46b861..00000000 --- a/modules/tag/views/tag_organize.html.php +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - $tagGroup): ?> -
-  () - -
- \ No newline at end of file -- cgit v1.2.3