elabs 3.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +89 -0
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +7 -2
  5. data/README.md +24 -17
  6. data/ROADMAP.md +8 -7
  7. data/app/assets/javascripts/elabs/application.js.erb +42 -0
  8. data/app/assets/javascripts/elabs/forms.js +10 -0
  9. data/app/assets/javascripts/elabs/helpers-markdown.js +11 -33
  10. data/app/assets/javascripts/elabs/helpers.js +28 -0
  11. data/app/assets/javascripts/elabs/hljs.js +4 -0
  12. data/app/assets/stylesheets/elabs/_colors.scss +5 -0
  13. data/app/assets/stylesheets/elabs/_fixes.scss +6 -0
  14. data/app/assets/stylesheets/elabs/_icons.scss +4 -0
  15. data/app/assets/stylesheets/elabs/app/_acts.scss +11 -0
  16. data/app/assets/stylesheets/elabs/app/_buttons.scss +8 -0
  17. data/app/assets/stylesheets/elabs/app/_comments.scss +10 -1
  18. data/app/assets/stylesheets/elabs/app/_content.scss +15 -0
  19. data/app/assets/stylesheets/elabs/app/_content_statuses.scss +32 -0
  20. data/app/assets/stylesheets/elabs/app/_forms.scss +5 -0
  21. data/app/assets/stylesheets/elabs/app/_helpers.scss +10 -0
  22. data/app/assets/stylesheets/elabs/app/_layout.scss +4 -0
  23. data/app/assets/stylesheets/elabs/app/_modals.scss +4 -0
  24. data/app/assets/stylesheets/elabs/app/_tables.scss +31 -0
  25. data/app/assets/stylesheets/elabs/app/_typo.scss +14 -0
  26. data/app/assets/stylesheets/elabs/app/_users.scss +14 -6
  27. data/app/assets/stylesheets/elabs/app/admin-members/_forms.scss +8 -1
  28. data/app/assets/stylesheets/elabs/app/admin-members/_indexes.scss +1 -26
  29. data/app/assets/stylesheets/elabs/app/mixins/_content-card.scss +11 -1
  30. data/app/assets/stylesheets/elabs/app/mixins/_content-full.scss +26 -0
  31. data/app/assets/stylesheets/elabs/app/mixins/_content-inline.scss +7 -0
  32. data/app/assets/stylesheets/elabs/app/widgets/_git-cards.scss +88 -0
  33. data/app/assets/stylesheets/elabs/lib/_hljs.scss +5 -0
  34. data/app/assets/stylesheets/elabs/lib/fontawesome/_icons.scss +11 -11
  35. data/app/assets/stylesheets/elabs/lib/knacss/_knacss-variables.scss +10 -2
  36. data/app/assets/stylesheets/elabs/style.scss +11 -1
  37. data/app/controllers/elabs/admin/admin_application_controller.rb +1 -1
  38. data/app/controllers/elabs/admin/admin_content_application_controller.rb +2 -2
  39. data/app/controllers/elabs/admin/languages_controller.rb +1 -1
  40. data/app/controllers/elabs/admin/licenses_controller.rb +1 -1
  41. data/app/controllers/elabs/admin/tags_controller.rb +1 -1
  42. data/app/controllers/elabs/admin/users_controller.rb +1 -1
  43. data/app/controllers/elabs/albums_controller.rb +1 -1
  44. data/app/controllers/elabs/articles_controller.rb +1 -1
  45. data/app/controllers/elabs/content_application_controller.rb +2 -1
  46. data/app/controllers/elabs/elabs_public_controller.rb +28 -8
  47. data/app/controllers/elabs/languages_controller.rb +1 -1
  48. data/app/controllers/elabs/licenses_controller.rb +1 -1
  49. data/app/controllers/elabs/member/albums_controller.rb +1 -1
  50. data/app/controllers/elabs/member/articles_controller.rb +1 -1
  51. data/app/controllers/elabs/member/markdown_previewer_controller.rb +11 -0
  52. data/app/controllers/elabs/member/member_content_application_controller.rb +2 -2
  53. data/app/controllers/elabs/member/notes_controller.rb +1 -1
  54. data/app/controllers/elabs/member/projects_controller.rb +1 -1
  55. data/app/controllers/elabs/member/uploads_controller.rb +1 -1
  56. data/app/controllers/elabs/notes_controller.rb +1 -1
  57. data/app/controllers/elabs/projects_controller.rb +1 -1
  58. data/app/controllers/elabs/tags_controller.rb +1 -6
  59. data/app/controllers/elabs/uploads_controller.rb +1 -1
  60. data/app/controllers/elabs/users_controller.rb +1 -1
  61. data/app/helpers/elabs/acts_helper.rb +2 -2
  62. data/app/helpers/elabs/application_helper.rb +30 -3
  63. data/app/helpers/elabs/content_helper.rb +9 -3
  64. data/app/helpers/elabs/content_renderer_helper.rb +118 -8
  65. data/app/helpers/elabs/rss_helper.rb +9 -0
  66. data/app/helpers/elabs/thumbnails_helper.rb +24 -19
  67. data/app/helpers/elabs/time_helper.rb +7 -1
  68. data/app/models/elabs/album.rb +2 -0
  69. data/app/models/elabs/application_content_record.rb +3 -0
  70. data/app/models/elabs/article.rb +2 -0
  71. data/app/models/elabs/concerns/actable_entity.rb +17 -2
  72. data/app/models/elabs/concerns/content_entity.rb +2 -2
  73. data/app/models/elabs/concerns/sluggable.rb +40 -0
  74. data/app/models/elabs/language.rb +8 -0
  75. data/app/models/elabs/license.rb +5 -0
  76. data/app/models/elabs/note.rb +2 -0
  77. data/app/models/elabs/project.rb +3 -0
  78. data/app/models/elabs/tag.rb +5 -0
  79. data/app/models/elabs/upload.rb +2 -0
  80. data/app/models/elabs/user.rb +10 -2
  81. data/app/views/elabs/acts/_act.rss.builder +22 -0
  82. data/app/views/elabs/acts/index.html.haml +5 -1
  83. data/app/views/elabs/acts/index.rss.builder +15 -0
  84. data/app/views/elabs/admin/albums/index.html.haml +4 -4
  85. data/app/views/elabs/admin/articles/index.html.haml +4 -4
  86. data/app/views/elabs/admin/languages/_form.html.haml +2 -1
  87. data/app/views/elabs/admin/licenses/_form.html.haml +2 -1
  88. data/app/views/elabs/admin/notes/index.html.haml +5 -5
  89. data/app/views/elabs/admin/projects/index.html.haml +4 -4
  90. data/app/views/elabs/admin/reports/index.html.haml +2 -2
  91. data/app/views/elabs/admin/tags/_form.html.haml +2 -1
  92. data/app/views/elabs/admin/uploads/index.html.haml +4 -4
  93. data/app/views/elabs/admin/users/index.html.haml +3 -3
  94. data/app/views/elabs/admin/users/show.html.haml +2 -2
  95. data/app/views/elabs/albums/_album.html.haml +1 -1
  96. data/app/views/elabs/albums/_album.rss.builder +7 -0
  97. data/app/views/elabs/albums/_album_inline.html.haml +8 -0
  98. data/app/views/elabs/albums/index.rss.builder +14 -0
  99. data/app/views/elabs/albums/show.html.haml +3 -3
  100. data/app/views/elabs/articles/_article.html.haml +1 -1
  101. data/app/views/elabs/articles/_article.rss.builder +7 -0
  102. data/app/views/elabs/articles/_article_inline.html.haml +8 -0
  103. data/app/views/elabs/articles/index.rss.builder +14 -0
  104. data/app/views/elabs/articles/show.html.haml +4 -4
  105. data/app/views/elabs/comments/_comments.html.haml +4 -3
  106. data/app/views/elabs/comments/_form.html.haml +18 -6
  107. data/app/views/elabs/languages/_associations.html.haml +15 -5
  108. data/app/views/elabs/layouts/_footer.html.haml +8 -1
  109. data/app/views/elabs/layouts/_hidden_entry.html.haml +4 -4
  110. data/app/views/elabs/layouts/_hidden_entry_full.html.haml +4 -4
  111. data/app/views/elabs/layouts/_hidden_entry_inline.html.haml +6 -0
  112. data/app/views/elabs/layouts/_shortcode_infinite_loop.html.haml +2 -0
  113. data/app/views/elabs/layouts/_shortcode_infinite_loop_inline.html.haml +2 -0
  114. data/app/views/elabs/layouts/_shortcode_missing_content.html.haml +2 -0
  115. data/app/views/elabs/layouts/_shortcode_missing_content_inline.html.haml +2 -0
  116. data/app/views/elabs/layouts/_shortcode_open_to_see.html.haml +2 -0
  117. data/app/views/elabs/layouts/admin_application.html.haml +2 -2
  118. data/app/views/elabs/layouts/application.html.haml +11 -3
  119. data/app/views/elabs/layouts/member_application.html.haml +5 -2
  120. data/app/views/elabs/layouts/widgets/_github_repo_card.html.haml +12 -0
  121. data/app/views/elabs/layouts/widgets/_github_repo_inline.html.haml +8 -0
  122. data/app/views/elabs/layouts/widgets/_github_user_card.html.haml +7 -0
  123. data/app/views/elabs/layouts/widgets/_gitlab_group_card.html.haml +11 -0
  124. data/app/views/elabs/layouts/widgets/_gitlab_repo_card.html.haml +12 -0
  125. data/app/views/elabs/layouts/widgets/_gitlab_repo_inline.html.haml +8 -0
  126. data/app/views/elabs/layouts/widgets/_gitlab_user_card.html.haml +11 -0
  127. data/app/views/elabs/layouts/widgets/vue/_all_widgets.html.haml +5 -0
  128. data/app/views/elabs/layouts/widgets/vue/_github_repo_card_vue.html.haml +72 -0
  129. data/app/views/elabs/layouts/widgets/vue/_github_user_card_vue.html.haml +64 -0
  130. data/app/views/elabs/layouts/widgets/vue/_gitlab_group_card_vue.html.haml +64 -0
  131. data/app/views/elabs/layouts/widgets/vue/_gitlab_repo_card_vue.html.haml +69 -0
  132. data/app/views/elabs/layouts/widgets/vue/_gitlab_user_card_vue.html.haml +99 -0
  133. data/app/views/elabs/licenses/_associations.html.haml +15 -5
  134. data/app/views/elabs/licenses/show.json.jbuilder +1 -1
  135. data/app/views/elabs/member/albums/_form.html.haml +12 -1
  136. data/app/views/elabs/member/albums/index.html.haml +4 -4
  137. data/app/views/elabs/member/articles/_form.html.haml +12 -1
  138. data/app/views/elabs/member/articles/index.html.haml +4 -4
  139. data/app/views/elabs/member/markdown_previewer/preview.json.jbuilder +2 -0
  140. data/app/views/elabs/member/notes/_form.html.haml +12 -1
  141. data/app/views/elabs/member/notes/index.html.haml +4 -4
  142. data/app/views/elabs/member/notifications/index.html.haml +1 -1
  143. data/app/views/elabs/member/preferences/_form.html.haml +2 -1
  144. data/app/views/elabs/member/projects/_form.html.haml +18 -2
  145. data/app/views/elabs/member/projects/_project.json.jbuilder +2 -0
  146. data/app/views/elabs/member/projects/index.html.haml +4 -4
  147. data/app/views/elabs/member/uploads/_form.html.haml +12 -1
  148. data/app/views/elabs/member/uploads/index.html.haml +6 -9
  149. data/app/views/elabs/member/users/_form.html.haml +2 -1
  150. data/app/views/elabs/notes/_note.html.haml +2 -2
  151. data/app/views/elabs/notes/_note.rss.builder +7 -0
  152. data/app/views/elabs/notes/_note_inline.haml +8 -0
  153. data/app/views/elabs/notes/index.rss.builder +14 -0
  154. data/app/views/elabs/notes/show.html.haml +3 -3
  155. data/app/views/elabs/projects/_associations.html.haml +12 -4
  156. data/app/views/elabs/projects/_project.html.haml +1 -1
  157. data/app/views/elabs/projects/_project.json.jbuilder +2 -0
  158. data/app/views/elabs/projects/_project.rss.builder +7 -0
  159. data/app/views/elabs/projects/_project_inline.html.haml +9 -0
  160. data/app/views/elabs/projects/index.rss.builder +14 -0
  161. data/app/views/elabs/projects/show.html.haml +20 -9
  162. data/app/views/elabs/reports/_form.html.haml +2 -1
  163. data/app/views/elabs/tags/_associations.html.haml +15 -5
  164. data/app/views/elabs/tags/index.html.haml +2 -0
  165. data/app/views/elabs/uploads/_preview.html.haml +1 -6
  166. data/app/views/elabs/uploads/_upload.rss.builder +7 -0
  167. data/app/views/elabs/uploads/_upload_inline.html.haml +8 -0
  168. data/app/views/elabs/uploads/index.rss.builder +14 -0
  169. data/app/views/elabs/uploads/show.html.haml +7 -8
  170. data/app/views/elabs/users/_associations.html.haml +15 -5
  171. data/app/views/elabs/users/_user.html.haml +24 -18
  172. data/app/views/elabs/users/_user_inline.html.haml +7 -0
  173. data/app/views/elabs/users/show.html.haml +2 -2
  174. data/config/brakeman.ignore +13 -111
  175. data/config/locales/en.yml +6 -0
  176. data/config/locales/fr.yml +6 -0
  177. data/config/routes.rb +30 -28
  178. data/db/migrate/20180917133442_add_urls_to_projects.rb +6 -0
  179. data/db/migrate/20181005105642_add_reason_to_acts.rb +5 -0
  180. data/db/migrate/20181006073541_add_slugs.rb +39 -0
  181. data/docs/migrating.md +51 -0
  182. data/docs/setup.md +1 -0
  183. data/lib/elabs.rb +5 -0
  184. data/lib/elabs/version.rb +1 -1
  185. data/lib/generators/elabs/install_generator.rb +1 -0
  186. data/lib/generators/elabs/views_generator.rb +0 -1
  187. data/lib/generators/templates/elabs.rb +4 -0
  188. data/lib/generators/templates/user_model.rb +6 -0
  189. data/locale/app.pot +129 -9
  190. data/locale/en/app.edit.po +127 -7
  191. data/locale/en/app.po +127 -7
  192. data/locale/fr/app.edit.po +130 -10
  193. data/locale/fr/app.po +129 -9
  194. metadata +59 -5
  195. data/app/assets/javascripts/elabs/application.js +0 -27
  196. data/app/assets/stylesheets/elabs/app/_nsfw.scss +0 -5
  197. data/lib/assets/javascripts/markdown-it-8.4.2.min.js +0 -1
