workarea-core 3.4.45 → 3.5.0.beta.1

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 (427) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +52 -0
  3. data/app/assets/javascripts/workarea/core/modules/duplicate_id.js +1 -5
  4. data/app/assets/javascripts/workarea/core/modules/style_guide_autocomplete_fields.js +9 -42
  5. data/app/assets/javascripts/workarea/core/modules/url.js +14 -0
  6. data/app/controllers/workarea/application_controller.rb +5 -1
  7. data/app/controllers/workarea/authentication.rb +15 -26
  8. data/app/controllers/workarea/authorization.rb +3 -3
  9. data/app/controllers/workarea/current_referrer.rb +1 -2
  10. data/app/controllers/workarea/current_release.rb +1 -1
  11. data/app/controllers/workarea/current_segments.rb +52 -0
  12. data/app/controllers/workarea/current_tracking.rb +45 -0
  13. data/app/controllers/workarea/http_caching.rb +30 -0
  14. data/app/controllers/workarea/impersonation.rb +18 -44
  15. data/app/helpers/workarea/schema_org_helper.rb +21 -0
  16. data/app/mailers/workarea/application_mailer.rb +2 -4
  17. data/app/middleware/workarea/application_middleware.rb +44 -0
  18. data/app/middleware/workarea/query_cache_middleware.rb +55 -0
  19. data/app/middleware/workarea/release_server_middleware.rb +1 -1
  20. data/app/models/workarea/application_document.rb +1 -1
  21. data/app/models/workarea/bulk_action/product_edit.rb +6 -6
  22. data/app/models/workarea/calculate_percent_change.rb +1 -1
  23. data/app/models/workarea/catalog/category.rb +0 -2
  24. data/app/models/workarea/catalog/product.rb +19 -2
  25. data/app/models/workarea/checkout/collect_payment.rb +10 -1
  26. data/app/models/workarea/checkout/fraud/analyzer.rb +44 -0
  27. data/app/models/workarea/checkout/fraud/no_decision_analyzer.rb +14 -0
  28. data/app/models/workarea/checkout/fraud/test_analyzer.rb +26 -0
  29. data/app/models/workarea/checkout.rb +18 -6
  30. data/app/models/workarea/configuration/admin.rb +25 -0
  31. data/app/models/workarea/configuration/params.rb +45 -0
  32. data/app/models/workarea/content/asset.rb +5 -18
  33. data/app/models/workarea/content/block.rb +8 -2
  34. data/app/models/workarea/content/block_draft.rb +7 -2
  35. data/app/models/workarea/content/block_type.rb +2 -2
  36. data/app/models/workarea/content/block_type_definition.rb +4 -0
  37. data/app/models/workarea/content/preset.rb +1 -1
  38. data/app/models/workarea/content.rb +12 -82
  39. data/app/models/workarea/data_file/csv.rb +6 -8
  40. data/app/models/workarea/data_file/import.rb +9 -1
  41. data/app/models/workarea/data_file/json.rb +1 -20
  42. data/app/models/workarea/data_file/operation.rb +0 -4
  43. data/app/models/workarea/data_file/tax_rates.rb +3 -0
  44. data/app/models/workarea/featured_products.rb +8 -0
  45. data/app/models/workarea/fulfillment/policies/base.rb +21 -0
  46. data/app/models/workarea/fulfillment/policies/download.rb +21 -0
  47. data/app/models/workarea/fulfillment/policies/ignore.rb +11 -0
  48. data/app/models/workarea/fulfillment/policies/ship.rb +15 -0
  49. data/app/models/workarea/fulfillment/sku.rb +72 -0
  50. data/app/models/workarea/fulfillment/token.rb +36 -0
  51. data/app/models/workarea/inquiry.rb +1 -2
  52. data/app/models/workarea/insights/customer_acquisition.rb +5 -9
  53. data/app/models/workarea/insights/trending_products.rb +2 -2
  54. data/app/models/workarea/insights/trending_searches.rb +2 -2
  55. data/app/models/workarea/inventory/collection.rb +30 -0
  56. data/app/models/workarea/inventory/collection_status.rb +40 -0
  57. data/app/models/workarea/metrics/affinity.rb +33 -0
  58. data/app/models/workarea/metrics/country_by_day.rb +4 -0
  59. data/app/models/workarea/metrics/product_by_day.rb +3 -0
  60. data/app/models/workarea/metrics/product_by_week.rb +2 -0
  61. data/app/models/workarea/metrics/product_for_last_week.rb +8 -12
  62. data/app/models/workarea/metrics/sales_by_day.rb +5 -0
  63. data/app/models/workarea/metrics/search_by_day.rb +1 -3
  64. data/app/models/workarea/metrics/search_for_last_week.rb +5 -11
  65. data/app/models/workarea/metrics/segment_by_day.rb +31 -0
  66. data/app/models/workarea/metrics/sku_by_day.rb +3 -0
  67. data/app/models/workarea/metrics/tender_by_day.rb +11 -0
  68. data/app/models/workarea/metrics/update_user_aggregations.rb +77 -0
  69. data/app/models/workarea/metrics/user.rb +73 -87
  70. data/app/models/workarea/navigation/breadcrumbs.rb +10 -1
  71. data/app/models/workarea/order/fraud_decision.rb +18 -0
  72. data/app/models/workarea/order/item.rb +5 -0
  73. data/app/models/workarea/order/queries.rb +1 -0
  74. data/app/models/workarea/order/status.rb +10 -1
  75. data/app/models/workarea/order.rb +47 -4
  76. data/app/models/workarea/payment/credit_card.rb +12 -0
  77. data/app/models/workarea/payment.rb +7 -2
  78. data/app/models/workarea/pricing/cache_key.rb +9 -3
  79. data/app/models/workarea/pricing/calculator.rb +5 -1
  80. data/app/models/workarea/pricing/calculators/tax_calculator.rb +32 -5
  81. data/app/models/workarea/pricing/discount/application_group.rb +8 -3
  82. data/app/models/workarea/pricing/discount/free_gift.rb +2 -1
  83. data/app/models/workarea/pricing/discount/redemption.rb +1 -1
  84. data/app/models/workarea/pricing/discount.rb +2 -3
  85. data/app/models/workarea/pricing/item_tax_applier.rb +41 -0
  86. data/app/models/workarea/pricing/price.rb +1 -0
  87. data/app/models/workarea/pricing/request.rb +11 -0
  88. data/app/models/workarea/pricing/sku.rb +1 -0
  89. data/app/models/workarea/pricing/tax_application.rb +21 -0
  90. data/app/models/workarea/pricing/tax_applier.rb +12 -15
  91. data/app/models/workarea/pricing/unsupported_segmentation.rb +22 -0
  92. data/app/models/workarea/product_rule.rb +5 -0
  93. data/app/models/workarea/releasable.rb +83 -89
  94. data/app/models/workarea/release/activation.rb +45 -0
  95. data/app/models/workarea/release/changes.rb +45 -0
  96. data/app/models/workarea/release/changeset.rb +42 -52
  97. data/app/models/workarea/release/preview.rb +28 -0
  98. data/app/models/workarea/release/status.rb +2 -24
  99. data/app/models/workarea/release.rb +72 -99
  100. data/app/models/workarea/release_session.rb +11 -11
  101. data/app/models/workarea/search/admin/catalog_product.rb +1 -2
  102. data/app/models/workarea/search/admin/fulfillment_sku.rb +27 -0
  103. data/app/models/workarea/search/admin/order.rb +1 -1
  104. data/app/models/workarea/search/admin/pricing_discount.rb +1 -1
  105. data/app/models/workarea/search/admin/release.rb +1 -4
  106. data/app/models/workarea/search/admin/segment.rb +19 -0
  107. data/app/models/workarea/search/admin.rb +17 -39
  108. data/app/models/workarea/search/order_text.rb +23 -6
  109. data/app/models/workarea/search/storefront/category_query.rb +152 -0
  110. data/app/models/workarea/search/storefront/product/categories.rb +11 -45
  111. data/app/models/workarea/search/storefront.rb +33 -29
  112. data/app/models/workarea/segment/first_time_customer.rb +8 -0
  113. data/app/models/workarea/segment/first_time_visitor.rb +12 -0
  114. data/app/models/workarea/segment/life_cycle.rb +44 -0
  115. data/app/models/workarea/segment/loyal_customer.rb +12 -0
  116. data/app/models/workarea/segment/returning_customer.rb +14 -0
  117. data/app/models/workarea/segment/returning_visitor.rb +12 -0
  118. data/app/models/workarea/segment/rules/base.rb +16 -0
  119. data/app/models/workarea/segment/rules/browser_info.rb +29 -0
  120. data/app/models/workarea/segment/rules/geolocation.rb +29 -0
  121. data/app/models/workarea/segment/rules/geolocation_option.rb +53 -0
  122. data/app/models/workarea/segment/rules/last_order.rb +14 -0
  123. data/app/models/workarea/segment/rules/logged_in.rb +13 -0
  124. data/app/models/workarea/segment/rules/orders.rb +17 -0
  125. data/app/models/workarea/segment/rules/revenue.rb +17 -0
  126. data/app/models/workarea/segment/rules/sessions.rb +17 -0
  127. data/app/models/workarea/segment/rules/tags.rb +14 -0
  128. data/app/models/workarea/segment/rules/traffic_referrer.rb +18 -0
  129. data/app/models/workarea/segment.rb +54 -0
  130. data/app/models/workarea/segmentable.rb +66 -0
  131. data/app/models/workarea/sort.rb +14 -2
  132. data/app/models/workarea/tax/rate.rb +35 -1
  133. data/app/models/workarea/user/authorization.rb +19 -13
  134. data/app/models/workarea/user/login.rb +4 -0
  135. data/app/models/workarea/user/password_reset.rb +1 -3
  136. data/app/queries/workarea/categorization.rb +3 -3
  137. data/app/queries/workarea/featured_categorization.rb +53 -0
  138. data/app/queries/workarea/order_cancellation_metrics.rb +155 -0
  139. data/app/queries/workarea/order_item_details.rb +16 -3
  140. data/app/queries/workarea/order_metrics.rb +32 -3
  141. data/app/queries/workarea/product_primary_navigation.rb +13 -2
  142. data/app/queries/workarea/product_releases.rb +38 -0
  143. data/app/queries/workarea/recommendation/user_activity_based.rb +14 -6
  144. data/app/queries/workarea/reports/average_order_value.rb +1 -1
  145. data/app/queries/workarea/reports/customers.rb +14 -11
  146. data/app/queries/workarea/reports/first_time_vs_returning_sales.rb +1 -1
  147. data/app/queries/workarea/reports/group_by_time.rb +13 -17
  148. data/app/queries/workarea/reports/sales_by_category.rb +1 -1
  149. data/app/queries/workarea/reports/sales_by_country.rb +10 -3
  150. data/app/queries/workarea/reports/sales_by_discount.rb +1 -1
  151. data/app/queries/workarea/reports/sales_by_menu.rb +1 -1
  152. data/app/queries/workarea/reports/sales_by_product.rb +39 -4
  153. data/app/queries/workarea/reports/sales_by_sku.rb +39 -4
  154. data/app/queries/workarea/reports/sales_by_tender.rb +42 -0
  155. data/app/queries/workarea/reports/sales_by_traffic_referrer.rb +1 -1
  156. data/app/queries/workarea/reports/sales_over_time.rb +10 -3
  157. data/app/queries/workarea/reports/searches.rb +1 -1
  158. data/app/queries/workarea/reports/searches_over_time.rb +1 -1
  159. data/app/queries/workarea/reports/searches_without_results_over_time.rb +1 -1
  160. data/app/queries/workarea/search/admin_fulfillment_skus.rb +20 -0
  161. data/app/queries/workarea/search/admin_releases.rb +1 -4
  162. data/app/queries/workarea/search/admin_search.rb +0 -4
  163. data/app/queries/workarea/search/admin_segments.rb +16 -0
  164. data/app/queries/workarea/search/admin_sorting.rb +1 -1
  165. data/app/queries/workarea/search/pagination.rb +1 -4
  166. data/app/queries/workarea/search/product_display_rules.rb +40 -8
  167. data/app/queries/workarea/search/product_entries.rb +15 -1
  168. data/app/queries/workarea/search/product_search.rb +4 -1
  169. data/app/queries/workarea/search/storefront_search/exact_matches.rb +1 -1
  170. data/app/queries/workarea/search/storefront_search/response.rb +6 -4
  171. data/app/queries/workarea/search/storefront_search.rb +5 -4
  172. data/app/seeds/workarea/assets_seeds.rb +2 -1
  173. data/app/seeds/workarea/insights_seeds.rb +0 -23
  174. data/app/seeds/workarea/orders_seeds.rb +7 -6
  175. data/app/seeds/workarea/products_seeds.rb +2 -0
  176. data/app/seeds/workarea/segments_seeds.rb +8 -0
  177. data/app/seeds/workarea/tax_seeds.rb +3 -3
  178. data/app/services/workarea/cancel_order.rb +8 -3
  179. data/app/services/workarea/copy_order.rb +6 -0
  180. data/app/services/workarea/create_fulfillment.rb +5 -3
  181. data/app/services/workarea/direct_upload.rb +11 -19
  182. data/app/services/workarea/hash_update.rb +1 -18
  183. data/app/services/workarea/packaging.rb +1 -1
  184. data/app/services/workarea/save_publishing.rb +5 -1
  185. data/app/workers/sidekiq/callbacks.rb +4 -52
  186. data/app/workers/sidekiq/callbacks_worker.rb +4 -6
  187. data/app/workers/workarea/bulk_index_admin.rb +2 -2
  188. data/app/workers/workarea/bulk_index_products.rb +6 -5
  189. data/app/workers/workarea/bulk_index_searches.rb +5 -5
  190. data/app/workers/workarea/deactivate_stale_discounts.rb +3 -3
  191. data/app/workers/workarea/generate_insights.rb +1 -1
  192. data/app/workers/workarea/index_admin_search.rb +1 -0
  193. data/app/workers/workarea/index_categorization.rb +4 -7
  194. data/app/workers/workarea/index_category.rb +2 -1
  195. data/app/workers/workarea/index_category_changes.rb +11 -6
  196. data/app/workers/workarea/index_fulfillment_changes.rb +2 -1
  197. data/app/workers/workarea/index_help.rb +2 -1
  198. data/app/workers/workarea/index_page.rb +2 -1
  199. data/app/workers/workarea/index_payment_transactions.rb +2 -1
  200. data/app/workers/workarea/index_product.rb +4 -4
  201. data/app/workers/workarea/index_product_children.rb +4 -3
  202. data/app/workers/workarea/index_product_rule.rb +3 -2
  203. data/app/workers/workarea/index_search_customizations.rb +3 -2
  204. data/app/workers/workarea/index_skus.rb +5 -6
  205. data/app/workers/workarea/keep_product_index_fresh.rb +3 -5
  206. data/app/workers/workarea/process_import.rb +3 -3
  207. data/app/workers/workarea/process_search_recommendations.rb +5 -9
  208. data/app/workers/workarea/publish_release.rb +1 -0
  209. data/app/workers/workarea/save_metrics.rb +116 -0
  210. data/app/workers/workarea/save_order_cancellation_metrics.rb +35 -0
  211. data/app/workers/workarea/save_order_metrics.rb +10 -74
  212. data/app/workers/workarea/status_reporter.rb +2 -4
  213. data/app/workers/workarea/synchronize_user_metrics.rb +17 -0
  214. data/app/workers/workarea/update_payment_profile_email.rb +22 -0
  215. data/app/workers/workarea/verify_scheduled_releases.rb +4 -11
  216. data/config/initializers/00_configuration.rb +185 -0
  217. data/config/initializers/02_assets.rb +1 -0
  218. data/config/initializers/05_scheduled_jobs.rb +0 -7
  219. data/config/initializers/10_rack_middleware.rb +2 -5
  220. data/config/initializers/11_payment.rb +4 -0
  221. data/config/initializers/13_rack_attack.rb +2 -4
  222. data/config/initializers/14_content_block_types.rb +16 -16
  223. data/config/initializers/15_endpoint_monitoring.rb +3 -6
  224. data/config/initializers/{21_premailer.rb → 24_premailer.rb} +1 -0
  225. data/config/initializers/{20_i18n_js.rb → 25_i18n_js.rb} +0 -0
  226. data/config/locales/en.yml +13 -24
  227. data/lib/generators/workarea/content_block_type/templates/initializer.rb +1 -1
  228. data/lib/generators/workarea/install/USAGE +0 -1
  229. data/lib/generators/workarea/install/install_generator.rb +0 -21
  230. data/lib/generators/workarea/install/templates/initializer.rb.erb +1 -1
  231. data/lib/tasks/insights.rake +1 -0
  232. data/lib/tasks/migrate.rake +106 -0
  233. data/lib/tasks/search.rake +17 -19
  234. data/lib/tasks/tests.rake +1 -1
  235. data/lib/workarea/cache.rb +6 -35
  236. data/lib/workarea/changelog.rake +2 -2
  237. data/lib/workarea/configuration/administrable/definition.rb +42 -0
  238. data/lib/workarea/configuration/administrable/field.rb +79 -0
  239. data/lib/workarea/configuration/administrable/fieldset.rb +44 -0
  240. data/lib/workarea/configuration/administrable_options.rb +24 -0
  241. data/lib/workarea/configuration/cache_store.rb +3 -1
  242. data/lib/workarea/configuration/content_blocks.rb +17 -0
  243. data/lib/workarea/configuration/mongoid.rb +1 -4
  244. data/lib/workarea/configuration/session.rb +36 -0
  245. data/lib/workarea/configuration/sidekiq.rb +3 -1
  246. data/lib/workarea/configuration.rb +121 -148
  247. data/lib/workarea/core/engine.rb +3 -58
  248. data/lib/workarea/core.rb +15 -11
  249. data/lib/workarea/elasticsearch/document.rb +8 -15
  250. data/lib/workarea/ext/freedom_patches/action_view_cache_helper.rb +4 -6
  251. data/lib/workarea/ext/freedom_patches/active_support_duration.rb +14 -0
  252. data/lib/workarea/ext/freedom_patches/money.rb +11 -0
  253. data/lib/workarea/ext/freedom_patches/premailer.rb +6 -0
  254. data/lib/workarea/ext/freedom_patches/string.rb +19 -4
  255. data/lib/workarea/ext/mongoid/find_ordered.rb +2 -2
  256. data/lib/workarea/ext/mongoid/lookup_hash.rb +30 -0
  257. data/lib/workarea/geolocation.rb +24 -6
  258. data/lib/workarea/routes_constraints/super_admin.rb +1 -1
  259. data/lib/workarea/version.rb +3 -4
  260. data/lib/workarea/visit.rb +92 -0
  261. data/lib/workarea/warnings.rb +95 -0
  262. data/lib/workarea.rb +102 -3
  263. data/test/dummy/config/initializers/session_store.rb +1 -1
  264. data/test/fixtures/tax_rates.csv +3 -3
  265. data/test/generators/workarea/content_block_type_generator_test.rb +1 -1
  266. data/test/generators/workarea/install_generator_test.rb +0 -13
  267. data/test/integration/workarea/authentication_test.rb +27 -4
  268. data/test/integration/workarea/authorization_test.rb +5 -0
  269. data/test/integration/workarea/cache_varies_integration_test.rb +21 -23
  270. data/test/integration/workarea/monitoring_integration_test.rb +5 -10
  271. data/test/javascripts/duplicate_id_spec.js +1 -7
  272. data/test/javascripts/fixtures/{duplicate_id_fail.html.haml → duplicate_id.html.haml} +0 -1
  273. data/test/javascripts/form_submitting_controls_spec.js +0 -1
  274. data/test/lib/workarea/asset_endpoints/favicons_test.rb +11 -13
  275. data/test/lib/workarea/configuration/administrable/definition_test.rb +71 -0
  276. data/test/lib/workarea/configuration/administrable/field_test.rb +128 -0
  277. data/test/lib/workarea/configuration/administrable/fieldset_test.rb +78 -0
  278. data/test/lib/workarea/configuration/configuration_test.rb +20 -0
  279. data/test/lib/workarea/elasticsearch/document_test.rb +0 -20
  280. data/test/lib/workarea/elasticsearch/query_cache_test.rb +7 -7
  281. data/test/lib/workarea/ext/freedom_patches/money_test.rb +11 -0
  282. data/test/lib/workarea/ext/mongoid/lookup_hash_test.rb +86 -0
  283. data/test/lib/workarea/geolocation_test.rb +20 -0
  284. data/test/mailers/workarea/application_mailer_test.rb +1 -11
  285. data/test/middleware/workarea/query_cache_middleware_test.rb +55 -0
  286. data/test/models/workarea/checkout/collect_payment_test.rb +14 -6
  287. data/test/models/workarea/checkout_test.rb +31 -57
  288. data/test/models/workarea/configuration/params_test.rb +37 -0
  289. data/test/models/workarea/data_file/csv_test.rb +8 -73
  290. data/test/models/workarea/data_file/import_test.rb +31 -0
  291. data/test/models/workarea/data_file/json_test.rb +6 -48
  292. data/test/models/workarea/data_file/tax_test.rb +3 -0
  293. data/test/models/workarea/fulfillment/policies/download_test.rb +39 -0
  294. data/test/models/workarea/fulfillment/sku_test.rb +54 -0
  295. data/test/models/workarea/insights/best_customers_test.rb +5 -2
  296. data/test/models/workarea/insights/best_full_price_customers_test.rb +5 -2
  297. data/test/models/workarea/insights/customer_acquisition_test.rb +1 -1
  298. data/test/models/workarea/insights/customers_at_risk_test.rb +1 -1
  299. data/test/models/workarea/insights/low_aov_customers_test.rb +1 -1
  300. data/test/models/workarea/inventory/collection_test.rb +75 -0
  301. data/test/models/workarea/metrics/affinity_test.rb +85 -0
  302. data/test/models/workarea/metrics/product_by_week_test.rb +27 -31
  303. data/test/models/workarea/metrics/search_by_day_test.rb +3 -0
  304. data/test/models/workarea/metrics/search_by_week_test.rb +27 -31
  305. data/test/models/workarea/metrics/update_user_aggregations_test.rb +62 -0
  306. data/test/models/workarea/metrics/user_test.rb +146 -63
  307. data/test/models/workarea/navigation/breadcrumbs_test.rb +12 -2
  308. data/test/models/workarea/order/queries_test.rb +2 -0
  309. data/test/models/workarea/order_test.rb +44 -0
  310. data/test/models/workarea/payment/address_test.rb +109 -111
  311. data/test/models/workarea/payment/credit_card_integration_test.rb +0 -52
  312. data/test/models/workarea/payment/credit_card_test.rb +5 -0
  313. data/test/models/workarea/pricing/cache_key_test.rb +7 -1
  314. data/test/models/workarea/pricing/calculators/tax_calculator_test.rb +41 -1
  315. data/test/models/workarea/pricing/discount/collection_test.rb +27 -29
  316. data/test/models/workarea/pricing/discount_test.rb +22 -24
  317. data/test/models/workarea/pricing/item_tax_applier_test.rb +83 -0
  318. data/test/models/workarea/pricing/price_test.rb +9 -0
  319. data/test/models/workarea/pricing/request_test.rb +13 -0
  320. data/test/models/workarea/pricing/sku_test.rb +9 -0
  321. data/test/models/workarea/releasable_active_test.rb +113 -0
  322. data/test/models/workarea/releasable_test.rb +69 -120
  323. data/test/models/workarea/release/changeset_test.rb +41 -0
  324. data/test/models/workarea/release_jobs_test.rb +52 -0
  325. data/test/models/workarea/release_previewing_test.rb +43 -0
  326. data/test/models/workarea/release_test.rb +59 -153
  327. data/test/models/workarea/search/admin/content_asset_test.rb +26 -28
  328. data/test/models/workarea/search/order_text_test.rb +35 -0
  329. data/test/models/workarea/search/storefront/category_query_test.rb +81 -0
  330. data/test/models/workarea/search/storefront/product/categories_test.rb +10 -70
  331. data/test/models/workarea/search/storefront/product_test.rb +10 -11
  332. data/test/models/workarea/search/storefront_test.rb +1 -13
  333. data/test/models/workarea/segment/life_cycle_test.rb +24 -0
  334. data/test/models/workarea/segment/rules/browser_info_test.rb +33 -0
  335. data/test/models/workarea/segment/rules/geolocation_option_test.rb +16 -0
  336. data/test/models/workarea/segment/rules/geolocation_test.rb +49 -0
  337. data/test/models/workarea/segment/rules/last_order_test.rb +32 -0
  338. data/test/models/workarea/segment/rules/logged_in_test.rb +25 -0
  339. data/test/models/workarea/segment/rules/orders_test.rb +59 -0
  340. data/test/models/workarea/segment/rules/revenue_test.rb +59 -0
  341. data/test/models/workarea/segment/rules/sessions_test.rb +26 -0
  342. data/test/models/workarea/segment/rules/tags_test.rb +27 -0
  343. data/test/models/workarea/segment/rules/traffic_referrer_test.rb +31 -0
  344. data/test/models/workarea/segment_test.rb +80 -0
  345. data/test/models/workarea/segmentable_test.rb +74 -0
  346. data/test/models/workarea/shipping/address_test.rb +109 -111
  347. data/test/models/workarea/shipping/sku_test.rb +8 -12
  348. data/test/models/workarea/user/password_reset_test.rb +4 -12
  349. data/test/models/workarea/user_test.rb +13 -10
  350. data/test/queries/workarea/admin_search_query_wrapper_test.rb +21 -25
  351. data/test/queries/workarea/categorization_test.rb +49 -0
  352. data/test/queries/workarea/featured_categorization_test.rb +66 -0
  353. data/test/queries/workarea/order_cancellation_metrics_test.rb +203 -0
  354. data/test/queries/workarea/order_item_details_test.rb +17 -0
  355. data/test/queries/workarea/order_metrics_test.rb +12 -0
  356. data/test/queries/workarea/product_releases_test.rb +56 -0
  357. data/test/queries/workarea/recommendation/searches_test.rb +3 -3
  358. data/test/queries/workarea/recommendation/user_activity_based_test.rb +4 -4
  359. data/test/queries/workarea/reports/customers_test.rb +12 -8
  360. data/test/queries/workarea/reports/report_test.rb +4 -6
  361. data/test/queries/workarea/reports/sales_by_country_test.rb +18 -3
  362. data/test/queries/workarea/reports/sales_by_product_test.rb +28 -8
  363. data/test/queries/workarea/reports/sales_by_sku_test.rb +28 -8
  364. data/test/queries/workarea/reports/sales_by_tender_test.rb +100 -0
  365. data/test/queries/workarea/reports/sales_by_traffic_referrer_test.rb +6 -6
  366. data/test/queries/workarea/search/admin_releases_test.rb +1 -26
  367. data/test/queries/workarea/search/admin_search_test.rb +0 -10
  368. data/test/queries/workarea/search/admin_users_test.rb +2 -2
  369. data/test/queries/workarea/search/category_browse_test.rb +53 -0
  370. data/test/queries/workarea/search/facet_sorting/size_test.rb +11 -13
  371. data/test/queries/workarea/search/pagination_test.rb +9 -26
  372. data/test/queries/workarea/search/product_entries_test.rb +27 -0
  373. data/test/queries/workarea/search/product_search_test.rb +0 -16
  374. data/test/queries/workarea/search/storefront_search/response_test.rb +26 -0
  375. data/test/queries/workarea/search/storefront_search_test.rb +34 -36
  376. data/test/services/workarea/cancel_order_test.rb +27 -13
  377. data/test/services/workarea/copy_order_test.rb +17 -0
  378. data/test/services/workarea/direct_upload_test.rb +1 -46
  379. data/test/services/workarea/export_report_test.rb +41 -45
  380. data/test/services/workarea/hash_update_test.rb +12 -12
  381. data/test/services/workarea/packaging_test.rb +9 -11
  382. data/test/services/workarea/save_publishing_test.rb +23 -0
  383. data/test/workers/sidekiq/callbacks_test.rb +0 -22
  384. data/test/workers/workarea/deactivate_stale_discounts_test.rb +2 -2
  385. data/test/workers/workarea/index_category_changes_test.rb +5 -7
  386. data/test/workers/workarea/keep_product_index_fresh_test.rb +1 -1
  387. data/test/workers/workarea/process_import_test.rb +0 -6
  388. data/test/workers/workarea/process_search_recommendations_test.rb +4 -5
  389. data/test/workers/workarea/status_reporter_test.rb +2 -1
  390. data/test/workers/workarea/synchronize_user_metrics_test.rb +57 -0
  391. data/test/workers/workarea/update_payment_profile_email_test.rb +27 -0
  392. data/test/workers/workarea/verify_scheduled_releases_test.rb +0 -26
  393. data/workarea-core.gemspec +13 -11
  394. metadata +196 -92
  395. data/app/assets/javascripts/workarea/core/templates/ui_menu_item.jst.ejs +0 -10
  396. data/app/controllers/workarea/admin_guest_browsing.rb +0 -54
  397. data/app/middleware/workarea/rack_cache_config_middleware.rb +0 -19
  398. data/app/queries/workarea/search/search_suggestions.rb +0 -43
  399. data/app/workers/workarea/bust_discount_cache.rb +0 -16
  400. data/app/workers/workarea/clean_user_activity.rb +0 -11
  401. data/app/workers/workarea/undo_release.rb +0 -15
  402. data/app/workers/workarea/update_email.rb +0 -33
  403. data/lib/generators/workarea/docker/USAGE +0 -16
  404. data/lib/generators/workarea/docker/docker_generator.rb +0 -61
  405. data/lib/generators/workarea/docker/templates/.env.erb +0 -6
  406. data/lib/generators/workarea/docker/templates/Dockerfile.erb +0 -48
  407. data/lib/generators/workarea/docker/templates/docker-compose.yml.erb +0 -72
  408. data/lib/generators/workarea/docker/templates/docker-entrypoint.sh.erb +0 -6
  409. data/lib/generators/workarea/docker/templates/docker-sync.yml.erb +0 -8
  410. data/lib/generators/workarea/docker/templates/docker-wait.sh +0 -11
  411. data/lib/generators/workarea/docker/templates/docker.env +0 -16
  412. data/lib/generators/workarea/docker/templates/docker_init.rb.erb +0 -29
  413. data/lib/workarea/configuration/headless_chrome.rb +0 -42
  414. data/lib/workarea/configuration/puma.rb +0 -37
  415. data/lib/workarea/ext/freedom_patches/i18n_js.rb +0 -27
  416. data/lib/workarea/ext/freedom_patches/mongoid_localized_defaults.rb +0 -25
  417. data/lib/workarea/ext/jbuilder/jbuilder_cache.rb +0 -29
  418. data/lib/workarea/ext/referer_parser/parser.decorator +0 -43
  419. data/lib/workarea/queues_pauser.rb +0 -26
  420. data/lib/workarea/robots.rb +0 -9
  421. data/test/generators/workarea/docker_generator_test.rb +0 -156
  422. data/test/javascripts/fixtures/duplicate_id_pass.html.haml +0 -2
  423. data/test/lib/workarea/ext/freedom_patches/mongoid_localized_defaults_test.rb +0 -25
  424. data/test/lib/workarea/ext/referer_parser/parser_test.rb +0 -20
  425. data/test/queries/workarea/search/search_suggestions_test.rb +0 -29
  426. data/test/workers/workarea/undo_release_test.rb +0 -23
  427. data/test/workers/workarea/update_email_test.rb +0 -39
