spina 1.2.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/icons/spina/preview/icons_spina-preview.html +0 -2
  3. data/app/assets/icons/spina/preview/ics_spina-preview.html +0 -2
  4. data/app/assets/images/spina/favicon.png +0 -0
  5. data/app/assets/javascripts/spina/admin/application.js +1 -2
  6. data/app/assets/javascripts/spina/admin/controllers/attachment_picker_controller.js +15 -0
  7. data/app/assets/javascripts/spina/admin/controllers/image_form_controller.js +5 -4
  8. data/app/assets/javascripts/spina/admin/controllers/infinite_scroll_controller.js +20 -22
  9. data/app/assets/javascripts/spina/admin/controllers/media_picker_controller.js +171 -0
  10. data/app/assets/javascripts/spina/admin/controllers/modal_controller.js +18 -0
  11. data/app/assets/javascripts/spina/admin/controllers/repeater_form_controller.js +38 -0
  12. data/app/assets/javascripts/spina/admin/media_gallery.coffee +0 -3
  13. data/app/assets/javascripts/spina/admin/notifications.coffee +1 -1
  14. data/app/assets/javascripts/spina/admin/pages.coffee.erb +3 -20
  15. data/app/assets/javascripts/spina/admin/scaffold.coffee +1 -3
  16. data/app/assets/javascripts/spina/admin/trix.coffee.erb +14 -18
  17. data/app/assets/stylesheets/spina.sass +10 -8
  18. data/app/assets/stylesheets/spina/_buttons.sass +57 -31
  19. data/app/assets/stylesheets/spina/_forms.sass +66 -74
  20. data/app/assets/stylesheets/spina/_gallery.sass +18 -2
  21. data/app/assets/stylesheets/spina/_media_picker.sass +133 -0
  22. data/app/assets/stylesheets/spina/_modal.sass +35 -2
  23. data/app/assets/stylesheets/spina/_notifications.sass +20 -14
  24. data/app/assets/stylesheets/spina/_pages.sass +131 -0
  25. data/app/assets/stylesheets/spina/_sortable_lists.sass +14 -8
  26. data/app/assets/stylesheets/spina/_trix_custom.sass +15 -5
  27. data/app/controllers/concerns/spina/current_methods.rb +26 -0
  28. data/app/controllers/concerns/spina/frontend.rb +9 -0
  29. data/app/controllers/spina/admin/accounts_controller.rb +9 -13
  30. data/app/controllers/spina/admin/admin_controller.rb +5 -1
  31. data/app/controllers/spina/admin/attachments_controller.rb +0 -22
  32. data/app/controllers/spina/admin/images_controller.rb +1 -1
  33. data/app/controllers/spina/admin/media_picker_controller.rb +18 -19
  34. data/app/controllers/spina/admin/pages_controller.rb +1 -5
  35. data/app/controllers/spina/admin/resources_controller.rb +9 -4
  36. data/app/controllers/spina/application_controller.rb +6 -23
  37. data/app/controllers/spina/pages_controller.rb +11 -13
  38. data/app/controllers/spina/sitemaps_controller.rb +6 -6
  39. data/app/helpers/spina/admin/pages_helper.rb +22 -20
  40. data/app/helpers/spina/{files_helper.rb → attachments_helper.rb} +1 -1
  41. data/app/helpers/spina/images_helper.rb +9 -18
  42. data/app/helpers/spina/pages_helper.rb +23 -4
  43. data/app/models/concerns/spina/partable.rb +19 -7
  44. data/app/models/concerns/spina/translated_content.rb +19 -0
  45. data/app/models/spina/account.rb +3 -10
  46. data/app/models/spina/attachment.rb +0 -4
  47. data/app/models/spina/current.rb +1 -0
  48. data/app/models/spina/image.rb +0 -4
  49. data/app/models/spina/page.rb +19 -18
  50. data/app/models/spina/parts/attachment.rb +22 -0
  51. data/app/models/spina/parts/base.rb +12 -0
  52. data/app/models/spina/parts/image.rb +39 -0
  53. data/app/models/spina/parts/image_collection.rb +23 -0
  54. data/app/models/spina/parts/image_variant.rb +19 -0
  55. data/app/models/spina/parts/line.rb +7 -0
  56. data/app/models/spina/parts/multi_line.rb +7 -0
  57. data/app/models/spina/parts/option.rb +13 -0
  58. data/app/models/spina/parts/repeater.rb +10 -0
  59. data/app/models/spina/parts/repeater_content.rb +15 -0
  60. data/app/models/spina/parts/text.rb +7 -0
  61. data/app/models/spina/resource.rb +4 -0
  62. data/app/presenters/spina/content_presenter.rb +51 -0
  63. data/app/presenters/spina/menu_presenter.rb +2 -1
  64. data/app/views/layouts/spina/admin/admin.html.haml +3 -7
  65. data/app/views/layouts/spina/admin/pages.html.haml +5 -4
  66. data/app/views/layouts/spina/login.html.haml +0 -3
  67. data/app/views/spina/admin/accounts/_form.html.haml +13 -7
  68. data/app/views/spina/admin/accounts/analytics.html.haml +5 -3
  69. data/app/views/spina/admin/accounts/social.html.haml +13 -7
  70. data/app/views/spina/admin/accounts/style.html.haml +26 -21
  71. data/app/views/spina/admin/attachments/index.html.haml +1 -1
  72. data/app/views/spina/admin/images/_image.html.haml +1 -1
  73. data/app/views/spina/admin/images/index.html.haml +7 -5
  74. data/app/views/spina/admin/media_folders/_media_folder.html.haml +1 -1
  75. data/app/views/spina/admin/media_folders/show.html.haml +2 -2
  76. data/app/views/spina/admin/media_picker/_image.html.haml +3 -0
  77. data/app/views/spina/admin/media_picker/_media_picker.html.haml +32 -0
  78. data/app/views/spina/admin/media_picker/_media_picker_grid.html.haml +25 -0
  79. data/app/views/spina/admin/media_picker/_modal.html.haml +1 -1
  80. data/app/views/spina/admin/media_picker/infinite_scroll.js.erb +4 -4
  81. data/app/views/spina/admin/media_picker/select.js.erb +2 -0
  82. data/app/views/spina/admin/media_picker/show.html.haml +1 -0
  83. data/app/views/spina/admin/media_picker/show.js.erb +1 -1
  84. data/app/views/spina/admin/pages/_form.html.haml +9 -7
  85. data/app/views/spina/admin/pages/_form_advanced.html.haml +5 -5
  86. data/app/views/spina/admin/pages/_form_page_content.html.haml +14 -13
  87. data/app/views/spina/admin/pages/_form_page_seo.html.haml +9 -5
  88. data/app/views/spina/admin/pages/_page.html.haml +5 -3
  89. data/app/views/spina/admin/pages/_page_nested_list.html.haml +2 -3
  90. data/app/views/spina/admin/pages/index.html.haml +5 -4
  91. data/app/views/spina/admin/parts/attachments/_form.html.haml +6 -0
  92. data/app/views/spina/admin/parts/image_collections/_fields.html.haml +7 -0
  93. data/app/views/spina/admin/parts/image_collections/_form.html.haml +12 -0
  94. data/app/views/spina/admin/parts/images/_form.html.haml +18 -0
  95. data/app/views/spina/admin/parts/lines/_form.html.haml +2 -0
  96. data/app/views/spina/admin/parts/multi_lines/_form.html.haml +2 -0
  97. data/app/views/spina/admin/parts/options/_form.html.haml +3 -0
  98. data/app/views/spina/admin/parts/repeaters/_fields.html.haml +15 -0
  99. data/app/views/spina/admin/parts/repeaters/_form.html.haml +17 -0
  100. data/app/views/spina/admin/parts/texts/_form.html.haml +6 -0
  101. data/app/views/spina/admin/resources/edit.html.haml +28 -5
  102. data/app/views/spina/admin/resources/show.html.haml +5 -2
  103. data/app/views/spina/admin/shared/_notifications.html.haml +4 -4
  104. data/config/routes.rb +13 -0
  105. data/db/migrate/12_add_url_title_to_spina_page_translations.rb +1 -1
  106. data/db/migrate/13_add_json_attributes_to_spina_accounts.rb +5 -0
  107. data/db/migrate/14_add_json_attributes_to_spina_pages.rb +5 -0
  108. data/db/migrate/15_add_slug_to_spina_resources.rb +5 -0
  109. data/lib/generators/spina/templates/app/views/demo/pages/demo.html.haml +13 -21
  110. data/lib/generators/spina/templates/app/views/demo/pages/homepage.html.haml +1 -1
  111. data/lib/generators/spina/templates/config/initializers/mobility.rb +13 -4
  112. data/lib/generators/spina/templates/config/initializers/spina.rb +4 -0
  113. data/lib/generators/spina/templates/config/initializers/themes/default.rb +7 -7
  114. data/lib/generators/spina/templates/config/initializers/themes/demo.rb +32 -44
  115. data/lib/spina.rb +18 -3
  116. data/lib/spina/attr_json_spina_parts_model.rb +29 -0
  117. data/lib/spina/engine.rb +14 -6
  118. data/lib/spina/part.rb +19 -0
  119. data/lib/spina/theme.rb +1 -1
  120. data/lib/spina/version.rb +1 -1
  121. data/lib/tasks/spina_tasks.rake +1 -1
  122. data/vendor/assets/javascripts/spina/sortable.js +2 -2
  123. metadata +72 -51
  124. data/app/assets/javascripts/spina/admin/account.coffee +0 -16
  125. data/app/models/concerns/spina/image_collectable.rb +0 -23
  126. data/app/models/concerns/spina/optionable.rb +0 -12
  127. data/app/models/concerns/spina/part.rb +0 -38
  128. data/app/models/spina/attachment_collection.rb +0 -20
  129. data/app/models/spina/image_collection.rb +0 -23
  130. data/app/models/spina/image_collections_image.rb +0 -6
  131. data/app/models/spina/layout_part.rb +0 -22
  132. data/app/models/spina/line.rb +0 -10
  133. data/app/models/spina/option.rb +0 -17
  134. data/app/models/spina/page_part.rb +0 -22
  135. data/app/models/spina/structure.rb +0 -14
  136. data/app/models/spina/structure_item.rb +0 -22
  137. data/app/models/spina/structure_part.rb +0 -20
  138. data/app/models/spina/text.rb +0 -10
  139. data/app/views/dummy/show.html.haml +0 -1
  140. data/app/views/spina/admin/attachments/_attachment_collection.html.haml +0 -2
  141. data/app/views/spina/admin/attachments/_select.html.haml +0 -17
  142. data/app/views/spina/admin/attachments/_select_collection.html.haml +0 -18
  143. data/app/views/spina/admin/attachments/insert.js.erb +0 -5
  144. data/app/views/spina/admin/attachments/insert_collection.js.coffee +0 -7
  145. data/app/views/spina/admin/attachments/select.js.erb +0 -2
  146. data/app/views/spina/admin/attachments/select_collection.js.erb +0 -2
  147. data/app/views/spina/admin/image_collections/_image_collection.html.haml +0 -5
  148. data/app/views/spina/admin/layout_partables/lines/_form.html.haml +0 -2
  149. data/app/views/spina/admin/partables/attachment_collections/_form.html.haml +0 -14
  150. data/app/views/spina/admin/partables/attachments/_form.html.haml +0 -13
  151. data/app/views/spina/admin/partables/image_collections/_form.html.haml +0 -16
  152. data/app/views/spina/admin/partables/images/_form.html.haml +0 -21
  153. data/app/views/spina/admin/partables/lines/_form.html.haml +0 -5
  154. data/app/views/spina/admin/partables/options/_form.html.haml +0 -7
  155. data/app/views/spina/admin/partables/photo_collections/_form.html.haml +0 -4
  156. data/app/views/spina/admin/partables/photos/_form.html.haml +0 -4
  157. data/app/views/spina/admin/partables/structures/_form.html.haml +0 -21
  158. data/app/views/spina/admin/partables/texts/_form.html.haml +0 -8
  159. data/app/views/spina/admin/structure_items/_fields.html.haml +0 -15
  160. data/app/views/spina/admin/structure_partables/attachment_collections/_form.html.haml +0 -14
  161. data/app/views/spina/admin/structure_partables/attachments/_form.html.haml +0 -13
