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.
Files changed (223) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -21
  3. data/app/assets/images/biovision/base/icons/apply.svg +4 -0
  4. data/app/assets/images/biovision/base/icons/components/contact.svg +26 -0
  5. data/app/assets/images/biovision/base/icons/components/registration.svg +17 -0
  6. data/app/assets/images/biovision/base/icons/destroy.svg +11 -8
  7. data/app/assets/images/biovision/base/icons/settings.svg +41 -0
  8. data/app/assets/images/biovision/base/icons/slider/arrow-left.svg +4 -0
  9. data/app/assets/images/biovision/base/icons/slider/arrow-right.svg +4 -0
  10. data/app/assets/images/biovision/base/placeholders/16x9.svg +10 -3
  11. data/app/assets/images/biovision/base/placeholders/1x1.svg +12 -0
  12. data/app/assets/images/biovision/base/placeholders/3x2.svg +10 -3
  13. data/app/assets/javascripts/biovision/base/biovision.js +780 -461
  14. data/app/assets/javascripts/biovision/base/components/carousel.js +123 -0
  15. data/app/assets/javascripts/biovision/base/polyfills.js +149 -0
  16. data/app/assets/stylesheets/biovision/base/admin.scss +85 -46
  17. data/app/assets/stylesheets/biovision/base/admin/components.scss +141 -0
  18. data/app/assets/stylesheets/biovision/base/biovision.scss +149 -33
  19. data/app/assets/stylesheets/biovision/base/buttons/buttons-common.scss +22 -0
  20. data/app/assets/stylesheets/biovision/base/default.scss +6 -6
  21. data/app/assets/stylesheets/biovision/base/default_admin.scss +25 -8
  22. data/app/assets/stylesheets/biovision/base/themes/simple-layout.scss +0 -3
  23. data/app/controllers/admin/editable_pages_controller.rb +6 -4
  24. data/app/controllers/admin/privileges_controller.rb +2 -3
  25. data/app/controllers/admin/settings_controller.rb +52 -0
  26. data/app/controllers/admin/simple_blocks_controller.rb +28 -0
  27. data/app/controllers/admin/users_controller.rb +1 -1
  28. data/app/controllers/agents_controller.rb +4 -4
  29. data/app/controllers/authentication_controller.rb +28 -6
  30. data/app/controllers/browsers_controller.rb +4 -4
  31. data/app/controllers/concerns/authentication.rb +8 -5
  32. data/app/controllers/concerns/entity_priority.rb +3 -0
  33. data/app/controllers/concerns/lockable_entity.rb +6 -3
  34. data/app/controllers/concerns/removable_image.rb +4 -5
  35. data/app/controllers/concerns/toggleable_entity.rb +4 -5
  36. data/app/controllers/editable_pages_controller.rb +14 -8
  37. data/app/controllers/fallback_controller.rb +7 -2
  38. data/app/controllers/feedback_requests_controller.rb +23 -8
  39. data/app/controllers/metrics_controller.rb +3 -3
  40. data/app/controllers/my/profiles_controller.rb +32 -15
  41. data/app/controllers/privilege_groups_controller.rb +4 -4
  42. data/app/controllers/privileges_controller.rb +7 -26
  43. data/app/controllers/simple_blocks_controller.rb +63 -0
  44. data/app/controllers/stored_values_controller.rb +4 -4
  45. data/app/controllers/tokens_controller.rb +4 -4
  46. data/app/controllers/users_controller.rb +8 -3
  47. data/app/helpers/biovision_users_helper.rb +60 -21
  48. data/app/helpers/editable_pages_helper.rb +22 -0
  49. data/app/helpers/languages_helper.rb +3 -0
  50. data/app/helpers/simple_image_helper.rb +66 -0
  51. data/app/mailers/application_mailer.rb +0 -2
  52. data/app/mailers/code_sender.rb +13 -2
  53. data/app/mailers/feedback_mailer.rb +5 -2
  54. data/app/mailers/user_mailer.rb +6 -1
  55. data/app/models/biovision_component.rb +43 -0
  56. data/app/models/biovision_parameter.rb +34 -0
  57. data/app/models/code.rb +22 -7
  58. data/app/models/code_type.rb +9 -1
  59. data/app/models/concerns/flat_priority.rb +50 -0
  60. data/app/models/concerns/nested_priority.rb +58 -0
  61. data/app/models/concerns/required_unique_slug.rb +5 -2
  62. data/app/models/editable_page.rb +49 -37
  63. data/app/models/foreign_site.rb +5 -3
  64. data/app/models/language.rb +15 -37
  65. data/app/models/metric.rb +2 -4
  66. data/app/models/privilege.rb +23 -45
  67. data/app/models/privilege_group.rb +6 -1
  68. data/app/models/simple_block.rb +66 -0
  69. data/app/models/user.rb +29 -26
  70. data/app/models/user_privilege.rb +1 -1
  71. data/app/services/biovision/components/base_component.rb +115 -0
  72. data/app/services/biovision/components/registration_component.rb +98 -0
  73. data/app/services/code_manager.rb +4 -1
  74. data/app/services/code_manager/confirmation.rb +8 -4
  75. data/app/services/code_manager/invitation.rb +9 -5
  76. data/app/services/code_manager/recovery.rb +9 -6
  77. data/app/services/user_manager.rb +5 -4
  78. data/app/services/user_profile_handler.rb +38 -11
  79. data/app/uploaders/avatar_uploader.rb +5 -1
  80. data/app/uploaders/editable_page_image_uploader.rb +4 -6
  81. data/app/uploaders/media_file_uploader.rb +6 -4
  82. data/app/uploaders/media_snapshot_uploader.rb +6 -2
  83. data/app/uploaders/simple_file_uploader.rb +12 -0
  84. data/app/uploaders/simple_image_uploader.rb +75 -0
  85. data/app/views/about/editable.html.erb +1 -1
  86. data/app/views/admin/agents/_filter.html.erb +1 -1
  87. data/app/views/admin/editable_pages/entity/_in_list.html.erb +16 -0
  88. data/app/views/admin/editable_pages/index.html.erb +8 -1
  89. data/app/views/admin/editable_pages/show.html.erb +21 -17
  90. data/app/views/admin/feedback_requests/entity/_in_list.html.erb +9 -1
  91. data/app/views/admin/index/_biovision_base.html.erb +5 -7
  92. data/app/views/admin/index/_components.html.erb +9 -0
  93. data/app/views/admin/index/dashboard/_editorial.html.erb +2 -2
  94. data/app/views/admin/index/dashboard/_settings.html.erb +2 -2
  95. data/app/views/admin/index/index.html.erb +2 -0
  96. data/app/views/admin/privileges/entity/_groups.html.erb +25 -25
  97. data/app/views/admin/privileges/entity/_in_list.html.erb +30 -9
  98. data/app/views/admin/privileges/index.html.erb +6 -1
  99. data/app/views/admin/privileges/show.html.erb +31 -18
  100. data/app/views/admin/settings/component/_new_parameter.html.erb +62 -0
  101. data/app/views/admin/settings/component/_parameters.html.erb +37 -0
  102. data/app/views/admin/settings/component/_setting.html.erb +18 -0
  103. data/app/views/admin/settings/component/_settings.html.erb +31 -0
  104. data/app/views/admin/settings/index.html.erb +27 -0
  105. data/app/views/admin/settings/show.html.erb +42 -0
  106. data/app/views/admin/simple_blocks/_nav_item.html.erb +6 -0
  107. data/app/views/admin/simple_blocks/entity/_in_list.html.erb +23 -0
  108. data/app/views/admin/simple_blocks/index.html.erb +21 -0
  109. data/app/views/admin/simple_blocks/show.html.erb +51 -0
  110. data/app/views/admin/tokens/_filter.html.erb +1 -1
  111. data/app/views/admin/users/_filter.html.erb +1 -1
  112. data/app/views/admin/users/entity/_privilege.html.erb +12 -21
  113. data/app/views/admin/users/entity/_privilege_tree.html.erb +17 -15
  114. data/app/views/admin/users/privileges.html.erb +9 -1
  115. data/app/views/admin/users/search.jbuilder +3 -3
  116. data/app/views/admin/users/show.html.erb +11 -6
  117. data/app/views/agents/_filter.html.erb +22 -22
  118. data/app/views/agents/_form.html.erb +25 -29
  119. data/app/views/application/forbidden.html.erb +9 -0
  120. data/app/views/application/forbidden.jbuilder +3 -0
  121. data/app/views/authentication/_form.html.erb +13 -13
  122. data/app/views/browsers/_form.html.erb +21 -25
  123. data/app/views/editable_blocks/_entity.html.erb +4 -1
  124. data/app/views/editable_pages/_form.html.erb +63 -62
  125. data/app/views/editable_pages/edit.html.erb +1 -1
  126. data/app/views/editable_pages/entity/_metadata.html.erb +4 -4
  127. data/app/views/editable_pages/new.html.erb +3 -3
  128. data/app/views/fallback/show.html.erb +8 -1
  129. data/app/views/feedback_requests/_form.html.erb +76 -52
  130. data/app/views/feedback_requests/create.js.erb +1 -10
  131. data/app/views/index/index/_editable.html.erb +0 -4
  132. data/app/views/metrics/_form.html.erb +38 -36
  133. data/app/views/my/confirmations/show.html.erb +5 -3
  134. data/app/views/my/profiles/closed.html.erb +7 -0
  135. data/app/views/my/profiles/edit/_form.html.erb +9 -9
  136. data/app/views/my/profiles/new.html.erb +9 -1
  137. data/app/views/my/profiles/new/_form.html.erb +22 -1
  138. data/app/views/my/recoveries/show.html.erb +2 -2
  139. data/app/views/privilege_groups/_form.html.erb +48 -21
  140. data/app/views/privileges/_form.html.erb +68 -36
  141. data/app/views/profiles/_profile.html.erb +3 -3
  142. data/app/views/shared/_pagination.jbuilder +7 -5
  143. data/app/views/shared/admin/_breadcrumbs.html.erb +1 -1
  144. data/app/views/shared/forms/_meta_texts.html.erb +3 -3
  145. data/app/views/shared/forms/_priority.html.erb +12 -0
  146. data/app/views/shared/forms/_state_container.html.erb +1 -0
  147. data/app/views/simple_blocks/_empty.html.erb +0 -0
  148. data/app/views/simple_blocks/_form.html.erb +120 -0
  149. data/app/views/simple_blocks/_simple_block.html.erb +26 -0
  150. data/app/views/simple_blocks/edit.html.erb +17 -0
  151. data/app/views/simple_blocks/new.html.erb +15 -0
  152. data/app/views/stored_values/_form.html.erb +57 -28
  153. data/app/views/tokens/_form.html.erb +31 -26
  154. data/app/views/users/_form.html.erb +1 -1
  155. data/config/initializers/carrierwave.rb +7 -2
  156. data/config/locales/common-ru.yml +5 -0
  157. data/config/locales/components-ru.yml +50 -0
  158. data/config/locales/editable-pages-en.yml +2 -0
  159. data/config/locales/editable-pages-ru.yml +50 -7
  160. data/config/locales/editable-pages-sv.yml +2 -0
  161. data/config/locales/feedback-ru.yml +1 -0
  162. data/config/locales/users-en.yml +0 -1
  163. data/config/locales/users-ru.yml +6 -1
  164. data/config/locales/users-sv.yml +0 -1
  165. data/config/routes.rb +32 -6
  166. data/db/migrate/20181217000000_create_biovision_components.rb +80 -0
  167. data/db/migrate/20181217000010_create_metrics.rb +40 -0
  168. data/db/migrate/20181217000015_create_browsers.rb +38 -0
  169. data/db/migrate/20181217000020_create_languages.rb +30 -0
  170. data/db/migrate/20181217000030_create_users.rb +118 -0
  171. data/db/migrate/20181217000035_create_codes.rb +51 -0
  172. data/db/migrate/20181217000040_create_privileges.rb +142 -0
  173. data/db/migrate/20181217000100_create_media_folders.rb +53 -0
  174. data/db/migrate/20181217000110_create_editable_pages.rb +90 -0
  175. data/db/migrate/20181217000200_create_feedback_requests.rb +27 -0
  176. data/db/migrate/20181217121211_add_uuid_to_users.rb +12 -0
  177. data/db/migrate/20181217121212_update_fields181217.rb +29 -0
  178. data/db/migrate/20190311121212_convert_json_columns.rb +47 -0
  179. data/db/migrate/20190324181818_add_data_to_feedback_requests.rb +14 -0
  180. data/db/migrate/20190326120000_create_simple_blocks.rb +31 -0
  181. data/db/{migrate → obsolete_migrations}/20171223333333_amend_foreign_keys.rb +0 -0
  182. data/db/{migrate → obsolete_migrations}/20180117151515_add_language_to_models.rb +0 -0
  183. data/db/{migrate → obsolete_migrations}/20180321000000_add_profile_data_to_users.rb +4 -4
  184. data/db/{migrate → obsolete_migrations}/20180405000000_add_consent_to_users.rb +0 -0
  185. data/db/{migrate → obsolete_migrations}/20180610222222_add_consent_to_feedback_requests.rb +0 -0
  186. data/db/{migrate → obsolete_migrations}/20180612111111_add_administrative_to_privilege.rb +0 -0
  187. data/db/{migrate → obsolete_migrations}/20180619121212_add_image_alt_text_to_editable_page.rb +0 -0
  188. data/db/{migrate → obsolete_migrations}/20180703111111_add_fields_to_editable_blocks.rb +0 -0
  189. data/db/{migrate → obsolete_migrations}/20180722222222_add_active_to_languages.rb +0 -0
  190. data/db/{migrate → obsolete_migrations}/20180725111111_add_referral_link_to_users.rb +0 -0
  191. data/db/obsolete_migrations/20181012222222_add_deletable_to_privileges.rb +19 -0
  192. data/db/obsolete_migrations/20181012222223_convert_stored_values.rb +13 -0
  193. data/db/obsolete_migrations/20181030080808_update_editable_pages_meta.rb +20 -0
  194. data/lib/biovision/base/base_methods.rb +19 -2
  195. data/lib/biovision/base/version.rb +3 -1
  196. data/lib/tasks/users.rake +19 -1
  197. metadata +75 -40
  198. data/app/views/admin/privileges/_list.html.erb +0 -15
  199. data/db/migrate/20170228000000_create_languages.rb +0 -23
  200. data/db/migrate/20170301000001_create_metrics.rb +0 -23
  201. data/db/migrate/20170301000002_create_metric_values.rb +0 -19
  202. data/db/migrate/20170301000101_create_browsers.rb +0 -22
  203. data/db/migrate/20170301000102_create_agents.rb +0 -22
  204. data/db/migrate/20170302000001_create_users.rb +0 -55
  205. data/db/migrate/20170302000003_create_tokens.rb +0 -23
  206. data/db/migrate/20170302000004_create_code_types.rb +0 -20
  207. data/db/migrate/20170302000005_create_codes.rb +0 -24
  208. data/db/migrate/20170302000101_create_privileges.rb +0 -41
  209. data/db/migrate/20170302000102_create_user_privileges.rb +0 -18
  210. data/db/migrate/20170302000103_create_privilege_groups.rb +0 -23
  211. data/db/migrate/20170302000104_create_privilege_group_privileges.rb +0 -24
  212. data/db/migrate/20170320000000_create_editable_pages.rb +0 -52
  213. data/db/migrate/20170425000001_create_foreign_sites.rb +0 -18
  214. data/db/migrate/20170425000002_create_foreign_users.rb +0 -23
  215. data/db/migrate/20170629120000_create_login_attempts.rb +0 -19
  216. data/db/migrate/20170823000001_create_stored_values.rb +0 -19
  217. data/db/migrate/20171202000000_create_media_folders.rb +0 -28
  218. data/db/migrate/20171202000001_create_media_files.rb +0 -27
  219. data/db/migrate/20171211000000_create_feedback_requests.rb +0 -33
  220. data/db/migrate/20180117160000_create_user_languages.rb +0 -17
  221. data/db/migrate/20180622140000_create_link_blocks.rb +0 -29
  222. data/db/migrate/20180622140001_create_link_block_items.rb +0 -23
  223. 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
