sidebar.js 8.1 KB

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