workarea-admin 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 (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])