workarea-admin 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 (388) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +52 -0
  3. data/app/assets/images/workarea/admin/email_logo.png +0 -0
  4. data/app/assets/javascripts/workarea/admin/application.js.erb +11 -1
  5. data/app/assets/javascripts/workarea/admin/config.js.erb +96 -0
  6. data/app/assets/javascripts/workarea/admin/modules/active_by_segment_tooltips.js +108 -0
  7. data/app/assets/javascripts/workarea/admin/modules/calendars.js +1 -1
  8. data/app/assets/javascripts/workarea/admin/modules/categorized_autocomplete_fields.js +1 -1
  9. data/app/assets/javascripts/workarea/admin/modules/impersonation_notification.js +44 -0
  10. data/app/assets/javascripts/workarea/admin/modules/jump_to_menus.js +74 -0
  11. data/app/assets/javascripts/workarea/admin/modules/new_navigation_taxons.js +1 -2
  12. data/app/assets/javascripts/workarea/admin/modules/release_reminder.js +1 -0
  13. data/app/assets/javascripts/workarea/admin/modules/selects.js +33 -0
  14. data/app/assets/javascripts/workarea/admin/modules/style_guide_autocomplete_fields.js +42 -0
  15. data/app/assets/javascripts/workarea/admin/modules/timeline_report_chart.js +105 -0
  16. data/app/assets/javascripts/workarea/admin/modules/toggle_elements.js +27 -0
  17. data/app/assets/javascripts/workarea/admin/modules/tribute_areas.js +91 -0
  18. data/app/assets/javascripts/workarea/admin/templates/chart_legend.jst.ejs +17 -9
  19. data/app/assets/javascripts/workarea/admin/templates/jump_to_menu.jst.ejs +13 -0
  20. data/app/assets/stylesheets/workarea/admin/application.scss.erb +3 -0
  21. data/app/assets/stylesheets/workarea/admin/base/_forms.scss +2 -2
  22. data/app/assets/stylesheets/workarea/admin/components/_activity.scss +24 -16
  23. data/app/assets/stylesheets/workarea/admin/components/_activity_group.scss +3 -19
  24. data/app/assets/stylesheets/workarea/admin/components/_box.scss +21 -5
  25. data/app/assets/stylesheets/workarea/admin/components/_calendar.scss +102 -140
  26. data/app/assets/stylesheets/workarea/admin/components/_chart_legend.scss +10 -13
  27. data/app/assets/stylesheets/workarea/admin/components/_checkbox.scss +49 -23
  28. data/app/assets/stylesheets/workarea/admin/components/_content_block_list.scss +5 -3
  29. data/app/assets/stylesheets/workarea/admin/components/_date_marker.scss +24 -3
  30. data/app/assets/stylesheets/workarea/admin/components/_index_table.scss +5 -0
  31. data/app/assets/stylesheets/workarea/admin/components/_jump_to_menu.scss +57 -0
  32. data/app/assets/stylesheets/workarea/admin/components/_product_summary.scss +46 -0
  33. data/app/assets/stylesheets/workarea/admin/components/_toggle_button.scss +1 -4
  34. data/app/assets/stylesheets/workarea/admin/email/_base.scss +30 -2
  35. data/app/assets/stylesheets/workarea/admin/email/_components.scss +66 -5
  36. data/app/assets/stylesheets/workarea/admin/email/_helpers.scss +16 -5
  37. data/app/assets/stylesheets/workarea/admin/email/{_settings.scss → _settings.scss.erb} +4 -4
  38. data/app/controllers/workarea/admin/application_controller.rb +2 -4
  39. data/app/controllers/workarea/admin/bulk_action_sequential_product_edits_controller.rb +4 -6
  40. data/app/controllers/workarea/admin/bulk_variant_saving.rb +1 -2
  41. data/app/controllers/workarea/admin/catalog_products_controller.rb +4 -6
  42. data/app/controllers/workarea/admin/catalog_variants_controller.rb +2 -3
  43. data/app/controllers/workarea/admin/comments_controller.rb +9 -0
  44. data/app/controllers/workarea/admin/configurations_controller.rb +29 -0
  45. data/app/controllers/workarea/admin/content_assets_controller.rb +3 -1
  46. data/app/controllers/workarea/admin/content_blocks_controller.rb +1 -7
  47. data/app/controllers/workarea/admin/create_catalog_products_controller.rb +2 -8
  48. data/app/controllers/workarea/admin/create_release_undos_controller.rb +43 -0
  49. data/app/controllers/workarea/admin/create_segments_controller.rb +68 -0
  50. data/app/controllers/workarea/admin/dashboards_controller.rb +2 -0
  51. data/app/controllers/workarea/admin/data_file_imports_controller.rb +7 -2
  52. data/app/controllers/workarea/admin/fulfillment_skus_controller.rb +58 -0
  53. data/app/controllers/workarea/admin/fulfillment_tokens_controller.rb +56 -0
  54. data/app/controllers/workarea/admin/guest_browsings_controller.rb +2 -2
  55. data/app/controllers/workarea/admin/impersonations_controller.rb +3 -4
  56. data/app/controllers/workarea/admin/orders_controller.rb +3 -0
  57. data/app/controllers/workarea/admin/pricing_discount_redemptions_controller.rb +13 -0
  58. data/app/controllers/workarea/admin/pricing_overrides_controller.rb +1 -1
  59. data/app/controllers/workarea/admin/product_rules_controller.rb +1 -2
  60. data/app/controllers/workarea/admin/releases_controller.rb +8 -13
  61. data/app/controllers/workarea/admin/reports_controller.rb +18 -0
  62. data/app/controllers/workarea/admin/segment_overrides_controller.rb +19 -0
  63. data/app/controllers/workarea/admin/segment_rules_controller.rb +62 -0
  64. data/app/controllers/workarea/admin/segments_controller.rb +48 -0
  65. data/app/controllers/workarea/admin/tax_rates_controller.rb +62 -1
  66. data/app/controllers/workarea/admin/unsubscribes_controller.rb +40 -0
  67. data/app/controllers/workarea/admin/users_controller.rb +19 -0
  68. data/app/helpers/workarea/admin/application_helper.rb +2 -12
  69. data/app/helpers/workarea/admin/configurations_helper.rb +9 -0
  70. data/app/helpers/workarea/admin/content_helper.rb +2 -3
  71. data/app/helpers/workarea/admin/fulfillment_helper.rb +10 -0
  72. data/app/helpers/workarea/admin/icons_helper.rb +26 -0
  73. data/app/helpers/workarea/admin/navigation_helper.rb +1 -0
  74. data/app/helpers/workarea/admin/pricing_overrides_helper.rb +1 -1
  75. data/app/helpers/workarea/admin/products_helper.rb +13 -0
  76. data/app/helpers/workarea/admin/releases_helper.rb +5 -21
  77. data/app/helpers/workarea/admin/segments_helper.rb +68 -0
  78. data/app/helpers/workarea/admin/settings_helper.rb +11 -3
  79. data/app/mailers/workarea/admin/comment_mailer.rb +3 -3
  80. data/app/mailers/workarea/admin/status_report_mailer.rb +19 -6
  81. data/app/view_models/workarea/admin/bulk_action_product_edit_view_model.rb +5 -0
  82. data/app/view_models/workarea/admin/changeset_view_model.rb +15 -3
  83. data/app/view_models/workarea/admin/code_list_view_model.rb +1 -1
  84. data/app/view_models/workarea/admin/commentable_view_model.rb +4 -0
  85. data/app/view_models/workarea/admin/content_view_model.rb +2 -0
  86. data/app/view_models/workarea/admin/dashboards/marketing_view_model.rb +5 -9
  87. data/app/view_models/workarea/admin/dashboards/reports_view_model.rb +25 -0
  88. data/app/view_models/workarea/admin/discounts/buy_some_get_some_view_model.rb +6 -0
  89. data/app/view_models/workarea/admin/discounts/category_view_model.rb +6 -0
  90. data/app/view_models/workarea/admin/discounts/free_gift_view_model.rb +6 -0
  91. data/app/view_models/workarea/admin/discounts/order_total_view_model.rb +6 -0
  92. data/app/view_models/workarea/admin/discounts/product_attribute_view_model.rb +6 -0
  93. data/app/view_models/workarea/admin/discounts/product_view_model.rb +6 -0
  94. data/app/view_models/workarea/admin/discounts/quantity_fixed_price_view_model.rb +6 -0
  95. data/app/view_models/workarea/admin/discounts/shipping_view_model.rb +6 -0
  96. data/app/view_models/workarea/admin/featured_products_view_model.rb +6 -12
  97. data/app/view_models/workarea/admin/fulfillment_sku_view_model.rb +22 -0
  98. data/app/view_models/workarea/admin/fulfillment_token_view_model.rb +15 -0
  99. data/app/view_models/workarea/admin/fulfillment_view_model.rb +14 -0
  100. data/app/view_models/workarea/admin/insight_view_model.rb +2 -2
  101. data/app/view_models/workarea/admin/insights/product_view_model.rb +2 -2
  102. data/app/view_models/workarea/admin/insights/segment_view_model.rb +25 -0
  103. data/app/view_models/workarea/admin/order_view_model.rb +4 -0
  104. data/app/view_models/workarea/admin/pricing_sku_view_model.rb +0 -51
  105. data/app/view_models/workarea/admin/product_rules_preview_view_model.rb +2 -2
  106. data/app/view_models/workarea/admin/product_view_model.rb +26 -5
  107. data/app/view_models/workarea/admin/recommendations_view_model.rb +3 -11
  108. data/app/view_models/workarea/admin/release_calendar_view_model.rb +4 -9
  109. data/app/view_models/workarea/admin/release_event_view_model.rb +8 -41
  110. data/app/view_models/workarea/admin/release_view_model.rb +10 -17
  111. data/app/view_models/workarea/admin/releases_feed_view_model.rb +5 -13
  112. data/app/view_models/workarea/admin/reports/customers_view_model.rb +4 -2
  113. data/app/view_models/workarea/admin/reports/low_inventory_view_model.rb +2 -5
  114. data/app/view_models/workarea/admin/reports/sales_by_category_view_model.rb +2 -5
  115. data/app/view_models/workarea/admin/reports/sales_by_discount_view_model.rb +2 -5
  116. data/app/view_models/workarea/admin/reports/sales_by_product_view_model.rb +2 -5
  117. data/app/view_models/workarea/admin/reports/sales_by_tender_view_model.rb +13 -0
  118. data/app/view_models/workarea/admin/reports/timeline_view_model.rb +74 -0
  119. data/app/view_models/workarea/admin/search_customization_product_rules_view_model.rb +1 -1
  120. data/app/view_models/workarea/admin/segment_view_model.rb +19 -0
  121. data/app/view_models/workarea/admin/user_view_model.rb +6 -9
  122. data/app/view_models/workarea/admin/variant_view_model.rb +8 -0
  123. data/app/views/layouts/workarea/admin/application.html.haml +1 -1
  124. data/app/views/layouts/workarea/admin/email.html.haml +35 -41
  125. data/app/views/workarea/admin/activities/_configuration_admin_update.html.haml +10 -0
  126. data/app/views/workarea/admin/activities/_fulfillment_sku_create.html.haml +12 -0
  127. data/app/views/workarea/admin/activities/_fulfillment_sku_destroy.html.haml +10 -0
  128. data/app/views/workarea/admin/activities/_fulfillment_sku_update.html.haml +10 -0
  129. data/app/views/workarea/admin/activities/_segment_create.html.haml +12 -0
  130. data/app/views/workarea/admin/activities/_segment_destroy.html.haml +10 -0
  131. data/app/views/workarea/admin/activities/_segment_update.html.haml +10 -0
  132. data/app/views/workarea/admin/activities/show.html.haml +18 -11
  133. data/app/views/workarea/admin/bulk_action_product_edits/edit.html.haml +4 -0
  134. data/app/views/workarea/admin/bulk_action_product_edits/review.html.haml +11 -4
  135. data/app/views/workarea/admin/bulk_action_sequential_product_edits/product.html.haml +1 -1
  136. data/app/views/workarea/admin/catalog_categories/_cards.html.haml +3 -1
  137. data/app/views/workarea/admin/catalog_categories/edit.html.haml +1 -4
  138. data/app/views/workarea/admin/catalog_categories/index.html.haml +1 -0
  139. data/app/views/workarea/admin/catalog_product_images/edit.html.haml +1 -1
  140. data/app/views/workarea/admin/catalog_products/_cards.html.haml +2 -4
  141. data/app/views/workarea/admin/catalog_products/edit.html.haml +2 -1
  142. data/app/views/workarea/admin/catalog_products/index.html.haml +4 -2
  143. data/app/views/workarea/admin/catalog_products/insights.html.haml +2 -0
  144. data/app/views/workarea/admin/catalog_variants/edit.html.haml +6 -1
  145. data/app/views/workarea/admin/catalog_variants/index.html.haml +2 -0
  146. data/app/views/workarea/admin/catalog_variants/new.html.haml +5 -0
  147. data/app/views/workarea/admin/changesets/fields/_active_segment_ids.html.haml +4 -0
  148. data/app/views/workarea/admin/comment_mailer/notify.html.haml +27 -19
  149. data/app/views/workarea/admin/comments/index.html.haml +18 -12
  150. data/app/views/workarea/admin/configurations/_overridden.html.haml +2 -0
  151. data/app/views/workarea/admin/configurations/show.html.haml +49 -0
  152. data/app/views/workarea/admin/configurations/types/_array.html.haml +3 -0
  153. data/app/views/workarea/admin/configurations/types/_boolean.html.haml +1 -0
  154. data/app/views/workarea/admin/configurations/types/_duration.html.haml +2 -0
  155. data/app/views/workarea/admin/configurations/types/_encrypted.html.haml +1 -0
  156. data/app/views/workarea/admin/configurations/types/_float.html.haml +1 -0
  157. data/app/views/workarea/admin/configurations/types/_hash.html.haml +17 -0
  158. data/app/views/workarea/admin/configurations/types/_integer.html.haml +1 -0
  159. data/app/views/workarea/admin/configurations/types/_select.html.haml +1 -0
  160. data/app/views/workarea/admin/configurations/types/_string.html.haml +1 -0
  161. data/app/views/workarea/admin/configurations/types/_symbol.html.haml +1 -0
  162. data/app/views/workarea/admin/content/_edit.html.haml +8 -1
  163. data/app/views/workarea/admin/content/_form.html.haml +13 -7
  164. data/app/views/workarea/admin/content/advanced.html.haml +18 -10
  165. data/app/views/workarea/admin/content_assets/_cards.html.haml +3 -0
  166. data/app/views/workarea/admin/content_assets/_summary.html.haml +1 -1
  167. data/app/views/workarea/admin/content_assets/edit.html.haml +6 -0
  168. data/app/views/workarea/admin/content_assets/index.html.haml +7 -2
  169. data/app/views/workarea/admin/content_assets/new.html.haml +10 -3
  170. data/app/views/workarea/admin/content_blocks/_asset.html.haml +8 -1
  171. data/app/views/workarea/admin/content_pages/_cards.html.haml +1 -0
  172. data/app/views/workarea/admin/content_pages/edit.html.haml +1 -1
  173. data/app/views/workarea/admin/content_pages/index.html.haml +1 -0
  174. data/app/views/workarea/admin/create_catalog_categories/publish.html.haml +1 -0
  175. data/app/views/workarea/admin/create_catalog_products/content.html.haml +1 -1
  176. data/app/views/workarea/admin/create_catalog_products/publish.html.haml +1 -0
  177. data/app/views/workarea/admin/create_content_pages/publish.html.haml +1 -0
  178. data/app/views/workarea/admin/create_pricing_discounts/publish.html.haml +1 -0
  179. data/app/views/workarea/admin/create_release_undos/new.html.haml +45 -0
  180. data/app/views/workarea/admin/create_release_undos/review.html.haml +51 -0
  181. data/app/views/workarea/admin/create_releases/plan.html.haml +4 -3
  182. data/app/views/workarea/admin/create_releases/setup.html.haml +8 -12
  183. data/app/views/workarea/admin/create_segments/rules.html.haml +55 -0
  184. data/app/views/workarea/admin/create_segments/setup.html.haml +42 -0
  185. data/app/views/workarea/admin/create_users/admin.html.haml +0 -2
  186. data/app/views/workarea/admin/dashboards/catalog.html.haml +1 -0
  187. data/app/views/workarea/admin/dashboards/people.html.haml +1 -1
  188. data/app/views/workarea/admin/dashboards/reports.html.haml +31 -0
  189. data/app/views/workarea/admin/dashboards/settings.html.haml +23 -3
  190. data/app/views/workarea/admin/data_file_imports/new.html.haml +4 -2
  191. data/app/views/workarea/admin/data_file_mailer/export.html.haml +2 -0
  192. data/app/views/workarea/admin/data_file_mailer/import.html.haml +2 -0
  193. data/app/views/workarea/admin/data_file_mailer/import_failure.html.haml +2 -0
  194. data/app/views/workarea/admin/facets/_applied.html.haml +1 -1
  195. data/app/views/workarea/admin/featured_products/_selected.html.haml +3 -2
  196. data/app/views/workarea/admin/featured_products/_unselected.html.haml +3 -1
  197. data/app/views/workarea/admin/featured_products/edit.html.haml +3 -3
  198. data/app/views/workarea/admin/featured_products/select.html.haml +0 -1
  199. data/app/views/workarea/admin/fulfillment_skus/_aux_navigation.html.haml +3 -0
  200. data/app/views/workarea/admin/fulfillment_skus/_cards.html.haml +57 -0
  201. data/app/views/workarea/admin/fulfillment_skus/_summary.html.haml +6 -0
  202. data/app/views/workarea/admin/fulfillment_skus/edit.html.haml +53 -0
  203. data/app/views/workarea/admin/fulfillment_skus/index.html.haml +75 -0
  204. data/app/views/workarea/admin/fulfillment_skus/new.html.haml +41 -0
  205. data/app/views/workarea/admin/fulfillment_skus/show.html.haml +17 -0
  206. data/app/views/workarea/admin/fulfillment_tokens/index.html.haml +73 -0
  207. data/app/views/workarea/admin/fulfillments/show.html.haml +41 -6
  208. data/app/views/workarea/admin/insights/_most_discounted_products.html.haml +4 -4
  209. data/app/views/workarea/admin/inventory_skus/show.html.haml +1 -1
  210. data/app/views/workarea/admin/navigation_menus/_summary.html.haml +1 -1
  211. data/app/views/workarea/admin/navigation_menus/edit.html.haml +1 -1
  212. data/app/views/workarea/admin/navigation_menus/index.html.haml +3 -1
  213. data/app/views/workarea/admin/navigation_redirects/index.html.haml +0 -5
  214. data/app/views/workarea/admin/navigation_taxons/index.html.haml +20 -4
  215. data/app/views/workarea/admin/orders/_cards.html.haml +23 -5
  216. data/app/views/workarea/admin/orders/attributes.html.haml +4 -1
  217. data/app/views/workarea/admin/orders/fraud.html.haml +43 -0
  218. data/app/views/workarea/admin/orders/index.html.haml +1 -0
  219. data/app/views/workarea/admin/orders/timeline.html.haml +1 -1
  220. data/app/views/workarea/admin/pricing_discount_code_lists/_cards.html.haml +1 -1
  221. data/app/views/workarea/admin/pricing_discount_code_lists/promo_codes.html.haml +1 -1
  222. data/app/views/workarea/admin/pricing_discount_redemptions/index.html.haml +44 -0
  223. data/app/views/workarea/admin/pricing_discounts/_cards.html.haml +22 -0
  224. data/app/views/workarea/admin/pricing_discounts/conditions/_segments.html.haml +5 -0
  225. data/app/views/workarea/admin/pricing_discounts/edit.html.haml +5 -15
  226. data/app/views/workarea/admin/pricing_discounts/index.html.haml +1 -0
  227. data/app/views/workarea/admin/pricing_discounts/properties/_buy_some_get_some.html.haml +1 -0
  228. data/app/views/workarea/admin/pricing_discounts/properties/_category.html.haml +1 -0
  229. data/app/views/workarea/admin/pricing_discounts/properties/_free_gift.html.haml +1 -0
  230. data/app/views/workarea/admin/pricing_discounts/properties/_order_total.html.haml +1 -0
  231. data/app/views/workarea/admin/pricing_discounts/properties/_product.html.haml +1 -0
  232. data/app/views/workarea/admin/pricing_discounts/properties/_product_attribute.html.haml +2 -1
  233. data/app/views/workarea/admin/pricing_discounts/properties/_quantity_fixed_price.html.haml +1 -0
  234. data/app/views/workarea/admin/pricing_discounts/properties/_shipping.html.haml +1 -0
  235. data/app/views/workarea/admin/pricing_skus/_cards.html.haml +7 -7
  236. data/app/views/workarea/admin/pricing_skus/edit.html.haml +5 -5
  237. data/app/views/workarea/admin/pricing_skus/index.html.haml +4 -4
  238. data/app/views/workarea/admin/pricing_skus/new.html.haml +6 -9
  239. data/app/views/workarea/admin/product_rules/_card.html.haml +2 -2
  240. data/app/views/workarea/admin/product_rules/_form.html.haml +1 -0
  241. data/app/views/workarea/admin/product_rules/index.html.haml +2 -0
  242. data/app/views/workarea/admin/releases/_cards.html.haml +50 -12
  243. data/app/views/workarea/admin/releases/_publish.html.haml +1 -1
  244. data/app/views/workarea/admin/releases/edit.html.haml +33 -46
  245. data/app/views/workarea/admin/releases/index.html.haml +81 -90
  246. data/app/views/workarea/admin/releases/list.html.haml +107 -0
  247. data/app/views/workarea/admin/releases/original.html.haml +50 -0
  248. data/app/views/workarea/admin/releases/show.html.haml +3 -17
  249. data/app/views/workarea/admin/releases/undo.html.haml +64 -0
  250. data/app/views/workarea/admin/reports/average_order_value.html.haml +1 -1
  251. data/app/views/workarea/admin/reports/customers.html.haml +4 -0
  252. data/app/views/workarea/admin/reports/first_time_vs_returning_sales.html.haml +1 -1
  253. data/app/views/workarea/admin/reports/reference.html.haml +19 -60
  254. data/app/views/workarea/admin/reports/sales_by_country.html.haml +6 -0
  255. data/app/views/workarea/admin/reports/sales_by_product.html.haml +6 -0
  256. data/app/views/workarea/admin/reports/sales_by_sku.html.haml +6 -0
  257. data/app/views/workarea/admin/reports/sales_by_tender.html.haml +30 -0
  258. data/app/views/workarea/admin/reports/sales_over_time.html.haml +5 -1
  259. data/app/views/workarea/admin/reports/timeline.html.haml +20 -0
  260. data/app/views/workarea/admin/search_customizations/_cards.html.haml +1 -0
  261. data/app/views/workarea/admin/search_customizations/edit.html.haml +1 -1
  262. data/app/views/workarea/admin/search_customizations/index.html.haml +1 -0
  263. data/app/views/workarea/admin/searches/show.html.haml +6 -5
  264. data/app/views/workarea/admin/segment_overrides/show.html.haml +29 -0
  265. data/app/views/workarea/admin/segment_rules/_form.html.haml +13 -0
  266. data/app/views/workarea/admin/segment_rules/fields/_browser_info.html.haml +13 -0
  267. data/app/views/workarea/admin/segment_rules/fields/_geolocation.html.haml +4 -0
  268. data/app/views/workarea/admin/segment_rules/fields/_last_order.html.haml +3 -0
  269. data/app/views/workarea/admin/segment_rules/fields/_logged_in.html.haml +2 -0
  270. data/app/views/workarea/admin/segment_rules/fields/_orders.html.haml +5 -0
  271. data/app/views/workarea/admin/segment_rules/fields/_revenue.html.haml +9 -0
  272. data/app/views/workarea/admin/segment_rules/fields/_sessions.html.haml +5 -0
  273. data/app/views/workarea/admin/segment_rules/fields/_tags.html.haml +4 -0
  274. data/app/views/workarea/admin/segment_rules/fields/_traffic_referrer.html.haml +13 -0
  275. data/app/views/workarea/admin/segment_rules/geolocation_options.json.jbuilder +4 -0
  276. data/app/views/workarea/admin/segment_rules/index.html.haml +25 -0
  277. data/app/views/workarea/admin/segment_rules/summaries/_browser_info.html.haml +11 -0
  278. data/app/views/workarea/admin/segment_rules/summaries/_geolocation.html.haml +2 -0
  279. data/app/views/workarea/admin/segment_rules/summaries/_last_order.html.haml +2 -0
  280. data/app/views/workarea/admin/segment_rules/summaries/_logged_in.html.haml +5 -0
  281. data/app/views/workarea/admin/segment_rules/summaries/_orders.html.haml +6 -0
  282. data/app/views/workarea/admin/segment_rules/summaries/_revenue.html.haml +7 -0
  283. data/app/views/workarea/admin/segment_rules/summaries/_sessions.html.haml +6 -0
  284. data/app/views/workarea/admin/segment_rules/summaries/_tags.html.haml +2 -0
  285. data/app/views/workarea/admin/segment_rules/summaries/_traffic_referrer.html.haml +10 -0
  286. data/app/views/workarea/admin/segments/_cards.html.haml +81 -0
  287. data/app/views/workarea/admin/segments/_publish.html.haml +10 -0
  288. data/app/views/workarea/admin/segments/edit.html.haml +41 -0
  289. data/app/views/workarea/admin/segments/index.html.haml +64 -0
  290. data/app/views/workarea/admin/segments/insights.html.haml +52 -0
  291. data/app/views/workarea/admin/segments/show.html.haml +20 -0
  292. data/app/views/workarea/admin/shared/_active_field.html.haml +17 -0
  293. data/app/views/workarea/admin/shared/_bulk_actions.html.haml +10 -8
  294. data/app/views/workarea/admin/shared/_primary_nav.html.haml +5 -2
  295. data/app/views/workarea/admin/shared/_toggle_button.html.haml +1 -1
  296. data/app/views/workarea/admin/shipping_services/edit.html.haml +0 -4
  297. data/app/views/workarea/admin/shipping_services/new.html.haml +0 -4
  298. data/app/views/workarea/admin/status_report_mailer/report.html.haml +83 -86
  299. data/app/views/workarea/admin/style_guides/components/_activity.html.haml +3 -5
  300. data/app/views/workarea/admin/style_guides/components/_activity_group.html.haml +9 -15
  301. data/app/views/workarea/admin/style_guides/components/_box.html.haml +12 -7
  302. data/app/views/workarea/admin/style_guides/components/_checkbox.html.haml +21 -2
  303. data/app/views/workarea/admin/style_guides/components/_release_changeset.html.haml +3 -5
  304. data/app/views/workarea/admin/tax_rates/edit.html.haml +64 -0
  305. data/app/views/workarea/admin/tax_rates/index.html.haml +59 -20
  306. data/app/views/workarea/admin/tax_rates/new.html.haml +62 -0
  307. data/app/views/workarea/admin/timeline/show.html.haml +34 -41
  308. data/app/views/workarea/admin/toolbar/show.html.haml +11 -1
  309. data/app/views/workarea/admin/trash/index.html.haml +1 -1
  310. data/app/views/workarea/admin/users/edit.html.haml +60 -57
  311. data/app/views/workarea/admin/users/index.html.haml +1 -3
  312. data/app/views/workarea/admin/users/index.json.jbuilder +8 -0
  313. data/app/views/workarea/admin/users/insights.html.haml +31 -23
  314. data/app/views/workarea/admin/users/permissions.html.haml +10 -1
  315. data/app/views/workarea/admin/users/show.html.haml +7 -0
  316. data/config/locales/en.yml +569 -124
  317. data/config/routes.rb +57 -5
  318. data/lib/workarea/mailer_previews/admin/status_report_mailer_preview.rb +3 -1
  319. data/public/workarea/import_samples/tax_rates.csv +3 -3
  320. data/test/dummy/config/initializers/session_store.rb +1 -1
  321. data/test/helpers/workarea/admin/application_helper_test.rb +0 -16
  322. data/test/helpers/workarea/admin/icons_helper_test.rb +9 -0
  323. data/test/helpers/workarea/admin/products_helper_test.rb +73 -0
  324. data/test/helpers/workarea/admin/releases_helper_test.rb +0 -49
  325. data/test/helpers/workarea/admin/settings_helper_test.rb +22 -1
  326. data/test/integration/workarea/admin/assets_integration_test.rb +2 -5
  327. data/test/integration/workarea/admin/comments_integration_test.rb +27 -7
  328. data/test/integration/workarea/admin/configurations_integration_test.rb +21 -0
  329. data/test/integration/workarea/admin/create_release_undos_integration_test.rb +29 -0
  330. data/test/integration/workarea/admin/create_segments_integration_test.rb +26 -0
  331. data/test/integration/workarea/admin/data_file_imports_integration_test.rb +34 -8
  332. data/test/integration/workarea/admin/fulfillment_skus_integration_test.rb +55 -0
  333. data/test/integration/workarea/admin/fulfillment_tokens_integration_test.rb +43 -0
  334. data/test/integration/workarea/admin/guest_browsings_integration_test.rb +8 -32
  335. data/test/integration/workarea/admin/impersonations_integration_test.rb +13 -57
  336. data/test/integration/workarea/admin/jump_to_integration_test.rb +0 -29
  337. data/test/integration/workarea/admin/pricing_overrides_integration_test.rb +11 -0
  338. data/test/integration/workarea/admin/products_integration_test.rb +0 -13
  339. data/test/integration/workarea/admin/releases_integration_test.rb +71 -87
  340. data/test/integration/workarea/admin/segment_overrides_integration_test.rb +28 -0
  341. data/test/integration/workarea/admin/segment_rules_integration_test.rb +49 -0
  342. data/test/integration/workarea/admin/segments_integration_test.rb +31 -0
  343. data/test/integration/workarea/admin/shipping_service_integration_test.rb +1 -3
  344. data/test/integration/workarea/admin/tax_categories_integration_test.rb +1 -1
  345. data/test/integration/workarea/admin/unsubscribes_integration_test.rb +32 -0
  346. data/test/integration/workarea/admin/users_integration_test.rb +32 -0
  347. data/test/javascripts/fixtures/release_reminder.html.haml +3 -3
  348. data/test/javascripts/new_navigation_taxons_spec.js +1 -12
  349. data/test/mailers/workarea/admin/comment_mailer_test.rb +35 -0
  350. data/test/mailers/workarea/admin/status_report_mailer_test.rb +30 -25
  351. data/test/system/workarea/admin/alerts_system_test.rb +2 -1
  352. data/test/system/workarea/admin/bulk_actions_system_test.rb +1 -1
  353. data/test/system/workarea/admin/comments_system_test.rb +43 -0
  354. data/test/system/workarea/admin/content_system_test.rb +6 -0
  355. data/test/system/workarea/admin/dashboard_system_test.rb +8 -9
  356. data/test/system/workarea/admin/data_files_system_test.rb +1 -1
  357. data/test/system/workarea/admin/discounts_system_test.rb +18 -0
  358. data/test/system/workarea/admin/featured_products_system_test.rb +3 -0
  359. data/test/system/workarea/admin/fulfillment_skus_system_test.rb +48 -0
  360. data/test/system/workarea/admin/impersonation_system_test.rb +5 -2
  361. data/test/system/workarea/admin/orders_system_test.rb +32 -21
  362. data/test/system/workarea/admin/payment_transactions_system_test.rb +34 -32
  363. data/test/system/workarea/admin/releases_system_test.rb +151 -37
  364. data/test/system/workarea/admin/reports_system_test.rb +29 -0
  365. data/test/system/workarea/admin/segments_system_test.rb +124 -0
  366. data/test/system/workarea/admin/tax_categories_system_test.rb +166 -16
  367. data/test/system/workarea/admin/users_system_test.rb +15 -0
  368. data/test/view_models/workarea/admin/changeset_view_model_test.rb +59 -9
  369. data/test/view_models/workarea/admin/code_list_view_model_test.rb +0 -5
  370. data/test/view_models/workarea/admin/content_view_model_test.rb +13 -11
  371. data/test/view_models/workarea/admin/insights/product_view_model_test.rb +4 -4
  372. data/test/view_models/workarea/admin/insights/segment_view_model_test.rb +73 -0
  373. data/test/view_models/workarea/admin/product_rules_preview_view_model_test.rb +37 -0
  374. data/test/view_models/workarea/admin/product_view_model_test.rb +13 -19
  375. data/test/view_models/workarea/admin/release_calendar_view_model_test.rb +16 -0
  376. data/test/view_models/workarea/admin/release_view_model_test.rb +13 -56
  377. data/test/view_models/workarea/admin/releases_feed_view_model_test.rb +8 -21
  378. data/test/view_models/workarea/admin/reports/timeline_view_model_test.rb +76 -0
  379. data/test/view_models/workarea/admin/search_analysis_view_model_test.rb +14 -16
  380. data/test/view_models/workarea/admin/timeline_view_model_test.rb +1 -1
  381. metadata +128 -17
  382. data/app/views/workarea/admin/featured_products/_release_preview_warning.html.haml +0 -4
  383. data/app/views/workarea/admin/releases/calendar.html.haml +0 -54
  384. data/test/dummy/tmp/screenshots/.keep +0 -0
  385. data/test/helpers/workarea/admin/content_helper_test.rb +0 -17
  386. data/test/integration/workarea/admin/index_tracking_integration_test.rb +0 -21
  387. data/test/javascripts/fixtures/existing_navigation_taxon.html.haml +0 -10
  388. data/test/view_models/workarea/admin/pricing_sku_view_model_test.rb +0 -84
