biovision-base 0.15.180502 → 0.17.180619

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/biovision/base/placeholders/user.svg +4 -21
  3. data/app/assets/javascripts/biovision/base/biovision-sliders.js +24 -1
  4. data/app/assets/javascripts/biovision/base/biovision.js +27 -5
  5. data/app/assets/stylesheets/biovision/base/biovision.scss +8 -1
  6. data/app/assets/stylesheets/biovision/base/default.scss +13 -5
  7. data/app/controllers/about_controller.rb +8 -3
  8. data/app/controllers/admin/editable_pages_controller.rb +3 -1
  9. data/app/controllers/editable_pages_controller.rb +1 -5
  10. data/app/controllers/fallback_controller.rb +11 -0
  11. data/app/controllers/media_files_controller.rb +9 -1
  12. data/app/controllers/my/profiles_controller.rb +6 -1
  13. data/app/models/concerns/checkable.rb +20 -0
  14. data/app/models/editable_page.rb +27 -10
  15. data/app/models/feedback_request.rb +4 -3
  16. data/app/models/foreign_site.rb +7 -4
  17. data/app/models/media_file.rb +0 -1
  18. data/app/models/privilege.rb +2 -2
  19. data/app/models/user.rb +4 -4
  20. data/app/views/about/contact.html.erb +24 -0
  21. data/app/views/admin/editable_pages/entity/_in_list.html.erb +16 -0
  22. data/app/views/admin/editable_pages/index.html.erb +1 -1
  23. data/app/views/admin/editable_pages/show.html.erb +10 -1
  24. data/app/views/admin/index/_biovision_base.html.erb +1 -0
  25. data/app/views/admin/users/entity/_custom_nav.html.erb +0 -0
  26. data/app/views/admin/users/entity/_in_list.html.erb +19 -3
  27. data/app/views/admin/users/show.html.erb +18 -9
  28. data/app/views/application/error.jbuilder +3 -0
  29. data/app/views/editable_pages/_editable_page.html.erb +2 -4
  30. data/app/views/editable_pages/_form.html.erb +50 -11
  31. data/app/views/editable_pages/edit.html.erb +3 -3
  32. data/app/views/editable_pages/entity/_content.html.erb +11 -0
  33. data/app/views/editable_pages/entity/_metadata.html.erb +1 -4
  34. data/app/views/fallback/show.html.erb +1 -0
  35. data/app/views/feedback_requests/_form.html.erb +38 -27
  36. data/app/views/my/profiles/check.jbuilder +4 -0
  37. data/app/views/my/profiles/new/_form.html.erb +11 -10
  38. data/app/views/shared/_meta_texts.html.erb +26 -12
  39. data/app/views/shared/forms/_entity_flags.html.erb +11 -0
  40. data/app/views/shared/forms/_wysiwyg.html.erb +1 -1
  41. data/app/views/shared/forms/check.jbuilder +4 -0
  42. data/app/views/users/_form.html.erb +32 -39
  43. data/config/locales/common-en.yml +6 -4
  44. data/config/locales/common-ru.yml +7 -4
  45. data/config/locales/editable-pages-ru.yml +12 -4
  46. data/config/locales/feedback-en.yml +6 -1
  47. data/config/locales/feedback-ru.yml +5 -5
  48. data/config/locales/users-en.yml +1 -0
  49. data/config/locales/users-ru.yml +1 -0
  50. data/config/routes.rb +11 -2
  51. data/db/migrate/20170302000101_create_privileges.rb +1 -0
  52. data/db/migrate/20170320000000_create_editable_pages.rb +25 -12
  53. data/db/migrate/20171211000000_create_feedback_requests.rb +7 -1
  54. data/db/migrate/20180610222222_add_consent_to_feedback_requests.rb +15 -0
  55. data/db/migrate/20180612111111_add_administrative_to_privilege.rb +11 -0
  56. data/db/migrate/20180619121212_add_image_alt_text_to_editable_page.rb +11 -0
  57. data/lib/biovision/base/base_methods.rb +3 -2
  58. data/lib/biovision/base/version.rb +1 -1
  59. metadata +15 -4
  60. data/db/migrate/20171025222222_add_new_fields_171026.rb +0 -21
  61. data/db/migrate/20171217222222_add_fields_to_feedback_requests.rb +0 -10
