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,79 @@
1
+ <% content_for :meta_title, @entity.name %>
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
+ <span><%= @entity.name %></span>
8
+ <% end %>
9
+
10
+ <article>
11
+ <h1><%= @entity.name %></h1>
12
+
13
+ <ul class="actions">
14
+ <li>
15
+ <% if @entity.parent.nil? %>
16
+ <%= return_icon(admin_media_folders_path) %>
17
+ <% else %>
18
+ <%= return_icon(admin_media_folder_path(@entity.parent_id)) %>
19
+ <% end %>
20
+ </li>
21
+ <li><%= edit_icon(edit_media_folder_path(@entity.id)) %></li>
22
+ </ul>
23
+
24
+ <% unless @entity.snapshot.blank? %>
25
+ <figure role="group">
26
+ <%= media_snapshot_preview(@entity) %>
27
+ <figcaption>
28
+ <%= t('activerecord.attributes.media_folder.snapshot') %>
29
+ </figcaption>
30
+ </figure>
31
+ <% end %>
32
+
33
+ <dl>
34
+ <% unless @entity.parent.nil? %>
35
+ <dt><%= t('activerecord.attributes.media_folder.parent') %></dt>
36
+ <dd><%= admin_media_folder_link(@entity.parent) %></dd>
37
+ <% end %>
38
+
39
+ <dt><%= t('activerecord.attributes.media_folder.name') %></dt>
40
+ <dd><%= @entity.name %></dd>
41
+
42
+ <dt><%= t('activerecord.attributes.media_folder.user') %></dt>
43
+ <dd><%= editor_user_link(@entity.user) %></dd>
44
+
45
+ <dt><%= t(:created_at) %></dt>
46
+ <dd><%= time_tag(@entity.created_at) %></dd>
47
+
48
+ <dt><%= t(:updated_at) %></dt>
49
+ <dd><%= time_tag(@entity.updated_at) %></dd>
50
+
51
+ <dt><%= t('activerecord.attributes.media_folder.uuid') %></dt>
52
+ <dd><%= @entity.uuid %></dd>
53
+
54
+ <dt><%= t('.media_files') %></dt>
55
+ <dd>
56
+ <%=
57
+ link_to(t(:media_file_count, count: @entity.media_files_count),
58
+ files_admin_media_folder_path(@entity.id))
59
+ %>
60
+ </dd>
61
+
62
+ <% if @collection.any? %>
63
+ <dt><%= t(:child_media_folder_count, count: @collection.count) %></dt>
64
+ <dd>
65
+ <%= render partial: 'shared/admin/list', locals: { collection: @collection } %>
66
+ </dd>
67
+ <% end %>
68
+ </dl>
69
+
70
+ <%= render partial: 'shared/track', locals: { item: @entity } %>
71
+
72
+ <% if @entity.depth < MediaFolder::MAX_DEPTH %>
73
+ <section>
74
+ <h2><%= t('.add_child') %></h2>
75
+
76
+ <%= render partial: 'media_folders/form', locals: { entity: MediaFolder.new(parent: @entity) } %>
77
+ </section>
78
+ <% end %>
79
+ </article>
@@ -0,0 +1,9 @@
1
+ <% content_for :meta_title, t('.title') %>
2
+
3
+ <article>
4
+ <h1><%= t('.heading') %></h1>
5
+
6
+ <div class="message-box-alert">
7
+ <%= t('.message') %>
8
+ </div>
9
+ </article>
@@ -1,11 +1,4 @@
1
- <% content_for(:meta_title, entity.title) unless entity.title.blank? %>
2
- <% content_for(:meta_keywords, entity.keywords) unless entity.keywords.blank? %>
3
- <% content_for(:meta_description, entity.description) unless entity.description.blank? %>
4
- <% content_for(:meta_image, request.protocol + request.host_with_port + entity.image.medium.url) unless entity.image.blank? %>
5
- <% content_for :meta_twitter do %>
6
- <meta name="twitter:card" content="summary_large_image" />
7
- <meta name="twitter:description" content="<%= entity.description %>" />
8
- <% end %>
1
+ <%= render partial: 'editable_pages/entity/metadata', locals: { entity: entity } %>
9
2
 
10
3
  <article>
11
4
  <h1><%= entity.title %></h1>
