biovision 0.0.200518.1 → 0.12.211124.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (345) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +105 -52
  3. data/app/assets/images/biovision/icons/back.svg +19 -0
  4. data/app/assets/images/biovision/icons/create.svg +19 -0
  5. data/app/assets/images/biovision/icons/destroy.svg +12 -0
  6. data/app/assets/images/biovision/icons/dropdown.svg +3 -0
  7. data/app/assets/images/biovision/icons/edit.svg +22 -0
  8. data/app/assets/images/biovision/icons/gear.svg +11 -0
  9. data/app/assets/images/biovision/icons/return.svg +25 -0
  10. data/app/assets/images/biovision/icons/world.svg +11 -0
  11. data/app/assets/stylesheets/biovision/admin/components/users.scss +20 -0
  12. data/app/assets/stylesheets/biovision/admin/components.scss +13 -1
  13. data/app/assets/stylesheets/biovision/admin/layout.scss +27 -12
  14. data/app/assets/stylesheets/biovision/biovision.scss +105 -26
  15. data/app/assets/stylesheets/biovision/components/breadcrumbs.scss +13 -0
  16. data/app/assets/stylesheets/biovision/components/buttons.scss +130 -0
  17. data/app/assets/stylesheets/biovision/components/filters.scss +39 -0
  18. data/app/assets/stylesheets/biovision/components/forms.scss +208 -1
  19. data/app/assets/stylesheets/biovision/components/lists.scss +6 -7
  20. data/app/assets/stylesheets/biovision/{biovision → components}/messages.scss +9 -0
  21. data/app/assets/stylesheets/biovision/components/pagination.scss +34 -0
  22. data/app/assets/stylesheets/biovision/components/quick_search.scss +24 -0
  23. data/app/assets/stylesheets/biovision/components/simple_image.scss +112 -0
  24. data/app/assets/stylesheets/biovision/components/toggleable.scss +71 -0
  25. data/app/assets/stylesheets/biovision/components.scss +7 -0
  26. data/app/assets/stylesheets/biovision/default.scss +4 -4
  27. data/app/assets/stylesheets/biovision/themes/default_theme/components/users/dashboard.scss +4 -0
  28. data/app/assets/stylesheets/biovision/themes/default_theme/components/users/form_tabs.scss +101 -0
  29. data/app/assets/stylesheets/biovision/themes/default_theme/components/users/profile.scss +77 -0
  30. data/app/assets/stylesheets/biovision/themes/default_theme/components/users.scss +3 -0
  31. data/app/assets/stylesheets/biovision/themes/default_theme/components.scss +2 -3
  32. data/app/assets/stylesheets/biovision/themes/default_theme/layout/footer.scss +3 -0
  33. data/app/assets/stylesheets/biovision/themes/default_theme/layout/header.scss +12 -0
  34. data/app/assets/stylesheets/biovision/themes/default_theme/layout.scss +8 -19
  35. data/app/assets/stylesheets/biovision/themes/default_theme.scss +0 -1
  36. data/app/assets/stylesheets/biovision/vars.scss +5 -0
  37. data/app/controllers/admin/biovision_components_controller.rb +10 -0
  38. data/app/controllers/admin/components_controller.rb +37 -97
  39. data/app/controllers/admin/dynamic_blocks_controller.rb +15 -0
  40. data/app/controllers/admin/dynamic_pages_controller.rb +15 -0
  41. data/app/controllers/admin/index_controller.rb +8 -2
  42. data/app/controllers/admin/navigation_groups_controller.rb +45 -0
  43. data/app/controllers/admin/tokens_controller.rb +15 -0
  44. data/app/controllers/admin/users_controller.rb +101 -0
  45. data/app/controllers/admin_controller.rb +2 -8
  46. data/app/controllers/authentication_controller.rb +6 -34
  47. data/app/controllers/concerns/authentication.rb +12 -12
  48. data/app/controllers/concerns/component_stories.rb +22 -0
  49. data/app/controllers/concerns/crud_entities.rb +140 -0
  50. data/app/controllers/concerns/entity_priority.rb +10 -0
  51. data/app/controllers/concerns/my_crud_entities.rb +146 -0
  52. data/app/controllers/concerns/processed_forms.rb +28 -0
  53. data/app/controllers/concerns/restricted_access.rb +37 -0
  54. data/app/controllers/concerns/toggleable_entity.rb +31 -0
  55. data/app/controllers/contact_controller.rb +49 -0
  56. data/app/controllers/errors_controller.rb +37 -0
  57. data/app/controllers/fallback_controller.rb +12 -0
  58. data/app/controllers/index_controller.rb +1 -0
  59. data/app/controllers/legal_controller.rb +14 -0
  60. data/app/controllers/my/components_controller.rb +26 -0
  61. data/app/controllers/my/confirmations_controller.rb +44 -0
  62. data/app/controllers/my/index_controller.rb +7 -1
  63. data/app/controllers/my/profiles_controller.rb +33 -16
  64. data/app/controllers/oembed_controller.rb +12 -0
  65. data/app/controllers/profile_controller.rb +14 -0
  66. data/app/controllers/users_controller.rb +63 -0
  67. data/app/helpers/biovision_components_helper.rb +7 -3
  68. data/app/helpers/biovision_helper.rb +170 -0
  69. data/app/helpers/entity_helper.rb +77 -0
  70. data/app/helpers/my_helper.rb +34 -0
  71. data/app/helpers/simple_image_helper.rb +125 -0
  72. data/app/jobs/application_job.rb +7 -0
  73. data/app/jobs/send_phone_confirmation_job.rb +16 -0
  74. data/app/lib/biovision/components/base/component_parameters.rb +55 -0
  75. data/app/lib/biovision/components/base/component_privileges.rb +75 -0
  76. data/app/lib/biovision/components/base/component_settings.rb +40 -0
  77. data/app/lib/biovision/components/base/component_stories.rb +30 -0
  78. data/app/lib/biovision/components/base/entity_links.rb +38 -0
  79. data/app/lib/biovision/components/base/image_handling.rb +33 -0
  80. data/app/lib/biovision/components/base_component.rb +63 -95
  81. data/app/lib/biovision/components/contact_component.rb +26 -0
  82. data/app/lib/biovision/components/content/oembed/receiver.rb +98 -0
  83. data/app/lib/biovision/components/content/oembed/twitter_receiver.rb +20 -0
  84. data/app/lib/biovision/components/content/oembed/vimeo_receiver.rb +20 -0
  85. data/app/lib/biovision/components/content/oembed/youtube_receiver.rb +20 -0
  86. data/app/lib/biovision/components/content_component.rb +65 -0
  87. data/app/lib/biovision/components/track_component.rb +3 -0
  88. data/app/lib/biovision/components/users/authentication.rb +15 -7
  89. data/app/lib/biovision/components/users/codes.rb +104 -0
  90. data/app/lib/biovision/components/users/flag_helpers.rb +72 -0
  91. data/app/lib/biovision/components/users/profile_handler.rb +111 -1
  92. data/app/lib/biovision/components/users/registration_handler.rb +40 -52
  93. data/app/lib/biovision/components/users/validation.rb +83 -0
  94. data/app/lib/biovision/components/users_component.rb +114 -19
  95. data/app/lib/biovision/helpers/data_helper.rb +70 -0
  96. data/app/lib/biovision/helpers/export_helper.rb +97 -0
  97. data/app/lib/biovision/migrations/component_migration.rb +56 -0
  98. data/app/lib/biovision/notifiers/base_notifier.rb +2 -2
  99. data/app/lib/biovision/notifiers/contact_notifier.rb +15 -0
  100. data/app/lib/biovision/stories/component_story.rb +55 -0
  101. data/app/lib/canonizer.rb +38 -0
  102. data/app/lib/carrier_wave/image_optim.rb +32 -0
  103. data/app/mailers/code_sender.rb +29 -0
  104. data/app/mailers/feedback_mailer.rb +14 -0
  105. data/app/models/agent.rb +4 -0
  106. data/app/models/biovision_component.rb +39 -3
  107. data/app/models/code.rb +31 -8
  108. data/app/models/concerns/checkable.rb +2 -1
  109. data/app/models/concerns/has_simple_image.rb +9 -0
  110. data/app/models/concerns/has_uploaded_file.rb +26 -0
  111. data/app/models/concerns/meta_texts.rb +25 -5
  112. data/app/models/concerns/simple_tag.rb +30 -0
  113. data/app/models/concerns/toggleable.rb +2 -1
  114. data/app/models/concerns/tree_structure.rb +75 -0
  115. data/app/models/contact_method.rb +47 -0
  116. data/app/models/contact_type.rb +27 -0
  117. data/app/models/dynamic_block.rb +43 -0
  118. data/app/models/dynamic_page.rb +73 -0
  119. data/app/models/feedback_message.rb +65 -0
  120. data/app/models/feedback_response.rb +50 -0
  121. data/app/models/group.rb +48 -0
  122. data/app/models/language.rb +4 -0
  123. data/app/models/metric.rb +4 -0
  124. data/app/models/navigation_group.rb +43 -0
  125. data/app/models/navigation_group_page.rb +23 -0
  126. data/app/models/oembed_domain.rb +25 -0
  127. data/app/models/oembed_link.rb +19 -0
  128. data/app/models/oembed_receiver.rb +15 -0
  129. data/app/models/role.rb +86 -0
  130. data/app/models/role_group.rb +13 -0
  131. data/app/models/simple_image.rb +49 -8
  132. data/app/models/simple_image_tag.rb +1 -16
  133. data/app/models/token.rb +6 -2
  134. data/app/models/uploaded_file.rb +62 -0
  135. data/app/models/uploaded_file_tag.rb +15 -0
  136. data/app/models/uploaded_file_tag_file.rb +13 -0
  137. data/app/models/user.rb +122 -29
  138. data/app/models/user_group.rb +20 -0
  139. data/app/models/user_role.rb +18 -0
  140. data/app/uploaders/simple_file_uploader.rb +23 -0
  141. data/app/uploaders/simple_image_uploader.rb +29 -20
  142. data/app/uploaders/uploaders/path_slug.rb +22 -0
  143. data/app/views/admin/agents/index.html.erb +1 -3
  144. data/app/views/admin/biovision_components/_nav_item.html.erb +6 -0
  145. data/app/views/admin/biovision_components/entity/_in_list.html.erb +12 -0
  146. data/app/views/admin/biovision_components/index.html.erb +11 -0
  147. data/app/views/admin/components/_image.jbuilder +18 -0
  148. data/app/views/admin/components/_list.html.erb +1 -1
  149. data/app/views/admin/components/entity/_links.html.erb +31 -21
  150. data/app/views/admin/components/image.jbuilder +1 -0
  151. data/app/views/admin/components/images.jbuilder +4 -0
  152. data/app/views/admin/components/links/_base.html.erb +1 -0
  153. data/app/views/admin/components/settings/_new_parameter.html.erb +4 -2
  154. data/app/views/admin/components/settings/_parameters.html.erb +8 -2
  155. data/app/views/admin/components/settings/_settings.html.erb +4 -4
  156. data/app/views/admin/components/settings.html.erb +2 -1
  157. data/app/views/admin/components/update_privileges.jbuilder +21 -0
  158. data/app/views/admin/dynamic_blocks/_form.html.erb +16 -0
  159. data/app/views/admin/dynamic_blocks/_nav_item.html.erb +6 -0
  160. data/app/views/admin/dynamic_blocks/entity/_in_list.html.erb +12 -0
  161. data/app/views/admin/dynamic_blocks/index.html.erb +17 -0
  162. data/app/views/admin/dynamic_blocks/show.html.erb +25 -0
  163. data/app/views/admin/dynamic_pages/_dynamic_page.jbuilder +18 -0
  164. data/app/views/admin/dynamic_pages/_form.html.erb +21 -0
  165. data/app/views/admin/dynamic_pages/_nav_item.html.erb +6 -0
  166. data/app/views/admin/dynamic_pages/entity/_in_list.html.erb +17 -0
  167. data/app/views/admin/dynamic_pages/entity/_in_search.html.erb +7 -0
  168. data/app/views/admin/dynamic_pages/index.html.erb +17 -0
  169. data/app/views/admin/dynamic_pages/search.jbuilder +4 -0
  170. data/app/views/admin/dynamic_pages/show.html.erb +28 -0
  171. data/app/views/admin/index/index.html.erb +7 -5
  172. data/app/views/admin/ip_addresses/index.html.erb +2 -4
  173. data/app/views/admin/navigation_group_pages/entity/_in_list.html.erb +26 -0
  174. data/app/views/admin/navigation_groups/_form.html.erb +15 -0
  175. data/app/views/admin/navigation_groups/_nav_item.html.erb +6 -0
  176. data/app/views/admin/navigation_groups/entity/_dynamic_pages.html.erb +38 -0
  177. data/app/views/admin/navigation_groups/entity/_in_list.html.erb +14 -0
  178. data/app/views/admin/navigation_groups/index.html.erb +17 -0
  179. data/app/views/admin/navigation_groups/show.html.erb +33 -0
  180. data/app/views/admin/tokens/_form.html.erb +31 -0
  181. data/app/views/admin/tokens/_nav_item.html.erb +6 -0
  182. data/app/views/admin/tokens/entity/_in_list.html.erb +27 -0
  183. data/app/views/admin/tokens/index.html.erb +11 -0
  184. data/app/views/admin/tokens/show.html.erb +26 -0
  185. data/app/views/admin/unauthorized.html.erb +2 -5
  186. data/app/views/admin/users/_form.html.erb +81 -0
  187. data/app/views/admin/users/_nav_item.html.erb +6 -0
  188. data/app/views/admin/users/_user.jbuilder +18 -0
  189. data/app/views/admin/users/entity/_fields.html.erb +53 -0
  190. data/app/views/admin/users/entity/_in_list.html.erb +38 -0
  191. data/app/views/admin/users/entity/_in_search.html.erb +18 -0
  192. data/app/views/admin/users/entity/_profile.html.erb +26 -0
  193. data/app/views/admin/users/entity/in_list/_additional_data.html.erb +0 -0
  194. data/app/views/admin/users/index.html.erb +24 -0
  195. data/app/views/admin/users/roles/_component.html.erb +22 -0
  196. data/app/views/admin/users/roles.html.erb +23 -0
  197. data/app/views/admin/users/search.jbuilder +4 -0
  198. data/app/views/admin/users/show.html.erb +62 -0
  199. data/app/views/admin/widgets/_filters.html.erb +20 -0
  200. data/app/views/admin/widgets/_quick_search.html.erb +13 -0
  201. data/app/views/admin/widgets/filters/_flag.html.erb +15 -0
  202. data/app/views/admin/widgets/filters/_text.html.erb +7 -0
  203. data/app/views/application/forbidden.html.erb +9 -0
  204. data/app/views/application/forbidden.jbuilder +4 -0
  205. data/app/views/application/not_found.html.erb +9 -0
  206. data/app/views/application/not_found.jbuilder +4 -0
  207. data/app/views/application/unauthorized.html.erb +19 -0
  208. data/app/views/application/unauthorized.jbuilder +4 -0
  209. data/app/views/authentication/new.html.erb +2 -8
  210. data/app/views/components/content/_dynamic_page.html.erb +17 -0
  211. data/app/views/components/content/_dynamic_page_content.html.erb +14 -0
  212. data/app/views/components/users/_form_tabs.html.erb +31 -0
  213. data/app/views/components/users/_join_form.html.erb +192 -0
  214. data/app/views/components/users/_login_form.html.erb +46 -0
  215. data/app/views/components/users/form/_image.html.erb +17 -0
  216. data/app/views/components/users/form/_profile_data.html.erb +54 -0
  217. data/app/views/contact/_form.html.erb +108 -0
  218. data/app/views/contact/create_feedback_message.js.erb +1 -0
  219. data/app/views/contact/feedback.html.erb +13 -0
  220. data/app/views/contact/index.html.erb +16 -0
  221. data/app/views/errors/error.html.erb +1 -0
  222. data/app/views/fallback/show.html.erb +6 -0
  223. data/app/views/feedback_mailer/new_feedback_request.html.erb +11 -0
  224. data/app/views/feedback_mailer/new_feedback_request.text.erb +6 -0
  225. data/app/views/index/index.html.erb +14 -0
  226. data/app/views/layouts/admin/_footer.html.erb +1 -1
  227. data/app/views/layouts/admin/_header.html.erb +7 -2
  228. data/app/views/layouts/admin.html.erb +0 -1
  229. data/app/views/layouts/application/_footer.html.erb +1 -1
  230. data/app/views/layouts/application/header/_authentication.html.erb +4 -1
  231. data/app/views/legal/privacy.html.erb +5 -0
  232. data/app/views/legal/tos.html.erb +5 -0
  233. data/app/views/my/components/index.html.erb +25 -0
  234. data/app/views/my/components/show.html.erb +21 -0
  235. data/app/views/my/confirmations/show.html.erb +62 -0
  236. data/app/views/my/index/_cards.html.erb +15 -0
  237. data/app/views/my/index/_email.html.erb +14 -0
  238. data/app/views/my/index/_navigation.html.erb +33 -0
  239. data/app/views/my/index/index.html.erb +12 -0
  240. data/app/views/my/profiles/_form.html.erb +10 -0
  241. data/app/views/my/profiles/check.jbuilder +4 -0
  242. data/app/views/my/profiles/edit.html.erb +14 -0
  243. data/app/views/my/profiles/form/_basic_parameters.html.erb +9 -0
  244. data/app/views/my/profiles/form/_sensitive_parameters.html.erb +68 -0
  245. data/app/views/my/profiles/new.html.erb +6 -8
  246. data/app/views/my/profiles/show.html.erb +36 -0
  247. data/app/views/my/recoveries/show.html.erb +0 -0
  248. data/app/views/shared/_flash_messages.html.erb +1 -1
  249. data/app/views/shared/_list_of_errors.html.erb +7 -0
  250. data/app/views/shared/admin/_breadcrumbs.html.erb +8 -0
  251. data/app/views/shared/admin/_list.html.erb +10 -19
  252. data/app/views/shared/admin/_list_with_priority.html.erb +10 -19
  253. data/app/views/shared/admin/_priority.html.erb +6 -0
  254. data/app/views/shared/admin/_toggle.html.erb +6 -0
  255. data/app/views/shared/entity/_date_field.html.erb +6 -0
  256. data/app/views/shared/entity/_formatted_text_field.html.erb +10 -0
  257. data/app/views/shared/entity/_image.html.erb +31 -0
  258. data/app/views/shared/entity/_language.html.erb +6 -0
  259. data/app/views/shared/entity/_linked_entity.html.erb +6 -0
  260. data/app/views/shared/entity/_list.html.erb +22 -0
  261. data/app/views/shared/entity/_list_with_priority.html.erb +22 -0
  262. data/app/views/shared/entity/_meta_texts.html.erb +16 -0
  263. data/app/views/shared/entity/_metadata.html.erb +18 -0
  264. data/app/views/shared/entity/_parent.html.erb +6 -0
  265. data/app/views/shared/entity/_priority.html.erb +4 -0
  266. data/app/views/shared/entity/_priority_icons.html.erb +8 -0
  267. data/app/views/shared/entity/_raw_text_field.html.erb +10 -0
  268. data/app/views/shared/entity/_simple_image.html.erb +10 -0
  269. data/app/views/shared/entity/_slug.html.erb +6 -0
  270. data/app/views/shared/entity/_text_field.html.erb +6 -0
  271. data/app/views/shared/entity/_text_fields.html.erb +9 -0
  272. data/app/views/shared/entity/_time_field.html.erb +6 -0
  273. data/app/views/shared/entity/_timestamps.html.erb +13 -0
  274. data/app/views/shared/entity/_toggle.html.erb +12 -0
  275. data/app/views/shared/entity/_track.html.erb +12 -0
  276. data/app/views/shared/entity/_tree_caches.html.erb +19 -0
  277. data/app/views/shared/entity/_uuid.html.erb +4 -0
  278. data/app/views/shared/entity/edit.html.erb +23 -0
  279. data/app/views/shared/entity/new.html.erb +16 -0
  280. data/app/views/shared/forms/_entity_flags.html.erb +15 -0
  281. data/app/views/shared/forms/_field.html.erb +50 -0
  282. data/app/views/shared/forms/_field_with_search.html.erb +17 -0
  283. data/app/views/shared/forms/_fields.html.erb +3 -0
  284. data/app/views/shared/forms/_language.html.erb +40 -0
  285. data/app/views/shared/forms/_meta_texts.html.erb +27 -0
  286. data/app/views/shared/forms/_priority.html.erb +13 -0
  287. data/app/views/shared/forms/_simple_entity_link.html.erb +14 -0
  288. data/app/views/shared/forms/_simple_image.html.erb +47 -0
  289. data/app/views/shared/forms/_state_container.html.erb +7 -0
  290. data/app/views/shared/forms/_text_area.html.erb +25 -0
  291. data/app/views/shared/forms/_text_field.html.erb +24 -0
  292. data/app/views/shared/forms/_text_fields.html.erb +3 -0
  293. data/app/views/shared/forms/check.jbuilder +4 -0
  294. data/app/views/shared/forms/errors.jbuilder +3 -0
  295. data/app/views/shared/forms/simple_image/_browse.html.erb +14 -0
  296. data/app/views/shared/forms/simple_image/_load_image.html.erb +38 -0
  297. data/app/views/shared/my/_list.html.erb +10 -0
  298. data/app/views/shared/my/_list_with_priority.html.erb +10 -0
  299. data/app/views/shared/my/entity/edit.html.erb +25 -0
  300. data/app/views/shared/my/entity/new.html.erb +18 -0
  301. data/app/views/simple_images/_simple_image.jbuilder +13 -0
  302. data/app/views/users/_profile.html.erb +30 -0
  303. data/app/views/users/profile/_data.html.erb +20 -0
  304. data/app/views/users/show.html.erb +21 -0
  305. data/config/locales/biovision-ru.yml +76 -1
  306. data/config/locales/components-ru.yml +55 -4
  307. data/config/locales/contact-ru.yml +110 -0
  308. data/config/locales/content-ru.yml +115 -0
  309. data/config/locales/users-ru.yml +142 -3
  310. data/config/routes.rb +99 -48
  311. data/db/migrate/20191228000000_create_biovision_components.rb +6 -5
  312. data/db/migrate/20200224000000_create_track_component.rb +9 -14
  313. data/db/migrate/20200224000010_create_users_component.rb +14 -83
  314. data/db/migrate/20200404000000_create_simple_images.rb +4 -3
  315. data/db/migrate/20210405000000_create_acl.rb +88 -0
  316. data/db/migrate/20210421000000_create_content_component.rb +80 -0
  317. data/db/migrate/20210421000010_create_contact_component.rb +74 -0
  318. data/db/migrate/20210616000000_create_uploaded_files.rb +52 -0
  319. data/db/migrate/amends/20210816060606_create_oembed_receivers.rb +21 -0
  320. data/db/migrate/amends/20210907070707_add_checksum_to_simple_images.rb +13 -0
  321. data/lib/biovision/base_methods.rb +17 -29
  322. data/lib/biovision/engine.rb +8 -13
  323. data/lib/biovision/version.rb +1 -1
  324. data/lib/tasks/components.rake +51 -0
  325. metadata +266 -27
  326. data/app/assets/images/biovision/placeholders/user.svg +0 -15
  327. data/app/helpers/users_helper.rb +0 -11
  328. data/app/lib/biovision/components/component_settings.rb +0 -30
  329. data/app/lib/biovision/components/privilege_handler.rb +0 -77
  330. data/app/lib/biovision/components/users/code_handler.rb +0 -23
  331. data/app/models/biovision_component_user.rb +0 -21
  332. data/app/models/foreign_site.rb +0 -34
  333. data/app/models/foreign_user.rb +0 -21
  334. data/app/uploaders/user_image_uploader.rb +0 -58
  335. data/app/views/admin/components/links/_track.html.erb +0 -2
  336. data/app/views/admin/components/links/_users.html.erb +0 -11
  337. data/app/views/admin/components/privileges/_component_user.html.erb +0 -17
  338. data/app/views/admin/components/privileges/_links.html.erb +0 -35
  339. data/app/views/admin/components/privileges/_privilege_flag.html.erb +0 -28
  340. data/app/views/admin/components/privileges/_users.html.erb +0 -23
  341. data/app/views/admin/components/privileges.html.erb +0 -20
  342. data/app/views/authentication/_form.html.erb +0 -40
  343. data/app/views/authentication/failed.js.erb +0 -3
  344. data/app/views/my/profiles/new/_form.html.erb +0 -147
  345. data/app/views/shared/admin/_toggleable.html.erb +0 -8