@@ -32,7 +32,7 @@ class ForeignSite < ApplicationRecord
32
32
  slug: data[:uid],
33
33
  name: data[:info][:name],
34
34
  email: data[:info][:email],
35
- data: JSON.generate(data.dig(:extra, :raw_info))
35
+ data: JSON.generate(data)
36
36
  }.merge(tracking)
37
37
  foreign_users.create!(parameters).user
38
38
  end
@@ -53,19 +53,22 @@ class ForeignSite < ApplicationRecord
53
53
  # @param [Hash] tracking
54
54
  # @return [User]
55
55
  def create_native_user(data, tracking)
56
- screen_name = data.dig(:info, :nickname)
56
+ screen_name = data.dig(:info, :nickname) || data.dig(:info, :name)
57
57
  image_url = data.dig(:info, :image)
58
58
  password = SecureRandom.urlsafe_base64(12)
59
59
  hash_salt = BCrypt::Engine.generate_salt
60
60
  parameters = {
61
61
  foreign_slug: true,
62
+ consent: true,
62
63
  slug: "#{slug}-#{data[:uid]}",
63
64
  email: data[:info][:email],
64
- name: data[:info][:first_name],
65
- surname: data[:info][:last_name],
66
65
  screen_name: screen_name.blank? ? data[:name] : screen_name,
67
66
  password_digest: BCrypt::Engine.hash_secret(password, hash_salt),
68
67
  email_confirmed: true,
68
+ profile_data: {
69
+ name: data[:info][:first_name],
70
+ surname: data[:info][:last_name]
71
+ }
69
72
  }.merge(tracking)
70
73
 
71
74
  parameters[:remote_image_url] = data[:info][:image] unless image_url.blank?
@@ -22,7 +22,6 @@ class MediaFile < ApplicationRecord
22
22
  validates_presence_of :file
23
23
  validates_length_of :name, maximum: NAME_LIMIT
24
24
  validates_length_of :description, maximum: DESCRIPTION_LIMIT
25
- validates_uniqueness_of :name, scope: [:media_folder_id]
26
25
  validates_uniqueness_of :uuid
27
26
 
28
27
  scope :ordered_by_name, -> { order('name asc') }
@@ -6,7 +6,7 @@ class Privilege < ApplicationRecord
6
6
  SLUG_LIMIT = 250
7
7
  PRIORITY_RANGE = (1..32767)
8
8
 
9
- toggleable :regional
9
+ toggleable :regional, :administrative
10
10
 
11
11
  belongs_to :parent, class_name: Privilege.to_s, optional: true
12
12
  has_many :children, class_name: Privilege.to_s, foreign_key: :parent_id
@@ -42,7 +42,7 @@ class Privilege < ApplicationRecord
42
42
  end
43
43
 
44
44
  def self.entity_parameters
45
- %i(name slug priority description regional)
45
+ %i(administrative description name priority regional slug)
46
46
  end
47
47
 
48
48
  def self.creation_parameters
data/app/models/user.rb CHANGED
@@ -40,11 +40,11 @@ class User < ApplicationRecord
40
40
  before_save :prepare_search_string
41
41
 
42
42
  validates_acceptance_of :consent
43
- validates_presence_of :screen_name, :email
43
+ validates_presence_of :screen_name
44
44
  validates_format_of :screen_name, with: SCREEN_NAME_PATTERN, if: :native_slug?
45
- validates_format_of :email, with: EMAIL_PATTERN
45
+ validates_format_of :email, with: EMAIL_PATTERN, allow_blank: true
46
46
  validates :screen_name, uniqueness: { case_sensitive: false }
