solidus_static_content 1.0.0 → 2.0.0

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 (94) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +35 -0
  3. data/.gem_release.yml +5 -0
  4. data/.gitignore +17 -6
  5. data/.rspec +2 -3
  6. data/.rubocop.yml +2 -0
  7. data/CHANGELOG.md +80 -0
  8. data/Gemfile +26 -6
  9. data/{LICENSE.md → LICENSE} +0 -0
  10. data/README.md +81 -68
  11. data/Rakefile +4 -13
  12. data/app/assets/stylesheets/spree/frontend/solidus_static_content.css +7 -0
  13. data/app/assets/stylesheets/spree/frontend/spree_static_content.css +2 -7
  14. data/app/models/solidus_static_content/permission_sets/page_display.rb +11 -0
  15. data/app/models/solidus_static_content/permission_sets/page_management.rb +11 -0
  16. data/app/models/spree/page.rb +16 -21
  17. data/bin/console +17 -0
  18. data/bin/r +8 -0
  19. data/bin/rails +6 -6
  20. data/bin/rails-engine +13 -0
  21. data/bin/rails-sandbox +16 -0
  22. data/bin/rake +7 -0
  23. data/bin/sandbox +84 -0
  24. data/bin/sandbox_rails +8 -0
  25. data/bin/setup +8 -0
  26. data/config/locales/de.yml +7 -5
  27. data/config/locales/en.yml +9 -7
  28. data/config/locales/es-MX.yml +38 -0
  29. data/config/locales/es.yml +6 -5
  30. data/config/locales/et.yml +6 -5
  31. data/config/locales/fr.yml +7 -5
  32. data/config/locales/it.yml +6 -5
  33. data/config/locales/nl.yml +7 -5
  34. data/config/locales/pl.yml +6 -5
  35. data/config/locales/pt-BR.yml +6 -5
  36. data/config/locales/pt.yml +7 -5
  37. data/config/locales/ro.yml +11 -9
  38. data/config/locales/ru.yml +7 -5
  39. data/config/locales/sv.yml +7 -5
  40. data/config/routes.rb +9 -2
  41. data/db/migrate/20081216193152_create_pages.rb +1 -1
  42. data/db/migrate/20090625125735_extend_pages.rb +1 -1
  43. data/db/migrate/20090814113100_add_visible_to_pages.rb +1 -1
  44. data/db/migrate/20090814142845_add_default_true_to_visible_for_page.rb +1 -1
  45. data/db/migrate/20090829000527_add_index_for_page.rb +1 -1
  46. data/db/migrate/20091219021134_add_meta_fields_to_pages.rb +1 -1
  47. data/db/migrate/20100204105222_add_layout_to_pages.rb +1 -1
  48. data/db/migrate/20100323085528_add_show_in_sidebar_option_to_pages.rb +1 -1
  49. data/db/migrate/20110717103112_add_meta_title_to_page.rb +1 -1
  50. data/db/migrate/20120723144115_add_render_as_partial_for_layout_for_spree_pages.rb +1 -1
  51. data/db/migrate/20140926121757_add_pages_stores.rb +1 -1
  52. data/db/migrate/20180305193240_update_spree_page_position.rb +13 -0
  53. data/lib/controllers/backend/spree/admin/pages_controller.rb +16 -0
  54. data/{app/controllers → lib/controllers/frontend}/spree/static_content_controller.rb +7 -3
  55. data/lib/generators/solidus_static_content/install/install_generator.rb +7 -5
  56. data/lib/solidus_static_content.rb +6 -18
  57. data/lib/solidus_static_content/engine.rb +35 -0
  58. data/lib/solidus_static_content/factories.rb +18 -0
  59. data/lib/solidus_static_content/route_matcher.rb +11 -0
  60. data/lib/solidus_static_content/version.rb +5 -0
  61. data/lib/views/backend/spree/admin/pages/_form.html.erb +119 -0
  62. data/lib/views/backend/spree/admin/pages/edit.html.erb +32 -0
  63. data/lib/views/backend/spree/admin/pages/index.html.erb +68 -0
  64. data/lib/views/backend/spree/admin/pages/new.html.erb +31 -0
  65. data/lib/views/backend/spree/admin/shared/_pages_tabs.html.erb +9 -0
  66. data/{app/views → lib/views/frontend}/spree/static_content/_static_content_footer.html.erb +0 -0
  67. data/{app/views → lib/views/frontend}/spree/static_content/_static_content_header.html.erb +0 -0
  68. data/{app/views → lib/views/frontend}/spree/static_content/_static_content_list.html.erb +0 -0
  69. data/{app/views → lib/views/frontend}/spree/static_content/_static_content_sidebar.html.erb +1 -1
  70. data/lib/views/frontend/spree/static_content/show.html.erb +18 -0
  71. data/solidus_static_content.gemspec +36 -31
  72. data/spec/controllers/spree/admin/pages_controller_spec.rb +11 -0
  73. data/spec/controllers/{static_content_controller_spec.rb → spree/static_content_controller_spec.rb} +9 -12
  74. data/spec/features/{admin → spree/admin}/pages_spec.rb +8 -5
  75. data/spec/features/{static_content_spec.rb → spree/static_content_spec.rb} +6 -4
  76. data/spec/helpers/{page_helper_spec.rb → spree/page_helper_spec.rb} +0 -0
  77. data/spec/lib/solidus_static_content/engine_spec.rb +14 -0
  78. data/spec/lib/{spree_static.content_spec.rb → solidus_static_content/route_matcher_spec.rb} +4 -13
  79. data/spec/models/{page_spec.rb → spree/page_spec.rb} +22 -7
  80. data/spec/spec_helper.rb +17 -40
  81. metadata +85 -177
  82. data/.travis.yml +0 -21
  83. data/app/assets/javascripts/spree/backend/spree_static_content.js +0 -1
  84. data/app/assets/javascripts/spree/frontend/spree_static_content.js +0 -1
  85. data/app/assets/stylesheets/spree/backend/spree_static_content.css +0 -3
  86. data/app/controllers/spree/admin/pages_controller.rb +0 -3
  87. data/app/overrides/pages_in_menu.rb +0 -5
  88. data/app/views/spree/admin/pages/_form.html.erb +0 -98
  89. data/app/views/spree/admin/pages/edit.html.erb +0 -18
  90. data/app/views/spree/admin/pages/index.html.erb +0 -51
  91. data/app/views/spree/admin/pages/new.html.erb +0 -18
  92. data/app/views/spree/static_content/show.html.erb +0 -26
  93. data/lib/spree_static_content/engine.rb +0 -17
  94. data/spec/factories/page_factory.rb +0 -18