@@ -0,0 +1,71 @@
1
+ $toggleable-active: #34c749 !default;
2
+ $toggleable-inactive: #fc605c !default;
3
+ $toggleable-switch: #fdbc40 !default;
4
+ $toggleable-unknown: #c0c0c0 !default;
5
+ $toggleable-background: #fff !default;
6
+
7
+ .toggleable {
8
+ font-size: var(--font-size-decreased);
9
+ margin: .8rem;
10
+
11
+ /**
12
+ * Радиус границы в ::before должен быть чуть меньше, чтобы не было щелей,
13
+ * потому что span фактически толще на две толщины границы
14
+ */
15
+ > span {
16
+ background-color: $toggleable-background;
17
+ border: .1rem solid;
18
+ border-radius: .8rem;
19
+ cursor: pointer;
20
+ display: inline-block;
21
+ line-height: 1.8;
22
+ margin: .4rem;
23
+ padding: 0 var(--spacer-s) 0 0;
24
+
25
+ &::before {
26
+ border-radius: .8rem 0 0 .8rem;
27
+ display: inline-block;
28
+ line-height: 1.8;
29
+ margin: 0 .4rem 0 0;
30
+ text-align: center;
31
+ width: 2.2rem;
32
+ }
33
+ }
34
+
35
+ .active {
36
+ border-color: $toggleable-active;
37
+
38
+ &::before {
39
+ background-color: $toggleable-active;
40
+ content: '\2611';
41
+ }
42
+ }
43
+
44
+ .inactive {
45
+ border-color: $toggleable-inactive;
46
+
47
+ &::before {
48
+ background-color: $toggleable-inactive;
49
+ content: '\2610';
50
+ }
51
+ }
52
+
53
+ .switch {
54
+ border-color: $toggleable-switch;
55
+ cursor: not-allowed;
56
+
57
+ &::before {
58
+ background-color: $toggleable-switch;
59
+ content: '\231B';
60
+ }
61
+ }
62
+
63
+ .unknown {
64
+ border-color: $toggleable-unknown;
65
+
66
+ &::before {
67
+ background-color: $toggleable-unknown;
68
+ content: '\26A0';
69
+ }
70
+ }
71
+ }
@@ -0,0 +1,7 @@
1
+ @import "biovision/components/buttons";
2
+ @import "biovision/components/forms";
3
+ @import "biovision/components/hamburger";
4
+ @import "biovision/components/lists";
5
+ @import "biovision/components/messages";
6
+ @import "biovision/components/pagination";
7
+ @import "biovision/components/breadcrumbs";
@@ -41,10 +41,10 @@ $border-color-secondary: rgb(230, 230, 230) !default;
41
41
  $border-primary: .1rem solid $border-color-primary !default;
