spree_page_builder 5.3.0.rc1

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 (219) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +43 -0
  3. data/Rakefile +18 -0
  4. data/app/controllers/concerns/spree/admin/page_builder_concern.rb +45 -0
  5. data/app/controllers/concerns/spree/admin/storefront_breadcrumb_concern.rb +12 -0
  6. data/app/controllers/spree/admin/page_blocks_controller.rb +58 -0
  7. data/app/controllers/spree/admin/page_links_controller.rb +60 -0
  8. data/app/controllers/spree/admin/page_sections_controller.rb +82 -0
  9. data/app/controllers/spree/admin/pages_controller.rb +39 -0
  10. data/app/controllers/spree/admin/storefront_controller.rb +41 -0
  11. data/app/controllers/spree/admin/themes_controller.rb +87 -0
  12. data/app/helpers/spree/admin/page_builder_helper.rb +125 -0
  13. data/app/helpers/spree/admin/themes_helper.rb +9 -0
  14. data/app/jobs/spree/page_builder/products/touch_taxons_job_decorator.rb +15 -0
  15. data/app/jobs/spree/themes/duplicate_components_job.rb +59 -0
  16. data/app/jobs/spree/themes/screenshot_job.rb +81 -0
  17. data/app/models/concerns/spree/has_page_links.rb +53 -0
  18. data/app/models/spree/page.rb +188 -0
  19. data/app/models/spree/page_block.rb +73 -0
  20. data/app/models/spree/page_blocks/buttons.rb +29 -0
  21. data/app/models/spree/page_blocks/heading.rb +18 -0
  22. data/app/models/spree/page_blocks/image.rb +20 -0
  23. data/app/models/spree/page_blocks/link.rb +21 -0
  24. data/app/models/spree/page_blocks/mega_nav.rb +33 -0
  25. data/app/models/spree/page_blocks/mega_nav_with_subcategories.rb +32 -0
  26. data/app/models/spree/page_blocks/metafields.rb +18 -0
  27. data/app/models/spree/page_blocks/nav.rb +15 -0
  28. data/app/models/spree/page_blocks/newsletter_form.rb +18 -0
  29. data/app/models/spree/page_blocks/products/brand.rb +15 -0
  30. data/app/models/spree/page_blocks/products/buy_buttons.rb +24 -0
  31. data/app/models/spree/page_blocks/products/description.rb +18 -0
  32. data/app/models/spree/page_blocks/products/price.rb +18 -0
  33. data/app/models/spree/page_blocks/products/quantity_selector.rb +20 -0
  34. data/app/models/spree/page_blocks/products/share.rb +8 -0
  35. data/app/models/spree/page_blocks/products/title.rb +19 -0
  36. data/app/models/spree/page_blocks/products/variant_picker.rb +13 -0
  37. data/app/models/spree/page_blocks/subheading.rb +17 -0
  38. data/app/models/spree/page_blocks/text.rb +16 -0
  39. data/app/models/spree/page_builder/policy_decorator.rb +17 -0
  40. data/app/models/spree/page_builder/post_decorator.rb +17 -0
  41. data/app/models/spree/page_builder/product_decorator.rb +17 -0
  42. data/app/models/spree/page_builder/store_decorator.rb +46 -0
  43. data/app/models/spree/page_builder/taxon_decorator.rb +45 -0
  44. data/app/models/spree/page_link.rb +60 -0
  45. data/app/models/spree/page_section.rb +222 -0
  46. data/app/models/spree/page_sections/announcement_bar.rb +28 -0
  47. data/app/models/spree/page_sections/breadcrumbs.rb +12 -0
  48. data/app/models/spree/page_sections/collection_banner.rb +18 -0
  49. data/app/models/spree/page_sections/custom_code.rb +11 -0
  50. data/app/models/spree/page_sections/featured_posts.rb +45 -0
  51. data/app/models/spree/page_sections/featured_product.rb +50 -0
  52. data/app/models/spree/page_sections/featured_taxon.rb +90 -0
  53. data/app/models/spree/page_sections/featured_taxons.rb +45 -0
  54. data/app/models/spree/page_sections/footer.rb +101 -0
  55. data/app/models/spree/page_sections/header.rb +62 -0
  56. data/app/models/spree/page_sections/image_banner.rb +55 -0
  57. data/app/models/spree/page_sections/image_with_text.rb +65 -0
  58. data/app/models/spree/page_sections/main_password_footer.rb +18 -0
  59. data/app/models/spree/page_sections/main_password_header.rb +20 -0
  60. data/app/models/spree/page_sections/newsletter.rb +54 -0
  61. data/app/models/spree/page_sections/page_title.rb +19 -0
  62. data/app/models/spree/page_sections/post_details.rb +19 -0
  63. data/app/models/spree/page_sections/post_grid.rb +19 -0
  64. data/app/models/spree/page_sections/product_details.rb +53 -0
  65. data/app/models/spree/page_sections/product_grid.rb +13 -0
  66. data/app/models/spree/page_sections/related_products.rb +58 -0
  67. data/app/models/spree/page_sections/rich_text.rb +31 -0
  68. data/app/models/spree/page_sections/taxon_banner.rb +18 -0
  69. data/app/models/spree/page_sections/taxon_grid.rb +17 -0
  70. data/app/models/spree/page_sections/video.rb +107 -0
  71. data/app/models/spree/pages/account.rb +19 -0
  72. data/app/models/spree/pages/cart.rb +19 -0
  73. data/app/models/spree/pages/checkout.rb +15 -0
  74. data/app/models/spree/pages/custom.rb +38 -0
  75. data/app/models/spree/pages/homepage.rb +72 -0
  76. data/app/models/spree/pages/login.rb +19 -0
  77. data/app/models/spree/pages/password.rb +59 -0
  78. data/app/models/spree/pages/post.rb +27 -0
  79. data/app/models/spree/pages/post_list.rb +36 -0
  80. data/app/models/spree/pages/product_details.rb +30 -0
  81. data/app/models/spree/pages/search_results.rb +43 -0
  82. data/app/models/spree/pages/shop_all.rb +40 -0
  83. data/app/models/spree/pages/taxon.rb +29 -0
  84. data/app/models/spree/pages/taxon_list.rb +41 -0
  85. data/app/models/spree/pages/wishlist.rb +15 -0
  86. data/app/models/spree/theme.rb +233 -0
  87. data/app/models/spree/themes/default.rb +97 -0
  88. data/app/services/spree/taxons/touch_featured_sections.rb +21 -0
  89. data/app/views/layouts/spree/page_builder.html.erb +46 -0
  90. data/app/views/spree/admin/dashboard/_store_preview.html.erb +38 -0
  91. data/app/views/spree/admin/page_blocks/_form_tab_buttons.html.erb +5 -0
  92. data/app/views/spree/admin/page_blocks/create.turbo_stream.erb +4 -0
  93. data/app/views/spree/admin/page_blocks/destroy.turbo_stream.erb +9 -0
  94. data/app/views/spree/admin/page_blocks/edit.html.erb +43 -0
  95. data/app/views/spree/admin/page_blocks/forms/_brand.html.erb +15 -0
  96. data/app/views/spree/admin/page_blocks/forms/_brand_logo.html.erb +4 -0
  97. data/app/views/spree/admin/page_blocks/forms/_buttons.html.erb +13 -0
  98. data/app/views/spree/admin/page_blocks/forms/_heading.html.erb +28 -0
  99. data/app/views/spree/admin/page_blocks/forms/_image.html.erb +10 -0
  100. data/app/views/spree/admin/page_blocks/forms/_link.html.erb +19 -0
  101. data/app/views/spree/admin/page_blocks/forms/_mega_nav.html.erb +14 -0
  102. data/app/views/spree/admin/page_blocks/forms/_mega_nav_with_subcategories.html.erb +9 -0
  103. data/app/views/spree/admin/page_blocks/forms/_metafields.html.erb +35 -0
  104. data/app/views/spree/admin/page_blocks/forms/_nav.html.erb +6 -0
  105. data/app/views/spree/admin/page_blocks/forms/_newsletter_form.html.erb +20 -0
  106. data/app/views/spree/admin/page_blocks/forms/_price.html.erb +15 -0
  107. data/app/views/spree/admin/page_blocks/forms/_share.html.erb +5 -0
  108. data/app/views/spree/admin/page_blocks/forms/_subheading.html.erb +26 -0
  109. data/app/views/spree/admin/page_blocks/forms/_text.html.erb +21 -0
  110. data/app/views/spree/admin/page_blocks/forms/_title.html.erb +20 -0
  111. data/app/views/spree/admin/page_blocks/forms/_variant_picker.html.erb +10 -0
  112. data/app/views/spree/admin/page_blocks/forms/products/_buy_buttons.html.erb +10 -0
  113. data/app/views/spree/admin/page_blocks/forms/products/_description.html.erb +0 -0
  114. data/app/views/spree/admin/page_blocks/forms/products/_quantity_selector.html.erb +10 -0
  115. data/app/views/spree/admin/page_blocks/move_higher.turbo_stream.erb +4 -0
  116. data/app/views/spree/admin/page_blocks/move_lower.turbo_stream.erb +4 -0
  117. data/app/views/spree/admin/page_blocks/show.html.erb +1 -0
  118. data/app/views/spree/admin/page_blocks/update.turbo_stream.erb +6 -0
  119. data/app/views/spree/admin/page_builder/_add_block.html.erb +22 -0
  120. data/app/views/spree/admin/page_builder/_color_palette.html.erb +17 -0
  121. data/app/views/spree/admin/page_builder/_color_picker.html.erb +26 -0
  122. data/app/views/spree/admin/page_builder/_header.html.erb +113 -0
  123. data/app/views/spree/admin/page_builder/_labeled_range_input.html.erb +10 -0
  124. data/app/views/spree/admin/page_builder/_pages_dropdown.html.erb +17 -0
  125. data/app/views/spree/admin/page_builder/_range_input.html.erb +12 -0
  126. data/app/views/spree/admin/page_builder/_sidebar.html.erb +12 -0
  127. data/app/views/spree/admin/page_builder/_sidebar_block.html.erb +30 -0
  128. data/app/views/spree/admin/page_builder/_sidebar_colors.html.erb +86 -0
  129. data/app/views/spree/admin/page_builder/_sidebar_fonts.html.erb +85 -0
  130. data/app/views/spree/admin/page_builder/_sidebar_section.html.erb +44 -0
  131. data/app/views/spree/admin/page_builder/_sidebar_sections.html.erb +38 -0
  132. data/app/views/spree/admin/page_builder/_sidebar_sections_toolbar.html.erb +180 -0
  133. data/app/views/spree/admin/page_links/_form.html.erb +10 -0
  134. data/app/views/spree/admin/page_links/_linkable_type_dropdown.html.erb +15 -0
  135. data/app/views/spree/admin/page_links/_list.html.erb +36 -0
  136. data/app/views/spree/admin/page_links/_refresh_theme_preview.turbo_stream.erb +5 -0
  137. data/app/views/spree/admin/page_links/create.turbo_stream.erb +10 -0
  138. data/app/views/spree/admin/page_links/destroy.turbo_stream.erb +15 -0
  139. data/app/views/spree/admin/page_links/edit.html.erb +27 -0
  140. data/app/views/spree/admin/page_links/update.turbo_stream.erb +14 -0
  141. data/app/views/spree/admin/page_sections/_form_tab_buttons.html.erb +8 -0
  142. data/app/views/spree/admin/page_sections/create.turbo_stream.erb +11 -0
  143. data/app/views/spree/admin/page_sections/destroy.turbo_stream.erb +16 -0
  144. data/app/views/spree/admin/page_sections/edit.html.erb +39 -0
  145. data/app/views/spree/admin/page_sections/fields/_background_color.html.erb +6 -0
  146. data/app/views/spree/admin/page_sections/fields/_border_bottom_width.html.erb +5 -0
  147. data/app/views/spree/admin/page_sections/fields/_border_color.html.erb +7 -0
  148. data/app/views/spree/admin/page_sections/fields/_border_top_width.html.erb +6 -0
  149. data/app/views/spree/admin/page_sections/fields/_bottom_padding.html.erb +5 -0
  150. data/app/views/spree/admin/page_sections/fields/_button.html.erb +15 -0
  151. data/app/views/spree/admin/page_sections/fields/_header_layout.html.erb +26 -0
  152. data/app/views/spree/admin/page_sections/fields/_height.html.erb +6 -0
  153. data/app/views/spree/admin/page_sections/fields/_text_color.html.erb +7 -0
  154. data/app/views/spree/admin/page_sections/fields/_top_padding.html.erb +6 -0
  155. data/app/views/spree/admin/page_sections/forms/_announcement_bar.html.erb +5 -0
  156. data/app/views/spree/admin/page_sections/forms/_brand_story.html.erb +0 -0
  157. data/app/views/spree/admin/page_sections/forms/_breadcrumbs.html.erb +0 -0
  158. data/app/views/spree/admin/page_sections/forms/_collection_banner.html.erb +0 -0
  159. data/app/views/spree/admin/page_sections/forms/_custom_code.html.erb +4 -0
  160. data/app/views/spree/admin/page_sections/forms/_featured_posts.html.erb +33 -0
  161. data/app/views/spree/admin/page_sections/forms/_featured_product.html.erb +4 -0
  162. data/app/views/spree/admin/page_sections/forms/_featured_taxon.html.erb +59 -0
  163. data/app/views/spree/admin/page_sections/forms/_featured_taxons.html.erb +13 -0
  164. data/app/views/spree/admin/page_sections/forms/_footer.html.erb +20 -0
  165. data/app/views/spree/admin/page_sections/forms/_header.html.erb +12 -0
  166. data/app/views/spree/admin/page_sections/forms/_image_banner.html.erb +13 -0
  167. data/app/views/spree/admin/page_sections/forms/_image_with_text.html.erb +28 -0
  168. data/app/views/spree/admin/page_sections/forms/_main_password_footer.html.erb +9 -0
  169. data/app/views/spree/admin/page_sections/forms/_main_password_header.erb +13 -0
  170. data/app/views/spree/admin/page_sections/forms/_newsletter.html.erb +15 -0
  171. data/app/views/spree/admin/page_sections/forms/_page_title.html.erb +4 -0
  172. data/app/views/spree/admin/page_sections/forms/_post_details.html.erb +0 -0
  173. data/app/views/spree/admin/page_sections/forms/_post_grid.html.erb +0 -0
  174. data/app/views/spree/admin/page_sections/forms/_product_details.html.erb +1 -0
  175. data/app/views/spree/admin/page_sections/forms/_product_grid.html.erb +1 -0
  176. data/app/views/spree/admin/page_sections/forms/_related_products.html.erb +32 -0
  177. data/app/views/spree/admin/page_sections/forms/_rich_text.html.erb +0 -0
  178. data/app/views/spree/admin/page_sections/forms/_taxon_banner.html.erb +0 -0
  179. data/app/views/spree/admin/page_sections/forms/_taxon_grid.html.erb +5 -0
  180. data/app/views/spree/admin/page_sections/forms/_video.html.erb +15 -0
  181. data/app/views/spree/admin/page_sections/move_higher.turbo_stream.erb +7 -0
  182. data/app/views/spree/admin/page_sections/move_lower.turbo_stream.erb +7 -0
  183. data/app/views/spree/admin/page_sections/new.html.erb +26 -0
  184. data/app/views/spree/admin/page_sections/remove_attachment.turbo_stream.erb +4 -0
  185. data/app/views/spree/admin/page_sections/restore_design_settings_to_defaults.turbo_stream.erb +4 -0
  186. data/app/views/spree/admin/page_sections/show.html.erb +1 -0
  187. data/app/views/spree/admin/page_sections/update.turbo_stream.erb +10 -0
  188. data/app/views/spree/admin/pages/_form.html.erb +20 -0
  189. data/app/views/spree/admin/pages/_table_header.html.erb +6 -0
  190. data/app/views/spree/admin/pages/_table_row.html.erb +28 -0
  191. data/app/views/spree/admin/pages/edit.html.erb +13 -0
  192. data/app/views/spree/admin/pages/filters.html.erb +7 -0
  193. data/app/views/spree/admin/pages/index.html.erb +11 -0
  194. data/app/views/spree/admin/pages/new.html.erb +1 -0
  195. data/app/views/spree/admin/storefront/edit.html.erb +89 -0
  196. data/app/views/spree/admin/themes/_theme.html.erb +56 -0
  197. data/app/views/spree/admin/themes/_theme_preview_image.html.erb +17 -0
  198. data/app/views/spree/admin/themes/edit.html.erb +14 -0
  199. data/app/views/spree/admin/themes/index.html.erb +80 -0
  200. data/app/views/spree/admin/themes/update.turbo_stream.erb +1 -0
  201. data/config/initializers/spree_admin_navigation.rb +46 -0
  202. data/config/initializers/spree_admin_partials.rb +3 -0
  203. data/config/locales/en.yml +42 -0
  204. data/config/routes.rb +43 -0
  205. data/db/migrate/20250120094216_create_page_builder_models.rb +78 -0
  206. data/db/migrate/20250305121352_remove_page_builder_indices.rb +11 -0
  207. data/db/migrate/20250825175217_add_missing_page_builder_indexes.rb +7 -0
  208. data/db/migrate/20250913130044_add_page_links_counter_cache_to_spree_stores.rb +10 -0
  209. data/lib/generators/spree/page_builder/install/install_generator.rb +23 -0
  210. data/lib/spree/page_builder/engine.rb +185 -0
  211. data/lib/spree/page_builder/testing_support/factories/page_block_factory.rb +22 -0
  212. data/lib/spree/page_builder/testing_support/factories/page_factory.rb +33 -0
  213. data/lib/spree/page_builder/testing_support/factories/page_link_factory.rb +7 -0
  214. data/lib/spree/page_builder/testing_support/factories/page_section_factory.rb +27 -0
  215. data/lib/spree/page_builder/testing_support/factories/theme_factory.rb +14 -0
  216. data/lib/spree/page_builder/testing_support/factories.rb +3 -0
  217. data/lib/spree/page_builder.rb +4 -0
  218. data/lib/spree_page_builder.rb +1 -0
  219. metadata +288 -0
