workarea-package_products 3.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +20 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  4. data/.github/ISSUE_TEMPLATE/documentation-request.md +17 -0
  5. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  6. data/.gitignore +15 -0
  7. data/CHANGELOG.md +343 -0
  8. data/CODE_OF_CONDUCT.md +3 -0
  9. data/CONTRIBUTING.md +3 -0
  10. data/Gemfile +16 -0
  11. data/LICENSE +52 -0
  12. data/README.md +40 -0
  13. data/Rakefile +52 -0
  14. data/app/assets/javascripts/workarea/storefront/package_products/modules/family_product_add_to_cart.js +83 -0
  15. data/app/assets/javascripts/workarea/storefront/package_products/templates/family_add_to_cart_checkbox.jst.ejs +1 -0
  16. data/app/assets/stylesheets/workarea/admin/package_products/components/_product_cards.scss +7 -0
  17. data/app/assets/stylesheets/workarea/storefront/package_products/components/_product_detail_packaged_products.scss +11 -0
  18. data/app/controllers/workarea/admin/create_catalog_package_products_controller.rb +150 -0
  19. data/app/controllers/workarea/admin/create_catalog_products_controller.decorator +25 -0
  20. data/app/controllers/workarea/storefront/cart_items_controller.decorator +29 -0
  21. data/app/controllers/workarea/storefront/products_controller.decorator +8 -0
  22. data/app/models/workarea/catalog/product.decorator +44 -0
  23. data/app/models/workarea/search/admin/catalog_product.decorator +20 -0
  24. data/app/models/workarea/search/storefront/package_product.rb +40 -0
  25. data/app/queries/workarea/search/product_entries.decorator +8 -0
  26. data/app/seeds/workarea/package_product_seeds.rb +41 -0
  27. data/app/services/workarea/add_package_to_cart.rb +79 -0
  28. data/app/view_models/workarea/admin/product_view_model.decorator +35 -0
  29. data/app/view_models/workarea/storefront/product_templates/family_view_model.rb +6 -0
  30. data/app/view_models/workarea/storefront/product_templates/package_view_model.rb +33 -0
  31. data/app/view_models/workarea/storefront/product_view_model.decorator +13 -0
  32. data/app/views/workarea/admin/catalog_products/_create_package_button.html.haml +1 -0
  33. data/app/views/workarea/admin/catalog_products/_packaged_products_card.html.haml +26 -0
  34. data/app/views/workarea/admin/create_catalog_package_products/categorization.html.haml +64 -0
  35. data/app/views/workarea/admin/create_catalog_package_products/content.html.haml +54 -0
  36. data/app/views/workarea/admin/create_catalog_package_products/details.html.haml +87 -0
  37. data/app/views/workarea/admin/create_catalog_package_products/images.html.haml +57 -0
  38. data/app/views/workarea/admin/create_catalog_package_products/packaged_products.html.haml +79 -0
  39. data/app/views/workarea/admin/create_catalog_package_products/publish.html.haml +61 -0
  40. data/app/views/workarea/admin/create_catalog_package_products/setup.html.haml +68 -0
  41. data/app/views/workarea/admin/create_catalog_products/select.html.haml +34 -0
  42. data/app/views/workarea/storefront/cart_items/package.html.haml +59 -0
  43. data/app/views/workarea/storefront/products/package_show.html.haml +49 -0
  44. data/app/views/workarea/storefront/products/templates/_family.html.haml +42 -0
  45. data/app/views/workarea/storefront/products/templates/_package.html.haml +36 -0
  46. data/app/workers/workarea/update_package_products.rb +21 -0
  47. data/bin/rails +16 -0
  48. data/config/initializers/appends.rb +31 -0
  49. data/config/initializers/configuration.rb +6 -0
  50. data/config/initializers/seeds.rb +1 -0
  51. data/config/locales/en.yml +45 -0
  52. data/config/routes.rb +30 -0
  53. data/lib/tasks/sample_data.rake +16 -0
  54. data/lib/workarea/package_products.rb +10 -0
  55. data/lib/workarea/package_products/engine.rb +8 -0
  56. data/lib/workarea/package_products/version.rb +5 -0
  57. data/test/dummy/Rakefile +6 -0
  58. data/test/dummy/app/assets/config/manifest.js +4 -0
  59. data/test/dummy/app/assets/images/.keep +0 -0
  60. data/test/dummy/app/assets/javascripts/application.js +13 -0
  61. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  62. data/test/dummy/app/controllers/application_controller.rb +3 -0
  63. data/test/dummy/app/controllers/concerns/.keep +0 -0
  64. data/test/dummy/app/helpers/application_helper.rb +2 -0
  65. data/test/dummy/app/jobs/application_job.rb +2 -0
  66. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  67. data/test/dummy/app/models/concerns/.keep +0 -0
  68. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  69. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  70. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  71. data/test/dummy/bin/bundle +3 -0
  72. data/test/dummy/bin/rails +4 -0
  73. data/test/dummy/bin/rake +4 -0
  74. data/test/dummy/bin/setup +34 -0
  75. data/test/dummy/bin/update +29 -0
  76. data/test/dummy/config.ru +5 -0
  77. data/test/dummy/config/application.rb +18 -0
  78. data/test/dummy/config/boot.rb +5 -0
  79. data/test/dummy/config/cable.yml +9 -0
  80. data/test/dummy/config/environment.rb +5 -0
  81. data/test/dummy/config/environments/development.rb +54 -0
  82. data/test/dummy/config/environments/production.rb +83 -0
  83. data/test/dummy/config/environments/test.rb +43 -0
  84. data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
  85. data/test/dummy/config/initializers/assets.rb +11 -0
  86. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  87. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  88. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  89. data/test/dummy/config/initializers/inflections.rb +16 -0
  90. data/test/dummy/config/initializers/mime_types.rb +4 -0
  91. data/test/dummy/config/initializers/session_store.rb +3 -0
  92. data/test/dummy/config/initializers/workarea.rb +5 -0
  93. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  94. data/test/dummy/config/locales/en.yml +23 -0
  95. data/test/dummy/config/puma.rb +47 -0
  96. data/test/dummy/config/routes.rb +5 -0
  97. data/test/dummy/config/secrets.yml +22 -0
  98. data/test/dummy/db/seeds.rb +2 -0
  99. data/test/dummy/lib/assets/.keep +0 -0
  100. data/test/dummy/log/.keep +0 -0
  101. data/test/dummy/public/404.html +67 -0
  102. data/test/dummy/public/422.html +67 -0
  103. data/test/dummy/public/500.html +66 -0
  104. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  105. data/test/dummy/public/apple-touch-icon.png +0 -0
  106. data/test/dummy/public/favicon.ico +1 -0
  107. data/test/integration/workarea/admin/create_catalog_package_products_integration_test.rb +139 -0
  108. data/test/integration/workarea/storefront/package_cart_items_integration_test.rb +47 -0
  109. data/test/integration/workarea/storefront/products_integration_test.decorator +19 -0
  110. data/test/models/workarea/catalog/package_product_test.rb +68 -0
  111. data/test/models/workarea/search/storefront/package_product_test.rb +44 -0
  112. data/test/queries/workarea/search/product_entries_test.decorator +15 -0
  113. data/test/services/workarea/add_package_to_cart_test.rb +46 -0
  114. data/test/system/workarea/admin/activity_system_test.decorator +53 -0
  115. data/test/system/workarea/admin/package_product_copy_system_test.rb +27 -0
  116. data/test/system/workarea/admin/package_products_system_test.rb +101 -0
  117. data/test/system/workarea/admin/product_copy_system_test.decorator +28 -0
  118. data/test/system/workarea/admin/products_system_test.decorator +69 -0
  119. data/test/system/workarea/storefront/categories_with_packages_system_test.rb +172 -0
  120. data/test/system/workarea/storefront/family_product_system_test.rb +58 -0
  121. data/test/system/workarea/storefront/package_product_system_test.rb +42 -0
  122. data/test/test_helper.rb +10 -0
  123. data/test/view_models/workarea/admin/package_product_view_model_test.rb +41 -0
  124. data/test/view_models/workarea/storefront/package_product_view_model_test.rb +27 -0
  125. data/test/view_models/workarea/storefront/package_templates/package_view_model_test.rb +34 -0
  126. data/test/workers/workarea/update_package_products_test.rb +27 -0
  127. data/workarea-package_products.gemspec +24 -0
  128. metadata +189 -0