47
- validates :email, uniqueness: { case_sensitive: false }
47
+ validates :email, uniqueness: { case_sensitive: false }, allow_nil: true
48
48
  validates_length_of :slug, maximum: SLUG_LIMIT
49
49
  validates_length_of :screen_name, maximum: SLUG_LIMIT
50
50
  validates_length_of :email, maximum: EMAIL_LIMIT
@@ -83,7 +83,7 @@ class User < ApplicationRecord
83
83
  def self.entity_parameters
84
84
  flags = %i(bot allow_login email_confirmed phone_confirmed foreign_slug)
85
85
 
86
- new_profile_parameters + flags + %i(screen_name notice)
86
+ new_profile_parameters + flags + %i(screen_name notice balance)
87
87
  end
88
88
 
89
89
  def self.ids_range
@@ -0,0 +1,24 @@
1
+ <% unless @editable_page.nil? %>
2
+ <%=
3
+ render(
4
+ partial: 'editable_pages/entity/metadata',
5
+ locals: { entity: @editable_page }
6
+ )
7
+ %>
8
+ <% end %>
9
+ <% content_for :breadcrumbs do %>
10
+ <span><%= t('.nav_text') %></span>
11
+ <% end %>
12
+
13
+ <article class="editable-page">
14
+ <% unless @editable_page.nil? %>
15
+ <%=
16
+ render(
17
+ partial: 'editable_pages/entity/content',
18
+ locals: { entity: @editable_page }
19
+ )
20
+ %>
21
+ <% end %>
22
+
23
+ <%= render partial: 'feedback_requests/form' %>
24
+ </article>
@@ -6,6 +6,11 @@
6
6
  <div class="info">
7
7
  <%= entity.slug %>
8
8
  </div>
9
+ <% unless entity.url.blank? %>
10
+ <div class="info">
11
+ URL: <%= entity.url %>
12
+ </div>
13
+ <% end %>
9
14
  <% unless entity.language.nil? %>
10
15
  <div class="secondary info">
11
16
  <%= t('activerecord.attributes.editable_page.language') %>:
@@ -15,5 +20,16 @@
15
20
 
16
21
  <ul class="actions">
17
22
  <li><%= edit_icon(edit_editable_page_path(id: entity.id)) %></li>
23
+ <% unless entity.url.blank? %>
24
+ <li><%= world_icon(entity.url, t(:view_as_visitor), locale: entity.language&.code) %></li>
25
+ <% end %>
26
+ <%=
27
+ render(
28
+ partial: 'shared/actions/priority_changer',
29
+ locals: {
30
+ path: priority_admin_editable_page_path(id: entity.id)
31
+ }
32
+ )
33
+ %>
18
34
  </ul>
19
35
  </div>
@@ -10,5 +10,5 @@
10
10
  <li><%= create_icon(new_editable_page_path) %></li>
11
11
  </ul>
12
12
 
13
- <%= render partial: 'shared/admin/list', locals: { collection: @collection } %>
13
+ <%= render partial: 'shared/admin/list_with_priority', locals: { collection: @collection } %>
14
14
  </article>
@@ -9,6 +9,9 @@
9
9
 
10
10
  <ul class="actions">
11
11
  <li><%= back_icon(admin_editable_pages_path) %></li>
12
+ <% unless @entity.url.blank? %>
13
+ <li><%= world_icon(@entity.url, t(:view_as_visitor), locale: @entity.language&.code) %></li>
14
+ <% end %>
12
15
  <li><%= edit_icon(edit_editable_page_path(id: @entity.id)) %></li>
13
16
  </ul>
14
17
 
@@ -21,8 +24,9 @@
21
24
  <% unless @entity.image.blank? %>
22
25
  <dt><%= t('activerecord.attributes.editable_page.image') %></dt>
23
26
  <dd>
24
- <figure>
27
+ <figure role="group" class="preview">
25
28
  <%= editable_page_image_medium(@entity) %>
29
+ <figcaption><%= @entity.image_alt_text %></figcaption>
26
30
  </figure>
27
31
  </dd>