42
42
  $border-secondary: .1rem solid $border-color-secondary !default;
43
43
 
44
- $background-body: #f4f4f4 linear-gradient(to top, #f4f4f4, #dfdedc) no-repeat center / cover !default;
45
- $background-header: #fff !default;
46
- $background-main: #fff !default;
47
- $background-footer: #fff !default;
44
+ $layout-bg-body: #f4f4f4 linear-gradient(to top, #f4f4f4, #dfdedc) no-repeat center / cover !default;
45
+ $layout-bg-header: #fff !default;
46
+ $layout-bg-main: #fff !default;
47
+ $layout-bg-footer: #fff !default;
48
48
 
49
49
  $link-color: rgb(20, 127, 255) !default;
50
50
  $link-color-visited: rgb(20, 77, 250) !default;
@@ -0,0 +1,4 @@
1
+ .my__component {
2
+ border-top: var(--border-secondary);
3
+ margin: var(--spacer-m) auto;
4
+ }
@@ -0,0 +1,101 @@
1
+ $users-tab-color: hsl(220, 75%, 50%) !default;
2
+ $users-tab-color-hover: hsl(220, 100%, 95%) !default;
3
+
4
+ .users__form-tabs {
5
+ box-shadow: var(--block-shadow);
6
+ margin: 0 auto var(--spacer-m);
7
+ max-width: 40rem;
8
+ padding-top: var(--spacer-xs);
9
+
10
+ .errors {
11
+ margin: 0 var(--spacer-xs);
12
+ }
13
+
14
+ .labels {
15
+ align-items: center;
16
+ border: .1rem solid $users-tab-color;
17
+ display: flex;
18
+ margin: 0 var(--spacer-xs);
19
+
20
+ label {
21
+ color: $users-tab-color;
22
+ cursor: pointer;
23
+ display: block;
24
+ flex: 1;
25
+ padding: var(--spacer-xs) var(--spacer-s);
26
+ text-align: center;
27
+ transition: .25s;
28
+
29
+ &:hover {
30
+ background-color: $users-tab-color-hover;
31
+ }
32
+ }
33
+ }
34
+
35
+ .tabs {
36
+ .tab {
37
+ display: none;
38
+ }
39
+
40
+ .login {
41
+ form {
42
+ margin: 0 auto;
43
+ }
44
+ }
45
+ }
46
+
47
+ .tab-control-login {
48
+ &:checked {
49
+ ~ .labels {
50
+ .login {
51
+ background: $users-tab-color;
52
+ color: var(--text-color-inverted-primary);
53
+ }
54
+ }
55
+
56
+ ~ .tabs {
57
+ .login {
58
+ display: block;
59
+ }
60
+ }
61
+ }
62
+ }
63
+
64
+ .tab-control-join {
65
+ &:checked {
66
+ ~ .labels {
67
+ .join {
68
+ background: $users-tab-color;
69
+ color: var(--text-color-inverted-primary);
70
+ }
71
+ }
72
+
73
+ ~ .tabs {
74
+ .join {
75
+ display: block;
76
+ }
77
+ }
78
+ }
79
+ }
80
+
81
+ .fields {
82
+ > div:not(:last-of-type) {
83
+ margin-bottom: 0;
84
+ }
85
+ }
86
+
87
+ .actions {
88
+ align-items: center;
89
+ display: flex;
90
+ justify-content: space-between;
91
+ padding: var(--spacer-xs);
92
+ }
93
+
94
+ .flags {
95
+ font-weight: 300;
96
+
97
+ li {
98
+ padding: var(--spacer-xxs) var(--spacer-xs);
99
+ }
100
+ }
101
+ }
@@ -0,0 +1,77 @@
1
+ .users__profile {
2
+ --avatar-size: 36rem;
3
+ align-items: flex-start;
4
+ display: flex;
5
+
6
+ .avatar {
7
+ flex: none;
8
+ padding: var(--spacer-xs) var(--spacer-xxs);
9
+ width: calc(var(--avatar-size) + var(--spacer-xxs) * 2 + var(--spacer-s));
10
+
11
+ .image {
12
+ max-width: 100%;
13
+ height: var(--avatar-size);
14
+ width: var(--avatar-size);
15
+ }
16
+
17
+ img {
18
+ box-shadow: var(--block-shadow);
19
+ height: 100%;
20
+ object-fit: contain;
21
+ width: 100%;
22
+ }
23
+ }
24
+ }
25
+
26
+ @media (max-width: 850px) {
27
+ .users__profile {
28
+ display: block;
29
+ }
30
+ }
31
+
32
+ @media (max-width: 375px) {
33
+ .users__profile {
34
+ --avatar-size: 30rem;
35
+
36
+ .avatar {
37
+ width: 100%;
38
+
39
+ .image {
40
+ margin: 0 auto;
41
+ }
42
+ }
43
+ }
44
+ }
45
+
46
+ .users__profile-aside {
47
+ margin: var(--spacer-s) 0;
48
+ padding: 0 var(--spacer-xs);
49
+ }
50
+
51
+ .users__profile-form {
52
+ background: #f7f7f7;
53
+ border: var(--border-secondary);
54
+ margin: var(--spacer-s) auto;
55
+ padding: var(--spacer-xs);
56
+
57
+ img {
58
+ box-shadow: var(--block-shadow);
59
+ }
60
+
61
+ h3 {
62
+ margin-bottom: var(--spacer-s);
63
+ }
64
+
65
+ .hint {
66
+ background: #fff;
67
+ box-shadow: var(--block-shadow);
68
+ font-size: var(--font-size-increased);
69
+ font-weight: 300;
70
+ padding: var(--spacer-xs);
71
+
72
+ &::before {
73
+ content: '☝';
74
+ margin-right: var(--spacer-xxs);
75
+ }
76
+ }
77
+ }
@@ -0,0 +1,3 @@
1
+ @import "biovision/themes/default_theme/components/users/form_tabs";
2
+ @import "biovision/themes/default_theme/components/users/profile";
3
+ @import "biovision/themes/default_theme/components/users/dashboard";
@@ -1,3 +1,2 @@
1
- @import "biovision/components/forms";
2
- @import "biovision/components/hamburger";
3
- @import "biovision/components/lists";
1
+ @import "biovision/components";
2
+ @import "biovision/themes/default_theme/components/users";
@@ -0,0 +1,3 @@
1
+ .main-footer {
2
+ background: var(--layout-bg-footer);
3
+ }
@@ -1,4 +1,6 @@
1
1
  .main-header {
2
+ background: var(--layout-bg-header);
3
+
2
4
  .content-wrapper {
3
5
  align-items: center;
4
6
  display: flex;
@@ -23,11 +25,13 @@
23
25
  .header-authentication {
24
26
  align-items: center;
25
27
  display: flex;
28
+ gap: var(--spacer-xxs);
26
29
  margin: 0 0 0 auto;
27
30
 
28
31
  .avatar {
29
32
  display: inline-block;
30
33
  height: 2.4rem;
34
+ overflow: hidden;
31
35
  width: 2.4rem;
32
36
 
33
37
  img {
@@ -36,4 +40,12 @@
36
40
  width: 100%;
37
41
  }
38
42
  }
43
+
44
+ .current-user {
45
+ align-items: center;
46
+ color: inherit;
47
+ display: flex;
48
+ font-size: var(--font-size-decreased);
49
+ gap: var(--spacer-xs);
50
+ }
39
51
  }
@@ -1,36 +1,21 @@
1
- @import "biovision/themes/default_theme/components";
2
- @import "biovision/themes/default_theme/layout/header";
3
-
4
1
  //* { outline: solid pink 1px }
5
2
 
6
3
  html {
7
- height: 100%;
4
+ //height: 100%;
8
5
  }
9
6
 
10
7
  body {
8
+ background: var(--layout-bg-body);
11
9
  display: flex;
12
10
  flex-direction: column;
13
- height: 100%;
11
+ //height: 100%;
14
12
  }
15
13
 
16
14
  #main {
15
+ background: var(--layout-bg-main);
17
16
  flex: 1;
18
17
  }
19
18
 
20
- .breadcrumbs {
21
- a {
22
- background: image_url('biovision/icons/breadcrumb.svg') no-repeat bottom .1rem right / .6rem 1.2rem;
23
- padding-right: 1rem;
24
- transition: background .25s;
25
-
26
- &:active,
27
- &:focus,
28
- &:hover {
29
- background-image: image_url('biovision/icons/breadcrumb-hover.svg');
30
- }
31
- }
32
- }
33
-
34
19
  .content-wrapper {
35
20
  padding: var(--spacer-xs);
36
21
  }
@@ -42,3 +27,7 @@ body {
42
27
  width: 100%;
43
28
  z-index: 5;
44
29
  }
30
+
31
+ @import "biovision/themes/default_theme/components";
32
+ @import "biovision/themes/default_theme/layout/header";
33
+ @import "biovision/themes/default_theme/layout/footer";
@@ -1,2 +1 @@
1
- @import "biovision/vars";
2
1
  @import "biovision/themes/default_theme/layout";
@@ -50,4 +50,9 @@
50
50
  --input-border-focus: #{$input-border-focus};
51
51
  --input-border-invalid: #{$input-border-invalid};
52
52
  --input-border-invalid-focus: #{$input-border-invalid-focus};
53
+
54
+ --layout-bg-body: #{$layout-bg-body};
55
+ --layout-bg-footer: #{$layout-bg-footer};
56
+ --layout-bg-header: #{$layout-bg-header};
57
+ --layout-bg-main: #{$layout-bg-main};
53
58
  }
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Managing component list
4
+ class Admin::BiovisionComponentsController < AdminController
5
+ include CrudEntities
6
+ include EntityPriority
7
+ include ToggleableEntity
8
+
9
+ before_action :set_entity, except: %i[index]
10
+ end
@@ -2,117 +2,48 @@
2
2
 