@@ -127,7 +127,7 @@ readers do not read off random characters that represent icons */
127
127
  //.#{$fa-css-prefix}-broom:before { content: fa-content($fa-var-broom); }
128
128
  //.#{$fa-css-prefix}-brush:before { content: fa-content($fa-var-brush); }
129
129
  //.#{$fa-css-prefix}-btc:before { content: fa-content($fa-var-btc); }
130
- //.#{$fa-css-prefix}-bug:before { content: fa-content($fa-var-bug); }
130
+ .#{$fa-css-prefix}-bug:before { content: fa-content($fa-var-bug); }
131
131
  //.#{$fa-css-prefix}-building:before { content: fa-content($fa-var-building); }
132
132
  //.#{$fa-css-prefix}-bullhorn:before { content: fa-content($fa-var-bullhorn); }
133
133
  //.#{$fa-css-prefix}-bullseye:before { content: fa-content($fa-var-bullseye); }
@@ -214,8 +214,8 @@ readers do not read off random characters that represent icons */
214
214
  //.#{$fa-css-prefix}-cloudsmith:before { content: fa-content($fa-var-cloudsmith); }
215
215
  //.#{$fa-css-prefix}-cloudversify:before { content: fa-content($fa-var-cloudversify); }
216
216
  //.#{$fa-css-prefix}-cocktail:before { content: fa-content($fa-var-cocktail); }
