elabs 4.0.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. checksums.yaml +4 -4
  2. data/.gitlab-ci.yml +9 -0
  3. data/.node-version +1 -1
  4. data/.rubocop.yml +4 -0
  5. data/.stylelintrc.yml +12 -2
  6. data/CHANGELOG.md +81 -12
  7. data/Gemfile +1 -1
  8. data/Gemfile.lock +96 -94
  9. data/README.md +2 -0
  10. data/ROADMAP.md +4 -2
  11. data/app/assets/config/elabs_manifest.js +2 -1
  12. data/app/assets/fonts/elabs/FontAwesome/fa-brands-400.eot +0 -0
  13. data/app/assets/fonts/elabs/FontAwesome/fa-brands-400.svg +1148 -0
  14. data/app/assets/fonts/elabs/FontAwesome/fa-brands-400.ttf +0 -0
  15. data/app/assets/fonts/elabs/FontAwesome/fa-brands-400.woff +0 -0
  16. data/app/assets/fonts/elabs/FontAwesome/fa-brands-400.woff2 +0 -0
  17. data/app/assets/fonts/elabs/FontAwesome/fa-regular-400.eot +0 -0
  18. data/app/assets/fonts/elabs/FontAwesome/fa-regular-400.svg +467 -0
  19. data/app/assets/fonts/elabs/FontAwesome/fa-regular-400.ttf +0 -0
  20. data/app/assets/fonts/elabs/FontAwesome/fa-regular-400.woff +0 -0
  21. data/app/assets/fonts/elabs/FontAwesome/fa-regular-400.woff2 +0 -0
  22. data/app/assets/fonts/elabs/FontAwesome/fa-solid-900.eot +0 -0
  23. data/app/assets/fonts/elabs/FontAwesome/fa-solid-900.svg +2231 -0
  24. data/app/assets/fonts/elabs/FontAwesome/fa-solid-900.ttf +0 -0
  25. data/app/assets/fonts/elabs/FontAwesome/fa-solid-900.woff +0 -0
  26. data/app/assets/fonts/elabs/FontAwesome/fa-solid-900.woff2 +0 -0
  27. data/app/assets/fonts/elabs/OpenSans/Apache License.txt +201 -0
  28. data/app/assets/fonts/elabs/OpenSans/OpenSans-Bold.ttf +0 -0
  29. data/app/assets/fonts/elabs/OpenSans/OpenSans-Light.ttf +0 -0
  30. data/app/assets/fonts/elabs/OpenSans/OpenSans-Regular.ttf +0 -0
  31. data/app/assets/fonts/elabs/OpenSans/OpenSans-Semibold.ttf +0 -0
  32. data/app/assets/fonts/elabs/license-icons/license-icons.eot +0 -0
  33. data/app/assets/fonts/elabs/license-icons/license-icons.svg +51 -0
  34. data/app/assets/fonts/elabs/license-icons/license-icons.ttf +0 -0
  35. data/app/assets/fonts/elabs/license-icons/license-icons.woff +0 -0
  36. data/app/assets/fonts/elabs/license-icons/license-icons.woff2 +0 -0
  37. data/app/assets/images/elabs/preview_placeholder.png +0 -0
  38. data/app/assets/images/elabs/preview_placeholder_nsfw.png +0 -0
  39. data/app/assets/javascripts/elabs/announcements.js +33 -0
  40. data/app/assets/javascripts/elabs/application.js.erb +17 -14
  41. data/app/assets/javascripts/elabs/forms.js +0 -1
  42. data/app/assets/javascripts/elabs/helpers-markdown.js +2 -2
  43. data/app/assets/javascripts/elabs/helpers.js +17 -0
  44. data/app/assets/javascripts/elabs/menu.js +5 -0
  45. data/app/assets/stylesheets/elabs/_fonts.scss +32 -0
  46. data/app/assets/stylesheets/elabs/_variables.scss +286 -5
  47. data/app/assets/stylesheets/elabs/app/components/_act.scss +83 -0
  48. data/app/assets/stylesheets/elabs/app/components/_announcement.scss +41 -0
  49. data/app/assets/stylesheets/elabs/app/components/_classifier_types.scss +43 -0
  50. data/app/assets/stylesheets/elabs/app/components/_comment.scss +29 -0
  51. data/app/assets/stylesheets/elabs/app/components/_content_relations.scss +53 -0
  52. data/app/assets/stylesheets/elabs/app/components/_content_statuses.scss +39 -0
  53. data/app/assets/stylesheets/elabs/app/components/_content_types.scss +41 -0
  54. data/app/assets/stylesheets/elabs/app/components/_git_cards.scss +122 -0
  55. data/app/assets/stylesheets/elabs/app/elements/_alerts.scss +3 -0
  56. data/app/assets/stylesheets/elabs/app/elements/_badges.scss +17 -0
  57. data/app/assets/stylesheets/elabs/app/elements/_buttons.scss +34 -0
  58. data/app/assets/stylesheets/elabs/app/elements/_dropdowns.scss +78 -0
  59. data/app/assets/stylesheets/elabs/app/elements/_empty.scss +31 -0
  60. data/app/assets/stylesheets/elabs/app/elements/_errors.scss +15 -0
  61. data/app/assets/stylesheets/elabs/app/elements/_filter_link.scss +23 -0
  62. data/app/assets/stylesheets/elabs/app/elements/_fixed_links.scss +19 -0
  63. data/app/assets/stylesheets/elabs/app/elements/_forms.scss +123 -0
  64. data/app/assets/stylesheets/elabs/app/elements/_icons.scss +74 -0
  65. data/app/assets/stylesheets/elabs/app/{_medias.scss → elements/_medias.scss} +2 -0
  66. data/app/assets/stylesheets/elabs/app/{_modals.scss → elements/_modals.scss} +8 -4
  67. data/app/assets/stylesheets/elabs/app/elements/_nsfw.scss +41 -0
  68. data/app/assets/stylesheets/elabs/app/{_pagination.scss → elements/_pagination.scss} +0 -0
  69. data/app/assets/stylesheets/elabs/app/{_tables.scss → elements/_tables.scss} +2 -2
  70. data/app/assets/stylesheets/elabs/app/elements/_tabs.scss +73 -0
  71. data/app/assets/stylesheets/elabs/app/helpers/_cards.scss +80 -0
  72. data/app/assets/stylesheets/elabs/app/helpers/_containers.scss +7 -0
  73. data/app/assets/stylesheets/elabs/app/helpers/_states.scss +3 -0
  74. data/app/assets/stylesheets/elabs/app/{_helpers.scss → helpers/_typo.scss} +6 -4
  75. data/app/assets/stylesheets/elabs/app/layouts/_acts.scss +25 -0
  76. data/app/assets/stylesheets/elabs/app/layouts/_classifiers.scss +32 -0
  77. data/app/assets/stylesheets/elabs/app/{_comments.scss → layouts/_comments.scss} +0 -2
  78. data/app/assets/stylesheets/elabs/app/layouts/_devise.scss +65 -0
  79. data/app/assets/stylesheets/elabs/app/layouts/_layout.scss +40 -0
  80. data/app/assets/stylesheets/elabs/app/layouts/_page.scss +14 -0
  81. data/app/assets/stylesheets/elabs/app/layouts/_page_content.scss +13 -0
  82. data/app/assets/stylesheets/elabs/app/layouts/_page_footer.scss +20 -0
  83. data/app/assets/stylesheets/elabs/app/layouts/_page_header.scss +146 -0
  84. data/app/assets/stylesheets/elabs/app/layouts/_page_menu.scss +232 -0
  85. data/app/assets/stylesheets/elabs/app/layouts/_page_messages.scss +4 -0
  86. data/app/assets/stylesheets/elabs/app/layouts/_private_layout.scss +78 -0
  87. data/app/assets/stylesheets/elabs/app/{_typo.scss → layouts/_typo.scss} +3 -0
  88. data/app/assets/stylesheets/elabs/app/mixins/_classifier_card.scss +43 -0
  89. data/app/assets/stylesheets/elabs/app/mixins/_content_card.scss +103 -0
  90. data/app/assets/stylesheets/elabs/app/mixins/_content_full.scss +158 -0
  91. data/app/assets/stylesheets/elabs/app/mixins/{_content-inline.scss → _content_inline.scss} +0 -0
  92. data/app/assets/stylesheets/elabs/lib/_codemirror.scss +2 -2
  93. data/app/assets/stylesheets/elabs/{_colors.scss → lib/_colors_reference.scss} +0 -52
  94. data/app/assets/stylesheets/elabs/lib/_license_icons.scss +121 -0
  95. data/app/assets/stylesheets/elabs/lib/fontawesome/_fontawesome.scss +1 -1
  96. data/app/assets/stylesheets/elabs/lib/fontawesome/_fonts.scss +18 -18
  97. data/app/assets/stylesheets/elabs/lib/knacss/_knacss.scss +1 -1
  98. data/app/assets/stylesheets/elabs/lib/knacss/_knacss_variables.scss +227 -0
  99. data/app/assets/stylesheets/elabs/style.scss +62 -57
  100. data/app/controllers/elabs/admin/admin_application_controller.rb +1 -1
  101. data/app/controllers/elabs/admin/announcements_controller.rb +71 -0
  102. data/app/controllers/elabs/concerns/elabs_controller.rb +3 -0
  103. data/app/controllers/elabs/content_application_controller.rb +4 -0
  104. data/app/controllers/elabs/elabs_public_controller.rb +15 -0
  105. data/app/controllers/elabs/languages_controller.rb +1 -5
  106. data/app/controllers/elabs/member/comments_controller.rb +42 -0
  107. data/app/controllers/elabs/member/member_application_controller.rb +1 -1
  108. data/app/controllers/elabs/reports_controller.rb +2 -0
  109. data/app/helpers/elabs/acts_helper.rb +7 -2
  110. data/app/helpers/elabs/application_helper.rb +8 -50
  111. data/app/helpers/elabs/content_filters_helper.rb +17 -24
  112. data/app/helpers/elabs/content_helper.rb +8 -35
  113. data/app/helpers/elabs/content_renderer_helper.rb +4 -112
  114. data/app/helpers/elabs/form_helper.rb +11 -11
  115. data/app/helpers/elabs/icons_helper.rb +63 -0
  116. data/app/helpers/elabs/{admin_content_helper.rb → links_admin_helper.rb} +1 -1
  117. data/app/helpers/elabs/links_helper.rb +58 -0
  118. data/app/helpers/elabs/{member_content_helper.rb → links_member_helper.rb} +2 -2
  119. data/app/helpers/elabs/notification_helper.rb +17 -3
  120. data/app/helpers/elabs/shortcodes_helper.rb +108 -0
  121. data/app/helpers/elabs/thumbnails_helper.rb +1 -1
  122. data/app/models/elabs/album.rb +14 -0
  123. data/app/models/elabs/announcement.rb +33 -0
  124. data/app/models/elabs/article.rb +14 -0
  125. data/app/models/elabs/comment.rb +10 -4
  126. data/app/models/elabs/note.rb +14 -0
  127. data/app/models/elabs/project.rb +12 -0
  128. data/app/models/elabs/report.rb +1 -0
  129. data/app/models/elabs/upload.rb +16 -0
  130. data/app/models/elabs/user.rb +2 -1
  131. data/app/views/elabs/acts/_filters.html.haml +3 -2
  132. data/app/views/elabs/acts/index.html.haml +2 -13
  133. data/app/views/elabs/admin/announcements/_announcement.json.jbuilder +10 -0
  134. data/app/views/elabs/admin/announcements/_form.html.haml +52 -0
  135. data/app/views/elabs/admin/announcements/edit.html.haml +3 -0
  136. data/app/views/elabs/admin/announcements/index.html.haml +28 -0
  137. data/app/views/elabs/admin/announcements/index.json.jbuilder +1 -0
  138. data/app/views/elabs/admin/announcements/new.html.haml +3 -0
  139. data/app/views/elabs/admin/licenses/index.html.haml +2 -2
  140. data/app/views/elabs/admin/uploads/_upload.json.jbuilder +3 -3
  141. data/app/views/elabs/albums/_card_content.html.haml +8 -0
  142. data/app/views/elabs/albums/_filters.html.haml +5 -3
  143. data/app/views/elabs/albums/index.html.haml +1 -1
  144. data/app/views/elabs/albums/show.html.haml +38 -29
  145. data/app/views/elabs/articles/_filters.html.haml +5 -3
  146. data/app/views/elabs/articles/index.html.haml +1 -1
  147. data/app/views/elabs/articles/show.html.haml +33 -25
  148. data/app/views/elabs/auth/confirmations/new.html.haml +1 -1
  149. data/app/views/elabs/auth/passwords/edit.html.haml +1 -1
  150. data/app/views/elabs/auth/passwords/new.html.haml +1 -1
  151. data/app/views/elabs/auth/registrations/new.html.haml +7 -2
  152. data/app/views/elabs/auth/sessions/_new.html.haml +1 -1
  153. data/app/views/elabs/auth/unlocks/new.html.haml +1 -1
  154. data/app/views/elabs/comments/_comments.html.haml +29 -20
  155. data/app/views/elabs/comments/_form.html.haml +40 -36
  156. data/app/views/elabs/languages/_filters.html.haml +3 -5
  157. data/app/views/elabs/languages/index.html.haml +12 -13
  158. data/app/views/elabs/languages/show.html.haml +36 -31
  159. data/app/views/elabs/layouts/_announcements.html.haml +9 -0
  160. data/app/views/elabs/layouts/_content_associations.html.haml +89 -0
  161. data/app/views/elabs/layouts/_content_card.html.haml +41 -0
  162. data/app/views/elabs/layouts/_flash_messages.html.haml +4 -0
  163. data/app/views/elabs/layouts/_footer.html.haml +18 -10
  164. data/app/views/elabs/layouts/_form_honeypot.html.haml +12 -0
  165. data/app/views/elabs/layouts/_hidden_entry.html.haml +1 -1
  166. data/app/views/elabs/layouts/_hidden_entry_full.html.haml +4 -2
  167. data/app/views/elabs/layouts/_hidden_entry_inline.html.haml +1 -1
  168. data/app/views/elabs/layouts/_language_menu.html.haml +2 -2
  169. data/app/views/elabs/layouts/_menu.html.haml +58 -75
  170. data/app/views/elabs/layouts/_menu_admin.html.haml +40 -0
  171. data/app/views/elabs/layouts/_menu_member.html.haml +57 -0
  172. data/app/views/elabs/layouts/application.html.haml +24 -13
  173. data/app/views/elabs/layouts/application_admin.html.haml +33 -0
  174. data/app/views/elabs/layouts/application_member.html.haml +36 -0
  175. data/app/views/elabs/layouts/{lists → content_classifiers_lists}/_albums.html.haml +0 -0
  176. data/app/views/elabs/layouts/{lists → content_classifiers_lists}/_projects.html.haml +0 -0
  177. data/app/views/elabs/layouts/{lists → content_classifiers_lists}/_tags.html.haml +0 -0
  178. data/app/views/elabs/layouts/{_shortcode_infinite_loop.html.haml → shortcodes/_infinite_loop.html.haml} +1 -1
  179. data/app/views/elabs/layouts/{_shortcode_infinite_loop_inline.html.haml → shortcodes/_infinite_loop_inline.html.haml} +0 -0
  180. data/app/views/elabs/layouts/{_shortcode_missing_content.html.haml → shortcodes/_missing_content.html.haml} +1 -1
  181. data/app/views/elabs/layouts/{_shortcode_missing_content_inline.html.haml → shortcodes/_missing_content_inline.html.haml} +0 -0
  182. data/app/views/elabs/layouts/shortcodes/_open_to_see.html.haml +2 -0
  183. data/app/views/elabs/layouts/{widgets → shortcodes/widgets}/_github_repo_card.html.haml +1 -1
  184. data/app/views/elabs/layouts/{widgets → shortcodes/widgets}/_github_repo_inline.html.haml +0 -0
  185. data/app/views/elabs/layouts/{widgets → shortcodes/widgets}/_github_user_card.html.haml +0 -0
  186. data/app/views/elabs/layouts/{widgets → shortcodes/widgets}/_gitlab_group_card.html.haml +1 -1
  187. data/app/views/elabs/layouts/{widgets → shortcodes/widgets}/_gitlab_repo_card.html.haml +1 -1
  188. data/app/views/elabs/layouts/{widgets → shortcodes/widgets}/_gitlab_repo_inline.html.haml +0 -0
  189. data/app/views/elabs/layouts/{widgets → shortcodes/widgets}/_gitlab_user_card.html.haml +1 -1
  190. data/app/views/elabs/layouts/shortcodes/widgets/vue/_all_widgets.html.haml +5 -0
  191. data/app/views/elabs/layouts/{widgets → shortcodes/widgets}/vue/_github_repo_card_vue.html.haml +8 -8
  192. data/app/views/elabs/layouts/{widgets → shortcodes/widgets}/vue/_github_user_card_vue.html.haml +5 -5
  193. data/app/views/elabs/layouts/{widgets → shortcodes/widgets}/vue/_gitlab_group_card_vue.html.haml +5 -5
  194. data/app/views/elabs/layouts/{widgets → shortcodes/widgets}/vue/_gitlab_repo_card_vue.html.haml +8 -8
  195. data/app/views/elabs/layouts/{widgets → shortcodes/widgets}/vue/_gitlab_user_card_vue.html.haml +4 -4
  196. data/app/views/elabs/licenses/_filters.html.haml +3 -2
  197. data/app/views/elabs/licenses/index.html.haml +14 -12
  198. data/app/views/elabs/licenses/show.html.haml +40 -34
  199. data/app/views/elabs/member/albums/_form.html.haml +1 -43
  200. data/app/views/elabs/member/articles/_form.html.haml +1 -39
  201. data/app/views/elabs/member/layouts/_form_commons.html.haml +55 -0
  202. data/app/views/elabs/member/notes/_form.html.haml +1 -39
  203. data/app/views/elabs/member/preferences/edit.html.haml +1 -2
  204. data/app/views/elabs/member/projects/_form.html.haml +3 -38
  205. data/app/views/elabs/member/uploads/_form.html.haml +1 -42
  206. data/app/views/elabs/member/uploads/_upload.json.jbuilder +3 -3
  207. data/app/views/elabs/member/users/edit.html.haml +3 -4
  208. data/app/views/elabs/notes/_filters.html.haml +5 -3
  209. data/app/views/elabs/notes/index.html.haml +1 -1
  210. data/app/views/elabs/notes/show.html.haml +33 -25
  211. data/app/views/elabs/projects/_filters.html.haml +5 -3
  212. data/app/views/elabs/projects/index.html.haml +1 -1
  213. data/app/views/elabs/projects/show.html.haml +68 -62
  214. data/app/views/elabs/reports/_form.html.haml +2 -0
  215. data/app/views/elabs/tags/_filters.html.haml +3 -2
  216. data/app/views/elabs/tags/index.html.haml +11 -11
  217. data/app/views/elabs/tags/show.html.haml +31 -28
  218. data/app/views/elabs/uploads/_filters.html.haml +5 -3
  219. data/app/views/elabs/uploads/_preview.html.haml +5 -4
  220. data/app/views/elabs/uploads/_thumbnail.html.haml +9 -0
  221. data/app/views/elabs/uploads/_upload.json.jbuilder +3 -3
  222. data/app/views/elabs/uploads/index.html.haml +1 -1
  223. data/app/views/elabs/uploads/show.html.haml +45 -39
  224. data/app/views/elabs/users/_filters.html.haml +3 -2
  225. data/app/views/elabs/users/_user.html.haml +3 -3
  226. data/app/views/elabs/users/show.html.haml +48 -43
  227. data/config/routes.rb +13 -8
  228. data/db/migrate/20181025084232_add_archived_field_to_comments.rb +5 -0
  229. data/db/migrate/20181026071743_delete_comment_notifications.rb +5 -0
  230. data/db/migrate/20181030063505_create_announcements.rb +14 -0
  231. data/docs/CODEOWNERS +10 -0
  232. data/docs/migrating.md +16 -1
  233. data/docs/shortcodes_guide.md +51 -0
  234. data/lib/assets/javascripts/README-highlight.js.md +5 -5
  235. data/lib/assets/javascripts/highlight.js-9.13.1/highlight.pack.js +2 -0
  236. data/lib/assets/stylesheets/{highlight.js-9.12.0 → highlight.js-9.13.1}/styles/atelier-sulphurpool-light.css +0 -0
  237. data/lib/elabs.rb +8 -0
  238. data/lib/elabs/version.rb +1 -1
  239. data/lib/generators/elabs/{devise_views_generator.rb → devise_mailer_views_generator.rb} +2 -2
  240. data/lib/generators/elabs/images_generator.rb +24 -0
  241. data/lib/generators/elabs/required_assets_generator.rb +0 -2
  242. data/lib/generators/templates/elabs.rb +3 -0
  243. data/locale/app.pot +132 -19
  244. data/locale/en/app.edit.po +130 -17
  245. data/locale/en/app.po +130 -17
  246. data/locale/fr/app.edit.po +145 -28
  247. data/locale/fr/app.po +141 -27
  248. data/package.json +10 -12
  249. data/yarn.lock +885 -668
  250. metadata +136 -97
  251. data/app/assets/stylesheets/elabs/_icons.scss +0 -17
  252. data/app/assets/stylesheets/elabs/app/_acts.scss +0 -69
  253. data/app/assets/stylesheets/elabs/app/_alerts.scss +0 -3
  254. data/app/assets/stylesheets/elabs/app/_badges.scss +0 -11
  255. data/app/assets/stylesheets/elabs/app/_buttons.scss +0 -29
  256. data/app/assets/stylesheets/elabs/app/_content.scss +0 -25
  257. data/app/assets/stylesheets/elabs/app/_content_statuses.scss +0 -32
  258. data/app/assets/stylesheets/elabs/app/_content_uploads.scss +0 -39
  259. data/app/assets/stylesheets/elabs/app/_empty.scss +0 -19
  260. data/app/assets/stylesheets/elabs/app/_errors.scss +0 -9
  261. data/app/assets/stylesheets/elabs/app/_filter_links.scss +0 -27
  262. data/app/assets/stylesheets/elabs/app/_forms.scss +0 -74
  263. data/app/assets/stylesheets/elabs/app/_languages.scss +0 -6
  264. data/app/assets/stylesheets/elabs/app/_layout.scss +0 -206
  265. data/app/assets/stylesheets/elabs/app/_licenses.scss +0 -6
  266. data/app/assets/stylesheets/elabs/app/_link-to-top.scss +0 -8
  267. data/app/assets/stylesheets/elabs/app/_tabs.scss +0 -54
  268. data/app/assets/stylesheets/elabs/app/_tags.scss +0 -6
  269. data/app/assets/stylesheets/elabs/app/_toolbars.scss +0 -3
  270. data/app/assets/stylesheets/elabs/app/_users.scss +0 -21
  271. data/app/assets/stylesheets/elabs/app/admin-members/_forms.scss +0 -13
  272. data/app/assets/stylesheets/elabs/app/admin-members/_indexes.scss +0 -46
  273. data/app/assets/stylesheets/elabs/app/admin-members/_layout.scss +0 -17
  274. data/app/assets/stylesheets/elabs/app/areas/_devise.scss +0 -31
  275. data/app/assets/stylesheets/elabs/app/components/_cards.scss +0 -16
  276. data/app/assets/stylesheets/elabs/app/components/_container.scss +0 -4
  277. data/app/assets/stylesheets/elabs/app/mixins/_classifier-card.scss +0 -16
  278. data/app/assets/stylesheets/elabs/app/mixins/_content-card.scss +0 -72
  279. data/app/assets/stylesheets/elabs/app/mixins/_content-full.scss +0 -77
  280. data/app/assets/stylesheets/elabs/app/widgets/_git-cards.scss +0 -88
  281. data/app/assets/stylesheets/elabs/lib/fontawesome/_icons.scss +0 -1118
  282. data/app/assets/stylesheets/elabs/lib/knacss/_knacss-variables.scss +0 -239
  283. data/app/views/elabs/albums/_album.html.haml +0 -38
  284. data/app/views/elabs/articles/_article.html.haml +0 -30
  285. data/app/views/elabs/languages/_associations.html.haml +0 -61
  286. data/app/views/elabs/layouts/_shortcode_open_to_see.html.haml +0 -2
  287. data/app/views/elabs/layouts/admin_application.html.haml +0 -21
  288. data/app/views/elabs/layouts/member_application.html.haml +0 -24
  289. data/app/views/elabs/layouts/widgets/vue/_all_widgets.html.haml +0 -5
  290. data/app/views/elabs/licenses/_associations.html.haml +0 -61
  291. data/app/views/elabs/notes/_note.html.haml +0 -31
  292. data/app/views/elabs/projects/_associations.html.haml +0 -54
  293. data/app/views/elabs/projects/_project.html.haml +0 -29
  294. data/app/views/elabs/tags/_associations.html.haml +0 -61
  295. data/app/views/elabs/uploads/_upload.html.haml +0 -41
  296. data/app/views/elabs/users/_associations.html.haml +0 -61
  297. data/db/seeds.rb +0 -10
  298. data/db/seeds_development.rb +0 -21
  299. data/db/seeds_production.rb +0 -0
  300. data/lib/assets/javascripts/codemirror-5.39.2/addon/mode/overlay.js +0 -90
  301. data/lib/assets/javascripts/codemirror-5.39.2/lib/codemirror.js +0 -9684
  302. data/lib/assets/javascripts/codemirror-5.39.2/mode/clike/clike.js +0 -834
  303. data/lib/assets/javascripts/codemirror-5.39.2/mode/css/css.js +0 -832
  304. data/lib/assets/javascripts/codemirror-5.39.2/mode/gfm/gfm.js +0 -129
  305. data/lib/assets/javascripts/codemirror-5.39.2/mode/htmlmixed/htmlmixed.js +0 -152
  306. data/lib/assets/javascripts/codemirror-5.39.2/mode/javascript/javascript.js +0 -896
  307. data/lib/assets/javascripts/codemirror-5.39.2/mode/markdown/markdown.js +0 -882
  308. data/lib/assets/javascripts/codemirror-5.39.2/mode/meta.js +0 -217
  309. data/lib/assets/javascripts/codemirror-5.39.2/mode/xml/xml.js +0 -402
  310. data/lib/assets/javascripts/highlight.js-9.12.0/highlight.pack.js +0 -2
  311. data/lib/assets/stylesheets/codemirror-5.39.2/lib/codemirror.css +0 -346
  312. data/lib/assets/stylesheets/codemirror-5.39.2/theme/base16-dark.css +0 -38
  313. data/lib/assets/stylesheets/codemirror-5.39.2/theme/base16-light.css +0 -38