3
3
  # Handling components
4
4
  class Admin::ComponentsController < AdminController
5
- before_action :set_handler, except: :index
5
+ include ProcessedForms
6
+
7
+ # skip_before_action :restrict_access, only: :index
6
8
  skip_before_action :verify_authenticity_token, only: :ckeditor
7
9
 
8
10
  # get /admin/components
9
11
  def index
10
- @collection = BiovisionComponent.list_for_administration
12
+ @collection = BiovisionComponent.active.list_for_administration
11
13
  end
12
14
 
13
15
  # get /admin/components/:slug
14
16
  def show
15
17
  error = 'Viewing component is not allowed'
16
- handle_http_401(error) unless @handler.allow?
18
+ handle_http_401(error) unless @handler.permit?('view')
17
19
  end
18
20
 
19
21
  # get /admin/components/:slug/settings
20
22
  def settings
21
- error = 'Viewing settings is not allowed'
22
- handle_http_401(error) unless @handler.allow?('settings')
23
23
  end
24
24
 
25
25
  # patch /admin/components/:slug/settings
26
26
  def update_settings
27
- if @handler.allow?('settings')
28
- new_settings = params.dig(:component, :settings).permit!
29
- @handler.settings = new_settings.to_h
30
- flash[:success] = t('.success')
31
- redirect_to(admin_component_settings_path(slug: params[:slug]))
32
- else
33
- handle_http_401('Changing settings is not allowed')
34
- end
27
+ new_settings = params.dig(:component, :settings).permit!
28
+ @handler.settings = new_settings.to_h
29
+ flash[:success] = t('.success')
30
+ redirect_to(admin_component_settings_path(slug: params[:slug]))
35
31
  end