217
- //.#{$fa-css-prefix}-code:before { content: fa-content($fa-var-code); }
218
- //.#{$fa-css-prefix}-code-branch:before { content: fa-content($fa-var-code-branch); }
217
+ .#{$fa-css-prefix}-code:before { content: fa-content($fa-var-code); }
218
+ .#{$fa-css-prefix}-code-branch:before { content: fa-content($fa-var-code-branch); }
219
219
  //.#{$fa-css-prefix}-codepen:before { content: fa-content($fa-var-codepen); }
220
220
  //.#{$fa-css-prefix}-codiepie:before { content: fa-content($fa-var-codiepie); }
221
221
  //.#{$fa-css-prefix}-coffee:before { content: fa-content($fa-var-coffee); }
@@ -333,7 +333,7 @@ readers do not read off random characters that represent icons */
333
333
  //.#{$fa-css-prefix}-euro-sign:before { content: fa-content($fa-var-euro-sign); }
334
334
  //.#{$fa-css-prefix}-exchange-alt:before { content: fa-content($fa-var-exchange-alt); }
335
335
  .#{$fa-css-prefix}-exclamation:before { content: fa-content($fa-var-exclamation); }
336
- //.#{$fa-css-prefix}-exclamation-circle:before { content: fa-content($fa-var-exclamation-circle); }
336
+ .#{$fa-css-prefix}-exclamation-circle:before { content: fa-content($fa-var-exclamation-circle); }
337
337
  //.#{$fa-css-prefix}-exclamation-triangle:before { content: fa-content($fa-var-exclamation-triangle); }
