diff --git a/assets/js/modules/album.js b/assets/js/modules/album.js index 738fe20..4e41375 100644 --- a/assets/js/modules/album.js +++ b/assets/js/modules/album.js @@ -121,21 +121,28 @@ album = { }, - delete: function(albumID) { + delete: function(albumIDs) { var params, buttons, albumTitle; + + if (!albumIDs) return false; + if (albumIDs instanceof Array===false) albumIDs = [albumIDs]; buttons = [ - ["Delete Album and Photos", function() { + ["", function() { - params = "deleteAlbum&albumID=" + albumID; + params = "deleteAlbum&albumIDs=" + albumIDs; lychee.api(params, function(data) { if (visible.albums()) { - albums.json.num--; - view.albums.content.delete(albumID); + + albumIDs.forEach(function(id, index, array) { + albums.json.num--; + view.albums.content.delete(id); + }); + } else lychee.goto(""); if (data!==true) lychee.error(null, params, data); @@ -143,69 +150,90 @@ album = { }); }], - ["Keep Album", function() {}] + ["", function() {}] ]; - if (albumID==="0") { + if (albumIDs==="0") { buttons[0][0] = "Clear Unsorted"; + buttons[1][0] = "Keep Unsorted"; + modal.show("Clear Unsorted", "Are you sure you want to delete all photos from 'Unsorted'?
This action can't be undone!", buttons) - } else { - + } else if (albumIDs.length===1) { + + buttons[0][0] = "Delete Album and Photos"; + buttons[1][0] = "Keep Album"; + + // Get title if (album.json) albumTitle = album.json.title; - else if (albums.json) albumTitle = albums.json.content[albumID].title; + else if (albums.json) albumTitle = albums.json.content[albumIDs].title; + modal.show("Delete Album", "Are you sure you want to delete the album '" + albumTitle + "' and all of the photos it contains? This action can't be undone!", buttons); + } else { + + buttons[0][0] = "Delete Albums and Photos"; + buttons[1][0] = "Keep Albums"; + + modal.show("Delete Albums", "Are you sure you want to delete all " + albumIDs.length + " selected albums and all of the photos they contain? This action can't be undone!", buttons); + } }, - setTitle: function(albumID) { + setTitle: function(albumIDs) { var oldTitle = "", newTitle, params, buttons; - if (!albumID) return false; - if (album.json) oldTitle = album.json.title; - else if (albums.json) oldTitle = albums.json.content[albumID].title; + if (!albumIDs) return false; + if (albumIDs instanceof Array===false) albumIDs = [albumIDs]; + + if (albumIDs.length===1) { + // Get old title if only one album is selected + if (album.json) oldTitle = album.json.title; + else if (albums.json) oldTitle = albums.json.content[albumIDs].title; + } buttons = [ ["Set Title", function() { - newTitle = $(".message input.text").val(); + newTitle = ($(".message input.text").val()==="") ? "Untitled" : $(".message input.text").val(); - if (newTitle==="") newTitle = "Untitled"; - - if (albumID!==""&&albumID!=null&&albumID&&newTitle.length<31) { + if (newTitle.length<31) { if (visible.album()) { album.json.title = newTitle; - view.album.title(oldTitle); + view.album.title(); } else if (visible.albums()) { - - albums.json.content[albumID].title = newTitle; - view.albums.content.title(albumID); + + albumIDs.forEach(function(id, index, array) { + albums.json.content[id].title = newTitle; + view.albums.content.title(id); + }); } - params = "setAlbumTitle&albumID=" + albumID + "&title=" + escape(encodeURI(newTitle)); + params = "setAlbumTitle&albumIDs=" + albumIDs + "&title=" + escape(encodeURI(newTitle)); lychee.api(params, function(data) { if (data!==true) lychee.error(null, params, data); }); - } else if (newTitle.length>0) loadingBar.show("error", "New title too short or too long. Please try again!"); + } else if (newTitle.length>30) loadingBar.show("error", "New title too long. Please try another one!"); }], ["Cancel", function() {}] ]; - modal.show("Set Title", "Please enter a new title for this album: ", buttons); + + if (albumIDs.length===1) modal.show("Set Title", "Please enter a new title for this album: ", buttons); + else modal.show("Set Titles", "Please enter a title for all " + albumIDs.length + " selected album: ", buttons); }, diff --git a/assets/js/modules/contextMenu.js b/assets/js/modules/contextMenu.js index 7ca5c30..443eeb8 100644 --- a/assets/js/modules/contextMenu.js +++ b/assets/js/modules/contextMenu.js @@ -112,6 +112,28 @@ contextMenu = { $(".album[data-id='" + albumID + "']").addClass("active"); }, + + albumMulti: function(albumIDs, e) { + + var mouse_x = e.pageX, + mouse_y = e.pageY - $(document).scrollTop(), + items; + + multiselect.stopResize(); + + contextMenu.fns = [ + function() { album.setTitle(albumIDs) }, + function() { album.delete(albumIDs) }, + ]; + + items = [ + [" Rename All", 0], + [" Delete All", 1] + ]; + + contextMenu.show(items, mouse_x, mouse_y, "right"); + + }, photo: function(photoID, e) { diff --git a/assets/js/modules/multiselect.js b/assets/js/modules/multiselect.js index 8f9cd31..d589249 100644 --- a/assets/js/modules/multiselect.js +++ b/assets/js/modules/multiselect.js @@ -112,7 +112,8 @@ multiselect = { getSelection: function(e) { - var photoIDs = [], + var id, + ids = [], offset, size = multiselect.getSize(); @@ -127,14 +128,22 @@ multiselect = { offset.left>=size.left&& (offset.top+206)<=(size.top+size.height)&& (offset.left+206)<=(size.left+size.width)) { - photoIDs.push($(this).data('id')); - $(this).addClass('active'); + + id = $(this).data('id'); + + if (id!=="0"&&id!==0&&id!=="f"&&id!=="s"&&id!==null&id!==undefined) { + + ids.push(id); + $(this).addClass('active'); + + } + } }); - - if (photoIDs.length!=0&&visible.album()) contextMenu.photoMulti(photoIDs, e); - else if (photoIDs.length!=0&&visible.albums()) contextMenu.albumMulti(photoIDs, e); + + if (ids.length!=0&&visible.album()) contextMenu.photoMulti(ids, e); + else if (ids.length!=0&&visible.albums()) contextMenu.albumMulti(ids, e); else multiselect.close(); }, diff --git a/assets/js/modules/photo.js b/assets/js/modules/photo.js index 3e0a5e9..2bf4fbd 100644 --- a/assets/js/modules/photo.js +++ b/assets/js/modules/photo.js @@ -73,24 +73,24 @@ photo = { } buttons = [ - ["Delete", function() { - + ["", function() { + photoIDs.forEach(function(id, index, array) { // Change reference for the next and previous photo if (album.json.content[id].nextPhoto!==""||album.json.content[id].previousPhoto!=="") { - + nextPhoto = album.json.content[id].nextPhoto; previousPhoto = album.json.content[id].previousPhoto; - + album.json.content[previousPhoto].nextPhoto = nextPhoto; album.json.content[nextPhoto].previousPhoto = previousPhoto; - + } - + album.json.content[id] = null; view.album.content.delete(id); - + }); // Only when search is not active @@ -104,16 +104,29 @@ photo = { }); }], - ["Cancel", function() {}] + ["", function() {}] ]; - - if (photoIDs.length===1) modal.show("Delete Photo", "Are you sure you want to delete the photo '" + photoTitle + "'?
This action can't be undone!", buttons); - else modal.show("Delete Photos", "Are you sure you want to delete all " + photoIDs.length + " selected photo?
This action can't be undone!", buttons); + + if (photoIDs.length===1) { + + buttons[0][0] = "Delete Photo"; + buttons[1][0] = "Keep Photo"; + + modal.show("Delete Photo", "Are you sure you want to delete the photo '" + photoTitle + "'?
This action can't be undone!", buttons); + + } else { + + buttons[0][0] = "Delete Photos"; + buttons[1][0] = "Keep Photos"; + + modal.show("Delete Photos", "Are you sure you want to delete all " + photoIDs.length + " selected photo?
This action can't be undone!", buttons); + + } }, setTitle: function(photoIDs) { - + var oldTitle = "", newTitle, params, @@ -121,7 +134,7 @@ photo = { if (!photoIDs) return false; if (photoIDs instanceof Array===false) photoIDs = [photoIDs]; - + if (photoIDs.length===1) { // Get old title if only one photo is selected if (photo.json) oldTitle = photo.json.title; @@ -134,12 +147,12 @@ photo = { newTitle = $(".message input.text").val(); if (newTitle.length<31) { - + if (visible.photo()) { photo.json.title = (newTitle==="") ? "Untitled" : newTitle; - view.photo.title(oldTitle); + view.photo.title(); } - + photoIDs.forEach(function(id, index, array) { album.json.content[id].title = newTitle; view.album.content.title(id); @@ -157,9 +170,9 @@ photo = { }], ["Cancel", function() {}] ]; - + if (photoIDs.length===1) modal.show("Set Title", "Please enter a new title for this photo: ", buttons); - else modal.show("Set Titles", "Please enter a title for all selected photos: ", buttons); + else modal.show("Set Titles", "Please enter a title for all " + photoIDs.length + " selected photos: ", buttons); }, @@ -168,11 +181,11 @@ photo = { var params, nextPhoto, previousPhoto; - + if (!photoIDs) return false; if (visible.photo) lychee.goto(album.getID()); if (photoIDs instanceof Array===false) photoIDs = [photoIDs]; - + photoIDs.forEach(function(id, index, array) { // Change reference for the next and previous photo @@ -185,10 +198,10 @@ photo = { album.json.content[nextPhoto].previousPhoto = previousPhoto; } - + album.json.content[id] = null; view.album.content.delete(id); - + }); params = "setAlbum&photoIDs=" + photoIDs + "&albumID=" + albumID; diff --git a/assets/js/modules/view.js b/assets/js/modules/view.js index 1175abc..4febc2d 100644 --- a/assets/js/modules/view.js +++ b/assets/js/modules/view.js @@ -214,7 +214,7 @@ view = { }, - title: function(oldTitle) { + title: function() { if ((visible.album()||!album.json.init)&&!visible.photo()) { @@ -404,7 +404,7 @@ view = { }, - title: function(oldTitle) { + title: function() { if (photo.json.init) $("#infobox .attr_name").html(photo.json.title + " " + build.editIcon("edit_title")); lychee.setTitle(photo.json.title, true); diff --git a/php/api.php b/php/api.php index cff6b6f..7097c2f 100755 --- a/php/api.php +++ b/php/api.php @@ -83,8 +83,8 @@ if (!empty($_POST['function'])||!empty($_GET['function'])) { echo addAlbum($_POST['title']); break; - case 'setAlbumTitle': if (isset($_POST['albumID'])&&isset($_POST['title'])) - echo setAlbumTitle($_POST['albumID'], $_POST['title']); + case 'setAlbumTitle': if (isset($_POST['albumIDs'])&&isset($_POST['title'])) + echo setAlbumTitle($_POST['albumIDs'], $_POST['title']); break; case 'setAlbumDescription': if (isset($_POST['albumID'])&&isset($_POST['description'])) @@ -100,8 +100,8 @@ if (!empty($_POST['function'])||!empty($_GET['function'])) { echo setAlbumPassword($_POST['albumID'], $_POST['password']); break; - case 'deleteAlbum': if (isset($_POST['albumID'])) - echo deleteAlbum($_POST['albumID']); + case 'deleteAlbum': if (isset($_POST['albumIDs'])) + echo deleteAlbum($_POST['albumIDs']); break; // Photo Functions diff --git a/php/modules/album.php b/php/modules/album.php index 294ddf8..dcae268 100755 --- a/php/modules/album.php +++ b/php/modules/album.php @@ -189,14 +189,14 @@ function getAlbum($albumID) { } -function setAlbumTitle($albumID, $title) { +function setAlbumTitle($albumIDs, $title) { global $database; if (strlen($title)<1||strlen($title)>30) return false; - $result = $database->query("UPDATE lychee_albums SET title = '$title' WHERE id = '$albumID';"); + $result = $database->query("UPDATE lychee_albums SET title = '$title' WHERE id IN ($albumIDs);"); + if (!$result) return false; - return true; } @@ -204,34 +204,32 @@ function setAlbumTitle($albumID, $title) { function setAlbumDescription($albumID, $description) { global $database; - + $description = htmlentities($description); - if (strlen($description)>800) return false; - $result = $database->query("UPDATE lychee_albums SET description = '$description' WHERE id = '$albumID';"); - - if (!$result) return false; - return true; + if (strlen($description)>800) return false; + $result = $database->query("UPDATE lychee_albums SET description = '$description' WHERE id = '$albumID';"); + + if (!$result) return false; + return true; } -function deleteAlbum($albumID) { +function deleteAlbum($albumIDs) { global $database; - + $error = false; - - $result = $database->query("SELECT id FROM lychee_photos WHERE album = '$albumID';"); - while ($row = $result->fetch_object()) { - if (!deletePhoto($row->id)) $error = true; - } - - if ($albumID!=0) { - $result = $database->query("DELETE FROM lychee_albums WHERE id = '$albumID';"); - if (!$result) return false; - } - - if ($error) return false; - return true; + $result = $database->query("SELECT id FROM lychee_photos WHERE album IN ($albumIDs);"); + + // Delete photos + while ($row = $result->fetch_object()) + if (!deletePhoto($row->id)) $error = true; + + // Delete album + $result = $database->query("DELETE FROM lychee_albums WHERE id IN ($albumIDs);"); + + if ($error||!$result) return false; + return true; } @@ -308,7 +306,7 @@ function setAlbumPublic($albumID, $password) { } if (strlen($password)>0) return setAlbumPassword($albumID, $password); - else return true; + return true; } @@ -329,10 +327,10 @@ function checkAlbumPassword($albumID, $password) { $result = $database->query("SELECT password FROM lychee_albums WHERE id = '$albumID';"); $row = $result->fetch_object(); + if ($row->password=="") return true; - else if ($row->password==$password) return true; - else return false; + return false; } @@ -344,7 +342,7 @@ function isAlbumPublic($albumID) { $row = $result->fetch_object(); if ($row->public==1) return true; - else return false; + return false; }