@@ -0,0 +1,59 @@
1
+ .view
2
+ - if @items.blank?
3
+ = render_message 'error', data: { message_show_dismiss: 'false' } do
4
+ = t('workarea.storefront.flash_messages.cart_item_error')
5
+
6
+ - else
7
+ = render_message 'success', data: { message_show_dismiss: 'false' } do
8
+ = t('workarea.storefront.flash_messages.cart_item_added')
9
+
10
+ - @items.each do |item|
11
+ .product-list__item{ data: { cart_count: current_order.quantity } }
12
+ .product-list__item-cell
13
+ .product-list__summary
14
+ %p.product-list__media= link_to image_tag(product_image_url(item.image, :small_thumb), alt: item.product_name, class: 'product-list__media-image'), product_url(item.product, sku: item.sku), class: 'product-list__media-link'
15
+ .product-list__info
16
+ %p.product-list__name= link_to item.product_name, product_path(item.product, sku: item.sku)
17
+ %p.product-list__id= item.sku_name
18
+ - if item.has_options?
19
+ .product-list__option-group
20
+ - item.details.each do |name, value|
21
+ %p.product-list__option #{name.titleize}: #{value}
22
+ - item.customizations.each do |name, value|
23
+ %p.customization #{name.titleize}: #{value}
24
+ .product-list__item-cell
25
+ %table.table
26
+ %thead
27
+ %tr
28
+ %th.table__prices= t('workarea.storefront.orders.price')
29
+ %th.table__quantity= t('workarea.storefront.orders.quantity')
30
+ %th.table__prices= t('workarea.storefront.orders.total')
31
+ %tbody
32
+ %tr
33
+ %td.table__prices
34
+ = render 'workarea/storefront/carts/pricing', item: item, css_block: 'table'
35
+ %td.table__quantity
36
+ = form_tag cart_item_path(item), method: :patch, class: 'inline-form', data: { analytics: update_cart_item_analytics_data(item).to_json } do
37
+ .inline-form__cell
38
+ .value= number_field_tag :quantity, item.quantity, min: 1, required: true, class: 'text-box text-box--x-small', data: { form_submitting_control: '' }, title: t('workarea.storefront.orders.quantity'), id: dom_id(item, 'package')
39
+ %p.inline-form__cell.hidden-if-js-enabled= button_tag t('workarea.storefront.carts.update'), value: 'change_quantity', class: 'button'
40
+ %td.table__prices
41
+ - item.total_adjustments.each do |adjustment|
42
+ %p.table__price
43
+ - if item.total_adjustments.many?
44
+ %span.table__price-label= adjustment.description.titleize
45
+
46
+ - if adjustment.discount?
47
+ %strong.table__price-discount= number_to_currency(adjustment.amount)
48
+ - else
49
+ %span= number_to_currency(adjustment.amount)
50
+
51
+ - if item.total_adjustments.many?
52
+ %p.table__price
53
+ %span.table__price-label= t('workarea.storefront.orders.item_total')
54
+ %span= number_to_currency(item.total_price)
55
+
56
+ .grid.grid--auto.grid--center
57
+ .grid__cell= link_to t('workarea.storefront.carts.continue_shopping'), root_path, class: 'button button--large', data: { dialog_close_button: true }
58
+ .grid__cell= link_to t('workarea.storefront.carts.view_cart'), cart_path, class: 'button button--large'
59
+ .grid__cell= link_to t('workarea.storefront.carts.checkout'), checkout_path, class: 'button button--large'
@@ -0,0 +1,49 @@
1
+ - @title = @product.browser_title
2
+ - @breadcrumbs = @product.breadcrumbs
3
+ - params[:sku] = nil # HACK: avoid issues with current_sku
4
+
5
+ - content_for :head do
6
+ - cache "#{@product.cache_key}/head", expires_in: 1.hour do
7
+ %meta{ property: 'recent-view', content: recent_view_content(product_id: @product.id) }
8
+ %meta{ property: 'global-id', content: @product.to_global_id.to_param }
9
+ = append_partials('storefront.product_head', product: @product)
10
+
11
+ %link{ href: product_path(@product), rel: 'canonical' }
12
+
13
+ - unless @product.meta_description.blank?
14
+ %meta{ name: :description, content: strip_tags(@product.meta_description) }
15
+
16
+ %meta{ property: 'og:url', content: url_for }
17
+ %meta{ property: 'og:title', content: @product.name }
18
+ %meta{ property: 'og:type', content: 'product' }
19
+ - @product.images.each do |image|
20
+ %meta{ property: 'og:image', content: product_image_url(image, :detail) }
21
+ - unless @product.meta_description.blank?
22
+ %meta{ property: 'og:description', content: strip_tags(@product.meta_description) }
23
+
24
+ - cache "#{@product.cache_key}/show", expires_in: 1.hour do
25
+ .view
26
+ .product-detail-container.product-detail-container--package{ itemscope: true, itemtype: 'http://schema.org/Product', data: { analytics: product_view_analytics_data(@product).to_json } }
27
+
28
+ .product-details{ class: "product-details--#{@product.template}" }
29
+ = render "workarea/storefront/products/templates/#{@product.template}", product: @product
30
+
31
+ .product-detail-packaged-products{ class: "product-detail-packaged-products--#{@product.template}" }
32
+ - @product.packaged_products.each do |product|
33
+ .product-detail-packaged-products__container{ data: { packaged_product_id: product.id } }
34
+ .product-details{ class: "product-details--#{product.template}", itemprop: 'isRelatedTo', itemscope: true, itemtype: 'http://schema.org/Product', data: { analytics: product_view_analytics_data(product).to_json } }
35
+ = render "workarea/storefront/products/templates/#{product.template}", product: product
36
+
37
+ - if @product.recommendations.any?
38
+ %h2.recommendations__heading= t('workarea.storefront.recommendations.heading')
39
+
40
+ .grid{ data: { analytics: product_list_analytics_data('Product Recommendations').to_json } }
41
+ - @product.recommendations.each do |product|
42
+ .grid__cell.grid__cell--50.grid__cell--33-at-medium.grid__cell--16-at-wide
43
+ .product-summary.product-summary--small{ itemprop: 'isRelatedTo', itemscope: true, itemtype: 'http://schema.org/Product' }
44
+ = render 'workarea/storefront/products/summary', product: product
45
+
46
+
47
+ %div{ data: { recommendations_placeholder: recent_views_path } }
48
+
49
+ = append_partials('storefront.product_show', product: @product)
@@ -0,0 +1,42 @@
1
+ .grid.grid--rev
2
+ .grid__cell.grid__cell--60-at-medium
3
+
4
+ .product-details__name
5
+ %h1.product-details__heading{ itemprop: 'name' }= product.name
6
+
7
+ %p.product-details__id
8
+ %span{ itemprop: 'productID' }= product.id
9
+
10
+ .product-prices.product-prices--details{ itemprop: 'offers', itemscope: true, itemtype: 'http://schema.org/Offer' }
11
+ = render 'workarea/storefront/products/pricing', product: product
12
+
13
+ - if product.description.present?
14
+ .product-details__description
15
+ %p= truncated_product_description(product, t('workarea.storefront.products.read_more'))
16
+
17
+ = form_tag package_cart_items_path, method: 'post', class: 'product-details__add-to-cart-form', data: { dialog: { dialogOptions: { closeAll: true, initModules: true } }, analytics: add_to_cart_analytics_data(product).to_json } do
18
+ = hidden_field_tag :product_id, product.id, id: dom_id(product, 'product_id')
19
+ = hidden_field_tag :via, params[:via], id: dom_id(product, 'via')
20
+
21
+ %p.product-details__add-to-cart-action= button_tag t('workarea.storefront.products.add_to_cart'), value: 'add_to_cart', class: 'button button--large'
22
+
23
+ = append_partials('storefront.product_details', product: product)
24
+
25
+ %p.product-details__full-details=link_to t('workarea.storefront.products.view_full_details'), product_path(product, color: params[:color]), class: 'text-button', itemprop: 'url'
26
+
27
+ .grid__cell.grid__cell--40-at-medium
28
+
29
+ .product-details__primary-image
30
+ = link_to(product_image_url(product.primary_image, :zoom), target: '_blank', class: 'product-details__primary-image-link', data: { dialog_button: '' }) do
31
+ = image_tag product_image_url(product.primary_image, :detail), alt: 'View Larger Image', itemprop: 'image', class: 'product-details__primary-image-link-image'
32
+
33
+ - if product.images.length > 1
34
+ .product-details__alt-images
35
+ .grid.grid--auto
36
+ - product.images.each_with_index do |image, index|
37
+ .grid__cell
38
+ .product-details__alt-image
39
+ - button_class = index == 0 ? 'product-details__alt-image-link product-details__alt-image-link--selected' : 'product-details__alt-image-link'
40
+ = link_to(image_tag(product_image_url(image, :small_thumb), alt: t('workarea.storefront.products.zoom')), product_image_url(image, :zoom), class: button_class, target: '_blank', data: { alternate_image_button: { src: product_image_url(image, :detail) }.to_json })
41
+
42
+ = append_partials('storefront.product_details_alt_images', product: product)
@@ -0,0 +1,36 @@
1
+ .grid.grid--rev
2
+ .grid__cell.grid__cell--60-at-medium
3
+
4
+ .product-details__name
5
+ %h1.product-details__heading{ itemprop: 'name' }= product.name
6
+
7
+ %p.product-details__id
8
+ %span{ itemprop: 'productID' }= product.id
9
+
10
+ .product-prices.product-prices--details{ itemprop: 'offers', itemscope: true, itemtype: 'http://schema.org/Offer' }
11
+ = render 'workarea/storefront/products/pricing', product: product
12
+
13
+ - if product.description.present?
14
+ .product-details__description
15
+ %p= truncated_product_description(product, t('workarea.storefront.products.read_more'))
16
+
17
+ = append_partials('storefront.product_details', product: product)
18
+
19
+ %p.product-details__full-details=link_to t('workarea.storefront.products.view_full_details'), product_path(product, color: params[:color]), class: 'text-button', itemprop: 'url'
20
+
21
+ .grid__cell.grid__cell--40-at-medium
22
+
23
+ .product-details__primary-image
24
+ = link_to(product_image_url(product.primary_image, :zoom), target: '_blank', class: 'product-details__primary-image-link', data: { dialog_button: '' }) do
25
+ = image_tag product_image_url(product.primary_image, :detail), alt: 'View Larger Image', itemprop: 'image', class: 'product-details__primary-image-link-image'
26
+
27
+ - if product.images.length > 1
28
+ .product-details__alt-images
29
+ .grid.grid--auto
30
+ - product.images.each_with_index do |image, index|
31
+ .grid__cell
32
+ .product-details__alt-image
33
+ - button_class = index == 0 ? 'product-details__alt-image-link product-details__alt-image-link--selected' : 'product-details__alt-image-link'
34
+ = link_to(image_tag(product_image_url(image, :small_thumb), alt: t('workarea.storefront.products.zoom')), product_image_url(image, :zoom), class: button_class, target: '_blank', data: { alternate_image_button: { src: product_image_url(image, :detail) }.to_json })
35
+
36
+ = append_partials('storefront.product_details_alt_images', product: product)
@@ -0,0 +1,21 @@
1
+ module Workarea
2
+ class UpdatePackageProducts
3
+ include Sidekiq::Worker
4
+ include Sidekiq::CallbacksWorker
5
+
6
+ sidekiq_options(
7
+ enqueue_on: { Catalog::Product => :destroy },
8
+ unique: :until_executing
9
+ )
10
+
11
+ def perform(id)
12
+ Sidekiq::Callbacks.inline do
13
+ packages = Catalog::Product.where(product_ids: id)
14
+ packages.each do |package|
15
+ package.product_ids.delete(id)
16
+ package.save
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails gems
3
+ # installed from the root of your application.
4
+
5
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
6
+ ENGINE_PATH = File.expand_path('../../lib/content_search/engine', __FILE__)
7
+
8
+ # Set up gems listed in the Gemfile.
9
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
10
+ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
11
+
12
+ require 'action_controller/railtie'
13
+ require 'action_mailer/railtie'
14
+ require 'sprockets/railtie'
15
+ require 'rails/test_unit/railtie'
16
+ require 'rails/engine/commands'
@@ -0,0 +1,31 @@
1
+ # Javascript Appends
2
+ Workarea.append_javascripts(
3
+ 'storefront.modules',
4
+ 'workarea/storefront/package_products/modules/family_product_add_to_cart'
5
+ )
6
+
7
+ Workarea.append_javascripts(
8
+ 'storefront.templates',
9
+ 'workarea/storefront/package_products/templates/family_add_to_cart_checkbox'
10
+ )
11
+
12
+ Workarea.append_stylesheets(
13
+ 'admin.components',
14
+ 'workarea/admin/package_products/components/product_cards'
15
+ )
16
+
17
+ Workarea.append_stylesheets(
18
+ 'storefront.components',
19
+ 'workarea/storefront/package_products/components/product_detail_packaged_products'
20
+ )
21
+
22
+ # Partial Appends
23
+ Workarea.append_partials(
24
+ 'admin.catalog_product_cards',
25
+ 'workarea/admin/catalog_products/packaged_products_card'
26
+ )
27
+
28
+ Workarea.append_partials(
29
+ 'admin.product_index_actions',
30
+ 'workarea/admin/catalog_products/create_package_button'
31
+ )
@@ -0,0 +1,6 @@
1
+ Workarea.configure do |config|
2
+ config.product_templates += %i(package family)
3
+ config.package_product_templates = %i(package family)
4
+ config.product_quickview_templates ||= []
5
+ config.product_quickview_templates -= config.package_product_templates
6
+ end
@@ -0,0 +1 @@
1
+ Workarea.config.seeds.insert_after('Workarea::ProductsSeeds', 'Workarea::PackageProductSeeds')
@@ -0,0 +1,45 @@
1
+ en:
2
+ workarea:
3
+ admin:
4
+ catalog_products:
5
+ cards:
6
+ packaged_products:
7
+ button: Manage Products
8
+ description: Package products appear on the product detail page.
9
+ empty: No packaged products.
10
+ empty_button: Add Products
11
+ title: Packaged Products
12
+ index:
13
+ add_new_package_product: Add New Package Product
14
+ create_catalog_package_products:
15
+ flash_messages:
16
+ packaged_products_saved: Packaged products have been saved
17
+ packaged_products:
18
+ continue_to_images: Continue to Images
19
+ instruction: Click on products to add them to the package.
20
+ no_matching_products: No matching products found
21
+ page_title: Products for %{product_name}
22
+ start_over: Start over
23
+ title: "%{product_name}: Add Products"
24
+ setup:
25
+ save_and_add_products: Save and Add Products
26
+ steps:
27
+ categorization: Categorization
28
+ content: Content
29
+ details: Details
30
+ images: Images
31
+ packaged_products: Packaged Products
32
+ publish: Publish
33
+ setup: Setup
34
+ workflow:
35
+ cancel_message: Are you sure? All work on this package will be lost.
36
+ skip_this: or skip this
37
+ create_catalog_products:
38
+ select:
39
+ button: Select and Continue
40
+ instruction: A product can contain either variants or other products. Pick the product type you wish you continue creating.
41
+ package: Package
42
+ package_description: A product that contains other products. Can be used to bundle similar or related products together on a single detail page.
43
+ standard: Standard
44
+ standard_description: A typical product that contains variants representing the options of a single product.
45
+ title: Select a type of product to create
@@ -0,0 +1,30 @@
1
+ Workarea::Admin::Engine.routes.draw do
2
+ scope '(:locale)', constraints: Workarea::I18n.routes_constraint do
3
+ resources :create_catalog_package_products, except: :show do
4
+ member do
5
+ get :packaged_products
6
+
7
+ get :details
8
+ post :save_details
9
+
10
+ get :images
11
+ post :save_images
12
+
13
+ get :content
14
+ post :save_content
15
+
16
+ get :categorization
17
+ post :save_categorization
18
+
19
+ get :publish
20
+ post :save_publish
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ Workarea::Storefront::Engine.routes.draw do
27
+ scope '(:locale)', constraints: Workarea::I18n.routes_constraint do
28
+ post 'cart/items/package', to: 'cart_items#package', as: :package_cart_items
29
+ end
30
+ end
@@ -0,0 +1,16 @@
1
+ namespace :dummy do
2
+ desc 'Add sample data for the Dummy project.'
3
+ task sample_data: :environment do
4
+ require 'workarea/sample_data/task'
5
+
6
+ # add require statement for new generators
7
+ require 'workarea/sample_data/generators/package_product_generator'
8
+
9
+ # Inserts a discount generator from host generator before ShippingMethodsGenerator
10
+ Workarea::SampleData.generators.insert(
11
+ Workarea::SampleData::Generators::PackageProductGenerator,
12
+ Workarea::SampleData::Generators::ProductsGenerator
13
+ )
14
+ Workarea::SampleData::Task.run
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ require 'workarea'
2
+ require 'workarea/storefront'
3
+ require 'workarea/admin'
4
+
5
+ require 'workarea/package_products/engine'
6
+
7
+ module Workarea
8
+ module PackageProducts
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ module Workarea
2
+ module PackageProducts
3
+ class Engine < ::Rails::Engine
4
+ include Workarea::Plugin
5
+ isolate_namespace Workarea::PackageProducts
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ module Workarea
2
+ module PackageProducts
3
+ VERSION = '3.3.3'.freeze
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require_relative 'config/application'
5
+
6
+ Rails.application.load_tasks
@@ -0,0 +1,4 @@
1
+
2
+ //= link_tree ../images
3
+ //= link_directory ../javascripts .js
4
+ //= link_directory ../stylesheets .css
File without changes
@@ -0,0 +1,13 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */