biovision-base 0.8.171029 → 0.9.171227

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +49 -0
  3. data/app/assets/images/biovision/base/icons/breadcrumb-hover.svg +1 -0
  4. data/app/assets/images/biovision/base/icons/breadcrumb.svg +1 -0
  5. data/app/assets/images/biovision/base/placeholders/file.svg +1 -0
  6. data/app/assets/javascripts/biovision/base/biovision-sliders.js +64 -0
  7. data/app/assets/stylesheets/biovision/base/admin.scss +66 -53
  8. data/app/assets/stylesheets/biovision/base/biovision.scss +107 -55
  9. data/app/assets/stylesheets/biovision/base/layout.scss +64 -54
  10. data/app/assets/stylesheets/biovision/base/tootik.scss +70 -56
  11. data/app/assets/stylesheets/biovision/base/track.scss +2 -10
  12. data/app/controllers/admin/feedback_requests_controller.rb +23 -0
  13. data/app/controllers/admin/media_files_controller.rb +25 -0
  14. data/app/controllers/admin/media_folders_controller.rb +31 -0
  15. data/app/controllers/errors_controller.rb +43 -0
  16. data/app/controllers/feedback_requests_controller.rb +23 -0
  17. data/app/controllers/media_files_controller.rb +104 -0
  18. data/app/controllers/media_folders_controller.rb +85 -0
  19. data/app/helpers/biovision_users_helper.rb +7 -0
  20. data/app/helpers/media_helper.rb +26 -0
  21. data/app/mailers/feedback_mailer.rb +10 -0
  22. data/app/models/editable_page.rb +1 -1
  23. data/app/models/feedback_request.rb +31 -0
  24. data/app/models/media_file.rb +48 -0
  25. data/app/models/media_folder.rb +114 -0
  26. data/app/models/metric.rb +4 -1
  27. data/app/models/privilege_group.rb +1 -1
  28. data/app/uploaders/media_file_uploader.rb +30 -0
  29. data/app/uploaders/media_snapshot_uploader.rb +32 -0
  30. data/app/views/admin/feedback_requests/_nav_item.html.erb +2 -0
  31. data/app/views/admin/feedback_requests/entity/_in_list.html.erb +18 -0
  32. data/app/views/admin/feedback_requests/index.html.erb +16 -0
  33. data/app/views/admin/index/_biovision_base.html.erb +6 -0
  34. data/app/views/admin/index/_custom_dashboard.html.erb +0 -0
  35. data/app/views/admin/index/dashboard/_biovision_feedback.html.erb +9 -0
  36. data/app/views/admin/index/dashboard/_biovision_region.html.erb +8 -0
  37. data/app/views/admin/index/dashboard/_biovision_track.html.erb +8 -0
  38. data/app/views/admin/index/dashboard/_biovision_user.html.erb +13 -0
  39. data/app/views/admin/index/dashboard/_editorial.html.erb +12 -0
  40. data/app/views/admin/index/dashboard/_settings.html.erb +9 -0
  41. data/app/views/admin/index/index.html.erb +2 -22
  42. data/app/views/admin/media_files/_nav_item.html.erb +2 -0
  43. data/app/views/admin/media_files/entity/_in_list.html.erb +26 -0
  44. data/app/views/admin/media_files/index.html.erb +17 -0
  45. data/app/views/admin/media_files/show.html.erb +60 -0
  46. data/app/views/admin/media_folders/_nav_item.html.erb +2 -0
  47. data/app/views/admin/media_folders/entity/_in_list.html.erb +32 -0
  48. data/app/views/admin/media_folders/files.html.erb +28 -0
  49. data/app/views/admin/media_folders/index.html.erb +21 -0
  50. data/app/views/admin/media_folders/show.html.erb +79 -0
  51. data/app/views/application/error.html.erb +9 -0
  52. data/app/views/editable_pages/_editable_page.html.erb +1 -8
  53. data/app/views/editable_pages/entity/_metadata.html.erb +14 -0
  54. data/app/views/editable_pages/form/_ckeditor.html.erb +1 -1
  55. data/app/views/errors/error.html.erb +7 -0
  56. data/app/views/feedback_mailer/new_feedback_request.html.erb +12 -0
  57. data/app/views/feedback_mailer/new_feedback_request.text.erb +5 -0
  58. data/app/views/feedback_requests/_form.html.erb +60 -0
  59. data/app/views/feedback_requests/create.js.erb +10 -0
  60. data/app/views/media_files/_form.html.erb +75 -0
  61. data/app/views/media_files/ckeditor.html.erb +8 -0
  62. data/app/views/media_files/edit.html.erb +19 -0
  63. data/app/views/media_files/edit.js.erb +1 -0
  64. data/app/views/media_files/new.html.erb +15 -0
  65. data/app/views/media_files/new.js.erb +1 -0
  66. data/app/views/media_folders/_form.html.erb +54 -0
  67. data/app/views/media_folders/edit.html.erb +22 -0
  68. data/app/views/media_folders/edit.js.erb +1 -0
  69. data/app/views/media_folders/new.html.erb +19 -0
  70. data/app/views/media_folders/new.js.erb +1 -0
  71. data/app/views/shared/_meta_texts.html.erb +3 -0
  72. data/app/views/shared/_pagination.jbuilder +3 -3
  73. data/app/views/shared/admin/_toggleable.html.erb +7 -0
  74. data/app/views/shared/editable_pages/_body.html.erb +1 -10
  75. data/app/views/shared/forms/_default_ajax_handler.html.erb +13 -0
  76. data/app/views/shared/forms/_list_of_errors.js.erb +19 -0
  77. data/config/locales/common-en.yml +152 -0
  78. data/config/locales/common-ru.yml +41 -0
  79. data/config/locales/feedback-en.yml +30 -0
  80. data/config/locales/feedback-ru.yml +36 -0
  81. data/config/locales/media-ru.yml +92 -0
  82. data/config/routes.rb +34 -0
  83. data/db/migrate/20170301000002_create_metric_values.rb +1 -1
  84. data/db/migrate/20170301000102_create_agents.rb +1 -1
  85. data/db/migrate/20170302000001_create_users.rb +2 -2
  86. data/db/migrate/20170302000002_create_user_profiles.rb +1 -1
  87. data/db/migrate/20170302000003_create_tokens.rb +2 -2
  88. data/db/migrate/20170302000005_create_codes.rb +3 -3
  89. data/db/migrate/20170302000102_create_user_privileges.rb +3 -3
  90. data/db/migrate/20170302000104_create_privilege_group_privileges.rb +2 -2
  91. data/db/migrate/20170425000002_create_foreign_users.rb +3 -3
  92. data/db/migrate/20170629120000_create_login_attempts.rb +2 -2
  93. data/db/migrate/20171202000000_create_media_folders.rb +28 -0
  94. data/db/migrate/20171202000001_create_media_files.rb +27 -0
  95. data/db/migrate/20171211000000_create_feedback_requests.rb +26 -0
  96. data/db/migrate/20171217222222_add_fields_to_feedback_requests.rb +10 -0
  97. data/db/migrate/20171223333333_amend_foreign_keys.rb +72 -0
  98. data/lib/biovision/base/base_methods.rb +1 -1
  99. data/lib/biovision/base/engine.rb +1 -1
  100. data/lib/biovision/base/version.rb +1 -1
  101. metadata +94 -26
