spina 1.2.0 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of spina might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/app/assets/icons/spina/preview/icons_spina-preview.html +0 -2
- data/app/assets/icons/spina/preview/ics_spina-preview.html +0 -2
- data/app/assets/images/spina/favicon.png +0 -0
- data/app/assets/javascripts/spina/admin/application.js +1 -2
- data/app/assets/javascripts/spina/admin/controllers/attachment_picker_controller.js +15 -0
- data/app/assets/javascripts/spina/admin/controllers/image_form_controller.js +5 -4
- data/app/assets/javascripts/spina/admin/controllers/infinite_scroll_controller.js +20 -22
- data/app/assets/javascripts/spina/admin/controllers/media_picker_controller.js +171 -0
- data/app/assets/javascripts/spina/admin/controllers/modal_controller.js +18 -0
- data/app/assets/javascripts/spina/admin/controllers/repeater_form_controller.js +38 -0
- data/app/assets/javascripts/spina/admin/media_gallery.coffee +0 -3
- data/app/assets/javascripts/spina/admin/notifications.coffee +1 -1
- data/app/assets/javascripts/spina/admin/pages.coffee.erb +3 -20
- data/app/assets/javascripts/spina/admin/scaffold.coffee +1 -3
- data/app/assets/javascripts/spina/admin/trix.coffee.erb +14 -18
- data/app/assets/stylesheets/spina.sass +10 -8
- data/app/assets/stylesheets/spina/_buttons.sass +57 -31
- data/app/assets/stylesheets/spina/_forms.sass +66 -74
- data/app/assets/stylesheets/spina/_gallery.sass +18 -2
- data/app/assets/stylesheets/spina/_media_picker.sass +133 -0
- data/app/assets/stylesheets/spina/_modal.sass +35 -2
- data/app/assets/stylesheets/spina/_notifications.sass +20 -14
- data/app/assets/stylesheets/spina/_pages.sass +131 -0
- data/app/assets/stylesheets/spina/_sortable_lists.sass +14 -8
- data/app/assets/stylesheets/spina/_trix_custom.sass +15 -5
- data/app/controllers/concerns/spina/current_methods.rb +26 -0
- data/app/controllers/concerns/spina/frontend.rb +9 -0
- data/app/controllers/spina/admin/accounts_controller.rb +9 -13
- data/app/controllers/spina/admin/admin_controller.rb +5 -1
- data/app/controllers/spina/admin/attachments_controller.rb +0 -22
- data/app/controllers/spina/admin/images_controller.rb +1 -1
- data/app/controllers/spina/admin/media_picker_controller.rb +18 -19
- data/app/controllers/spina/admin/pages_controller.rb +1 -5
- data/app/controllers/spina/admin/resources_controller.rb +9 -4
- data/app/controllers/spina/application_controller.rb +6 -23
- data/app/controllers/spina/pages_controller.rb +11 -13
- data/app/controllers/spina/sitemaps_controller.rb +6 -6
- data/app/helpers/spina/admin/pages_helper.rb +22 -20
- data/app/helpers/spina/{files_helper.rb → attachments_helper.rb} +1 -1
- data/app/helpers/spina/images_helper.rb +9 -18
- data/app/helpers/spina/pages_helper.rb +23 -4
- data/app/models/concerns/spina/partable.rb +19 -7
- data/app/models/concerns/spina/translated_content.rb +19 -0
- data/app/models/spina/account.rb +3 -10
- data/app/models/spina/attachment.rb +0 -4
- data/app/models/spina/current.rb +1 -0
- data/app/models/spina/image.rb +0 -4
- data/app/models/spina/page.rb +19 -18
- data/app/models/spina/parts/attachment.rb +22 -0
- data/app/models/spina/parts/base.rb +12 -0
- data/app/models/spina/parts/image.rb +39 -0
- data/app/models/spina/parts/image_collection.rb +23 -0
- data/app/models/spina/parts/image_variant.rb +19 -0
- data/app/models/spina/parts/line.rb +7 -0
- data/app/models/spina/parts/multi_line.rb +7 -0
- data/app/models/spina/parts/option.rb +13 -0
- data/app/models/spina/parts/repeater.rb +10 -0
- data/app/models/spina/parts/repeater_content.rb +15 -0
- data/app/models/spina/parts/text.rb +7 -0
- data/app/models/spina/resource.rb +4 -0
- data/app/presenters/spina/content_presenter.rb +51 -0
- data/app/presenters/spina/menu_presenter.rb +2 -1
- data/app/views/layouts/spina/admin/admin.html.haml +3 -7
- data/app/views/layouts/spina/admin/pages.html.haml +5 -4
- data/app/views/layouts/spina/login.html.haml +0 -3
- data/app/views/spina/admin/accounts/_form.html.haml +13 -7
- data/app/views/spina/admin/accounts/analytics.html.haml +5 -3
- data/app/views/spina/admin/accounts/social.html.haml +13 -7
- data/app/views/spina/admin/accounts/style.html.haml +26 -21
- data/app/views/spina/admin/attachments/index.html.haml +1 -1
- data/app/views/spina/admin/images/_image.html.haml +1 -1
- data/app/views/spina/admin/images/index.html.haml +7 -5
- data/app/views/spina/admin/media_folders/_media_folder.html.haml +1 -1
- data/app/views/spina/admin/media_folders/show.html.haml +2 -2
- data/app/views/spina/admin/media_picker/_image.html.haml +3 -0
- data/app/views/spina/admin/media_picker/_media_picker.html.haml +32 -0
- data/app/views/spina/admin/media_picker/_media_picker_grid.html.haml +25 -0
- data/app/views/spina/admin/media_picker/_modal.html.haml +1 -1
- data/app/views/spina/admin/media_picker/infinite_scroll.js.erb +4 -4
- data/app/views/spina/admin/media_picker/select.js.erb +2 -0
- data/app/views/spina/admin/media_picker/show.html.haml +1 -0
- data/app/views/spina/admin/media_picker/show.js.erb +1 -1
- data/app/views/spina/admin/pages/_form.html.haml +9 -7
- data/app/views/spina/admin/pages/_form_advanced.html.haml +5 -5
- data/app/views/spina/admin/pages/_form_page_content.html.haml +14 -13
- data/app/views/spina/admin/pages/_form_page_seo.html.haml +9 -5
- data/app/views/spina/admin/pages/_page.html.haml +5 -3
- data/app/views/spina/admin/pages/_page_nested_list.html.haml +2 -3
- data/app/views/spina/admin/pages/index.html.haml +5 -4
- data/app/views/spina/admin/parts/attachments/_form.html.haml +6 -0
- data/app/views/spina/admin/parts/image_collections/_fields.html.haml +7 -0
- data/app/views/spina/admin/parts/image_collections/_form.html.haml +12 -0
- data/app/views/spina/admin/parts/images/_form.html.haml +18 -0
- data/app/views/spina/admin/parts/lines/_form.html.haml +2 -0
- data/app/views/spina/admin/parts/multi_lines/_form.html.haml +2 -0
- data/app/views/spina/admin/parts/options/_form.html.haml +3 -0
- data/app/views/spina/admin/parts/repeaters/_fields.html.haml +15 -0
- data/app/views/spina/admin/parts/repeaters/_form.html.haml +17 -0
- data/app/views/spina/admin/parts/texts/_form.html.haml +6 -0
- data/app/views/spina/admin/resources/edit.html.haml +28 -5
- data/app/views/spina/admin/resources/show.html.haml +5 -2
- data/app/views/spina/admin/shared/_notifications.html.haml +4 -4
- data/config/routes.rb +13 -0
- data/db/migrate/12_add_url_title_to_spina_page_translations.rb +1 -1
- data/db/migrate/13_add_json_attributes_to_spina_accounts.rb +5 -0
- data/db/migrate/14_add_json_attributes_to_spina_pages.rb +5 -0
- data/db/migrate/15_add_slug_to_spina_resources.rb +5 -0
- data/lib/generators/spina/templates/app/views/demo/pages/demo.html.haml +13 -21
- data/lib/generators/spina/templates/app/views/demo/pages/homepage.html.haml +1 -1
- data/lib/generators/spina/templates/config/initializers/mobility.rb +13 -4
- data/lib/generators/spina/templates/config/initializers/spina.rb +4 -0
- data/lib/generators/spina/templates/config/initializers/themes/default.rb +7 -7
- data/lib/generators/spina/templates/config/initializers/themes/demo.rb +32 -44
- data/lib/spina.rb +18 -3
- data/lib/spina/attr_json_spina_parts_model.rb +29 -0
- data/lib/spina/engine.rb +14 -6
- data/lib/spina/part.rb +19 -0
- data/lib/spina/theme.rb +1 -1
- data/lib/spina/version.rb +1 -1
- data/lib/tasks/spina_tasks.rake +1 -1
- data/vendor/assets/javascripts/spina/sortable.js +2 -2
- metadata +72 -51
- data/app/assets/javascripts/spina/admin/account.coffee +0 -16
- data/app/models/concerns/spina/image_collectable.rb +0 -23
- data/app/models/concerns/spina/optionable.rb +0 -12
- data/app/models/concerns/spina/part.rb +0 -38
- data/app/models/spina/attachment_collection.rb +0 -20
- data/app/models/spina/image_collection.rb +0 -23
- data/app/models/spina/image_collections_image.rb +0 -6
- data/app/models/spina/layout_part.rb +0 -22
- data/app/models/spina/line.rb +0 -10
- data/app/models/spina/option.rb +0 -17
- data/app/models/spina/page_part.rb +0 -22
- data/app/models/spina/structure.rb +0 -14
- data/app/models/spina/structure_item.rb +0 -22
- data/app/models/spina/structure_part.rb +0 -20
- data/app/models/spina/text.rb +0 -10
- data/app/views/dummy/show.html.haml +0 -1
- data/app/views/spina/admin/attachments/_attachment_collection.html.haml +0 -2
- data/app/views/spina/admin/attachments/_select.html.haml +0 -17
- data/app/views/spina/admin/attachments/_select_collection.html.haml +0 -18
- data/app/views/spina/admin/attachments/insert.js.erb +0 -5
- data/app/views/spina/admin/attachments/insert_collection.js.coffee +0 -7
- data/app/views/spina/admin/attachments/select.js.erb +0 -2
- data/app/views/spina/admin/attachments/select_collection.js.erb +0 -2
- data/app/views/spina/admin/image_collections/_image_collection.html.haml +0 -5
- data/app/views/spina/admin/layout_partables/lines/_form.html.haml +0 -2
- data/app/views/spina/admin/partables/attachment_collections/_form.html.haml +0 -14
- data/app/views/spina/admin/partables/attachments/_form.html.haml +0 -13
- data/app/views/spina/admin/partables/image_collections/_form.html.haml +0 -16
- data/app/views/spina/admin/partables/images/_form.html.haml +0 -21
- data/app/views/spina/admin/partables/lines/_form.html.haml +0 -5
- data/app/views/spina/admin/partables/options/_form.html.haml +0 -7
- data/app/views/spina/admin/partables/photo_collections/_form.html.haml +0 -4
- data/app/views/spina/admin/partables/photos/_form.html.haml +0 -4
- data/app/views/spina/admin/partables/structures/_form.html.haml +0 -21
- data/app/views/spina/admin/partables/texts/_form.html.haml +0 -8
- data/app/views/spina/admin/structure_items/_fields.html.haml +0 -15
- data/app/views/spina/admin/structure_partables/attachment_collections/_form.html.haml +0 -14
- data/app/views/spina/admin/structure_partables/attachments/_form.html.haml +0 -13
@@ -0,0 +1,17 @@
|
|
1
|
+
.page-form-label= f.object.title
|
2
|
+
.page-form-control
|
3
|
+
.structure-form{data: {controller: "repeater-form"}}
|
4
|
+
.structure-form-menu
|
5
|
+
%ul{data: {target: "repeater-form.list"}}
|
6
|
+
- (f.object.content || []).each.with_index do |repeater_content, index|
|
7
|
+
%li{class: ('active' if index.zero?), data: {part_id: repeater_content.object_id, target: "repeater-form.listItem"}}
|
8
|
+
= link_to "#structure_form_pane_#{repeater_content.object_id}" do
|
9
|
+
%i.icon.icon-bars.sortable-handle
|
10
|
+
%span= strip_tags(repeater_content.parts&.first&.content.to_s)
|
11
|
+
|
12
|
+
%div{style: "margin-top: 6px; margin-left: 6px"}
|
13
|
+
= link_to_add_repeater_fields f do
|
14
|
+
= icon('plus')
|
15
|
+
.structure-form-content{data: {target: "repeater-form.content"}}
|
16
|
+
= f.fields_for :content do |ff|
|
17
|
+
= render 'spina/admin/parts/repeaters/fields', f: ff
|
@@ -1,6 +1,6 @@
|
|
1
1
|
- if @resource.errors.any?
|
2
2
|
- content_for :notifications do
|
3
|
-
.notification.notification-danger.animated.
|
3
|
+
.notification.notification-danger.animated.fadeInLeft
|
4
4
|
= icon('exclamation')
|
5
5
|
.notification-message
|
6
6
|
=t 'spina.notifications.alert'
|
@@ -9,21 +9,44 @@
|
|
9
9
|
= icon('cross')
|
10
10
|
|
11
11
|
= form_with model: @resource, url: spina.admin_resource_path(@resource) do |f|
|
12
|
+
= hidden_field_tag :locale, @locale
|
13
|
+
|
12
14
|
%header#header
|
13
|
-
.breadcrumbs
|
15
|
+
.breadcrumbs
|
16
|
+
= render_breadcrumbs separator: '<div class="divider"></div>'
|
17
|
+
%span{style: 'margin-left: 10px'}
|
18
|
+
- if Spina.config.locales.size > 1
|
19
|
+
%div{style: "display: inline-block", data: {dropdown: true}}
|
20
|
+
= link_to '#', class: 'button button-default button-small', style: 'margin-left: 0; margin-right: 0', data: {trigger: 'dropdown', target: '#locales'} do
|
21
|
+
= icon('comment')
|
22
|
+
=t "spina.languages.#{@locale}"
|
23
|
+
%i.icon.icon-chevron-down{style: 'font-size: 9px; margin-right: 0'}
|
24
|
+
|
25
|
+
%ul#locales
|
26
|
+
- Spina.config.locales.each do |locale|
|
27
|
+
%li
|
28
|
+
= link_to t("spina.languages.#{locale}"), "?locale=#{locale}", style: ('font-weight: 600' if @locale.to_s == locale.to_s).to_s
|
14
29
|
|
15
30
|
#header_actions
|
16
31
|
%button.button.button-primary{type: 'submit', style: 'margin-right: 0'}
|
17
32
|
= icon('check')
|
18
33
|
=t 'spina.save'
|
19
34
|
|
20
|
-
.
|
21
|
-
|
35
|
+
.horizontal-form
|
36
|
+
%div{style: "margin: 40px 0"}
|
22
37
|
.horizontal-form-group
|
23
38
|
.horizontal-form-label
|
24
39
|
= Spina::Resource.human_attribute_name :label
|
25
40
|
.horizontal-form-content
|
26
|
-
|
41
|
+
.page-form-control
|
42
|
+
= f.text_field :label, placeholder: Spina::Resource.human_attribute_name(:label)
|
43
|
+
|
44
|
+
.horizontal-form-group
|
45
|
+
.horizontal-form-label
|
46
|
+
= Spina::Resource.human_attribute_name :slug
|
47
|
+
.horizontal-form-content
|
48
|
+
.page-form-control
|
49
|
+
= f.text_field :slug, placeholder: Spina::Resource.human_attribute_name(:slug), value: f.object.slug(locale: @locale)&.parameterize
|
27
50
|
|
28
51
|
.horizontal-form-group
|
29
52
|
.horizontal-form-label
|
@@ -1,10 +1,13 @@
|
|
1
1
|
- content_for(:header_actions) do
|
2
2
|
|
3
|
-
= link_to spina.edit_admin_resource_path(@resource), class: 'button' do
|
4
|
-
|
3
|
+
= link_to spina.edit_admin_resource_path(@resource), class: 'button button-default' do
|
4
|
+
.button-content
|
5
|
+
= icon('pencil')
|
6
|
+
= t('spina.resources.edit')
|
5
7
|
|
6
8
|
= link_to spina.new_admin_page_path(params: {resource_id: @resource.id, view_template: @resource.view_template.presence || 'show'}), class: 'button button-primary icon-only', style: 'margin-right: 0' do
|
7
9
|
= icon('plus')
|
10
|
+
= t('spina.pages.new')
|
8
11
|
|
9
12
|
.well
|
10
13
|
.dd#pages_list
|
@@ -1,6 +1,6 @@
|
|
1
1
|
%aside#notifications
|
2
2
|
- if flash[:notice]
|
3
|
-
.notification.animated.
|
3
|
+
.notification.animated.fadeInLeft
|
4
4
|
= icon('info')
|
5
5
|
.notification-message
|
6
6
|
= flash[:notice].html_safe
|
@@ -9,7 +9,7 @@
|
|
9
9
|
= icon('cross')
|
10
10
|
|
11
11
|
- if flash[:alert]
|
12
|
-
.notification.notification-danger.animated.
|
12
|
+
.notification.notification-danger.animated.fadeInLeft
|
13
13
|
= icon('exclamation')
|
14
14
|
.notification-message
|
15
15
|
= flash[:alert].html_safe
|
@@ -18,8 +18,8 @@
|
|
18
18
|
= icon('cross')
|
19
19
|
|
20
20
|
- if flash[:success]
|
21
|
-
.notification.notification-success.animated.
|
22
|
-
= icon('
|
21
|
+
.notification.notification-success.animated.fadeInLeft
|
22
|
+
= icon('check')
|
23
23
|
.notification-message
|
24
24
|
= flash[:success].html_safe
|
25
25
|
%small= flash[:success_small].try(:html_safe)
|
data/config/routes.rb
CHANGED
@@ -1,4 +1,17 @@
|
|
1
|
+
Rails.application.routes.draw do
|
2
|
+
if ActiveStorage.respond_to?(:resolve_model_to_route)
|
3
|
+
resolve("Spina::Parts::Image") { |image, options| route_for(ActiveStorage.resolve_model_to_route, image, options) }
|
4
|
+
resolve("Spina::Parts::ImageVariant") { |image, options| route_for(ActiveStorage.resolve_model_to_route, image, options) }
|
5
|
+
resolve("Spina::Parts::Attachment") { |attachment, options| route_for(ActiveStorage.resolve_model_to_route, attachment, options) }
|
6
|
+
else
|
7
|
+
resolve("Spina::Parts::Image") { |image, options| route_for(:rails_blob, image, options) }
|
8
|
+
resolve("Spina::Parts::ImageVariant") { |image, options| route_for(:rails_representation, image, options) }
|
9
|
+
resolve("Spina::Parts::Attachment") { |attachment, options| route_for(:rails_blob, attachment, options) }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
1
13
|
Spina::Engine.routes.draw do
|
14
|
+
|
2
15
|
# Backend
|
3
16
|
namespace :admin, path: Spina.config.backend_path do
|
4
17
|
root to: "pages#index"
|
@@ -1,28 +1,20 @@
|
|
1
1
|
%h1= current_page.title
|
2
|
+
= content :option
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
%h5 Content
|
7
|
-
!= content :text
|
8
|
-
|
9
|
-
%h5 Image
|
10
|
-
|
4
|
+
= content :headline
|
5
|
+
= content.text :headline
|
6
|
+
= content.html :body
|
11
7
|
- if has_content?(:image)
|
12
|
-
|
8
|
+
= content.image_tag :image, resize: '100x100'
|
13
9
|
|
14
|
-
|
10
|
+
= current_account.content :line
|
15
11
|
|
16
|
-
|
17
|
-
|
18
|
-
%li= image_tag image.variant(resize: '100x100')
|
12
|
+
- repeater current_account.content(:repeater) do |repeater_content|
|
13
|
+
= repeater_content.content :line
|
19
14
|
|
20
|
-
|
15
|
+
- images :image_collection do |image|
|
16
|
+
= content.image_tag image, resize: '50x50'
|
21
17
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
%h6 Title
|
26
|
-
%p= item.content(:title)
|
27
|
-
%h6 Description
|
28
|
-
!= item.content(:description)
|
18
|
+
- repeater :repeater do |project|
|
19
|
+
= project.content.html :line
|
20
|
+
= project.content.image_tag :image, resize: '50x50'
|
@@ -1,2 +1,2 @@
|
|
1
1
|
%h1= current_page.title
|
2
|
-
|
2
|
+
= content.html :body
|
@@ -1,5 +1,14 @@
|
|
1
|
-
Mobility.configure do
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
Mobility.configure do
|
2
|
+
plugins do
|
3
|
+
backend :table
|
4
|
+
active_record
|
5
|
+
reader
|
6
|
+
writer
|
7
|
+
backend_reader
|
8
|
+
query
|
9
|
+
cache
|
10
|
+
presence
|
11
|
+
fallbacks false # default to false, enable if passed fallbacks: true
|
12
|
+
default
|
13
|
+
end
|
5
14
|
end
|
@@ -11,6 +11,10 @@ Spina.configure do |config|
|
|
11
11
|
|
12
12
|
# Specify a backend path. Defaults to /admin.
|
13
13
|
# config.backend_path = 'admin'
|
14
|
+
|
15
|
+
# The parent controller all frontend Spina controllers inherit from
|
16
|
+
# Defaults to ApplicationController
|
17
|
+
# config.frontend_parent_controller = "ApplicationController"
|
14
18
|
|
15
19
|
# Pages Options
|
16
20
|
# ===============
|
@@ -3,22 +3,22 @@
|
|
3
3
|
theme.name = 'default'
|
4
4
|
theme.title = 'Default Theme'
|
5
5
|
|
6
|
-
theme.
|
7
|
-
name:
|
8
|
-
title:
|
9
|
-
|
6
|
+
theme.parts = [{
|
7
|
+
name: 'text',
|
8
|
+
title: "Text",
|
9
|
+
part_type: "Spina::Parts::Text"
|
10
10
|
}]
|
11
11
|
|
12
12
|
theme.view_templates = [{
|
13
13
|
name: 'homepage',
|
14
14
|
title: 'Homepage',
|
15
|
-
|
15
|
+
parts: ['text']
|
16
16
|
}, {
|
17
17
|
name: 'show',
|
18
18
|
title: 'Default',
|
19
19
|
description: 'A simple page',
|
20
20
|
usage: 'Use for your content',
|
21
|
-
|
21
|
+
parts: ['text']
|
22
22
|
}]
|
23
23
|
|
24
24
|
theme.custom_pages = [{
|
@@ -30,7 +30,7 @@
|
|
30
30
|
|
31
31
|
theme.navigations = [{
|
32
32
|
name: 'mobile',
|
33
|
-
label: 'Mobile'
|
33
|
+
label: 'Mobile'
|
34
34
|
}, {
|
35
35
|
name: 'main',
|
36
36
|
label: 'Main navigation',
|
@@ -3,69 +3,57 @@
|
|
3
3
|
theme.name = 'demo'
|
4
4
|
theme.title = 'Demo theme'
|
5
5
|
|
6
|
-
theme.
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
theme.layout_parts = ['line', 'body']
|
7
|
+
|
8
|
+
# New config
|
9
|
+
theme.parts = [{
|
10
|
+
name: 'repeater',
|
11
|
+
title: "Repeater",
|
12
|
+
part_type: "Spina::Parts::Repeater",
|
13
|
+
parts: ['line', 'image', 'headline', 'image_collection']
|
10
14
|
}, {
|
11
|
-
name:
|
12
|
-
title:
|
13
|
-
|
15
|
+
name: 'line',
|
16
|
+
title: "Line",
|
17
|
+
part_type: "Spina::Parts::Line"
|
14
18
|
}, {
|
15
|
-
name:
|
16
|
-
title:
|
17
|
-
|
19
|
+
name: 'body',
|
20
|
+
title: "Body",
|
21
|
+
part_type: "Spina::Parts::Text"
|
18
22
|
}, {
|
19
|
-
name:
|
20
|
-
title:
|
21
|
-
|
23
|
+
name: "image_collection",
|
24
|
+
title: "Image collection",
|
25
|
+
part_type: "Spina::Parts::ImageCollection"
|
22
26
|
}, {
|
23
|
-
name:
|
24
|
-
title:
|
25
|
-
|
27
|
+
name: 'image',
|
28
|
+
title: "Image",
|
29
|
+
part_type: "Spina::Parts::Image"
|
26
30
|
}, {
|
27
|
-
name:
|
28
|
-
title:
|
29
|
-
|
31
|
+
name: 'headline',
|
32
|
+
title: "Headline",
|
33
|
+
part_type: "Spina::Parts::Line"
|
30
34
|
}, {
|
31
|
-
name:
|
32
|
-
title:
|
33
|
-
|
34
|
-
}]
|
35
|
-
|
36
|
-
theme.structures = [{
|
37
|
-
name: 'structure',
|
38
|
-
structure_parts: [{
|
39
|
-
name: 'title',
|
40
|
-
title: 'Title',
|
41
|
-
partable_type: 'Spina::Line'
|
42
|
-
}, {
|
43
|
-
name: 'description',
|
44
|
-
title: 'Description',
|
45
|
-
partable_type: 'Spina::Text'
|
46
|
-
}]
|
47
|
-
}]
|
48
|
-
|
49
|
-
theme.layout_parts = [{
|
50
|
-
name: 'line',
|
51
|
-
title: 'Line',
|
52
|
-
partable_type: 'Spina::Line'
|
35
|
+
name: 'footer',
|
36
|
+
title: "Footer",
|
37
|
+
part_type: "Spina::Parts::Text"
|
53
38
|
}]
|
54
39
|
|
55
40
|
theme.view_templates = [{
|
56
41
|
name: 'homepage',
|
57
42
|
title: 'Homepage',
|
58
|
-
page_parts: [
|
43
|
+
page_parts: [],
|
44
|
+
parts: ['headline', 'body', 'image_collection']
|
59
45
|
}, {
|
60
46
|
name: 'show',
|
61
47
|
title: 'Default',
|
62
48
|
usage: 'Use for your content',
|
63
|
-
page_parts: [
|
49
|
+
page_parts: [],
|
50
|
+
parts: ['body', 'image', 'repeater']
|
64
51
|
}, {
|
65
52
|
name: 'demo',
|
66
53
|
title: 'Demo',
|
67
54
|
description: 'Contains examples of every page part',
|
68
|
-
page_parts: [
|
55
|
+
page_parts: [],
|
56
|
+
parts: ['body', 'image_collection', 'image', 'repeater']
|
69
57
|
}]
|
70
58
|
|
71
59
|
theme.custom_pages = [{
|
data/lib/spina.rb
CHANGED
@@ -2,24 +2,39 @@ require 'spina/engine'
|
|
2
2
|
require 'spina/railtie'
|
3
3
|
require 'spina/plugin'
|
4
4
|
require 'spina/theme'
|
5
|
+
require 'spina/attr_json_spina_parts_model'
|
5
6
|
|
6
7
|
module Spina
|
7
8
|
|
8
9
|
include ActiveSupport::Configurable
|
9
10
|
|
11
|
+
PARTS = []
|
10
12
|
PLUGINS = []
|
11
13
|
THEMES = []
|
12
14
|
|
13
|
-
config_accessor :backend_path,
|
15
|
+
config_accessor :backend_path,
|
16
|
+
:frontend_parent_controller,
|
17
|
+
:disable_frontend_routes,
|
18
|
+
:max_page_depth,
|
19
|
+
:locales,
|
20
|
+
:embedded_image_size
|
14
21
|
|
22
|
+
# Specify a backend path. Defaults to /admin.
|
15
23
|
self.backend_path = 'admin'
|
24
|
+
|
25
|
+
# The parent controller all frontend Spina controllers inherit from
|
26
|
+
# Default is ApplicationController
|
27
|
+
self.frontend_parent_controller = "ApplicationController"
|
16
28
|
|
17
29
|
self.disable_frontend_routes = false
|
18
30
|
|
19
|
-
self.storage = :file
|
20
|
-
|
21
31
|
self.max_page_depth = 5
|
22
32
|
|
23
33
|
self.locales = [I18n.default_locale]
|
24
34
|
|
35
|
+
# Images that are embedded in the Trix editor are resized to fit
|
36
|
+
# You can optimize this for your website and go for a smaller (or larger) size
|
37
|
+
# Default: 2000x2000px
|
38
|
+
self.embedded_image_size = "2000x2000>"
|
39
|
+
|
25
40
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'attr_json/type/polymorphic_model'
|
2
|
+
|
3
|
+
# Extending the PolymorphicModel to use the Spina::PARTS array as input
|
4
|
+
# as opposed to arguments
|
5
|
+
module AttrJson
|
6
|
+
module Type
|
7
|
+
class SpinaPartsModel < PolymorphicModel
|
8
|
+
|
9
|
+
def model_names
|
10
|
+
spina_parts_lookup.keys
|
11
|
+
end
|
12
|
+
|
13
|
+
def model_types
|
14
|
+
spina_parts_lookup.values
|
15
|
+
end
|
16
|
+
|
17
|
+
def spina_parts_lookup
|
18
|
+
@spina_parts_lookup ||= Spina::PARTS.map(&:to_type).map do |type|
|
19
|
+
[type.model.name, type]
|
20
|
+
end.to_h
|
21
|
+
end
|
22
|
+
|
23
|
+
def type_for_model_name(model_name)
|
24
|
+
spina_parts_lookup[model_name]
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|