@@ -30,8 +30,9 @@ pt-BR:
30
30
  back_to_static_pages_list: "Voltar à lista de páginas estáticas"
31
31
  page: Página
32
32
  pages: Páginas
33
- static_content:
34
- editing_page: "Editando página"
35
- link: Link
36
- new_page: "Nova página"
37
- static_pages: "Páginas estáticas"
33
+ stores: Lojas
34
+ editing_page: "Editando página"
35
+ link: Link
36
+ new_page: "Nova página"
37
+ static_pages: "Páginas estáticas"
38
+ add_one: Crie um
@@ -30,8 +30,10 @@ pt:
30
30
  back_to_static_pages_list: "Voltar à lista de páginas estáticas"
31
31
  page: Página
32
32
  pages: Páginas
33
- static_content:
34
- editing_page: "Editar página"
35
- link: Link
36
- new_page: "Nova página"
37
- static_pages: "Páginas estáticas"
33
+ stores: Lojas
34
+ new_page: "Nova página"
35
+ editing_page: "Editar página"
36
+ link: Link
37
+ new_page: "Nova página"
38
+ static_pages: "Páginas estáticas"
39
+ add_one: Crie um
@@ -24,15 +24,17 @@ ro:
24
24
  spree:
25
25
  page: Pagină
26
26
  pages: Pagine