@@ -0,0 +1,48 @@
1
+ module Workarea
2
+ module Admin
3
+ class SegmentsController < Admin::ApplicationController
4
+ required_permissions :people
5
+
6
+ before_action :find_segment, except: :index
7
+
8
+ def index
9
+ query = Search::AdminSegments.new(params)
10
+ @search = SearchViewModel.new(query, view_model_options)
11
+ @segments = SegmentViewModel.wrap(Segment.all, view_model_options)
12
+ end
13
+
14
+ def show
15
+ end
16
+
17
+ def edit
18
+ end
19
+
20
+ def update
21
+ if @segment.update_attributes(params[:segment])
22
+ flash[:success] = t('workarea.admin.segments.flash_messages.saved')
23
+ redirect_to segment_path(@segment)
24
+ else
25
+ flash[:error] = @segment.errors.full_messages.to_sentence
26
+ render :edit, status: :unprocessable_entity
27
+ end
28
+ end
29
+
30
+ def insights
31
+ end
32
+
33
+ def destroy
34
+ head :unprocessable_entity && return if @segment.life_cycle?
35
+
36
+ @segment.destroy
37
+ flash[:success] = t('workarea.admin.segments.flash_messages.removed')
38
+ redirect_to segments_path
39
+ end
40
+
41
+ private
42
+
43
+ def find_segment
44
+ @segment = Admin::SegmentViewModel.new(Segment.find(params[:id]))
45
+ end
46
+ end
47
+ end
48
+ end
@@ -3,11 +3,72 @@ module Workarea
3
3
  class TaxRatesController < Admin::ApplicationController
