panel.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. let panel = {}
  2. panel.page;
  3. panel.token = localStorage.admintoken;
  4. panel.preparePage = function(){
  5. if(!panel.token){
  6. document.getElementById('auth').style.display = 'flex';
  7. document.getElementById('tokenSubmit').addEventListener('click', function(){
  8. panel.verifyToken(document.getElementById('token').value);
  9. });
  10. return;
  11. }
  12. panel.verifyToken(panel.token, true);
  13. }
  14. panel.verifyToken = function(token, reloadOnError = false){
  15. axios.post('/api/tokens/verify', {
  16. type: 'admin',
  17. token: token
  18. })
  19. .then(function (response) {
  20. if(response.data.success === false){
  21. swal({
  22. title: "An error ocurred",
  23. text: response.data.description,
  24. type: "error"
  25. }, function(){
  26. if(reloadOnError){
  27. localStorage.removeItem("admintoken");
  28. location.reload();
  29. }
  30. })
  31. return;
  32. }
  33. axios.defaults.headers.common['auth'] = token;
  34. localStorage.admintoken = token;
  35. panel.token = token;
  36. return panel.prepareDashboard();
  37. })
  38. .catch(function (error) {
  39. return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error");
  40. console.log(error);
  41. });
  42. }
  43. panel.prepareDashboard = function(){
  44. panel.page = document.getElementById('page');
  45. document.getElementById('auth').style.display = 'none';
  46. document.getElementById('dashboard').style.display = 'block';
  47. document.getElementById('itemUploads').addEventListener('click', function(){
  48. panel.getUploads();
  49. });
  50. document.getElementById('itemManageGallery').addEventListener('click', function(){
  51. panel.getAlbums();
  52. });
  53. document.getElementById('itemTokens').addEventListener('click', function(){
  54. panel.changeTokens();
  55. });
  56. panel.getAlbumsSidebar();
  57. }
  58. panel.getUploads = function(album = undefined, page = undefined){
  59. if(page === undefined) page = 0;
  60. let url = '/api/uploads/' + page
  61. if(album !== undefined)
  62. url = '/api/album/' + album + '/' + page
  63. axios.get(url)
  64. .then(function (response) {
  65. if(response.data.success === false){
  66. if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token);
  67. else return swal("An error ocurred", response.data.description, "error");
  68. }
  69. var prevPage = 0;
  70. var nextPage = page + 1;
  71. if(response.data.files.length < 25)
  72. nextPage = page;
  73. if(page > 0) prevPage = page - 1;
  74. panel.page.innerHTML = '';
  75. var container = document.createElement('div');
  76. container.innerHTML = `
  77. <div class='columns'>
  78. <div class="column">
  79. <nav class="pagination is-centered">
  80. <a class="pagination-previous" onclick="panel.getUploads(${album}, ${prevPage} )">Previous</a>
  81. <a class="pagination-next" onclick="panel.getUploads(${album}, ${nextPage} )">Next page</a>
  82. </nav>
  83. </div>
  84. </div>
  85. <table class="table is-striped is-narrow">
  86. <thead>
  87. <tr>
  88. <th>File</th>
  89. <th>Album</th>
  90. <th>Date</th>
  91. <th></th>
  92. </tr>
  93. </thead>
  94. <tbody id="table">
  95. </tbody>
  96. </table>
  97. <div class='columns'>
  98. <div class="column">
  99. <nav class="pagination is-centered">
  100. <a class="pagination-previous" onclick="panel.getUploads(${album}, ${prevPage} )">Previous</a>
  101. <a class="pagination-next" onclick="panel.getUploads(${album}, ${nextPage} )">Next page</a>
  102. </nav>
  103. </div>
  104. </div>
  105. `;
  106. panel.page.appendChild(container);
  107. var table = document.getElementById('table');
  108. for(var item of response.data.files){
  109. var tr = document.createElement('tr');
  110. tr.innerHTML = `
  111. <tr>
  112. <th><a href="${item.file}" target="_blank">${item.file}</a></th>
  113. <th>${item.album}</th>
  114. <td>${item.date}</td>
  115. <td>
  116. <a class="button is-small is-danger is-outlined" title="Delete album" onclick="panel.deleteFile(${item.id})">
  117. <span class="icon is-small">
  118. <i class="fa fa-trash-o"></i>
  119. </span>
  120. </a>
  121. </td>
  122. </tr>
  123. `;
  124. table.appendChild(tr);
  125. }
  126. })
  127. .catch(function (error) {
  128. return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error");
  129. console.log(error);
  130. });
  131. }
  132. panel.deleteFile = function(id){
  133. swal({
  134. title: "Are you sure?",
  135. text: "You wont be able to recover the file!",
  136. type: "warning",
  137. showCancelButton: true,
  138. confirmButtonColor: "#ff3860",
  139. confirmButtonText: "Yes, delete it!",
  140. closeOnConfirm: false
  141. },
  142. function(){
  143. axios.post('/api/upload/delete', {
  144. id: id
  145. })
  146. .then(function (response) {
  147. if(response.data.success === false){
  148. if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token);
  149. else return swal("An error ocurred", response.data.description, "error");
  150. }
  151. swal("Deleted!", "The file has been deleted.", "success");
  152. panel.getUploads();
  153. return;
  154. })
  155. .catch(function (error) {
  156. return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error");
  157. console.log(error);
  158. });
  159. }
  160. );
  161. }
  162. panel.getAlbums = function(){
  163. axios.get('/api/albums')
  164. .then(function (response) {
  165. if(response.data.success === false){
  166. if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token);
  167. else return swal("An error ocurred", response.data.description, "error");
  168. }
  169. panel.page.innerHTML = '';
  170. var container = document.createElement('div');
  171. container.className = "container";
  172. container.innerHTML = `
  173. <h2 class="subtitle">Create new album</h2>
  174. <p class="control has-addons has-addons-centered">
  175. <input id="albumName" class="input" type="text" placeholder="Name">
  176. <a id="submitAlbum" class="button is-primary">Submit</a>
  177. </p>
  178. <h2 class="subtitle">List of albums</h2>
  179. <table class="table is-striped is-narrow">
  180. <thead>
  181. <tr>
  182. <th>Name</th>
  183. <th>Files</th>
  184. <th>Created At</th>
  185. <th></th>
  186. </tr>
  187. </thead>
  188. <tbody id="table">
  189. </tbody>
  190. </table>`;
  191. panel.page.appendChild(container);
  192. var table = document.getElementById('table');
  193. for(var item of response.data.albums){
  194. var tr = document.createElement('tr');
  195. tr.innerHTML = `
  196. <tr>
  197. <th>${item.name}</th>
  198. <th>${item.files}</th>
  199. <td>${item.date}</td>
  200. <td>
  201. <a class="button is-small is-primary is-outlined" title="Edit name" onclick="panel.renameAlbum(${item.id})">
  202. <span class="icon is-small">
  203. <i class="fa fa-pencil"></i>
  204. </span>
  205. </a>
  206. <a class="button is-small is-danger is-outlined" title="Delete album" onclick="panel.deleteAlbum(${item.id})">
  207. <span class="icon is-small">
  208. <i class="fa fa-trash-o"></i>
  209. </span>
  210. </a>
  211. </td>
  212. </tr>
  213. `;
  214. table.appendChild(tr);
  215. }
  216. document.getElementById('submitAlbum').addEventListener('click', function(){
  217. panel.submitAlbum();
  218. });
  219. })
  220. .catch(function (error) {
  221. return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error");
  222. console.log(error);
  223. });
  224. }
  225. panel.renameAlbum = function(id){
  226. swal({
  227. title: "Rename album",
  228. text: "New name you want to give the album:",
  229. type: "input",
  230. showCancelButton: true,
  231. closeOnConfirm: false,
  232. animation: "slide-from-top",
  233. inputPlaceholder: "My super album"
  234. },function(inputValue){
  235. if (inputValue === false) return false;
  236. if (inputValue === "") {
  237. swal.showInputError("You need to write something!");
  238. return false
  239. }
  240. axios.post('/api/albums/rename', {
  241. id: id,
  242. name: inputValue
  243. })
  244. .then(function (response) {
  245. if(response.data.success === false){
  246. if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token);
  247. else if(response.data.description === 'Name already in use') swal.showInputError("That name is already in use!");
  248. else swal("An error ocurred", response.data.description, "error");
  249. return;
  250. }
  251. swal("Success!", "Your album was renamed to: " + inputValue, "success");
  252. panel.getAlbumsSidebar();
  253. panel.getAlbums();
  254. return;
  255. })
  256. .catch(function (error) {
  257. return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error");
  258. console.log(error);
  259. });
  260. });
  261. }
  262. panel.deleteAlbum = function(id){
  263. swal({
  264. title: "Are you sure?",
  265. text: "This won't delete your files, only the album!",
  266. type: "warning",
  267. showCancelButton: true,
  268. confirmButtonColor: "#ff3860",
  269. confirmButtonText: "Yes, delete it!",
  270. closeOnConfirm: false
  271. },
  272. function(){
  273. axios.post('/api/albums/delete', {
  274. id: id
  275. })
  276. .then(function (response) {
  277. if(response.data.success === false){
  278. if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token);
  279. else return swal("An error ocurred", response.data.description, "error");
  280. }
  281. swal("Deleted!", "Your album has been deleted.", "success");
  282. panel.getAlbumsSidebar();
  283. panel.getAlbums();
  284. return;
  285. })
  286. .catch(function (error) {
  287. return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error");
  288. console.log(error);
  289. });
  290. }
  291. );
  292. }
  293. panel.submitAlbum = function(){
  294. axios.post('/api/albums', {
  295. name: document.getElementById('albumName').value
  296. })
  297. .then(function (response) {
  298. if(response.data.success === false){
  299. if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token);
  300. else return swal("An error ocurred", response.data.description, "error");
  301. }
  302. swal("Woohoo!", "Album was added successfully", "success");
  303. panel.getAlbumsSidebar();
  304. panel.getAlbums();
  305. return;
  306. })
  307. .catch(function (error) {
  308. return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error");
  309. console.log(error);
  310. });
  311. }
  312. panel.getAlbumsSidebar = function(){
  313. axios.get('/api/albums/sidebar')
  314. .then(function (response) {
  315. if(response.data.success === false){
  316. if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token);
  317. else return swal("An error ocurred", response.data.description, "error");
  318. }
  319. var albumsContainer = document.getElementById('albumsContainer');
  320. albumsContainer.innerHTML = '';
  321. if(response.data.albums === undefined) return;
  322. for(var album of response.data.albums){
  323. li = document.createElement('li');
  324. a = document.createElement('a');
  325. a.id = album.id;
  326. a.innerHTML = album.name;
  327. a.addEventListener('click', function(){
  328. panel.getAlbum(this);
  329. });
  330. li.appendChild(a);
  331. albumsContainer.appendChild(li);
  332. }
  333. })
  334. .catch(function (error) {
  335. return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error");
  336. console.log(error);
  337. });
  338. }
  339. panel.getAlbum = function(item){
  340. panel.getUploads(item.id);
  341. }
  342. panel.changeTokens = function(){
  343. axios.get('/api/tokens')
  344. .then(function (response) {
  345. if(response.data.success === false){
  346. if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token);
  347. else return swal("An error ocurred", response.data.description, "error");
  348. }
  349. panel.page.innerHTML = '';
  350. var container = document.createElement('div');
  351. container.className = "container";
  352. container.innerHTML = `
  353. <h2 class="subtitle">Manage your tokens</h2>
  354. <label class="label">Client token:</label>
  355. <p class="control has-addons">
  356. <input id="clientToken" class="input is-expanded" type="text" placeholder="Your client token">
  357. <a id="submitClientToken" class="button is-primary">Save</a>
  358. </p>
  359. <label class="label">Admin token:</label>
  360. <p class="control has-addons">
  361. <input id="adminToken" class="input is-expanded" type="text" placeholder="Your admin token">
  362. <a id="submitAdminToken" class="button is-primary">Save</a>
  363. </p>
  364. `;
  365. panel.page.appendChild(container);
  366. document.getElementById('clientToken').value = response.data.clientToken;
  367. document.getElementById('adminToken').value = response.data.adminToken;
  368. document.getElementById('submitClientToken').addEventListener('click', function(){
  369. panel.submitToken('client', document.getElementById('clientToken').value);
  370. });
  371. document.getElementById('submitAdminToken').addEventListener('click', function(){
  372. panel.submitToken('admin', document.getElementById('adminToken').value);
  373. });
  374. })
  375. .catch(function (error) {
  376. return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error");
  377. console.log(error);
  378. });
  379. }
  380. panel.submitToken = function(type, token){
  381. axios.post('/api/tokens/change', {
  382. type: type,
  383. token: token
  384. })
  385. .then(function (response) {
  386. if(response.data.success === false){
  387. if(response.data.description === 'not-authorized') return panel.verifyToken(panel.token);
  388. else return swal("An error ocurred", response.data.description, "error");
  389. }
  390. swal({
  391. title: "Woohoo!",
  392. text: 'Your token was changed successfully.',
  393. type: "success"
  394. }, function(){
  395. if(type === 'client')
  396. localStorage.token = token;
  397. else if(type === 'admin')
  398. localStorage.admintoken = token
  399. location.reload();
  400. })
  401. })
  402. .catch(function (error) {
  403. return swal("An error ocurred", 'There was an error with the request, please check the console for more information.', "error");
  404. console.log(error);
  405. });
  406. }
  407. window.onload = function () {
  408. panel.preparePage();
  409. }