@@ -6,7 +6,7 @@ module Elabs
6
6
 
7
7
  before_action :authenticate_admin!
8
8
 
9
- layout 'elabs/layouts/admin_application'
9
+ layout 'elabs/layouts/application_admin'
10
10
 
11
11
  private
12
12
 
@@ -0,0 +1,71 @@
1
+ module Elabs
2
+ module Admin
3
+ class AnnouncementsController < AdminApplicationController
4
+ before_action :set_announcement, only: %i[edit update destroy]
5
+
6
+ # GET /announcements
7
+ def index
8
+ @announcements = Announcement.all
9
+ end
10
+
11
+ # GET /announcements/new
12
+ def new
13
+ @announcement = Announcement.new
14
+ end
15
+
16
+ # GET /announcements/1/edit
17
+ def edit; end
18
+
19
+ # POST /announcements
20
+ def create
21
+ @announcement = Announcement.new(announcement_params)
22
+ @announcement.user = current_user
23
+
24
+ respond_to do |format|
25
+ if @announcement.save
26
+ format.html { redirect_to admin_announcements_url, notice: _('Announcement was successfully created.') }
27
+ format.json { render '_announcement', status: :created, locals: { announcement: @announcement } }
28
+ else
29
+ format.html { render :new }
30
+ format.json { render json: @announcement.errors, status: :unprocessable_entity }
31
+ end
32
+ end
33
+ end
34
+
35
+ # PATCH/PUT /announcements/1
36
+ def update
37
+ respond_to do |format|
38
+ if @announcement.update(announcement_params)
39
+ format.html { redirect_to admin_announcements_url, notice: _('Announcement was successfully updated.') }
40
+ format.json { render '_announcement', status: :ok, locals: { announcement: @announcement } }
41
+
42
+ else
43
+ format.html { render :edit }
44
+ format.json { render json: @announcement.errors, status: :unprocessable_entity }
45
+ end
46
+ end
47
+ end
48
+
49
+ # DELETE /announcements/1
50
+ def destroy
51
+ @announcement.destroy
52
+ respond_to do |format|
53
+ format.html { redirect_to admin_announcements_url, notice: _('Announcement was successfully destroyed.') }
54
+ format.json { head :no_content }
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ # Use callbacks to share common setup or constraints between actions.
61
+ def set_announcement
62
+ @announcement = Announcement.find(params[:id])
63
+ end
64
+
65
+ # Only allow a trusted parameter "white list" through.
66
+ def announcement_params
67
+ params.require(:announcement).permit(:start_at, :end_at, :content, :level, :target)
68
+ end
69
+ end
70
+ end
71
+ end
@@ -9,8 +9,11 @@ module Elabs
9
9
 