4
4
  required_permissions :catalog
5
5
 
6
+ before_action :find_category
7
+ before_action :find_rate, only: [:edit, :update, :destroy]
8
+
6
9
  def index
10
+ @rates = @category.rates.search(params[:q])
11
+ .page(params[:page])
12
+ .order_by(find_sort(Tax::Rate))
13
+ end
14
+
15
+ def new
16
+ @rate = @category.rates.new
17
+ end
18
+
19
+ def create
20
+ if @category.rates.new(rate_params).save
21
+ flash[:success] = t('workarea.admin.tax_rates.flash_messages.saved')
22
+ redirect_to tax_category_rates_path
23
+ else
24
+ flash[:error] = t('workarea.admin.tax_rates.flash_messages.changes_error')
25
+ render :new
26
+ end
27
+ end
28
+
29
+ def edit
30
+ end
31
+
32
+ def update
33
+ if @rate.update_attributes(rate_params)
34
+ flash[:success] = t('workarea.admin.tax_rates.flash_messages.saved')
35
+ redirect_to tax_category_rates_path
36
+ else
37
+ flash[:error] = t('workarea.admin.tax_rates.flash_messages.changes_error')
38
+ render :edit
39
+ end
40
+ end
41
+
42
+ def destroy
43
+ @rate.destroy
44
+
45
+ flash[:success] = t('workarea.admin.tax_rates.flash_messages.removed')
46
+ redirect_to tax_category_rates_path
47
+ end
48
+
49
+ private
50
+
51
+ def find_category
7
52
  model = Tax::Category.find(params[:tax_category_id])