@@ -8,7 +8,7 @@
8
8
  %th
9
9
  %tr
10
10
  %td{colspan: 4}
11
- = form_with model: [:admin, Spina::Attachment.new], class: 'new_document', style: 'margin-bottom: 0' do |f|
11
+ = form_with model: [:admin, Spina::Attachment.new], local: false, class: 'new_document', style: 'margin-bottom: 0' do |f|
12
12
  = f.submit style: 'display: none'
13
13
  = f.file_field :files, multiple: true, data: {direct_upload_url: main_app.rails_direct_uploads_url, customfileinput: true}
14
14
 
@@ -5,4 +5,4 @@
5
5
  = t('spina.images.delete')
6
6
  %span.photo-name= truncate(image.name, length: 125)
7
7
 
8
- = image_tag variant(image.file, resize: '300x300^', crop: "300x300+0+0")
8
+ = image_tag main_app.url_for(image.variant(resize: '300x300^', crop: "300x300+0+0"))
@@ -1,12 +1,14 @@
1
1
  - content_for(:header_actions) do
2
2
  - if @media_folders.any?
3
- = link_to '#', class: 'button organize-switch', data: {organize_images: t('spina.photos.organize'), done_organizing: t('spina.photos.done_organizing')} do
4
- = icon('random')
5
- = t('spina.photos.organize')
3
+ = link_to '#', class: 'button button-default organize-switch', data: {organize_images: t('spina.photos.organize'), done_organizing: t('spina.photos.done_organizing')} do
4
+ .button-content
5
+ = icon('random')
6
+ = t('spina.photos.organize')
6
7
 