10
10
  included do
11
11
  helper Elabs::ApplicationHelper
12
+ helper Elabs::IconsHelper
12
13
  helper Elabs::ContentFiltersHelper
13
14
  helper Elabs::NotificationHelper
15
+ helper Elabs::ContentRendererHelper
16
+ helper Elabs::ShortcodesHelper
14
17
 
15
18
  layout 'elabs/layouts/application'
16
19
  end
@@ -7,7 +7,10 @@ module Elabs
7
7
 
8
8
  # POST /comments
9
9
  # POST /comments.json
10
+ # rubocop:disable Metrics/AbcSize
10
11
  def create_comment
12
+ return if trap_dumb_bot_in 'body', _('Comment was successfully created. Thank you Bishop.')
13
+
11
14
  build_comment
12
15
 
13
16
  respond_to do |format|
@@ -21,6 +24,7 @@ module Elabs
21
24
  end
22
25
  end
23
26
  end
27
+ # rubocop:enable Metrics/AbcSize
24
28
 
25
29
  private
26
30
 
@@ -96,5 +96,20 @@ module Elabs
96
96
  # and slug fields that are not present in params
97
97
  slug_parameters.reject { |field| %w[tag_slug project_slug].include?(field) || !params.include?(field) }
98
98
  end
99
+
100
+ def trap_dumb_bot_in(field, notice)
101
+ return false unless Elabs.trap_dumb_bots?
102
+
103
+ if params[field].present?
104
+ respond_to do |format|
105
+ format.html { redirect_to request.referer, notice: notice }
106
+ format.json { render json: { message: 'ok' }, status: :created }
107
+ end
108
+
109
+ return true
110
+ end
111
+
112
+ false
113
+ end
99
114
  end