338
338
  //.#{$fa-css-prefix}-expand:before { content: fa-content($fa-var-expand); }
339
339
  //.#{$fa-css-prefix}-expand-arrows-alt:before { content: fa-content($fa-var-expand-arrows-alt); }
@@ -414,7 +414,7 @@ readers do not read off random characters that represent icons */
414
414
  //.#{$fa-css-prefix}-free-code-camp:before { content: fa-content($fa-var-free-code-camp); }
415
415
  //.#{$fa-css-prefix}-freebsd:before { content: fa-content($fa-var-freebsd); }
416
416
  //.#{$fa-css-prefix}-frog:before { content: fa-content($fa-var-frog); }
417
- //.#{$fa-css-prefix}-frown:before { content: fa-content($fa-var-frown); }
417
+ .#{$fa-css-prefix}-frown:before { content: fa-content($fa-var-frown); }
418
418
  //.#{$fa-css-prefix}-frown-open:before { content: fa-content($fa-var-frown-open); }
419
419
  //.#{$fa-css-prefix}-fulcrum:before { content: fa-content($fa-var-fulcrum); }
420
420
  //.#{$fa-css-prefix}-futbol:before { content: fa-content($fa-var-futbol); }
@@ -431,11 +431,11 @@ readers do not read off random characters that represent icons */
431
431
  //.#{$fa-css-prefix}-gift:before { content: fa-content($fa-var-gift); }
432
432
  //.#{$fa-css-prefix}-git:before { content: fa-content($fa-var-git); }
433
433
  //.#{$fa-css-prefix}-git-square:before { content: fa-content($fa-var-git-square); }
434
- //.#{$fa-css-prefix}-github:before { content: fa-content($fa-var-github); }
434
+ .#{$fa-css-prefix}-github:before { content: fa-content($fa-var-github); }
435
435
  //.#{$fa-css-prefix}-github-alt:before { content: fa-content($fa-var-github-alt); }
436
436
  //.#{$fa-css-prefix}-github-square:before { content: fa-content($fa-var-github-square); }
437
437
  //.#{$fa-css-prefix}-gitkraken:before { content: fa-content($fa-var-gitkraken); }