7
8
  = link_to new_admin_media_folder_path, class: 'button button-primary', style: 'margin-right: 0; margin-left: 4px', data: {remote: true} do
8
- = icon('plus')
9
- =t 'spina.photos.new_folder'
9
+ .button-content
10
+ = icon('plus')
11
+ =t 'spina.photos.new_folder'
10
12
 
11
13
  .gallery-container
12
14
  .gallery
@@ -1,7 +1,7 @@
1
1
  = link_to [:admin, media_folder], class: 'item media-folder', data: {add_to_media_folder_url: add_to_media_folder_admin_images_url(media_folder)} do
2
2
  .media-folder-thumbnail{data: {badge: media_folder.images.count}}
3
3
  - if media_folder.images.any?
4
- = image_tag variant(media_folder.images.last.file, resize: '144x144^', crop: "144x144+0+0")
4
+ = image_tag main_app.url_for(media_folder.images.last.variant(resize: '144x144^', crop: "144x144+0+0"))
5
5
  - else
6
6
  = image_tag 'spina/media_folder_placeholder.svg'
7
7
  .media-folder-shadow
@@ -1,6 +1,6 @@
1
1
  - content_for(:header_actions) do
2
- = link_to t('spina.photos.rename_folder'), spina.edit_admin_media_folder_path(@media_folder), class: 'button', data: {remote: true}
3
- = link_to t('spina.photos.delete_folder'), spina.admin_media_folder_path(@media_folder), class: 'button button-danger', style: "margin-right: 0", data: {method: :delete, confirm: t('spina.delete_confirmation', subject: @media_folder.name)}
2
+ = link_to t('spina.photos.rename_folder'), spina.edit_admin_media_folder_path(@media_folder), class: 'button button-default', data: {remote: true}
3
+ = link_to t('spina.photos.delete_folder'), spina.admin_media_folder_path(@media_folder), class: 'button button-default button-danger', style: "margin-right: 0", data: {method: :delete, confirm: t('spina.delete_confirmation', subject: @media_folder.name)}
4
4
 