100
115
  end
@@ -9,11 +9,7 @@ module Elabs
9
9
  # GET /languages.json
10
10
  def index
11
11
  languages = scope_request Language.page(params[:page]).per(self.class::MAX_ITEMS_PER_PAGE)
12
- @languages = if params['with_content_only'] && params['with_content_only'] == 'false'
13
- languages
14
- else
15
- languages.with_content_only
16
- end
12
+ @languages = languages.with_content_only
17
13
  end
18
14
 
19
15
  # GET /languages/1
@@ -0,0 +1,42 @@
1
+ module Elabs
2
+ module Member
3
+ class CommentsController < MemberApplicationController
4
+ before_action :set_comment, only: %i[archive destroy]
5
+
6
+ def archive
7
+ respond_to do |format|
8
+ if @comment.archive!
9
+ format.html { redirect_to @comment.content, notice: _('Comment was successfully archived.') }
10
+ format.json { render json: @comment, status: :ok }
11
+ else
12
+ format.html { redirect_to @comment.content, notice: _('An error occurred during process') }
13
+ format.json { render json: @comment.errors, status: :unprocessable_entity }
14
+ end
15
+ end
16
+ end
17
+
18
+ def destroy
19
+ content = @comment.content
20
+ @comment.destroy
21
+ respond_to do |format|
22
+ format.html { redirect_to content, notice: _('Comment was successfully destroyed.') }
23
+ format.json { head :no_content }
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def set_comment
30
+ id = params.key?('comment_id') ? params['comment_id'] : params['id']
31
+ comment = Elabs::Comment.find(id)
32
+
33
+ if comment.content.user.id == current_user.id
34
+ @comment = comment
35
+ return
36
+ end
37
+
38
+ throw ActiveRecord::RecordNotFound
39
+ end
40
+ end
41
+ end
42
+ end
@@ -6,7 +6,7 @@ module Elabs
6
6
 