@@ -2,6 +2,7 @@ module Workarea
2
2
  class SaveOrderMetrics
3
3
  include Sidekiq::Worker
4
4
  include Sidekiq::CallbacksWorker
5
+ include SaveMetrics
5
6
 
6
7
  sidekiq_options enqueue_on: { Order => :place }, queue: 'low'
7
8
 
@@ -15,87 +16,22 @@ module Workarea
15
16
  save_catalog(metrics)
16
17
  save_traffic(metrics)
17
18
  save_pricing(metrics)
19
+ save_tenders(metrics)
20
+ save_segments(metrics)
18
21
 
19
22
  order.metrics_saved!
20
23
  end
21
24
 
22
- def save_sales(metrics)
23
- Metrics::SalesByDay.inc(at: metrics.placed_at, **metrics.sales_data)
24
- end
25
-
26
25
  def save_user(metrics)
27
- Metrics::User.save_order(
28
- email: metrics.email,
29
- revenue: metrics.total_price,
30
- discounts: metrics.sales_data[:discounts],
31
- at: metrics.placed_at
26
+ Metrics::User.save_order(at: metrics.occured_at, **metrics.user_data)
27
+ Metrics::User.save_affinity(
28
+ id: metrics.email,
29
+ action: 'purchased',
30
+ product_ids: metrics.products.keys,
31
+ category_ids: metrics.categories.keys,
32
+ search_ids: metrics.searches.keys
32
33
  )
33
34
  end
34
-
35
- def save_catalog(metrics)
36
- metrics.products.each do |product_id, data|
37
- Metrics::ProductByDay.inc(
38
- key: { product_id: product_id },
39
- at: metrics.placed_at,
40
- **data
41
- )
42
- end
43
-
44
- metrics.categories.each do |category_id, data|
45
- Metrics::CategoryByDay.inc(
46
- key: { category_id: category_id },
47
- at: metrics.placed_at,
48
- **data
49
- )
50
- end
51
-
52
- metrics.skus.each do |sku, data|
53
- Metrics::SkuByDay.inc(
54
- key: { sku: sku },
55
- at: metrics.placed_at,
56
- **data
57
- )
58
- end
59
- end
60
-
61
- def save_traffic(metrics)
62
- if metrics.country.present?
63
- Metrics::CountryByDay.inc(
64
- key: { country: metrics.country },
65
- at: metrics.placed_at,
66
- **metrics.sales_data
67
- )
68
- end
69
-
70
- metrics.searches.each do |query_id, data|
71
- Metrics::SearchByDay.inc(
72
- key: { query_id: query_id },
73
- at: metrics.placed_at,
74
- **metrics.sales_data
75
- )
76
- end
77
-
78
- if metrics.traffic_referrer.present?
79
- Metrics::TrafficReferrerByDay.inc(
80
- key: {
81
- medium: metrics.traffic_referrer.medium,
82
- source: metrics.traffic_referrer.source
83
- },
84
- at: metrics.placed_at,
85
- **metrics.sales_data
86
- )
87
- end
88
- end
89
-
90
- def save_pricing(metrics)
91
- metrics.discounts.each do |discount_id, data|
92
- Metrics::DiscountByDay.inc(
93
- key: { discount_id: discount_id },
94
- at: metrics.placed_at,
95
- **data
96
- )
97
- end
98
- end
99
35
  end
100
36
 
101
37
  def perform(order_id)
@@ -3,10 +3,8 @@ module Workarea
3
3
  include Sidekiq::Worker
4
4
 
5
5
  def perform(*)
6
- emails = User.status_email_recipients
7
- yesterday = Time.current - 1.day
8
-
9
- Admin::StatusReportMailer.report(emails, yesterday).deliver_now
6
+ users = User.status_email_recipients.to_a
7
+ Admin::StatusReportMailer.report_to_many(users).each(&:deliver_now)
10
8
  end
11
9
  end
12
10
  end
@@ -0,0 +1,17 @@
1
+ module Workarea
2
+ class SynchronizeUserMetrics
3
+ include Sidekiq::Worker
4
+ include Sidekiq::CallbacksWorker
5
+
6
+ sidekiq_options(
7
+ enqueue_on: { User => :save, only_if: -> { admin_changed? || tags_changed? } },
8
+ queue: 'low'
9
+ )
10
+
11
+ def perform(id)
12
+ user = User.find(id)
13
+ metrics = Metrics::User.find_or_create_by(id: user.email)
14
+ metrics.set(admin: user.admin?, tags: user.tags)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ module Workarea
2
+ class UpdatePaymentProfileEmail
3
+ include Sidekiq::Worker
4
+ include Sidekiq::CallbacksWorker
5
+
6
+ sidekiq_options(
7
+ enqueue_on: { User => :update, with: -> { [id, changes] } }
8
+ )
9
+
10
+ def perform(id, changes)
11
+ if changes['email'].present? && changes['email'].first.present?
12
+ old_email = changes['email'].first
13
+ new_email = changes['email'].last
14
+
15
+ user = User.find(id)
16
+ user.email = old_email # set old email so we lookup by old email value
17
+
18
+ Payment::Profile.update_email(PaymentReference.new(user), new_email)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,14 +1,15 @@
1
1
  module Workarea
2
- # Verify that jobs for publishing and undoing releases do not get removed
3
- # unintentionally from sidekiq and prevent the release from updating at the
2
+ # Verify that jobs for publishing releases do not get removed
3
+ # unintentionally from Sidekiq and prevent the release from updating at the
4
4
  # expected time. If any are found missing, add a new job.
5
5
  # Runs hourly by default, 5 minutes before each hour.
6
6
  #
7
7
  class VerifyScheduledReleases
8
8
  include Sidekiq::Worker
9
+ sidekiq_options queue: 'releases'
9
10
 
10
11
  def perform(*)
11
- # Both PublishRelease and UndoRelease use the default queue,
12
+ # PublishRelease uses the default queue,
12
13
  # so only look there for scheduled release jobs
13
14
  job_ids = Sidekiq::Queue.new.map { |job| job.jid }
14
15
  now = Time.current
@@ -21,14 +22,6 @@ module Workarea
21
22
  release.set_publish_job
22
23
  release.save!
23
24
  end
24
-
25
- if release.undo_at.present? &&
26
- release.undo_at > now &&
27
- !job_ids.include?(release.undo_job_id)
28
-
29
- release.set_undo_job
30
- release.save!
31
- end
32
25
  end
33
26
  end
34
27
  end
@@ -0,0 +1,185 @@
1
+ Workarea::Configuration.define_fields do
2
+ fieldset 'Users', namespaced: false do
3
+ field 'Allowed Login Attempts',
4
+ type: :integer,
5
+ default: 6,
6
+ description: 'How many failed login attempts before marking the user locked out'
7
+
8
+ field 'Password Reset Timeout',
9
+ type: :duration,
10
+ default: 2.hours,
11
+ description: 'How long a password reset URL stays valid'
12
+
13
+ field 'Password Strength',
14
+ type: :symbol,
15
+ default: :weak,
16
+ values: [
17
+ ['Weak', :weak, title: 'Requires minimum 7 characters'],
18
+ ['Medium', :medium, title: 'Requires minimum 7 characters of letters and numbers'],
19
+ ['Strong', :strong, title: 'Requires minimum 8 characters consisting of letters, numbers, and special characters.']
20
+ ],
21
+ description: 'Password requirement level for customers. Admin users always require a strong password.'
22
+ end
23
+
24
+ fieldset 'Checkout', namespaced: false do
25
+ field 'Checkout Expiration',
26
+ type: :duration,
27
+ default: 15.minutes,
28
+ description: 'How long a checkout can be idle before the user is forced to restart'
29
+
30
+ field 'Item Count Limit',
31
+ type: :integer,
32
+ default: 100,
33
+ description: 'How many unique items can be added to a single cart'
34
+ end
35
+
36
+ fieldset 'Orders', namespaced: false do
37
+ field 'Order Active Period',
38
+ type: :duration,
39
+ default: 2.hours,
40
+ description: 'How long an order is active without changing before considering it abandoned'
41
+
42
+ field 'Order Expiration Period',
43
+ type: :duration,
44
+ default: 6.months,
45
+ description: 'How long to wait until abandoned orders are deleted from the database'
46
+
47
+ field 'Recent Order Count',
48
+ type: :integer,
49
+ default: 3,
50
+ description: 'Number of orders to show in account summary dashboard'
51
+
52
+ field 'Storefront User Order Display Count',
53
+ type: :integer,
54
+ default: 50,
55
+ description: 'Number of orders to display on the user order history page'
56
+ end
57
+
58
+ fieldset 'Shipping', namespaced: false do
59
+ field 'Allow Shipping Address P.O. Box',
60
+ id: :allow_shipping_address_po_box,
61
+ type: :boolean,
62
+ default: false,
63
+ description: 'Whether or not to allow P.O. Box addresses for shipping addresses'
64
+
65
+ field 'Shipping Dimensions',
66
+ type: :array,
67
+ default: [1, 1, 1],
68
+ description: %(
69
+ Default package dimensions to use for calculating shipping costs.
70
+ It's recommended to set these to your average or standard box size when
71
+ using shipping rates from a carrier. Dimensions on specific shipping SKUs
72
+ will override this value.
73
+ ).squish
74
+
75
+ field 'Shipping Origin',
76
+ type: :hash,
77
+ default: {
78
+ country: 'US',
79
+ state: 'PA',
80
+ city: 'Philadelphia',
81
+ zip: '19106'
82
+ },
83
+ description: 'Origin location for calculating shipping costs'
84
+ end
85
+
86
+ fieldset 'Payment', namespaced: false do
87
+ field 'Allow Payment Address P.O. Box',
88
+ id: :allow_payment_address_po_box,
89
+ type: :boolean,
90
+ default: true,
91
+ description: 'Whether or not to allow P.O. Box addresses for billing addresses'
92
+ end
93
+
94
+ fieldset 'Inventory', namespaced: false do
95
+ field 'Low Inventory Threshold',
96
+ type: :integer,
97
+ default: 5,
98
+ description: 'Minimum available quantity for a sku before inventory is considered low'
99
+ end
100
+
101
+ fieldset 'Content', namespaced: false do
102
+ field 'Minimum Content Search Words',
103
+ type: :integer,
104
+ default: 5,
105
+ description: 'Minimum number of words for content to be searchable on the storefront'
106
+
107
+ field 'Placeholder Text',
108
+ type: :string,
109
+ default: %(
110
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin sagittis
111
+ faucibus augue, sit amet mattis leo tincidunt ac. Nullam vulputate
112
+ eleifend enim. Nunc eu lorem semper, convallis ipsum pharetra, pretium
113
+ metus. Donec lobortis dolor ac metus vulputate vulputate nec at nulla.
114
+ Suspendisse potenti. Praesent placerat elementum justo quis malesuada.
115
+ Donec sollicitudin ligula augue, rutrum vestibulum ex rutrum in.
116
+ Integer id orci eu nisl accumsan suscipit a ut sapien. Nam non justo at
117
+ nibh laoreet tempus. Sed sagittis velit eu tellus imperdiet, et ultricies
118
+ justo aliquet. Fusce id felis sem.
119
+ ).squish,
120
+ description: 'Placeholder text used for content block default data'
121
+ end
122
+
123
+ fieldset 'Search', namespaced: false do
124
+ field 'Default Search Facet Result Sizes',
125
+ type: :integer,
126
+ default: 10,
127
+ description: 'The number of filter results returned for each filter type.'
128
+
129
+ field 'Search Facet Result Sizes',
130
+ type: :hash,
131
+ values_type: :integer,
132
+ default: { color: 10, size: 10 },
133
+ description: %(
134
+ The number of filter results returned for any specified filter type. If no
135
+ size is defined for a filter type, the default will be what is specified
136
+ in the default config above.
137
+ ).squish
138
+
139
+ field 'Search Size Facet Sort',
140
+ id: :search_facet_size_sort,
141
+ type: :array,
142
+ default: ['Extra Small', 'Small', 'Medium', 'Large', 'Extra Large'],
143
+ description: %(
144
+ The order the size facets will be displayed on storefront search results
145
+ and category browse.
146
+ ).squish
147
+
148
+ field 'Search Sufficient Results',
149
+ type: :integer,
150
+ default: 2,
151
+ description: %(
152
+ The minimum number of search results required to consider the results
153
+ sufficient. If a search result set is not sufficient, the search will
154
+ try another pass with looser options to bring in more matches.
155
+ ).squish
156
+
157
+ field 'Search Suggestions',
158
+ type: :integer,
159
+ default: 5,
160
+ description: 'How many search suggestions should be shown in the autocomplete searches.'
161
+ end
162
+
163
+ fieldset 'Communication', namespaced: false do
164
+ field 'Email From',
165
+ type: :string,
166
+ default: 'noreply@example.com',
167
+ description: 'The email address used as the sender of system emails'
168
+
169
+ field 'Email To',
170
+ type: :string,
171
+ default: 'customerservice@example.com',
172
+ description: 'The email address that receives user generated emails, e.g. contact us inquiries'
173
+
174
+ field 'Inquiry Subjects',
175
+ type: :hash,
176
+ default: {
177
+ 'orders' => 'Orders',
178
+ 'returns' => 'Returns and Exchanges',
179
+ 'products' => 'Product Information',
180
+ 'feedback' => 'Feedback',
181
+ 'general' => 'General Inquiry'
182
+ },
183
+ description: 'Subjects list for the contact form'
184
+ end
185
+ end
@@ -8,6 +8,7 @@ Rails.application.config.assets.precompile += %w(
8
8
  workarea/storefront/style_guide_product.jpg
9
9
  workarea/**/*.svg
10
10
  workarea/**/email.css
11
+ workarea/admin/email_logo.png
11
12
  )
12
13
 
13
14
  InlineSvg.configure do |config|
@@ -13,13 +13,6 @@ unless Workarea.config.skip_service_connections
13
13
  queue: 'low'
14
14
  )
