apps.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import { readFileSync } from 'fs';
  2. let templatesJSON = readFileSync('./templates/templates.json');
  3. let templates = JSON.parse(templatesJSON).templates;
  4. templates = templates.sort((a, b) => {
  5. if (a.name < b.name) {
  6. return -1;
  7. }
  8. });
  9. export const Apps = (req, res) => {
  10. let page = Number(req.params.page) || 1;
  11. let list_start = (page-1)*28;
  12. let list_end = (page*28);
  13. let last_page = Math.ceil(templates.length/28);
  14. let prev = '/apps/' + (page-1);
  15. let next = '/apps/' + (page+1);
  16. if (page == 1) {
  17. prev = '/apps/' + (page);
  18. }
  19. if (page == last_page) {
  20. next = '/apps/' + (page);
  21. }
  22. let apps_list = '';
  23. for (let i = list_start; i < list_end && i < templates.length; i++) {
  24. let appCard = readFileSync('./views/partials/appCard.html', 'utf8');
  25. let name = templates[i].name || templates[i].title.toLowerCase();
  26. let desc = templates[i].description.slice(0, 60) + "...";
  27. let description = templates[i].description.replaceAll(". ", ".\n") || "no description available";
  28. let note = templates[i].note ? templates[i].note.replaceAll(". ", ".\n") : "no notes available";
  29. let image = templates[i].image;
  30. let logo = templates[i].logo;
  31. let categories = '';
  32. // set data.catagories to 'other' if data.catagories is empty or undefined
  33. if (templates[i].categories == null || templates[i].categories == undefined || templates[i].categories == '') {
  34. templates[i].categories = ['Other'];
  35. }
  36. for (let c = 0; c < templates[i].categories.length; c++) {
  37. categories += CatagoryColor(templates[i].categories[c]);
  38. }
  39. appCard = appCard.replace(/AppShortName/g, name);
  40. appCard = appCard.replace(/AppDesc/g, desc);
  41. appCard = appCard.replace(/AppLogo/g, logo);
  42. appCard = appCard.replace(/AppCategories/g, categories);
  43. apps_list += appCard;
  44. }
  45. res.render("apps", {
  46. name: req.session.user,
  47. role: req.session.role,
  48. avatar: req.session.avatar,
  49. list_start: list_start + 1,
  50. list_end: list_end,
  51. app_count: templates.length,
  52. prev: prev,
  53. next: next,
  54. apps_list: apps_list
  55. });
  56. }
  57. export const appSearch = async (req, res) => {
  58. let search = req.body.search.split(' ');
  59. let apps_list = '';
  60. let results = [];
  61. let page = Number(req.query.page) || 1;
  62. let list_start = (page - 1) * 28;
  63. let list_end = (page * 28);
  64. let last_page = Math.ceil(templates.length / 28);
  65. let prev = '/apps?page=' + (page - 1);
  66. let next = '/apps?page=' + (page + 1);
  67. if (page == 1) {
  68. prev = '/apps?page=' + (page);
  69. }
  70. if (page == last_page) {
  71. next = '/apps?page=' + (page);
  72. }
  73. function searchTemplates(word) {
  74. for (let i = 0; i < templates.length; i++) {
  75. if ((templates[i].description.includes(word)) || (templates[i].name.includes(word)) || (templates[i].title.includes(word))) {
  76. results.push(templates[i]);
  77. }
  78. }
  79. }
  80. searchTemplates(search);
  81. for (let i = 0; i < results.length; i++) {
  82. let app_card = appCard(results[i]);
  83. apps_list += app_card;
  84. }
  85. res.render("apps", {
  86. name: req.session.user,
  87. role: req.session.role,
  88. avatar: req.session.avatar,
  89. list_start: list_start + 1,
  90. list_end: list_end,
  91. app_count: templates.length,
  92. prev: prev,
  93. next: next,
  94. apps_list: apps_list
  95. });
  96. }
  97. function CatagoryColor(category) {
  98. switch (category) {
  99. case 'Other':
  100. return '<span class="badge bg-blue-lt">Other</span> ';
  101. case 'Productivity':
  102. return '<span class="badge bg-blue-lt">Productivity</span> ';
  103. case 'Tools':
  104. return '<span class="badge bg-blue-lt">Tools</span> ';
  105. case 'Dashboard':
  106. return '<span class="badge bg-blue-lt">Dashboard</span> ';
  107. case 'Communication':
  108. return '<span class="badge bg-azure-lt">Communication</span> ';
  109. case 'Media':
  110. return '<span class="badge bg-azure-lt">Media</span> ';
  111. case 'CMS':
  112. return '<span class="badge bg-azure-lt">CMS</span> ';
  113. case 'Monitoring':
  114. return '<span class="badge bg-indigo-lt">Monitoring</span> ';
  115. case 'LDAP':
  116. return '<span class="badge bg-purple-lt">LDAP</span> ';
  117. case 'Arr':
  118. return '<span class="badge bg-purple-lt">Arr</span> ';
  119. case 'Database':
  120. return '<span class="badge bg-red-lt">Database</span> ';
  121. case 'Paid':
  122. return '<span class="badge bg-red-lt" title="This is a paid product or contains paid features.">Paid</span> ';
  123. case 'Gaming':
  124. return '<span class="badge bg-pink-lt">Gaming</span> ';
  125. case 'Finance':
  126. return '<span class="badge bg-orange-lt">Finance</span> ';
  127. case 'Networking':
  128. return '<span class="badge bg-yellow-lt">Networking</span> ';
  129. case 'Authentication':
  130. return '<span class="badge bg-lime-lt">Authentication</span> ';
  131. case 'Development':
  132. return '<span class="badge bg-green-lt">Development</span> ';
  133. case 'Media Server':
  134. return '<span class="badge bg-teal-lt">Media Server</span> ';
  135. case 'Downloaders':
  136. return '<span class="badge bg-cyan-lt">Downloaders</span> ';
  137. default:
  138. return ''; // default to other if the category is not recognized
  139. }
  140. }