Browse Source

Duplicate photos by right-clicking them (#186)

Tobias Reich 9 years ago
parent
commit
d686a2b083
5 changed files with 69 additions and 4 deletions
  1. 8 4
      assets/js/contextMenu.js
  2. 17 0
      assets/js/photo.js
  3. 0 0
      assets/min/main.js
  4. 9 0
      php/access/Admin.php
  5. 35 0
      php/modules/Photo.php

+ 8 - 4
assets/js/contextMenu.js

@@ -164,6 +164,7 @@ contextMenu = {
 			function() { photo.setStar([photoID]) },
 			function() { photo.editTags([photoID]) },
 			function() { photo.setTitle([photoID]) },
+			function() { photo.duplicate([photoID]) },
 			function() { contextMenu.move([photoID], e, "right") },
 			function() { photo.delete([photoID]) }
 		];
@@ -173,8 +174,9 @@ contextMenu = {
 			["<a class='icon-tags'></a> Tags", 1],
 			["separator", -1],
 			["<a class='icon-edit'></a> Rename", 2],
-			["<a class='icon-folder-open'></a> Move", 3],
-			["<a class='icon-trash'></a> Delete", 4]
+			["<a class='icon-copy'></a> Duplicate", 3],
+			["<a class='icon-folder-open'></a> Move", 4],
+			["<a class='icon-trash'></a> Delete", 5]
 		];
 
 		contextMenu.show(items, mouse_x, mouse_y, "right");
@@ -195,6 +197,7 @@ contextMenu = {
 			function() { photo.setStar(photoIDs) },
 			function() { photo.editTags(photoIDs) },
 			function() { photo.setTitle(photoIDs) },
+			function() { photo.duplicate(photoIDs) },
 			function() { contextMenu.move(photoIDs, e, "right") },
 			function() { photo.delete(photoIDs) }
 		];
@@ -204,8 +207,9 @@ contextMenu = {
 			["<a class='icon-tags'></a> Tag All", 1],
 			["separator", -1],
 			["<a class='icon-edit'></a> Rename All", 2],
-			["<a class='icon-folder-open'></a> Move All", 3],
-			["<a class='icon-trash'></a> Delete All", 4]
+			["<a class='icon-copy'></a> Duplicate All", 3],
+			["<a class='icon-folder-open'></a> Move All", 4],
+			["<a class='icon-trash'></a> Delete All", 5]
 		];
 
 		contextMenu.show(items, mouse_x, mouse_y, "right");

+ 17 - 0
assets/js/photo.js

@@ -117,6 +117,23 @@ photo = {
 
 	},
 
+	duplicate: function(photoIDs) {
+
+		var params;
+
+		if (!photoIDs) return false;
+		if (photoIDs instanceof Array===false) photoIDs = [photoIDs];
+
+		params = "duplicatePhoto&photoIDs=" + photoIDs;
+		lychee.api(params, function(data) {
+
+			if (data!==true) lychee.error(null, params, data);
+			else album.load(album.getID(), false);
+
+		});
+
+	},
+
 	delete: function(photoIDs) {
 
 		var params,

File diff suppressed because it is too large
+ 0 - 0
assets/min/main.js


+ 9 - 0
php/access/Admin.php

@@ -32,6 +32,7 @@ class Admin extends Access {
 			case 'setPhotoPublic':		$this->setPhotoPublic(); break;
 			case 'setPhotoAlbum':		$this->setPhotoAlbum(); break;
 			case 'setPhotoTags':		$this->setPhotoTags(); break;
+			case 'duplicatePhoto':		$this->duplicatePhoto(); break;
 			case 'deletePhoto':			$this->deletePhoto(); break;
 
 			# Add functions
@@ -181,6 +182,14 @@ class Admin extends Access {
 
 	}
 
+	private function duplicatePhoto() {
+
+		Module::dependencies(isset($_POST['photoIDs']));
+		$photo = new Photo($this->database, $this->plugins, null, $_POST['photoIDs']);
+		echo $photo->duplicate();
+
+	}
+
 	private function deletePhoto() {
 
 		Module::dependencies(isset($_POST['photoIDs']));

+ 35 - 0
php/modules/Photo.php

@@ -818,6 +818,41 @@ class Photo extends Module {
 
 	}
 
+	public function duplicate() {
+
+		# Check dependencies
+		self::dependencies(isset($this->database, $this->photoIDs));
+
+		# Call plugins
+		$this->plugins(__METHOD__, 0, func_get_args());
+
+		# Get photos
+		$photos = $this->database->query("SELECT id, checksum FROM lychee_photos WHERE id IN ($this->photoIDs);");
+		if (!$photos) {
+			Log::error($this->database, __METHOD__, __LINE__, $this->database->error);
+			return false;
+		}
+
+		# For each photo
+		while ($photo = $photos->fetch_object()) {
+
+			# Generate id
+			$id = str_replace('.', '', microtime(true));
+			while(strlen($id)<14) $id .= 0;
+
+			# Duplicate entry
+			$duplicate = $this->database->query("INSERT INTO lychee_photos(id, title, url, description, tags, type, width, height, size, iso, aperture, make, model, shutter, focal, takestamp, thumbUrl, album, public, star, checksum) SELECT '$id' AS id, title, url, description, tags, type, width, height, size, iso, aperture, make, model, shutter, focal, takestamp, thumbUrl, album, public, star, checksum FROM lychee_photos WHERE id = '$photo->id';");
+			if (!$duplicate) {
+				Log::error($this->database, __METHOD__, __LINE__, $this->database->error);
+				return false;
+			}
+
+		}
+
+		return true;
+
+	}
+
 	public function delete() {
 
 		# Check dependencies

Some files were not shown because too many files changed in this diff