contextMenu.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. /**
  2. * @description This module is used for the context menu.
  3. * @copyright 2014 by Tobias Reich
  4. */
  5. contextMenu = {
  6. fns: null,
  7. show: function(items, mouse_x, mouse_y, orientation) {
  8. contextMenu.close();
  9. $("body")
  10. .css("overflow", "hidden")
  11. .append(build.contextMenu(items));
  12. // Do not leave the screen
  13. if ((mouse_x+$(".contextmenu").outerWidth(true))>$("html").width()) orientation = "left";
  14. if ((mouse_y+$(".contextmenu").outerHeight(true))>$("html").height()) mouse_y -= (mouse_y+$(".contextmenu").outerHeight(true)-$("html").height());
  15. if (mouse_x>$(document).width()) mouse_x = $(document).width();
  16. if (mouse_x<0) mouse_x = 0;
  17. if (mouse_y>$(document).height()) mouse_y = $(document).height();
  18. if (mouse_y<0) mouse_y = 0;
  19. if (orientation==="left") mouse_x -= $(".contextmenu").outerWidth(true);
  20. if (mouse_x===null||
  21. mouse_x===undefined||
  22. isNaN(mouse_x)||
  23. mouse_y===null||
  24. mouse_y===undefined||
  25. isNaN(mouse_y)) {
  26. mouse_x = "10px";
  27. mouse_y = "10px";
  28. }
  29. $(".contextmenu").css({
  30. "top": mouse_y,
  31. "left": mouse_x,
  32. "opacity": 0.98
  33. });
  34. },
  35. add: function(e) {
  36. var mouse_x = e.pageX,
  37. mouse_y = e.pageY - $(document).scrollTop(),
  38. items;
  39. upload.notify();
  40. contextMenu.fns = [
  41. function() { $("#upload_files").click() },
  42. function() { upload.start.url() },
  43. function() { upload.start.dropbox() },
  44. function() { upload.start.server() },
  45. function() { album.add() }
  46. ];
  47. items = [
  48. ["<a class='icon-picture'></a> Upload Photo", 0],
  49. ["separator", -1],
  50. ["<a class='icon-link'></a> Import from Link", 1],
  51. ["<a class='icon-folder-open'></a> Import from Dropbox", 2],
  52. ["<a class='icon-hdd'></a> Import from Server", 3],
  53. ["separator", -1],
  54. ["<a class='icon-folder-close'></a> New Album", 4]
  55. ];
  56. contextMenu.show(items, mouse_x, mouse_y, "left");
  57. },
  58. settings: function(e) {
  59. var mouse_x = e.pageX,
  60. mouse_y = e.pageY - $(document).scrollTop(),
  61. items;
  62. contextMenu.fns = [
  63. function() { settings.setLogin() },
  64. function() { settings.setSorting() },
  65. function() { settings.setDropboxKey() },
  66. function() { window.open(lychee.website); },
  67. function() { window.open("plugins/check/"); },
  68. function() { window.open("plugins/displaylog/"); },
  69. function() { lychee.logout() }
  70. ];
  71. items = [
  72. ["<a class='icon-user'></a> Change Login", 0],
  73. ["<a class='icon-sort'></a> Change Sorting", 1],
  74. ["<a class='icon-folder-open'></a> Set Dropbox", 2],
  75. ["separator", -1],
  76. ["<a class='icon-info-sign'></a> About Lychee", 3],
  77. ["<a class='icon-dashboard'></a> Diagnostics", 4],
  78. ["<a class='icon-list'></a> Show Log", 5],
  79. ["separator", -1],
  80. ["<a class='icon-signout'></a> Sign Out", 6]
  81. ];
  82. contextMenu.show(items, mouse_x, mouse_y, "right");
  83. },
  84. album: function(albumID, e) {
  85. var mouse_x = e.pageX,
  86. mouse_y = e.pageY - $(document).scrollTop(),
  87. items;
  88. if (albumID==="0"||albumID==="f"||albumID==="s"||albumID==="r") return false;
  89. contextMenu.fns = [
  90. function() { album.setTitle([albumID]) },
  91. function() { album.delete([albumID]) }
  92. ];
  93. items = [
  94. ["<a class='icon-edit'></a> Rename", 0],
  95. ["<a class='icon-trash'></a> Delete", 1]
  96. ];
  97. contextMenu.show(items, mouse_x, mouse_y, "right");
  98. $(".album[data-id='" + albumID + "']").addClass("active");
  99. },
  100. albumMulti: function(albumIDs, e) {
  101. var mouse_x = e.pageX,
  102. mouse_y = e.pageY - $(document).scrollTop(),
  103. items;
  104. multiselect.stopResize();
  105. contextMenu.fns = [
  106. function() { album.setTitle(albumIDs) },
  107. function() { album.delete(albumIDs) },
  108. ];
  109. items = [
  110. ["<a class='icon-edit'></a> Rename All", 0],
  111. ["<a class='icon-trash'></a> Delete All", 1]
  112. ];
  113. contextMenu.show(items, mouse_x, mouse_y, "right");
  114. },
  115. photo: function(photoID, e) {
  116. var mouse_x = e.pageX,
  117. mouse_y = e.pageY - $(document).scrollTop(),
  118. items;
  119. contextMenu.fns = [
  120. function() { photo.setStar([photoID]) },
  121. function() { photo.editTags([photoID]) },
  122. function() { photo.setTitle([photoID]) },
  123. function() { photo.duplicate([photoID]) },
  124. function() { contextMenu.move([photoID], e, "right") },
  125. function() { photo.delete([photoID]) }
  126. ];
  127. items = [
  128. ["<a class='icon-star'></a> Star", 0],
  129. ["<a class='icon-tags'></a> Tags", 1],
  130. ["separator", -1],
  131. ["<a class='icon-edit'></a> Rename", 2],
  132. ["<a class='icon-copy'></a> Duplicate", 3],
  133. ["<a class='icon-folder-open'></a> Move", 4],
  134. ["<a class='icon-trash'></a> Delete", 5]
  135. ];
  136. contextMenu.show(items, mouse_x, mouse_y, "right");
  137. $(".photo[data-id='" + photoID + "']").addClass("active");
  138. },
  139. photoMulti: function(photoIDs, e) {
  140. var mouse_x = e.pageX,
  141. mouse_y = e.pageY - $(document).scrollTop(),
  142. items;
  143. multiselect.stopResize();
  144. contextMenu.fns = [
  145. function() { photo.setStar(photoIDs) },
  146. function() { photo.editTags(photoIDs) },
  147. function() { photo.setTitle(photoIDs) },
  148. function() { photo.duplicate(photoIDs) },
  149. function() { contextMenu.move(photoIDs, e, "right") },
  150. function() { photo.delete(photoIDs) }
  151. ];
  152. items = [
  153. ["<a class='icon-star'></a> Star All", 0],
  154. ["<a class='icon-tags'></a> Tag All", 1],
  155. ["separator", -1],
  156. ["<a class='icon-edit'></a> Rename All", 2],
  157. ["<a class='icon-copy'></a> Duplicate All", 3],
  158. ["<a class='icon-folder-open'></a> Move All", 4],
  159. ["<a class='icon-trash'></a> Delete All", 5]
  160. ];
  161. contextMenu.show(items, mouse_x, mouse_y, "right");
  162. },
  163. photoMore: function(photoID, e) {
  164. var mouse_x = e.pageX,
  165. mouse_y = e.pageY - $(document).scrollTop(),
  166. items;
  167. contextMenu.fns = [
  168. function() { window.open(photo.getDirectLink()) },
  169. function() { photo.getArchive(photoID) }
  170. ];
  171. items = [["<a class='icon-resize-full'></a> Full Photo", 0]];
  172. if ((album.json&&album.json.downloadable&&album.json.downloadable==="1"&&lychee.publicMode)||!lychee.publicMode) items.push(["<a class='icon-circle-arrow-down'></a> Download", 1]);
  173. contextMenu.show(items, mouse_x, mouse_y, "right");
  174. },
  175. move: function(photoIDs, e, orientation) {
  176. var mouse_x = e.pageX,
  177. mouse_y = e.pageY - $(document).scrollTop(),
  178. items = [];
  179. contextMenu.close(true);
  180. if (album.getID()!=="0") {
  181. items = [
  182. ["Unsorted", 0, "photo.setAlbum([" + photoIDs + "], 0)"],
  183. ["separator", -1]
  184. ];
  185. }
  186. lychee.api("getAlbums", function(data) {
  187. if (data.num===0) {
  188. items = [["New Album", 0, "album.add()"]];
  189. } else {
  190. $.each(data.content, function(index) {
  191. if (this.id!=album.getID()) items.push([this.title, 0, "photo.setAlbum([" + photoIDs + "], " + this.id + ")"]);
  192. });
  193. }
  194. if (!visible.photo()) contextMenu.show(items, mouse_x, mouse_y, "right");
  195. else contextMenu.show(items, mouse_x, mouse_y, "left");
  196. });
  197. },
  198. sharePhoto: function(photoID, e) {
  199. var mouse_x = e.pageX,
  200. mouse_y = e.pageY,
  201. items,
  202. link = "";
  203. mouse_y -= $(document).scrollTop();
  204. contextMenu.fns = [
  205. function() { photo.setPublic(photoID) },
  206. function() { photo.share(photoID, 0) },
  207. function() { photo.share(photoID, 1) },
  208. function() { photo.share(photoID, 2) },
  209. function() { photo.share(photoID, 3) },
  210. function() { window.open(photo.getDirectLink()) }
  211. ];
  212. link = photo.getViewLink(photoID);
  213. if (photo.json.public==="2") link = location.href;
  214. items = [
  215. ["<input readonly id='link' value='" + link + "'>", -1],
  216. ["separator", -1],
  217. ["<a class='icon-eye-close'></a> Make Private", 0],
  218. ["separator", -1],
  219. ["<a class='icon-twitter'></a> Twitter", 1],
  220. ["<a class='icon-facebook'></a> Facebook", 2],
  221. ["<a class='icon-envelope'></a> Mail", 3],
  222. ["<a class='icon-hdd'></a> Dropbox", 4],
  223. ["<a class='icon-link'></a> Direct Link", 5]
  224. ];
  225. contextMenu.show(items, mouse_x, mouse_y, "left");
  226. $(".contextmenu input").focus().select();
  227. },
  228. shareAlbum: function(albumID, e) {
  229. var mouse_x = e.pageX,
  230. mouse_y = e.pageY,
  231. items;
  232. mouse_y -= $(document).scrollTop();
  233. contextMenu.fns = [
  234. function() { album.setPublic(albumID) },
  235. function() { album.share(0) },
  236. function() { album.share(1) },
  237. function() { album.share(2) },
  238. function() { password.remove(albumID) }
  239. ];
  240. items = [
  241. ["<input readonly id='link' value='" + location.href + "'>", -1],
  242. ["separator", -1],
  243. ["<a class='icon-eye-close'></a> Make Private", 0],
  244. ["separator", -1],
  245. ["<a class='icon-twitter'></a> Twitter", 1],
  246. ["<a class='icon-facebook'></a> Facebook", 2],
  247. ["<a class='icon-envelope'></a> Mail", 3],
  248. ];
  249. contextMenu.show(items, mouse_x, mouse_y, "left");
  250. $(".contextmenu input").focus().select();
  251. },
  252. close: function(leaveSelection) {
  253. if (!visible.contextMenu()) return false;
  254. contextMenu.fns = [];
  255. $(".contextmenu_bg, .contextmenu").remove();
  256. $("body").css("overflow", "auto");
  257. if (leaveSelection!==true) {
  258. $(".photo.active, .album.active").removeClass("active");
  259. if (visible.multiselect()) multiselect.close();
  260. }
  261. }
  262. };