28
32
  <% end %>
@@ -30,6 +34,11 @@
30
34
  <dt><%= t('activerecord.attributes.editable_page.slug') %></dt>
31
35
  <dd><%= @entity.slug %></dd>
32
36
 
37
+ <% unless @entity.url.blank? %>
38
+ <dt><%= t('activerecord.attributes.editable_page.url') %></dt>
39
+ <dd><%= @entity.url %></dd>
40
+ <% end %>
41
+
33
42
  <dt><%= t(:created_at) %></dt>
34
43
  <dd><%= time_tag(@entity.created_at) %></dd>
35
44
 
@@ -4,6 +4,7 @@
4
4
  <%= render 'admin/index/dashboard/biovision_user' %>
5
5
  <%= render 'admin/index/dashboard/editorial' %>
6
6
  <%= render 'admin/index/dashboard/biovision_post' if Gem.loaded_specs.key?('biovision-post') %>
7
+ <%= render 'admin/index/dashboard/biovision_vote' if Gem.loaded_specs.key?('biovision-vote') %>
7
8
  <%= render 'admin/index/dashboard/biovision_poll' if Gem.loaded_specs.key?('biovision-poll') %>
8
9
  <%= render 'admin/index/dashboard/biovision_courses' if Gem.loaded_specs.key?('biovision-courses') %>
9
10
  <%= render 'admin/index/dashboard/biovision_feedback' %>
File without changes
@@ -8,17 +8,33 @@
8
8
  <% end %>
9
9
  <% unless entity.email.blank? %>
10
10
  <div class="info">
11
- <div><%= t('activerecord.attributes.user.email') %>: <%= entity.email %></div>
11
+ <%= t('activerecord.attributes.user.email') %>: <%= entity.email %>
12
12
  </div>
13
13
  <% end %>
14
+ <div class="info">
15
+ <%= t('activerecord.attributes.user.balance') %>:
16
+ <%= entity.balance %>
17
+ </div>
14
18
  <div class="secondary info">
15
19
  <div><%= t(:created_at) %>: <%= time_tag entity.created_at %></div>
16
20
  <% unless entity.last_seen.nil? %>
17
- <div><%= t('activerecord.attributes.user.last_seen') %>: <%= time_tag entity.last_seen %></div>
21
+ <div>
22
+ <%= t('activerecord.attributes.user.last_seen') %>:
23
+ <%= time_tag entity.last_seen %>
24
+ </div>
18
25
  <% end %>
19
26
  </div>
20
27
 
21
- <%= render partial: 'shared/admin/toggleable', locals: { entity: entity, url: toggle_admin_user_path(id: entity.id) } %>
28
+ <%=
29
+ render(
30
+ partial: 'shared/admin/toggleable',
31
+ locals: {
32
+ entity: entity,
33
+ url: toggle_admin_user_path(id: entity.id)
34
+ }
35
+ )
36
+ %>
37
+
22
38
  <ul class="actions">
23
39
  <li><%= edit_icon(edit_user_path(id: entity.id)) %></li>
24
40
  <li><%= world_icon(user_profile_path(slug: entity.screen_name)) %></li>
@@ -18,17 +18,23 @@
18
18
  </ul>
19
19
 
20
20
  <nav>
21
- <ul>
22
- <li><%= link_to t('.privileges'), privileges_admin_user_path(id: @entity.id) %></li>
23
- <li><%= link_to t('admin.tokens.index.heading'), tokens_admin_user_path(id: @entity.id) %></li>
24
- <li><%= link_to t('admin.codes.index.heading'), codes_admin_user_path(id: @entity.id) %></li>
25
- <% unless @entity == current_user %>
26
- <li><%= link_to t('.authenticate'), authenticate_admin_user_path(id: @entity.id), method: :post %></li>
27
- <% end %>
28
- </ul>
21
+ <%= link_to(t('.privileges'), privileges_admin_user_path(id: @entity.id), class: 'button-nav') %>
22
+ <%= link_to(t('admin.tokens.index.heading'), tokens_admin_user_path(id: @entity.id), class: 'button-nav') %>
23
+ <%= link_to(t('admin.codes.index.heading'), codes_admin_user_path(id: @entity.id), class: 'button-nav') %>
24
+ <%= render partial: 'admin/users/entity/custom_nav', locals: { entity: @entity } %>
25
+ <% unless @entity == current_user %>
26
+ <%=
27
+ link_to(
28
+ t('.authenticate'),
29
+ authenticate_admin_user_path(id: @entity.id),
30
+ method: :post,
31
+ class: 'button-action'
32
+ )
33
+ %>
34
+ <% end %>
29
35
  </nav>
