From 762ca225443626b69c94f6d6c833f66de69b2ce1 Mon Sep 17 00:00:00 2001 From: Tim Almdal Date: Mon, 18 May 2009 19:34:03 +0000 Subject: This takes us the next step closer to providing bulk edit. We still can't edit, but we are getting closer :-). This change sets up a framework for modules to contribute edit panels to the organize drawer. Currently implemented General (albums and photos), Sort Order (albums only) and Manage Tags --- core/helpers/core_event.php | 25 ++++++++++++++ core/views/organize_edit_general.html.php | 15 ++++++++ core/views/organize_edit_sort.html.php | 11 ++++++ modules/organize/controllers/organize.php | 27 ++++++++++----- modules/organize/css/organize.css | 50 ++++++++++++++++++++++++++- modules/organize/js/organize.js | 30 ++++++++++++++-- modules/organize/views/organize.html.php | 3 +- modules/organize/views/organize_edit.html.php | 35 +++++-------------- modules/tag/helpers/tag_event.php | 33 ++++++++++++++++++ modules/tag/views/tag_organize.html.php | 25 ++++++++++++++ 10 files changed, 216 insertions(+), 38 deletions(-) create mode 100644 core/views/organize_edit_general.html.php create mode 100644 core/views/organize_edit_sort.html.php create mode 100644 modules/tag/views/tag_organize.html.php diff --git a/core/helpers/core_event.php b/core/helpers/core_event.php index 4cfb7598..5f13959a 100644 --- a/core/helpers/core_event.php +++ b/core/helpers/core_event.php @@ -34,4 +34,29 @@ class core_event_Core { static function item_before_delete($item) { access::delete_item($item); } + + static function organize_form_creation($event_parms) { + if (count($event_parms->itemids) > 1) { + return ; + } + + $item = ORM::factory("item") + ->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); + + 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); + } + } } diff --git a/core/views/organize_edit_general.html.php b/core/views/organize_edit_general.html.php new file mode 100644 index 00000000..84e666d8 --- /dev/null +++ b/core/views/organize_edit_general.html.php @@ -0,0 +1,15 @@ + + diff --git a/core/views/organize_edit_sort.html.php b/core/views/organize_edit_sort.html.php new file mode 100644 index 00000000..1151b014 --- /dev/null +++ b/core/views/organize_edit_sort.html.php @@ -0,0 +1,11 @@ + + diff --git a/modules/organize/controllers/organize.php b/modules/organize/controllers/organize.php index f48d1bf4..f2827d30 100644 --- a/modules/organize/controllers/organize.php +++ b/modules/organize/controllers/organize.php @@ -30,9 +30,8 @@ class Organize_Controller extends Controller { $v->item = $item; $v->album_tree = $this->tree($item, $root); - $v->edit_form = new View("organize_edit.html"); $v->button_pane = new View("organize_button_pane.html"); - + print $v; } @@ -43,7 +42,7 @@ class Organize_Controller extends Controller { $offset = $this->input->get("offset", 0); $thumbsize = self::$_MICRO_THUMB_SIZE + 2 * self::$_MICRO_THUMB_PADDING; $page_size = ceil($width / $thumbsize) * ceil($height / $thumbsize); - + $v = new View("organize_thumb_grid.html"); $v->children = $item->children($page_size, $offset); $v->thumbsize = self::$_MICRO_THUMB_SIZE; @@ -70,7 +69,7 @@ class Organize_Controller extends Controller { $v = new View("organize_album.html"); $v->album = $parent; $v->selected = $parent->id == $item->id; - + if ($albums->count()) { $v->album_icon = $parent->id == 1 || $v->selected ? "ui-icon-minus" : "ui-icon-plus"; } else { @@ -87,7 +86,7 @@ class Organize_Controller extends Controller { function startTask($operation, $id) { access::verify_csrf(); $items = $this->input->post("item"); - + $item = ORM::factory("item", $id); $definition = $this->_getOperationDefinition($item, $operation); @@ -174,7 +173,7 @@ class Organize_Controller extends Controller { "state" => $task->state, "done" => $task->done))); } - + function cancelTask($task_id) { access::verify_csrf(); @@ -195,7 +194,7 @@ class Organize_Controller extends Controller { $task->status = t("Rotation was cancelled prior to completion"); break; } - $task->save(); + $task->save(); } batch::stop(); @@ -207,7 +206,19 @@ class Organize_Controller extends Controller { "state" => $task->state, "done" => $task->done))); } - + + function editForm() { + $event_parms = new stdClass(); + $event_parms->panes = array(); + $event_parms->itemids = $this->input->get("item");; + + module::event("organize_form_creation", $event_parms); + + $v = new View("organize_edit.html"); + $v->panes = $event_parms->panes; + print $v->render(); + } + private function _getOperationDefinition($item, $operation) { switch ($operation) { case "move": diff --git a/modules/organize/css/organize.css b/modules/organize/css/organize.css index 765ef169..cef25f1c 100644 --- a/modules/organize/css/organize.css +++ b/modules/organize/css/organize.css @@ -155,6 +155,7 @@ background-color: #fff; border: 1px solid #13A; display: none; + height: 195px; } #gOrganizeEditDrawerHandle { @@ -211,9 +212,15 @@ position: relative; } +/* yui-u gives 80% width, but then we wrap so do it ourselves */ +#gOrganizeEditForm { + float: right; + width: 79%; +// height: 100px; +} + #gOrganizeFormThumbs { overflow: hidden; - min-height: 150px; } #gOrganizeFormThumbs div { @@ -228,3 +235,44 @@ opacity: 1; position: absolute; } + +/**************************************************************** + * Organize Edit From tabs styling + */ +#gOrganizeEditForm.ui-tabs .ui-tabs-hide { + display: block !important; + left: -10000px; + position: absolute; +} + +#gOrganizeEditForm.ui-widget { + font-size: .75em; +} + +.gOrganizeEditPane { + height: 135px; + overflow-y: auto; +} + +.textbox, +.textarea { + border: 1px solid #e8e8e8; + border-top-color: #ccc; + border-left-color: #ccc; + color: #333; + width: 100%; +} + +.textarea { + height: 6em; +} + +.textbox { + height: 1.3em; + width: 50% +} + +.gTagGroup { + float:left; + margin: .5em; +} diff --git a/modules/organize/js/organize.js b/modules/organize/js/organize.js index 63cc81d9..538e366d 100644 --- a/modules/organize/js/organize.js +++ b/modules/organize/js/organize.js @@ -148,6 +148,11 @@ var selectable = { }, unselected: function(event, ui) { setDrawerButtonState(); + }, + stop: function(event, ui) { + if ($("#gMicroThumbGrid li.ui-selected").length > 0) { + getEditForm(); + } } }; @@ -160,6 +165,9 @@ var onMicroThumbContainerMouseup = function(event) { $(this).toggleClass("ui-selected"); setDrawerButtonState(); + if ($("#gMicroThumbGrid li.ui-selected").length > 0) { + getEditForm(); + } }; // MicroThumbContainer mousemove @@ -398,6 +406,8 @@ function get_url(uri, parms) { * there is only 1 image selected */ function setDrawerButtonState() { + $("#gOrganizeFormThumbStack").empty(); + $("#gOrganizeEditForm").empty(); switch ($("#gMicroThumbGrid li.ui-selected").length) { case 0: if ($("#gOrganizeEditDrawerPanel::visible").length) { @@ -409,16 +419,18 @@ function setDrawerButtonState() { 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(); } - setSelectedThumbs(); } function setSelectedThumbs() { - $("#gOrganizeFormThumbStack").empty(); if (!$("#gOrganizeEditDrawerPanel::visible").length) { return; } @@ -443,6 +455,20 @@ 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) { + $("#gOrganizeEditForm").tabs("destroy"); + //$("#gOrganizeEditForm").empty(); + $("#gOrganizeEditForm").html(data); + $("#gOrganizeEditForm").tabs(); + }); +} + function serializeItemIds(selector) { var postData = ""; $(selector).each(function(i) { diff --git a/modules/organize/views/organize.html.php b/modules/organize/views/organize.html.php index 3df40c14..60c4a524 100644 --- a/modules/organize/views/organize.html.php +++ b/modules/organize/views/organize.html.php @@ -41,7 +41,8 @@
- +
+
diff --git a/modules/organize/views/organize_edit.html.php b/modules/organize/views/organize_edit.html.php index f3b6eb87..c0fc43e5 100644 --- a/modules/organize/views/organize_edit.html.php +++ b/modules/organize/views/organize_edit.html.php @@ -1,27 +1,10 @@ -
- "post")) ?> - - - - - "gOrganizeApplyButton", "name" => "apply", "disabled" => true, "class" => "submit"), t("Apply")) ?> - - -
\ No newline at end of file +
    + $pane): ?> +
  • + +
+ + $pane): ?> +
+ diff --git a/modules/tag/helpers/tag_event.php b/modules/tag/helpers/tag_event.php index 43ff6a15..a13ae99c 100644 --- a/modules/tag/helpers/tag_event.php +++ b/modules/tag/helpers/tag_event.php @@ -60,4 +60,37 @@ class tag_event_Core { $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 new file mode 100644 index 00000000..bb46b861 --- /dev/null +++ b/modules/tag/views/tag_organize.html.php @@ -0,0 +1,25 @@ + + + + + + $tagGroup): ?> +
+  () +
    + +
  • + + () + + + + + +
  • + +
+
+ \ No newline at end of file -- cgit v1.2.3