36
32
 
37
33
  # patch /admin/components/:slug/parameters
38
34
  def update_parameter
39
- if @handler.allow?('settings')
40
- slug = param_from_request(:key, :slug).downcase
41
- value = param_from_request(:key, :value)
35
+ slug = param_from_request(:key, :slug).downcase
36
+ value = param_from_request(:key, :value)
42
37
 
43
- @handler[slug] = value
44
- end
38
+ @handler[slug] = value
45
39
 
46
40
  head :no_content
47
41
  end
48
42
 
49
43
  # delete /admin/components/:slug/parameters/:parameter_slug
50
44
  def delete_parameter
51
- if @handler.allow?('settings')
52
- @handler.component.parameters.delete(params[:parameter_slug])
53
- @handler.component.save
54
- end
55
-
56
- head :no_content
57
- end
58
-
59
- # get /admin/components/:slug/privileges
60
- def privileges
61
- error = 'Viewing privileges is not allowed'
62
- handle_http_401(error) unless @handler.administrator?
63
- end
64
-
65
- # patch /admin/components/:slug/privileges
66
- def update_privileges
67
- if @handler.administrator?
68
- user = User.find_by(id: params[:user_id])
69
-
70
- if user.nil?
71
- handle_http_404('Cannot find user') if user.nil?
72
- else
73
- @entity = @handler.user_link!(true)
74
- end
75
- else
76
- handle_http_401('Updating privileges is not allowed')
77
- end
78
- end
79
-
80
- # put /admin/components/:slug/administrators/:user_id
81
- def add_administrator
82
- if @handler.administrator?
83
- @handler.user = User.find_by(id: params[:user_id])
84
- @handler.privilege_handler.administrator!
85
- end
86
-
87
- head :no_content
88
- end
89
-
90
- # put /admin/components/:slug/administrators/:user_id
91
- def remove_administrator
92
- if @handler.administrator?
93
- @handler.user = User.find_by(id: params[:user_id])
94
- @handler.privilege_handler.not_administrator!
95
- end
96
-
97
- head :no_content
98
- end
99
-
100
- # put /admin/components/:slug/users/:user_id/privileges/:privilege_slug
101
- def add_privilege
102
- if @handler.administrator?
103
- @handler.user = User.find_by(id: params[:user_id])
104
- @handler.privilege_handler.add_privilege(params[:privilege_slug])
105
- end
106
-
107
- head :no_content
108
- end
109
-
110
- # put /admin/components/:slug/users/:user_id/privileges/:privilege_slug
111
- def remove_privilege
112
- if @handler.administrator?
113
- @handler.user = User.find_by(id: params[:user_id])
114
- @handler.privilege_handler.remove_privilege(params[:privilege_slug])
115
- end
45
+ @handler.component.parameters.delete(params[:parameter_slug])
46
+ @handler.component.save
116
47
 