27
- static_content:
28
- static_pages: Pagini statice
29
- static_pages_desc: Descrierea paginilor statice
30
- new_page: Pagină nouă
31
- editing_page: Editarea paginii
32
- confirm_delete: Sunteți siguri că doriți să ștergeți această pagină?
33
- link: Link
34
- meta_title: Titlu meta
35
- page_navigation_title: Pagini
27
+ stores: Magazine
28
+ new_page: Pagină nouă
29
+ static_pages: Pagini statice
30
+ static_pages_desc: Descrierea paginilor statice
31
+ new_page: Pagină nouă
32
+ editing_page: Editarea paginii
33
+ confirm_delete: Sunteți siguri că doriți să ștergeți această pagină?
34
+ link: Link
35
+ meta_title: Titlu meta
36
+ page_navigation_title: Pagini
37
+ add_one: Creeaza una
36
38
  back_to_static_pages_list: Înapoi la lista de pagini
37
39
  admin:
38
40
  tab:
@@ -27,11 +27,13 @@ ru:
27
27
  spree:
28
28
  page: "Страница"
29
29
  pages: "Страницы"
30
- static_content:
31
- static_pages: "Статические страницы"
32
- new_page: "Новая страница"
33
- editing_page: "Редактирование страницы"
34
- link: "Ссылка"
30
+ stores: "магазины"
31
+ new_page: "Новая страница"
32
+ static_pages: "Статические страницы"
33
+ new_page: "Новая страница"
34
+ editing_page: "Редактирование страницы"
35
+ link: "Ссылка"
36
+ add_one: "Создай"
35
37
  back_to_static_pages_list: "Назад к списку страниц"
36
38
  admin:
37
39
  tab:
@@ -30,8 +30,10 @@ sv:
30
30
  back_to_static_pages_list: "Tillbaka till listan med sidor"
31
31
  page: Sida
32
32
  pages: Sidor
33
- static_content:
34
- editing_page: "Editera sidan"
35
- link: Länk
36
- new_page: "Ny sida"
37
- static_pages: "Statiska sidor"
33
+ stores: Butiker
34
+ new_page: "Ny sida"
35
+ editing_page: "Editera sidan"
36
+ link: Länk
37
+ new_page: "Ny sida"
38
+ static_pages: "Statiska sidor"
39
+ add_one: "Skapa en"
@@ -1,8 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Spree::Core::Engine.routes.draw do
2
4
  namespace :admin do
3
- resources :pages
5
+ resources :pages do
6
+ collection do
7
+ post :update_positions
8
+ end
9
+ end
4
10
  end
5
- constraints(Spree::StaticPage) do
11
+
12
+ constraints(SolidusStaticContent::RouteMatcher) do
6
13
  get '/(*path)', :to => 'static_content#show', :as => 'static'
7
14
  end
8
15
  end
@@ -1,4 +1,4 @@
1
- class CreatePages < ActiveRecord::Migration
1
+ class CreatePages < SolidusSupport::Migration[4.2]
2
2
  def self.up
3
3
  create_table :spree_pages do |t|
4
4
  t.string :title
@@ -1,4 +1,4 @@
1
- class ExtendPages < ActiveRecord::Migration
1
+ class ExtendPages < SolidusSupport::Migration[4.2]
2
2
  class Page < ActiveRecord::Base
3
3
  end
4
4
 
@@ -1,4 +1,4 @@
1
- class AddVisibleToPages < ActiveRecord::Migration
1
+ class AddVisibleToPages < SolidusSupport::Migration[4.2]
2
2
  class Page < ActiveRecord::Base
3
3
  end
4
4
 
@@ -1,4 +1,4 @@
1
- class AddDefaultTrueToVisibleForPage < ActiveRecord::Migration
1
+ class AddDefaultTrueToVisibleForPage < SolidusSupport::Migration[4.2]
2
2
  def self.up
3
3
  change_column :spree_pages, :visible, :boolean, :default=> true
4
4
  end
@@ -1,4 +1,4 @@
1
- class AddIndexForPage < ActiveRecord::Migration
1
+ class AddIndexForPage < SolidusSupport::Migration[4.2]
2
2
  def self.up
3
3
  add_index(:spree_pages, :slug)
4
4
  end
@@ -1,4 +1,4 @@
1
- class AddMetaFieldsToPages < ActiveRecord::Migration
1
+ class AddMetaFieldsToPages < SolidusSupport::Migration[4.2]
2
2
  def self.up
3
3
  add_column :spree_pages, :meta_keywords, :string
