workarea-core 3.4.45 → 3.5.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
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