15
15
 
16
- Sidekiq::Cron::Job.create(
17
- name: 'Workarea::CleanUserActivity',
18
- klass: 'Workarea::CleanUserActivity',
19
- cron: "0 0 * * * #{Time.zone.tzinfo.identifier}",
20
- queue: 'low'
21
- )
22
-
23
16
  Sidekiq::Cron::Job.create(
24
17
  name: 'Workarea::ProcessProductRecommendations',
25
18
  klass: 'Workarea::ProcessProductRecommendations',
@@ -7,7 +7,6 @@ if !app.config.action_dispatch.rack_cache
7
7
  else
8
8
  require 'rack/cache'
9
9
  app.config.middleware.insert_after Rack::Cache, Dragonfly::Middleware, :workarea
10
- app.config.middleware.insert_before Rack::Cache, Workarea::RackCacheConfigMiddleware
11
10
  end
12
11
 
13
12
  unless Rails.env.test? || Rails.env.development?
@@ -23,7 +22,5 @@ Rails.application.config.middleware.insert_after(
23
22
  )
24
23
 
25
24
  app.config.middleware.use Workarea::EnforceHostMiddleware
26
-
27
- if Rails.env.test?
28
- app.config.middleware.insert(0, Workarea::StripHttpCachingMiddleware)
29
- end
25
+ app.config.middleware.insert(0, Workarea::ApplicationMiddleware)
26
+ app.config.middleware.insert(0, Workarea::StripHttpCachingMiddleware) if Rails.env.test?
@@ -2,6 +2,10 @@ if Rails.env.test? || Rails.env.development?
2
2
  ActiveMerchant::Billing::Base.mode = :test
3
3
  end
4
4
 
5
+ if Rails.env.test?
6
+ Workarea.config.fraud_analyzer = "Workarea::Checkout::Fraud::TestAnalyzer"
7
+ end
8
+
5
9
  if Workarea.config.gateways.credit_card.blank?
6
10
  Workarea.config.gateways.credit_card = ActiveMerchant::Billing::BogusGateway.new
7
11
  ActiveMerchant::Billing::Base.mode = :test
@@ -30,7 +30,7 @@ class Rack::Attack
30
30
  #
31
31
  # Key: "rack::attack:ignore/cookies/admin"
32
32
  safelist('ignore/admins') do |request|
33
- request.cookies['cache'] == 'false'
33
+ request.env['workarea.visit']&.admin?
34
34
  end
35
35
 
36
36
  #
@@ -157,9 +157,7 @@ class Rack::Attack
157
157
  # number is usable.
158
158
  #
159
159
  blocklist('req/credit_cards') do |request|
160
- key = [request.ip, request.cookies['user_id']].reject(&:blank?).join('/')
161
-
162
- Rack::Attack::Allow2Ban.filter(key, maxretry: 10, findtime: 1.hour, bantime: 1.day) do
160
+ Rack::Attack::Allow2Ban.filter(request.ip, maxretry: 10, findtime: 1.hour, bantime: 1.day) do
163
161
  request.path =~ /place_order|credit_cards/ && !request.get?
164
162
  end
165
163
  end
@@ -1,4 +1,4 @@
1
- Workarea::Content.define_block_types do
1
+ Workarea.define_content_block_types do
2
2
  #
3
3
  # Columnar Blocks
4
4
  #
@@ -8,8 +8,8 @@ Workarea::Content.define_block_types do
8
8
  description 'Positionable button over a background image.'
9
9
 
10
10
  fieldset 'Image' do
11
- field 'Asset', :asset, required: true, file_types: 'image', default: find_asset_id_by_file_name('960x470_light.png')
12
- field 'Alt Text', :string, default: 'An Image'
11
+ field 'Asset', :asset, required: true, file_types: 'image', default: find_asset_id_by_file_name('960x470_light.png'), alt_field: 'Alt Text'
12
+ field 'Alt Text', :string, default: ''
13
13
  end
14
14
 
15
15
  fieldset 'Button' do
@@ -38,8 +38,8 @@ Workarea::Content.define_block_types do
38
38
  tags %w(image)
39
39
  description 'An image with an optional link.'
40
40
 
41
- field 'Image', :asset, required: true, file_types: 'image', default: find_asset_id_by_file_name('960x470_light.png')
42
- field 'Alt', :string, default: 'An Image'
41
+ field 'Image', :asset, required: true, file_types: 'image', default: find_asset_id_by_file_name('960x470_light.png'), alt_field: 'Alt'
42
+ field 'Alt', :string, default: ''
43
43
  field 'Link', :url, default: '/'
44
44
  field 'Align', :options, values: %w(Left Center Right), default: 'Center'
45
45
  end
@@ -77,8 +77,8 @@ Workarea::Content.define_block_types do
77
77
  end
78
78
 
79
79
  fieldset 'Image' do
80
- field 'Image', :asset, file_types: 'image', default: find_asset_id_by_file_name('100x100.png')
81
- field 'Image Alt', :string, default: 'An Image'
80
+ field 'Image', :asset, file_types: 'image', default: find_asset_id_by_file_name('100x100.png'), alt_field: 'Image Alt'
81
+ field 'Image Alt', :string, default: ''
82
82
  field 'Image Link', :url, default: '/'
83
83
  field 'Image Position', :options, values: %w(Right Left), default: 'Left'
84
84
  end
@@ -96,8 +96,8 @@ Workarea::Content.define_block_types do
96
96
  end
97
97
 
98
98
  fieldset 'Image' do
99
- field 'Image', :asset, file_types: 'image', default: find_asset_id_by_file_name('100x100.png')
100
- field 'Image Alt', :string, default: 'An Image'
99
+ field 'Image', :asset, file_types: 'image', default: find_asset_id_by_file_name('100x100.png'), alt_field: 'Image Alt'
100
+ field 'Image Alt', :string, default: ''
101
101
  field 'Image Link', :url, default: '/'
102
102
  field 'Image Position', :options, values: %w(Right Left), default: 'Left'
103
103
  end
@@ -115,8 +115,8 @@ Workarea::Content.define_block_types do
115
115
  end
116
116
 
117
117
  fieldset 'Image' do
118
- field 'Image', :asset, file_types: 'image', default: find_asset_id_by_file_name('100x100.png')
119
- field 'Image Alt', :string, default: 'An Image'
118
+ field 'Image', :asset, file_types: 'image', default: find_asset_id_by_file_name('100x100.png'), alt_field: 'Image Alt'
119
+ field 'Image Alt', :string, default: ''
120
120
  field 'Image Link', :url, default: '/'
121
121
  field 'Image Position', :options, values: %w(Right Left), default: 'Left'
122
122
  end
@@ -126,7 +126,7 @@ Workarea::Content.define_block_types do
126
126
  tags %w(quote)
127
127
  description 'A block of text styled like a quote.'
128
128
 
129
- field 'Quote', :text, required: true, default: Workarea.config.placeholder_text
129
+ field 'Quote', :text, required: true, default: -> { Workarea.config.placeholder_text }
130
130
  field 'Author', :string, default: ''
131
131
  end
132
132
 
@@ -140,8 +140,8 @@ Workarea::Content.define_block_types do
140
140
  description 'A group of images.'
141
141
 
142
142
  series 6 do
143
- field 'Image', :asset, default: find_asset_id_by_file_name('960x470_dark.png')
144
- field 'Alt', :string, default: 'An Image'
143
+ field 'Image', :asset, default: find_asset_id_by_file_name('960x470_dark.png'), alt_field: 'Alt'
144
+ field 'Alt', :string, default: ''
145
145
  field 'Link', :url, default: '/'
146
146
  end
147
147
  end
@@ -151,8 +151,8 @@ Workarea::Content.define_block_types do
151
151
  description 'Image and formatted text including headings, lists, bold, and italic.'
152
152
 
153
153
  fieldset 'Image' do
154
- field 'Image', :asset, required: true, file_types: 'image', default: find_asset_id_by_file_name('100x100.png')
155
- field 'Image Alt', :string, default: 'An Image'
154
+ field 'Image', :asset, required: true, file_types: 'image', default: find_asset_id_by_file_name('100x100.png'), alt_field: 'Image Alt'
155
+ field 'Image Alt', :string, default: ''
156
156
  field 'Image Link', :url, default: '/'
157
157
  field 'Image Position', :options, values: %w(Right Left), default: 'Left'
158
158
  end
@@ -3,8 +3,7 @@
3
3
  #
4
4
  Easymon::Repository.add(
5
5
  'mongodb',
6
- Workarea::Monitoring::MongoidCheck.new,
7
- :critical
6
+ Workarea::Monitoring::MongoidCheck.new
8
7
  )
9
8
 
10
9
  #
@@ -12,8 +11,7 @@ Easymon::Repository.add(
12
11
  #
13
12
  Easymon::Repository.add(
14
13
  'elasticsearch',
15
- Workarea::Monitoring::ElasticsearchCheck.new,
16
- :critical
14
+ Workarea::Monitoring::ElasticsearchCheck.new
17
15
  )
18
16
 
19
17
  #
@@ -23,8 +21,7 @@ Easymon::Repository.add(
23
21
  "redis",
24
22
  Easymon::RedisCheck.new(
25
23
  Workarea::Configuration::Redis.persistent.to_h
26
- ),
27
- :critical
24
+ )
28
25
  )
29
26
 
30
27
  #
@@ -1,3 +1,4 @@
1
1
  Premailer::Rails.config.merge!(
2
+ remove_scripts: false,
2
3
  create_shorthands: false
3
4
  )
@@ -50,33 +50,12 @@ en:
50
50
  unit: instance
51
51
  csv:
52
52
  unit: row
53
- duration:
54
- years:
55
- one: '%{count} year'
56
- other: '%{count} years'
57
- months:
58
- one: '%{count} month'
59
- other: '%{count} months'
60
- weeks:
61
- one: '%{count} week'
62
- other: '%{count} weeks'
63
- days:
64
- one: '%{count} day'
65
- other: '%{count} days'
66
- hours:
67
- one: '%{count} hour'
68
- other: '%{count} hours'
69
- minutes:
70
- one: '%{count} minute'
71
- other: '%{count} minutes'
72
- seconds:
73
- one: '%{count} second'
74
- other: '%{count} seconds'
75
53
  errors:
76
54
  messages:
77
55
  contains_type: cannot contain 'type'
78
56
  not_a_date: must be a date
79
57
  invalid_credit_card_number: is not a valid credit card number
58
+ invalid_credit_card_issuer: '%{value} cards are not accepted. We accept %{issuers}.'
80
59
  expired_date: is an expired date
81
60
  incomplete: is incomplete
82
61
  must_be_future: must be in the future
@@ -91,14 +70,16 @@ en:
91
70
  must_be_unique: must be unique
92
71
  not_star_query: "cannot be '*'"
93
72
  undo_unpublished_release: cannot be set when Publish Date is blank
73
+ max_allowed_segments: You cannot have more than 15 total segments in Workarea.
74
+ unsupported_segmentation: aren't supported for pricing.
94
75
  facets:
95
76
  price_range:
96
77
  over: 'Over %{price}'
97
78
  under: 'Under %{price}'
79
+ fulfillment_sku:
80
+ name: "Fulfillment SKU %{id}"
98
81
  inventory_sku:
99
82
  name: "Inventory %{id}"
100
- inquiry:
101
- subjects: {}
102
83
  order:
103
84
  name: "Order %{id}"
104
85
  traffic_referrer:
@@ -108,6 +89,8 @@ en:
108
89
  search: search
109
90
  social: social
110
91
  unknown: unknown
92
+ errors:
93
+ count_limit: Orders cannot exceed %{size} items.
111
94
  messages:
112
95
  info: Info
113
96
  error: Error
@@ -131,10 +114,14 @@ en:
131
114
  description: Price Override
132
115
  pricing_sku:
133
116
  name: "Pricing %{id}"
117
+ release:
118
+ undo: Undo %{name}
134
119
  sorts:
135
120
  available: Available
136
121
  average_order_value: Average Order Total
122
+ country: Country
137
123
  destination: Destination
124
+ downloads: Most Downloaded
138
125
  end: End Date
139
126
  last_updated: Recently Updated
140
127
  modified: Last Updated
@@ -147,6 +134,7 @@ en:
147
134
  path: Path
148
135
  pending: Pending
149
136
  popularity: Most Popular
137
+ postal_code: Postal Code
150
138
  price_asc: Price, Low to High
151
139
  price_desc: Price, High to Low
152
140
  published_date: Published Date
@@ -154,6 +142,7 @@ en:
154
142
  query: Search Terms
155
143
  rating: Highest Rated
156
144
  redemptions: Most Redeemed
145
+ region: Region
157
146
  relevance: Relevance
158
147
  sales: Sales
159
148
  sku: SKU
@@ -1,3 +1,3 @@
1
- Workarea::Content.define_block_types do
1
+ Workarea.define_content_block_types do
2
2
 
3
3
  end