5
5
  .gallery-container
6
6
  .gallery
@@ -0,0 +1,3 @@
1
+ %label.media-picker-image{data: {target: "media-picker.image"}}
2
+ = check_box_tag :image_id, image.id, image.id.in?(selected_ids), data: {action: "media-picker#choose", image_id: image.id, signed_blob_id: image.file.blob.signed_id, thumbnail_url: thumbnail_url(image), image_url: embedded_image_url(image), filename: image.file.filename}
3
+ %span= image_tag thumbnail_url(image)
@@ -0,0 +1,32 @@
1
+ .modal-container{data: {controller: "modal media-picker infinite-scroll", mode: @mode}}
2
+ .modal.modal-large{data: {target: "infinite-scroll.scrollContainer"}}
3
+ %header
4
+ = button_tag type: :default, class: 'modal-close-cross', data: {action: "modal#close"} do
5
+ = icon('cross')
6
+ - if @mode == "multiple"
7
+ %h3=t "spina.images.choose_images"
8
+ - else
9
+ %h3=t "spina.images.choose_image"
10
+ %section.media-picker
11
+ = hidden_field_tag :input, params[:input], data: {target: "media-picker.input"}
12
+
13
+ %div{data: {target: "media-picker.grid"}}
14
+ = render 'media_picker_grid'
15
+
16
+ - if @mode == "trix"
17
+ %section.media-picker-footer
18
+ = text_field_tag :alt, nil, placeholder: "✍️ Alt", data: {target: "media-picker.alt"}
19
+ = text_field_tag :link_to_url, nil, placeholder: "🔗 Link to URL", data: {target: "media-picker.linkToUrl"}
20
+
21
+ = button_tag type: :button, class: 'pull-right button button-primary', data: {action: "media-picker#insert_trix"} do
22
+ =t "spina.images.insert_image"
23
+
24
+ - if @mode == "multiple"
25
+ %section.media-picker-footer
26
+ .media-picker-selected-images{data: {target: "media-picker.selectedImages"}}
27
+ - @selected_images.each do |image|
28
+ = image_tag thumbnail_url(image), data: {target: "media-picker.selectedImage", image_id: image.id, signed_blob_id: image.file.blob.signed_id}
29
+
30
+ = button_tag type: :button, class: 'pull-right button button-primary', data: {action: "media-picker#choose_multiple"} do
31
+ =t "spina.images.confirm_selection"
32
+ %span{data: {target: "media-picker.selectedCount"}} (#{@selected_images.size})
@@ -0,0 +1,25 @@
1
+ .media-picker-grid#media_picker_grid
2
+ - if @media_folder.present?
3
+ = link_to spina.admin_media_picker_path, class: 'media-folder', data: {action: "media-picker#openFolder"} do
4
+ .media-folder-thumbnail
5
+ .media-folder-placeholder
6
+ %i.icon.icon-picture-o
7
+ .media-folder-shadow
8
+ .media-folder-name=t "spina.images.all_images"
9
+ - else
10
+ = form_with model: Spina::Image.new, url: admin_images_path, local: false, data: {action: "ajax:success->media-picker#refresh ajax:before->media-picker#startUpload", media_picker_url: spina.admin_media_picker_path} do |f|
11
+ .media-picker-uploader
12
+ = f.file_field :files, multiple: true, accept: "image/*", data: {direct_upload_url: main_app.rails_direct_uploads_url}
13
+ = f.submit
14
+
15
+ - @media_folders.each do |media_folder|
16
+ = link_to spina.admin_media_picker_path(media_folder_id: media_folder.id), class: 'media-folder', data: {action: "media-picker#openFolder"} do
17
+ .media-folder-thumbnail{data: {badge: media_folder.images.size}}
18
+ = image_tag main_app.url_for(media_folder.images.last.variant(resize: '144x144^', crop: "144x144+0+0"))
19
+ .media-folder-shadow
20
+ .media-folder-name= media_folder.name
21
+
22
+ = render partial: 'image', collection: @images
23
+
24
+ .media-picker-pagination
25
+ = link_to_next_page @images, "Next", data: {remote: true, target: "infinite-scroll.link"}
@@ -16,7 +16,7 @@
16
16
  = link_to spina.admin_media_picker_path({media_folder_id: media_folder.id}.merge(request.query_parameters)), class: 'item media-folder', data: {remote: true} do
17
17
  .media-folder-thumbnail{data: {badge: media_folder.images.count}}
18
18
  - if media_folder.images.any?
19
- = image_tag variant(media_folder.images.last.file, resize: '144x144^', crop: "144x144+0+0")
19
+ = image_tag main_app.url_for(media_folder.images.last.variant(resize: '144x144^', crop: "144x144+0+0"))
20
20
  - else
21
21
  = image_tag 'spina/media_folder_placeholder.svg'
22
22
  .media-folder-shadow
@@ -1,5 +1,5 @@
1
- // Append new data
2
- $("<%=j render partial: 'spina/admin/images/image', collection: @images %>").appendTo($(".infinite-scroll"));
1
+ document.querySelector(".media-picker-grid").insertAdjacentHTML("beforeend", "<%=j render partial: 'image', collection: @images %>")
3
2
 
4
- // Update pagination link
5
- $('.infinite-pagination').html("<%= j link_to_next_page @images, 'Next', params: params.slice(:selected_photo_id).permit(:selected_photo_id), remote: true, data: {target: 'infinite-scroll.link'} %>")
3
+ document.querySelector(".media-picker-pagination").innerHTML = "<%=j link_to_next_page @images, 'Next', data: {remote: true, target: 'infinite-scroll.link'} %>"
4
+
5
+ document.querySelector(".modal-container").infiniteScroll.loadNextPage()
@@ -4,6 +4,8 @@ hidden_input.val("");
4
4
 
5
5
  <% if @image.present? %>
6
6
  hidden_input.parents('.media_picker').append("<%=j render partial: 'spina/admin/images/image', object: @image, locals: {simple: true} %>");
7
+ hidden_input.parents('[data-controller="image-form"]').find(".image img").remove();
8
+ hidden_input.parents('[data-controller="image-form"]').find(".image")[0].insertAdjacentHTML("beforeend", `<%=j image_tag main_app.url_for(@image.variant(resize: "400x300^", crop: "400x300+0+0")), width: 200, height: 150 %>`)
7
9
  hidden_input.val("<%= @image.id %>");
8
10
 
9
11
  // Trix editor
@@ -0,0 +1 @@
1
+ = render partial: 'media_picker_grid'
@@ -1 +1 @@
1
- $("<%=j render partial: 'modal', locals: {multiple: params[:multiple]} %>").modal();
1
+ document.querySelector('body').insertAdjacentHTML("beforeend", "<%=j render partial: 'media_picker' %>")
@@ -1,6 +1,6 @@
1
1
  - if @page.errors.any?
2
2
  - content_for :notifications do
3
- .notification.notification-danger.animated.fadeInRight
3
+ .notification.notification-danger.animated.fadeInLeft
4
4
  = icon('exclamation')
5
5
  .notification-message
6
6
  =t 'spina.notifications.alert'
@@ -16,17 +16,18 @@
16
16
  - unless @page.new_record?
17
17
  - if Spina.config.locales.size > 1
18
18
  %div{style: "display: inline-block", data: {dropdown: true}}
19
- = link_to '#', class: 'button button-hollow button-small', style: 'margin-left: 0; margin-right: 0', data: {trigger: 'dropdown', target: '#locales'} do
20
- = icon('comment')
21
- =t "spina.languages.#{@locale}"
22
- %i.icon.icon-chevron-down{style: 'font-size: 9px; margin-right: 0'}
19
+ = link_to '#', class: 'button button-default button-small', style: 'margin-left: 0; margin-right: 0', data: {trigger: 'dropdown', target: '#locales'} do
20
+ .button-content
21
+ = icon('comment')
22
+ =t "spina.languages.#{@locale}"
23
+ %i.icon.icon-chevron-down{style: 'font-size: 9px; margin-right: 0; margin-left: 5px'}
23
24
 
24
25
  %ul#locales
25
26
  - Spina.config.locales.each do |locale|
26
27
  %li
27
28
  = link_to t("spina.languages.#{locale}"), "?locale=#{locale}", style: ('font-weight: 600' if @locale.to_s == locale.to_s).to_s
28
29
 
29
- = link_to @page.materialized_path, target: :blank, class: 'button button-hollow button-small', style: 'margin-left: 0' do
30
+ = link_to @page.materialized_path, target: :blank, class: 'button button-default button-small', style: 'margin-left: 0' do
30
31
  %i.icon.icon-export{style: 'margin: 0'}
31
32
 
32
33
  #header_actions
@@ -47,4 +48,5 @@
47
48
  = render "spina/admin/pages/form_#{tab}", f: f
48
49
 
49
50
  - unless @page.new_record? || !@page.deletable
50
- .pull-right= link_to t('spina.permanently_delete'), spina.admin_page_path(@page), method: :delete, data: {confirm: t('spina.pages.delete_confirmation', subject: @page.menu_title)}, class: 'button button-link button-danger'
51
+ .text-right{style: "margin-top: 60px"}
52
+ = link_to t('spina.permanently_delete'), spina.admin_page_path(@page), method: :delete, data: {confirm: t('spina.pages.delete_confirmation', subject: @page.menu_title)}, class: 'button button-default button-small button-danger', style: 'margin: 0'
@@ -1,6 +1,6 @@
1
1
  #advanced.tab-content
2
2
  .horizontal-form
3
- .well
3
+ %div{style: "margin: 40px 0"}
4
4
  .horizontal-form-group
5
5
  .horizontal-form-label
6
6
  = Spina::Page.human_attribute_name :draft
@@ -17,7 +17,8 @@
17
17
  .horizontal-form-label
18
18
  = Spina::Page.human_attribute_name :menu_title
19
19
  .horizontal-form-content
20
- = f.text_field :menu_title, placeholder: Spina::Page.human_attribute_name(:show_in_menu_placeholder), value: f.object.menu_title(fallback: false, default: nil)
20
+ .page-form-control
21
+ = f.text_field :menu_title, placeholder: Spina::Page.human_attribute_name(:show_in_menu_placeholder), value: f.object.menu_title(fallback: false, default: nil)
21
22
  .horizontal-form-group
22
23
  .horizontal-form-label
23
24
  = Spina::Page.human_attribute_name :skip_to_first_child
@@ -25,15 +26,14 @@
25
26
  .horizontal-form-content
26
27
  = f.check_box :skip_to_first_child, data: {switch: true}
27
28
 
28
- .well
29
29
  .horizontal-form-group
30
30
  .horizontal-form-label
31
31
  = Spina::Page.human_attribute_name :link_url
32
32
  %small= Spina::Page.human_attribute_name :link_url_description
33
33
  .horizontal-form-content
34
- = f.text_field :link_url, placeholder: Spina::Page.human_attribute_name(:link_url_placeholder)
34
+ .page-form-control
35
+ = f.text_field :link_url, placeholder: Spina::Page.human_attribute_name(:link_url_placeholder)
35
36
 
36
- .well
37
37
  - unless @page.resource.present?
38
38
  .horizontal-form-group
39
39
  .horizontal-form-label
@@ -1,16 +1,17 @@
1
- #page_content.tab-content.active.well
2
- .horizontal-form
3
- .horizontal-form-group
4
- .horizontal-form-label
5
- = Spina::Page.human_attribute_name :title
6
- .horizontal-form-content
7
- = f.text_field :title, placeholder: Spina::Page.human_attribute_name(:title_placeholder)
1
+ #page_content.tab-content.active
8
2
 
9
- = f.fields_for :page_parts, @page_parts.sort { |a,b| a.position(current_theme) <=> b.position(current_theme) } do |ff|
10
- = ff.hidden_field :id
11
- = ff.hidden_field :title
12
- = ff.hidden_field :page_partable_type
3
+ .page-form
4
+ .page-form-group
5
+ .page-form-label= Spina::Page.human_attribute_name :title
6
+ .page-form-control
7
+ = f.text_field :title, placeholder: Spina::Page.human_attribute_name(:title_placeholder), class: 'input-large'
8
+
9
+ - parts = (current_theme.view_templates.find{|v|v[:name].to_s == f.object.view_template.to_s}&.dig(:parts) || [])
10
+
11
+ = f.fields_for "#{@locale}_content".to_sym, build_parts(f.object, parts) do |ff|
12
+ = ff.hidden_field :type, value: ff.object.class
13
13
  = ff.hidden_field :name
14
+ = ff.hidden_field :title
14
15
 
15
- .horizontal-form-group.page-part{data: {name: ff.object.name}}
16
- = render "spina/admin/partables/#{ partable_type_partial_namespace(ff.object.page_partable_type) }/form", f: ff
16
+ .page-form-group.page-part{data: {name: ff.object.name}}
17
+ = render "spina/admin/parts/#{parts_partial_namespace(ff.object.class.to_s)}/form", f: ff
@@ -1,28 +1,32 @@
1
- #page_seo.tab-content.well
1
+ #page_seo.tab-content{style: "margin-top: 40px"}
2
2
  .horizontal-form
3
3
  .horizontal-form-group
4
4
  .horizontal-form-label
5
5
  = Spina::Page.human_attribute_name :seo_title
6
6
  .horizontal-form-content
7
- = f.text_field :seo_title, placeholder: Spina::Page.human_attribute_name(:seo_title_placeholder), value: f.object.seo_title(fallback: false, default: nil)
7
+ .page-form-control
8
+ = f.text_field :seo_title, placeholder: Spina::Page.human_attribute_name(:seo_title_placeholder), value: f.object.seo_title(fallback: false, default: nil)
8
9
 
9
10
  .horizontal-form-group
10
11
  .horizontal-form-label
11
12
  = Spina::Page.human_attribute_name :description
12
13
  %small= Spina::Page.human_attribute_name :description_description
13
14
  .horizontal-form-content
14
- = f.text_field :description, placeholder: Spina::Page.human_attribute_name(:description_placeholder)
15
+ .page-form-control
16
+ = f.text_field :description, placeholder: Spina::Page.human_attribute_name(:description_placeholder)
15
17
 
16
18
  .horizontal-form-group
17
19
  .horizontal-form-label
18
20
  = Spina::Page.human_attribute_name :url_title
19
21
  %small= Spina::Page.human_attribute_name :url_title_description
20
22
  .horizontal-form-content
21
- = f.text_field :url_title, placeholder: Spina::Page.human_attribute_name(:url_title_placeholder), value: f.object.url_title(fallback: false, default: nil)&.parameterize
23
+ .page-form-control
24
+ = f.text_field :url_title, placeholder: Spina::Page.human_attribute_name(:url_title_placeholder), value: f.object.url_title(fallback: false, default: nil)&.parameterize
22
25
 
23
26
  - unless @page.new_record?
24
27
  .horizontal-form-group
25
28
  .horizontal-form-label
26
29
  = Spina::Page.human_attribute_name :materialized_path
27
30
  .horizontal-form-content
28
- = f.text_field :materialized_path, disabled: true
31
+ .page-form-control
32
+ = f.text_field :materialized_path, disabled: true
@@ -1,5 +1,6 @@
1
1
  = link_to spina.edit_admin_page_path(page), class: 'button button-link button-small sortable-link' do
2
2
  = page.menu_title
3
+
3
4
  - if page.draft?
4
5
  %small (#{t('spina.pages.concept')})
5
6
  - elsif !page.show_in_menu?
@@ -9,6 +10,7 @@
9
10
  %small (#{raw t('spina.pages.skip_to_first_child')})
10
11
 
11
12
  %span.pull-right
12
- = link_to spina.edit_admin_page_path(page), class: 'button button-small button-link dd-nodrag' do
13
- = icon('pencil-outline')
14
- = t('spina.edit')
13
+ = link_to spina.edit_admin_page_path(page), class: 'button button-small button-default dd-nodrag' do
14
+ .button-content
15
+ = icon('pencil-outline')
16
+ = t('spina.edit')
@@ -2,6 +2,5 @@
2
2
  .dd-item-inner
3
3
  = render partial: 'page', object: page_nested_list
4
4
 
5
- - if page_nested_list.children.active.regular_pages.any?
6
- %ol.dd-list
7
- = render partial: 'page_nested_list', collection: page_nested_list.children.active.sorted.regular_pages
5
+ %ol.dd-list
6
+ = render partial: 'page_nested_list', collection: page_nested_list.children.active.sorted.regular_pages
@@ -1,8 +1,9 @@
1
1
  - content_for(:header_actions) do
2
2
  %span{data: {dropdown: true}}
3
3
  = link_to spina.new_admin_page_path(params: {view_template: 'show'}), class: 'button button-primary', style: 'margin-right: 0', data: {trigger: ('dropdown' if current_theme.new_page_templates.size > 1), target: '#create_page_dropdown'} do
4
- = icon('plus')
5
- = t('spina.pages.new')
4
+ .button-content
5
+ = icon('plus')
6
+ = t('spina.pages.new')
6
7
 
7
8
  .sliding-dropdown#create_page_dropdown.align-right
8
9
  .slide-controls
@@ -25,9 +26,9 @@
25
26
  - current_theme.new_page_templates.each_with_index do |template2, index2|
26
27
  .slide-dot{class: ('active' if index2 == index)}
27
28
 
28
- = link_to spina.new_admin_page_path(params: {view_template: template[0]}), class: 'button button-primary' do
29
+ = link_to spina.new_admin_page_path(params: {view_template: template[0]}), class: 'button button-default' do
29
30
  = icon('pencil-outline')
30
- = t('spina.pages.create_page', template: template[1])
31
+ = t('spina.pages.new')
31
32
 
32
33
  .well
33
34
  .dd#pages_list{data: {:"sort-url" => spina.sort_admin_pages_url }}
@@ -0,0 +1,6 @@
1
+ .page-form-label= f.object.title
2
+ .page-form-control{data: {controller: "attachment-picker"}}
3
+ = f.hidden_field :signed_blob_id, data: {target: "attachment-picker.signedBlobId"}
4
+ = f.hidden_field :filename, data: {target: "attachment-picker.filename"}
5
+ .select-dropdown
6
+ = f.select :attachment_id, Spina::Attachment.sorted.map{|attachment| [attachment.file&.filename, attachment.id, data: {signed_blob_id: attachment.file&.blob&.signed_id, filename: attachment.file&.filename}]}, {include_blank: t("spina.attachments.choose_attachment")}, {data: {action: "attachment-picker#chooseAttachment"}}
@@ -0,0 +1,7 @@
1
+ = f.hidden_field :image_id, class: 'image-id'
2
+ = f.hidden_field :signed_blob_id, class: 'signed-blob-id'
3
+ = f.hidden_field :filename, class: 'filename'
4
+ - if f.object.signed_blob_id.present? && f.object.spina_image
5
+ = image_tag main_app.url_for(f.object.spina_image.variant(resize: "400x300^", crop: "400x300+0+0"))
6
+ - else
7
+ = image_tag ""
@@ -0,0 +1,12 @@
1
+ .page-form-label= f.object.title
2
+ .page-form-control{data: {controller: "image-form"}}
3
+ .page-form-media-picker
4
+ = link_to admin_media_picker_path(selected_ids: f.object.image_ids, input: "media_picker_#{f.object.object_id}", mode: "multiple"), remote: true, class: 'images', data: {target: 'image-form.image'} do
5
+ .page-form-media-picker-placeholder=t "spina.images.choose"
6
+
7
+ %div{id: "media_picker_#{f.object.object_id}", data: data_attrs_for_image_collection(f)}
8
+ = f.fields_for :images do |ff|
9
+ = render partial: "spina/admin/parts/image_collections/fields", locals: {f: ff}
10
+
11
+ = button_tag type: :default, class: 'button button-small button-default', data: {action: "image-form#remove"} do
12
+ %i.icon.icon-cross{style: "margin: 0; font-size: 10px"}
@@ -0,0 +1,18 @@
1
+ .page-form-label= f.object.title
2
+ .page-form-control{data: {controller: "image-form"}}
3
+ .page-form-media-picker
4
+ %div{style: "width: 100%"}
5
+ = link_to admin_media_picker_path(selected_ids: [f.object.image_id], input: "media_picker_#{f.object.object_id}", mode: "single"), remote: true, class: 'image', data: {target: 'image-form.image'} do
6
+ .page-form-media-picker-placeholder=t "spina.images.choose_image"
7
+ %div{id: "media_picker_#{f.object.object_id}"}
8
+ = f.hidden_field :image_id, data: {target: 'image-form.imageId'}
9
+ = f.hidden_field :signed_blob_id, data: {target: 'image-form.signedBlobId'}
10
+ = f.hidden_field :filename, data: {target: 'image-form.filename'}
11
+ %div{style: "width: 200px; height: 150px; overflow: hidden"}
12
+ - if f.object.signed_blob_id.present? && f.object.spina_image.present?
13
+ = image_tag main_app.url_for(f.object.spina_image.variant(resize: "400x300^", crop: "400x300+0+0")), width: 200, height: 150
14
+
15
+ = f.text_field :alt, placeholder: "Alt text", class: 'page-form-media-picker-alt-text'
16
+
17
+ = button_tag type: :default, class: 'button button-small button-default', data: {action: "image-form#remove"} do
18
+ %i.icon.icon-cross{style: "margin: 0; font-size: 10px"}
@@ -0,0 +1,2 @@
1
+ .page-form-label= f.object.title
2
+ .page-form-control= f.text_field :content, placeholder: f.object.title
@@ -0,0 +1,2 @@
1
+ .page-form-label= f.object.title
2
+ .page-form-control= f.text_area :content, placeholder: f.object.title
@@ -0,0 +1,3 @@
1
+ .page-form-label= f.object.title
2
+ .page-form-control
3
+ .select-dropdown= f.select :value, f.object.options, include_blank: t("spina.options.choose_option")
@@ -0,0 +1,15 @@
1
+ .structure-form-pane{class: ('active' if f.options[:child_index].zero?), id: "structure_form_pane_#{f.object.object_id}", data: {part_id: f.object.object_id, target: "repeater-form.pane"}}
2
+ = f.hidden_field :title
3
+ = f.hidden_field :name
4
+
5
+ - parts = current_theme.parts.find{|p|p[:name].to_s == f.object.name.to_s}&.dig(:parts) || []
6
+
7
+ = f.fields_for :parts, build_parts(f.object, parts) do |ff|
8
+ = ff.hidden_field :title
9
+ = ff.hidden_field :type, value: ff.object.class
10
+ = ff.hidden_field :name
11
+
12
+ .structure-form-part
13
+ = render "spina/admin/parts/#{parts_partial_namespace(ff.object.class.to_s)}/form", f: ff
14
+
15
+ = link_to t('spina.delete'), '#', class: 'button button-mini button-link pull-right', data: {action: "repeater-form#delete", part_id: f.object.object_id}