438
- //.#{$fa-css-prefix}-gitlab:before { content: fa-content($fa-var-gitlab); }
438
+ .#{$fa-css-prefix}-gitlab:before { content: fa-content($fa-var-gitlab); }
439
439
  //.#{$fa-css-prefix}-gitter:before { content: fa-content($fa-var-gitter); }
440
440
  //.#{$fa-css-prefix}-glass-martini:before { content: fa-content($fa-var-glass-martini); }
441
441
  //.#{$fa-css-prefix}-glass-martini-alt:before { content: fa-content($fa-var-glass-martini-alt); }
@@ -541,7 +541,7 @@ readers do not read off random characters that represent icons */
541
541
  //.#{$fa-css-prefix}-inbox:before { content: fa-content($fa-var-inbox); }
542
542
  //.#{$fa-css-prefix}-indent:before { content: fa-content($fa-var-indent); }
543
543
  //.#{$fa-css-prefix}-industry:before { content: fa-content($fa-var-industry); }
544
- //.#{$fa-css-prefix}-infinity:before { content: fa-content($fa-var-infinity); }
544
+ .#{$fa-css-prefix}-infinity:before { content: fa-content($fa-var-infinity); }
545
545
  .#{$fa-css-prefix}-info:before { content: fa-content($fa-var-info); }
546
546
  //.#{$fa-css-prefix}-info-circle:before { content: fa-content($fa-var-info-circle); }
547
547
  //.#{$fa-css-prefix}-instagram:before { content: fa-content($fa-var-instagram); }/* stylelint-disable */
@@ -805,7 +805,7 @@ readers do not read off random characters that represent icons */
805
805
  //.#{$fa-css-prefix}-rocket:before { content: fa-content($fa-var-rocket); }
806
806
  //.#{$fa-css-prefix}-rocketchat:before { content: fa-content($fa-var-rocketchat); }
807
807
  //.#{$fa-css-prefix}-rockrms:before { content: fa-content($fa-var-rockrms); }
808
- //.#{$fa-css-prefix}-rss:before { content: fa-content($fa-var-rss); }
808
+ .#{$fa-css-prefix}-rss:before { content: fa-content($fa-var-rss); }
809
809
  //.#{$fa-css-prefix}-rss-square:before { content: fa-content($fa-var-rss-square); }
810
810
  //.#{$fa-css-prefix}-ruble-sign:before { content: fa-content($fa-var-ruble-sign); }
811
811
  //.#{$fa-css-prefix}-ruler:before { content: fa-content($fa-var-ruler); }
@@ -887,7 +887,7 @@ readers do not read off random characters that represent icons */
887
887
  //.#{$fa-css-prefix}-spa:before { content: fa-content($fa-var-spa); }
888
888
  //.#{$fa-css-prefix}-space-shuttle:before { content: fa-content($fa-var-space-shuttle); }
889
889
  //.#{$fa-css-prefix}-speakap:before { content: fa-content($fa-var-speakap); }
890
- //.#{$fa-css-prefix}-spinner:before { content: fa-content($fa-var-spinner); }
890
+ .#{$fa-css-prefix}-spinner:before { content: fa-content($fa-var-spinner); }
891
891
  //.#{$fa-css-prefix}-splotch:before { content: fa-content($fa-var-splotch); }
892
892
  //.#{$fa-css-prefix}-spotify:before { content: fa-content($fa-var-spotify); }
893
893
  //.#{$fa-css-prefix}-spray-can:before { content: fa-content($fa-var-spray-can); }
@@ -897,7 +897,7 @@ readers do not read off random characters that represent icons */
897
897
  //.#{$fa-css-prefix}-stack-exchange:before { content: fa-content($fa-var-stack-exchange); }
898
898
  //.#{$fa-css-prefix}-stack-overflow:before { content: fa-content($fa-var-stack-overflow); }
899
899
  //.#{$fa-css-prefix}-stamp:before { content: fa-content($fa-var-stamp); }
900
- //.#{$fa-css-prefix}-star:before { content: fa-content($fa-var-star); }
900
+ .#{$fa-css-prefix}-star:before { content: fa-content($fa-var-star); }
901
901
  //.#{$fa-css-prefix}-star-half:before { content: fa-content($fa-var-star-half); }
902
902
  //.#{$fa-css-prefix}-star-half-alt:before { content: fa-content($fa-var-star-half-alt); }
903
903
  //.#{$fa-css-prefix}-staylinked:before { content: fa-content($fa-var-staylinked); }
@@ -27,6 +27,14 @@ $font-family-monospace : consolas, courier, monospace; // font for code and samp
27
27
  $font-size-base : 1.6rem !default;
28
28
 
