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.
- checksums.yaml +4 -4
- data/app/assets/images/biovision/base/placeholders/user.svg +4 -21
- data/app/assets/javascripts/biovision/base/biovision-sliders.js +24 -1
- data/app/assets/javascripts/biovision/base/biovision.js +27 -5
- data/app/assets/stylesheets/biovision/base/biovision.scss +8 -1
- data/app/assets/stylesheets/biovision/base/default.scss +13 -5
- data/app/controllers/about_controller.rb +8 -3
- data/app/controllers/admin/editable_pages_controller.rb +3 -1
- data/app/controllers/editable_pages_controller.rb +1 -5
- data/app/controllers/fallback_controller.rb +11 -0
- data/app/controllers/media_files_controller.rb +9 -1
- data/app/controllers/my/profiles_controller.rb +6 -1
- data/app/models/concerns/checkable.rb +20 -0
- data/app/models/editable_page.rb +27 -10
- data/app/models/feedback_request.rb +4 -3
- data/app/models/foreign_site.rb +7 -4
- data/app/models/media_file.rb +0 -1
- data/app/models/privilege.rb +2 -2
- data/app/models/user.rb +4 -4
- data/app/views/about/contact.html.erb +24 -0
- data/app/views/admin/editable_pages/entity/_in_list.html.erb +16 -0
- data/app/views/admin/editable_pages/index.html.erb +1 -1
- data/app/views/admin/editable_pages/show.html.erb +10 -1
- data/app/views/admin/index/_biovision_base.html.erb +1 -0
- data/app/views/admin/users/entity/_custom_nav.html.erb +0 -0
- data/app/views/admin/users/entity/_in_list.html.erb +19 -3
- data/app/views/admin/users/show.html.erb +18 -9
- data/app/views/application/error.jbuilder +3 -0
- data/app/views/editable_pages/_editable_page.html.erb +2 -4
- data/app/views/editable_pages/_form.html.erb +50 -11
- data/app/views/editable_pages/edit.html.erb +3 -3
- data/app/views/editable_pages/entity/_content.html.erb +11 -0
- data/app/views/editable_pages/entity/_metadata.html.erb +1 -4
- data/app/views/fallback/show.html.erb +1 -0
- data/app/views/feedback_requests/_form.html.erb +38 -27
- data/app/views/my/profiles/check.jbuilder +4 -0
- data/app/views/my/profiles/new/_form.html.erb +11 -10
- data/app/views/shared/_meta_texts.html.erb +26 -12
- data/app/views/shared/forms/_entity_flags.html.erb +11 -0
- data/app/views/shared/forms/_wysiwyg.html.erb +1 -1
- data/app/views/shared/forms/check.jbuilder +4 -0
- data/app/views/users/_form.html.erb +32 -39
- data/config/locales/common-en.yml +6 -4
- data/config/locales/common-ru.yml +7 -4
- data/config/locales/editable-pages-ru.yml +12 -4
- data/config/locales/feedback-en.yml +6 -1
- data/config/locales/feedback-ru.yml +5 -5
- data/config/locales/users-en.yml +1 -0
- data/config/locales/users-ru.yml +1 -0
- data/config/routes.rb +11 -2
- data/db/migrate/20170302000101_create_privileges.rb +1 -0
- data/db/migrate/20170320000000_create_editable_pages.rb +25 -12
- data/db/migrate/20171211000000_create_feedback_requests.rb +7 -1
- data/db/migrate/20180610222222_add_consent_to_feedback_requests.rb +15 -0
- data/db/migrate/20180612111111_add_administrative_to_privilege.rb +11 -0
- data/db/migrate/20180619121212_add_image_alt_text_to_editable_page.rb +11 -0
- data/lib/biovision/base/base_methods.rb +3 -2
- data/lib/biovision/base/version.rb +1 -1
- metadata +15 -4
- data/db/migrate/20171025222222_add_new_fields_171026.rb +0 -21
- data/db/migrate/20171217222222_add_fields_to_feedback_requests.rb +0 -10
data/app/models/foreign_site.rb
CHANGED
@@ -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
|
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?
|
data/app/models/media_file.rb
CHANGED
@@ -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') }
|
data/app/models/privilege.rb
CHANGED
@@ -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
|
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
|
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>
|
@@ -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
|
-
|
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
|
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
|
-
<%=
|
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
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
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? %>
|
@@ -1,7 +1,5 @@
|
|
1
1
|
<%= render partial: 'editable_pages/entity/metadata', locals: { entity: entity } %>
|
2
2
|
|
3
|
-
<article>
|
4
|
-
|
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
|
-
<%
|
2
|
-
<%= form_with(model: entity, html: { id: "#{
|
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:
|
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="<%=
|
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: "#{
|
61
|
+
id: "#{model_name}_image",
|
36
62
|
accept: 'image/jpeg,image/png',
|
37
|
-
data: { 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:
|
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:
|
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:
|
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:
|
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:
|
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
|
-
|
4
|
-
|
5
|
-
|
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>
|