7
7
  before_action :authenticate_user!
8
8
 
9
- layout 'elabs/layouts/member_application'
9
+ layout 'elabs/layouts/application_member'
10
10
  end
11
11
  end
12
12
  end
@@ -4,6 +4,8 @@ module Elabs
4
4
  # POST /reports.json
5
5
  # rubocop:disable Metrics/AbcSize
6
6
  def create
7
+ return if trap_dumb_bot_in 'body', _('Report was successfully created. Thank you Bishop.')
8
+
7
9
  report = complete_report_with_user
8
10
 
9
11
  respond_to do |format|
@@ -13,8 +13,13 @@ module Elabs
13
13
  end
14
14
 
15
15
  def act_notice_string(act, include_link = true)
16
- string = format('%<type>s #%<id>i', type: act.content_type.demodulize, id: act.content_id)
17
- string = link_to string, act.content unless %w[unpublish destroy lock].include?(act.event) || !include_link
16
+ type = act.content_type.demodulize
17
+ title = act.content.title_to_display
18
+ string = if %w[unpublish destroy lock].include?(act.event) || !include_link
19
+ format('%<type>s "%<title>s"', type: type, title: title)
20
+ else
21
+ format('%<type>s "%<link>s"', type: type, link: link_to(title, act.content))
22
+ end
18
23
 