30
36
 
31
- <figure role="group">
37
+ <figure role="group" class="preview">
32
38
  <%= profile_avatar @entity %>
33
39
  <figcaption>
34
40
  <%= @entity.slug %>
@@ -54,6 +60,9 @@
54
60
  <dd><%= link_to @entity.phone, "tel:#{@entity.phone}" %></dd>
55
61
  <% end %>
56
62
 
63
+ <dt><%= t('activerecord.attributes.user.balance') %></dt>
64
+ <dd><%= @entity.balance %></dd>
65
+
57
66
  <%= render partial: 'admin/users/entity/profile', locals: { data: @entity.profile_data } %>
58
67
 
59
68
  <% unless @entity.ip.blank? %>
@@ -0,0 +1,3 @@
1
+ json.errors do
2
+ json.message t('.message')
3
+ end
@@ -1,7 +1,5 @@
1
1
  <%= render partial: 'editable_pages/entity/metadata', locals: { entity: entity } %>
2
2
 
3
- <article>
4
- <h1><%= entity.title %></h1>
5
-
6
- <%= raw entity.body %>
3
+ <article class="editable-page">
4
+ <%= render partial: 'editable_pages/entity/content', locals: { entity: entity } %>
7
5
  </article>
@@ -1,8 +1,20 @@
1
- <% entity_name = entity.class.to_s.underscore %>
2
- <%= form_with(model: entity, html: { id: "#{entity_name}-form" }) do |f| %>
1
+ <% model_name = entity.class.to_s.underscore %>
2
+ <%= form_with(model: entity, html: { id: "#{model_name}-form" }) do |f| %>
3
3
  <%= render partial: 'shared/list_of_errors', locals: { entity: entity } %>
4
4
 
5
5
  <dl>
6
+ <dt><%= f.label :priority %></dt>
7
+ <dd>
8
+ <%=
9
+ f.number_field(
10
+ :priority,
11
+ id: "#{model_name}_priority",
12
+ in: EditablePage::PRIORITY_RANGE,
13
+ required: true
14
+ )
15
+ %>
16
+ </dd>
17
+
6
18
  <dt><%= f.label :language_id %></dt>
7
19
  <dd><%= f.select :language_id, languages_for_select %></dd>
8
20
 
@@ -11,7 +23,7 @@
11
23
  <%=