@@ -0,0 +1,14 @@
1
+ <% content_for(:meta_title, entity.title) unless entity.title.blank? %>
2
+ <% content_for(:meta_keywords, entity.keywords) unless entity.keywords.blank? %>
3
+ <% content_for(:meta_description, entity.description) unless entity.description.blank? %>
4
+ <% unless entity.image.blank? %>
5
+ <% content_for :meta_image, (request.protocol + request.host_with_port + entity.image.url) %>
6
+ <% end %>
7
+ <% content_for :meta_type_extension do %>
8
+ <meta property="og:article:published_time" content="<%= entity.created_at.strftime('%F') %>"/>
9
+ <meta property="og:article:modified_time" content="<%= entity.updated_at.strftime('%F') %>"/>
10
+ <% end %>
11
+ <% content_for :meta_twitter do %>
12
+ <meta name="twitter:card" content="summary_large_image"/>
13
+ <meta name="twitter:description" content="<%= entity.description %>"/>
14
+ <% end %>
@@ -4,7 +4,7 @@
4
4
  const editor = document.getElementById('editable_page_body');
5
5
 
6
6
  CKEDITOR.replace(editor, {
7
- // filebrowserUploadUrl: '/illustrations',
7
+ filebrowserUploadUrl: '/media_files/ckeditor',
8
8
  removePlugins: 'forms,save,preview,flash,bidi,language,print,templates,newpage'
9
9
  });
10
10
  });