- entity_parameters.merge(tracking_for_entity).merge(consent: true)
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
- { profile_data: UserProfileHandler.clean_parameters(dirty) }
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
- def user_link(entity, text = entity&.profile_name)
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
- link_to(text, user_profile_path(slug: entity.screen_name), class: 'profile')
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
- def admin_user_link(entity, text = entity&.profile_name)
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
- link_to(text, admin_user_path(id: entity.id), class: 'profile')
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.is_a?(User) && !entity.image.blank? && !entity.deleted?
55
- user_image_profile(entity)
61
+ if entity&.image.blank? || entity.deleted?
62
+ image_tag('biovision/base/placeholders/user.svg', alt: '')
56
63
  else
57
- image_tag('biovision/base/placeholders/user.svg')
64
+ user_image_profile(entity)
58
65
  end
59
66
  end
60
67
 
61
68
  # @param [User] entity
62
- def user_image_tiny(entity)
63
- versions = "#{entity.image.tiny_2x.url} 2x"
64
- image_tag(entity.image.tiny.url, alt: entity.profile_name, srcset: versions)
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
- def user_image_preview(entity)
69
- versions = "#{entity.image.preview_2x.url} 2x"
70
- image_tag(entity.image.preview.url, alt: entity.profile_name, srcset: versions)
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
- def user_image_profile(entity)
75
- versions = "#{entity.image.big.url} 2x"
76
- image_tag(entity.image.profile.url, alt: entity.profile_name, srcset: versions)
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
- def user_image_big(entity)
81
- versions = "#{entity.image.big_2x.url} 2x"
82
- image_tag(entity.image.big.url, alt: entity.profile_name, srcset: versions)
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 = "/auth/#{foreign_site.slug}"
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
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Helper for language operations
1
4
  module LanguagesHelper
2
5
  # @param [Language] entity
3
6
  def language_name(entity)
@@ -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
@@ -1,5 +1,3 @@
1
1
  class ApplicationMailer < ActionMailer::Base
2
- default from: 'from@example.com'
3
2
  layout 'mailer'
4
3
  end
5
-
@@ -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
- mail to: @code.user.email unless @code.nil?
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
- mail to: @code.user.email unless @code.nil?
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 = StoredValue.receive('feedback_receiver')
9
+ receiver = BiovisionComponent['contact'].receive('feedback_receiver')
7
10
 
8
- mail to: receiver unless @entity.nil? || receiver.nil?
11
+ mail to: receiver unless @entity.nil? || receiver.blank?
9
12
  end
10
13
  end
@@ -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
- mail to: @user.email unless @user&.email.blank?
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 = 250
7
- QUANTITY_RANGE = (0..32767)
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
- recent.page(page).per(PER_PAGE)
41
+ list_for_administration.page(page)
28
42
  end
29
43
 
30
44
  def self.entity_parameters
31
- %i(body payload quantity)
45
+ %i[body payload quantity]
32
46
  end
33
47
 
34
48
  def self.creation_parameters
35
- entity_parameters + %i(user_id code_type_id)
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 > 0
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