117
48
  head :no_content
118
49
  end
@@ -120,13 +51,14 @@ class Admin::ComponentsController < AdminController
120
51
  # get /admin/components/:slug/images
121
52
  def images
122
53
  list = SimpleImage.in_component(@handler.component).list_for_administration
123
- @collection = @handler.allow? ? list.page(current_page) : []
54
+ @collection = list.page(current_page)
124
55
  end
125
56
 
57
+ # post /admin/components/:slug/images
126
58
  def create_image
127
- if @handler.allow?
128
- @entity = @handler.component.simple_images.new(image_parameters)
129
- if @entity.save
59
+ if @handler.permit?('simple_images.create')
60
+ @entity = @handler.upload_image(image_parameters)
61
+ if @entity
130
62
  render 'image', formats: :json
131
63
  else
132
64
  form_processed_with_error(:new_image)
@@ -143,7 +75,7 @@ class Admin::ComponentsController < AdminController
143
75
  biovision_component: @handler.component
144
76
  }.merge(owner_for_entity(true))
145
77
 
146
- @entity = SimpleImage.create!(parameters)
78
+ @entity = @handler.upload_image(parameters)
147
79
 
148
80
  render json: {
149
81
  uploaded: 1,
@@ -154,21 +86,29 @@ class Admin::ComponentsController < AdminController
154
86
 
155
87
  private
156
88
 
157
- def set_handler
89
+ def restrict_access
158
90
  slug = params[:slug]
159
91
  @handler = Biovision::Components::BaseComponent.handler(slug, current_user)
160
- end
161
-
162
- def restrict_access
163
- return if current_user&.super_user?
92
+ role = action_name == 'index' ? 'components.view' : role_end_from_action
93
+ role_name = "#{@handler.slug}.#{role}"
94
+ error = t('admin.errors.unauthorized.missing_role', role: role_name)
164
95
 
165
- links_exist = BiovisionComponentUser.where(user: current_user).exists?
166
- handle_http_401('User has no component privileges') unless links_exist
96
+ handle_http_401(error) unless @handler.permit?(role)
167
97
  end
168
98
 
169
99
  def image_parameters
170
100
  permitted = SimpleImage.entity_parameters
171
- params.require(:simple_image).permit(permitted)
172
- permitted.merge(owner_for_entity(true))
101
+ parameters = params.require(:simple_image).permit(permitted)
102
+ parameters.merge(owner_for_entity(true))
103
+ end
104
+
105
+ def action_to_role_map
106
+ super.merge(
107
+ %w[images] => 'simple_images.view',
108
+ %w[create_image ckeditor] => 'simple_images.create',
109
+ %w[settings] => 'settings.view',
110
+ %w[update_settings update_parameter delete_parameter] => 'settings.edit',
111
+ %w[show] => 'view'
112
+ )
173
113
  end
174
114
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Administrative part for handling dynamic_blocks
4
+ class Admin::DynamicBlocksController < AdminController
5
+ include CrudEntities
6
+ include ToggleableEntity
7
+
8
+ before_action :set_entity, except: %i[check create index new]
9
+
10
+ private
11
+
12
+ def component_class
13
+ Biovision::Components::ContentComponent
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Administrative part for handling dynamic_pages
4
+ class Admin::DynamicPagesController < AdminController
5
+ include CrudEntities
6
+ include ToggleableEntity
7
+
8
+ before_action :set_entity, except: %i[check create index new search]
9
+
10
+ private
11
+
12
+ def component_class
13
+ Biovision::Components::ContentComponent
14
+ end
15
+ end
@@ -4,8 +4,14 @@
4
4
  class Admin::IndexController < AdminController
5
5
  # get /admin
6
6
  def index
7
- return if Biovision::Components::BaseComponent.privileged?(current_user)
7
+ end
8
+
9
+ private
10
+
11
+ def restrict_access
12
+ role_name = "#{component_handler.slug}.admin"
13
+ error = t('admin.errors.unauthorized.missing_role', role: role_name)
8
14
 
9
- handle_http_401
15
+ handle_http_401(error) unless component_handler.permit?('admin')
10
16
  end
11
17
  end