12
24
  f.text_field(
13
25
  :slug,
14
- id: :editable_page_slug,
26
+ id: "#{model_name}_slug",
15
27
  size: nil,
16
28
  maxlength: EditablePage::SLUG_LIMIT,
17
29
  required: true
@@ -20,9 +32,23 @@
20
32
  <div class="guideline"><%= t('.guidelines.slug') %></div>
21
33
  </dd>
22
34
 
35
+ <dt><%= f.label :url %></dt>
36
+ <dd>
37
+ <%=
38
+ f.text_field(
39
+ :url,
40
+ id: "#{model_name}_url",
41
+ size: nil,
42
+ maxlength: EditablePage::META_LIMIT,
43
+ placeholder: t('.placeholders.url')
44
+ )
45
+ %>
46
+ <div class="guideline"><%= t('.guidelines.url') %></div>
47
+ </dd>
48
+
23
49
  <dt><%= f.label :image %></dt>
24
50
  <dd>
25
- <figure class="preview" role="group" id="<%= entity_name %>-image">
51
+ <figure class="preview" role="group" id="<%= model_name %>-image">
26
52
  <% if entity.image.blank? %>
27
53
  <%= f.label :image, image_tag('biovision/base/placeholders/image.svg') %>
28
54
  <% else %>
@@ -32,9 +58,9 @@
32
58
  <%=
33
59
  f.file_field(
34
60
  :image,
35
- id: "#{entity_name}_image",
61
+ id: "#{model_name}_image",
36
62
  accept: 'image/jpeg,image/png',
37
- data: { image: "#{entity_name}-image" }
63
+ data: { image: "#{model_name}-image" }
38
64
  )
39
65
  %>
40
66
  </figcaption>
@@ -42,12 +68,25 @@
42
68
  <div class="guideline"><%= t('.guidelines.image') %></div>
43
69
  </dd>
44
70
 
71
+ <dt><%= f.label :image_alt_text %></dt>
72
+ <dd>
73
+ <%=
74
+ f.text_field(
75
+ :image_alt_text,
76
+ id: "#{model_name}_image_alt_text",
77
+ size: nil,
78
+ maxlength: EditablePage::META_LIMIT
79
+ )
80
+ %>
81
+ <div class="guideline"><%= t('.guidelines.image_alt_text') %></div>
82
+ </dd>
83
+
45
84
  <dt><%= f.label :name %></dt>
46
85
  <dd>
47
86
  <%=
48
87
  f.text_field(
49
88
  :name,
50
- id: :editable_page_name,
89
+ id: "#{model_name}_name",
51
90
  size: nil,
52
91
  maxlength: EditablePage::NAME_LIMIT,
53
92
  required: true
@@ -61,7 +100,7 @@
61
100
  <%=
62
101
  f.text_field(
63
102
  :title,
64
- id: :editable_page_title,
103
+ id: "#{model_name}_title",
65
104
  size: nil,
66
105
  maxlength: EditablePage::META_LIMIT
67
106
  )
@@ -74,7 +113,7 @@
74
113
  <%=
75
114
  f.text_field(
76
115
  :keywords,
77
- id: :editable_page_keywords,
116
+ id: "#{model_name}_keywords",
78
117
  size: nil,
79
118
  maxlength: EditablePage::META_LIMIT
80
119
  )
@@ -87,7 +126,7 @@
87
126
  <%=
88
127
  f.text_field(
89
128
  :description,
90
- id: :editable_page_description,
129
+ id: "#{model_name}_description",
91
130
  size: nil,
92
131
  maxlength: EditablePage::META_LIMIT
93
132
  )
@@ -100,7 +139,7 @@
100
139
  <%=
101
140
  f.text_area(
102
141
  :body,
103
- id: :editable_page_body,
142
+ id: "#{model_name}_body",
104
143
  cols: 80,
105
144
  rows: 25,
106
145
  required: true,
@@ -1,8 +1,8 @@
1
1
  <% content_for :meta_title, t('.title') %>
2
2
  <% content_for :breadcrumbs do %>
3
- <%= link_to(t('admin.editable_pages.nav_item.text'), admin_editable_pages_path) %>
4
- <%= admin_editable_page_link(@entity) %>
5
- <span><%= t(:edit) %></span>
3
+ <%= link_to(t('admin.editable_pages.nav_item.text'), admin_editable_pages_path) %>
4
+ <%= admin_editable_page_link(@entity) %>
5
+ <span><%= t(:edit) %></span>
6
6
  <% end %>
7
7
 
8
8
  <article>
@@ -0,0 +1,11 @@
1
+ <h1><%= entity.title %></h1>
2
+
3
+ <% if entity.editable_by?(current_user) %>
4
+ <ul class="actions">
5
+ <li><%= edit_icon(edit_editable_page_path(id: entity.id)) %></li>
6
+ </ul>
7
+ <% end %>
8
+
9
+ <div class="text">
10
+ <%= raw(entity.body) %>
11
+ </div>