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
+ class ApplicationContentRecord < ApplicationRecord
3
+ include Elabs::Concerns::ContentEntity
4
+ include Elabs::Concerns::ActableEntity
5
+ include Elabs::Concerns::CountableEntity
6
+ include Elabs::Concerns::Taggable
7
+
8
+ self.abstract_class = true
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ module Elabs
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,23 @@
1
+ module Elabs
2
+ class Article < ApplicationContentRecord
3
+ self.table_name = 'articles'
4
+
5
+ ADDITIONAL_HABTM_COUNTER_CACHES = [
6
+ %w[projects articles]
7
+ ].freeze
8
+
9
+ validates :title, presence: true
10
+ validates :excerpt, presence: true
11
+ validates :content, presence: true
12
+ validates_with AssociatedAuthorValidator, relations: %w[project]
13
+
14
+ belongs_to :user
15
+ belongs_to :license
16
+ belongs_to :language
17
+ has_many :articles_tags
18
+ has_many :projects_articles
19
+ has_many :tags, through: :articles_tags, dependent: :destroy
20
+ has_many :projects, through: :projects_articles, dependent: :destroy
21
+ has_many :comments, as: 'content'
22
+ end
23
+ end
@@ -0,0 +1,21 @@
1
+ module Elabs
2
+ class ArticlesTag < ApplicationRecord
3
+ self.table_name = 'articles_tags'
4
+
5
+ belongs_to :article
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! :articles_count if article.publicly_visible?
15
+ end
16
+
17
+ def decrement_counter_cache
18
+ tag.decrement! :articles_count if article.publicly_visible?
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ module Elabs
2
+ class Comment < ApplicationRecord
3
+ self.table_name = 'comments'
4
+
5
+ validates :comment, presence: true
6
+ validates :user, presence: true, unless: :name
7
+ validates :name, presence: true, unless: :user
8
+
9
+ belongs_to :content, polymorphic: true
10
+ belongs_to :user, optional: true
11
+ end
12
+ end
@@ -0,0 +1,52 @@
1
+ module Elabs
2
+ module Concerns
3
+ module ActableEntity
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ has_many :acts, as: :content
8
+
9
+ before_save :update_acts?
10
+ after_save :update_acts
11
+
12
+ before_destroy :update_acts_on_delete
13
+ end
14
+
15
+ private
16
+
17
+ def update_acts?
18
+ @action = if changed.include?('published')
19
+ current_publish_action
20
+ elsif changed.include?('locked') && published?
21
+ current_lock_action
22
+ elsif (changed & %w[title name description short_description content excerpt]).any?
23
+ current_update_action
24
+ else
25
+ :nothing
26
+ end
27
+ end
28
+
29
+ def current_publish_action
30
+ published? && unlocked? ? :publish : :unpublish
31
+ end
32
+
33
+ def current_lock_action
34
+ published? && locked? ? :lock : :unlock
35
+ end
36
+
37
+ def current_update_action
38
+ published? && unlocked? ? :update : :nothing
39
+ end
40
+
41
+ def update_acts
42
+ acts.destroy_all if %i[lock unpublish].include? @action
43
+ Act.create content: self, event: @action unless @action == :nothing
44
+ end
45
+
46
+ # TODO: check if used ? (dependent: destroy may do the trick.)
47
+ def update_acts_on_delete
48
+ acts.destroy_all
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,70 @@
1
+ module Elabs
2
+ module Concerns
3
+ module ContentEntity
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ before_save :set_publication_date
8
+
9
+ scope :by_member, ->(user_id) { where(user_id: user_id) }
10
+ scope :published, -> { where(published: true) }
11
+ scope :unlocked, -> { where(locked: false) }
12
+ scope :publicly_visible, -> { published.unlocked }
13
+ scope :for_relation, -> { published.order(published_at: 'desc').limit(Elabs.max_related_items) }
14
+ end
15
+
16
+ def locked?
17
+ locked
18
+ end
19
+
20
+ def unlocked?
21
+ !locked
22
+ end
23
+
24
+ def draft?
25
+ !published
26
+ end
27
+
28
+ def published?
29
+ published
30
+ end
31
+
32
+ def publicly_visible?
33
+ published? && !locked?
34
+ end
35
+
36
+ def not_publicly_visible?
37
+ draft? || locked?
38
+ end
39
+
40
+ private
41
+
42
+ def made_publicly_visible?
43
+ (changes_include?(:published) || changes_include?(:locked)) && published? && unlocked?
44
+ end
45
+
46
+ def made_publicly_invisible?
47
+ (changes_include?(:published) && draft?) || (changes_include?(:locked) && locked? && published?)
48
+ end
49
+
50
+ def was_published_before?
51
+ (changes_include?(:published) && draft?)
52
+ end
53
+
54
+ def set_publication_date
55
+ self.published_at = Time.new if changed.include?('published') && published?
56
+ self.published_at = nil if changed.include?('published') && !published?
57
+ end
58
+
59
+ class_methods do
60
+ def find_publicly_visible(id)
61
+ entity = where(id: id).published.first
62
+
63
+ raise ActiveRecord::RecordNotFound if entity.nil?
64
+
65
+ entity
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,81 @@
1
+ module Elabs
2
+ module Concerns
3
+ module CountableEntity
4
+ extend ActiveSupport::Concern
5
+
6
+ # List of lists like ['albums', 'uploads'] if 'uploads_counter' is in 'albums' table
7
+ ADDITIONAL_HABTM_COUNTER_CACHES = [].freeze
8
+
9
+ included do
10
+ before_save :update_counter_caches?
11
+ after_save :update_counter_caches
12
+
13
+ before_destroy :update_counter_caches_on_delete?
14
+ after_destroy :update_counter_caches
15
+ end
16
+
17
+ private
18
+
19
+ def update_counter_caches?
20
+ @action_on_counter_caches = if made_publicly_visible? && !persisted?
21
+ :increment_but_tags
22
+ elsif made_publicly_visible? && persisted?
23
+ :increment
24
+ elsif made_publicly_invisible?
25
+ :decrement
26
+ else
27
+ :nothing
28
+ end
29
+ end
30
+
31
+ def update_counter_caches_on_delete?
32
+ @action_on_counter_caches = if publicly_visible?
33
+ :decrement
34
+ else
35
+ :nothing
36
+ end
37
+ end
38
+
39
+ def update_counter_caches
40
+ if @action_on_counter_caches == :increment
41
+ increment_counter_caches
42
+ elsif @action_on_counter_caches == :increment_but_tags
43
+ increment_counter_caches false
44
+ elsif @action_on_counter_caches == :decrement
45
+ decrement_counter_caches
46
+ end
47
+ end
48
+
49
+ # rubocop:disable Metrics/AbcSize
50
+ def increment_counter_caches(update_created_on_the_fly = true)
51
+ User.increment_counter "#{self.class.table_name}_count", user.id
52
+ Language.increment_counter "#{self.class.table_name}_count", language.id
53
+ License.increment_counter "#{self.class.table_name}_count", license.id
54
+
55
+ return unless update_created_on_the_fly
56
+
57
+ tags.each { |tag| tag.increment! "#{self.class.table_name}_count" }
58
+
59
+ self.class::ADDITIONAL_HABTM_COUNTER_CACHES.each do |relation|
60
+ send(relation[0]).each { |entity| entity.increment! "#{relation[1]}_count" }
61
+ end
62
+ end
63
+
64
+ # rubocop:enable Metrics/AbcSize
65
+
66
+ # rubocop:disable Metrics/AbcSize
67
+ def decrement_counter_caches
68
+ User.decrement_counter "#{self.class.table_name}_count", user.id
69
+ Language.decrement_counter "#{self.class.table_name}_count", language.id
70
+ License.decrement_counter "#{self.class.table_name}_count", license.id
71
+
72
+ tags.each { |tag| tag.decrement! "#{self.class.table_name}_count" }
73
+
74
+ self.class::ADDITIONAL_HABTM_COUNTER_CACHES.each do |relation|
75
+ send(relation[0]).each { |entity| entity.decrement! "#{relation[1]}_count" }
76
+ end
77
+ end
78
+ # rubocop:enable Metrics/AbcSize
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,33 @@
1
+ module Elabs
2
+ module Concerns
3
+ module Taggable
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ attr_writer :tags_list
8
+
9
+ after_save :save_tags_list
10
+ end
11
+
12
+ def save_tags_list
13
+ if @tags_list
14
+ tags = []
15
+ @tags_list.split(/, */).each do |t|
16
+ tags.push Tag.find_or_create_by(name: t.chomp)
17
+ end
18
+
19
+ @tags_list = nil
20
+
21
+ update(tags: tags) if tags.count.positive?
22
+ end
23
+
24
+ true
25
+ end
26
+
27
+ # Returns a list of comma-separated tags
28
+ def tags_list
29
+ @tags_list || tags.map(&:name).join(', ')
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ module Elabs
2
+ class Language < ApplicationRecord
3
+ self.table_name = 'languages'
4
+
5
+ validates :iso639_1, presence: true
6
+ validates :name, presence: true
7
+
8
+ has_many :albums
9
+ has_many :articles
10
+ has_many :notes
11
+ has_many :projects
12
+ has_many :uploads
13
+
14
+ scope :with_content_only, -> { where.not(albums_count: 0).or(where.not(articles_count: 0)).or(where.not(notes_count: 0)).or(where.not(projects_count: 0)).or(where.not(uploads_count: 0)) }
15
+ scope :available_site_translations, -> { select(:id, :name, :iso639_1).where(iso639_1: I18n.available_locales) }
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ module Elabs
2
+ class License < ApplicationRecord
3
+ self.table_name = 'licenses'
4
+
5
+ validates :name, presence: true
6
+ validates :url, presence: true
7
+ validates :icon, presence: true
8
+
9
+ has_many :albums
10
+ has_many :articles
11
+ has_many :notes
12
+ has_many :projects
13
+ has_many :uploads
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ module Elabs
2
+ class Note < ApplicationContentRecord
3
+ self.table_name = 'notes'
4
+
5
+ ADDITIONAL_HABTM_COUNTER_CACHES = [
6
+ %w[projects notes]
7
+ ].freeze
8
+
9
+ validates :content, presence: true
10
+ validates_with AssociatedAuthorValidator, relations: %w[project]
11
+
12
+ belongs_to :user
13
+ belongs_to :license
14
+ belongs_to :language
15
+ has_many :notes_tags
16
+ has_many :projects_notes
17
+ has_many :tags, through: :notes_tags, dependent: :destroy
18
+ has_many :projects, through: :projects_notes, dependent: :destroy
19
+ has_many :comments, as: 'content'
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module Elabs
2
+ class NotesTag < ApplicationRecord
3
+ self.table_name = 'notes_tags'
4
+
5
+ belongs_to :note
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! :notes_count if note.publicly_visible?
15
+ end
16
+
17
+ def decrement_counter_cache
18
+ tag.decrement! :notes_count if note.publicly_visible?
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ module Elabs
2
+ class Preference < ApplicationRecord
3
+ self.table_name = 'preferences'
4
+
5
+ validates :locale, inclusion: { in: %w[en fr] }, allow_blank: true
6
+
7
+ belongs_to :user
8
+ end
9
+ end
@@ -0,0 +1,25 @@
1
+ module Elabs
2
+ class Project < ApplicationContentRecord
3
+ self.table_name = 'projects'
4
+
5
+ validates :name, presence: true
6
+ validates :short_description, presence: true
7
+ validates :description, presence: true
8
+ validates_with AssociatedAuthorValidator, relations: %w[album article note upload]
9
+
10
+ belongs_to :user
11
+ belongs_to :license
12
+ belongs_to :language
13
+ has_many :projects_tags
14
+ has_many :projects_albums
15
+ has_many :projects_articles
16
+ has_many :projects_notes
17
+ has_many :projects_uploads
18
+ has_many :tags, through: :projects_tags, dependent: :destroy
19
+ has_many :albums, through: :projects_albums, dependent: :destroy
20
+ has_many :articles, through: :projects_articles, dependent: :destroy
21
+ has_many :notes, through: :projects_notes, dependent: :destroy
22
+ has_many :uploads, through: :projects_uploads, dependent: :destroy
23
+ has_many :comments, as: 'content'
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ module Elabs
2
+ class ProjectsAlbum < ApplicationRecord
3
+ self.table_name = 'projects_albums'
4
+
5
+ belongs_to :project
6
+ belongs_to :album
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! :albums_count if album.publicly_visible?
15
+ end
16
+
17
+ def decrement_counter_cache
18
+ project.decrement! :albums_count if album.publicly_visible?
19
+ end
20
+ end
21
+ end