4
4
  add_column :spree_pages, :meta_description, :string
@@ -1,4 +1,4 @@
1
- class AddLayoutToPages < ActiveRecord::Migration
1
+ class AddLayoutToPages < SolidusSupport::Migration[4.2]
2
2
  def self.up
3
3
  add_column :spree_pages, :layout, :string
4
4
  end
@@ -1,4 +1,4 @@
1
- class AddShowInSidebarOptionToPages < ActiveRecord::Migration
1
+ class AddShowInSidebarOptionToPages < SolidusSupport::Migration[4.2]
2
2
  def self.up
3
3
  add_column :spree_pages, :show_in_sidebar, :boolean, :default=> false, :null=>false
4
4
  end
@@ -1,4 +1,4 @@
1
- class AddMetaTitleToPage < ActiveRecord::Migration
1
+ class AddMetaTitleToPage < SolidusSupport::Migration[4.2]
2
2
  def self.up
3
3
  add_column :spree_pages, :meta_title, :string
4
4
  end
@@ -1,4 +1,4 @@
1
- class AddRenderAsPartialForLayoutForSpreePages < ActiveRecord::Migration
1
+ class AddRenderAsPartialForLayoutForSpreePages < SolidusSupport::Migration[4.2]
2
2
  def up
3
3
  unless column_exists? :spree_pages, :render_layout_as_partial
4
4
  add_column :spree_pages, :render_layout_as_partial, :boolean, :default => false
@@ -1,4 +1,4 @@
1
- class AddPagesStores < ActiveRecord::Migration
1
+ class AddPagesStores < SolidusSupport::Migration[4.2]
2
2
 
3
3
  def change
4
4
  create_table :spree_pages_stores, :id => false do |t|
@@ -0,0 +1,13 @@
1
+ class UpdateSpreePagePosition < SolidusSupport::Migration[4.2]
2
+ def up
3
+ if column_exists?(:spree_pages, :position)
4
+ change_column :spree_pages, :position, :integer, default: 0
5
+ end
6
+ end
7
+
8
+ def down
9
+ if column_exists?(:spree_pages, :position)
10
+ change_column :spree_pages, :position, :boolean, default: false
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ class Spree::Admin::PagesController < Spree::Admin::ResourceController
2
+ private
3
+
4
+ # Set some default attributes
5
+ def build_resource
6
+ super.tap do |resource|
7
+ if resource.stores.blank?
8
+ resource.stores << Spree::Store.default
9
+ end
10
+ end
11
+ end
12
+
13
+ def collection
14
+ super.ordered_by_position
15
+ end
16
+ end
@@ -1,11 +1,15 @@
1
1
  class Spree::StaticContentController < Spree::StoreController
2
- rescue_from ActiveRecord::RecordNotFound, :with => :render_404
3
-
4
2
  helper 'spree/products'
5
3
  layout :determine_layout
6
4
 
7
5
  def show
8
- @page = Spree::Page.by_store(current_store).visible.find_by_slug!(request.path)
6
+ @page = Spree::Page.by_store(current_store).visible.find_by_slug!(request.path_info)
7
+
8
+ # Assign static_content to let solidus recognize it as the current
9
+ # controller resource, this is used by meta tags and in other places.
10
+ @static_content = @page
11
+
12
+ @taxonomies = Spree::Taxonomy.includes(root: :children)
9
13
  end
10
14
 
11
15
  private
@@ -1,22 +1,24 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SolidusStaticContent
2
4
  module Generators
3
5
  class InstallGenerator < Rails::Generators::Base
4
6
  class_option :auto_run_migrations, type: :boolean, default: false
5
7
 
6
8
  def add_stylesheets
7
- inject_into_file 'vendor/assets/stylesheets/spree/frontend/all.css', " *= require spree/frontend/spree_static_content\n", before: /\*\//, verbose: true
9
+ inject_into_file 'vendor/assets/stylesheets/spree/frontend/all.css', " *= require spree/frontend/solidus_static_content\n", before: %r{\*/}, verbose: true # rubocop:disable Metrics/LineLength
8
10
  end
9
11
 
10
12
  def add_migrations