@@ -0,0 +1,7 @@
1
+ <% content_for :meta_title, t(".#{action_name}.title") %>
2
+
3
+ <article>
4
+ <h1><%= t(".#{action_name}.heading") %></h1>
5
+
6
+ <div class="message-box-alert"><%= t(".#{action_name}.message") %></div>
7
+ </article>
@@ -0,0 +1,12 @@
1
+ <h1><%= t('.title') %></h1>
2
+
3
+ <dl>
4
+ <dt><%= t('activerecord.attributes.feedback_request.name') %></dt>
5
+ <dd><%= @entity.name %></dd>
6
+
7
+ <dt><%= t('activerecord.attributes.feedback_request.email') %></dt>
8
+ <dd><%= @entity.email %></dd>
9
+
10
+ <dt><%= t('activerecord.attributes.feedback_request.phone') %></dt>
11
+ <dd><%= @entity.phone %></dd>
12
+ </dl>
@@ -0,0 +1,5 @@
1
+ <%= t('.title') %>
2
+
3
+ <%= t('activerecord.attributes.feedback_request.name') %>: <%= @entity.name %>
4
+ <%= t('activerecord.attributes.feedback_request.email') %>: <%= @entity.email %>
5
+ <%= t('activerecord.attributes.feedback_request.phone') %>: <%= @entity.phone %>
@@ -0,0 +1,60 @@
1
+ <% form_id = 'feedback-request-form' unless local_assigns[:form_id] %>
2
+ <%= form_with model: entity, html: { id: form_id } do |f| %>
3
+ <div class="fields">
4
+ <%=
5
+ f.text_field(
6
+ :name,
7
+ size: nil,
8
+ maxlength: FeedbackRequest::NAME_LIMIT,
9
+ placeholder: t('activerecord.attributes.feedback_request.name'),
10
+ aria: { label: t('activerecord.attributes.feedback_request.name') },
11
+ required: true
12
+ )
13
+ %>
14
+ <%=
15
+ f.phone_field(
16
+ :phone,
17
+ size: nil,
18
+ maxlength: FeedbackRequest::PHONE_LIMIT,
19
+ placeholder: t('activerecord.attributes.feedback_request.phone'),
20
+ aria: {
21
+ label: t('activerecord.attributes.feedback_request.phone')
22
+ },
23
+ required: true
24
+ )
25
+ %>
26
+ <%=
27
+ f.email_field(
28
+ :email,
29
+ size: nil,
30
+ maxlength: FeedbackRequest::EMAIL_LIMIT,
31
+ placeholder: t('activerecord.attributes.feedback_request.email'),
32
+ aria: {
33
+ label: t('activerecord.attributes.feedback_request.email')
34
+ },
35
+ required: true
36
+ )
37
+ %>
38
+ <% if local_assigns[:accept_comment] %>
39
+ <%= f.text_area(
40
+ :comment,
41
+ cols: 20,
42
+ rows: 5,
43
+ maxlength: FeedbackRequest::COMMENT_LIMIT,
44
+ placeholder: t('activerecord.attributes.feedback_request.comment'),
45
+ aria: {
46
+ label: t('activerecord.attributes.feedback_request.comment')
47
+ }
48
+ )
49
+ %>
50
+ <% end %>
51
+ <%= hidden_field_tag 'form_id', form_id %>
52
+ </div>
53
+ <div class="button">
54
+ <%= button_tag(t(:submit), type: :submit) %>
55
+ </div>
56
+
57
+ <div class="result hidden"><%= t('.result') %></div>
58
+ <% end %>
59
+
60
+ <%= render partial: 'shared/forms/default_ajax_handler', locals: { form_id: form_id } %>
@@ -0,0 +1,10 @@
1
+ {
2
+ const form = document.getElementById('<%= j(param_from_request(:form_id)) %>');
3
+ const fields = form.querySelector('.fields');
4
+ const button = form.querySelector('.button');
5
+ const result = form.querySelector('.result');
6
+
7
+ fields.classList.add('hidden');
8
+ button.classList.add('hidden')
9
+ result.classList.remove('hidden');
10
+ }
@@ -0,0 +1,75 @@
1
+ <%= form_with model: entity, html: { id: 'media-file-form' } do |f| %>
2
+ <%= render partial: 'shared/list_of_errors', locals: { entity: entity } %>
3
+
4
+ <dl>
5
+ <% unless entity.id.nil? %>
6
+ <% unless entity.media_folder.nil? %>
7
+ <dt><%= t('activerecord.attributes.media_file.media_folder') %></dt>
8
+ <dd>
9
+ <%= admin_media_folder_link(entity.media_folder) %>
10
+ </dd>
11
+ <% end %>
12
+ <% end %>
13
+
14
+ <% if entity.id.nil? %>
15
+ <dt><%= f.label :file %></dt>
16
+ <dd>
17
+ <figure class="preview" id="media-file-file">
18
+ <% if entity.file.blank? %>
19
+ <% image = image_tag('biovision/base/placeholders/image.svg') %>
20
+ <% else %>
21
+ <% image = image_tag(entity.file.medium.url) %>
22
+ <% end %>
23
+ <%= f.label :file, image %>
24
+ <figcaption>
25
+ <%=
26
+ f.file_field(:file,
27
+ id: :media_file_file,
28
+ accept: 'image/jpeg,image/png,image/gif',
29
+ data: { image: 'media-file-file' },
30
+ required: true)
31
+ %>
32
+ </figcaption>
33
+ </figure>
34
+ <div class="guideline"><%= t('.guidelines.file') %></div>
35
+ </dd>
36
+ <% else %>
37
+ <dt><%= t('activerecord.attributes.media_file.file') %></dt>
38
+ <dd>
39
+ <figure role="group">
40
+ <%= media_file_medium(entity) %>
41
+ </figure>
42
+ </dd>
43
+ <% end %>
44
+
45
+ <dt><%= f.label :name %></dt>
46
+ <dd>
47
+ <%=
48
+ f.text_field(:name,
49
+ id: :media_file_name,
50
+ size: nil,
51
+ maxlength: MediaFile::NAME_LIMIT,
52
+ required: true)
53
+ %>
54
+ <div class="guideline"><%= t('.guidelines.name') %></div>
55
+ </dd>
56
+
57
+ <dt><%= f.label :description %></dt>
58
+ <dd>
59
+ <%=
60
+ f.text_field(:description,
61
+ id: :media_file_description,
62
+ size: nil,
63
+ maxlength: MediaFile::DESCRIPTION_LIMIT)
64
+ %>
65
+ <div class="guideline"><%= t('.guidelines.description') %></div>
66
+ </dd>
67
+ </dl>
68
+
69
+ <div class="buttons">
70
+ <%= f.hidden_field(:media_folder_id) if entity.id.nil? %>
71
+ <%= f.button t(:save), type: :submit, class: 'button-save' %>
72
+ </div>
73
+ <% end %>
74
+
75
+ <%= render partial: 'shared/forms/default_ajax_handler', locals: { form_id: 'media-file-form' } %>
@@ -0,0 +1,8 @@
1
+ <!doctype html>
2
+ <html lang="<%= locale %>">
3
+ <body>
4
+ <script>
5
+ window.parent.CKEDITOR.tools.callFunction('<%= param_from_request(:CKEditorFuncNum) %>','<%= request.protocol + request.host_with_port + @entity.file.medium.url %>');
6
+ </script>
7
+ </body>
8
+ </html>
@@ -0,0 +1,19 @@
1
+ <% content_for :meta_title, t('.title') %>
2
+ <% content_for :breadcrumbs do %>
3
+ <%= link_to(t('admin.media_files.nav_item.text'), admin_media_files_path) %>
4
+ <%= admin_media_file_link(@entity) %>
5
+ <span><%= t(:edit) %></span>
6
+ <% end %>
7
+
8
+ <article>
9
+ <h1><%= t('.heading') %></h1>
10
+
11
+ <ul class="actions">
12
+ <li><%= return_icon(admin_media_file_path(@entity.id)) %></li>
13
+ <% unless @entity.locked? %>
14
+ <li class="danger"><%= destroy_icon(@entity) %></li>
15
+ <% end %>
16
+ </ul>
17
+
18
+ <%= render partial: 'form', locals: { entity: @entity } %>
19
+ </article>
@@ -0,0 +1 @@
1
+ <%= render partial: 'shared/forms/list_of_errors', locals: { entity: @entity, form_id: 'media-file-form' } %>
@@ -0,0 +1,15 @@
1
+ <% content_for :meta_title, t('.title') %>
2
+ <% content_for :breadcrumbs do %>
3
+ <%= link_to(t('admin.media_files.nav_item.text'), admin_media_files_path) %>
4
+ <span><%= t(:create) %></span>
5
+ <% end %>
6
+
7
+ <article>
8
+ <h1><%= t('.heading') %></h1>
9
+
10
+ <ul class="actions">
11
+ <li><%= return_icon(admin_media_files_path) %></li>
12
+ </ul>
13
+
14
+ <%= render partial: 'form', locals: { entity: @entity } %>
15
+ </article>
@@ -0,0 +1 @@
1
+ <%= render partial: 'shared/forms/list_of_errors', locals: { entity: @entity, form_id: 'media-file-form' } %>
@@ -0,0 +1,54 @@
1
+ <%= form_with model: entity, html: { id: 'media-folder-form' } do |f| %>
2
+ <%= render partial: 'shared/list_of_errors', locals: { entity: entity } %>
3
+
4
+ <dl>
5
+ <% unless entity.id.nil? %>
6
+ <% unless entity.parent_id.nil? %>
7
+ <dt><%= t('activerecord.attributes.media_folder.parent_id') %></dt>
8
+ <dd>
9
+ <%= admin_media_folder_link(entity.parent) %>
10
+ </dd>
11
+ <% end %>
12
+ <% end %>
13
+
14
+ <dt><%= f.label :snapshot %></dt>
15
+ <dd>
16
+ <figure class="preview" id="media-folder-snapshot">
17
+ <% if entity.snapshot.blank? %>
18
+ <% image = image_tag('biovision/base/placeholders/image.svg') %>
19
+ <% else %>
20
+ <% image = image_tag(entity.snapshot.preview_2x.url) %>
21
+ <% end %>
22
+ <%= f.label :snapshot, image %>
23
+ <figcaption>
24
+ <%=
25
+ f.file_field(:snapshot,
26
+ id: :media_folder_snapshot,
27
+ accept: 'image/jpeg,image/png',
28
+ data: { image: 'media-folder-snapshot' })
29
+ %>
30
+ </figcaption>
31
+ </figure>
32
+ <div class="guideline"><%= t('.guidelines.snapshot') %></div>
33
+ </dd>
34
+
35
+ <dt><%= f.label :name %></dt>
36
+ <dd>
37
+ <%=
38
+ f.text_field(:name,
39
+ id: :media_folder_name,
40
+ size: nil,
41
+ maxlength: MediaFolder::NAME_LIMIT,
42
+ required: true)
43
+ %>
44
+ <div class="guideline"><%= t('.guidelines.name') %></div>
45
+ </dd>
46
+ </dl>
47
+
48
+ <div class="buttons">
49
+ <%= f.hidden_field(:parent_id) if entity.id.nil? %>
50
+ <%= f.button t(:save), type: :submit, class: 'button-save' %>
51
+ </div>
52
+ <% end %>
53
+
54
+ <%= render partial: 'shared/forms/default_ajax_handler', locals: { form_id: 'media-folder-form' } %>
@@ -0,0 +1,22 @@
1
+ <% content_for :meta_title, t('.title') %>
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(:edit) %></span>
9
+ <% end %>
10
+
11
+ <article>
12
+ <h1><%= t('.heading') %></h1>
13
+
14
+ <ul class="actions">
15
+ <li><%= return_icon(admin_media_folder_path(@entity.id)) %></li>
16
+ <% if @entity.can_be_deleted? %>
17
+ <li class="danger"><%= destroy_icon(@entity) %></li>
18
+ <% end %>
19
+ </ul>
20
+
21
+ <%= render partial: 'form', locals: { entity: @entity } %>
22
+ </article>
@@ -0,0 +1 @@
1
+ <%= render partial: 'shared/forms/list_of_errors', locals: { entity: @entity, form_id: 'media-folder-form' } %>
@@ -0,0 +1,19 @@
1
+ <% content_for :meta_title, t('.title') %>
2
+ <% content_for :breadcrumbs do %>
3
+ <%= link_to(t('admin.media_folders.nav_item.text'), admin_media_folders_path) %>
4
+ <span><%= t(:create) %></span>
5
+ <% end %>
6
+
7
+ <article>
8
+ <h1><%= t('.heading') %></h1>
9
+
10
+ <ul class="actions">
11
+ <% if @entity.parent.nil? %>
12
+ <li><%= return_icon(admin_media_folders_path) %></li>
13
+ <% else %>
14
+ <li><%= return_icon(admin_media_folder_path(@entity.parent_id)) %></li>
15
+ <% end %>
16
+ </ul>
17
+
18
+ <%= render partial: 'form', locals: { entity: @entity } %>
19
+ </article>
@@ -0,0 +1 @@
1
+ <%= render partial: 'shared/forms/list_of_errors', locals: { entity: @entity, form_id: 'media-folder-form' } %>
@@ -10,6 +10,9 @@
10
10
  <meta name="description" content="<%= yield :meta_description %>" />
