elabs 2.0.0.pre

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 (404) hide show
  1. checksums.yaml +7 -0
  2. data/.eslintrc.yml +26 -0
  3. data/.gitignore +49 -0
  4. data/.gitlab-ci.yml +93 -0
  5. data/.haml-lint.yml +4 -0
  6. data/.node-version +1 -0
  7. data/.rspec +1 -0
  8. data/.rubocop.yml +59 -0
  9. data/.ruby-version +1 -0
  10. data/.simplecov +5 -0
  11. data/.stylelintrc.yml +218 -0
  12. data/CHANGELOG.md +273 -0
  13. data/CODE_OF_CONDUCT.md +78 -0
  14. data/Gemfile +75 -0
  15. data/Gemfile.lock +376 -0
  16. data/LICENSE +21 -0
  17. data/LICENSES.md +6 -0
  18. data/README.md +41 -0
  19. data/ROADMAP.md +61 -0
  20. data/Rakefile +32 -0
  21. data/app/assets/config/elabs_manifest.js +3 -0
  22. data/app/assets/images/elabs/preview_placeholder.png +0 -0
  23. data/app/assets/images/elabs/preview_placeholder_nsfw.png +0 -0
  24. data/app/assets/javascripts/elabs/application.js +27 -0
  25. data/app/assets/javascripts/elabs/helpers-codemirror.js +29 -0
  26. data/app/assets/javascripts/elabs/helpers-markdown.js +42 -0
  27. data/app/assets/javascripts/elabs/helpers.js +17 -0
  28. data/app/assets/javascripts/elabs/modals.js +19 -0
  29. data/app/assets/javascripts/elabs/tabs.js +32 -0
  30. data/app/assets/stylesheets/elabs/_colors.scss +345 -0
  31. data/app/assets/stylesheets/elabs/_icons.scss +9 -0
  32. data/app/assets/stylesheets/elabs/_variables.scss +13 -0
  33. data/app/assets/stylesheets/elabs/app/_acts.scss +58 -0
  34. data/app/assets/stylesheets/elabs/app/_alerts.scss +3 -0
  35. data/app/assets/stylesheets/elabs/app/_buttons.scss +21 -0
  36. data/app/assets/stylesheets/elabs/app/_comments.scss +1 -0
  37. data/app/assets/stylesheets/elabs/app/_content.scss +10 -0
  38. data/app/assets/stylesheets/elabs/app/_content_uploads.scss +39 -0
  39. data/app/assets/stylesheets/elabs/app/_empty.scss +19 -0
  40. data/app/assets/stylesheets/elabs/app/_errors.scss +9 -0
  41. data/app/assets/stylesheets/elabs/app/_filter_links.scss +27 -0
  42. data/app/assets/stylesheets/elabs/app/_forms.scss +69 -0
  43. data/app/assets/stylesheets/elabs/app/_helpers.scss +3 -0
  44. data/app/assets/stylesheets/elabs/app/_languages.scss +6 -0
  45. data/app/assets/stylesheets/elabs/app/_layout.scss +194 -0
  46. data/app/assets/stylesheets/elabs/app/_licenses.scss +6 -0
  47. data/app/assets/stylesheets/elabs/app/_link-to-top.scss +8 -0
  48. data/app/assets/stylesheets/elabs/app/_medias.scss +12 -0
  49. data/app/assets/stylesheets/elabs/app/_modals.scss +53 -0
  50. data/app/assets/stylesheets/elabs/app/_nsfw.scss +5 -0
  51. data/app/assets/stylesheets/elabs/app/_pagination.scss +16 -0
  52. data/app/assets/stylesheets/elabs/app/_tabs.scss +54 -0
  53. data/app/assets/stylesheets/elabs/app/_tags.scss +6 -0
  54. data/app/assets/stylesheets/elabs/app/_toolbars.scss +3 -0
  55. data/app/assets/stylesheets/elabs/app/_users.scss +6 -0
  56. data/app/assets/stylesheets/elabs/app/admin-members/_forms.scss +6 -0
  57. data/app/assets/stylesheets/elabs/app/admin-members/_indexes.scss +70 -0
  58. data/app/assets/stylesheets/elabs/app/admin-members/_layout.scss +17 -0
  59. data/app/assets/stylesheets/elabs/app/areas/_devise.scss +31 -0
  60. data/app/assets/stylesheets/elabs/app/components/_cards.scss +16 -0
  61. data/app/assets/stylesheets/elabs/app/components/_container.scss +4 -0
  62. data/app/assets/stylesheets/elabs/app/mixins/_classifier-card.scss +16 -0
  63. data/app/assets/stylesheets/elabs/app/mixins/_content-card.scss +58 -0
  64. data/app/assets/stylesheets/elabs/app/mixins/_content-full.scss +39 -0
  65. data/app/assets/stylesheets/elabs/app/mixins/_icon.scss +9 -0
  66. data/app/assets/stylesheets/elabs/application.css +14 -0
  67. data/app/assets/stylesheets/elabs/lib/_codemirror.scss +26 -0
  68. data/app/assets/stylesheets/elabs/lib/fontawesome/_fontawesome.scss +38 -0
  69. data/app/assets/stylesheets/elabs/lib/fontawesome/_fonts.scss +42 -0
  70. data/app/assets/stylesheets/elabs/lib/fontawesome/_icons.scss +1118 -0
  71. data/app/assets/stylesheets/elabs/lib/knacss/_knacss-variables.scss +230 -0
  72. data/app/assets/stylesheets/elabs/lib/knacss/_knacss.scss +59 -0
  73. data/app/assets/stylesheets/elabs/style.scss +72 -0
  74. data/app/controllers/elabs/acts_controller.rb +12 -0
  75. data/app/controllers/elabs/admin/admin_application_controller.rb +19 -0
  76. data/app/controllers/elabs/admin/admin_content_application_controller.rb +66 -0
  77. data/app/controllers/elabs/admin/albums_controller.rb +10 -0
  78. data/app/controllers/elabs/admin/articles_controller.rb +10 -0
  79. data/app/controllers/elabs/admin/languages_controller.rb +77 -0
  80. data/app/controllers/elabs/admin/licenses_controller.rb +77 -0
  81. data/app/controllers/elabs/admin/notes_controller.rb +10 -0
  82. data/app/controllers/elabs/admin/projects_controller.rb +10 -0
  83. data/app/controllers/elabs/admin/reports_controller.rb +34 -0
  84. data/app/controllers/elabs/admin/tags_controller.rb +56 -0
  85. data/app/controllers/elabs/admin/uploads_controller.rb +10 -0
  86. data/app/controllers/elabs/admin/users_controller.rb +43 -0
  87. data/app/controllers/elabs/albums_controller.rb +26 -0
  88. data/app/controllers/elabs/articles_controller.rb +25 -0
  89. data/app/controllers/elabs/auth/callbacks_controller.rb +38 -0
  90. data/app/controllers/elabs/auth/confirmations_controller.rb +43 -0
  91. data/app/controllers/elabs/auth/passwords_controller.rb +47 -0
  92. data/app/controllers/elabs/auth/registrations_controller.rb +70 -0
  93. data/app/controllers/elabs/auth/sessions_controller.rb +36 -0
  94. data/app/controllers/elabs/auth/unlocks_controller.rb +38 -0
  95. data/app/controllers/elabs/concerns/elabs_controller.rb +18 -0
  96. data/app/controllers/elabs/concerns/localizable.rb +11 -0
  97. data/app/controllers/elabs/concerns/reportable.rb +17 -0
  98. data/app/controllers/elabs/content_application_controller.rb +45 -0
  99. data/app/controllers/elabs/elabs_application_controller.rb +95 -0
  100. data/app/controllers/elabs/languages_controller.rb +36 -0
  101. data/app/controllers/elabs/licenses_controller.rb +31 -0
  102. data/app/controllers/elabs/member/albums_controller.rb +11 -0
  103. data/app/controllers/elabs/member/articles_controller.rb +11 -0
  104. data/app/controllers/elabs/member/member_application_controller.rb +12 -0
  105. data/app/controllers/elabs/member/member_content_application_controller.rb +128 -0
  106. data/app/controllers/elabs/member/notes_controller.rb +11 -0
  107. data/app/controllers/elabs/member/preferences_controller.rb +36 -0
  108. data/app/controllers/elabs/member/projects_controller.rb +11 -0
  109. data/app/controllers/elabs/member/uploads_controller.rb +11 -0
  110. data/app/controllers/elabs/member/users_controller.rb +28 -0
  111. data/app/controllers/elabs/notes_controller.rb +25 -0
  112. data/app/controllers/elabs/projects_controller.rb +30 -0
  113. data/app/controllers/elabs/reports_controller.rb +36 -0
  114. data/app/controllers/elabs/tags_controller.rb +36 -0
  115. data/app/controllers/elabs/uploads_controller.rb +24 -0
  116. data/app/controllers/elabs/users_controller.rb +36 -0
  117. data/app/helpers/elabs/acts_helper.rb +22 -0
  118. data/app/helpers/elabs/admin_content_helper.rb +54 -0
  119. data/app/helpers/elabs/application_helper.rb +54 -0
  120. data/app/helpers/elabs/content_filters_helper.rb +97 -0
  121. data/app/helpers/elabs/content_renderer_helper.rb +13 -0
  122. data/app/helpers/elabs/member_content_helper.rb +47 -0
  123. data/app/helpers/elabs/thumbnails_helper.rb +28 -0
  124. data/app/helpers/elabs/time_helper.rb +19 -0
  125. data/app/helpers/elabs/uploads_helper.rb +19 -0
  126. data/app/jobs/elabs/application_job.rb +4 -0
  127. data/app/mailers/elabs/application_mailer.rb +6 -0
  128. data/app/models/elabs/act.rb +7 -0
  129. data/app/models/elabs/album.rb +24 -0
  130. data/app/models/elabs/albums_tag.rb +21 -0
  131. data/app/models/elabs/albums_upload.rb +21 -0
  132. data/app/models/elabs/application_content_record.rb +10 -0
  133. data/app/models/elabs/application_record.rb +5 -0
  134. data/app/models/elabs/article.rb +23 -0
  135. data/app/models/elabs/articles_tag.rb +21 -0
  136. data/app/models/elabs/comment.rb +12 -0
  137. data/app/models/elabs/concerns/actable_entity.rb +52 -0
  138. data/app/models/elabs/concerns/content_entity.rb +70 -0
  139. data/app/models/elabs/concerns/countable_entity.rb +81 -0
  140. data/app/models/elabs/concerns/taggable.rb +33 -0
  141. data/app/models/elabs/language.rb +17 -0
  142. data/app/models/elabs/license.rb +15 -0
  143. data/app/models/elabs/note.rb +21 -0
  144. data/app/models/elabs/notes_tag.rb +21 -0
  145. data/app/models/elabs/preference.rb +9 -0
  146. data/app/models/elabs/project.rb +25 -0
  147. data/app/models/elabs/projects_album.rb +21 -0
  148. data/app/models/elabs/projects_article.rb +21 -0
  149. data/app/models/elabs/projects_note.rb +21 -0
  150. data/app/models/elabs/projects_tag.rb +21 -0
  151. data/app/models/elabs/projects_upload.rb +21 -0
  152. data/app/models/elabs/report.rb +11 -0
  153. data/app/models/elabs/tag.rb +18 -0
  154. data/app/models/elabs/upload.rb +28 -0
  155. data/app/models/elabs/uploads_tag.rb +21 -0
  156. data/app/models/elabs/user.rb +30 -0
  157. data/app/validators/elabs/associated_author_validator.rb +11 -0
  158. data/app/views/elabs/acts/_act.json.jbuilder +2 -0
  159. data/app/views/elabs/acts/_filters.html.haml +3 -0
  160. data/app/views/elabs/acts/index.html.haml +27 -0
  161. data/app/views/elabs/acts/index.json.jbuilder +1 -0
  162. data/app/views/elabs/admin/albums/_album.json.jbuilder +2 -0
  163. data/app/views/elabs/admin/albums/index.html.haml +43 -0
  164. data/app/views/elabs/admin/albums/index.json.jbuilder +1 -0
  165. data/app/views/elabs/admin/articles/_article.json.jbuilder +2 -0
  166. data/app/views/elabs/admin/articles/index.html.haml +41 -0
  167. data/app/views/elabs/admin/articles/index.json.jbuilder +1 -0
  168. data/app/views/elabs/admin/languages/_form.html.haml +18 -0
  169. data/app/views/elabs/admin/languages/_language.json.jbuilder +2 -0
  170. data/app/views/elabs/admin/languages/edit.html.haml +6 -0
  171. data/app/views/elabs/admin/languages/index.html.haml +34 -0
  172. data/app/views/elabs/admin/languages/index.json.jbuilder +1 -0
  173. data/app/views/elabs/admin/languages/new.html.haml +3 -0
  174. data/app/views/elabs/admin/licenses/_form.html.haml +25 -0
  175. data/app/views/elabs/admin/licenses/_license.json.jbuilder +2 -0
  176. data/app/views/elabs/admin/licenses/edit.html.haml +6 -0
  177. data/app/views/elabs/admin/licenses/index.html.haml +42 -0
  178. data/app/views/elabs/admin/licenses/index.json.jbuilder +1 -0
  179. data/app/views/elabs/admin/licenses/new.html.haml +3 -0
  180. data/app/views/elabs/admin/notes/_note.json.jbuilder +2 -0
  181. data/app/views/elabs/admin/notes/index.html.haml +40 -0
  182. data/app/views/elabs/admin/notes/index.json.jbuilder +1 -0
  183. data/app/views/elabs/admin/projects/_project.json.jbuilder +2 -0
  184. data/app/views/elabs/admin/projects/index.html.haml +45 -0
  185. data/app/views/elabs/admin/projects/index.json.jbuilder +1 -0
  186. data/app/views/elabs/admin/reports/index.html.haml +27 -0
  187. data/app/views/elabs/admin/reports/index.json.jbuilder +1 -0
  188. data/app/views/elabs/admin/tags/_form.html.haml +17 -0
  189. data/app/views/elabs/admin/tags/_tag.json.jbuilder +2 -0
  190. data/app/views/elabs/admin/tags/edit.html.haml +6 -0
  191. data/app/views/elabs/admin/tags/index.html.haml +27 -0
  192. data/app/views/elabs/admin/tags/index.json.jbuilder +1 -0
  193. data/app/views/elabs/admin/uploads/_upload.json.jbuilder +2 -0
  194. data/app/views/elabs/admin/uploads/index.html.haml +45 -0
  195. data/app/views/elabs/admin/uploads/index.json.jbuilder +1 -0
  196. data/app/views/elabs/admin/users/_admin_user.json.jbuilder +2 -0
  197. data/app/views/elabs/admin/users/index.html.haml +33 -0
  198. data/app/views/elabs/admin/users/index.json.jbuilder +1 -0
  199. data/app/views/elabs/admin/users/show.html.haml +26 -0
  200. data/app/views/elabs/admin/users/show.json.jbuilder +1 -0
  201. data/app/views/elabs/albums/_album.html.haml +38 -0
  202. data/app/views/elabs/albums/_album.json.jbuilder +2 -0
  203. data/app/views/elabs/albums/_filters.html.haml +8 -0
  204. data/app/views/elabs/albums/index.html.haml +9 -0
  205. data/app/views/elabs/albums/index.json.jbuilder +1 -0
  206. data/app/views/elabs/albums/show.html.haml +60 -0
  207. data/app/views/elabs/albums/show.json.jbuilder +1 -0
  208. data/app/views/elabs/articles/_article.html.haml +30 -0
  209. data/app/views/elabs/articles/_article.json.jbuilder +2 -0
  210. data/app/views/elabs/articles/_filters.html.haml +8 -0
  211. data/app/views/elabs/articles/index.html.haml +9 -0
  212. data/app/views/elabs/articles/index.json.jbuilder +1 -0
  213. data/app/views/elabs/articles/show.html.haml +45 -0
  214. data/app/views/elabs/articles/show.json.jbuilder +1 -0
  215. data/app/views/elabs/auth/confirmations/new.html.haml +26 -0
  216. data/app/views/elabs/auth/passwords/edit.html.haml +31 -0
  217. data/app/views/elabs/auth/passwords/new.html.haml +23 -0
  218. data/app/views/elabs/auth/registrations/edit.html.haml +48 -0
  219. data/app/views/elabs/auth/registrations/new.html.haml +34 -0
  220. data/app/views/elabs/auth/sessions/_new.html.haml +15 -0
  221. data/app/views/elabs/auth/sessions/new.html.haml +8 -0
  222. data/app/views/elabs/auth/shared/_links.html.haml +16 -0
  223. data/app/views/elabs/auth/unlocks/new.html.haml +23 -0
  224. data/app/views/elabs/comments/_comment.json.jbuilder +2 -0
  225. data/app/views/elabs/comments/_comments.html.haml +21 -0
  226. data/app/views/elabs/comments/_form.html.haml +31 -0
  227. data/app/views/elabs/languages/_associations.html.haml +51 -0
  228. data/app/views/elabs/languages/_filters.html.haml +6 -0
  229. data/app/views/elabs/languages/_language.json.jbuilder +2 -0
  230. data/app/views/elabs/languages/index.html.haml +33 -0
  231. data/app/views/elabs/languages/index.json.jbuilder +1 -0
  232. data/app/views/elabs/languages/show.html.haml +38 -0
  233. data/app/views/elabs/languages/show.json.jbuilder +1 -0
  234. data/app/views/elabs/layouts/_empty.html.haml +3 -0
  235. data/app/views/elabs/layouts/_footer.html.haml +6 -0
  236. data/app/views/elabs/layouts/_hidden_entry.html.haml +6 -0
  237. data/app/views/elabs/layouts/_hidden_entry_full.html.haml +6 -0
  238. data/app/views/elabs/layouts/_language_menu.html.haml +2 -0
  239. data/app/views/elabs/layouts/_menu.html.haml +72 -0
  240. data/app/views/elabs/layouts/admin_application.html.haml +21 -0
  241. data/app/views/elabs/layouts/application.html.haml +37 -0
  242. data/app/views/elabs/layouts/lists/_albums.html.haml +10 -0
  243. data/app/views/elabs/layouts/lists/_projects.html.haml +10 -0
  244. data/app/views/elabs/layouts/lists/_tags.html.haml +9 -0
  245. data/app/views/elabs/layouts/mailer.html.haml +8 -0
  246. data/app/views/elabs/layouts/mailer.text.haml +1 -0
  247. data/app/views/elabs/layouts/member_application.html.haml +21 -0
  248. data/app/views/elabs/licenses/_associations.html.haml +51 -0
  249. data/app/views/elabs/licenses/_filters.html.haml +3 -0
  250. data/app/views/elabs/licenses/_license.json.jbuilder +2 -0
  251. data/app/views/elabs/licenses/index.html.haml +27 -0
  252. data/app/views/elabs/licenses/index.json.jbuilder +1 -0
  253. data/app/views/elabs/licenses/show.html.haml +44 -0
  254. data/app/views/elabs/licenses/show.json.jbuilder +1 -0
  255. data/app/views/elabs/member/albums/_album.json.jbuilder +2 -0
  256. data/app/views/elabs/member/albums/_form.html.haml +64 -0
  257. data/app/views/elabs/member/albums/edit.html.haml +6 -0
  258. data/app/views/elabs/member/albums/index.html.haml +49 -0
  259. data/app/views/elabs/member/albums/index.json.jbuilder +1 -0
  260. data/app/views/elabs/member/albums/new.html.haml +3 -0
  261. data/app/views/elabs/member/articles/_article.json.jbuilder +2 -0
  262. data/app/views/elabs/member/articles/_form.html.haml +70 -0
  263. data/app/views/elabs/member/articles/edit.html.haml +6 -0
  264. data/app/views/elabs/member/articles/index.html.haml +47 -0
  265. data/app/views/elabs/member/articles/index.json.jbuilder +1 -0
  266. data/app/views/elabs/member/articles/new.html.haml +3 -0
  267. data/app/views/elabs/member/layouts/_empty.html.haml +4 -0
  268. data/app/views/elabs/member/layouts/_markdown-preview.html.haml +8 -0
  269. data/app/views/elabs/member/notes/_form.html.haml +54 -0
  270. data/app/views/elabs/member/notes/_note.json.jbuilder +2 -0
  271. data/app/views/elabs/member/notes/edit.html.haml +6 -0
  272. data/app/views/elabs/member/notes/index.html.haml +47 -0
  273. data/app/views/elabs/member/notes/index.json.jbuilder +1 -0
  274. data/app/views/elabs/member/notes/new.html.haml +3 -0
  275. data/app/views/elabs/member/preferences/_form.html.haml +20 -0
  276. data/app/views/elabs/member/preferences/edit.html.haml +3 -0
  277. data/app/views/elabs/member/projects/_form.html.haml +71 -0
  278. data/app/views/elabs/member/projects/_project.json.jbuilder +2 -0
  279. data/app/views/elabs/member/projects/edit.html.haml +6 -0
  280. data/app/views/elabs/member/projects/index.html.haml +53 -0
  281. data/app/views/elabs/member/projects/index.json.jbuilder +1 -0
  282. data/app/views/elabs/member/projects/new.html.haml +3 -0
  283. data/app/views/elabs/member/uploads/_form.html.haml +67 -0
  284. data/app/views/elabs/member/uploads/_upload.json.jbuilder +2 -0
  285. data/app/views/elabs/member/uploads/edit.html.haml +6 -0
  286. data/app/views/elabs/member/uploads/index.html.haml +61 -0
  287. data/app/views/elabs/member/uploads/index.json.jbuilder +1 -0
  288. data/app/views/elabs/member/uploads/new.html.haml +3 -0
  289. data/app/views/elabs/member/users/_form.html.haml +38 -0
  290. data/app/views/elabs/notes/_filters.html.haml +7 -0
  291. data/app/views/elabs/notes/_note.html.haml +31 -0
  292. data/app/views/elabs/notes/_note.json.jbuilder +2 -0
  293. data/app/views/elabs/notes/index.html.haml +9 -0
  294. data/app/views/elabs/notes/index.json.jbuilder +1 -0
  295. data/app/views/elabs/notes/show.html.haml +44 -0
  296. data/app/views/elabs/notes/show.json.jbuilder +1 -0
  297. data/app/views/elabs/projects/_associations.html.haml +46 -0
  298. data/app/views/elabs/projects/_filters.html.haml +8 -0
  299. data/app/views/elabs/projects/_project.html.haml +29 -0
  300. data/app/views/elabs/projects/index.html.haml +9 -0
  301. data/app/views/elabs/projects/index.json.jbuilder +1 -0
  302. data/app/views/elabs/projects/show.html.haml +71 -0
  303. data/app/views/elabs/projects/show.json.jbuilder +1 -0
  304. data/app/views/elabs/reports/_form.html.haml +29 -0
  305. data/app/views/elabs/tags/_associations.html.haml +51 -0
  306. data/app/views/elabs/tags/_filters.html.haml +3 -0
  307. data/app/views/elabs/tags/_tag.json.jbuilder +2 -0
  308. data/app/views/elabs/tags/index.html.haml +26 -0
  309. data/app/views/elabs/tags/index.json.jbuilder +1 -0
  310. data/app/views/elabs/tags/show.html.haml +34 -0
  311. data/app/views/elabs/tags/show.json.jbuilder +1 -0
  312. data/app/views/elabs/uploads/_filters.html.haml +7 -0
  313. data/app/views/elabs/uploads/_player.html.haml +10 -0
  314. data/app/views/elabs/uploads/_preview.html.haml +17 -0
  315. data/app/views/elabs/uploads/_upload.html.haml +41 -0
  316. data/app/views/elabs/uploads/_upload.json.jbuilder +2 -0
  317. data/app/views/elabs/uploads/index.html.haml +9 -0
  318. data/app/views/elabs/uploads/index.json.jbuilder +1 -0
  319. data/app/views/elabs/uploads/show.html.haml +58 -0
  320. data/app/views/elabs/uploads/show.json.jbuilder +1 -0
  321. data/app/views/elabs/users/_associations.html.haml +51 -0
  322. data/app/views/elabs/users/_filters.html.haml +4 -0
  323. data/app/views/elabs/users/_user.html.haml +31 -0
  324. data/app/views/elabs/users/_user.json.jbuilder +2 -0
  325. data/app/views/elabs/users/index.html.haml +7 -0
  326. data/app/views/elabs/users/index.json.jbuilder +1 -0
  327. data/app/views/elabs/users/show.html.haml +48 -0
  328. data/app/views/elabs/users/show.json.jbuilder +1 -0
  329. data/bin/rails +14 -0
  330. data/config.ru +5 -0
  331. data/config/brakeman.ignore +124 -0
  332. data/config/brakeman.yml +3 -0
  333. data/config/cucumber.yml +9 -0
  334. data/config/routes.rb +116 -0
  335. data/db/migrate/20180813000000_devise_update_users.rb +15 -0
  336. data/db/migrate/20180813000001_create_languages.rb +16 -0
  337. data/db/migrate/20180813000002_create_tags.rb +14 -0
  338. data/db/migrate/20180813000004_create_licenses.rb +17 -0
  339. data/db/migrate/20180813000005_create_reports.rb +15 -0
  340. data/db/migrate/20180813000006_create_comments.rb +15 -0
  341. data/db/migrate/20180813000007_create_acts.rb +10 -0
  342. data/db/migrate/20180813000008_create_preferences.rb +13 -0
  343. data/db/migrate/20180813000009_create_active_storage_tables.active_storage.rb +26 -0
  344. data/db/migrate/20180813000010_create_albums.rb +23 -0
  345. data/db/migrate/20180813000011_create_articles.rb +23 -0
  346. data/db/migrate/20180813000012_create_notes.rb +21 -0
  347. data/db/migrate/20180813000013_create_uploads.rb +26 -0
  348. data/db/migrate/20180813000014_create_projects.rb +44 -0
  349. data/db/seeds.rb +10 -0
  350. data/db/seeds_development.rb +21 -0
  351. data/db/seeds_production.rb +0 -0
  352. data/docs/contributing.md +52 -0
  353. data/docs/cucumber_terms.md +9 -0
  354. data/docs/migrating.md +4 -0
  355. data/docs/overriding.md +20 -0
  356. data/docs/setup.md +136 -0
  357. data/docs/tips.md +13 -0
  358. data/elabs.gemspec +25 -0
  359. data/lib/assets/javascripts/README-highlight.js.md +39 -0
  360. data/lib/assets/javascripts/codemirror-5.39.2/addon/mode/overlay.js +90 -0
  361. data/lib/assets/javascripts/codemirror-5.39.2/lib/codemirror.js +9684 -0
  362. data/lib/assets/javascripts/codemirror-5.39.2/mode/clike/clike.js +834 -0
  363. data/lib/assets/javascripts/codemirror-5.39.2/mode/css/css.js +832 -0
  364. data/lib/assets/javascripts/codemirror-5.39.2/mode/gfm/gfm.js +129 -0
  365. data/lib/assets/javascripts/codemirror-5.39.2/mode/htmlmixed/htmlmixed.js +152 -0
  366. data/lib/assets/javascripts/codemirror-5.39.2/mode/javascript/javascript.js +896 -0
  367. data/lib/assets/javascripts/codemirror-5.39.2/mode/markdown/markdown.js +882 -0
  368. data/lib/assets/javascripts/codemirror-5.39.2/mode/meta.js +217 -0
  369. data/lib/assets/javascripts/codemirror-5.39.2/mode/xml/xml.js +402 -0
  370. data/lib/assets/javascripts/highlight.js-9.12.0/highlight.pack.js +2 -0
  371. data/lib/assets/javascripts/markdown-it-8.4.2.min.js +1 -0
  372. data/lib/assets/stylesheets/codemirror-5.39.2/lib/codemirror.css +346 -0
  373. data/lib/assets/stylesheets/codemirror-5.39.2/theme/base16-dark.css +38 -0
  374. data/lib/assets/stylesheets/codemirror-5.39.2/theme/base16-light.css +38 -0
  375. data/lib/assets/stylesheets/highlight.js-9.12.0/styles/atelier-sulphurpool-light.css +69 -0
  376. data/lib/elabs.rb +41 -0
  377. data/lib/elabs/engine.rb +5 -0
  378. data/lib/elabs/version.rb +3 -0
  379. data/lib/generators/elabs/assets_generator.rb +36 -0
  380. data/lib/generators/elabs/devise_views_generator.rb +24 -0
  381. data/lib/generators/elabs/install_generator.rb +26 -0
  382. data/lib/generators/elabs/required_assets_generator.rb +26 -0
  383. data/lib/generators/elabs/views_generator.rb +25 -0
  384. data/lib/generators/templates/elabs.rb +25 -0
  385. data/lib/generators/templates/fast_gettext.rb +3 -0
  386. data/lib/tasks/.keep +0 -0
  387. data/lib/tasks/cucumber.rake +75 -0
  388. data/lib/tasks/elabs_tasks.rake +4 -0
  389. data/lib/tasks/factory_bot.rake +14 -0
  390. data/lib/tasks/wipe.rake +31 -0
  391. data/locale/app.pot +1124 -0
  392. data/locale/devise_strings.rb +88 -0
  393. data/locale/en/app.edit.po +1123 -0
  394. data/locale/en/app.po +1123 -0
  395. data/locale/en/app.po.time_stamp +0 -0
  396. data/locale/fr/app.edit.po +1126 -0
  397. data/locale/fr/app.po +1125 -0
  398. data/locale/fr/app.po.time_stamp +0 -0
  399. data/locale/model_attributes.rb +85 -0
  400. data/package.json +22 -0
  401. data/script/cucumber +10 -0
  402. data/tmp/pids/.keep +0 -0
  403. data/yarn.lock +2759 -0
  404. metadata +463 -0
