biovision-base 0.22.180920.0 → 0.34.190331.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -21
- data/app/assets/images/biovision/base/icons/apply.svg +4 -0
- data/app/assets/images/biovision/base/icons/components/contact.svg +26 -0
- data/app/assets/images/biovision/base/icons/components/registration.svg +17 -0
- data/app/assets/images/biovision/base/icons/destroy.svg +11 -8
- data/app/assets/images/biovision/base/icons/settings.svg +41 -0
- data/app/assets/images/biovision/base/icons/slider/arrow-left.svg +4 -0
- data/app/assets/images/biovision/base/icons/slider/arrow-right.svg +4 -0
- data/app/assets/images/biovision/base/placeholders/16x9.svg +10 -3
- data/app/assets/images/biovision/base/placeholders/1x1.svg +12 -0
- data/app/assets/images/biovision/base/placeholders/3x2.svg +10 -3
- data/app/assets/javascripts/biovision/base/biovision.js +780 -461
- data/app/assets/javascripts/biovision/base/components/carousel.js +123 -0
- data/app/assets/javascripts/biovision/base/polyfills.js +149 -0
- data/app/assets/stylesheets/biovision/base/admin.scss +85 -46
- data/app/assets/stylesheets/biovision/base/admin/components.scss +141 -0
- data/app/assets/stylesheets/biovision/base/biovision.scss +149 -33
- data/app/assets/stylesheets/biovision/base/buttons/buttons-common.scss +22 -0
- data/app/assets/stylesheets/biovision/base/default.scss +6 -6
- data/app/assets/stylesheets/biovision/base/default_admin.scss +25 -8
- data/app/assets/stylesheets/biovision/base/themes/simple-layout.scss +0 -3
- data/app/controllers/admin/editable_pages_controller.rb +6 -4
- data/app/controllers/admin/privileges_controller.rb +2 -3
- data/app/controllers/admin/settings_controller.rb +52 -0
- data/app/controllers/admin/simple_blocks_controller.rb +28 -0
- data/app/controllers/admin/users_controller.rb +1 -1
- data/app/controllers/agents_controller.rb +4 -4
- data/app/controllers/authentication_controller.rb +28 -6
- data/app/controllers/browsers_controller.rb +4 -4
- data/app/controllers/concerns/authentication.rb +8 -5
- data/app/controllers/concerns/entity_priority.rb +3 -0
- data/app/controllers/concerns/lockable_entity.rb +6 -3
- data/app/controllers/concerns/removable_image.rb +4 -5
- data/app/controllers/concerns/toggleable_entity.rb +4 -5
- data/app/controllers/editable_pages_controller.rb +14 -8
- data/app/controllers/fallback_controller.rb +7 -2
- data/app/controllers/feedback_requests_controller.rb +23 -8
- data/app/controllers/metrics_controller.rb +3 -3
- data/app/controllers/my/profiles_controller.rb +32 -15
- data/app/controllers/privilege_groups_controller.rb +4 -4
- data/app/controllers/privileges_controller.rb +7 -26
- data/app/controllers/simple_blocks_controller.rb +63 -0
- data/app/controllers/stored_values_controller.rb +4 -4
- data/app/controllers/tokens_controller.rb +4 -4
- data/app/controllers/users_controller.rb +8 -3
- data/app/helpers/biovision_users_helper.rb +60 -21
- data/app/helpers/editable_pages_helper.rb +22 -0
- data/app/helpers/languages_helper.rb +3 -0
- data/app/helpers/simple_image_helper.rb +66 -0
- data/app/mailers/application_mailer.rb +0 -2
- data/app/mailers/code_sender.rb +13 -2
- data/app/mailers/feedback_mailer.rb +5 -2
- data/app/mailers/user_mailer.rb +6 -1
- data/app/models/biovision_component.rb +43 -0
- data/app/models/biovision_parameter.rb +34 -0
- data/app/models/code.rb +22 -7
- data/app/models/code_type.rb +9 -1
- data/app/models/concerns/flat_priority.rb +50 -0
- data/app/models/concerns/nested_priority.rb +58 -0
- data/app/models/concerns/required_unique_slug.rb +5 -2
- data/app/models/editable_page.rb +49 -37
- data/app/models/foreign_site.rb +5 -3
- data/app/models/language.rb +15 -37
- data/app/models/metric.rb +2 -4
- data/app/models/privilege.rb +23 -45
- data/app/models/privilege_group.rb +6 -1
- data/app/models/simple_block.rb +66 -0
- data/app/models/user.rb +29 -26
- data/app/models/user_privilege.rb +1 -1
- data/app/services/biovision/components/base_component.rb +115 -0
- data/app/services/biovision/components/registration_component.rb +98 -0
- data/app/services/code_manager.rb +4 -1
- data/app/services/code_manager/confirmation.rb +8 -4
- data/app/services/code_manager/invitation.rb +9 -5
- data/app/services/code_manager/recovery.rb +9 -6
- data/app/services/user_manager.rb +5 -4
- data/app/services/user_profile_handler.rb +38 -11
- data/app/uploaders/avatar_uploader.rb +5 -1
- data/app/uploaders/editable_page_image_uploader.rb +4 -6
- data/app/uploaders/media_file_uploader.rb +6 -4
- data/app/uploaders/media_snapshot_uploader.rb +6 -2
- data/app/uploaders/simple_file_uploader.rb +12 -0
- data/app/uploaders/simple_image_uploader.rb +75 -0
- data/app/views/about/editable.html.erb +1 -1
- data/app/views/admin/agents/_filter.html.erb +1 -1
- data/app/views/admin/editable_pages/entity/_in_list.html.erb +16 -0
- data/app/views/admin/editable_pages/index.html.erb +8 -1
- data/app/views/admin/editable_pages/show.html.erb +21 -17
- data/app/views/admin/feedback_requests/entity/_in_list.html.erb +9 -1
- data/app/views/admin/index/_biovision_base.html.erb +5 -7
- data/app/views/admin/index/_components.html.erb +9 -0
- data/app/views/admin/index/dashboard/_editorial.html.erb +2 -2
- data/app/views/admin/index/dashboard/_settings.html.erb +2 -2
- data/app/views/admin/index/index.html.erb +2 -0
- data/app/views/admin/privileges/entity/_groups.html.erb +25 -25
- data/app/views/admin/privileges/entity/_in_list.html.erb +30 -9
- data/app/views/admin/privileges/index.html.erb +6 -1
- data/app/views/admin/privileges/show.html.erb +31 -18
- data/app/views/admin/settings/component/_new_parameter.html.erb +62 -0
- data/app/views/admin/settings/component/_parameters.html.erb +37 -0
- data/app/views/admin/settings/component/_setting.html.erb +18 -0
- data/app/views/admin/settings/component/_settings.html.erb +31 -0
- data/app/views/admin/settings/index.html.erb +27 -0
- data/app/views/admin/settings/show.html.erb +42 -0
- data/app/views/admin/simple_blocks/_nav_item.html.erb +6 -0
- data/app/views/admin/simple_blocks/entity/_in_list.html.erb +23 -0
- data/app/views/admin/simple_blocks/index.html.erb +21 -0
- data/app/views/admin/simple_blocks/show.html.erb +51 -0
- data/app/views/admin/tokens/_filter.html.erb +1 -1
- data/app/views/admin/users/_filter.html.erb +1 -1
- data/app/views/admin/users/entity/_privilege.html.erb +12 -21
- data/app/views/admin/users/entity/_privilege_tree.html.erb +17 -15
- data/app/views/admin/users/privileges.html.erb +9 -1
- data/app/views/admin/users/search.jbuilder +3 -3
- data/app/views/admin/users/show.html.erb +11 -6
- data/app/views/agents/_filter.html.erb +22 -22
- data/app/views/agents/_form.html.erb +25 -29
- data/app/views/application/forbidden.html.erb +9 -0
- data/app/views/application/forbidden.jbuilder +3 -0
- data/app/views/authentication/_form.html.erb +13 -13
- data/app/views/browsers/_form.html.erb +21 -25
- data/app/views/editable_blocks/_entity.html.erb +4 -1
- data/app/views/editable_pages/_form.html.erb +63 -62
- data/app/views/editable_pages/edit.html.erb +1 -1
- data/app/views/editable_pages/entity/_metadata.html.erb +4 -4
- data/app/views/editable_pages/new.html.erb +3 -3
- data/app/views/fallback/show.html.erb +8 -1
- data/app/views/feedback_requests/_form.html.erb +76 -52
- data/app/views/feedback_requests/create.js.erb +1 -10
- data/app/views/index/index/_editable.html.erb +0 -4
- data/app/views/metrics/_form.html.erb +38 -36
- data/app/views/my/confirmations/show.html.erb +5 -3
- data/app/views/my/profiles/closed.html.erb +7 -0
- data/app/views/my/profiles/edit/_form.html.erb +9 -9
- data/app/views/my/profiles/new.html.erb +9 -1
- data/app/views/my/profiles/new/_form.html.erb +22 -1
- data/app/views/my/recoveries/show.html.erb +2 -2
- data/app/views/privilege_groups/_form.html.erb +48 -21
- data/app/views/privileges/_form.html.erb +68 -36
- data/app/views/profiles/_profile.html.erb +3 -3
- data/app/views/shared/_pagination.jbuilder +7 -5
- data/app/views/shared/admin/_breadcrumbs.html.erb +1 -1
- data/app/views/shared/forms/_meta_texts.html.erb +3 -3
- data/app/views/shared/forms/_priority.html.erb +12 -0
- data/app/views/shared/forms/_state_container.html.erb +1 -0
- data/app/views/simple_blocks/_empty.html.erb +0 -0
- data/app/views/simple_blocks/_form.html.erb +120 -0
- data/app/views/simple_blocks/_simple_block.html.erb +26 -0
- data/app/views/simple_blocks/edit.html.erb +17 -0
- data/app/views/simple_blocks/new.html.erb +15 -0
- data/app/views/stored_values/_form.html.erb +57 -28
- data/app/views/tokens/_form.html.erb +31 -26
- data/app/views/users/_form.html.erb +1 -1
- data/config/initializers/carrierwave.rb +7 -2
- data/config/locales/common-ru.yml +5 -0
- data/config/locales/components-ru.yml +50 -0
- data/config/locales/editable-pages-en.yml +2 -0
- data/config/locales/editable-pages-ru.yml +50 -7
- data/config/locales/editable-pages-sv.yml +2 -0
- data/config/locales/feedback-ru.yml +1 -0
- data/config/locales/users-en.yml +0 -1
- data/config/locales/users-ru.yml +6 -1
- data/config/locales/users-sv.yml +0 -1
- data/config/routes.rb +32 -6
- data/db/migrate/20181217000000_create_biovision_components.rb +80 -0
- data/db/migrate/20181217000010_create_metrics.rb +40 -0
- data/db/migrate/20181217000015_create_browsers.rb +38 -0
- data/db/migrate/20181217000020_create_languages.rb +30 -0
- data/db/migrate/20181217000030_create_users.rb +118 -0
- data/db/migrate/20181217000035_create_codes.rb +51 -0
- data/db/migrate/20181217000040_create_privileges.rb +142 -0
- data/db/migrate/20181217000100_create_media_folders.rb +53 -0
- data/db/migrate/20181217000110_create_editable_pages.rb +90 -0
- data/db/migrate/20181217000200_create_feedback_requests.rb +27 -0
- data/db/migrate/20181217121211_add_uuid_to_users.rb +12 -0
- data/db/migrate/20181217121212_update_fields181217.rb +29 -0
- data/db/migrate/20190311121212_convert_json_columns.rb +47 -0
- data/db/migrate/20190324181818_add_data_to_feedback_requests.rb +14 -0
- data/db/migrate/20190326120000_create_simple_blocks.rb +31 -0
- data/db/{migrate → obsolete_migrations}/20171223333333_amend_foreign_keys.rb +0 -0
- data/db/{migrate → obsolete_migrations}/20180117151515_add_language_to_models.rb +0 -0
- data/db/{migrate → obsolete_migrations}/20180321000000_add_profile_data_to_users.rb +4 -4
- data/db/{migrate → obsolete_migrations}/20180405000000_add_consent_to_users.rb +0 -0
- data/db/{migrate → obsolete_migrations}/20180610222222_add_consent_to_feedback_requests.rb +0 -0
- data/db/{migrate → obsolete_migrations}/20180612111111_add_administrative_to_privilege.rb +0 -0
- data/db/{migrate → obsolete_migrations}/20180619121212_add_image_alt_text_to_editable_page.rb +0 -0
- data/db/{migrate → obsolete_migrations}/20180703111111_add_fields_to_editable_blocks.rb +0 -0
- data/db/{migrate → obsolete_migrations}/20180722222222_add_active_to_languages.rb +0 -0
- data/db/{migrate → obsolete_migrations}/20180725111111_add_referral_link_to_users.rb +0 -0
- data/db/obsolete_migrations/20181012222222_add_deletable_to_privileges.rb +19 -0
- data/db/obsolete_migrations/20181012222223_convert_stored_values.rb +13 -0
- data/db/obsolete_migrations/20181030080808_update_editable_pages_meta.rb +20 -0
- data/lib/biovision/base/base_methods.rb +19 -2
- data/lib/biovision/base/version.rb +3 -1
- data/lib/tasks/users.rake +19 -1
- metadata +75 -40
- data/app/views/admin/privileges/_list.html.erb +0 -15
- data/db/migrate/20170228000000_create_languages.rb +0 -23
- data/db/migrate/20170301000001_create_metrics.rb +0 -23
- data/db/migrate/20170301000002_create_metric_values.rb +0 -19
- data/db/migrate/20170301000101_create_browsers.rb +0 -22
- data/db/migrate/20170301000102_create_agents.rb +0 -22
- data/db/migrate/20170302000001_create_users.rb +0 -55
- data/db/migrate/20170302000003_create_tokens.rb +0 -23
- data/db/migrate/20170302000004_create_code_types.rb +0 -20
- data/db/migrate/20170302000005_create_codes.rb +0 -24
- data/db/migrate/20170302000101_create_privileges.rb +0 -41
- data/db/migrate/20170302000102_create_user_privileges.rb +0 -18
- data/db/migrate/20170302000103_create_privilege_groups.rb +0 -23
- data/db/migrate/20170302000104_create_privilege_group_privileges.rb +0 -24
- data/db/migrate/20170320000000_create_editable_pages.rb +0 -52
- data/db/migrate/20170425000001_create_foreign_sites.rb +0 -18
- data/db/migrate/20170425000002_create_foreign_users.rb +0 -23
- data/db/migrate/20170629120000_create_login_attempts.rb +0 -19
- data/db/migrate/20170823000001_create_stored_values.rb +0 -19
- data/db/migrate/20171202000000_create_media_folders.rb +0 -28
- data/db/migrate/20171202000001_create_media_files.rb +0 -27
- data/db/migrate/20171211000000_create_feedback_requests.rb +0 -33
- data/db/migrate/20180117160000_create_user_languages.rb +0 -17
- data/db/migrate/20180622140000_create_link_blocks.rb +0 -29
- data/db/migrate/20180622140001_create_link_block_items.rb +0 -23
- data/db/migrate/20180627190000_create_editable_blocks.rb +0 -39
@@ -60,18 +60,23 @@ class UsersController < ApplicationController
|
|
60
60
|
|
61
61
|
def entity_parameters
|
62
62
|
parameters = params.require(:user).permit(User.entity_parameters)
|
63
|
-
parameters.merge(profile_parameters)
|
63
|
+
parameters.merge(data: @entity.data.merge(profile: profile_parameters))
|
64
64
|
end
|
65
65
|
|
66
66
|
def creation_parameters
|
67
|
-
|
67
|
+
parameters = params.require(:user).permit(User.entity_parameters)
|
68
|
+
|
69
|
+
parameters[:consent] = true
|
70
|
+
parameters[:data] = { profile: profile_parameters }
|
71
|
+
|
72
|
+
parameters.merge(tracking_for_entity)
|
68
73
|
end
|
69
74
|
|
70
75
|
def profile_parameters
|
71
76
|
if params.key?(:user_profile)
|
72
77
|
permitted = UserProfileHandler.allowed_parameters
|
73
78
|
dirty = params.require(:user_profile).permit(permitted)
|
74
|
-
|
79
|
+
UserProfileHandler.clean_parameters(dirty)
|
75
80
|
else
|
76
81
|
{}
|
77
82
|
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Helper methods for user handling
|
1
4
|
module BiovisionUsersHelper
|
2
5
|
def genders_for_select
|
3
6
|
genders = [[t(:not_selected), '']]
|
@@ -6,7 +9,7 @@ module BiovisionUsersHelper
|
|
6
9
|
|
7
10
|
# @param [Integer] gender_id
|
8
11
|
def gender_name(gender_id)
|
9
|
-
prefix = 'activerecord.attributes.user_profile.genders
|
12
|
+
prefix = 'activerecord.attributes.user_profile.genders'
|
10
13
|
if UserProfileHandler::GENDERS.key?(gender_id)
|
11
14
|
t("#{prefix}.#{UserProfileHandler::GENDERS[gender_id]}")
|
12
15
|
else
|
@@ -16,18 +19,22 @@ module BiovisionUsersHelper
|
|
16
19
|
|
17
20
|
# @param [User] entity
|
18
21
|
# @param [String] text
|
19
|
-
|
22
|
+
# @param [Hash] options
|
23
|
+
def user_link(entity, text = entity&.profile_name, options = {})
|
20
24
|
return I18n.t(:anonymous) if entity.nil? || entity.deleted?
|
21
25
|
|
22
|
-
|
26
|
+
link_options = { class: 'profile' }.merge(options)
|
27
|
+
link_to(text, user_profile_path(slug: entity.screen_name), link_options)
|
23
28
|
end
|
24
29
|
|
25
30
|
# @param [User] entity
|
26
31
|
# @param [String] text
|
27
|
-
|
32
|
+
# @param [Hash] options
|
33
|
+
def admin_user_link(entity, text = entity&.profile_name, options = {})
|
28
34
|
return I18n.t(:anonymous) if entity.nil?
|
29
35
|
|
30
|
-
|
36
|
+
link_options = { class: 'profile' }.merge(options)
|
37
|
+
link_to(text, admin_user_path(id: entity.id), link_options)
|
31
38
|
end
|
32
39
|
|
33
40
|
# @param [ForeignUser] entity
|
@@ -51,41 +58,73 @@ module BiovisionUsersHelper
|
|
51
58
|
|
52
59
|
# @param [User] entity
|
53
60
|
def profile_avatar(entity)
|
54
|
-
if entity
|
55
|
-
|
61
|
+
if entity&.image.blank? || entity.deleted?
|
62
|
+
image_tag('biovision/base/placeholders/user.svg', alt: '')
|
56
63
|
else
|
57
|
-
|
64
|
+
user_image_profile(entity)
|
58
65
|
end
|
59
66
|
end
|
60
67
|
|
61
68
|
# @param [User] entity
|
62
|
-
|
63
|
-
|
64
|
-
|
69
|
+
# @param [Hash] options
|
70
|
+
def user_image_tiny(entity, options = {})
|
71
|
+
if entity&.image.blank? || entity.deleted?
|
72
|
+
image_tag('biovision/base/placeholders/user.svg', alt: '')
|
73
|
+
else
|
74
|
+
default_options = {
|
75
|
+
alt: entity.profile_name,
|
76
|
+
srcset: "#{entity.image.tiny_2x.url} 2x"
|
77
|
+
}
|
78
|
+
image_tag(entity.image.tiny.url, default_options.merge(options))
|
79
|
+
end
|
65
80
|
end
|
66
81
|
|
67
82
|
# @param [User] entity
|
68
|
-
|
69
|
-
|
70
|
-
|
83
|
+
# @param [Hash] options
|
84
|
+
def user_image_preview(entity, options = {})
|
85
|
+
if entity&.image.blank? || entity.deleted?
|
86
|
+
image_tag('biovision/base/placeholders/user.svg', alt: '')
|
87
|
+
else
|
88
|
+
default_options = {
|
89
|
+
alt: entity.profile_name,
|
90
|
+
srcset: "#{entity.image.preview_2x.url} 2x"
|
91
|
+
}
|
92
|
+
image_tag(entity.image.preview.url, default_options.merge(options))
|
93
|
+
end
|
71
94
|
end
|
72
95
|
|
73
96
|
# @param [User] entity
|
74
|
-
|
75
|
-
|
76
|
-
|
97
|
+
# @param [Hash] options
|
98
|
+
def user_image_profile(entity, options = {})
|
99
|
+
if entity&.image.blank? || entity.deleted?
|
100
|
+
image_tag('biovision/base/placeholders/user.svg', alt: '')
|
101
|
+
else
|
102
|
+
default_options = {
|
103
|
+
alt: entity.profile_name,
|
104
|
+
srcset: "#{entity.image.big.url} 2x"
|
105
|
+
}
|
106
|
+
image_tag(entity.image.profile.url, default_options.merge(options))
|
107
|
+
end
|
77
108
|
end
|
78
109
|
|
79
110
|
# @param [User] entity
|
80
|
-
|
81
|
-
|
82
|
-
|
111
|
+
# @param [Hash] options
|
112
|
+
def user_image_big(entity, options = {})
|
113
|
+
if entity&.image.blank? || entity.deleted?
|
114
|
+
image_tag('biovision/base/placeholders/user.svg', alt: '')
|
115
|
+
else
|
116
|
+
default_options = {
|
117
|
+
alt: entity.profile_name,
|
118
|
+
srcset: "#{entity.image.big_2x.url} 2x"
|
119
|
+
}
|
120
|
+
image_tag(entity.image.big.url, default_options.merge(options))
|
121
|
+
end
|
83
122
|
end
|
84
123
|
|
85
124
|
# @param [ForeignSite] foreign_site
|
86
125
|
def foreign_login_link(foreign_site)
|
87
126
|
image = "biovision/base/icons/foreign/#{foreign_site.slug}.svg"
|
88
|
-
path
|
127
|
+
path = "/auth/#{foreign_site.slug}"
|
89
128
|
link_to(image_tag(image, alt: foreign_site.name), path)
|
90
129
|
end
|
91
130
|
end
|
@@ -1,9 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Helper methods for handling editable pages and blocks
|
1
4
|
module EditablePagesHelper
|
2
5
|
# @param [EditablePage] entity
|
3
6
|
def admin_editable_page_link(entity)
|
4
7
|
link_to(entity.name, admin_editable_page_path(id: entity.id))
|
5
8
|
end
|
6
9
|
|
10
|
+
# @param [SimpleBlock] entity
|
11
|
+
# @param [String] text
|
12
|
+
# @param [Hash] options
|
13
|
+
def admin_simple_block_link(entity, text = entity.slug, options = {})
|
14
|
+
link_to(text, admin_simple_block_path(id: entity.id), options)
|
15
|
+
end
|
16
|
+
|
7
17
|
# @param [EditableBlock] entity
|
8
18
|
def admin_editable_block_link(entity)
|
9
19
|
link_to(entity.name, admin_editable_block_path(id: entity.id))
|
@@ -12,6 +22,7 @@ module EditablePagesHelper
|
|
12
22
|
# @param [EditablePage] entity
|
13
23
|
def editable_page_image_preview(entity)
|
14
24
|
return '' if entity.image.blank?
|
25
|
+
|
15
26
|
versions = "#{entity.image.preview_2x.url} 2x"
|
16
27
|
image_tag(entity.image.preview.url, alt: entity.name, srcset: versions)
|
17
28
|
end
|
@@ -19,13 +30,23 @@ module EditablePagesHelper
|
|
19
30
|
# @param [EditablePage] entity
|
20
31
|
def editable_page_image_medium(entity)
|
21
32
|
return '' if entity.image.blank?
|
33
|
+
|
22
34
|
versions = "#{entity.image.medium_2x.url} 2x"
|
23
35
|
image_tag(entity.image.medium.url, alt: entity.name, srcset: versions)
|
24
36
|
end
|
25
37
|
|
38
|
+
# @param [EditablePage] entity
|
39
|
+
def editable_page_image_hd(entity)
|
40
|
+
return '' if entity.image.blank?
|
41
|
+
|
42
|
+
versions = "#{entity.image.large.url} 2x"
|
43
|
+
image_tag(entity.image.medium_2x.url, alt: entity.name, srcset: versions)
|
44
|
+
end
|
45
|
+
|
26
46
|
# @param [EditableBlock] entity
|
27
47
|
def editable_block_image_preview(entity)
|
28
48
|
return '' if entity.image.blank?
|
49
|
+
|
29
50
|
versions = "#{entity.image.preview_2x.url} 2x"
|
30
51
|
image_tag(entity.image.preview.url, alt: entity.name, srcset: versions)
|
31
52
|
end
|
@@ -33,6 +54,7 @@ module EditablePagesHelper
|
|
33
54
|
# @param [EditableBlock] entity
|
34
55
|
def editable_block_image_medium(entity)
|
35
56
|
return '' if entity.image.blank?
|
57
|
+
|
36
58
|
versions = "#{entity.image.medium_2x.url} 2x"
|
37
59
|
image_tag(entity.image.medium.url, alt: entity.name, srcset: versions)
|
38
60
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Helper methods for displaying versions for SimpleImageUploader
|
4
|
+
module SimpleImageHelper
|
5
|
+
# @param [ApplicationRecord] entity
|
6
|
+
# @param [Hash] options
|
7
|
+
def simple_image_preview(entity, options = {})
|
8
|
+
return '' if entity.image.blank?
|
9
|
+
|
10
|
+
default = {
|
11
|
+
alt: entity.respond_to?(:image_alt_text) ? entity.image_alt_text : ''
|
12
|
+
}
|
13
|
+
image_tag(entity.image.preview_url, default.merge(options))
|
14
|
+
end
|
15
|
+
|
16
|
+
# @param [ApplicationRecord] entity
|
17
|
+
# @param [Hash] options
|
18
|
+
def simple_image_small(entity, options = {})
|
19
|
+
return '' if entity.image.blank?
|
20
|
+
|
21
|
+
default = {
|
22
|
+
alt: entity.respond_to?(:image_alt_text) ? entity.image_alt_text : '',
|
23
|
+
}
|
24
|
+
default[:srcset] = "#{entity.image.medium.url} 2x" if entity.image.raster?
|
25
|
+
|
26
|
+
image_tag(entity.image.small_url, default.merge(options))
|
27
|
+
end
|
28
|
+
|
29
|
+
# @param [ApplicationRecord] entity
|
30
|
+
# @param [Hash] options
|
31
|
+
def simple_image_medium(entity, options = {})
|
32
|
+
return '' if entity.image.blank?
|
33
|
+
|
34
|
+
default = {
|
35
|
+
alt: entity.respond_to?(:image_alt_text) ? entity.image_alt_text : '',
|
36
|
+
}
|
37
|
+
default[:srcset] = "#{entity.image.large.url} 2x" if entity.image.raster?
|
38
|
+
|
39
|
+
image_tag(entity.image.medium_url, default.merge(options))
|
40
|
+
end
|
41
|
+
|
42
|
+
# @param [ApplicationRecord] entity
|
43
|
+
# @param [Hash] options
|
44
|
+
def simple_image_large(entity, options = {})
|
45
|
+
return '' if entity.image.blank?
|
46
|
+
|
47
|
+
default = {
|
48
|
+
alt: entity.respond_to?(:image_alt_text) ? entity.image_alt_text : '',
|
49
|
+
}
|
50
|
+
default[:srcset] = "#{entity.image.hd.url} 2x" if entity.image.raster?
|
51
|
+
|
52
|
+
image_tag(entity.image.large_url, default.merge(options))
|
53
|
+
end
|
54
|
+
|
55
|
+
# @param [ApplicationRecord] entity
|
56
|
+
# @param [Hash] options
|
57
|
+
def simple_image_hd(entity, options = {})
|
58
|
+
return '' if entity.image.blank?
|
59
|
+
|
60
|
+
default = {
|
61
|
+
alt: entity.respond_to?(:image_alt_text) ? entity.image_alt_text : ''
|
62
|
+
}
|
63
|
+
|
64
|
+
image_tag(entity.image.hd_url, default.merge(options))
|
65
|
+
end
|
66
|
+
end
|
data/app/mailers/code_sender.rb
CHANGED
@@ -1,15 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Mailer for sending codes to users
|
1
4
|
class CodeSender < ApplicationMailer
|
5
|
+
# Email confirmation code
|
6
|
+
#
|
2
7
|
# @param [Integer] code_id
|
3
8
|
def email(code_id)
|
4
9
|
@code = Code.find_by(id: code_id)
|
5
10
|
|
6
|
-
|
11
|
+
return if @code.nil? || @code.user.email.blank?
|
12
|
+
|
13
|
+
mail to: @code.user.email
|
7
14
|
end
|
8
15
|
|
16
|
+
# Password reset code
|
17
|
+
#
|
9
18
|
# @param [Integer] code_id
|
10
19
|
def password(code_id)
|
11
20
|
@code = Code.find_by(id: code_id)
|
12
21
|
|
13
|
-
|
22
|
+
return if @code.nil? || @code.user.email.blank?
|
23
|
+
|
24
|
+
mail to: @code.user.email
|
14
25
|
end
|
15
26
|
end
|
@@ -1,10 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Mailer for sending feedback requests
|
1
4
|
class FeedbackMailer < ApplicationMailer
|
2
5
|
# @param [Integer] id
|
3
6
|
def new_feedback_request(id)
|
4
7
|
@entity = FeedbackRequest.find_by(id: id)
|
5
8
|
|
6
|
-
receiver =
|
9
|
+
receiver = BiovisionComponent['contact'].receive('feedback_receiver')
|
7
10
|
|
8
|
-
mail to: receiver unless @entity.nil? || receiver.
|
11
|
+
mail to: receiver unless @entity.nil? || receiver.blank?
|
9
12
|
end
|
10
13
|
end
|
data/app/mailers/user_mailer.rb
CHANGED
@@ -1,8 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Mailer for user-related things
|
1
4
|
class UserMailer < ApplicationMailer
|
2
5
|
# @param [Integer] user_id
|
3
6
|
def login_attempt(user_id)
|
4
7
|
@user = User.find_by(id: user_id)
|
5
8
|
|
6
|
-
|
9
|
+
return if @user.nil? || @user.email.blank?
|
10
|
+
|
11
|
+
mail to: @user.email
|
7
12
|
end
|
8
13
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Biovision component
|
4
|
+
#
|
5
|
+
# Attributes:
|
6
|
+
# - created_at [DateTime]
|
7
|
+
# - settings [JSON]
|
8
|
+
# - slug [String]
|
9
|
+
# - updated_at [DateTime]
|
10
|
+
class BiovisionComponent < ApplicationRecord
|
11
|
+
include RequiredUniqueSlug
|
12
|
+
|
13
|
+
has_many :biovision_parameters, dependent: :delete_all
|
14
|
+
|
15
|
+
# Find component by slug
|
16
|
+
#
|
17
|
+
# @param [String] slug
|
18
|
+
def self.[](slug)
|
19
|
+
find_by(slug: slug)
|
20
|
+
end
|
21
|
+
|
22
|
+
# @param [String] slug
|
23
|
+
def receive(slug)
|
24
|
+
biovision_parameters.find_by(slug: slug)&.value
|
25
|
+
end
|
26
|
+
|
27
|
+
# @param [String] slug
|
28
|
+
# @param [String] default
|
29
|
+
def receive!(slug, default = '')
|
30
|
+
biovision_parameters.find_by(slug: slug)&.value || default
|
31
|
+
end
|
32
|
+
|
33
|
+
# @param [String] slug
|
34
|
+
# @param [String] value
|
35
|
+
def []=(slug, value)
|
36
|
+
parameter = biovision_parameters.find_by(slug: slug)
|
37
|
+
if parameter.nil?
|
38
|
+
biovision_parameters.create!(slug: slug, value: value.to_s)
|
39
|
+
else
|
40
|
+
parameter.update!(value: value.to_s)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Biovision component parameter
|
4
|
+
#
|
5
|
+
# Fields:
|
6
|
+
# - biovision_component_id [BiovisionComponent]
|
7
|
+
# - created_at [DateTime]
|
8
|
+
# - deletable [Boolean]
|
9
|
+
# - slug [String]
|
10
|
+
# - updated_at [DateTime]
|
11
|
+
# - value [String], optional
|
12
|
+
class BiovisionParameter < ApplicationRecord
|
13
|
+
SLUG_LIMIT = 250
|
14
|
+
SLUG_PATTERN = /\A[a-z][-a-z0-9_]+[a-z0-9]\z/i.freeze
|
15
|
+
SLUG_PATTERN_HTML = '^[a-zA-Z][-a-zA-Z0-9_]+[a-zA-Z0-9]$'
|
16
|
+
VALUE_LIMIT = 65_535
|
17
|
+
|
18
|
+
belongs_to :biovision_component
|
19
|
+
|
20
|
+
before_validation { self.slug = slug.to_s.strip.downcase }
|
21
|
+
|
22
|
+
validates_uniqueness_of :slug, scope: [:biovision_component_id]
|
23
|
+
validates_presence_of :slug
|
24
|
+
validates_format_of :slug, with: SLUG_PATTERN
|
25
|
+
validates_length_of :slug, maximum: SLUG_LIMIT
|
26
|
+
validates_length_of :value, maximum: VALUE_LIMIT
|
27
|
+
|
28
|
+
scope :ordered_by_slug, -> { order('slug asc') }
|
29
|
+
scope :list_for_administration, -> { ordered_by_slug }
|
30
|
+
|
31
|
+
def self.entity_parameters
|
32
|
+
%i[slug value]
|
33
|
+
end
|
34
|
+
end
|
data/app/models/code.rb
CHANGED
@@ -1,10 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Code for user
|
4
|
+
#
|
5
|
+
# Attributes:
|
6
|
+
# - agent_id [Agent], optional
|
7
|
+
# - body [String]
|
8
|
+
# - code_type_id [CodeType]
|
9
|
+
# - created_at [DateTime]
|
10
|
+
# - ip [Inet]
|
11
|
+
# - payload [String], optional
|
12
|
+
# - quantity [Integer]
|
13
|
+
# - updated_at [DateTime]
|
14
|
+
# - user_id [User], optional
|
1
15
|
class Code < ApplicationRecord
|
2
16
|
include HasOwner
|
3
17
|
|
4
|
-
PER_PAGE = 20
|
5
18
|
BODY_LIMIT = 50
|
6
|
-
PAYLOAD_LIMIT =
|
7
|
-
QUANTITY_RANGE = (0..
|
19
|
+
PAYLOAD_LIMIT = 255
|
20
|
+
QUANTITY_RANGE = (0..32_767).freeze
|
8
21
|
|
9
22
|
belongs_to :user, optional: true
|
10
23
|
belongs_to :agent, optional: true
|
@@ -21,18 +34,19 @@ class Code < ApplicationRecord
|
|
21
34
|
|
22
35
|
scope :recent, -> { order('id desc') }
|
23
36
|
scope :active, -> { where('quantity > 0') }
|
37
|
+
scope :list_for_administration, -> { recent }
|
24
38
|
|
25
39
|
# @param [Integer] page
|
26
40
|
def self.page_for_administration(page = 1)
|
27
|
-
|
41
|
+
list_for_administration.page(page)
|
28
42
|
end
|
29
43
|
|
30
44
|
def self.entity_parameters
|
31
|
-
%i
|
45
|
+
%i[body payload quantity]
|
32
46
|
end
|
33
47
|
|
34
48
|
def self.creation_parameters
|
35
|
-
entity_parameters + %i
|
49
|
+
entity_parameters + %i[user_id code_type_id]
|
36
50
|
end
|
37
51
|
|
38
52
|
def activated?
|
@@ -40,13 +54,14 @@ class Code < ApplicationRecord
|
|
40
54
|
end
|
41
55
|
|
42
56
|
def active?
|
43
|
-
quantity
|
57
|
+
quantity.positive?
|
44
58
|
end
|
45
59
|
|
46
60
|
private
|
47
61
|
|
48
62
|
def generate_body
|
49
63
|
return unless body.nil?
|
64
|
+
|
50
65
|
number = SecureRandom.random_number(0xffff_ffff_ffff_ffff)
|
51
66
|
self.body = number.to_s(36).scan(/.{4}/).join('-').upcase
|
52
67
|
end
|