19
24
  format(_('%<string>s has been %<event>s'), string: string, event: act_action(act.event)).html_safe
20
25
  end
@@ -8,56 +8,6 @@ module Elabs
8
8
  session[:show_nsfw]
9
9
  end
10
10
 
11
- def show_item?(entity)
12
- (entity.sfw? || show_nsfw?) && !entity.locked?
13
- end
14
-
15
- def user_is_author_of(entity)
16
- current_user&.id && entity.user_id == current_user.id
17
- end
18
-
19
- def icon_text(icon, text, icon_options = [], reverse = false)
20
- format(
21
- reverse ? _('%<text>s %<icon>s') : _('%<icon>s %<text>s'),
22
- icon: icon(icon, icon_options), text: text
23
- ).html_safe
24
- end
25
-
26
- def boolean_icon_tag(value, true_icon = 'check', false_icon = 'times', false_class = '', true_class = '')
27
- icon_class = [
28
- "fas fa-#{value ? true_icon : false_icon} fa-fw #{value ? true_class : false_class}"
29
- ]
30
- content_tag(:i, nil, class: icon_class)
31
- end
32
-
33
- def colored_good_or_bad_icon_tag(value, true_icon = 'check', false_icon = 'times', false_is_good = false)
34
- if false_is_good
35
- false_class = 'is-success'
36
- true_class = 'is-danger'
37
- else
38
- false_class = 'is-danger'
39
- true_class = 'is-success'
40
- end
41
- boolean_icon_tag value, true_icon, false_icon, false_class, true_class
42
- end
43
-
44
- def icon(name, classes = [], base = 'fas')
45
- icon_class = ["#{base} fa-#{name}"]
46
- icon_class += classes.map do |c|
47
- if %w[2x 3x 4x fw pulse spin].include? c
48
- "fa-#{c}"
49
- else
50
- c
51
- end
52
- end
53
-
54
- content_tag(:i, nil, class: icon_class)
55
- end
56
-
57
- def license_icon(license, classes = ['fw'])
58
- icon license.icon, classes, 'fab'
59
- end
60
-
61
11
  def page_title(title, namespace = nil)
62
12
  out = [Elabs.site_name]
63
13
  out.push(namespace) if namespace
@@ -77,5 +27,13 @@ module Elabs
77
27
  self.formats = old_formats
78
28
  end
79
29
  end
30
+
31
+ def singular_type_name(entity)
32
+ entity.class.name.demodulize.tableize.singularize
33
+ end
34
+
35
+ def model_from_entity(type)
36
+ "Elabs::#{type.classify}".constantize
37
+ end
80
38
  end
81
39
  end
@@ -6,10 +6,10 @@ module Elabs
6
6
  options = { param_name => direction }
7
7
  options['sfw_status'] = params['sfw_status'] if params['sfw_status']
8
8
 
