multiselect.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. /**
  2. * @description Select multiple albums or photos.
  3. * @copyright 2015 by Tobias Reich
  4. */
  5. multiselect = {}
  6. multiselect.position = {
  7. top : null,
  8. right : null,
  9. bottom : null,
  10. left : null
  11. }
  12. multiselect.bind = function() {
  13. $('.content').on('mousedown', (e) => { if (e.which===1) multiselect.show(e) })
  14. return true
  15. }
  16. multiselect.show = function(e) {
  17. if (lychee.publicMode) return false
  18. if (!visible.albums() && !visible.album()) return false
  19. if ($('.album:hover, .photo:hover').length!==0) return false
  20. if (visible.search()) return false
  21. if (visible.multiselect()) $('#multiselect').remove()
  22. sidebar.setSelectable(false)
  23. multiselect.position.top = e.pageY
  24. multiselect.position.right = -1 * (e.pageX - $(document).width())
  25. multiselect.position.bottom = -1 * (multiselect.position.top - $(window).height())
  26. multiselect.position.left = e.pageX
  27. $('body').append(build.multiselect(multiselect.position.top, multiselect.position.left))
  28. $(document)
  29. .on('mousemove', multiselect.resize)
  30. .on('mouseup', (e) => { if (e.which===1) multiselect.getSelection(e) })
  31. }
  32. multiselect.selectAll = function() {
  33. if (lychee.publicMode) return false
  34. if (visible.search()) return false
  35. if (!visible.albums() && !visible.album) return false
  36. if (visible.multiselect()) $('#multiselect').remove()
  37. sidebar.setSelectable(false)
  38. multiselect.position.top = 70
  39. multiselect.position.right = 40
  40. multiselect.position.bottom = 90
  41. multiselect.position.left = 20
  42. $('body').append(build.multiselect(multiselect.position.top, multiselect.position.left))
  43. let documentSize = {
  44. width : $(document).width(),
  45. height : $(document).height()
  46. }
  47. let newSize = {
  48. width : documentSize.width - multiselect.position.right + 2,
  49. height : documentSize.height - multiselect.position.bottom
  50. }
  51. let e = {
  52. pageX : documentSize.width - (multiselect.position.right / 2),
  53. pageY : documentSize.height - multiselect.position.bottom
  54. }
  55. $('#multiselect').css(newSize)
  56. multiselect.getSelection(e)
  57. }
  58. multiselect.resize = function(e) {
  59. if (multiselect.position.top === null ||
  60. multiselect.position.right === null ||
  61. multiselect.position.bottom === null ||
  62. multiselect.position.left === null) return false
  63. let newSize = {}
  64. let documentSize = {}
  65. // Get the position of the mouse
  66. let mousePos = {
  67. x : e.pageX,
  68. y : e.pageY
  69. }
  70. // Default CSS
  71. let newCSS = {
  72. top : null,
  73. bottom : null,
  74. height : null,
  75. left : null,
  76. right : null,
  77. width : null
  78. }
  79. if (mousePos.y>=multiselect.position.top) {
  80. documentSize.height = $(document).height()
  81. // Do not leave the screen
  82. newSize.height = mousePos.y - multiselect.position.top
  83. if ((multiselect.position.top + newSize.height)>=documentSize.height) {
  84. newSize.height -= (multiselect.position.top + newSize.height) - documentSize.height + 2
  85. }
  86. newCSS.top = multiselect.position.top
  87. newCSS.bottom = 'inherit'
  88. newCSS.height = newSize.height
  89. } else {
  90. newCSS.top = 'inherit'
  91. newCSS.bottom = multiselect.position.bottom
  92. newCSS.height = multiselect.position.top - e.pageY
  93. }
  94. if (mousePos.x>=multiselect.position.left) {
  95. documentSize.width = $(document).width()
  96. // Do not leave the screen
  97. newSize.width = mousePos.x - multiselect.position.left
  98. if ((multiselect.position.left + newSize.width)>=documentSize.width) {
  99. newSize.width -= (multiselect.position.left + newSize.width) - documentSize.width + 2
  100. }
  101. newCSS.right = 'inherit'
  102. newCSS.left = multiselect.position.left
  103. newCSS.width = newSize.width
  104. } else {
  105. newCSS.right = multiselect.position.right
  106. newCSS.left = 'inherit'
  107. newCSS.width = multiselect.position.left - e.pageX
  108. }
  109. // Updated all CSS properties at once
  110. $('#multiselect').css(newCSS)
  111. }
  112. multiselect.stopResize = function() {
  113. $(document).off('mousemove mouseup')
  114. }
  115. multiselect.getSize = function() {
  116. if (!visible.multiselect()) return false
  117. let $elem = $('#multiselect')
  118. let offset = $elem.offset()
  119. return {
  120. top : offset.top,
  121. left : offset.left,
  122. width : parseInt($elem.css('width').replace('px', '')),
  123. height : parseInt($elem.css('height').replace('px', ''))
  124. }
  125. }
  126. multiselect.getSelection = function(e) {
  127. let tolerance = 150
  128. let ids = []
  129. let size = multiselect.getSize()
  130. if (visible.contextMenu()) return false
  131. if (!visible.multiselect()) return false
  132. $('.photo, .album').each(function() {
  133. let offset = $(this).offset()
  134. if (offset.top>=(size.top - tolerance) &&
  135. offset.left>=(size.left - tolerance) &&
  136. (offset.top + 206)<=(size.top + size.height + tolerance) &&
  137. (offset.left + 206)<=(size.left + size.width + tolerance)) {
  138. let id = $(this).data('id')
  139. if (id!=='0' && id!==0 && id!=='f' && id!=='s' && id!=='r' && id!=null) {
  140. ids.push(id)
  141. $(this).addClass('active')
  142. }
  143. }
  144. })
  145. if (ids.length!==0 && visible.album()) contextMenu.photoMulti(ids, e)
  146. else if (ids.length!==0 && visible.albums()) contextMenu.albumMulti(ids, e)
  147. else multiselect.close()
  148. }
  149. multiselect.close = function() {
  150. sidebar.setSelectable(true)
  151. multiselect.stopResize()
  152. multiselect.position.top = null
  153. multiselect.position.right = null
  154. multiselect.position.bottom = null
  155. multiselect.position.left = null
  156. lychee.animate('#multiselect', 'fadeOut')
  157. setTimeout(() => $('#multiselect').remove(), 300)
  158. }