8
53
  @category = TaxCategoryViewModel.wrap(model, view_model_options)
54
+ end
55
+
56
+ def find_rate
57
+ @rate = @category.rates.find(params[:id])
58
+ end
59
+
60
+ def percentage_fields
61
+ %w[country_percentage region_percentage postal_code_percentage]
62
+ end
63
+
64
+ def rate_params
65
+ params[:rate].to_h.map do |field, value|
66
+ if field.in?(percentage_fields) && value.to_f > 0
67
+ value = value.to_f / 100
68
+ end
9
69
 
10
- @rates = @category.rates.page(params[:page])
70
+ [field, value]
71
+ end.to_h
11
72
  end
12
73
  end
13
74
  end
@@ -0,0 +1,40 @@
1
+ module Workarea
2
+ module Admin
3
+ class UnsubscribesController < Admin::ApplicationController
4
+ skip_before_action :require_login
5
+ skip_before_action :require_admin
6
+ before_action :set_user
7
+
8
+ def status_report
9
+ if @user&.update(status_email_recipient: false)
10
+ flash[:success] = t('workarea.admin.unsubscribe.flash_messages.status_report_success')
11
+ else
12
+ flash[:error] = t('workarea.admin.unsubscribe.flash_messages.status_report_error')
13
+ end
14
+
15
+ redirect_to storefront.root_url
16
+ end
17
+
18
+ def commentable
19
+ commentable = GlobalID::Locator.locate(params[:commentable_id])
20
+
21
+ if @user.present? && commentable&.remove_subscription(@user.id)
22
+ flash[:success] = t(
23
+ 'workarea.admin.unsubscribe.flash_messages.commentable_success',
24
+ commentable: commentable.name
25
+ )
26
+ else
27
+ flash[:error] = t('workarea.admin.unsubscribe.flash_messages.commentable_error')
28
+ end
29
+
30
+ redirect_to storefront.root_url
31
+ end
32
+
33
+ private
34
+
35
+ def set_user
36
+ @user ||= User.find_by_token(params[:id])
37
+ end
38
+ end
39
+ end
40
+ end
@@ -6,6 +6,7 @@ module Workarea
6
6
  required_permissions :people
