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,10 @@
1
+ module Elabs
2
+ module Admin
3
+ class AlbumsController < AdminContentApplicationController
4
+ DEFAULT_ORDER_FIELD = 'name'.freeze
5
+ MODEL = Album
6
+ PLURAL_NAME = 'albums'.freeze
7
+ SINGULAR_NAME = 'album'.freeze
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Elabs
2
+ module Admin
3
+ class ArticlesController < AdminContentApplicationController
4
+ DEFAULT_ORDER_FIELD = 'title'.freeze
5
+ MODEL = Article
6
+ PLURAL_NAME = 'articles'.freeze
7
+ SINGULAR_NAME = 'article'.freeze
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,77 @@
1
+ module Elabs
2
+ module Admin
3
+ class LanguagesController < Admin::AdminApplicationController
4
+ DEFAULT_ORDER_FIELD = 'name'.freeze
5
+
6
+ before_action :set_language, only: %i[edit update destroy]
7
+
8
+ # GET /admin/languages
9
+ # GET /admin/languages.json
10
+ def index
11
+ order = params['order_by'] || self.class::DEFAULT_ORDER_FIELD
12
+ direction = params['direction'] || 'desc'
13
+ @languages = Language.order(order => direction).page(params[:page]).per(self.class::MAX_ITEMS_PER_PAGE)
14
+ end
15
+
16
+ # GET /admin/languages/new
17
+ def new
18
+ @language = Language.new
19
+ end
20
+
21
+ # GET /admin/languages/1/edit
22
+ def edit; end
23
+
24
+ # POST /admin/languages
25
+ # POST /admin/languages.json
26
+ def create
27
+ @language = Language.new(language_params)
28
+
29
+ respond_to do |format|
30
+ if @language.save
31
+ format.html { redirect_to admin_languages_url, notice: _('Language was successfully created.') }
32
+ format.json { render :show, status: :created, location: @language }
33
+ else
34
+ format.html { render :new }
35
+ format.json { render json: @language.errors, status: :unprocessable_entity }
36
+ end
37
+ end
38
+ end
39
+
40
+ # PATCH/PUT /admin/languages/1
41
+ # PATCH/PUT /admin/languages/1.json
42
+ def update
43
+ respond_to do |format|
44
+ if @language.update(language_params)
45
+ format.html { redirect_to admin_languages_url, notice: _('Language was successfully updated.') }
46
+ format.json { render :show, status: :ok, location: admin_languages_url }
47
+ else
48
+ format.html { render :edit }
49
+ format.json { render json: @language.errors, status: :unprocessable_entity }
50
+ end
51
+ end
52
+ end
53
+
54
+ # DELETE /admin/languages/1
55
+ # DELETE /admin/languages/1.json
56
+ def destroy
57
+ @language.destroy
58
+ respond_to do |format|
59
+ format.html { redirect_to admin_languages_url, notice: _('Language was successfully destroyed.') }
60
+ format.json { head :no_content }
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ # Use callbacks to share common setup or constraints between actions.
67
+ def set_language
68
+ @language = Language.find(params[:id])
69
+ end
70
+
71
+ # Never trust parameters from the scary internet, only allow the white list through.
72
+ def language_params
73
+ params.require(:language).permit(:iso639_1, :name)
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,77 @@
1
+ module Elabs
2
+ module Admin
3
+ class LicensesController < AdminApplicationController
4
+ DEFAULT_ORDER_FIELD = 'name'.freeze
5
+
6
+ before_action :set_license, only: %i[edit update destroy]
7
+
8
+ # GET /licenses
9
+ # GET /licenses.json
10
+ def index
11
+ order = params['order_by'] || self.class::DEFAULT_ORDER_FIELD
12
+ direction = params['direction'] || 'desc'
13
+ @licenses = License.order(order => direction).all
14
+ end
15
+
16
+ # GET /licenses/new
17
+ def new
18
+ @license = License.new
19
+ end
20
+
21
+ # GET /licenses/1/edit
22
+ def edit; end
23
+
24
+ # POST /licenses
25
+ # POST /licenses.json
26
+ def create
27
+ @license = License.new(license_params)
28
+
29
+ respond_to do |format|
30
+ if @license.save
31
+ format.html { redirect_to admin_licenses_url, notice: _('License was successfully created.') }
32
+ format.json { render :show, status: :created, location: @license }
33
+ else
34
+ format.html { render :new }
35
+ format.json { render json: @license.errors, status: :unprocessable_entity }
36
+ end
37
+ end
38
+ end
39
+
40
+ # PATCH/PUT /licenses/1
41
+ # PATCH/PUT /licenses/1.json
42
+ def update
43
+ respond_to do |format|
44
+ if @license.update(license_params)
45
+ format.html { redirect_to admin_licenses_url, notice: _('License was successfully updated.') }
46
+ format.json { render :show, status: :ok, location: @license }
47
+ else
48
+ format.html { render :edit }
49
+ format.json { render json: @license.errors, status: :unprocessable_entity }
50
+ end
51
+ end
52
+ end
53
+
54
+ # DELETE /licenses/1
55
+ # DELETE /licenses/1.json
56
+ def destroy
57
+ @license.destroy
58
+ respond_to do |format|
59
+ format.html { redirect_to admin_licenses_url, notice: _('License was successfully destroyed.') }
60
+ format.json { head :no_content }
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ # Use callbacks to share common setup or constraints between actions.
67
+ def set_license
68
+ @license = License.find(params[:id])
69
+ end
70
+
71
+ # Never trust parameters from the scary internet, only allow the white list through.
72
+ def license_params
73
+ params.require(:license).permit(:name, :url, :tldr_url, :icon)
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,10 @@
1
+ module Elabs
2
+ module Admin
3
+ class NotesController < AdminContentApplicationController
4
+ DEFAULT_ORDER_FIELD = 'content'.freeze
5
+ MODEL = Note
6
+ PLURAL_NAME = 'notes'.freeze
7
+ SINGULAR_NAME = 'note'.freeze
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Elabs
2
+ module Admin
3
+ class ProjectsController < AdminContentApplicationController
4
+ DEFAULT_ORDER_FIELD = 'name'.freeze
5
+ MODEL = Project
6
+ PLURAL_NAME = 'projects'.freeze
7
+ SINGULAR_NAME = 'project'.freeze
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,34 @@
1
+ module Elabs
2
+ module Admin
3
+ class ReportsController < AdminApplicationController
4
+ DEFAULT_ORDER_FIELD = 'created_at'.freeze
5
+
6
+ before_action :set_report, only: %i[destroy]
7
+
8
+ # GET /reports
9
+ # GET /reports.json
10
+ def index
11
+ order = params['order_by'] || self.class::DEFAULT_ORDER_FIELD
12
+ direction = params['direction'] || 'desc'
13
+ @reports = Report.order(order => direction).all
14
+ end
15
+
16
+ # DELETE /reports/1
17
+ # DELETE /reports/1.json
18
+ def destroy
19
+ @report.destroy
20
+ respond_to do |format|
21
+ format.html { redirect_to admin_reports_url, notice: _('Report was successfully destroyed.') }
22
+ format.json { head :no_content }
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ # Use callbacks to share common setup or constraints between actions.
29
+ def set_report
30
+ @report = Report.find(params[:id])
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,56 @@
1
+ module Elabs
2
+ module Admin
3
+ class TagsController < AdminApplicationController
4
+ DEFAULT_ORDER_FIELD = 'name'.freeze
5
+
6
+ before_action :set_tag, only: %i[edit update destroy]
7
+
8
+ # GET /tags
9
+ # GET /tags.json
10
+ def index
11
+ order = params['order_by'] || self.class::DEFAULT_ORDER_FIELD
12
+ direction = params['direction'] || 'desc'
13
+ @tags = Tag.order(order => direction).all
14
+ end
15
+
16
+ # GET /tags/1/edit
17
+ def edit; end
18
+
19
+ # PATCH/PUT /tags/1
20
+ # PATCH/PUT /tags/1.json
21
+ def update
22
+ respond_to do |format|
23
+ if @tag.update(tag_params)
24
+ format.html { redirect_to admin_tags_url, notice: _('Tag was successfully updated.') }
25
+ format.json { render :show, status: :ok, location: admin_tags_url }
26
+ else
27
+ format.html { render :edit }
28
+ format.json { render json: @tag.errors, status: :unprocessable_entity }
29
+ end
30
+ end
31
+ end
32
+
33
+ # DELETE /tags/1
34
+ # DELETE /tags/1.json
35
+ def destroy
36
+ @tag.destroy
37
+ respond_to do |format|
38
+ format.html { redirect_to admin_tags_url, notice: _('Tag was successfully destroyed.') }
39
+ format.json { head :no_content }
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ # Use callbacks to share common setup or constraints between actions.
46
+ def set_tag
47
+ @tag = Tag.find(params[:id])
48
+ end
49
+
50
+ # Never trust parameters from the scary internet, only allow the white list through.
51
+ def tag_params
52
+ params.require(:tag).permit(:name)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,10 @@
1
+ module Elabs
2
+ module Admin
3
+ class UploadsController < AdminContentApplicationController
4
+ DEFAULT_ORDER_FIELD = 'title'.freeze
5
+ MODEL = Upload
6
+ PLURAL_NAME = 'uploads'.freeze
7
+ SINGULAR_NAME = 'upload'.freeze
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,43 @@
1
+ module Elabs
2
+ module Admin
3
+ class UsersController < AdminApplicationController
4
+ DEFAULT_ORDER_FIELD = 'username'.freeze
5
+
6
+ before_action :set_admin_user, only: %i[show destroy]
7
+
8
+ # GET /admin/users
9
+ # GET /admin/users.json
10
+ def index
11
+ order = params['order_by'] || self.class::DEFAULT_ORDER_FIELD
12
+ direction = params['direction'] || 'desc'
13
+ @users = User.order(order => direction).page(params[:page]).per(self.class::MAX_ITEMS_PER_PAGE)
14
+ end
15
+
16
+ # GET /admin/users/1
17
+ # GET /admin/users/1.json
18
+ def show; end
19
+
20
+ # DELETE /admin/users/1
21
+ # DELETE /admin/users/1.json
22
+ def destroy
23
+ @user.destroy
24
+ respond_to do |format|
25
+ format.html { redirect_to admin_users_url, notice: _('User was successfully destroyed.') }
26
+ format.json { head :no_content }
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ # Use callbacks to share common setup or constraints between actions.
33
+ def set_admin_user
34
+ @user = User.find(params[:id])
35
+ end
36
+
37
+ # Never trust parameters from the scary internet, only allow the white list through.
38
+ def admin_user_params
39
+ params.fetch(:user, {})
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,26 @@
1
+ module Elabs
2
+ class AlbumsController < ContentApplicationController
3
+ ALLOWED_NESTED_FROM = %w[language license tag user project].freeze
4
+ ALLOWED_ORDER_FROM = %w[name published_at updated_at].freeze
5
+
6
+ before_action :set_album, only: %i[show]
7
+
8
+ # GET /albums
9
+ # GET /albums.json
10
+ def index
11
+ @albums = scope_request(Album.published).page(params[:page]).per(self.class::MAX_ITEMS_PER_PAGE)
12
+ end
13
+
14
+ # GET /albums/1
15
+ # GET /albums/1.json
16
+ def show; end
17
+
18
+ private
19
+
20
+ # Use callbacks to share common setup or constraints between actions.
21
+ def set_album
22
+ @album = Album.find_publicly_visible(params[:id])
23
+ @album_uploads = @album.uploads.for_relation
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ module Elabs
2
+ class ArticlesController < ContentApplicationController
3
+ ALLOWED_NESTED_FROM = %w[language license tag user project].freeze
4
+ ALLOWED_ORDER_FROM = %w[title published_at updated_at].freeze
5
+
6
+ before_action :set_article, only: %i[show]
7
+
8
+ # GET /articles
9
+ # GET /articles.json
10
+ def index
11
+ @articles = scope_request(Article.published).page(params[:page]).per(self.class::MAX_ITEMS_PER_PAGE)
12
+ end
13
+
14
+ # GET /articles/1
15
+ # GET /articles/1.json
16
+ def show; end
17
+
18
+ private
19
+
20
+ # Use callbacks to share common setup or constraints between actions.
21
+ def set_article
22
+ @article = Article.find_publicly_visible(params[:id])
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Elabs
4
+ module Auth
5
+ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
6
+ include Elabs::Concerns::ElabsController
7
+ include Elabs::Concerns::Reportable
8
+ include Elabs::Concerns::Localizable
9
+
10
+ # You should configure your model like this:
11
+ # devise :omniauthable, omniauth_providers: [:twitter]
12
+
13
+ # You should also create an action method in this controller like this:
14
+ # def twitter
15
+ # end
16
+
17
+ # More info at:
18
+ # https://github.com/plataformatec/devise#omniauth
19
+
20
+ # GET|POST /resource/auth/twitter
21
+ # def passthru
22
+ # super
23
+ # end
24
+
25
+ # GET|POST /users/auth/twitter/callback
26
+ # def failure
27
+ # super
28
+ # end
29
+
30
+ # protected
31
+
32
+ # The path used when OmniAuth fails
33
+ # def after_omniauth_failure_path_for(scope)
34
+ # super(scope)
35
+ # end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Elabs
4
+ module Auth
5
+ class ConfirmationsController < Devise::ConfirmationsController
6
+ include Elabs::Concerns::ElabsController
7
+ include Elabs::Concerns::Reportable
8
+ include Elabs::Concerns::Localizable
9
+
10
+ # GET /resource/confirmation/new
11
+ # def new
12
+ # super
13
+ # end
14
+
15
+ # POST /resource/confirmation
16
+ # def create
17
+ # super
18
+ # end
19
+
20
+ # GET /resource/confirmation?confirmation_token=abcdef
21
+ # def show
22
+ # super
23
+ # end
24
+
25
+ protected
26
+
27
+ # Override the default "new_session_path" method to return a known path
28
+ def new_session_path(*)
29
+ new_user_session_path
30
+ end
31
+
32
+ # The path used after resending confirmation instructions.
33
+ # def after_resending_confirmation_instructions_path_for(resource_name)
34
+ # super(resource_name)
35
+ # end
36
+
37
+ # The path used after confirmation.
38
+ # def after_confirmation_path_for(resource_name, resource)
39
+ # super(resource_name, resource)
40
+ # end
41
+ end
42
+ end
43
+ end