elabs 3.0.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,10 +1,15 @@
1
1
  module Elabs
2
2
  class License < ApplicationRecord
3
3
  self.table_name = 'licenses'
4
+ include Elabs::Concerns::Sluggable
5
+
6
+ SLUGGABLE_FIELD = :name
7
+ SLUG_FIELD = :slug
4
8
 
5
9
  validates :name, presence: true
6
10
  validates :url, presence: true
7
11
  validates :icon, presence: true
12
+ validates :slug, presence: true, uniqueness: true
8
13
 
9
14
  has_many :albums
10
15
  has_many :articles
@@ -2,11 +2,13 @@ module Elabs
2
2
  class Note < ApplicationContentRecord
3
3
  self.table_name = 'notes'
4
4
 
5
+ SLUGGABLE_FIELD = :created_at
5
6
  ADDITIONAL_HABTM_COUNTER_CACHES = [
6
7
  %w[projects notes]
7
8
  ].freeze
8
9
 
9
10
  validates :content, presence: true
11
+ validates :slug, presence: true, uniqueness: true
10
12
  validates_with AssociatedAuthorValidator, relations: %w[project]
11
13
 
12
14
  belongs_to :user
@@ -2,9 +2,12 @@ module Elabs
2
2
  class Project < ApplicationContentRecord
3
3
  self.table_name = 'projects'
4
4
 
5
+ SLUGGABLE_FIELD = :name
6
+
5
7
  validates :name, presence: true
6
8
  validates :short_description, presence: true
7
9
  validates :description, presence: true
10
+ validates :slug, presence: true, uniqueness: true
8
11
  validates_with AssociatedAuthorValidator, relations: %w[album article note upload]
9
12
 
10
13
  belongs_to :user
@@ -1,8 +1,13 @@
1
1
  module Elabs
2
2
  class Tag < ApplicationRecord
3
3
  self.table_name = 'tags'
4
+ include Elabs::Concerns::Sluggable
5
+
6
+ SLUGGABLE_FIELD = :name
7
+ SLUG_FIELD = :slug
4
8
 
5
9
  validates :name, presence: true
10
+ validates :slug, presence: true, uniqueness: true
6
11
 
7
12
  has_many :albums_tags
8
13
  has_many :articles_tags
@@ -2,6 +2,7 @@ module Elabs
2
2
  class Upload < ApplicationContentRecord
3
3
  self.table_name = 'uploads'
4
4
 