7
7
 
8
8
  before_action :find_user, except: :index
9
+ around_action :inline_metrics_synchronizing
9
10
  after_action :track_index_filters, only: :index
10
11
 
11
12
  def index
@@ -59,6 +60,20 @@ module Workarea
59
60
  @insights = InsightViewModel.wrap(models, view_model_options)
60
61
  end
61
62
 
63
+ def send_password_reset
64
+ password_reset = User::PasswordReset.create!(user: @user.model)
65
+ Storefront::AccountMailer.password_reset(password_reset.id.to_s).deliver_later
66
+
67
+ flash[:success] = t('workarea.admin.users.flash_messages.password_reset')
68
+ redirect_to user_path(@user)
69
+ end
70
+
71
+ def unlock
72
+ @user.unlock_login!
73
+ flash[:success] = t('workarea.admin.users.flash_messages.unlocked')
74
+ redirect_to user_path(@user)
75
+ end
76
+
62
77
  private
63
78
 
64
79
  def update_email_signup
@@ -72,6 +87,10 @@ module Workarea
72
87
  def find_user
73
88
  @user = Admin::UserViewModel.new(User.find(params[:id]))
74
89
  end
90
+
91
+ def inline_metrics_synchronizing
92
+ Sidekiq::Callbacks.inline(SynchronizeUserMetrics) { yield }
93
+ end
75
94
  end