11
11
  <meta property="og:description" content="<%= yield :meta_description %>" />
12
12
  <% end %>
13
+ <% if content_for? :meta_keywords %>
14
+ <meta name="keywords" content="<%= yield :meta_keywords %>" />
15
+ <% end %>
13
16
  <meta property="og:site_name" content="<%= t('.site_name') %>" />
14
17
  <meta property="twitter:title" content="<%= content_for :meta_title %>" />
15
18
  <meta name="twitter:site" content="<%= t('.twitter_site') %>" />
@@ -1,9 +1,9 @@
1
1
  if collection.respond_to?(:current_page)
2
2
  json.links do
3
- json.self url_for(page: collection.current_page)
3
+ json.self url_for(page: collection.current_page, format: :json)
4
4
  unless collection.next_page.nil?
5
- json.next url_for(page: collection.next_page)
5
+ json.next url_for(page: collection.next_page, format: :json)
6
6
  end
7
- json.last url_for(page: collection.total_pages)
7
+ json.last url_for(page: collection.total_pages, format: :json)
8
8
  end
9
9
  end
@@ -0,0 +1,7 @@
1
+ <div class="toggleable" data-url="<%= url %>">
2
+ <% entity.class.toggleable_attributes.each do |flag| %>
3
+ <span class="<%= entity.attributes[flag.to_s] ? 'active' : 'inactive' %>" data-flag="<%= flag %>">
4
+ <%= t("activerecord.attributes.#{entity.class.to_s.underscore}.#{flag}") %>
5
+ </span>
6
+ <% end %>
7
+ </div>
@@ -1,12 +1,3 @@
1
- <% content_for :meta_title, entity.title %>
2
- <% content_for :meta_description, entity.description %>
3
- <% content_for :meta_keywords, entity.keywords %>
4
- <% content_for :meta_type_extension do %>
5
- <meta property="og:article:published_time" content="<%= entity.created_at.strftime('%Y-%m-%d') %>"/>
6
- <meta property="og:article:modified_time" content="<%= entity.updated_at.strftime('%Y-%m-%d') %>"/>
7
- <% end %>
8
- <% unless entity.image.blank? %>
9
- <% content_for :meta_image, (request.protocol + request.host_with_port + entity.image.url) %>
10
- <% end %>
1
+ <%= render partial: 'editable_pages/entity/metadata', locals: { entity: entity } %>
11
2
 
12
3
  <%= raw entity.body %>
@@ -0,0 +1,13 @@
1
+ <script>
2
+ 'use strict';
3
+ document.addEventListener('DOMContentLoaded', function () {
4
+ const form = document.getElementById('<%= form_id %>');
5
+ const button = form.querySelector('button[type=submit]');
6
+ form.addEventListener('ajax:before', function() {
7
+ button.disabled = true;
8
+ });
9
+ form.addEventListener('ajax:complete', function() {
10
+ button.disabled = false;
11
+ });
12
+ });
13
+ </script>
@@ -0,0 +1,19 @@
1
+ {
2
+ const form = document.getElementById('<%= form_id %>');
3
+
4
+ let errors = form.querySelector('ol.errors');
5
+ let data = '';
6
+
7
+ if (!errors) {
8
+ errors = document.createElement('ol');
9
+ errors.classList.add('errors');
10
+ }
11
+
12
+ <% entity.errors.full_messages.each do |message| %>
13
+ data += '<li><%= j message %></li>';
14
+ <% end %>
15
+
16
+ errors.innerHTML = data;
17
+
18
+ form.prepend(errors);
19
+ }