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,21 @@
1
+ module Elabs
2
+ class ProjectsArticle < ApplicationRecord
3
+ self.table_name = 'projects_articles'
4
+
5
+ belongs_to :project
6
+ belongs_to :article
7
+
8
+ after_create :increment_counter_cache
9
+ after_destroy :decrement_counter_cache
10
+
11
+ private
12
+
13
+ def increment_counter_cache
14
+ project.increment! :articles_count if article.publicly_visible?
15
+ end
16
+
17
+ def decrement_counter_cache
18
+ project.decrement! :articles_count if article.publicly_visible?
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module Elabs
2
+ class ProjectsNote < ApplicationRecord
3
+ self.table_name = 'projects_notes'
4
+
5
+ belongs_to :project
6
+ belongs_to :note
7
+
8
+ after_create :increment_counter_cache
9
+ after_destroy :decrement_counter_cache
10
+
11
+ private
12
+
13
+ def increment_counter_cache
14
+ project.increment! :notes_count if note.publicly_visible?
15
+ end
16
+
17
+ def decrement_counter_cache
18
+ project.decrement! :notes_count if note.publicly_visible?
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module Elabs
2
+ class ProjectsTag < ApplicationRecord
3
+ self.table_name = 'projects_tags'
4
+
5
+ belongs_to :project
6
+ belongs_to :tag
7
+
8
+ after_create :increment_counter_cache
9
+ after_destroy :decrement_counter_cache
10
+
11
+ private
12
+
13
+ def increment_counter_cache
14
+ tag.increment! :projects_count if project.publicly_visible?
15
+ end
16
+
17
+ def decrement_counter_cache
18
+ tag.decrement! :projects_count if project.publicly_visible?
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module Elabs
2
+ class ProjectsUpload < ApplicationRecord
3
+ self.table_name = 'projects_uploads'
4
+
5
+ belongs_to :project
6
+ belongs_to :upload
7
+
8
+ after_create :increment_counter_cache
9
+ after_destroy :decrement_counter_cache
10
+
11
+ private
12
+
13
+ def increment_counter_cache
14
+ project.increment! :uploads_count if upload.publicly_visible?
15
+ end
16
+
17
+ def decrement_counter_cache
18
+ project.decrement! :uploads_count if upload.publicly_visible?
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ module Elabs
2
+ class Report < ApplicationRecord
3
+ self.table_name = 'reports'
4
+
5
+ validates :reason, presence: true
6
+ validates :user, presence: true, unless: :name
7
+ validates :name, presence: true, unless: :user
8
+
9
+ belongs_to :user, optional: true
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ module Elabs
2
+ class Tag < ApplicationRecord
3
+ self.table_name = 'tags'
4
+
5
+ validates :name, presence: true
6
+
7
+ has_many :albums_tags
8
+ has_many :articles_tags
9
+ has_many :notes_tags
10
+ has_many :projects_tags
11
+ has_many :uploads_tags
12
+ has_many :albums, through: :albums_tags, dependent: :destroy
13
+ has_many :articles, through: :articles_tags, dependent: :destroy
14
+ has_many :notes, through: :notes_tags, dependent: :destroy
15
+ has_many :projects, through: :projects_tags, dependent: :destroy
16
+ has_many :uploads, through: :uploads_tags, dependent: :destroy
17
+ end
18
+ end
@@ -0,0 +1,28 @@
1
+ module Elabs
2
+ class Upload < ApplicationContentRecord
3
+ self.table_name = 'uploads'
4
+
5
+ ADDITIONAL_HABTM_COUNTER_CACHES = [
6
+ %w[albums uploads],
7
+ %w[projects uploads]
8
+ ].freeze
9
+
10
+ validates :title, presence: true
11
+ validates :description, presence: true
12
+ validates :file_attachment, presence: true
13
+ validates_with AssociatedAuthorValidator, relations: %w[album project]
14
+
15
+ belongs_to :user
16
+ belongs_to :license
17
+ belongs_to :language
18
+ has_many :uploads_tags
19
+ has_many :projects_uploads
20
+ has_many :albums_uploads
21
+ has_many :tags, through: :uploads_tags, dependent: :destroy
22
+ has_many :projects, through: :projects_uploads, dependent: :destroy
23
+ has_many :albums, through: :albums_uploads, dependent: :destroy
24
+ has_many :comments, as: 'content'
25
+
26
+ has_one_attached :file
27
+ end
28
+ end
@@ -0,0 +1,21 @@
1
+ module Elabs
2
+ class UploadsTag < ApplicationRecord
3
+ self.table_name = 'uploads_tags'
4
+
5
+ belongs_to :upload
6
+ belongs_to :tag
7
+
8
+ after_create :increment_counter_cache
9
+ after_destroy :decrement_counter_cache
10
+
11
+ private
12
+
13
+ def increment_counter_cache
14
+ tag.increment! :uploads_count if upload.publicly_visible?
15
+ end
16
+
17
+ def decrement_counter_cache
18
+ tag.decrement! :uploads_count if upload.publicly_visible?
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,30 @@
1
+ module Elabs
2
+ class User < ApplicationRecord
3
+ self.table_name = 'users'
4
+
5
+ validates :username, presence: true, uniqueness: true
6
+ validates :role, presence: false
7
+
8
+ # Username should:
9
+ # - not start with '-', '_' or '.'
10
+ # - contain only a to z characters (upper/lower cased), numbers, '.', '-' or '_'
11
+ # - not contain successive '.', '-' or '_'
12
+ validates_format_of :username, with: /\A(?![_.-])(?!.*[_.]{2})[a-zA-Z0-9._-]+[^_\-.]\z/
13
+
14
+ has_many :albums, dependent: :destroy
15
+ has_many :articles, dependent: :destroy
16
+ has_many :notes, dependent: :destroy
17
+ has_many :projects, dependent: :destroy
18
+ has_many :uploads, dependent: :destroy
19
+ has_many :reports, dependent: :destroy
20
+ has_one :preference, dependent: :delete
21
+
22
+ def admin?
23
+ role == 'admin'
24
+ end
25
+
26
+ after_create do
27
+ Preference.create! user: self, show_nsfw: false
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,11 @@
1
+ module Elabs
2
+ class AssociatedAuthorValidator < ActiveModel::Validator
3
+ def validate(record)
4
+ options[:relations].each do |association|
5
+ record.send(association.pluralize).each do |element|
6
+ record.errors[:base] << format(_('This %<model>s is not yours'), model: association) if element.user_id != record.user_id
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,2 @@
1
+ json.extract! act, :id, :content_id, :content_type, :event, :user_id, :created_at, :updated_at
2
+ json.url act_url(act, format: :json)
@@ -0,0 +1,3 @@
1
+ .filter-links
2
+ .filter-links__group
3
+ = order_link _('Date'), 'created_at'
@@ -0,0 +1,27 @@
1
+ - @page_title = _('Last events')
2
+ .acts-list
3
+ - previous_date = nil
4
+ - @acts.each do |act|
5
+ - unless same_day?(previous_date, act.created_at)
6
+ .date= date_time_to_date(act.created_at)
7
+ .act
8
+ .act__time= date_time_to_time(act.created_at)
9
+ .act__content
10
+ - if act.event == 'publish'
11
+ - case act.content_type
12
+ - when 'Elabs::Album'
13
+ = render 'elabs/albums/album', album: act.content
14
+ - when 'Elabs::Article'
15
+ = render 'elabs/articles/article', article: act.content
16
+ - when 'Elabs::Note'
17
+ = render 'elabs/notes/note', note: act.content
18
+ - when 'Elabs::Project'
19
+ = render 'elabs/projects/project', project: act.content
20
+ - when 'Elabs::Upload'
21
+ = render 'elabs/uploads/upload', upload: act.content
22
+ - else
23
+ %div{ class: "act-action act-action--#{act.event}" }= act_notice_string act
24
+
25
+ - previous_date = act.created_at
26
+
27
+ = paginate @acts
@@ -0,0 +1 @@
1
+ json.array! @acts, partial: 'acts/act', as: :act
@@ -0,0 +1,2 @@
1
+ json.extract! album, :id, :name, :description, :sfw, :published, :locked, :hidden_in_history, :user_id, :language, :license_id, :created_at, :updated_at
2
+ json.url album_url(album, format: :json)
@@ -0,0 +1,43 @@
1
+ - @page_title = _('Albums')
2
+
3
+ %table.albums-list
4
+ %thead
5
+ %tr
6
+ %th= admin_order_by_link _('Name'), 'name'
7
+ %th= admin_order_by_link _('SFW'), 'sfw'
8
+ %th= admin_order_by_link _('Pub.'), 'published'
9
+ %th= admin_order_by_link _('Lock.'), 'locked'
10
+ %th= admin_order_by_link _('Skip hist.'), 'hidden_in_history'
11
+ %th= admin_order_by_link _('Published at'), 'published_at'
12
+ %th= _('User')
13
+ %th= _('License')
14
+ %th= _('Language')
15
+ %th= admin_order_by_link _('Uploads'), 'uploads_count'
16
+ %th= _('Projects')
17
+ %th= _('Tags')
18
+ %th
19
+
20
+ %tbody
21
+ - @albums.each do |album|
22
+ %tr.album
23
+ %td= album.name
24
+ %td.is-icon= boolean_icon_tag album.sfw
25
+ %td.is-icon= boolean_icon_tag album.published
26
+ %td.is-icon= boolean_icon_tag album.locked, 'lock', 'unlock'
27
+ %td.is-icon= boolean_icon_tag album.hidden_in_history
28
+ %td= album.published_at
29
+ %td= album.user.username
30
+ %td= album.license.name
31
+ %td= album.language.name
32
+ %td.is-counter= album.uploads_count
33
+ %td.relations
34
+ - album.projects.each do |p|
35
+ %span.project= p.name
36
+ %td.relations
37
+ - album.tags.each do |t|
38
+ %span.tag= t.name
39
+ %td.actions
40
+ .btn-group
41
+ = admin_action_links 'album', album
42
+
43
+ = paginate @albums
@@ -0,0 +1 @@
1
+ json.array! @albums, partial: 'albums/album', as: :album
@@ -0,0 +1,2 @@
1
+ json.extract! article, :id, :title, :excerpt, :content, :sfw, :published, :locked, :published_at, :hidden_in_history, :user_id, :license_id, :language_id, :created_at, :updated_at
2
+ json.url article_url(article, format: :json)
@@ -0,0 +1,41 @@
1
+ - @page_title = _('Articles')
2
+
3
+ %table.articles-list
4
+ %thead
5
+ %tr
6
+ %th= admin_order_by_link _('Title'), 'title'
7
+ %th= admin_order_by_link _('SFW'), 'sfw'
8
+ %th= admin_order_by_link _('Pub.'), 'published'
9
+ %th= admin_order_by_link _('Lock.'), 'locked'
10
+ %th= admin_order_by_link _('Skip hist.'), 'hidden_in_history'
11
+ %th= admin_order_by_link _('Published at'), 'published_at'
12
+ %th= _('User')
13
+ %th= _('License')
14
+ %th= _('Language')
15
+ %th= _('Projects')
16
+ %th= _('Tags')
17
+ %th
18
+
19
+ %tbody
20
+ - @articles.each do |article|
21
+ %tr.article
22
+ %td= article.title
23
+ %td.is-icon= boolean_icon_tag article.sfw
24
+ %td.is-icon= boolean_icon_tag article.published
25
+ %td.is-icon= boolean_icon_tag article.locked, 'lock', 'unlock'
26
+ %td.is-icon= boolean_icon_tag article.hidden_in_history
27
+ %td= article.published_at
28
+ %td= article.user.username
29
+ %td= article.license.name
30
+ %td= article.language.name
31
+ %td.relations
32
+ - article.projects.each do |p|
33
+ %span.project= p.name
34
+ %td.relations
35
+ - article.tags.each do |t|
36
+ %span.tag= t.name
37
+ %td.actions
38
+ .btn-group
39
+ = admin_action_links 'article', article
40
+
41
+ = paginate @articles
@@ -0,0 +1 @@
1
+ json.array! @articles, partial: 'articles/article', as: :article
@@ -0,0 +1,18 @@
1
+ = form_for language, url: language.id ? admin_language_path : admin_languages_path do |f|
2
+ - if language.errors.any?
3
+ .error
4
+ %h2= format(n_('An error prevented this language from being saved:',
5
+ '%<nb>i errors prevented this language from being saved:',
6
+ language.errors.count), nb: language.errors.count)
7
+ %ul
8
+ - language.errors.full_messages.each do |message|
9
+ %li= message
10
+ .field
11
+ = f.label :iso639_1
12
+ .field-input= f.text_field :iso639_1
13
+ .field
14
+ = f.label :name
15
+ .field-input= f.text_field :name
16
+
17
+ .actions
18
+ = f.submit _('Save'), class: 'btn btn--save'
@@ -0,0 +1,2 @@
1
+ json.extract! language, :id, :iso639_1, :name
2
+ json.url language_url(language, format: :json)
@@ -0,0 +1,6 @@
1
+ - @page_title = format(_('Edit "%<language>s"'), language: @language.name)
2
+
3
+ .page__actions
4
+ = link_to _('View online'), @language, class: 'btn btn--show'
5
+
6
+ = render 'form', language: @language
@@ -0,0 +1,34 @@
1
+ - @page_title = _('Languages')
2
+
3
+ .page__actions
4
+ = link_to _('New Language'), new_admin_language_path, class: 'btn btn--new'
5
+
6
+ %table.languages-list
7
+ %thead
8
+ %tr
9
+ %th= admin_order_by_link _('ISO 639-1 code'), 'iso639_1'
10
+ %th= admin_order_by_link _('Name'), 'name'
11
+ %th= admin_order_by_link _('Albums'), 'albums_count'
12
+ %th= admin_order_by_link _('Articles'), 'articles_count'
13
+ %th= admin_order_by_link _('Notes'), 'notes_count'
14
+ %th= admin_order_by_link _('Projects'), 'projects_count'
15
+ %th= admin_order_by_link _('Uploads'), 'uploads_count'
16
+ %th
17
+
18
+ %tbody
19
+ - @languages.each do |language|
20
+ %tr.language
21
+ %td= language.iso639_1
22
+ %td= language.name
23
+ %td.is-counter= language.albums_count
24
+ %td.is-counter= language.articles_count
25
+ %td.is-counter= language.notes_count
26
+ %td.is-counter= language.projects_count
27
+ %td.is-counter= language.uploads_count
28
+ %td.actions
29
+ .btn-group
30
+ = admin_show_online_link language
31
+ = admin_edit_link 'language', language
32
+ = admin_destroy_link 'language', language
33
+
34
+ = paginate @languages
@@ -0,0 +1 @@
1
+ json.array! @languages, partial: 'admin/languages/language', as: :language
@@ -0,0 +1,3 @@
1
+ - @page_title = _('New language')
2
+
3
+ = render 'form', language: @language
@@ -0,0 +1,25 @@
1
+ = form_for license, url: license.id ? admin_license_path : admin_licenses_path do |f|
2
+ - if license.errors.any?
3
+ .error
4
+ %h2= format(n_('An error prevented this license from being saved:',
5
+ '%<nb>i errors prevented this license from being saved:',
6
+ license.errors.count), nb: license.errors.count)
7
+ %ul
8
+ - license.errors.full_messages.each do |message|
9
+ %li= message
10
+
11
+ .field
12
+ = f.label :name
13
+ .field-input= f.text_field :name
14
+ .field
15
+ = f.label :url
16
+ .field-input= f.text_field :url
17
+ .field
18
+ = f.label :tldr_url
19
+ .field-input= f.text_field :tldr_url
20
+ .field
21
+ = f.label :icon
22
+ .field-input= f.text_field :icon
23
+
24
+ .actions
25
+ = f.submit _('Save'), class: 'btn btn--save'