76
95
  end
77
96
  end
@@ -157,18 +157,8 @@ module Workarea
157
157
  "#{request.path}?#{new_query_string_params.to_query}"
158
158
  end
159
159
 
160
- def duration_in_words(duration)
161
- parts = duration.parts
162
- return t('workarea.duration.seconds', count: 0) if parts.empty?
163
-
164
- parts
165
- .sort_by { |unit, _ | ActiveSupport::Duration::PARTS.index(unit) }
166
- .map { |unit, val| t("workarea.duration.#{unit}", count: val) }
167
- .to_sentence
168
- end
169
-
170
- def navigation_redirects_enabled?
171
- !Rails.application.config.consider_all_requests_local
160
+ def s3?
161
+ Configuration::S3.configured?
172
162
  end
173
163
  end
174
164
  end
@@ -0,0 +1,9 @@
1
+ module Workarea
2
+ module Admin
3
+ module ConfigurationsHelper
4
+ def duration_field_options
5
+ %w(seconds minutes hours days weeks months years)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -34,10 +34,9 @@ module Workarea
34
34
  end
35
35
 
36
36
  def options_for_category(category_id)
37
- model = Catalog::Category.where(id: category_id).first
38
-
39
- return '' unless model.present?
37
+ return nil unless category_id.present?
40
38
 
39
+ model = Catalog::Category.find(category_id)
41
40
  options_for_select({ model.name => model.id }, model.id)
42
41
  end
43
42
 
@@ -0,0 +1,10 @@
1
+ module Workarea
2
+ module Admin::FulfillmentHelper
3
+ def fulfillment_policies
4
+ @fullfillment_policies ||=
5
+ Workarea.config.fulfillment_policies.map do |class_name|
6
+ [class_name.demodulize.titleize, class_name.demodulize.underscore]
7
+ end
8
+ end
9
+ end
10
+ end
@@ -40,6 +40,22 @@ module Workarea
40
40
  )
41
41
  end
42
42
 
43
+ def fraud_icon_for(model)
44
+ return unless model.fraud_suspected?
45
+ svg = inline_svg(
46
+ 'workarea/admin/icons/alert.svg',
47
+ title: t('workarea.admin.orders.cards.fraud.suspected_fraud'),
48
+ class: 'svg-icon svg-icon--small svg-icon--link-color'
49
+ )
50
+
51
+ link_to(
52
+ svg,
53
+ fraud_order_path(model),
54
+ title: t('workarea.admin.orders.cards.fraud.suspected_fraud'),
55
+ class: 'link link--no-underline'
56
+ )
57
+ end
58
+
43
59
  def admin_icon_for(model)