11
- run 'bundle exec rake railties:install:migrations FROM=solidus_static_content'
13
+ run 'bin/rails railties:install:migrations FROM=solidus_static_content'
12
14
  end
13
15
 
14
16
  def run_migrations
15
- run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]')
17
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask('Would you like to run the migrations now? [Y/n]')) # rubocop:disable Metrics/LineLength
16
18
  if run_migrations
17
- run 'bundle exec rake db:migrate'
19
+ run 'bin/rails db:migrate'
18
20
  else
19
- puts 'Skipping rake db:migrate, don\'t forget to run it!'
21
+ puts 'Skipping bin/rails db:migrate, don\'t forget to run it!' # rubocop:disable Rails/Output
20
22
  end
21
23
  end
22
24
  end
@@ -1,21 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'solidus_core'
2
- require 'solidus_frontend'
3
- require 'solidus_backend'
4
+ require 'solidus_support'
4
5
  require 'deface'
5
- require 'spree_static_content/engine'
6
- require 'coffee_script'
7
- require 'sass/rails'
8
-
9
- module StaticPage
10
- def self.remove_spree_mount_point(path)
11
- regex = Regexp.new '\A' + Rails.application.routes.url_helpers.spree_path
12
- path.sub( regex, '').split('?')[0]
13
- end
14
- end
15
6
 