@@ -0,0 +1,185 @@
1
+ module Spree
2
+ module PageBuilder
3
+ class Engine < ::Rails::Engine
4
+ isolate_namespace Spree
5
+ engine_name 'spree_page_builder'
6
+
7
+ # Add page builder fields to the core Environment struct
8
+ initializer 'spree.page_builder.environment', before: :load_config_initializers do |app|
9
+ # These will be initialized in after_initialize
10
+ end
11
+
12
+ config.after_initialize do
13
+ Rails.application.config.spree.themes = [
14
+ Spree::Themes::Default
15
+ ]
16
+
17
+ Rails.application.config.spree.theme_layout_sections = [
18
+ Spree::PageSections::AnnouncementBar,
19
+ Spree::PageSections::Header,
20
+ Spree::PageSections::Newsletter,
21
+ Spree::PageSections::Footer
22
+ ]
23
+
24
+ Rails.application.config.spree.pages = [
25
+ Spree::Pages::Cart,
26
+ Spree::Pages::Post,
27
+ Spree::Pages::TaxonList,
28
+ Spree::Pages::Custom,
29
+ Spree::Pages::ProductDetails,
30
+ Spree::Pages::ShopAll,
31
+ Spree::Pages::Taxon,
32
+ Spree::Pages::Wishlist,
33
+ Spree::Pages::SearchResults,
34
+ Spree::Pages::Checkout,
35
+ Spree::Pages::Password,
36
+ Spree::Pages::Homepage,
37
+ Spree::Pages::Login,
38
+ Spree::Pages::PostList,
39
+ Spree::Pages::Account
40
+ ]
41
+
42
+ Rails.application.config.spree.page_sections = [
43
+ Spree::PageSections::Breadcrumbs,
44
+ Spree::PageSections::FeaturedPosts,
45
+ Spree::PageSections::TaxonGrid,
46
+ Spree::PageSections::ImageWithText,
47
+ Spree::PageSections::FeaturedTaxon,
48
+ Spree::PageSections::CollectionBanner,
49
+ Spree::PageSections::ProductDetails,
50
+ Spree::PageSections::MainPasswordFooter,
51
+ Spree::PageSections::RelatedProducts,
52
+ Spree::PageSections::CustomCode,
53
+ Spree::PageSections::TaxonBanner,
54
+ Spree::PageSections::FeaturedProduct,
55
+ Spree::PageSections::ProductGrid,
56
+ Spree::PageSections::ImageBanner,
57
+ Spree::PageSections::PageTitle,
58
+ Spree::PageSections::MainPasswordHeader,
59
+ Spree::PageSections::PostDetails,
60
+ Spree::PageSections::PostGrid,
61
+ Spree::PageSections::FeaturedTaxons,
62
+ Spree::PageSections::RichText,
63
+ Spree::PageSections::Video,
64
+ Spree::PageSections::Footer,
65
+ Spree::PageSections::Newsletter,
66
+ Spree::PageSections::Header,
67
+ Spree::PageSections::AnnouncementBar
68
+ ]
69
+
70
+ Rails.application.config.spree.page_blocks = [
71
+ Spree::PageBlocks::Link,
72
+ Spree::PageBlocks::MegaNav,
73
+ Spree::PageBlocks::MegaNavWithSubcategories,
74
+ Spree::PageBlocks::Subheading,
75
+ Spree::PageBlocks::Heading,
76
+ Spree::PageBlocks::Nav,
77
+ Spree::PageBlocks::Buttons,
78
+ Spree::PageBlocks::Text,
79
+ Spree::PageBlocks::NewsletterForm,
80
+ Spree::PageBlocks::Image,
81
+ Spree::PageBlocks::Products::Title,
82
+ Spree::PageBlocks::Products::Share,
83
+ Spree::PageBlocks::Products::Price,
84
+ Spree::PageBlocks::Products::QuantitySelector,
85
+ Spree::PageBlocks::Products::VariantPicker,
86
+ Spree::PageBlocks::Products::BuyButtons
87
+ ]
88
+ end
89
+
90
+ config.to_prepare do
91
+ Dir.glob(File.join(Spree::PageBuilder::Engine.root, 'app/**/*_decorator*.rb')) do |c|
92
+ Rails.configuration.cache_classes ? require(c) : load(c)
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ # Backwards compatible accessors
99
+ def self.themes
100
+ Rails.application.config.spree.themes
101
+ end
102
+
103
+ def self.themes=(value)
104
+ Rails.application.config.spree.themes = value
105
+ end
106
+
107
+ def self.theme_layout_sections
108
+ Rails.application.config.spree.theme_layout_sections
109
+ end
110
+
111
+ def self.theme_layout_sections=(value)
112
+ Rails.application.config.spree.theme_layout_sections = value
113
+ end
114
+
115
+ def self.pages
116
+ Rails.application.config.spree.pages
117
+ end
118
+
119
+ def self.pages=(value)
120
+ Rails.application.config.spree.pages = value
121
+ end
122
+
123
+ def self.page_sections
124
+ Rails.application.config.spree.page_sections
125
+ end
126
+
127
+ def self.page_sections=(value)
128
+ Rails.application.config.spree.page_sections = value
129
+ end
130
+
131
+ def self.page_blocks
132
+ Rails.application.config.spree.page_blocks
133
+ end
134
+
135
+ def self.page_blocks=(value)
136
+ Rails.application.config.spree.page_blocks = value
137
+ end
138
+
139
+ # Page Builder configuration accessor (groups all page builder config)
140
+ def self.page_builder
141
+ @page_builder ||= PageBuilderConfig.new
142
+ end
143
+
144
+ class PageBuilderConfig
145
+ def themes
146
+ Rails.application.config.spree.themes
147
+ end
148
+
149
+ def themes=(value)
150
+ Rails.application.config.spree.themes = value
151
+ end
152
+
153
+ def theme_layout_sections
154
+ Rails.application.config.spree.theme_layout_sections
155
+ end
156
+
157
+ def theme_layout_sections=(value)
158
+ Rails.application.config.spree.theme_layout_sections = value
159
+ end
160
+
161
+ def pages
162
+ Rails.application.config.spree.pages
163
+ end
164
+
165
+ def pages=(value)
166
+ Rails.application.config.spree.pages = value
167
+ end
168
+
169
+ def page_sections
170
+ Rails.application.config.spree.page_sections
171
+ end
172
+
173
+ def page_sections=(value)
174
+ Rails.application.config.spree.page_sections = value
175
+ end
176
+
177
+ def page_blocks
178
+ Rails.application.config.spree.page_blocks
179
+ end
180
+
181
+ def page_blocks=(value)
182
+ Rails.application.config.spree.page_blocks = value
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,22 @@
1
+ FactoryBot.define do
2
+ factory :page_block, class: Spree::PageBlock do
3
+ section { create(:page_section) }
4
+
5
+ trait :buttons do
6
+ type { 'Spree::PageBlocks::Buttons' }
7
+ end
8
+
9
+ trait :nav do
10
+ section { create(:header_page_section) }
11
+
12
+ type { 'Spree::PageBlocks::Nav' }
13
+ end
14
+
15
+ trait :heading do
16
+ type { 'Spree::PageBlocks::Heading' }
17
+ end
18
+
19
+ factory :buttons_block, traits: [:buttons], class: Spree::PageBlocks::Buttons
20
+ factory :heading_block, traits: [:heading], class: Spree::PageBlocks::Heading
21
+ end
22
+ end
@@ -0,0 +1,33 @@
1
+ FactoryBot.define do
2
+ factory :page, class: Spree::Page do
3
+ type { 'Spree::Page' }
4
+ pageable { Spree::Theme.first || create(:theme) }
5
+ sequence(:name) { |n| "Page #{n}" }
6
+ meta_description { 'Page Description' }
7
+
8
+ trait :homepage do
9
+ name { 'Homepage' }
10
+ type { 'Spree::Pages::Homepage' }
11
+ end
12
+
13
+ trait :account do
14
+ type { 'Spree::Pages::Account' }
15
+ name { 'Account' }
16
+ end
17
+
18
+ trait :preview do
19
+ parent { create(:page) }
20
+ end
21
+
22
+ trait :for_store do
23
+ pageable { Spree::Store.default }
24
+ end
25
+ end
26
+
27
+ factory :custom_page, class: Spree::Pages::Custom do
28
+ type { 'Spree::Pages::Custom' }
29
+ pageable { Spree::Store.default }
30
+ sequence(:name) { |n| "Custom Page #{n}" }
31
+ meta_description { 'Page Description' }
32
+ end
33
+ end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :page_link, class: Spree::PageLink do
3
+ parent { Spree::PageSections::Header.first }
4
+ linkable { Spree::Page.first }
5
+ sequence(:label) { |n| "Page Link #{n}" }
6
+ end
7
+ end
@@ -0,0 +1,27 @@
1
+ FactoryBot.define do
2
+ factory :page_section, class: Spree::PageSection do
3
+ pageable { Spree::Page.find_by!(name: 'Homepage') }
4
+
5
+ trait :without_links do
6
+ do_not_create_links { true }
7
+ end
8
+
9
+ factory :featured_taxons_page_section, class: Spree::PageSections::FeaturedTaxons
10
+
11
+ factory :featured_taxon_page_section, class: Spree::PageSections::FeaturedTaxon
12
+
13
+ factory :header_page_section, class: Spree::PageSections::Header
14
+
15
+ factory :announcement_bar_page_section, class: Spree::PageSections::AnnouncementBar
16
+
17
+ factory :rich_text_page_section, class: Spree::PageSections::RichText
18
+
19
+ factory :newsletter_page_section, class: Spree::PageSections::Newsletter
20
+
21
+ factory :video_page_section, class: Spree::PageSections::Video
22
+
23
+ factory :image_with_text_page_section, class: Spree::PageSections::ImageWithText
24
+
25
+ factory :featured_posts_page_section, class: Spree::PageSections::FeaturedPosts
26
+ end
27
+ end
@@ -0,0 +1,14 @@
1
+ FactoryBot.define do
2
+ factory :theme, class: Spree::Theme do
3
+ sequence(:name) { |n| "Theme #{n}#{Kernel.rand(9999)}" }
4
+ store { Spree::Store.default || create(:store, default: true) }
5
+
6
+ trait :blank do
7
+ duplicating { true }
8
+ end
9
+
10
+ trait :preview do
11
+ parent { Spree::Store.default.default_theme || create(:theme, store: store) }
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ Dir["#{File.dirname(__FILE__)}/factories/**"].each do |f|
2
+ load File.expand_path(f)
3
+ end
@@ -0,0 +1,4 @@
1
+ require 'spree'
2
+ require 'spree_admin'
3
+
4
+ require 'spree/page_builder/engine'
@@ -0,0 +1 @@
1
+ require 'spree/page_builder'
metadata ADDED
@@ -0,0 +1,288 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spree_page_builder
3
+ version: !ruby/object:Gem::Version
4
+ version: 5.3.0.rc1
5
+ platform: ruby
6
+ authors:
7
+ - Vendo Connect Inc.
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: spree
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: 5.3.0.rc1
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: 5.3.0.rc1
26
+ - !ruby/object:Gem::Dependency
27
+ name: spree_admin
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 5.3.0.rc1
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 5.3.0.rc1
40
+ description: Visual page builder and theme management for Spree Commerce storefronts
41
+ email: hello@spreecommerce.org
42
+ executables: []
43
+ extensions: []
44
+ extra_rdoc_files: []
45
+ files:
46
+ - README.md
47
+ - Rakefile
48
+ - app/controllers/concerns/spree/admin/page_builder_concern.rb
49
+ - app/controllers/concerns/spree/admin/storefront_breadcrumb_concern.rb
50
+ - app/controllers/spree/admin/page_blocks_controller.rb
51
+ - app/controllers/spree/admin/page_links_controller.rb
52
+ - app/controllers/spree/admin/page_sections_controller.rb
53
+ - app/controllers/spree/admin/pages_controller.rb
54
+ - app/controllers/spree/admin/storefront_controller.rb
55
+ - app/controllers/spree/admin/themes_controller.rb
56
+ - app/helpers/spree/admin/page_builder_helper.rb
57
+ - app/helpers/spree/admin/themes_helper.rb
58
+ - app/jobs/spree/page_builder/products/touch_taxons_job_decorator.rb
59
+ - app/jobs/spree/themes/duplicate_components_job.rb
60
+ - app/jobs/spree/themes/screenshot_job.rb
61
+ - app/models/concerns/spree/has_page_links.rb
62
+ - app/models/spree/page.rb
63
+ - app/models/spree/page_block.rb
64
+ - app/models/spree/page_blocks/buttons.rb
65
+ - app/models/spree/page_blocks/heading.rb
66
+ - app/models/spree/page_blocks/image.rb
67
+ - app/models/spree/page_blocks/link.rb
68
+ - app/models/spree/page_blocks/mega_nav.rb
69
+ - app/models/spree/page_blocks/mega_nav_with_subcategories.rb
70
+ - app/models/spree/page_blocks/metafields.rb
71
+ - app/models/spree/page_blocks/nav.rb
72
+ - app/models/spree/page_blocks/newsletter_form.rb
73
+ - app/models/spree/page_blocks/products/brand.rb
74
+ - app/models/spree/page_blocks/products/buy_buttons.rb
75
+ - app/models/spree/page_blocks/products/description.rb
76
+ - app/models/spree/page_blocks/products/price.rb
77
+ - app/models/spree/page_blocks/products/quantity_selector.rb
78
+ - app/models/spree/page_blocks/products/share.rb
79
+ - app/models/spree/page_blocks/products/title.rb
80
+ - app/models/spree/page_blocks/products/variant_picker.rb
81
+ - app/models/spree/page_blocks/subheading.rb
82
+ - app/models/spree/page_blocks/text.rb
83
+ - app/models/spree/page_builder/policy_decorator.rb
84
+ - app/models/spree/page_builder/post_decorator.rb
85
+ - app/models/spree/page_builder/product_decorator.rb
86
+ - app/models/spree/page_builder/store_decorator.rb
87
+ - app/models/spree/page_builder/taxon_decorator.rb
88
+ - app/models/spree/page_link.rb
89
+ - app/models/spree/page_section.rb
90
+ - app/models/spree/page_sections/announcement_bar.rb
91
+ - app/models/spree/page_sections/breadcrumbs.rb
92
+ - app/models/spree/page_sections/collection_banner.rb
93
+ - app/models/spree/page_sections/custom_code.rb
94
+ - app/models/spree/page_sections/featured_posts.rb
95
+ - app/models/spree/page_sections/featured_product.rb
96
+ - app/models/spree/page_sections/featured_taxon.rb
97
+ - app/models/spree/page_sections/featured_taxons.rb
98
+ - app/models/spree/page_sections/footer.rb
99
+ - app/models/spree/page_sections/header.rb
100
+ - app/models/spree/page_sections/image_banner.rb
101
+ - app/models/spree/page_sections/image_with_text.rb
102
+ - app/models/spree/page_sections/main_password_footer.rb
103
+ - app/models/spree/page_sections/main_password_header.rb
104
+ - app/models/spree/page_sections/newsletter.rb
105
+ - app/models/spree/page_sections/page_title.rb
106
+ - app/models/spree/page_sections/post_details.rb
107
+ - app/models/spree/page_sections/post_grid.rb
108
+ - app/models/spree/page_sections/product_details.rb
109
+ - app/models/spree/page_sections/product_grid.rb
110
+ - app/models/spree/page_sections/related_products.rb
111
+ - app/models/spree/page_sections/rich_text.rb
112
+ - app/models/spree/page_sections/taxon_banner.rb
113
+ - app/models/spree/page_sections/taxon_grid.rb
114
+ - app/models/spree/page_sections/video.rb
115
+ - app/models/spree/pages/account.rb
116
+ - app/models/spree/pages/cart.rb
117
+ - app/models/spree/pages/checkout.rb
118
+ - app/models/spree/pages/custom.rb
119
+ - app/models/spree/pages/homepage.rb
120
+ - app/models/spree/pages/login.rb
121
+ - app/models/spree/pages/password.rb
122
+ - app/models/spree/pages/post.rb
123
+ - app/models/spree/pages/post_list.rb
124
+ - app/models/spree/pages/product_details.rb
125
+ - app/models/spree/pages/search_results.rb
126
+ - app/models/spree/pages/shop_all.rb
127
+ - app/models/spree/pages/taxon.rb
128
+ - app/models/spree/pages/taxon_list.rb
129
+ - app/models/spree/pages/wishlist.rb
130
+ - app/models/spree/theme.rb
131
+ - app/models/spree/themes/default.rb
132
+ - app/services/spree/taxons/touch_featured_sections.rb
133
+ - app/views/layouts/spree/page_builder.html.erb
134
+ - app/views/spree/admin/dashboard/_store_preview.html.erb
135
+ - app/views/spree/admin/page_blocks/_form_tab_buttons.html.erb
136
+ - app/views/spree/admin/page_blocks/create.turbo_stream.erb
137
+ - app/views/spree/admin/page_blocks/destroy.turbo_stream.erb
138
+ - app/views/spree/admin/page_blocks/edit.html.erb
139
+ - app/views/spree/admin/page_blocks/forms/_brand.html.erb
140
+ - app/views/spree/admin/page_blocks/forms/_brand_logo.html.erb
141
+ - app/views/spree/admin/page_blocks/forms/_buttons.html.erb
142
+ - app/views/spree/admin/page_blocks/forms/_heading.html.erb
143
+ - app/views/spree/admin/page_blocks/forms/_image.html.erb
144
+ - app/views/spree/admin/page_blocks/forms/_link.html.erb
145
+ - app/views/spree/admin/page_blocks/forms/_mega_nav.html.erb
146
+ - app/views/spree/admin/page_blocks/forms/_mega_nav_with_subcategories.html.erb
147
+ - app/views/spree/admin/page_blocks/forms/_metafields.html.erb
148
+ - app/views/spree/admin/page_blocks/forms/_nav.html.erb
149
+ - app/views/spree/admin/page_blocks/forms/_newsletter_form.html.erb
150
+ - app/views/spree/admin/page_blocks/forms/_price.html.erb
151
+ - app/views/spree/admin/page_blocks/forms/_share.html.erb
152
+ - app/views/spree/admin/page_blocks/forms/_subheading.html.erb
153
+ - app/views/spree/admin/page_blocks/forms/_text.html.erb
154
+ - app/views/spree/admin/page_blocks/forms/_title.html.erb
155
+ - app/views/spree/admin/page_blocks/forms/_variant_picker.html.erb
156
+ - app/views/spree/admin/page_blocks/forms/products/_buy_buttons.html.erb
157
+ - app/views/spree/admin/page_blocks/forms/products/_description.html.erb
158
+ - app/views/spree/admin/page_blocks/forms/products/_quantity_selector.html.erb
159
+ - app/views/spree/admin/page_blocks/move_higher.turbo_stream.erb
160
+ - app/views/spree/admin/page_blocks/move_lower.turbo_stream.erb
161
+ - app/views/spree/admin/page_blocks/show.html.erb
162
+ - app/views/spree/admin/page_blocks/update.turbo_stream.erb
163
+ - app/views/spree/admin/page_builder/_add_block.html.erb
164
+ - app/views/spree/admin/page_builder/_color_palette.html.erb
165
+ - app/views/spree/admin/page_builder/_color_picker.html.erb
166
+ - app/views/spree/admin/page_builder/_header.html.erb
167
+ - app/views/spree/admin/page_builder/_labeled_range_input.html.erb
168
+ - app/views/spree/admin/page_builder/_pages_dropdown.html.erb
169
+ - app/views/spree/admin/page_builder/_range_input.html.erb
170
+ - app/views/spree/admin/page_builder/_sidebar.html.erb
171
+ - app/views/spree/admin/page_builder/_sidebar_block.html.erb
172
+ - app/views/spree/admin/page_builder/_sidebar_colors.html.erb
173
+ - app/views/spree/admin/page_builder/_sidebar_fonts.html.erb
174
+ - app/views/spree/admin/page_builder/_sidebar_section.html.erb
175
+ - app/views/spree/admin/page_builder/_sidebar_sections.html.erb
176
+ - app/views/spree/admin/page_builder/_sidebar_sections_toolbar.html.erb
177
+ - app/views/spree/admin/page_links/_form.html.erb
178
+ - app/views/spree/admin/page_links/_linkable_type_dropdown.html.erb
179
+ - app/views/spree/admin/page_links/_list.html.erb
180
+ - app/views/spree/admin/page_links/_refresh_theme_preview.turbo_stream.erb
181
+ - app/views/spree/admin/page_links/create.turbo_stream.erb
182
+ - app/views/spree/admin/page_links/destroy.turbo_stream.erb
183
+ - app/views/spree/admin/page_links/edit.html.erb
184
+ - app/views/spree/admin/page_links/update.turbo_stream.erb
185
+ - app/views/spree/admin/page_sections/_form_tab_buttons.html.erb
186
+ - app/views/spree/admin/page_sections/create.turbo_stream.erb
187
+ - app/views/spree/admin/page_sections/destroy.turbo_stream.erb
188
+ - app/views/spree/admin/page_sections/edit.html.erb
189
+ - app/views/spree/admin/page_sections/fields/_background_color.html.erb
190
+ - app/views/spree/admin/page_sections/fields/_border_bottom_width.html.erb
191
+ - app/views/spree/admin/page_sections/fields/_border_color.html.erb
192
+ - app/views/spree/admin/page_sections/fields/_border_top_width.html.erb
193
+ - app/views/spree/admin/page_sections/fields/_bottom_padding.html.erb
194
+ - app/views/spree/admin/page_sections/fields/_button.html.erb
195
+ - app/views/spree/admin/page_sections/fields/_header_layout.html.erb
196
+ - app/views/spree/admin/page_sections/fields/_height.html.erb
197
+ - app/views/spree/admin/page_sections/fields/_text_color.html.erb
198
+ - app/views/spree/admin/page_sections/fields/_top_padding.html.erb
199
+ - app/views/spree/admin/page_sections/forms/_announcement_bar.html.erb
200
+ - app/views/spree/admin/page_sections/forms/_brand_story.html.erb
201
+ - app/views/spree/admin/page_sections/forms/_breadcrumbs.html.erb
202
+ - app/views/spree/admin/page_sections/forms/_collection_banner.html.erb
203
+ - app/views/spree/admin/page_sections/forms/_custom_code.html.erb
204
+ - app/views/spree/admin/page_sections/forms/_featured_posts.html.erb
205
+ - app/views/spree/admin/page_sections/forms/_featured_product.html.erb
206
+ - app/views/spree/admin/page_sections/forms/_featured_taxon.html.erb
207
+ - app/views/spree/admin/page_sections/forms/_featured_taxons.html.erb
208
+ - app/views/spree/admin/page_sections/forms/_footer.html.erb
209
+ - app/views/spree/admin/page_sections/forms/_header.html.erb
210
+ - app/views/spree/admin/page_sections/forms/_image_banner.html.erb
211
+ - app/views/spree/admin/page_sections/forms/_image_with_text.html.erb
212
+ - app/views/spree/admin/page_sections/forms/_main_password_footer.html.erb
213
+ - app/views/spree/admin/page_sections/forms/_main_password_header.erb
214
+ - app/views/spree/admin/page_sections/forms/_newsletter.html.erb
215
+ - app/views/spree/admin/page_sections/forms/_page_title.html.erb
216
+ - app/views/spree/admin/page_sections/forms/_post_details.html.erb
217
+ - app/views/spree/admin/page_sections/forms/_post_grid.html.erb
218
+ - app/views/spree/admin/page_sections/forms/_product_details.html.erb
219
+ - app/views/spree/admin/page_sections/forms/_product_grid.html.erb
220
+ - app/views/spree/admin/page_sections/forms/_related_products.html.erb
221
+ - app/views/spree/admin/page_sections/forms/_rich_text.html.erb
222
+ - app/views/spree/admin/page_sections/forms/_taxon_banner.html.erb
223
+ - app/views/spree/admin/page_sections/forms/_taxon_grid.html.erb
224
+ - app/views/spree/admin/page_sections/forms/_video.html.erb
225
+ - app/views/spree/admin/page_sections/move_higher.turbo_stream.erb
226
+ - app/views/spree/admin/page_sections/move_lower.turbo_stream.erb
227
+ - app/views/spree/admin/page_sections/new.html.erb
228
+ - app/views/spree/admin/page_sections/remove_attachment.turbo_stream.erb
229
+ - app/views/spree/admin/page_sections/restore_design_settings_to_defaults.turbo_stream.erb
230
+ - app/views/spree/admin/page_sections/show.html.erb
231
+ - app/views/spree/admin/page_sections/update.turbo_stream.erb
232
+ - app/views/spree/admin/pages/_form.html.erb
233
+ - app/views/spree/admin/pages/_table_header.html.erb
234
+ - app/views/spree/admin/pages/_table_row.html.erb
235
+ - app/views/spree/admin/pages/edit.html.erb
236
+ - app/views/spree/admin/pages/filters.html.erb
237
+ - app/views/spree/admin/pages/index.html.erb
238
+ - app/views/spree/admin/pages/new.html.erb
239
+ - app/views/spree/admin/storefront/edit.html.erb
240
+ - app/views/spree/admin/themes/_theme.html.erb
241
+ - app/views/spree/admin/themes/_theme_preview_image.html.erb
242
+ - app/views/spree/admin/themes/edit.html.erb
243
+ - app/views/spree/admin/themes/index.html.erb
244
+ - app/views/spree/admin/themes/update.turbo_stream.erb
245
+ - config/initializers/spree_admin_navigation.rb
246
+ - config/initializers/spree_admin_partials.rb
247
+ - config/locales/en.yml
248
+ - config/routes.rb
249
+ - db/migrate/20250120094216_create_page_builder_models.rb
250
+ - db/migrate/20250305121352_remove_page_builder_indices.rb
251
+ - db/migrate/20250825175217_add_missing_page_builder_indexes.rb
252
+ - db/migrate/20250913130044_add_page_links_counter_cache_to_spree_stores.rb
253
+ - lib/generators/spree/page_builder/install/install_generator.rb
254
+ - lib/spree/page_builder.rb
255
+ - lib/spree/page_builder/engine.rb
256
+ - lib/spree/page_builder/testing_support/factories.rb
257
+ - lib/spree/page_builder/testing_support/factories/page_block_factory.rb
258
+ - lib/spree/page_builder/testing_support/factories/page_factory.rb
259
+ - lib/spree/page_builder/testing_support/factories/page_link_factory.rb
260
+ - lib/spree/page_builder/testing_support/factories/page_section_factory.rb
261
+ - lib/spree/page_builder/testing_support/factories/theme_factory.rb
262
+ - lib/spree_page_builder.rb
263
+ homepage: https://getvendo.com
264
+ licenses:
265
+ - AGPL-3.0-or-later
266
+ metadata:
267
+ bug_tracker_uri: https://github.com/spree/spree/issues
268
+ changelog_uri: https://github.com/spree/spree/releases/tag/v5.3.0.rc1
269
+ documentation_uri: https://docs.spreecommerce.org/
270
+ source_code_uri: https://github.com/spree/spree/tree/v5.3.0.rc1
271
+ rdoc_options: []
272
+ require_paths:
273
+ - lib
274
+ required_ruby_version: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - ">="
277
+ - !ruby/object:Gem::Version
278
+ version: '3.2'
279
+ required_rubygems_version: !ruby/object:Gem::Requirement
280
+ requirements:
281
+ - - ">="
282
+ - !ruby/object:Gem::Version
283
+ version: '0'
284
+ requirements: []
285
+ rubygems_version: 4.0.2
286
+ specification_version: 4
287
+ summary: Visual Page Builder for Spree Commerce
288
+ test_files: []