44
60
  return unless model.admin?
45
61
 
@@ -90,6 +106,16 @@ module Workarea
90
106
  class: 'svg-icon svg-icon--small svg-icon--gray'
91
107
  )
92
108
  end
109
+
110
+ def segments_icon_for(model)
111
+ return unless model.active_segment_ids.present?
112
+
113
+ inline_svg(
114
+ 'workarea/admin/icons/user.svg',
115
+ title: t('workarea.admin.insights.icons.segments'),
116
+ class: 'svg-icon svg-icon--small svg-icon--link-color'
117
+ )
118
+ end
93
119
  end
94
120
  end
95
121
  end
@@ -31,6 +31,7 @@ module Workarea
31
31
  users_path(role: %w(Administrator))
32
32
  end
33
33
 
34
+ # TODO remove in v3.6, no longer used
34
35
  def todays_signups_path
35
36
  users_path(
36
37
  created_at_greater_than: Time.current.to_s(:date_only),
@@ -2,7 +2,7 @@ module Workarea
2
2
  module Admin
3
3
  module PricingOverridesHelper
4
4
  def allow_pricing_override?
5
- current_admin.present? && current_order.items.any?
5
+ current_admin&.orders_manager? && current_order.items.any?
6
6
  end
7
7
  end
8
8
  end
@@ -6,5 +6,18 @@ module Workarea
6
6
  "#{content_tag(:strong, name)}: #{joined}"
7
7
  end.join(', ').html_safe
8
8
  end
9
+
10
+ def summary_inventory_status_css_classes(product)
11
+ status_issue_class =
12
+ if !product.active?
13
+ 'product-summary--inactive'
14
+ elsif !product.inventory.available?
15
+ "product-summary--#{product.inventory.status.to_s.dasherize}"
16
+ end
17
+
18
+ return [] unless status_issue_class.present?
19
+ return [] if product.inventory.any?(&:displayable_when_out_of_stock?)
20
+ [status_issue_class, 'product-summary--status-issue']
21
+ end
9
22
  end
10
23
  end
@@ -99,6 +99,10 @@ module Workarea
99
99
  model_links(Pricing::Discount, ids)
100
100
  end
101
101
 
102
+ def segment_links(ids)
103
+ model_links(Segment, ids)
104
+ end
105
+
102
106
  def for_each_content_block_from_changeset(content, change_hash)
103
107
  change_hash.each do |id, changes|
104
108
  block = content.blocks.detect { |b| b.id.to_s == id.to_s }
@@ -171,7 +175,7 @@ module Workarea
171
175
 
172
176
  def calendar_day_classes(day)
173
177
  date = Date.parse(day)
174
- today = Time.zone.now.to_date
178
+ today = Date.current
175
179
 
176
180
  classes = ['calendar__day']
177
181
  classes << 'calendar__day--odd-month' if date.month.odd?
@@ -182,26 +186,6 @@ module Workarea
182
186
  classes
183
187
  end
184
188
 
185
- def calendar_release_classes(day, release)
186
- date = Date.parse(day)
187
-
188
- classes = ['calendar__release']
189
- classes << 'calendar__release--start' if release.published_on_date?(date)
190
- classes << 'calendar__release--end' if release.ended_on_date?(date)
191
- classes << 'calendar__release--content' if release.content_release?
192
-
193
- classes
194
- end
195
-
196
- def calendar_release_styles(release)
197
- return if release.undo_at.blank?
198
-
199
- color = Digest::MD5.hexdigest(release.name)[0, 6]
200
- text_color = release_text_color(color)
201
-
202
- "background-color: ##{color}; color: ##{text_color};"
203
- end
204
-
205
189
  private
206
190
 
207
191
  def model_links(klass, ids)
@@ -0,0 +1,68 @@
1
+ module Workarea
2
+ module Admin
3
+ module SegmentsHelper
4
+ def segment_rule_types_options
5
+ Workarea.config.segment_rule_types.map do |string|
6
+ rule = string.constantize
7
+ [t("workarea.admin.fields.#{rule.slug}", default: rule.slug.to_s), rule.slug]
8
+ end
9
+ end
10
+
11
+ def traffic_referrer_medium_options
12
+ {
13
+ t('workarea.admin.segment_rules.unknown') => 'unknown',
14
+ t('workarea.admin.segment_rules.email') => 'email',
15
+ t('workarea.admin.segment_rules.social') => 'social',
16
+ t('workarea.admin.segment_rules.search') => 'search'
17
+ }
18
+ end
19
+
20
+ def segments
21
+ @segments ||= Segment.all
22
+ end
23
+
24
+ def selected_segment_geolocation_options(selected)
25
+ selected.map { |l| [Segment::Rules::GeolocationOption[l]&.name || l, l] }
26
+ end
27
+
28
+ def browser_info_options
29
+ {
30
+ t('workarea.admin.segment_rules.browser_info.bot') => 'bot',
31
+ t('workarea.admin.segment_rules.browser_info.chrome') => 'chrome',
32
+ t('workarea.admin.segment_rules.browser_info.edge') => 'edge',
33
+ t('workarea.admin.segment_rules.browser_info.firefox') => 'firefox',
34
+ t('workarea.admin.segment_rules.browser_info.ie') => 'ie',
35
+ t('workarea.admin.segment_rules.browser_info.opera') => 'opera',
36
+ t('workarea.admin.segment_rules.browser_info.safari') => 'safari'
37
+ }
38
+ end
39
+
40
+ def device_type_options
41
+ {
42
+ t('workarea.admin.segment_rules.devices.console') => 'console',
43
+ t('workarea.admin.segment_rules.devices.ipad') => 'ipad',
44
+ t('workarea.admin.segment_rules.devices.iphone') => 'iphone',
45
+ t('workarea.admin.segment_rules.devices.ipod_touch') => 'ipod_touch',
46
+ t('workarea.admin.segment_rules.devices.kindle') => 'kindle',
47
+ t('workarea.admin.segment_rules.devices.mobile') => 'mobile',
48
+ t('workarea.admin.segment_rules.devices.nintendo') => 'nintendo',
49
+ t('workarea.admin.segment_rules.devices.playstation') => 'playstation',
50
+ t('workarea.admin.segment_rules.devices.tablet') => 'tablet',
51
+ t('workarea.admin.segment_rules.devices.tv') => 'tv',
52
+ t('workarea.admin.segment_rules.devices.xbox') => 'xbox'
53
+ }
54
+ end
55
+
56
+ def platform_options
57
+ {
58
+ t('workarea.admin.segment_rules.platform.android') => 'android',
59
+ t('workarea.admin.segment_rules.platform.blackberry') => 'blackberry',
60
+ t('workarea.admin.segment_rules.platform.ios') => 'ios',
61
+ t('workarea.admin.segment_rules.platform.linux') => 'linux',
62
+ t('workarea.admin.segment_rules.platform.mac') => 'mac',
63
+ t('workarea.admin.segment_rules.platform.windows') => 'windows'
64
+ }
65
+ end
66
+ end
67
+ end
68
+ end
@@ -2,15 +2,23 @@ module Workarea
2
2
  module Admin
3
3
  module SettingsHelper
4
4
  def sanitize_config_value(value)
5
- return if value.blank?
5
+ return if value.blank? && value.to_s != 'false'
6
6
 
7
7
  case value
8
- when String, Symbol
9
- tag.code html_escape(value.to_s), class: 'code code--block'
8
+ when ActiveSupport::Duration
9
+ amount, unit = value.parts.first.reverse
10
+ duration = pluralize(amount, unit.to_s.singularize)
11
+ tag.code html_escape(duration), class: 'code code--block'
12
+ when SwappableList
13
+ tag.pre data: { expandable: '' } do
14
+ tag.code JSON.pretty_generate(value.to_a), class: 'code code--block'
15
+ end
10
16
  when Hash, Array
11
17
  tag.pre data: { expandable: '' } do
12
18
  tag.code JSON.pretty_generate(value), class: 'code code--block'
13
19
  end
20
+ else
21
+ tag.code html_escape(value.to_s), class: 'code code--block'
14
22
  end
15
23
  end
16
24
  end
@@ -2,8 +2,8 @@ module Workarea
2
2
  module Admin
3
3
  class CommentMailer < Admin::ApplicationMailer
4
4
  def notify(user_id, comment_id)
5
- email = User.where(id: user_id).first.email
6
- return false unless email.present?
5
+ @user = User.find(user_id) rescue nil
6
+ return false unless @user&.email.present?
7
7
 
8
8
  model = Comment.where(id: comment_id).first
9
9
  return false unless model.present?
@@ -19,7 +19,7 @@ module Workarea
19
19
  set_colors
20
20
 
21
21
  mail(
22
- to: email,
22
+ to: @user.email,
23
23
  from: Workarea.config.email_from,
24
24
  subject: t(
25
25
  'workarea.admin.comment_mailer.notify.subject',
@@ -3,15 +3,28 @@ module Workarea
3
3
  class StatusReportMailer < Admin::ApplicationMailer
4
4
  add_template_helper(InsightsHelper)
5
5
 
6
- def report(emails, date)
7
- @alerts = AlertsViewModel.wrap(Alerts.new)
8
- @date = date
9
- @dashboard = Dashboards::IndexViewModel.new
6
+ def self.report_to_many(users)
7
+ alerts = AlertsViewModel.wrap(Alerts.new)
8
+ dashboard = Dashboards::IndexViewModel.new
9
+
10
+ users.map do |user|
11
+ report(user.email, user: user, alerts: alerts, dashboard: dashboard)
12
+ end
13
+ end
14
+
15
+ def report(email, user: nil, alerts: nil, dashboard: nil)
16
+ @date = Time.current - 1.day
17
+ @user = user || User.find_by_email(email)
18
+ @alerts = alerts || AlertsViewModel.wrap(Alerts.new)
19
+ @dashboard = dashboard || Dashboards::IndexViewModel.new
10
20
 
11
21
  mail(
12
- bcc: emails,
22
+ to: email,
13
23
  from: Workarea.config.email_from,
14
- subject: t('workarea.admin.status_report_mailer.title')
24
+ subject: t(
25
+ 'workarea.admin.status_report_mailer.subject',
26
+ site: Workarea.config.site_name
27
+ )
15
28
  )
16
29
  end
17
30
  end
@@ -20,6 +20,11 @@ module Workarea
20
20
  def pricing_prices
21
21
  pricing.fetch('prices', []).first || {}
22
22
  end
23
+
24
+ def segments
25
+ return [] if settings['active_segment_ids'].blank?
26
+ @segments ||= Segment.in(id: settings['active_segment_ids']).to_a
27
+ end
23
28
  end
24
29
  end
25
30
  end
@@ -15,7 +15,8 @@ module Workarea
15
15
  end
16
16
 
17
17
  def root
18
- @root ||= Mongoid::DocumentPath.find(model.document_path.take(1))
18
+ return @root if defined?(@root)
19
+ @root = Mongoid::DocumentPath.find(model.document_path.take(1)) rescue nil
19
20
  end
20
21
 
21
22
  def localized_change?(field, value)
@@ -39,8 +40,13 @@ module Workarea
39
40
  end
40
41
 
41
42
  def old_value_for(field)
42
- return get_localized_value(field, undo[field]) if undo.present?
43
- current_releasable.send(field)
43
+ if release.previous.present?
44
+ old_value_from_release_for(release.previous, field)
45
+ elsif release.undoes?
46
+ old_value_from_release_for(release.undoes, field)
47
+ else
48
+ current_releasable.send(field)
49
+ end
44
50
  end
45
51
 
46
52
  def release_date
@@ -76,6 +82,12 @@ module Workarea
76
82
  def current_releasable
77
83
  @current_releasable ||= Release.with_current(nil) { releasable.reload }
78
84
  end
85
+
86
+ def old_value_from_release_for(release, field)
87
+ release.as_current { current_releasable.reload.send(field) }
88
+ ensure
89
+ current_releasable.reload
90
+ end
79
91
  end
80
92
  end
81
93
  end
@@ -10,7 +10,7 @@ module Workarea
10
10
  end
11
11
 
12
12
  def used_count
13
- model.promo_codes.count - unused_promo_codes.count
13
+ model.count - unused_promo_codes.count
14
14
  end
15
15
 
16
16
  def last_used_at
@@ -16,6 +16,10 @@ module Workarea
16
16
  def comments
17
17
  @comments ||= CommentViewModel.wrap(model.comments)
18
18
  end
19
+
20
+ def subscribed_users
21
+ @users ||= User.in(id: subscribed_user_ids)
22
+ end
19
23
  end
20
24
  end
21
25
  end
@@ -131,6 +131,8 @@ module Workarea
131
131
  @open_graph_asset ||=
132
132
  if model.open_graph_asset_id.present?
133
133
  Content::Asset.find(model.open_graph_asset_id)
134
+ elsif (og_default = Content::Asset.open_graph_default).present?
135
+ og_default
134
136
  else
135
137
  Content::Asset.open_graph_placeholder
136
138
  end
@@ -37,17 +37,17 @@ module Workarea
37
37
  {
38
38
  '$match' => {
39
39
  'created_at' => {
40
- '$gte' => starts_at.beginning_of_day.utc,
41
- '$lte' => ends_at.end_of_day.utc
40
+ '$gte' => starts_at.beginning_of_day,
41
+ '$lte' => ends_at.end_of_day
42
42
  }
43
43
  }
44
44
  },
45
45
  {
46
46
  '$group' => {
47
47
  '_id' => {
48
- 'day' => { '$dayOfMonth' => created_at_in_time_zone },
49
- 'month' => { '$month' => created_at_in_time_zone },
50
- 'year' => { '$year' => created_at_in_time_zone }
48
+ 'day' => { '$dayOfMonth' => '$created_at' },
49
+ 'month' => { '$month' => '$created_at' },
50
+ 'year' => { '$year' => '$created_at' }
51
51
  },
52
52
  'created_at' => { '$first' => '$created_at' },
53
53
  'count' => { '$sum' => 1 }
@@ -61,10 +61,6 @@ module Workarea
61
61
  end
62
62
  end
63
63
 
64
- def created_at_in_time_zone
65
- { 'date' => '$created_at', 'timezone' => Time.zone.tzinfo.name }
66
- end
67
-
68
64
  def insights
69
65
  @insights ||= InsightViewModel.wrap(
70
66
  Workarea::Insights::Base.by_dashboard('marketing').page(options[:page])