16
- class Spree::StaticPage
17
- def self.matches?(request)
18
- return false if request.path =~ /(^\/+(admin|account|cart|checkout|content|login|pg\/|orders|products|s\/|session|signup|shipments|states|t\/|tax_categories|user)+)/
19
- !Spree::Page.visible.find_by_slug(request.path).nil?
20
- end
21
- end
7
+ require 'solidus_static_content/version'
8
+ require 'solidus_static_content/route_matcher'
9
+ require 'solidus_static_content/engine'
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spree/core'
4
+ require 'solidus_static_content'
5
+
6
+ module SolidusStaticContent
7
+ class Engine < Rails::Engine
8
+ include SolidusSupport::EngineExtensions
9
+
10
+ isolate_namespace ::Spree
11
+
12
+ engine_name 'solidus_static_content'
13
+
14
+ # use rspec for tests
15
+ config.generators do |g|
16
+ g.test_framework :rspec
17
+ end
18
+
19
+ def self.menu_item
20
+ @menu_item ||= Spree::Backend::Config.class::MenuItem.new(
21
+ [:pages],
22
+ 'file-text',
23
+ condition: -> { can?(:admin, Spree::Page) },
24
+ )
25
+ end
26
+
27
+ def self.activate_menu_items
28
+ return if Spree::Backend::Config.menu_items.include?(menu_item)
29
+
30
+ Spree::Backend::Config.menu_items << menu_item
31
+ end
32
+
33
+ config.to_prepare(&method(:activate_menu_items))
34
+ end
35
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :page, class: Spree::Page do
5
+ sequence(:title) { |n| "Page #{n}" }
6
+ body { 'This is the body of the page' }
7
+
8
+ sequence(:slug) { |n| "/page#{n}" }
9
+
10
+ trait :with_foreign_link do
11
+ foreign_link do
12
+ "http://example.com"
13
+ end
14
+ end
15
+
16
+ stores { [build(:store)] }
17
+ end
18
+ end
@@ -0,0 +1,11 @@
1
+ module SolidusStaticContent::RouteMatcher
2
+ EXCLUDED_PATHS = /^\/+(admin|account|cart|checkout|content|login|pg\/|orders|products|s\/|session|signup|shipments|states|t\/|tax_categories|user)+/
3
+
4
+ def self.matches?(request)
5
+ path = request.path_info
6
+
7
+ return false if EXCLUDED_PATHS.match? path
8
+
9
+ Spree::Page.visible.where(slug: path).exists?
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusStaticContent
4
+ VERSION = '2.0.0'
5
+ end
@@ -0,0 +1,119 @@
1
+ <div data-hook='admin_page_form_fields'>
2
+ <div class='row'>
3
+ <div class='col-12'>
4
+ <%= f.field_container :title do %>
5
+ <%= f.label :title, class: 'required' %>
6
+ <%= f.text_field :title, required: true, class: 'fullwidth title' %>
7
+ <%= f.error_message_on :title %>
8
+ <% end %>
9
+ </div>
10
+
11
+ <div class='col-12'>
12
+ <%= f.field_container :slug do %>
13
+ <%= f.label :slug, class: 'required' %>
14
+ <%= f.text_field :slug, required: true, class: 'fullwidth title' %>
15
+ <%= f.error_message_on :slug %>
16
+ <% end %>
17
+ </div>
18
+
19
+ <div class='col-12'>
20
+ <%= f.field_container :body do %>
21
+ <%= f.label :body, class: 'required' %>
22
+ <%= f.text_area :body, class: 'fullwidth', rows: 12 %>
23
+ <%= f.error_message_on :body %>
24
+ <% end %>
25
+ </div>
26
+ </div>
27
+
28
+ <div class='row'>
29
+ <div class='col-6'>
30
+ <%= f.field_container :layout do %>
31
+ <%= f.label :layout %>
32
+ <%= f.text_field :layout, class: 'fullwidth title' %>
33
+ <% end %>
34
+ </div>
35
+
36
+ <div class='col-6'>
37
+ <%= f.field_container :foreign_link do %>
38
+ <%= f.label :foreign_link %>
39
+ <%= f.text_field :foreign_link, class: 'fullwidth title' %>
40
+ <% end %>
41
+ </div>
42
+ </div>
43
+
44
+ <div class='row'>
45
+ <div class='col-2'>
46
+ <%= f.field_container :show_in_sidebar do %>
47
+ <%= f.check_box :show_in_sidebar %>
48
+ <%= f.label :show_in_sidebar %>
49
+ <% end %>
50
+ </div>
51
+
52
+ <div class='col-2'>
53
+ <%= f.field_container :show_in_header do %>
54
+ <%= f.check_box :show_in_header %>
55
+ <%= f.label :show_in_header %>
56
+ <% end %>
57
+ </div>
58
+
59
+ <div class='col-2'>
60
+ <%= f.field_container :show_in_footer do %>
61
+ <%= f.check_box :show_in_footer %>
62
+ <%= f.label :show_in_footer %>
63
+ <% end %>
64
+ </div>
65
+
66
+ <div class='col-2'>
67
+ <%= f.field_container :visible do %>
68
+ <%= f.check_box :visible %>
69
+ <%= f.label :visible %>
70
+ <% end %>
71
+ </div>
72
+
73
+ <div class='col-2'>
74
+ <%= f.field_container :render_layout_as_partial do %>
75
+ <%= f.check_box :render_layout_as_partial %>
76
+ <%= f.label :render_layout_as_partial %>
77
+ <% end %>
78
+ </div>
79
+ </div>
80
+
81
+ <div class='row'>
82
+ <div class='col-2'>
83
+ <%= f.field_container :stores do %>
84
+ <%= f.label :stores, t("spree.stores") %>
85
+ <br>
86
+ <% Spree::Store.all.each do |store| %>
87
+ <%= check_box_tag 'page[store_ids][]', store.id, @page.stores.include?(store) %>
88
+ <%= label_tag store.name %>
89
+ <% end %>
90
+ <% end %>
91
+ </div>
92
+ </div>
93
+
94
+ <div class='row'>
95
+ <div class='col-12'>
96
+ <%= f.field_container :meta_title do %>
97
+ <%= f.label :meta_title %>
98
+ <%= f.text_field :meta_title, class: 'fullwidth title' %>
99
+ <%= f.error_message_on :meta_title %>
100
+ <% end %>
101
+ </div>
102
+
103
+ <div class='col-12'>
104
+ <%= f.field_container :meta_keywords do %>
105
+ <%= f.label :meta_keywords %>
106
+ <%= f.text_field :meta_keywords, class: 'fullwidth title' %>
107
+ <%= f.error_message_on :meta_keywords %>
108
+ <% end %>
109
+ </div>
110
+
111
+ <div class='col-12'>
112
+ <%= f.field_container :meta_description do %>
113
+ <%= f.label :meta_description %>
114
+ <%= f.text_field :meta_description, class: 'fullwidth title' %>
115
+ <%= f.error_message_on :meta_description %>
116
+ <% end %>
117
+ </div>
118
+ </div>
119
+ </div>