9
- icon = direction == :asc ? 'sort-up' : 'sort-down'
9
+ link_icon = determine_sort_icon param_name, direction
10
10
 
11
11
  link_to options, class: 'filter-link' do
12
- icon_text icon, title, ['fw'], true
12
+ icon_text link_icon, content_tag('span', title, class: 'link'), %w[fw icon], true
13
13
  end
14
14
  end
15
15
 
@@ -24,39 +24,23 @@ module Elabs
24
24
  end
25
25
 
26
26
  def sfw_only_link
27
- icon = params['sfw_status'] && params['sfw_status'] == 'sfw_only' ? 'dot-circle' : 'circle'
27
+ link_icon = params['sfw_status'] && params['sfw_status'] == 'sfw_only' ? 'dot-circle' : 'circle'
28
28
  link_to request.params.merge(sfw_status: 'sfw_only'), class: 'filter-link' do
29
- icon_text(icon, _('Only SFW'), ['fw'], true)
29
+ icon_text link_icon, content_tag('span', _('Only SFW'), class: 'link'), %w[fw icon]
30
30
  end
31
31
  end
32
32
 
33
33
  def nsfw_only_link
34
- icon = params['sfw_status'] && params['sfw_status'] == 'nsfw_only' ? 'dot-circle' : 'circle'
34
+ link_icon = params['sfw_status'] && params['sfw_status'] == 'nsfw_only' ? 'dot-circle' : 'circle'
35
35
  link_to request.params.merge(sfw_status: 'nsfw_only'), class: 'filter-link' do
36
- icon_text(icon, _('Only NSFW'), ['fw'], true)
36
+ icon_text link_icon, content_tag('span', _('Only NSFW'), class: 'link'), %w[fw icon]
37
37
  end
38
38
  end
39
39
 
40
40
  def all_sfw_status_link
41
- icon = params['sfw_status'] && %w[sfw_only nsfw_only].include?(params['sfw_status']) ? 'circle' : 'dot-circle'
41
+ link_icon = params['sfw_status'] && %w[sfw_only nsfw_only].include?(params['sfw_status']) ? 'circle' : 'dot-circle'
42
42
  link_to request.params.merge(sfw_status: 'all'), class: 'filter-link' do
43
- icon_text(icon, _('Show all'), ['fw'], true)
44
- end
45
- end
46
-
47
- def with_content_filter_links
48
- out = []
49
-
50
- out.push all_filter_link
51
- out.push with_content_only_filter_link
52
-
53
- raw out.join('')
54
- end
55
-
56
- def with_content_only_filter_link
57
- icon = !params['with_content_only'] || params['with_content_only'] == 'true' ? 'dot-circle' : 'circle'
58
- link_to request.params.merge(with_content_only: 'true'), class: 'filter-link' do
59
- icon_text(icon, _('With content only'), ['fw'], true)
43
+ icon_text link_icon, content_tag('span', _('Show all'), class: 'link'), %w[fw icon]
60
44
  end
61
45
  end
62
46
 
@@ -93,5 +77,14 @@ module Elabs
93
77
  projects
94
78
  uploads].include?(controller_name) && action_name == 'index'
95
79
  end
80
+
81
+ private
82
+
83
+ def determine_sort_icon(field, direction)
84
+ return 'sort-up' if params[field] && direction == :asc
85
+ return 'sort-down' if params[field] && direction == :desc
86
+
87
+ 'minus'
88
+ end
96
89
  end
97
90
  end
@@ -1,45 +1,18 @@
1
1
  module Elabs
2
2
  module ContentHelper
3
- def show_online_link(entity)
4
- options = {
5
- title: _('View online'),
6
- class: 'btn btn--small btn--show'
7
- }
8
- if entity.respond_to?(:publicly_visible?) && !entity.publicly_visible?
9
- options[:disabled] = true
10
- return content_tag 'a', icon('eye', ['fw']), options
11
- end
12
- link_to entity, options do
13
- icon('eye', ['fw'])
14
- end
15
- end
16
-
17
- def namespace_show_link(namespace, singular_model, entity)
18
- link_to send("#{namespace}_#{singular_model}_path", entity),
19
- title: _('View online'),
20
- class: 'btn btn--small btn--show' do
21
- icon('eye', ['fw'])
22
- end
3
+ def show_item?(entity)
4
+ (entity.sfw? || show_nsfw?) && !entity.locked?
23
5
  end
24
6
 
25
- def namespace_edit_link(namespace, singular_model, entity)
26
- link_to send("edit_#{namespace}_#{singular_model}_path", entity),
27
- title: _('Edit'),
28
- class: 'btn btn--small btn--edit' do
29
- icon('pencil-alt', ['fw'])
30
- end
7
+ def user_is_author_of(entity)
8
+ current_user&.id && entity.user_id == current_user.id
31
9
  end
32
10
 
33
- def namespace_destroy_link(namespace, singular_model, entity, confirm = true)
34
- link_params = {
35
- title: _('Destroy'),
36
- method: :delete,
37
- class: 'btn btn--small btn--destroy'
38
- }
39
- link_params[:data] = { confirm: _('Are you sure?') } if confirm
40
- link_to send("#{namespace}_#{singular_model}_path".to_sym, entity), link_params do
41
- icon('trash', ['fw'])
11
+ def first_type_with_content(entity)
12
+ %i[albums articles notes projects uploads].each do |type|
13
+ return type.to_s if entity.respond_to?(type) && entity["#{type}_count"].positive?
42
14
  end
15
+ 'albums'
43
16
  end
44
17
  end
45
18
  end
@@ -1,123 +1,15 @@
1
1
  module Elabs
2
2
  module ContentRendererHelper