5
+ SLUGGABLE_FIELD = :title
5
6
  ADDITIONAL_HABTM_COUNTER_CACHES = [
6
7
  %w[albums uploads],
7
8
  %w[projects uploads]
@@ -10,6 +11,7 @@ module Elabs
10
11
  validates :title, presence: true
11
12
  validates :description, presence: true
12
13
  validates :file_attachment, presence: true
14
+ validates :slug, presence: true, uniqueness: true
13
15
  validates_with AssociatedAuthorValidator, relations: %w[album project]
14
16
 
15
17
  belongs_to :user
@@ -1,6 +1,10 @@
1
1
  module Elabs
2
2
  class User < ApplicationRecord
3
3
  self.table_name = 'users'
4
+ include Elabs::Concerns::Sluggable
5
+
6
+ SLUGGABLE_FIELD = nil
7
+ SLUG_FIELD = :username
4
8
 
5
9
  validates :username, presence: true, uniqueness: true
6
10
  validates :role, presence: false
@@ -25,6 +29,10 @@ module Elabs
25
29
 
26
30
  scope :admins, -> { where(role: 'admin') }
27
31
 
32
+ after_create do
33
+ Preference.create! user: self, show_nsfw: false
34
+ end
35
+
28
36
  def admin?
29
37
  role == 'admin'
30
38
  end
@@ -33,8 +41,8 @@ module Elabs
33
41
  real_name.present? ? real_name : "@#{username}"
34
42
  end
35
43
 
36
- after_create do
37
- Preference.create! user: self, show_nsfw: false
44
+ def to_param
45
+ username
38
46
  end
39
47
 
40
48
  private
@@ -0,0 +1,22 @@
1
+ if act.event == 'publish'
2
+ case act.content_type
3
+ when 'Elabs::Album'
4
+ render 'elabs/albums/album', album: act.content, builder: builder
5
+ when 'Elabs::Article'
6
+ render 'elabs/articles/article', article: act.content, builder: builder
7
+ when 'Elabs::Note'
8
+ render 'elabs/notes/note', note: act.content, builder: builder
9
+ when 'Elabs::Project'
10
+ render 'elabs/projects/project', project: act.content, builder: builder
11
+ when 'Elabs::Upload'
12
+ render 'elabs/uploads/upload', upload: act.content, builder: builder
13
+ end
14
+ else
15
+ builder.item do
16
+ builder.title act_notice_string(act, false)
17
+ builder.description act_notice_string(act)
18
+ builder.pubDate act.created_at.to_s(:rfc822)
19
+ builder.link url_for act.content
20
+ builder.guid url_for act.content
21
+ end
22
+ end
@@ -20,7 +20,11 @@
20
20
  - when 'Elabs::Upload'
21
21
  = render 'elabs/uploads/upload', upload: act.content
22
22
  - else
23
- %div{ class: "act-action act-action--#{act.event}" }= act_notice_string act
23
+ %div{ class: "act-action act-action--#{act.event}" }
24
+ = act_notice_string act
25
+ - if act.reason.present?
26
+ &mdash;
27
+ %q= act.reason
24
28
 
25
29
  - previous_date = act.created_at
26
30
 
@@ -0,0 +1,15 @@
1
+ xml.instruct! :xml, version: '1.0'
2
+ xml.rss version: '2.0' do
3
+ xml.channel do
4
+ xml.title "#{Elabs.site_name} - activity"
5
+ xml.description "Last #{params['show_nsfw'] == 'false' ? 'SFW' : ''} activity from #{Elabs.site_name}"
6
+ xml.link activities_url
7
+
8
+ @acts.each do |act|
9
+ next if params['show_nsfw'] == 'false' && !act.content.sfw
10
+ next if params['only_creations'] == 'true' && !act.event != 'publish'
11
+
12
+ render 'act', act: act, builder: xml
13
+ end
14
+ end
15
+ end
@@ -21,11 +21,11 @@
21
21
  - @albums.each do |album|
22
22
  %tr.album
23
23
  %td= album.name
24
- %td.is-icon= boolean_icon_tag album.sfw
25
- %td.is-icon= boolean_icon_tag album.published
26
- %td.is-icon= boolean_icon_tag album.locked, 'lock', 'unlock'
24
+ %td.is-icon= colored_good_or_bad_icon_tag album.sfw
25
+ %td.is-icon= colored_good_or_bad_icon_tag album.published
26
+ %td.is-icon= colored_good_or_bad_icon_tag album.locked, 'lock', 'unlock', true
27
27
  %td.is-icon= boolean_icon_tag album.hidden_in_history
28
- %td= short_date album.published_at
28
+ %td= medium_datetime album.published_at
29
29
  %td= album.user.username
30
30
  %td= album.license.name
31
31
  %td= album.language.name
@@ -20,11 +20,11 @@
20
20
  - @articles.each do |article|
21
21
  %tr.article
22
22
  %td= article.title
23
- %td.is-icon= boolean_icon_tag article.sfw
24
- %td.is-icon= boolean_icon_tag article.published
25
- %td.is-icon= boolean_icon_tag article.locked, 'lock', 'unlock'
23
+ %td.is-icon= colored_good_or_bad_icon_tag article.sfw
24
+ %td.is-icon= colored_good_or_bad_icon_tag article.published
25
+ %td.is-icon= colored_good_or_bad_icon_tag article.locked, 'lock', 'unlock', true
26
26
  %td.is-icon= boolean_icon_tag article.hidden_in_history
27
- %td= short_date article.published_at
27
+ %td= medium_datetime article.published_at
28
28
  %td= article.user.username
29
29
  %td= article.license.name
30
30
  %td= article.language.name
@@ -15,4 +15,5 @@
15
15
  .field-input= f.text_field :name
16
16
 
17
17
  .actions
18
- = f.submit _('Save'), class: 'btn btn--save'
18
+ .actions-buttons
19
+ = f.submit _('Save'), class: 'btn btn--save'
@@ -22,4 +22,5 @@
22
22
  .field-input= f.text_field :icon
23
23
 
24
24
  .actions
25
- = f.submit _('Save'), class: 'btn btn--save'
25
+ .actions-buttons
26
+ = f.submit _('Save'), class: 'btn btn--save'
@@ -20,11 +20,11 @@
20
20
  - @notes.each do |note|
21
21
  %tr.note
22
22
  %td= note.content[0...100]
23
- %td.is-icon= boolean_icon_tag note.sfw
24
- %td.is-icon= boolean_icon_tag note.published
25
- %td.is-icon= boolean_icon_tag note.locked
26
- %td.is-icon= boolean_icon_tag note.hidden_in_history
27
- %td= short_date note.published_at
23
+ %td.is-icon= colored_good_or_bad_icon_tag note.sfw
24
+ %td.is-icon= colored_good_or_bad_icon_tag note.published
25
+ %td.is-icon= colored_good_or_bad_icon_tag note.locked, 'lock', 'unlock', true
26
+ %td.is-icon= boolean_icon_tag value: note.hidden_in_history
27
+ %td= medium_datetime note.published_at
28
28
  %td= note.user.username
29
29
  %td= note.license.name
30
30
  %td= note.language.name
@@ -23,11 +23,11 @@
23
23
  - @projects.each do |project|
24
24
  %tr.project
25
25
  %td= project.name
26
- %td.is-icon= boolean_icon_tag project.sfw
27
- %td.is-icon= boolean_icon_tag project.published
28
- %td.is-icon= boolean_icon_tag project.locked, 'lock', 'unlock'
26
+ %td.is-icon= colored_good_or_bad_icon_tag project.sfw
27
+ %td.is-icon= colored_good_or_bad_icon_tag project.published
28
+ %td.is-icon= colored_good_or_bad_icon_tag project.locked, 'lock', 'unlock', true
29
29
  %td.is-icon= boolean_icon_tag project.hidden_in_history
30
- %td= short_date project.published_at
30
+ %td= medium_datetime project.published_at
31
31
  %td= project.user.username
32
32
  %td= project.license.name
33
33
  %td= project.language.name
@@ -18,8 +18,8 @@
18
18
  %td= report.name
19
19
  %td= report.email
20
20
  %td= report.user&.username
21
- %td.is-icon= boolean_icon_tag report.allow_contact
22
- %td= short_date report.created_at
21
+ %td.is-icon= colored_good_or_bad_icon_tag report.allow_contact
22
+ %td= medium_datetime report.created_at
23
23
  %td= link_to report.url, report.url, target: '_blank'
24
24
  %td= report.reason
25
25
  %td.actions
@@ -14,4 +14,5 @@
14
14
  .field-input= f.text_field :name
15
15
 
16
16
  .actions
17
- = f.submit _('Save'), class: 'btn btn--save'
17
+ .actions-buttons
18
+ = f.submit _('Save'), class: 'btn btn--save'
@@ -21,11 +21,11 @@
21
21
  - @uploads.each do |upload|
22
22
  %tr.upload
23
23
  %td= upload.title
24
- %td.is-icon= boolean_icon_tag upload.sfw
25
- %td.is-icon= boolean_icon_tag upload.published
26
- %td.is-icon= boolean_icon_tag upload.locked, 'lock', 'unlock'
24
+ %td.is-icon= colored_good_or_bad_icon_tag upload.sfw
25
+ %td.is-icon= colored_good_or_bad_icon_tag upload.published
26
+ %td.is-icon= colored_good_or_bad_icon_tag upload.locked, 'lock', 'unlock', true
27
27
  %td.is-icon= boolean_icon_tag upload.hidden_in_history
28
- %td= short_date upload.published_at
28
+ %td= medium_datetime upload.published_at
29
29
  %td= upload.user.username
30
30
  %td= upload.license.name
31
31
  %td= upload.language.name
@@ -20,9 +20,9 @@
20
20
  %tr.user
21
21
  %td= user.username
22
22
  %td= user.role
23
- %td= short_date user.created_at
24
- %td.is-icon= boolean_icon_tag user.confirmed_at.present?
25
- %td.is-icon= boolean_icon_tag user.reset_password_sent_at.present?
23
+ %td= medium_datetime user.created_at
24
+ %td.is-icon= colored_good_or_bad_icon_tag user.confirmed_at.present?
25
+ %td.is-icon= colored_good_or_bad_icon_tag user.reset_password_sent_at.present?
26
26
  %td.is-counter= user.albums_count
27
27
  %td.is-counter= user.articles_count
28
28
  %td.is-counter= user.notes_count
@@ -20,7 +20,7 @@
20
20
  = @user.real_name
21
21
  %li
22
22
  %strong= _('Subscription date:')
23
- = short_date @user.created_at
23
+ = medium_datetime @user.created_at
24
24
 
25
25
  %dt= _('Bio')
26
- = markdown(@user.biography || '')
26
+ = render_entity_content @user, :biography
@@ -27,7 +27,7 @@
27
27
  %li= render 'elabs/layouts/lists/projects', projects: album.projects
28
28
  %li= render 'elabs/layouts/lists/tags', tags: album.tags
29
29
  %article{ lang: album.language.iso639_1 }
30
- = markdown album.description
30
+ = render_entity_content album, :description, false
31
31
  .content__relations
32
32
  = render 'elabs/layouts/empty' if album.uploads.length.zero?
33
33
  .uploads-list
@@ -0,0 +1,7 @@
1
+ builder.item do
2
+ builder.title rss_title(album, 'name')
3
+ builder.description album.description
4
+ builder.pubDate album.published_at.to_s(:rfc822)
5
+ builder.link album_url(album)
6
+ builder.guid album_url(album)
7
+ end
@@ -0,0 +1,8 @@
1
+ - if !show_item? album
2
+ = render 'elabs/layouts/hidden_entry_inline', entity: album
3
+ - else
4
+ %span.album.album--inline
5
+ = icon 'book', ['fw']
6
+ = link_to album.name, album, lang: album.language.iso639_1
7
+ - if album.language.iso639_1 != locale
8
+ (#{album.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} - albums"
5
+ xml.description "Last #{params['show_nsfw'] == 'false' ? 'SFW' : ''} albums from #{Elabs.site_name}"
6
+ xml.link albums_url
7
+
8
+ @albums.each do |album|
9
+ next if params['show_nsfw'] == 'false' && !album.sfw
10
+
11
+ render 'album', builder: xml, album: album
12
+ end
13
+ end
14
+ end
@@ -14,12 +14,12 @@
14
14
  %li
15
15
  = icon('calendar-check', ['fw'])
16
16
  %strong= _('Published at:')
17
- = short_date @album.published_at
17
+ = medium_datetime @album.published_at
18
18
 
19
19
  %li
20
20
  = icon('calendar', ['fw'])
21
21
  %strong= _('Updated at:')
22
- = short_date @album.updated_at
22
+ = medium_datetime @album.updated_at
23
23
 
24
24
  %li.separator
25
25
  = icon('info', ['fw'])
@@ -46,7 +46,7 @@
46
46
 
47
47
  .content
48
48
  %article{ lang: @album.language.iso639_1 }
49
- = markdown @album.description
49
+ = render_entity_content @album, :description
50
50
 
51
51
  .content__relations
52
52
  = render 'elabs/layouts/empty' if @album.uploads.length.zero?
@@ -27,4 +27,4 @@
27
27
  %li= render 'elabs/layouts/lists/projects', projects: article.projects
28
28
  %li= render 'elabs/layouts/lists/tags', tags: article.tags
29
29
 
30
- %article{ lang: article.language.iso639_1 }= markdown article.excerpt
30
+ %article{ lang: article.language.iso639_1 }= render_entity_content article, :excerpt, false
@@ -0,0 +1,7 @@
1
+ builder.item do
2
+ builder.title rss_title(article, 'title')
3
+ builder.description "#{article.excerpt}\n#{article.content}"
4
+ builder.pubDate article.published_at.to_s(:rfc822)
5
+ builder.link article_url(article)
6
+ builder.guid article_url(article)
7
+ end
@@ -0,0 +1,8 @@
1
+ - if !show_item? article
2
+ = render 'elabs/layouts/hidden_entry_inline', entity: article
3
+ - else
4
+ %span.article.article--inline
5
+ = icon 'font', ['fw']
6
+ = link_to article.title, article, lang: article.language.iso639_1
7
+ - if article.language.iso639_1 != locale
8
+ (#{article.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} - articles"
5
+ xml.description "Last #{params['show_nsfw'] == 'false' ? 'SFW' : ''} articles from #{Elabs.site_name}"
6
+ xml.link articles_url
7
+
8
+ @articles.each do |article|
9
+ next if params['show_nsfw'] == 'false' && !article.sfw
10
+
11
+ render 'article', builder: xml, article: article
12
+ end
13
+ end
14
+ end
@@ -13,11 +13,11 @@
13
13
  %li
14
14
  = icon('calendar-check', ['fw'])
15
15
  %strong= _('Published at:')
16
- = short_date @article.published_at
16
+ = medium_datetime @article.published_at
17
17
  %li
18
18
  = icon('calendar', ['fw'])
19
19
  %strong= _('Updated at:')
20
- = short_date @article.updated_at
20
+ = medium_datetime @article.updated_at
21
21
  %li.separator
22
22
  = icon('info', ['fw'])
23
23
  %strong= _('SFW:')
@@ -36,8 +36,8 @@
36
36
 
37
37
  .content
38
38
  %article{ lang: @article.language.iso639_1 }
39
- = markdown @article.excerpt
40
- = markdown @article.content
39
+ = render_entity_content @article, :excerpt
40
+ = render_entity_content @article, :content
41
41
 
42
42
  = render 'elabs/comments/comments',
43
43
  entity: @article,
@@ -1,3 +1,5 @@
1
+ = render 'elabs/comments/form', url: url, new_comment: new_comment
2
+
1
3
  %section.comments-list
2
4
  - if user_is_author_of entity
3
5
  %h2= _('Comments')
@@ -15,7 +17,6 @@
15
17
  %li
16
18
  = icon('calendar', ['fw'])
17
19
  %strong= _('Posted on:')
18
- = short_date comment.created_at
19
- %article= markdown comment.comment
20
+ = medium_datetime comment.created_at
21
+ %article= render_entity_content comment, :comment, false
20
22
 
21
- = render 'elabs/comments/form', url: url, new_comment: new_comment