@@ -0,0 +1,48 @@
1
+ class MediaFile < ApplicationRecord
2
+ include HasOwner
3
+
4
+ PER_PAGE = 20
5
+
6
+ NAME_LIMIT = 250
7
+ DESCRIPTION_LIMIT = 250
8
+
9
+ mount_uploader :file, MediaFileUploader
10
+ mount_uploader :snapshot, MediaSnapshotUploader
11
+
12
+ belongs_to :media_folder, optional: true, counter_cache: true
13
+ belongs_to :user, optional: true
14
+ belongs_to :agent, optional: true
15
+
16
+ after_initialize { self.uuid = SecureRandom.uuid if uuid.nil? }
17
+
18
+ before_validation { self.mime_type = mime_type.to_s[0..254] }
19
+ before_validation { self.original_name = original_name.to_s[0..254] }
20
+
21
+ validates_presence_of :name
22
+ validates_presence_of :file
23
+ validates_length_of :name, maximum: NAME_LIMIT
24
+ validates_length_of :description, maximum: DESCRIPTION_LIMIT
25
+ validates_uniqueness_of :name, scope: [:media_folder_id]
26
+ validates_uniqueness_of :uuid
27
+
28
+ scope :ordered_by_name, -> { order('name asc') }
29
+ scope :recent, -> { order('id desc') }
30
+
31
+ # @param [Integer] page
32
+ def self.page_for_administration(page = 1)
33
+ ordered_by_name.page(page).per(PER_PAGE)
34
+ end
35
+
36
+ def self.entity_parameters
37
+ %i(name description media_folder_id)
38
+ end
39
+
40
+ def self.creation_parameters
41
+ entity_parameters + %i(file snapshot mime_type original_name)
42
+ end
43
+
44
+ # @param [User] user
45
+ def editable_by?(user)
46
+ !locked && owned_by?(user) || UserPrivilege.user_has_privilege?(user, :chief_editor)
47
+ end
48
+ end
@@ -0,0 +1,114 @@
1
+ class MediaFolder < ApplicationRecord
2
+ include HasOwner
3
+
4
+ NAME_LIMIT = 100
5
+ MAX_DEPTH = 3
6
+
7
+ mount_uploader :snapshot, MediaSnapshotUploader
8
+
9
+ belongs_to :user, optional: true
10
+ belongs_to :agent, optional: true
11
+ belongs_to :parent, class_name: MediaFolder.to_s, optional: true, touch: true
12
+ has_many :child_folders, class_name: MediaFolder.to_s, foreign_key: :parent_id, dependent: :destroy
13
+ has_many :media_files, dependent: :destroy
14
+
15
+ after_initialize { self.uuid = SecureRandom.uuid if uuid.nil? }
16
+ before_validation :calculate_depth
17
+ before_save { self.children_cache.uniq! }
18
+ after_save { parent.cache_children! unless parent.nil? }
19
+ after_create :cache_parents!
20
+
21
+ validates_presence_of :name
22
+ validates_uniqueness_of :name, scope: [:parent_id]
23
+ validates_length_of :name, maximum: NAME_LIMIT
24
+ validate :parent_is_not_too_deep
25
+
26
+ scope :ordered_by_name, -> { order('name asc') }
27
+ scope :for_tree, ->(parent_id = nil) { where(parent_id: parent_id).ordered_by_name }
28
+
29
+ # Allowed parameters for editing entity in controllers
30
+ #
31
+ # @return [Array<Symbol>]
32
+ def self.entity_parameters
33
+ %i(name snapshot)
34
+ end
35
+
36
+ # Allowed parameters for creating in controllers
37
+ #
38
+ # @return [Array<Symbol>]
39
+ def self.creation_parameters
40
+ entity_parameters + %i(parent_id)
41
+ end
42
+
43
+ def full_title
44
+ (parents.map { |parent| parent.name } + [name]).join ' / '
45
+ end
46
+
47
+ # @return [Array<Integer>]
48
+ def parent_ids
49
+ parents_cache.split(',').compact.map(&:to_i)
50
+ end
51
+
52
+ # Parent branch ids including current id
53
+ #
54
+ # @return [Array<Integer>]
55
+ def branch_ids
56
+ parents_cache.split(',').map(&:to_i).reject { |i| i < 1 }.uniq + [id]
57
+ end
58
+
59
+ # Child branch (with subbranches) ids starting with current id
60
+ #
61
+ # @return [Array<Integer>]
62
+ def subbranch_ids
63
+ [id] + children_cache
64
+ end
65
+
66
+ def parents
67
+ return [] if parents_cache.blank?
68
+ MediaFolder.where(id: parent_ids).order('id asc')
69
+ end
70
+
71
+ # Total media file count for all children and current entity
72
+ #
73
+ # @return [Integer]
74
+ def file_count
75
+ MediaFolder.where(id: subbranch_ids).sum(:media_files_count)
76
+ end
77
+
78
+ def can_be_deleted?
79
+ file_count < 1
80
+ end
81
+
82
+ # @param [User] user
83
+ def editable_by?(user)
84
+ owned_by?(user) || UserPrivilege.user_has_privilege?(user, :chief_editor)
85
+ end
86
+
87
+ def cache_parents!
88
+ return if parent.nil?
89
+ self.parents_cache = "#{parent.parents_cache},#{parent_id}".gsub(/\A,/, '')
90
+ save!
91
+ end
92
+
93
+ def cache_children!
94
+ child_folders.order('id asc').each do |child|
95
+ self.children_cache += [child.id] + child.children_cache
96
+ end
97
+ save!
98
+ end
99
+
100
+ private
101
+
102
+ def calculate_depth
103
+ return if parent.nil?
104
+ self.depth = parent.depth + 1
105
+ end
106
+
107
+ def parent_is_not_too_deep
108
+ return if parent.nil?
109
+ if parent.depth >= MAX_DEPTH
110
+ error = I18n.t('activerecord.errors.models.media_folder.attributes.parent.is_too_deep')
111
+ errors.add(:parent, error)
112
+ end
113
+ end
114
+ end
data/app/models/metric.rb CHANGED
@@ -4,10 +4,13 @@ class Metric < ApplicationRecord
4
4
  DESCRIPTION_LIMIT = 250
