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
@@ -34,7 +34,8 @@
34
34
  .field-hint= format(_('Your picture should be in "png" or "jpg", preferably a square of 512px.'))
35
35
 
36
36
  .actions
37
- = f.submit _('Save'), class: 'btn btn--save'
37
+ .actions-buttons
38
+ = f.submit _('Save'), class: 'btn btn--save'
38
39
 
39
40
  = render 'elabs/member/layouts/markdown-preview'
40
41
 
@@ -7,7 +7,7 @@
7
7
  .headers
8
8
  %ul.informations
9
9
  %li
10
- = icon('link', ['fw'])
10
+ = icon('permalink', ['fw'])
11
11
  = link_to _('Permalink'), note, class: 'title'
12
12
  %li
13
13
  = icon('user', ['fw'])
@@ -28,4 +28,4 @@
28
28
  %li= render 'elabs/layouts/lists/projects', projects: note.projects
29
29
  %li= render 'elabs/layouts/lists/tags', tags: note.tags
30
30
 
31
- %article{ lang: note.language.iso639_1 }= markdown note.content
31
+ %article{ lang: note.language.iso639_1 }= render_entity_content note, :content, true
@@ -0,0 +1,7 @@
1
+ builder.item do
2
+ builder.title rss_title(note, 'published_at')
3
+ builder.description note.content
4
+ builder.pubDate note.published_at.to_s(:rfc822)
5
+ builder.link note_url(note)
6
+ builder.guid note_url(note)
7
+ end
@@ -0,0 +1,8 @@
1
+ - if !show_item? note
2
+ = render 'elabs/layouts/hidden_entry_inline', entity: note
3
+ - else
4
+ %span.note.note--inline
5
+ = icon 'sticky-note', ['fw']
6
+ = link_to format(_('Note #%<id>i'), id: note.id), note
7
+ - if note.language.iso639_1 != locale
8
+ (#{note.language.iso639_1})
@@ -0,0 +1,14 @@
1
+ xml.instruct! :xml, version: '1.0'
2
+ xml.rss version: '2.0' do
3
+ xml.channel do
4
+ xml.title "#{Elabs.site_name} - notes"
5
+ xml.description "Last #{params['show_nsfw'] == 'false' ? 'SFW' : ''} notes from #{Elabs.site_name}"
6
+ xml.link notes_url
7
+
8
+ @notes.each do |note|
9
+ next if params['show_nsfw'] == 'false' && !note.sfw
10
+
11
+ render 'note', builder: xml, note: note
12
+ end
13
+ end
14
+ end
@@ -13,11 +13,11 @@
13
13
  %li
14
14
  = icon('calendar-check', ['fw'])
15
15
  %b= _('Published at:')
16
- = short_date @note.published_at
16
+ = medium_datetime @note.published_at
17
17
  %li
18
18
  = icon('calendar', ['fw'])
19
19
  %b= _('Updated at:')
20
- = short_date @note.updated_at
20
+ = medium_datetime @note.updated_at
21
21
  %li.separator
22
22
  = icon('info', ['fw'])
23
23
  %b= _('SFW:')
@@ -36,7 +36,7 @@
36
36
 
37
37
  .content
38
38
  %article{ lang: @note.language.iso639_1 }
39
- = markdown @note.content
39
+ = render_entity_content @note, :content
40
40
 
41
41
  = render 'elabs/comments/comments',
42
42
  entity: @note,
@@ -1,13 +1,21 @@
1
1
  %aside.tabs
2
2
  %ul.tabs__tabs-list
3
3
  %li.tabs__tabs-list__tab#tab-albums
4
- %a{ href: '#tab-content-albums', onclick: 'selectTab(event, "albums")' }= _('Albums')
4
+ %a{ href: '#tab-content-albums', onclick: 'selectTab(event, "albums")' }
5
+ = _('Albums')
6
+ %span.badge.badge--notification= project.albums_count
5
7
  %li.tabs__tabs-list__tab#tab-articles
6
- %a{ href: '#tab-content-articles', onclick: 'selectTab(event, "articles")' }= _('Articles')
8
+ %a{ href: '#tab-content-articles', onclick: 'selectTab(event, "articles")' }
9
+ = _('Articles')
10
+ %span.badge.badge--notification= project.articles_count
7
11
  %li.tabs__tabs-list__tab#tab-notes
8
- %a{ href: '#tab-content-notes', onclick: 'selectTab(event, "notes")' }= _('Notes')
12
+ %a{ href: '#tab-content-notes', onclick: 'selectTab(event, "notes")' }
13
+ = _('Notes')
14
+ %span.badge.badge--notification= project.notes_count
9
15
  %li.tabs__tabs-list__tab#tab-uploads
10
- %a{ href: '#tab-content-uploads', onclick: 'selectTab(event, "uploads")' }= _('Uploads')
16
+ %a{ href: '#tab-content-uploads', onclick: 'selectTab(event, "uploads")' }
17
+ = _('Uploads')
18
+ %span.badge.badge--notification= project.uploads_count
11
19
 
12
20
  %section.tabs__tab-content.albums-list#tab-content-albums
13
21
  .tabs__tab-content__title
@@ -26,4 +26,4 @@
26
26
  = boolean_icon_tag project.sfw, 'is-sfw', 'is-nsfw'
27
27
  %li= render 'elabs/layouts/lists/tags', tags: project.tags
28
28
 
29
- %article{ lang: project.language.iso639_1 }= markdown project.short_description
29
+ %article{ lang: project.language.iso639_1 }= render_entity_content project, :short_description, false
@@ -4,6 +4,8 @@ json.extract! project,
4
4
  :short_description,
5
5
  :description,
6
6
  :main_url,
7
+ :sources_url,
8
+ :docs_url,
7
9
  :sfw,
8
10
  :albums_count,
9
11
  :articles_count,
@@ -0,0 +1,7 @@
1
+ builder.item do
2
+ builder.title rss_title(project, 'name')
3
+ builder.description "#{project.short_description}\n\n#{project.description}"
4
+ builder.pubDate project.published_at.to_s(:rfc822)
5
+ builder.link project_url(project)
6
+ builder.guid project_url(project)
7
+ end
@@ -0,0 +1,9 @@
1
+ - if !show_item? project
2
+ = render 'elabs/layouts/hidden_entry_inline', entity: project
3
+ - else
4
+ %span.project.project--inline
5
+ = icon 'cog', ['fw']
6
+ = link_to project.name, project, lang: project.language.iso639_1
7
+ - if project.language.iso639_1 != locale
8
+ (#{project.language.iso639_1})
9
+
@@ -0,0 +1,14 @@
1
+ xml.instruct! :xml, version: '1.0'
2
+ xml.rss version: '2.0' do
3
+ xml.channel do
4
+ xml.title "#{Elabs.site_name} - projects"
5
+ xml.description "Last #{params['show_nsfw'] == 'false' ? 'SFW' : ''} projects from #{Elabs.site_name}"
6
+ xml.link projects_url
7
+
8
+ @projects.each do |project|
9
+ next if params['show_nsfw'] == 'false' && !project.sfw
10
+
11
+ render 'project', builder: xml, project: project
12
+ end
13
+ end
14
+ end
@@ -10,19 +10,30 @@
10
10
  = icon('user', ['fw'])
11
11
  %strong= _('Creator:')
12
12
  = link_to @project.user.display_name, @project.user
13
- - if @project.main_url.present?
14
- %li
15
- = icon('home', ['fw'])
16
- %strong= _('Main url:')
17
- = @project.main_url
18
13
  %li
19
14
  = icon('calendar-check', ['fw'])
20
15
  %strong= _('Published at:')
21
- = short_date @project.published_at
16
+ = medium_datetime @project.published_at
22
17
  %li
23
18
  = icon('calendar', ['fw'])
24
19
  %strong= _('Updated at:')
25
- = short_date @project.updated_at
20
+ = medium_datetime @project.updated_at
21
+
22
+ - if @project.main_url.present?
23
+ %li.separator
24
+ = icon('home', ['fw'])
25
+ %strong= _('Home page:')
26
+ = @project.main_url
27
+ - if @project.sources_url.present?
28
+ %li{ class: @project.main_url.present? ? '' : 'separator' }
29
+ = icon('code', ['fw'])
30
+ %strong= _('Sources:')
31
+ = @project.sources_url
32
+ - if @project.docs_url.present?
33
+ %li{ class: @project.main_url.present? || @project.sources_url.present? ? '' : 'separator' }
34
+ = icon('book', ['fw'])
35
+ %strong= _('Documentation:')
36
+ = @project.docs_url
26
37
 
27
38
  %li.separator
28
39
  = icon('info', ['fw'])
@@ -58,8 +69,8 @@
58
69
 
59
70
  .content
60
71
  %article{ lang: @project.language.iso639_1 }
61
- = markdown @project.short_description
62
- = markdown @project.description
72
+ = render_entity_content @project, :short_description
73
+ = render_entity_content @project, :description
63
74
 
64
75
  = render 'associations',
65
76
  project: @project,
@@ -26,4 +26,5 @@
26
26
  .field-input= f.text_area :reason
27
27
 
28
28
  .actions
29
- = f.submit _('Save'), class: 'btn btn--save'
29
+ .actions-buttons
30
+ = f.submit _('Save'), class: 'btn btn--save'
@@ -1,15 +1,25 @@
1
1
  %aside.tabs
2
2
  %ul.tabs__tabs-list
3
3
  %li.tabs__tabs-list__tab#tab-albums
4
- %a{ href: '#tab-content-albums', onclick: 'selectTab(event, "albums")' }= _('Albums')
4
+ %a{ href: '#tab-content-albums', onclick: 'selectTab(event, "albums")' }
5
+ = _('Albums')
6
+ .badge.badge--notification= tag.albums_count
5
7
  %li.tabs__tabs-list__tab#tab-articles
6
- %a{ href: '#tab-content-articles', onclick: 'selectTab(event, "articles")' }= _('Articles')
8
+ %a{ href: '#tab-content-articles', onclick: 'selectTab(event, "articles")' }
9
+ = _('Articles')
10
+ .badge.badge--notification= tag.articles_count
7
11
  %li.tabs__tabs-list__tab#tab-notes
8
- %a{ href: '#tab-content-notes', onclick: 'selectTab(event, "notes")' }= _('Notes')
12
+ %a{ href: '#tab-content-notes', onclick: 'selectTab(event, "notes")' }
13
+ = _('Notes')
14
+ .badge.badge--notification= tag.notes_count
9
15
  %li.tabs__tabs-list__tab#tab-projects
10
- %a{ href: '#tab-content-projects', onclick: 'selectTab(event, "projects")' }= _('Projects')
16
+ %a{ href: '#tab-content-projects', onclick: 'selectTab(event, "projects")' }
17
+ = _('Projects')
18
+ .badge.badge--notification= tag.projects_count
11
19
  %li.tabs__tabs-list__tab#tab-uploads
12
- %a{ href: '#tab-content-uploads', onclick: 'selectTab(event, "uploads")' }= _('Uploads')
20
+ %a{ href: '#tab-content-uploads', onclick: 'selectTab(event, "uploads")' }
21
+ = _('Uploads')
22
+ .badge.badge--notification= tag.uploads_count
13
23
 
14
24
  %section.tabs__tab-content.albums-list#tab-content-albums
15
25
  .tabs__tab-content__title
@@ -1,5 +1,7 @@
1
1
  - @page_title = _('Tags list')
2
2
 
3
+ = render 'elabs/layouts/empty' if @tags.length.zero?
4
+
3
5
  .tags-list
4
6
  - @tags.each do |tag|
5
7
  .tag.tag-card
@@ -4,12 +4,7 @@
4
4
  = image_tag 'preview_placeholder_nsfw.png'
5
5
  - else
6
6
  = link_to upload_url(upload) do
7
- - if upload.file.variable?
8
- = image_tag main_app.url_for(upload.file.variant(thumbnail_center_crop_properties).processed)
9
- - elsif upload.file.previewable?
10
- = image_tag main_app.url_for(upload.file.preview(thumbnail_center_crop_properties).processed)
11
- - else
12
- = image_tag thumbnail_preview_placeholder_file
7
+ = image_tag thumbnail_center_crop(upload.file)
13
8
  .content
14
9
  .upload__title `#{upload.title} (#{upload.file.content_type})`
15
10
  = link_to main_app.url_for(upload.file), class: 'action' do
@@ -0,0 +1,7 @@
1
+ builder.item do
2
+ builder.title rss_title(upload, 'title')
3
+ builder.description upload.description
4
+ builder.pubDate upload.published_at.to_s(:rfc822)
5
+ builder.link upload_url(upload)
6
+ builder.guid upload_url(upload)
7
+ end
@@ -0,0 +1,8 @@
1
+ - if !show_item? upload
2
+ = render 'elabs/layouts/hidden_entry_inline', entity: upload
3
+ - else
4
+ %span.upload.upload--inline
5
+ = image_tag thumbnail_center_crop(upload.file, :small), class: 'icon'
6
+ = link_to upload.title, upload
7
+ - if upload.language.iso639_1 != locale
8
+ (#{upload.language.iso639_1})
@@ -0,0 +1,14 @@
1
+ xml.instruct! :xml, version: '1.0'
2
+ xml.rss version: '2.0' do
3
+ xml.channel do
4
+ xml.title "#{Elabs.site_name} - uploads"
5
+ xml.description "Last #{params['show_nsfw'] == 'false' ? 'SFW' : ''} uploads from #{Elabs.site_name}"
6
+ xml.link uploads_url
7
+
8
+ @uploads.each do |upload|
9
+ next if params['show_nsfw'] == 'false' && !upload.sfw
10
+
11
+ render 'upload', builder: xml, upload: upload
12
+ end
13
+ end
14
+ end
@@ -13,11 +13,11 @@
13
13
  %li
14
14
  = icon('calendar-check', ['fw'])
15
15
  %b= _('Published at:')
16
- = short_date @upload.published_at
16
+ = medium_datetime @upload.published_at
17
17
  %li
18
18
  = icon('calendar', ['fw'])
19
19
  %b= _('Updated at:')
20
- = short_date @upload.updated_at
20
+ = medium_datetime @upload.updated_at
21
21
  %li
22
22
  = icon('font', ['fw'])
23
23
  %b= _('Original name:')
@@ -51,13 +51,12 @@
51
51
 
52
52
  .content
53
53
  %article{ lang: @upload.language.iso639_1 }
54
- = markdown @upload.description
55
- - if @upload.file.variable?
56
- = image_tag main_app.url_for(@upload.file.variant(image_resize_properties).processed), class: 'thumbnail'
57
- - elsif playable? @upload.file
54
+ = render_entity_content @upload, :description
55
+ - if playable? @upload.file
58
56
  = render 'player', file: @upload.file
59
- - elsif @upload.file.previewable?
60
- = image_tag main_app.url_for(@upload.file.preview(image_resize_properties).processed), class: 'thumbnail'
57
+ - elsif @upload.file.representable?
58
+ = image_tag main_app.url_for(@upload.file.representation(image_resize_properties).processed),
59
+ class: 'thumbnail'
61
60
  - else
62
61
  = image_tag main_app.url_for(thumbnail_preview_placeholder_file), class: 'thumbnail'
63
62
 
@@ -1,15 +1,25 @@
1
1
  %aside.tabs
2
2
  %ul.tabs__tabs-list
3
3
  %li.tabs__tabs-list__tab#tab-albums
4
- %a{ href: '#tab-content-albums', onclick: 'selectTab(event, "albums")' }= _('Albums')
4
+ %a{ href: '#tab-content-albums', onclick: 'selectTab(event, "albums")' }
5
+ = _('Albums')
6
+ %span.badge.badge--notification= user.albums_count
5
7
  %li.tabs__tabs-list__tab#tab-articles
6
- %a{ href: '#tab-content-articles', onclick: 'selectTab(event, "articles")' }= _('Articles')
8
+ %a{ href: '#tab-content-articles', onclick: 'selectTab(event, "articles")' }
9
+ = _('Articles')
10
+ %span.badge.badge--notification= user.articles_count
7
11
  %li.tabs__tabs-list__tab#tab-notes
8
- %a{ href: '#tab-content-notes', onclick: 'selectTab(event, "notes")' }= _('Notes')
12
+ %a{ href: '#tab-content-notes', onclick: 'selectTab(event, "notes")' }
13
+ = _('Notes')
14
+ %span.badge.badge--notification= user.notes_count
9
15
  %li.tabs__tabs-list__tab#tab-projects
10
- %a{ href: '#tab-content-projects', onclick: 'selectTab(event, "projects")' }= _('Projects')
16
+ %a{ href: '#tab-content-projects', onclick: 'selectTab(event, "projects")' }
17
+ = _('Projects')
18
+ %span.badge.badge--notification= user.projects_count
11
19
  %li.tabs__tabs-list__tab#tab-uploads
12
- %a{ href: '#tab-content-uploads', onclick: 'selectTab(event, "uploads")' }= _('Uploads')
20
+ %a{ href: '#tab-content-uploads', onclick: 'selectTab(event, "uploads")' }
21
+ = _('Uploads')
22
+ %span.badge.badge--notification= user.uploads_count
13
23
 
14
24
  %section.tabs__tab-content.albums-list#tab-content-albums
15
25
  .tabs__tab-content__title
@@ -2,37 +2,43 @@
2
2
  %header
3
3
  .icon
4
4
  - if Elabs.use_avatars && user.avatar.attached?
5
- = image_tag main_app.url_for(avatar_image(user.avatar, :small).processed)
5
+ = image_tag avatar_image(user.avatar, :small)
6
6
  - else
7
7
  = icon 'user', %w[3x fw]
8
8
  .headers
9
9
  %h3= link_to user.display_name, user, class: 'title'
10
10
 
11
11
  %ul.informations
12
- - if user.real_name
12
+ - if user.real_name.present?
13
13
  %li
14
14
  %b @#{user.username}
15
+ %ul.informations
15
16
  %li
16
17
  %b= _('Role:')
17
18
  = user.role
18
-
19
19
  %li
20
20
  %b= _('Since:')
21
21
  = short_date user.created_at
22
22
 
23
23
  .content
24
- = link_to user_projects_path(user), class: 'btn btn--block' do
25
- = icon 'cog'
26
- = format(n_('%<nb>i project', '%<nb>i projects', user.projects_count), nb: user.projects_count)
27
- = link_to user_articles_path(user), class: 'btn btn--block' do
28
- = icon 'font'
29
- = format(n_('%<nb>i article', '%<nb>i articles', user.articles_count), nb: user.articles_count)
30
- = link_to user_notes_path(user), class: 'btn btn--block' do
31
- = icon 'sticky-note'
32
- = format(n_('%<nb>i note', '%<nb>i notes', user.notes_count), nb: user.notes_count)
33
- = link_to user_uploads_path(user), class: 'btn btn--block' do
34
- = icon 'image'
35
- = format(n_('%<nb>i upload', '%<nb>i uploads', user.uploads_count), nb: user.uploads_count)
36
- = link_to user_albums_path(user), class: 'btn btn--block' do
37
- = icon 'book'
38
- = format(n_('%<nb>i album', '%<nb>i albums', user.albums_count), nb: user.albums_count)
24
+ .btn-group.btn-group--block
25
+ = link_to user_projects_path(user),
26
+ class: 'btn btn--small',
27
+ title: format(n_('%<nb>i project', '%<nb>i projects', user.projects_count), nb: user.projects_count) do
28
+ = icon_text 'cog', user.projects_count, ['fw']
29
+ = link_to user_articles_path(user),
30
+ class: 'btn btn--small',
31
+ title: format(n_('%<nb>i article', '%<nb>i articles', user.articles_count), nb: user.articles_count) do
32
+ = icon_text 'font', user.articles_count, ['fw']
33
+ = link_to user_notes_path(user),
34
+ class: 'btn btn--small',
35
+ title: format(n_('%<nb>i note', '%<nb>i notes', user.notes_count), nb: user.notes_count) do
36
+ = icon_text 'sticky-note', user.notes_count, ['fw']
37
+ = link_to user_uploads_path(user),
38
+ class: 'btn btn--small',
39
+ title: format(n_('%<nb>i upload', '%<nb>i uploads', user.uploads_count), nb: user.uploads_count) do
40
+ = icon_text 'image', user.uploads_count, ['fw']
41
+ = link_to user_albums_path(user),
42
+ class: 'btn btn--small',
43
+ title: format(n_('%<nb>i album', '%<nb>i albums', user.albums_count), nb: user.albums_count) do
44
+ = icon_text 'book', user.albums_count, ['fw']
@@ -0,0 +1,7 @@
1
+ %span.user.user--inline
2
+ - if Elabs.use_avatars && user.avatar.attached?
3
+ = image_tag avatar_image(user.avatar, :small), class: 'avatar'
4
+ - else
5
+ = icon 'user', ['fw']
6
+
7
+ = link_to user.display_name, user
@@ -4,7 +4,7 @@
4
4
  %ul
5
5
  - if Elabs.use_avatars && @user.avatar.attached?
6
6
  %li.image
7
- = image_tag main_app.url_for(avatar_image(@user.avatar, :medium).processed)
7
+ = image_tag avatar_image(@user.avatar, :medium)
8
8
  %li
9
9
  = icon('user', ['fw'])
10
10
  %strong= _('Username:')
@@ -42,7 +42,7 @@
42
42
  .content
43
43
  - if @user.biography.present?
44
44
  %article
45
- = markdown @user.biography
45
+ = render_entity_content @user, :biography
46
46
 
47
47
  = render 'associations',
48
48
  user: @user,