29
29
  $font-sizes: (
30
+ smaller: (
31
+ mobile : 1rem,
32
+ desktop : 1.2rem
33
+ ),
34
+ small: (
35
+ mobile : 1.2rem,
36
+ desktop : 1.4rem
37
+ ),
30
38
  base: (
31
39
  mobile : 1.4rem,
32
40
  desktop : $font-size-base
@@ -200,8 +208,8 @@ $variants-list: (
200
208
  (show, $color-primary, $white, none),
201
209
  (edit, $color-primary, $white, none),
202
210
  (success, $color-success, $white, none),
203
- (info, $color-info, $black, none),
204
- (notice, $color-info, $black, none),
211
+ (info, $color-info, $white, none),
212
+ (notice, $color-info, $white, none),
205
213
  (warning, $color-warning, $black, none),
206
214
  (lock, $color-warning, $black, none),
207
215
  (danger, $color-danger, $white, none),
@@ -8,6 +8,7 @@
8
8
  @import 'app/mixins/classifier-card';
9
9
  @import 'app/mixins/content-card';
10
10
  @import 'app/mixins/content-full';
11
+ @import 'app/mixins/content-inline';
11
12
  @import 'app/mixins/icon';
12
13
 
13
14
  /* ------------------
@@ -41,6 +42,7 @@
41
42
  @import 'app/buttons';
42
43
  @import 'app/comments';
43
44
  @import 'app/content';
45
+ @import 'app/content_statuses';
44
46
  @import 'app/content_uploads';
45
47
  @import 'app/empty';
46
48
  @import 'app/errors';
@@ -52,13 +54,17 @@
52
54
  @import 'app/link-to-top';
53
55
  @import 'app/medias';
54
56
  @import 'app/modals';
55
- @import 'app/nsfw';
56
57
  @import 'app/pagination';
58
+ @import 'app/tables';
57
59
  @import 'app/tabs';
58
60
  @import 'app/tags';
59
61
  @import 'app/toolbars';
62
+ @import 'app/typo';
60
63
  @import 'app/users';
61
64
 
65
+ // Widgets
66
+ @import 'app/widgets/git-cards';
67
+
62
68
  // Admin zone
63
69
  @import 'app/admin-members/forms';
64
70
  @import 'app/admin-members/indexes';
@@ -71,3 +77,7 @@
71
77
 
72
78
  // Overrides
73
79
  @import 'lib/codemirror';
80
+ @import 'lib/hljs';
81
+
82
+ // Fixes
83
+ @import 'fixes';
@@ -12,7 +12,7 @@ module Elabs
12
12
 
13
13
  def authenticate_admin!
14
14
  authenticate_user!
15
- redirect_to user_url(current_user.id), status: :unauthorized unless current_user.admin?
15
+ redirect_to user_url(current_user), status: :unauthorized unless current_user.admin?
16
16
  end
17
17
  end
18
18
  end
@@ -47,8 +47,8 @@ module Elabs
47
47
 
48
48
  # Use callbacks to share common setup or constraints between actions.
49
49
  def set_entity
50
- id = params[:id] || params["#{self.class::SINGULAR_NAME}_id"]
51
- @entity = self.class::MODEL.find(id)
50
+ slug = params[:slug] || params["#{self.class::SINGULAR_NAME}_slug"]
51
+ @entity = self.class::MODEL.find_by_slug(slug)
52
52
  create_instance_variable self.class::SINGULAR_NAME
53
53
  end
54
54
 
@@ -65,7 +65,7 @@ module Elabs
65
65
 
66
66
  # Use callbacks to share common setup or constraints between actions.
67
67
  def set_language
68
- @language = Language.find(params[:id])
68
+ @language = Language.find_by_iso639_1(params[:iso639_1])
69
69
  end
70
70
 
71
71
  # Never trust parameters from the scary internet, only allow the white list through.
@@ -65,7 +65,7 @@ module Elabs
65
65
 
66
66
  # Use callbacks to share common setup or constraints between actions.
67
67
  def set_license
68
- @license = License.find(params[:id])
68
+ @license = License.find_by_slug(params[:slug])
69
69
  end
70
70
 
71
71
  # Never trust parameters from the scary internet, only allow the white list through.
@@ -44,7 +44,7 @@ module Elabs
44
44
 
45
45
  # Use callbacks to share common setup or constraints between actions.
46
46
  def set_tag
47
- @tag = Tag.find(params[:id])
47
+ @tag = Tag.find_by_slug(params[:slug])
48
48
  end
49
49
 
50
50
  # Never trust parameters from the scary internet, only allow the white list through.
@@ -31,7 +31,7 @@ module Elabs
31
31
 
32
32
  # Use callbacks to share common setup or constraints between actions.
33
33
  def set_admin_user
34
- @user = User.find(params[:id])
34
+ @user = User.find_by_username(params[:username])
35
35
  end
36
36
 
37
37
  # Never trust parameters from the scary internet, only allow the white list through.
@@ -19,7 +19,7 @@ module Elabs
19
19
 
20
20
  # Use callbacks to share common setup or constraints between actions.
21
21
  def set_album
22
- @album = Album.find_publicly_visible(params[:id])
22
+ @album = Album.find_publicly_visible(params[:slug])
23
23
  @album_uploads = @album.uploads.for_relation
24
24
  end
25
25
  end
@@ -19,7 +19,7 @@ module Elabs
19
19
 
20
20
  # Use callbacks to share common setup or constraints between actions.
21
21
  def set_article
22
- @article = Article.find_publicly_visible(params[:id])
22
+ @article = Article.find_publicly_visible(params[:slug])
23
23
  end
24
24
  end
25
25
  end
@@ -36,7 +36,8 @@ module Elabs
36
36
  def build_comment
37
37
  @comment = Comment.new(comment_params)
38
38
  params.each do |key, value|
39
- @comment.content_id = value if %w[album_id article_id note_id project_id upload_id].include? key
39
+ # find the content by slug if needed
40
+ @comment.content_id = find_related_id_by_slug(key.chomp('_slug'), 'slug', value) if %w[album_slug article_slug note_slug project_slug upload_slug].include? key
40
41
  end
41
42
  @comment.content_type = params[:controller].classify
42
43
  @comment.user = current_user if user_signed_in?
@@ -25,11 +25,12 @@ module Elabs
25
25
 
26
26
  params.each do |p|
27
27
  # No need to do this with "album_id" as there is no action requiring it (as for a /albums/xxx/uploads)
28
- next unless %w[tag_id project_id].include? p[0]
28
+ next unless %w[tag_slug project_slug].include? p[0]
29
29
 
30
- foreign_table = p[0].chomp('_id').pluralize.to_sym
30
+ foreign_table = p[0].chomp('_slug').pluralize.to_sym
31
31
  orm_request = orm_request.joins(foreign_table)
32
- where_clauses[foreign_table] = { id: p[1] }
32
+ id = find_related_id_by_slug(p[0].chomp('_slug'), 'slug', p[1])
33
+ where_clauses[foreign_table] = { id: id }
33
34
  next
34
35
  end
35
36
 
@@ -37,11 +38,14 @@ module Elabs
37
38
  end
38
39
 
39
40
  def build_request_where(orm_request)
40
- allowed_scopes_ids = self.class::ALLOWED_NESTED_FROM.map { |n| "#{n}_id" }
41
- clean_list = allowed_scopes_ids.reject { |s| %w[tag_id project_id].include? s }
42
-
43
- params.each do |p|
44
- orm_request = orm_request.where(p[0] => p[1]) if clean_list.include? p[0]
41
+ nested_resource_fields = extract_nested_resource_fields_from_params
42
+
43
+ # Find nested resources filters in request params
44
+ nested_resource_fields.each do |field, details|
45
+ nested_param_value = params[field]
46
+ # Find Id from slug
47
+ id = find_related_id_by_slug(details[:type], details[:slug_field], nested_param_value)
48
+ orm_request = orm_request.where("#{details[:type]}_id" => id)
45
49
  end
46
50
 
47
51
  orm_request
@@ -76,5 +80,21 @@ module Elabs
76
80
  end
77
81
  orm_request
78
82
  end
83
+
84
+ def find_related_id_by_slug(type, slug_field, slug_value)
85
+ "Elabs::#{type.classify}".constantize.select(:id).find_by(slug_field => slug_value).id
86
+ end
87
+
88
+ def extract_nested_resource_fields_from_params
89
+ slug_parameters = {}
90
+ self.class::ALLOWED_NESTED_FROM.each do |n|
91
+ model = "Elabs::#{n.classify}".constantize
92
+ slug_field = model.const_defined?(:SLUG_FIELD) ? model::SLUG_FIELD : :id
93
+ slug_parameters["#{n}_#{slug_field}"] = { type: n, slug_field: slug_field }
94
+ end
95
+ # Remove HABTM possible nesting as they are handled in another place
96
+ # and slug fields that are not present in params
97
+ slug_parameters.reject { |field| %w[tag_slug project_slug].include?(field) || !params.include?(field) }
98
+ end
79
99
  end
80
100
  end
@@ -30,7 +30,7 @@ module Elabs
30
30
 
31
31
  # Use callbacks to share common setup or constraints between actions.
32
32
  def set_language
33
- @language = Language.find(params[:id])
33
+ @language = Language.find_by_iso639_1(params[:iso639_1])
34
34
  end
35
35
  end
36
36
  end
@@ -25,7 +25,7 @@ module Elabs
25
25
 
26
26
  # Use callbacks to share common setup or constraints between actions.
27
27
  def set_license
28
- @license = License.find(params[:id])
28
+ @license = License.find_by_slug(params[:slug])
29
29
  end
30
30
  end
31
31
  end
@@ -1,7 +1,7 @@
1
1
  module Elabs
2
2
  module Member
3
3
  class AlbumsController < MemberContentApplicationController
4
- ALLOWED_FIELDS = %i[name description sfw published hidden_in_history language_id license_id tags_list].freeze
4
+ ALLOWED_FIELDS = %i[name description sfw published hidden_in_history language_id license_id tags_list minor_update update_description].freeze
5
5
  ALLOWED_RELATIONS = { project_ids: [], upload_ids: [] }.freeze
6
6
  MODEL = Album
7
7
  PLURAL_NAME = 'albums'.freeze
@@ -1,7 +1,7 @@
1
1
  module Elabs
2
2
  module Member
3
3
  class ArticlesController < MemberContentApplicationController
4
- ALLOWED_FIELDS = %i[title excerpt content sfw published published_at hidden_in_history license_id language_id tags_list].freeze
4
+ ALLOWED_FIELDS = %i[title excerpt content sfw published published_at hidden_in_history license_id language_id tags_list minor_update update_description].freeze
5
5
  ALLOWED_RELATIONS = { project_ids: [] }.freeze
6
6
  MODEL = Article
7
7
  PLURAL_NAME = 'articles'.freeze
@@ -0,0 +1,11 @@
1
+ module Elabs
2
+ module Member
3
+ class MarkdownPreviewerController < ElabsApplicationController
4
+ self.allow_forgery_protection = false
5
+
6
+ def preview
7
+ render locals: { text: params['text'] }
8
+ end
9
+ end
10
+ end
11
+ end
@@ -97,8 +97,8 @@ module Elabs
97
97
 
98
98
  # Use callbacks to share common setup or constraints between actions.
99
99
  def set_entity
100
- id = params[:id] || params["#{self.class::SINGULAR_NAME}_id"]
101
- @entity = self.class::MODEL.by_member(current_user.id).find(id)
100
+ slug = params[:slug] || params["#{self.class::SINGULAR_NAME}_slug"]
101
+ @entity = self.class::MODEL.by_member(current_user.id).find_by_slug(slug)
102
102
  create_instance_variable self.class::SINGULAR_NAME
103
103
  end
104
104
 
@@ -1,7 +1,7 @@
1
1
  module Elabs
2
2
  module Member
3
3
  class NotesController < MemberContentApplicationController
4
- ALLOWED_FIELDS = %i[content sfw hidden_in_history published license_id language_id tags_list].freeze
4
+ ALLOWED_FIELDS = %i[content sfw hidden_in_history published license_id language_id tags_list minor_update update_description].freeze
5
5
  ALLOWED_RELATIONS = { project_ids: [] }.freeze
6
6
  MODEL = Note
7
7
  PLURAL_NAME = 'notes'.freeze
@@ -1,7 +1,7 @@
1
1
  module Elabs
2
2
  module Member
3
3
  class ProjectsController < MemberContentApplicationController
4
- ALLOWED_FIELDS = %i[name short_description description main_url sfw published hidden_in_history license_id language_id tags_list].freeze
4
+ ALLOWED_FIELDS = %i[name short_description description main_url sources_url docs_url sfw published hidden_in_history license_id language_id tags_list minor_update update_description].freeze
5
5
  ALLOWED_RELATIONS = {}.freeze
6
6
  MODEL = Project
7
7
  PLURAL_NAME = 'projects'.freeze
@@ -1,7 +1,7 @@
1
1
  module Elabs
2
2
  module Member
3
3
  class UploadsController < MemberContentApplicationController
4
- ALLOWED_FIELDS = %i[title description sfw published hidden_in_history language_id license_id file tags_list].freeze
4
+ ALLOWED_FIELDS = %i[title description sfw published hidden_in_history language_id license_id file tags_list minor_update update_description].freeze
5
5
  ALLOWED_RELATIONS = { album_ids: [], project_ids: [] }.freeze
6
6
  MODEL = Upload
7
7
  PLURAL_NAME = 'uploads'.freeze
@@ -19,7 +19,7 @@ module Elabs
19
19
 
20
20
  # Use callbacks to share common setup or constraints between actions.
21
21
  def set_note
22
- @note = Note.find_publicly_visible(params[:id])
22
+ @note = Note.find_publicly_visible(params[:slug])
23
23
  end
24
24
  end
25
25
  end
@@ -24,7 +24,7 @@ module Elabs
24
24
 
25
25
  # Use callbacks to share common setup or constraints between actions.
26
26
  def set_project
27
- @project = Project.find_publicly_visible(params[:id])
27
+ @project = Project.find_publicly_visible(params[:slug])
28
28
  end
29
29
  end
30
30
  end
@@ -25,12 +25,7 @@ module Elabs
25
25
 
26
26
  # Use callbacks to share common setup or constraints between actions.
27
27
  def set_tag
28
- @tag = Tag.find(params[:id])
29
- end
30
-
31
- # Never trust parameters from the scary internet, only allow the white list through.
32
- def tag_params
33
- params.require(:tag).permit(:name)
28
+ @tag = Tag.find_by_slug(params[:slug])
34
29
  end
35
30
  end
36
31
  end
@@ -18,7 +18,7 @@ module Elabs
18
18
 
19
19
  # Use callbacks to share common setup or constraints between actions.
20
20
  def set_upload
21
- @upload = Upload.find_publicly_visible(params[:id])
21
+ @upload = Upload.find_publicly_visible(params[:slug])
22
22
  end
23
23
  end
24
24
  end
@@ -25,7 +25,7 @@ module Elabs
25
25
 
26
26
  # Use callbacks to share common setup or constraints between actions.
27
27
  def set_user
28
- @user = User.find(params[:id])
28
+ @user = User.find_by_username(params[:username])
29
29
  end
30
30
 
31
31
  # Never trust parameters from the scary internet, only allow the white list through.