5
5
  PERIOD_RANGE = (1..365)
6
6
 
7
+ METRIC_HTTP_400 = 'errors.http.bad_request.hit'
7
8
  METRIC_HTTP_401 = 'errors.http.unauthorized.hit'
9
+ METRIC_HTTP_403 = 'errors.http.forbidden.hit'
8
10
  METRIC_HTTP_404 = 'errors.http.not_found.hit'
11
+ METRIC_HTTP_422 = 'errors.http.unprocessable_entity.hit'
12
+ METRIC_HTTP_500 = 'errors.http.internal_server_error.hit'
9
13
  METRIC_HTTP_503 = 'errors.http.service_unavailable.hit'
10
- METRIC_HTTP_505 = 'errors.http.internal_server_error.hit'
11
14
 
12
15
  has_many :metric_values, dependent: :destroy
13
16
 
@@ -23,7 +23,7 @@ class PrivilegeGroup < ApplicationRecord
23
23
  def self.ids(slug)
24
24
  instance = find_by(slug: slug.to_s)
25
25
  return [] if instance.nil?
26
- instance.privileges.map(&:ids).flatten.uniq
26
+ instance.privileges.map(&:branch_ids).flatten.uniq
27
27
  end
28
28
 
29
29
  def self.entity_parameters
@@ -0,0 +1,30 @@
1
+ class MediaFileUploader < CarrierWave::Uploader::Base
2
+ include CarrierWave::MiniMagick
3
+ include CarrierWave::BombShelter
4
+
5
+ # Choose what kind of storage to use for this uploader:
6
+ storage :file
7
+ # storage :fog
8
+
9
+ # Override the directory where uploaded files will be stored.
10
+ # This is a sensible default for uploaders that are meant to be mounted:
11
+ def store_dir
12
+ "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id/10000.floor}/#{model.id/100.floor}/#{model.id}"
13
+ end
14
+
15
+ version :medium_2x do
16
+ resize_to_fit 1280, 1280
17
+ end
18
+
19
+ version :medium, from_version: :medium_2x do
20
+ resize_to_fit 640, 640
21
+ end
22
+
23
+ def extension_whitelist
24
+ %w(jpg jpeg gif png)
25
+ end
26
+
27
+ def filename
28
+ "#{model.uuid}.#{file.extension}" if original_filename
29
+ end
30
+ end
@@ -0,0 +1,32 @@
1
+ class MediaSnapshotUploader < CarrierWave::Uploader::Base
2
+ include CarrierWave::MiniMagick
3
+ include CarrierWave::BombShelter
4
+
5
+ # Choose what kind of storage to use for this uploader:
6
+ storage :file
7
+ # storage :fog
8
+
9
+ def store_dir
10
+ "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id/10000.floor}/#{model.id/100.floor}/#{model.id}"
11
+ end
12
+
13
+ def default_url(*args)
14
+ ActionController::Base.helpers.asset_path('biovision/base/placeholders/file.svg')
15
+ end
16
+
17
+ version :preview_2x do
18
+ resize_to_fit(160, 160)
19
+ end
20
+
21
+ version :preview, from_version: :preview_2x do
22
+ resize_to_fit(80, 80)
23
+ end
24
+
25
+ def extension_whitelist
26
+ %w(jpg jpeg png)
27
+ end
28
+
29
+ def filename
30
+ "#{model.uuid}.#{file.extension}" if original_filename
31
+ end
32
+ end
@@ -0,0 +1,2 @@
1
+ <div><%= link_to(t('.text'), admin_feedback_requests_path) %></div>
2
+ <div class="description"><%= t('.description') %></div>
@@ -0,0 +1,18 @@
1
+ <div class="data">
2
+ <div><%= entity.name %></div>
3
+ <div class="info">
4
+ <%= entity.phone %>
5
+ <%= entity.email %>
6
+ </div>
7
+ <div class="secondary info">
8
+ <%= time_tag entity.created_at %><br/>
9
+ <%= entity.ip %>
10
+ </div>
11
+ <% unless entity.comment.blank? %>
12
+ <div class="secondary info">
13
+ <%= simple_format entity.comment %>
14
+ </div>
15
+ <% end %>
16
+
17
+ <%= render partial: 'shared/admin/toggleable', locals: { entity: entity, url: toggle_admin_feedback_request_path(entity.id) } %>
18
+ </div>
@@ -0,0 +1,16 @@
1
+ <% content_for :meta_title, t('.title', page: current_page) %>
2
+ <% content_for :breadcrumbs do %>
3
+ <span><%= t('admin.feedback_requests.nav_item.text') %></span>
4
+ <% end %>
5
+
6
+ <article>
7
+ <h1><%= t('.heading') %></h1>
8
+
9
+ <ul class="actions">
10
+ <li><%= back_icon(admin_path) %></li>
11
+ </ul>
12
+
13
+ <%= paginate @collection %>
14
+ <%= render partial: 'shared/admin/list', locals: { collection: @collection } %>
15
+ <%= paginate @collection %>
16
+ </article>
@@ -0,0 +1,6 @@
1
+ <%= render 'admin/index/dashboard/settings' %>
2
+ <%= render 'admin/index/dashboard/biovision_track' %>
3
+ <%= render 'admin/index/dashboard/biovision_region' %>
4
+ <%= render 'admin/index/dashboard/biovision_user' %>
5
+ <%= render 'admin/index/dashboard/editorial' %>
6
+ <%= render 'admin/index/dashboard/biovision_feedback' %>
File without changes
@@ -0,0 +1,9 @@
1
+ <% if current_user_has_privilege?(:feedback_manager) %>
2
+ <nav>
3
+ <div class="heading"><%= t('.heading') %></div>
4
+
5
+ <ul>
6
+ <li><%= render 'admin/feedback_requests/nav_item' %></li>
7
+ </ul>
8
+ </nav>
9
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <% if current_user_in_group?(:region_managers) %>
2
+ <nav>
3
+ <div class="heading"><%= t('.heading') %></div>
4
+ <ul>
5
+ <li><%= render 'admin/regions/nav_item' %></li>
6
+ </ul>
7
+ </nav>
8
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <% if current_user_has_privilege?(:metrics_manager) %>
2
+ <nav>
3
+ <div class="heading"><%= t('.heading') %></div>
4
+ <ul>
5
+ <li><%= render 'admin/metrics/nav_item' %></li>
6
+ </ul>
7
+ </nav>
8
+ <% end %>
@@ -0,0 +1,13 @@
1
+ <% if current_user_has_privilege?(:administrator) %>
2
+ <nav>
3
+ <div class="heading"><%= t('.heading') %></div>
4
+ <ul>
5
+ <li><%= render 'admin/users/nav_item' %></li>
6
+ <li><%= render 'admin/privileges/nav_item' %></li>
7
+ <li><%= render 'admin/privilege_groups/nav_item' %></li>
8
+ <li><%= render 'admin/login_attempts/nav_item' %></li>
9
+ <li><%= render 'admin/tokens/nav_item' %></li>
10
+ <li><%= render 'admin/codes/nav_item' %></li>
11
+ </ul>
12
+ </nav>
13
+ <% end %>
@@ -0,0 +1,12 @@
1
+ <% if current_user_in_group?(:editors) %>
2
+ <nav>
3
+ <div class="heading"><%= t('.heading') %></div>
4
+ <ul>
5
+ <% if current_user_has_privilege?(:chief_editor) %>
6
+ <li><%= render 'admin/editable_pages/nav_item' %></li>
7
+ <% end %>
8
+ <li><%= render 'admin/media_folders/nav_item' %></li>
9
+ <li><%= render 'admin/media_files/nav_item' %></li>
10
+ </ul>
11
+ </nav>
12
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <% if current_user_has_privilege?(:administrator) %>
2
+ <nav>
3
+ <div class="heading"><%= t('.heading') %></div>
4
+
5
+ <ul>
6
+ <li><%= render 'admin/stored_values/nav_item' %></li>
7
+ </ul>
8
+ </nav>
9
+ <% end %>
@@ -4,27 +4,7 @@
4
4
  <h1><%= t('.heading') %></h1>