@@ -0,0 +1,11 @@
1
+ module Elabs
2
+ module Member
3
+ class AlbumsController < MemberContentApplicationController
4
+ ALLOWED_FIELDS = %i[name description sfw published hidden_in_history language_id license_id tags_list].freeze
5
+ ALLOWED_RELATIONS = { project_ids: [], upload_ids: [] }.freeze
6
+ MODEL = Album
7
+ PLURAL_NAME = 'albums'.freeze
8
+ SINGULAR_NAME = 'album'.freeze
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Elabs
2
+ module Member
3
+ class ArticlesController < MemberContentApplicationController
4
+ ALLOWED_FIELDS = %i[title excerpt content sfw published published_at hidden_in_history license_id language_id tags_list].freeze
5
+ ALLOWED_RELATIONS = { project_ids: [] }.freeze
6
+ MODEL = Article
7
+ PLURAL_NAME = 'articles'.freeze
8
+ SINGULAR_NAME = 'article'.freeze
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ module Elabs
2
+ module Member
3
+ class MemberApplicationController < ElabsApplicationController
4
+ DEFAULT_ORDER_FIELD = 'id'.freeze
5
+ MAX_ITEMS_PER_PAGE = Elabs.max_members_items_per_page
6
+
7
+ before_action :authenticate_user!
8
+
9
+ layout 'elabs/layouts/member_application'
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,128 @@
1
+ module Elabs
2
+ module Member
3
+ class MemberContentApplicationController < MemberApplicationController
4
+ ALLOWED_FIELDS = [].freeze
5
+ ALLOWED_RELATIONS = {}.freeze
6
+ DEFAULT_ORDER_FIELD = 'updated_at'.freeze
7
+ MODEL = nil
8
+ PLURAL_NAME = nil
9
+ SINGULAR_NAME = nil
10
+
11
+ before_action :set_entity, only: %i[edit update destroy toggle_publication]
12
+
13
+ # GET /articles
14
+ # GET /articles.json
15
+ # rubocop: disable Metrics/AbcSize
16
+ def index
17
+ order = params['order_by'] || self.class::DEFAULT_ORDER_FIELD
18
+ direction = params['direction'] || 'desc'
19
+ create_instance_variable self.class::PLURAL_NAME, self.class::MODEL.by_member(current_user.id).order(order => direction).page(params[:page]).per(self.class::MAX_ITEMS_PER_PAGE)
20
+ end
21
+ # rubocop: enable Metrics/AbcSize
22
+
23
+ # GET /articles/new
24
+ def new
25
+ create_instance_variable self.class::SINGULAR_NAME, self.class::MODEL.new
26
+ end
27
+
28
+ # GET /articles/1/edit
29
+ def edit; end
30
+
31
+ # POST /articles
32
+ # POST /articles.json
33
+ # rubocop: disable Metrics/AbcSize
34
+ def create
35
+ build_entity
36
+
37
+ respond_to do |format|
38
+ if @entity.save entity_params
39
+ format.html { redirect_to_index_with_notice :notice, format(_('%<model_name>s was successfully created.'), model_name: self.class::SINGULAR_NAME.capitalize) }
40
+ format.json { render "member/#{self.class::PLURAL_NAME}/#{self.class::SINGULAR_NAME}", status: :created }
41
+ else
42
+ format.html { render :new }
43
+ format.json { render json: @entity.errors, status: :unprocessable_entity }
44
+ end
45
+ end
46
+ end
47
+ # rubocop: enable Metrics/AbcSize
48
+
49
+ # PATCH/PUT /articles/1
50
+ # PATCH/PUT /articles/1.json
51
+ # rubocop: disable Metrics/AbcSize
52
+ def update
53
+ respond_to do |format|
54
+ if @entity.update entity_params
55
+ format.html { redirect_to_index_with_notice :notice, format(_('%<model_name>s was successfully updated.'), model_name: self.class::SINGULAR_NAME.capitalize) }
56
+ format.json { render "member/#{self.class::PLURAL_NAME}/#{self.class::SINGULAR_NAME}", status: :ok }
57
+ else
58
+ format.html { render :edit }
59
+ format.json { render json: @entity.errors, status: :unprocessable_entity }
60
+ end
61
+ end
62
+ end
63
+ # rubocop: enable Metrics/AbcSize
64
+
65
+ # DELETE /articles/1
66
+ # DELETE /articles/1.json
67
+ def destroy
68
+ @entity.destroy
69
+ respond_to do |format|
70
+ format.html { redirect_to index_url, notice: format(_('%<model_name>s was successfully destroyed.'), model_name: self.class::SINGULAR_NAME.capitalize) }
71
+ format.json { head :no_content }
72
+ end
73
+ end
74
+
75
+ # PUT /<entity>/1/toggle_publication
76
+ def toggle_publication
77
+ if @entity.toggle(:published).save
78
+ respond_to do |format|
79
+ format.html { redirect_to_index_with_notice :notice, publication_message(@entity) }
80
+ format.json { render :show, status: :ok }
81
+ end
82
+ else
83
+ respond_to do |format|
84
+ format.html { redirect_to_index_with_notice :error, 'An error prevented to update this entity' }
85
+ format.json { render json: @entity.errors, status: :unprocessable_entity }
86
+ end
87
+ end
88
+ end
89
+
90
+ private
91
+
92
+ # Use callbacks to share common setup or constraints between actions.
93
+ def set_entity
94
+ id = params[:id] || params["#{self.class::SINGULAR_NAME}_id"]
95
+ @entity = self.class::MODEL.by_member(current_user.id).find(id)
96
+ create_instance_variable self.class::SINGULAR_NAME
97
+ end
98
+
99
+ def build_entity
100
+ @entity = self.class::MODEL.new(entity_params)
101
+ @entity.user = current_user
102
+ create_instance_variable self.class::SINGULAR_NAME
103
+ end
104
+
105
+ def index_url
106
+ "member_#{self.class::PLURAL_NAME}".to_sym
107
+ end
108
+
109
+ def redirect_to_index_with_notice(type, notice)
110
+ redirect_to "member_#{self.class::PLURAL_NAME}".to_sym, "#{type}": notice
111
+ end
112
+
113
+ def publication_message(entity)
114
+ message = if entity.published?
115
+ _('%<model_name>s was successfully published.')
116
+ else
117
+ _('%<model_name>s was successfully removed from publication.')
118
+ end
119
+ format(message, model_name: self.class::SINGULAR_NAME.capitalize)
120
+ end
121
+
122
+ # Never trust parameters from the scary internet, only allow the white list through.
123
+ def entity_params
124
+ params.require(self.class::SINGULAR_NAME.to_sym).permit(self.class::ALLOWED_FIELDS, self.class::ALLOWED_RELATIONS)
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,11 @@
1
+ module Elabs
2
+ module Member
3
+ class NotesController < MemberContentApplicationController
4
+ ALLOWED_FIELDS = %i[content sfw hidden_in_history published license_id language_id tags_list].freeze
5
+ ALLOWED_RELATIONS = { project_ids: [] }.freeze
6
+ MODEL = Note
7
+ PLURAL_NAME = 'notes'.freeze
8
+ SINGULAR_NAME = 'note'.freeze
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,36 @@
1
+ module Elabs
2
+ module Member
3
+ class PreferencesController < MemberApplicationController
4
+ before_action :set_preference, only: %i[edit update]
5
+
6
+ # GET /preferences/edit
7
+ def edit; end
8
+
9
+ # PATCH/PUT /preferences
10
+ # PATCH/PUT /preferences
11
+ def update
12
+ respond_to do |format|
13
+ if @preference.update(preference_params)
14
+ format.html { redirect_to member_edit_preferences_url, notice: _('Preference was successfully updated.') }
15
+ format.json { render :show, status: :ok, location: @preference }
16
+ else
17
+ format.html { render :edit }
18
+ format.json { render json: @preference.errors, status: :unprocessable_entity }
19
+ end
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ # Use callbacks to share common setup or constraints between actions.
26
+ def set_preference
27
+ @preference = current_user.preference
28
+ end
29
+
30
+ # Never trust parameters from the scary internet, only allow the white list through.
31
+ def preference_params
32
+ params.require(:preference).permit(:show_nsfw, :locale)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,11 @@
1
+ module Elabs
2
+ module Member
3
+ class ProjectsController < MemberContentApplicationController
4
+ ALLOWED_FIELDS = %i[name short_description description main_url sfw published hidden_in_history license_id language_id tags_list].freeze
5
+ ALLOWED_RELATIONS = {}.freeze
6
+ MODEL = Project
7
+ PLURAL_NAME = 'projects'.freeze
8
+ SINGULAR_NAME = 'project'.freeze
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Elabs
2
+ module Member
3
+ class UploadsController < MemberContentApplicationController
4
+ ALLOWED_FIELDS = %i[title description sfw published hidden_in_history language_id license_id file tags_list].freeze
5
+ ALLOWED_RELATIONS = { album_ids: [], project_ids: [] }.freeze
6
+ MODEL = Upload
7
+ PLURAL_NAME = 'uploads'.freeze
8
+ SINGULAR_NAME = 'upload'.freeze
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,28 @@
1
+ module Elabs
2
+ module Member
3
+ class UsersController < ElabsApplicationController
4
+ before_action :set_user, only: [:update]
5
+
6
+ # PATCH/PUT /member/users/1
7
+ def update
8
+ if @user.update(user_params)
9
+ redirect_to @user, notice: _('Your infos were successfully saved')
10
+ else
11
+ render edit_user_registration_path
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ # Use callbacks to share common setup or constraints between actions.
18
+ def set_user
19
+ @user = current_user
20
+ end
21
+
22
+ # Only allow a trusted parameter "white list" through.
23
+ def user_params
24
+ params.require(:user).permit(:real_name, :biography)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,25 @@
1
+ module Elabs
2
+ class NotesController < ContentApplicationController
3
+ ALLOWED_NESTED_FROM = %w[language license tag user project].freeze
4
+ ALLOWED_ORDER_FROM = %w[published_at updated_at].freeze
5
+
6
+ before_action :set_note, only: %i[show]
7
+
8
+ # GET /notes
9
+ # GET /notes.json
10
+ def index
11
+ @notes = scope_request(Note.published).page(params[:page]).per(self.class::MAX_ITEMS_PER_PAGE)
12
+ end
13
+
14
+ # GET /notes/1
15
+ # GET /notes/1.json
16
+ def show; end
17
+
18
+ private
19
+
20
+ # Use callbacks to share common setup or constraints between actions.
21
+ def set_note
22
+ @note = Note.find_publicly_visible(params[:id])
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,30 @@
1
+ module Elabs
2
+ class ProjectsController < ContentApplicationController
3
+ ALLOWED_NESTED_FROM = %w[language license tag user].freeze
4
+ ALLOWED_ORDER_FROM = %w[name published_at updated_at].freeze
5
+
6
+ before_action :set_project, only: %i[show]
7
+
8
+ # GET /projects
9
+ # GET /projects.json
10
+ def index
11
+ @projects = scope_request(Project.published).page(params[:page]).per(self.class::MAX_ITEMS_PER_PAGE)
12
+ end
13
+
14
+ # GET /projects/1
15
+ # GET /projects/1.json
16
+ def show
17
+ @project_albums = @project.albums.for_relation
18
+ @project_articles = @project.articles.for_relation
19
+ @project_notes = @project.notes.for_relation
20
+ @project_uploads = @project.uploads.for_relation
21
+ end
22
+
23
+ private
24
+
25
+ # Use callbacks to share common setup or constraints between actions.
26
+ def set_project
27
+ @project = Project.find_publicly_visible(params[:id])
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,36 @@
1
+ module Elabs
2
+ class ReportsController < ElabsApplicationController
3
+ # POST /reports
4
+ # POST /reports.json
5
+ # rubocop:disable Metrics/AbcSize
6
+ def create
7
+ report = complete_report_with_user
8
+
9
+ respond_to do |format|
10
+ if report.save
11
+ format.html { redirect_to request.referer, notice: _('Report was successfully created.') }
12
+ format.json { render json: { message: 'ok' }, status: :created, location: report }
13
+ else
14
+ format.html { redirect_to request.referer, notice: { error: report.errors } }
15
+ format.json { render json: report.errors, status: :unprocessable_entity }
16
+ end
17
+ end
18
+ end
19
+ # rubocop:enable Metrics/AbcSize
20
+
21
+ private
22
+
23
+ # Never trust parameters from the scary internet, only allow the white list through.
24
+ def report_params
25
+ params.require(:report).permit(:name, :email, :reason, :allow_contact)
26
+ end
27
+
28
+ def complete_report_with_user
29
+ report = Report.new(report_params)
30
+ report.url = request.referer
31
+ report.user = current_user if user_signed_in?
32
+
33
+ report
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ module Elabs
2
+ class TagsController < ElabsApplicationController
3
+ ALLOWED_ORDER_FROM = %w[name].freeze
4
+ DEFAULT_ORDER = { name: :desc }.freeze
5
+
6
+ before_action :set_tag, only: %i[show]
7
+
8
+ # GET /tags
9
+ # GET /tags.json
10
+ def index
11
+ @tags = Tag.all
12
+ end
13
+
14
+ # GET /tags/1
15
+ # GET /tags/1.json
16
+ def show
17
+ @tag_albums = @tag.albums.for_relation
18
+ @tag_articles = @tag.articles.for_relation
19
+ @tag_notes = @tag.notes.for_relation
20
+ @tag_projects = @tag.projects.for_relation
21
+ @tag_uploads = @tag.uploads.for_relation
22
+ end
23
+
24
+ private
25
+
26
+ # Use callbacks to share common setup or constraints between actions.
27
+ def set_tag
28
+ @tag = Tag.find(params[:id])
29
+ end
30
+
31
+ # Never trust parameters from the scary internet, only allow the white list through.
32
+ def tag_params
33
+ params.require(:tag).permit(:name)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,24 @@
1
+ module Elabs
2
+ class UploadsController < ContentApplicationController
3
+ ALLOWED_NESTED_FROM = %w[language license tag user album project].freeze
4
+ ALLOWED_ORDER_FROM = %w[title published_at updated_at].freeze
5
+
6
+ before_action :set_upload, only: %i[show]
7
+
8
+ # GET /uploads
9
+ # GET /uploads.json
10
+ def index
11
+ @uploads = scope_request(Upload.published).page(params[:page]).per(self.class::MAX_ITEMS_PER_PAGE)
12
+ end
13
+
14
+ # GET /uploads/1/edit
15
+ def show; end
16
+
17
+ private
18
+
19
+ # Use callbacks to share common setup or constraints between actions.
20
+ def set_upload
21
+ @upload = Upload.find_publicly_visible(params[:id])
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,36 @@
1
+ module Elabs
2
+ class UsersController < ElabsApplicationController
3
+ ALLOWED_ORDER_FROM = %w[username created_at].freeze
4
+ DEFAULT_ORDER = { username: :desc }.freeze
5
+
6
+ before_action :set_user, only: %i[show edit update destroy]
7
+
8
+ # GET /users
9
+ # GET /users.json
10
+ def index
11
+ @users = User.page(params[:page]).per(self.class::MAX_ITEMS_PER_PAGE)
12
+ end
13
+
14
+ # GET /users/1
15
+ # GET /users/1.json
16
+ def show
17
+ @user_albums = @user.albums.for_relation
18
+ @user_articles = @user.articles.for_relation
19
+ @user_notes = @user.notes.for_relation
20
+ @user_projects = @user.projects.for_relation
21
+ @user_uploads = @user.uploads.for_relation
22
+ end
23
+
24
+ private
25
+
26
+ # Use callbacks to share common setup or constraints between actions.
27
+ def set_user
28
+ @user = User.find(params[:id])
29
+ end
30
+
31
+ # Never trust parameters from the scary internet, only allow the white list through.
32
+ def user_params
33
+ params.fetch(:user, {})
34
+ end
35
+ end
36
+ end