3
- SHORT_CODES = {
4
- /\[album:(\d+)\]/ => [:shortcode_album, { size: :inline }],
5
- /\[article:(\d+)\]/ => [:shortcode_article, { size: :inline }],
6
- /\[note:(\d+)\]/ => [:shortcode_note, { size: :inline }],
7
- /\[project:(\d+)\]/ => [:shortcode_project, { size: :inline }],
8
- /\[upload:(\d+)\]/ => [:shortcode_upload, { size: :inline }],
9
- /\[user:(\d+)\]/ => [:shortcode_user, { size: :inline }],
10
- /\[album-card:(\d+)\]/ => [:shortcode_album, { size: :large }],
11
- /\[article-card:(\d+)\]/ => [:shortcode_article, { size: :large }],
12
- /\[note-card:(\d+)\]/ => [:shortcode_note, { size: :large }],
13
- /\[project-card:(\d+)\]/ => [:shortcode_project, { size: :large }],
14
- /\[upload-card:(\d+)\]/ => [:shortcode_upload, { size: :large }],
15
- /\[user-card:(\d+)\]/ => [:shortcode_user, { size: :large }],
16
- %r{\[github-repo:([a-zA-Z0-9\-_]+/[a-zA-Z0-9\-_]+)\]} => [:shortcode_github_repo_inline, { size: :inline }],
17
- %r{\[github-repo-card:([a-zA-Z0-9\-_]+/[a-zA-Z0-9\-_]+)\]} => [:shortcode_github_repo, {}],
18
- /\[github-user-card:([a-zA-Z0-9\-_]+)\]/ => [:shortcode_github_user, {}],
19
- %r{\[gitlab-repo:(https://.*)\]} => [:shortcode_gitlab_repo_inline, { size: :inline }],
20
- %r{\[gitlab-repo-card:(https://.*)\]} => [:shortcode_gitlab_repo, {}],
21
- %r{\[gitlab-user-card:(https://.*)\]} => [:shortcode_gitlab_user, {}],
22
- %r{\[gitlab-group-card:(https://.*)\]} => [:shortcode_gitlab_group, {}]
23
- }.freeze
24
-
25
3
  def markdown(text, reference_entity = nil, show_short_codes = true)
26
- process_short_codes CommonMarker.render_html(text, [:SAFE], [:table]).html_safe,
4
+ return '' if text.nil?
5
+
6
+ process_short_codes CommonMarker.render_html(text, [:DEFAULT], [:table]).html_safe,
27
7
  reference_entity,
28
8
  show_short_codes
29
9
  end
30
10
 
31
11
  def render_entity_content(entity, field, show_short_codes = true)
32
- markdown entity[field], entity, show_short_codes
33
- end
34
-
35
- def process_short_codes(text, original_entity = nil, display = true)
36
- SHORT_CODES.each do |key, method|
37
- text.gsub! key do |match|
38
- if display || (method[1][:size] && method[1][:size] == :inline)
39
- send(method[0], original_entity, match.sub(key, '\1'), method[1])
40
- else
41
- render(partial: 'elabs/layouts/shortcode_open_to_see') unless display
42
- end
43
- end
44
- end
45
- text.html_safe
46
- end
47
-
48
- private
49
-
50
- def shortcode_album(original_entity, id, options = {})
51
- shortcode_content 'album', original_entity, id, options
52
- end
53
-
54
- def shortcode_article(original_entity, id, options = {})
55
- shortcode_content 'article', original_entity, id, options
56
- end
57
-
58
- def shortcode_note(original_entity, id, options = {})
59
- shortcode_content 'note', original_entity, id, options
60
- end
61
-
62
- def shortcode_project(original_entity, id, options = {})
63
- shortcode_content 'project', original_entity, id, options
64
- end
65
-
66
- def shortcode_upload(original_entity, id, options = {})
67
- shortcode_content 'upload', original_entity, id, options
68
- end
69
-
70
- def shortcode_user(original_entity, id, options = {})
71
- shortcode_content 'user', original_entity, id, options
72
- end
73
-
74
- def shortcode_content(type, original_entity, id, options = { size: :large })
75
- model = "Elabs::#{type.classify}".constantize
76
- widget_size = case options[:size]
77
- when :inline
78
- '_inline'
79
- else
80
- ''
81
- end
82
- return render "elabs/layouts/shortcode_infinite_loop#{widget_size}", format: :html if original_entity && original_entity.id == id.to_i && original_entity.class == model
83
-
84
- entity = model.find_by(id: id)
85
- return render "elabs/layouts/shortcode_missing_content#{widget_size}", format: :html unless entity
86
-
87
- render partial: "elabs/#{type.pluralize}/#{type}#{widget_size}", locals: { type.to_sym => entity }, format: :html
88
- end
89
-
90
- def shortcode_github_repo(_original_entity, repo_url, _options = {})
91
- render partial: 'elabs/layouts/widgets/github_repo_card', locals: { repo_url: repo_url }
92
- end
93
-
94
- def shortcode_github_repo_inline(_original_entity, repo_url, _options = {})
95
- url_matches = %r{([a-zA-Z0-9\-_]+)/([a-zA-Z0-9\-_]+)}.match repo_url
96
- render partial: 'elabs/layouts/widgets/github_repo_inline', locals: { url_matches: url_matches }
97
- end
98
-
99
- def shortcode_github_user(_original_entity, user_name, _options = {})
100
- render partial: 'elabs/layouts/widgets/github_user_card', locals: { user_name: user_name }
101
- end
102
-
103
- def shortcode_gitlab_repo(_original_entity, repo_url, _options = {})
104
- url_matches = %r{(?:https://)?([a-z0-9\-_\.]+)/(.+)}.match repo_url
105
- render partial: 'elabs/layouts/widgets/gitlab_repo_card', locals: { url_matches: url_matches }
106
- end
107
-
108
- def shortcode_gitlab_repo_inline(_original_entity, repo_url, _options = {})
109
- url_matches = %r{(.*)/([a-zA-Z0-9\-_]+)/([a-zA-Z0-9\-_]+)}.match repo_url
110
- render partial: 'elabs/layouts/widgets/gitlab_repo_inline', locals: { url_matches: url_matches }
111
- end
112
-
113
- def shortcode_gitlab_user(_original_entity, user_url, _options = {})
114
- url_matches = %r{(?:https://)?([a-z0-9\-_\.]*)/([a-zA-Z0-9\-_]+)}.match user_url
115
- render partial: 'elabs/layouts/widgets/gitlab_user_card', locals: { url_matches: url_matches }
116
- end
117
-
118
- def shortcode_gitlab_group(_original_entity, group_url, _options = {})
119
- url_matches = %r{(?:https://)?([a-z0-9\-_\.]*)/([a-zA-Z0-9\-_]+)}.match group_url
120
- render partial: 'elabs/layouts/widgets/gitlab_group_card', locals: { url_matches: url_matches }
12
+ markdown entity.send(field), entity, show_short_codes
121
13
  end
122
14
  end
123
15
  end