sidebar.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. /**
  2. * @description This module takes care of the sidebar.
  3. */
  4. sidebar = {
  5. _dom: $('.sidebar'),
  6. types: {
  7. DEFAULT : 0,
  8. TAGS : 1
  9. },
  10. createStructure: {}
  11. }
  12. sidebar.dom = function(selector) {
  13. if (selector==null || selector==='') return sidebar._dom
  14. return sidebar._dom.find(selector)
  15. }
  16. sidebar.bind = function() {
  17. // This function should be called after building and appending
  18. // the sidebars content to the DOM.
  19. // This function can be called multiple times, therefore
  20. // event handlers should be removed before binding a new one.
  21. // Event Name
  22. let eventName = lychee.getEventName()
  23. sidebar
  24. .dom('#edit_title')
  25. .off(eventName)
  26. .on(eventName, function() {
  27. if (visible.photo()) photo.setTitle([ photo.getID() ])
  28. else if (visible.album()) album.setTitle([ album.getID() ])
  29. })
  30. sidebar
  31. .dom('#edit_description')
  32. .off(eventName)
  33. .on(eventName, function() {
  34. if (visible.photo()) photo.setDescription(photo.getID())
  35. else if (visible.album()) album.setDescription(album.getID())
  36. })
  37. sidebar
  38. .dom('#edit_tags')
  39. .off(eventName)
  40. .on(eventName, function() {
  41. photo.editTags([ photo.getID() ])
  42. })
  43. sidebar
  44. .dom('#tags .tag span')
  45. .off(eventName)
  46. .on(eventName, function() {
  47. photo.deleteTag(photo.getID(), $(this).data('index'))
  48. })
  49. return true
  50. }
  51. sidebar.toggle = function() {
  52. if (visible.sidebar() || visible.sidebarbutton()) {
  53. header.dom('.button--info').toggleClass('active')
  54. lychee.content.toggleClass('content--sidebar')
  55. sidebar.dom().toggleClass('active')
  56. return true
  57. }
  58. return false
  59. }
  60. sidebar.setSelectable = function(selectable = true) {
  61. // Attributes/Values inside the sidebar are selectable by default.
  62. // Selection needs to be deactivated to prevent an unwanted selection
  63. // while using multiselect.
  64. if (selectable===true) sidebar.dom().removeClass('notSelectable')
  65. else sidebar.dom().addClass('notSelectable')
  66. }
  67. sidebar.changeAttr = function(attr, value = '-', dangerouslySetInnerHTML = false) {
  68. if (attr==null || attr==='') return false
  69. // Set a default for the value
  70. if (value==null || value==='') value = '-'
  71. // Escape value
  72. if (dangerouslySetInnerHTML===false) value = lychee.escapeHTML(value)
  73. // Set new value
  74. sidebar.dom('.attr_' + attr).html(value)
  75. return true
  76. }
  77. sidebar.createStructure.photo = function(data) {
  78. if (data==null || data==='') return false
  79. let editable = false
  80. let exifHash = data.takestamp + data.make + data.model + data.shutter + data.aperture + data.focal + data.iso
  81. let structure = {}
  82. let _public = ''
  83. // Enable editable when user logged in
  84. if (lychee.publicMode===false) editable = true
  85. // Set value for public
  86. switch (data.public) {
  87. case '0' : _public = 'No'
  88. break
  89. case '1' : _public = 'Yes'
  90. break
  91. case '2' : _public = 'Yes (Album)'
  92. break
  93. default : _public = '-'
  94. break
  95. }
  96. structure.basics = {
  97. title : 'Basics',
  98. type : sidebar.types.DEFAULT,
  99. rows : [
  100. { title: 'Title', value: data.title, editable },
  101. { title: 'Uploaded', value: data.sysdate },
  102. { title: 'Description', value: data.description, editable }
  103. ]
  104. }
  105. structure.image = {
  106. title : 'Image',
  107. type : sidebar.types.DEFAULT,
  108. rows : [
  109. { title: 'Size', value: data.size },
  110. { title: 'Format', value: data.type },
  111. { title: 'Resolution', value: data.width + ' x ' + data.height }
  112. ]
  113. }
  114. // Only create tags section when user logged in
  115. if (lychee.publicMode===false) {
  116. structure.tags = {
  117. title : 'Tags',
  118. type : sidebar.types.TAGS,
  119. value : build.tags(data.tags),
  120. editable
  121. }
  122. } else {
  123. structure.tags = {}
  124. }
  125. // Only create EXIF section when EXIF data available
  126. if (exifHash!=='0') {
  127. structure.exif = {
  128. title : 'Camera',
  129. type : sidebar.types.DEFAULT,
  130. rows : [
  131. { title: 'Captured', value: data.takedate },
  132. { title: 'Make', value: data.make },
  133. { title: 'Type/Model', value: data.model },
  134. { title: 'Shutter Speed', value: data.shutter },
  135. { title: 'Aperture', value: data.aperture },
  136. { title: 'Focal Length', value: data.focal },
  137. { title: 'ISO', value: data.iso }
  138. ]
  139. }
  140. } else {
  141. structure.exif = {}
  142. }
  143. structure.sharing = {
  144. title : 'Sharing',
  145. type : sidebar.types.DEFAULT,
  146. rows : [
  147. { title: 'Public', value: _public }
  148. ]
  149. }
  150. // Construct all parts of the structure
  151. structure = [
  152. structure.basics,
  153. structure.image,
  154. structure.tags,
  155. structure.exif,
  156. structure.sharing
  157. ]
  158. return structure
  159. }
  160. sidebar.createStructure.album = function(data) {
  161. if (data==null || data==='') return false
  162. let editable = false
  163. let structure = {}
  164. let _public = ''
  165. let hidden = ''
  166. let downloadable = ''
  167. let password = ''
  168. // Enable editable when user logged in
  169. if (lychee.publicMode===false) editable = true
  170. // Set value for public
  171. switch (data.public) {
  172. case '0' : _public = 'No'
  173. break
  174. case '1' : _public = 'Yes'
  175. break
  176. default : _public = '-'
  177. break
  178. }
  179. // Set value for hidden
  180. switch (data.visible) {
  181. case '0' : hidden = 'Yes'
  182. break
  183. case '1' : hidden = 'No'
  184. break
  185. default : hidden = '-'
  186. break
  187. }
  188. // Set value for downloadable
  189. switch (data.downloadable) {
  190. case '0' : downloadable = 'No'
  191. break
  192. case '1' : downloadable = 'Yes'
  193. break
  194. default : downloadable = '-'
  195. break
  196. }
  197. // Set value for password
  198. switch (data.password) {
  199. case '0' : password = 'No'
  200. break
  201. case '1' : password = 'Yes'
  202. break
  203. default : password = '-'
  204. break
  205. }
  206. structure.basics = {
  207. title : 'Basics',
  208. type : sidebar.types.DEFAULT,
  209. rows : [
  210. { title: 'Title', value: data.title, editable },
  211. { title: 'Description', value: data.description, editable }
  212. ]
  213. }
  214. structure.album = {
  215. title : 'Album',
  216. type : sidebar.types.DEFAULT,
  217. rows : [
  218. { title: 'Created', value: data.sysdate },
  219. { title: 'Images', value: data.num }
  220. ]
  221. }
  222. structure.share = {
  223. title : 'Share',
  224. type : sidebar.types.DEFAULT,
  225. rows : [
  226. { title: 'Public', value: _public },
  227. { title: 'Hidden', value: hidden },
  228. { title: 'Downloadable', value: downloadable },
  229. { title: 'Password', value: password }
  230. ]
  231. }
  232. // Construct all parts of the structure
  233. structure = [
  234. structure.basics,
  235. structure.album,
  236. structure.share
  237. ]
  238. return structure
  239. }
  240. sidebar.render = function(structure) {
  241. if (structure==null || structure==='' || structure===false) return false
  242. let html = ''
  243. let renderDefault = function(section) {
  244. let _html = ''
  245. _html += `
  246. <div class='sidebar__divider'>
  247. <h1>${ section.title }</h1>
  248. </div>
  249. <table>
  250. `
  251. section.rows.forEach(function(row) {
  252. let value = row.value
  253. // Set a default for the value
  254. if (value==='' || value==null) value = '-'
  255. // Wrap span-element around value for easier selecting on change
  256. value = lychee.html`<span class='attr_$${ row.title.toLowerCase() }'>$${ value }</span>`
  257. // Add edit-icon to the value when editable
  258. if (row.editable===true) value += ' ' + build.editIcon('edit_' + row.title.toLowerCase())
  259. _html += lychee.html`
  260. <tr>
  261. <td>$${ row.title }</td>
  262. <td>${ value }</td>
  263. </tr>
  264. `
  265. })
  266. _html += `
  267. </table>
  268. `
  269. return _html
  270. }
  271. let renderTags = function(section) {
  272. let _html = ''
  273. let editable = ''
  274. // Add edit-icon to the value when editable
  275. if (section.editable===true) editable = build.editIcon('edit_tags')
  276. _html += lychee.html`
  277. <div class='sidebar__divider'>
  278. <h1>$${ section.title }</h1>
  279. </div>
  280. <div id='tags'>
  281. <div class='attr_$${ section.title.toLowerCase() }'>${ section.value }</div>
  282. ${ editable }
  283. </div>
  284. `
  285. return _html
  286. }
  287. structure.forEach(function(section) {
  288. if (section.type===sidebar.types.DEFAULT) html += renderDefault(section)
  289. else if (section.type===sidebar.types.TAGS) html += renderTags(section)
  290. })
  291. return html
  292. }