5
5
 
6
6
  <div class="dashboard">
7
- <nav>
8
- <ul>
9
- <% if current_user_has_privilege?(:administrator) %>
10
- <li><%= render 'admin/users/nav_item' %></li>
11
- <li><%= render 'admin/login_attempts/nav_item' %></li>
12
- <li><%= render 'admin/tokens/nav_item' %></li>
13
- <li><%= render 'admin/codes/nav_item' %></li>
14
- <li><%= render 'admin/privileges/nav_item' %></li>
15
- <li><%= render 'admin/privilege_groups/nav_item' %></li>
16
- <li><%= render 'admin/stored_values/nav_item' %></li>
17
- <% end %>
18
- <% if current_user_in_group?(:region_managers) %>
19
- <li><%= render 'admin/regions/nav_item' %></li>
20
- <% end %>
21
- <% if current_user_has_privilege?(:metrics_manager) %>
22
- <li><%= render 'admin/metrics/nav_item' %></li>
23
- <% end %>
24
- <% if current_user_has_privilege?(:chief_editor) %>
25
- <li><%= render 'admin/editable_pages/nav_item' %></li>
26
- <% end %>
27
- </ul>
28
- </nav>
7
+ <%= render 'admin/index/biovision_base' %>
8
+ <%= render 'admin/index/custom_dashboard' %>
29
9
  </div>
30
10
  </article>
@@ -0,0 +1,2 @@
1
+ <div><%= link_to t('.text'), admin_media_files_path %></div>
2
+ <div class="description"><%= t('.description') %></div>
@@ -0,0 +1,26 @@
1
+ <div class="image">
2
+ <%= media_snapshot_preview(entity) %>
3
+ </div>
4
+ <div class="data">
5
+ <div><%= admin_media_file_link(entity) %></div>
6
+ <div class="info">
7
+ <%= editor_user_link(entity.user) %>,
8
+ <%= time_tag(entity.created_at) %>
9
+ </div>
10
+ <% unless entity.description.blank? %>
11
+ <div class="secondary info">
12
+ <%= entity.description %>
13
+ </div>
14
+ <% end %>
15
+ <% unless entity.media_folder.nil? %>
16
+ <div class="secondary info">
17
+ <%= admin_media_folder_link(entity.media_folder, entity.media_folder.full_title) %>
18
+ </div>
19
+ <% end %>
20
+
21
+ <ul class="actions">
22
+ <% if entity.editable_by?(current_user) %>
23
+ <li><%= edit_icon(edit_media_file_path(entity.id)) %></li>
24
+ <% end %>
25
+ </ul>
26
+ </div>
@@ -0,0 +1,17 @@
1
+ <% content_for :meta_title, t('.title', page: current_page) %>
2
+ <% content_for :breadcrumbs do %>
3
+ <span><%= t('admin.media_files.nav_item.text') %></span>
4
+ <% end %>
5
+
6
+ <article>
7
+ <h1><%= t('.heading') %></h1>
8
+
9
+ <ul class="actions">
10
+ <li><%= back_icon(admin_path) %></li>
11
+ <li><%= create_icon(new_media_file_path) %></li>
12
+ </ul>
13
+
14
+ <%= paginate @collection %>
15
+ <%= render partial: 'shared/admin/list', locals: { collection: @collection } %>
16
+ <%= paginate @collection %>
17
+ </article>
@@ -0,0 +1,60 @@
1
+ <% content_for :meta_title, @entity.name %>
2
+ <% content_for :breadcrumbs do %>
3
+ <%= link_to(t('admin.media_files.nav_item.text'), admin_media_files_path) %>
4
+ <span><%= @entity.name %></span>
5
+ <% end %>
6
+
7
+ <article>
8
+ <h1><%= @entity.name %></h1>
9
+
10
+ <ul class="actions">
11
+ <li>
12
+ <% if @entity.media_folder.nil? %>
13
+ <%= return_icon(admin_media_files_path) %>
14
+ <% else %>
15
+ <%= return_icon(admin_media_folder_path(@entity.media_folder_id)) %>
16
+ <% end %>
17
+ </li>
18
+ <li><%= edit_icon(edit_media_file_path(@entity.id)) %></li>
19
+ </ul>
20
+
21
+
22
+ <dl>
23
+ <dt><%= t('activerecord.attributes.media_file.file') %></dt>
24
+ <dd>
25
+ <figure role="group">
26
+ <%= media_file_medium(@entity) %>
27
+ <figcaption>
28
+ <%= t('activerecord.attributes.media_file.file') %>
29
+ </figcaption>
30
+ </figure>
31
+
32
+ </dd>
33
+ <% unless @entity.media_folder.nil? %>
34
+ <dt><%= t('activerecord.attributes.media_file.media_folder') %></dt>
35
+ <dd><%= admin_media_folder_link(@entity.media_folder, @entity.media_folder.full_title) %></dd>
36
+ <% end %>
37
+
38
+ <dt><%= t('activerecord.attributes.media_file.name') %></dt>
39
+ <dd><%= @entity.name %></dd>
40
+
41
+ <% unless @entity.description.blank? %>
42
+ <dt><%= t('activerecord.attributes.media_file.description') %></dt>
43
+ <dd><%= @entity.description %></dd>
44
+ <% end %>
45
+
46
+ <dt><%= t('activerecord.attributes.media_file.user') %></dt>
47
+ <dd><%= editor_user_link(@entity.user) %></dd>
48
+
49
+ <dt><%= t(:created_at) %></dt>
50
+ <dd><%= time_tag(@entity.created_at) %></dd>
51
+
52
+ <dt><%= t(:updated_at) %></dt>
53
+ <dd><%= time_tag(@entity.updated_at) %></dd>
54
+
55
+ <dt><%= t('activerecord.attributes.media_file.uuid') %></dt>
56
+ <dd><%= @entity.uuid %></dd>
57
+ </dl>
58
+
59
+ <%= render partial: 'shared/track', locals: { item: @entity } %>
60
+ </article>
@@ -0,0 +1,2 @@
1
+ <div><%= link_to t('.text'), admin_media_folders_path %></div>
2
+ <div class="description"><%= t('.description') %></div>
@@ -0,0 +1,32 @@
1
+ <div class="image">
2
+ <%= media_snapshot_preview(entity) %>
3
+ </div>
4
+ <div class="data">
5
+ <div><%= admin_media_folder_link(entity) %></div>
6
+ <div class="info">
7
+ <%= t(:created_at) %>:
8
+ <%= time_tag(entity.created_at) %><br/>
9
+ <%= t('activerecord.attributes.media_folder.user') %>:
10
+ <%= editor_user_link(entity.user) %>
11
+ </div>
12
+ <div class="secondary info">
13
+ <%= link_to(t(:media_file_count, count: entity.media_files_count), files_admin_media_folder_path(entity.id)) %>
14
+ (<%= t(:total) %> <%= entity.file_count %>)
15
+ </div>
16
+ <% if entity.children_cache.any? %>
17
+ <div class="children">
18
+ <%=
19
+ button_tag(t(:child_media_folder_count, count: entity.child_folders.count),
20
+ type: :button,
21
+ class: 'button-expand children-loader',
22
+ data: { url: admin_media_folders_path(parent_id: entity.id) })
23
+ %>
24
+ </div>
25
+ <% end %>
26
+
27
+ <% if entity.editable_by?(current_user) %>
28
+ <ul class="actions">
29
+ <li><%= edit_icon(edit_media_folder_path(entity.id)) %></li>
30
+ </ul>
31
+ <% end %>
32
+ </div>
@@ -0,0 +1,28 @@
1
+ <% content_for :meta_title, t('.title', name: @entity.name, page: current_page) %>
2
+ <% content_for :breadcrumbs do %>
3
+ <%= link_to(t('admin.media_folders.nav_item.text'), admin_media_folders_path) %>
4
+ <% @entity.parents.each do |parent| %>
5
+ <%= admin_media_folder_link(parent) %>
6
+ <% end %>
7
+ <%= admin_media_folder_link(@entity) %>
8
+ <span><%= t('admin.media_folders.show.media_files') %></span>
9
+ <% end %>
10
+
11
+ <article>
12
+ <h1><%= @entity.full_title %></h1>
13
+ <h2><%= t(:media_file_count, count: @entity.media_files_count) %></h2>
14
+
15
+ <ul class="actions">
16
+ <li><%= return_icon(admin_media_folder_path(@entity.id)) %></li>
17
+ </ul>
18
+
19
+ <%= paginate @collection %>
20
+ <%= render partial: 'shared/admin/list', locals: { collection: @collection } %>
21
+ <%= paginate @collection %>
22
+
23
+ <section>
24
+ <h2><%= t('media_files.new.heading') %></h2>
25
+
26
+ <%= render partial: 'media_files/form', locals: { entity: @entity.media_files.new } %>
27
+ </section>
28
+ </article>
@@ -0,0 +1,21 @@
1
+ <% content_for :meta_title, t('.title') %>
2
+ <% content_for :breadcrumbs do %>
3
+ <span><%= t('admin.media_folders.nav_item.text') %></span>
4
+ <% end %>
5
+
6
+ <article>
7
+ <h1><%= t('.heading') %></h1>
8
+
9
+ <ul class="actions">
10
+ <li><%= back_icon(admin_path) %></li>
11
+ <li><%= create_icon(new_media_folder_path) %></li>
12
+ </ul>
13
+
14
+ <%= render partial: 'shared/admin/list', locals: { collection: @collection } %>
15
+
16
+ <section>
17
+ <h2><%= t('media_folders.new.heading') %></h2>
18
+
19
+ <%= render partial: 'media_folders/form', locals: { entity: MediaFolder.new } %>
20
+ </section>
21
+ </article>