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
@@ -8,6 +8,12 @@ module Workarea
8
8
  end
9
9
  end
10
10
 
11
+ def tender_graph_data
12
+ sales_by_tender.results.take(5).reduce({}) do |memo, result|
13
+ memo.merge(result.name => result.revenue)
14
+ end
15
+ end
16
+
11
17
  def insights
12
18
  @insights ||= Reports::InsightsViewModel.wrap(nil, options).feed
13
19
  end
@@ -65,6 +71,13 @@ module Workarea
65
71
  )
66
72
  end
67
73
 
74
+ def sales_by_tender
75
+ @sales_by_tender ||= Reports::SalesByTenderViewModel.wrap(
76
+ Workarea::Reports::SalesByTender.new(options),
77
+ options
78
+ )
79
+ end
80
+
68
81
  def one_time_customers
69
82
  @one_time_customers ||= Reports::OneTimeCustomersViewModel.wrap(
70
83
  Workarea::Reports::OneTimeCustomers.new(options),
@@ -99,6 +112,18 @@ module Workarea
99
112
  options
100
113
  )
101
114
  end
115
+
116
+ def timeline
117
+ @timeline ||= Reports::TimelineViewModel.wrap(
118
+ Workarea::Reports::SalesOverTime.new(
119
+ options.merge(
120
+ starts_at: 3.months.ago,
121
+ group_by: 'day'
122
+ )
123
+ ),
124
+ options
125
+ )
126
+ end
102
127
  end
103
128
  end
104
129
  end
@@ -18,6 +18,10 @@ module Workarea
18
18
  [
19
19
  t('workarea.admin.pricing_discounts.options.when_user_is_tagged'),
20
20
  'user_tag'
21
+ ],
22
+ [
23
+ t('workarea.admin.pricing_discounts.options.when_in_segment'),
24
+ 'segments'
21
25
  ]
22
26
  ]
23
27
  end
@@ -27,6 +31,8 @@ module Workarea
27
31
  'order_total'
28
32
  elsif user_tag?
29
33
  'user_tag'
34
+ elsif active_segment_ids.present?
35
+ 'segments'
30
36
  end
31
37
  end
32
38
  end
@@ -21,6 +21,10 @@ module Workarea
21
21
  [
22
22
  t('workarea.admin.pricing_discounts.options.when_user_is_tagged'),
23
23
  'user_tag'
24
+ ],
25
+ [
26
+ t('workarea.admin.pricing_discounts.options.when_in_segment'),
27
+ 'segments'
24
28
  ]
25
29
  ]
26
30
  end
@@ -32,6 +36,8 @@ module Workarea
32
36
  'item_quantity'
33
37
  elsif user_tag?
34
38
  'user_tag'
39
+ elsif active_segment_ids.present?
40
+ 'segments'
35
41
  end
36
42
  end
37
43
  end
@@ -18,6 +18,10 @@ module Workarea
18
18
  [
19
19
  t('workarea.admin.pricing_discounts.options.when_user_is_tagged'),
20
20
  'user_tag'
21
+ ],
22
+ [
23
+ t('workarea.admin.pricing_discounts.options.when_in_segment'),
24
+ 'segments'
21
25
  ]
22
26
  ]
23
27
  end
@@ -27,6 +31,8 @@ module Workarea
27
31
  'order_total'
28
32
  elsif user_tag?
29
33
  'user_tag'
34
+ elsif active_segment_ids.present?
35
+ 'segments'
30
36
  end
31
37
  end
32
38
  end
@@ -15,6 +15,10 @@ module Workarea
15
15
  [
16
16
  t('workarea.admin.pricing_discounts.options.when_user_is_tagged'),
17
17
  'user_tag'
18
+ ],
19
+ [
20
+ t('workarea.admin.pricing_discounts.options.when_in_segment'),
21
+ 'segments'
18
22
  ]
19
23
  ]
20
24
  end
@@ -24,6 +28,8 @@ module Workarea
24
28
  'order_total'
25
29
  elsif user_tag?
26
30
  'user_tag'
31
+ elsif active_segment_ids.present?
32
+ 'segments'
27
33
  end
28
34
  end
29
35
  end
@@ -19,6 +19,10 @@ module Workarea
19
19
  [
20
20
  t('workarea.admin.pricing_discounts.options.when_user_is_tagged'),
21
21
  'user_tag'
22
+ ],
23
+ [
24
+ t('workarea.admin.pricing_discounts.options.when_in_segment'),
25
+ 'segments'
22
26
  ]
23
27
  ]
24
28
  end
@@ -30,6 +34,8 @@ module Workarea
30
34
  'item_quantity'
31
35
  elsif user_tag?
32
36
  'user_tag'
37
+ elsif active_segment_ids.present?
38
+ 'segments'
33
39
  end
34
40
  end
35
41
  end
@@ -21,6 +21,10 @@ module Workarea
21
21
  [
22
22
  t('workarea.admin.pricing_discounts.options.when_user_is_tagged'),
23
23
  'user_tag'
24
+ ],
25
+ [
26
+ t('workarea.admin.pricing_discounts.options.when_in_segment'),
27
+ 'segments'
24
28
  ]
25
29
  ]
26
30
  end
@@ -32,6 +36,8 @@ module Workarea
32
36
  'item_quantity'
33
37
  elsif user_tag?
34
38
  'user_tag'
39
+ elsif active_segment_ids.present?
40
+ 'segments'
35
41
  end
36
42
  end
37
43
  end
@@ -18,6 +18,10 @@ module Workarea
18
18
  [
19
19
  t('workarea.admin.pricing_discounts.options.when_user_is_tagged'),
20
20
  'user_tag'
21
+ ],
22
+ [
23
+ t('workarea.admin.pricing_discounts.options.when_in_segment'),
24
+ 'segments'
21
25
  ]
22
26
  ]
23
27
  end
@@ -27,6 +31,8 @@ module Workarea
27
31
  'order_total'
28
32
  elsif user_tag?
29
33
  'user_tag'
34
+ elsif active_segment_ids.present?
35
+ 'segments'
30
36
  end
31
37
  end
32
38
  end
@@ -19,6 +19,10 @@ module Workarea
19
19
  [
20
20
  t('workarea.admin.pricing_discounts.options.when_user_is_tagged'),
21
21
  'user_tag'
22
+ ],
23
+ [
24
+ t('workarea.admin.pricing_discounts.options.when_in_segment'),
25
+ 'segments'
22
26
  ]
23
27
  ]
24
28
  end
@@ -28,6 +32,8 @@ module Workarea
28
32
  'order_total'
29
33
  elsif user_tag?
30
34
  'user_tag'
35
+ elsif active_segment_ids.present?
36
+ 'segments'
31
37
  end
32
38
  end
33
39
  end
@@ -2,18 +2,12 @@ module Workarea
2
2
  module Admin
3
3
  module FeaturedProductsViewModel
4
4
  def featured_products
5
- @featured_products ||=
6
- begin
7
- models = Catalog::Product.any_in(id: model.product_ids).to_a
8
-
9
- results = model.product_ids.map do |id|
10
- tmp = models.detect { |m| m.id == id }
11
- next unless tmp.present?
12
- Admin::ProductViewModel.new(tmp)
13
- end
14
-
15
- results.compact
16
- end
5
+ @featured_products ||= Catalog::Product.find_ordered(model.product_ids).map do |product|
6
+ Admin::ProductViewModel.wrap(
7
+ product,
8
+ inventory: Inventory::Collection.new(product.skus)
9
+ )
10
+ end
17
11
  end
18
12
  end
19
13
  end
@@ -0,0 +1,22 @@
1
+ module Workarea
2
+ module Admin
3
+ class FulfillmentSkuViewModel < ApplicationViewModel
4
+ def timeline
5
+ @timeline ||= TimelineViewModel.new(model)
6
+ end
7
+
8
+ def tokens
9
+ return [] unless download?
10
+ @tokens ||= Fulfillment::Token.for_sku(id)
11
+ end
12
+
13
+ def product
14
+ @product ||=
15
+ begin
16
+ product = Catalog::Product.find_by_sku(model.id)
17
+ ProductViewModel.wrap(product, options) if product.present?
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+ module Workarea
2
+ module Admin
3
+ class FulfillmentTokenViewModel < ApplicationViewModel
4
+ def order
5
+ return unless order_id.present?
6
+ @order ||= options[:order] || Order.find(order_id)
7
+ end
8
+
9
+ def order_item
10
+ return unless order.present? && order_item_id.present?
11
+ @order_item ||= order.items.detect { |i| i.id.to_s == order_item_id }
12
+ end
13
+ end
14
+ end
15
+ end
@@ -36,6 +36,20 @@ module Workarea
36
36
  )
37
37
  end.compact
38
38
  end
39
+
40
+ def skus
41
+ @skus ||= FulfillmentSkusViewModel.wrap(
42
+ Fulfillment::Sku.in(id: order.items.map(&:sku).uniq).to_a,
43
+ options
44
+ )
45
+ end
46
+
47
+ def tokens
48
+ @tokens ||= FulfillmentTokenViewModel.wrap(
49
+ Fulfillment::Token.by_order(order.id).to_a,
50
+ options.merge(order: order)
51
+ )
52
+ end
39
53
  end
40
54
  end
41
55
  end
@@ -17,12 +17,12 @@ module Workarea
17
17
  id_key_name = "#{key_name}_id"
18
18
 
19
19
  ids = model.results.flat_map { |r| r.select { |k| k =~ /#{id_key_name}$/ }.values }
20
- models = klass.any_in(id: ids).to_a
20
+ models = klass.any_in(id: ids).to_lookup_hash
21
21
 
22
22
  insight_result.each do |key, value|
23
23
  if key =~ /#{id_key_name}$/
24
24
  new_key = key.gsub(/#{id_key_name}$/, key_name)
25
- model = models.detect { |m| m.id.to_s == value.to_s }
25
+ model = models[value]
26
26
 
27
27
  if model.present?
28
28
  result.merge!(new_key => ApplicationController.wrap_in_view_model(model))
@@ -38,12 +38,12 @@ module Workarea
38
38
 
39
39
  def average_price
40
40
  return nil if orders.zero?
41
- (merchandise - discounts) / units_sold
41
+ (merchandise - discounts) / orders
42
42
  end
43
43
 
44
44
  def previous_average_price
45
45
  return nil if previous_orders.zero?
46
- (previous_merchandise - previous_discounts) / previous_units_sold
46
+ (previous_merchandise - previous_discounts) / previous_orders
47
47
  end
48
48
 
49
49
  def average_price_percent_change
@@ -0,0 +1,25 @@
1
+ module Workarea
2
+ module Admin
3
+ module Insights
4
+ class SegmentViewModel < ApplicationViewModel
5
+ include InsightsDetails
6
+
7
+ insights_scope -> { Metrics::SegmentByDay.by_segment(model.id) }
8
+
9
+ add_sparkline :orders
10
+ add_summaries :orders, :revenue, :average_order_value
11
+ add_graph_data :orders, :revenue, :average_order_value
12
+
13
+ def average_order_value
14
+ return nil if orders.zero?
15
+ revenue / orders.to_f
16
+ end
17
+
18
+ def previous_average_order_value
19
+ return nil if previous_orders.zero?
20
+ previous_revenue / previous_orders.to_f
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -40,6 +40,10 @@ module Workarea
40
40
  model.updated_at
41
41
  end
42
42
 
43
+ def segments
44
+ @segments ||= Segment.in(id: model.segment_ids).to_a
45
+ end
46
+
43
47
  #
44
48
  # Shipping
45
49
  #
@@ -16,57 +16,6 @@ module Workarea
16
16
  def inventory
17
17
  @inventory ||= Inventory::Sku.where(id: model.id).first
18
18
  end
19
-
20
- # All prices that this SKU will be sold at. Makes a determination
21
- # based on whether the price is on sale.
22
- #
23
- # @return [Array<Workarea::Pricing::Price>]
24
- def sell_prices
25
- prices.sort_by(&:sell)
26
- end
27
-
28
- # The lowest price that this SKU can be purchased for. Dependent
29
- # on the current sale state of the SKU.
30
- #
31
- # @return [Money]
32
- def min_price
33
- sell_prices.first&.sell
34
- end
35
-
36
- # The highest regular price set on this SKU.
37
- #
38
- # @return [Money]
39
- def max_price
40
- sell_prices.last&.sell
41
- end
42
-
43
- # Show a price range if the `min_price` and `max_price` are not
44
- # the same value.
45
- #
46
- # @return [Boolean]
47
- def show_range?
48
- min_price.present? && max_price.present? && min_price != max_price
49
- end
50
-
51
- # This SKU is considered "on sale" if it is marked as such, or if
52
- # any prices that it contains are marked as such.
53
- #
54
- # @return [Boolean]
55
- def on_sale?
56
- model.on_sale? || prices.any?(&:on_sale?)
57
- end
58
-
59
- # The price of this SKU as rendered on the index page. Shows a
60
- # price range when multiple prices are contained within the SKU,
61
- # otherwise it just shows the only sell price available.
62
- #
63
- # @return [String]
64
- def sell_price
65
- return if min_price.blank?
66
- return min_price.format unless show_range?
67
-
68
- "#{max_price.format} – #{min_price.format}"
69
- end
70
19
  end
71
20
  end
72
21
  end
@@ -25,7 +25,7 @@ module Workarea
25
25
  #
26
26
  def search
27
27
  @search ||= Search::CategoryBrowse.new(
28
- rules: model.product_rules.select(&:valid?),
28
+ rules: model.product_rules.usable,
29
29
  sort: model.default_sort,
30
30
  page: options[:page] || 1,
31
31
  show_all: show_all?
@@ -52,7 +52,7 @@ module Workarea
52
52
  end
53
53
 
54
54
  def display_results?
55
- model.product_rules.select(&:valid?).present?
55
+ model.product_rules.usable.present?
56
56
  end
57
57
 
58
58
  def base_query
@@ -42,7 +42,7 @@ module Workarea
42
42
  def storefront_view_model
43
43
  @storefront_view_model ||= Storefront::ProductViewModel.wrap(
44
44
  model,
45
- options
45
+ @options
46
46
  )
47
47
  end
48
48
 
@@ -93,13 +93,16 @@ module Workarea
93
93
  end
94
94
  end
95
95
 
96
- def variant_details
97
- variants.each_with_object({}) do |variant, memo|
96
+ def options
97
+ variants.reduce({}) do |memo, variant|
98
98
  variant.details.each do |name, value|
99
99
  memo[name] ||= []
100
- memo[name] += Array.wrap(value)
100
+ memo[name] << value
101
+ memo[name].flatten!
101
102
  memo[name].uniq!
102
103
  end
104
+
105
+ memo
103
106
  end
104
107
  end
105
108
 
@@ -122,7 +125,7 @@ module Workarea
122
125
  end
123
126
 
124
127
  def insights
125
- @insights ||= Insights::ProductViewModel.wrap(model, options)
128
+ @insights ||= Insights::ProductViewModel.wrap(model, @options)
126
129
  end
127
130
 
128
131
  def inventory
@@ -134,6 +137,24 @@ module Workarea
134
137
  active? && inventory.any?(&:displayable?)
135
138
  end
136
139
 
140
+ def inventory_message
141
+ @inventory_message ||=
142
+ if !active?
143
+ t('workarea.admin.featured_products.statuses.inactive')
144
+ elsif inventory.backordered?
145
+ t('workarea.admin.featured_products.statuses.backordered')
146
+ elsif inventory.out_of_stock?
147
+ t('workarea.admin.featured_products.statuses.out_of_stock')
148
+ elsif inventory.low_inventory?
149
+ t(
150
+ 'workarea.admin.featured_products.statuses.low_inventory',
151
+ count: inventory.available_to_sell
152
+ )
153
+ else
154
+ ''
155
+ end
156
+ end
157
+
137
158
  private
138
159
 
139
160
  def default_customization_options
@@ -6,17 +6,9 @@ module Workarea
6
6
  end
7
7
 
8
8
  def products
9
- @products ||=
10
- begin
11
- models = Catalog::Product.any_in(id: product_ids).to_a
12
-
13
- product_ids.map do |id|
14
- model = models.detect { |m| m.id == id }
15
- next unless model
16
-
17
- ProductViewModel.new(model)
18
- end.compact
19
- end
9
+ @products ||= Catalog::Product.find_ordered(product_ids).map do |product|
10
+ ProductViewModel.wrap(product)
11
+ end
20
12
  end
21
13
  end
22
14
  end
@@ -31,15 +31,10 @@ module Workarea
31
31
  private
32
32
 
33
33
  def find_releases_for_date(date)
34
- releases_in_range.map{ |r| ReleaseViewModel.new(r, options) }
35
- .select { |r| date_within_range?(date, r) }
36
- end
37
-
38
- def date_within_range?(date, release)
39
- return true if date == release.publish_time.to_date
40
- return false if release.undo_at.blank?
41
-
42
- date.to_time.to_i.between?(release.publish_time.to_i, release.undo_at.to_i)
34
+ releases_in_range
35
+ .map { |r| ReleaseViewModel.new(r, options) }
36
+ .select { |r| r.calendar_on == date }
37
+ .sort_by(&:calendar_at)
43
38
  end
44
39
 
45
40
  def releases_in_range
@@ -3,53 +3,20 @@ module Workarea
3
3
  class ReleaseEventViewModel < ApplicationViewModel
4
4
  include Workarea::Admin::Engine.routes.url_helpers
5
5
 
6
- def all_day_event?
7
- return false unless starts_and_ends?
8
- ends_at - starts_at > 1
9
- end
10
-
11
- def starts_and_ends?
12
- starts_at.present? && ends_at.present?
13
- end
14
-
15
6
  def description
16
- description = [
17
- I18n.t('workarea.admin.releases.feed.view_release',
18
- url: release_url(host: Workarea.config.host, id: id))
19
- ]
20
-
21
- if all_day_event?
22
- description << I18n.t('workarea.admin.releases.feed.starts_on',
23
- date: starts_at.strftime('%b %-d, %Y at %r'))
24
- description << I18n.t('workarea.admin.releases.feed.ends_on',
25
- date: ends_at.strftime('%b %-d, %Y at %r'))
26
- end
27
-
28
- unless ends_at.present?
29
- description << I18n.t('workarea.admin.releases.feed.no_undo_date')
30
- end
31
-
32
- description.join('\n')
33
- end
34
-
35
- def publish_time
36
- model.publish_at || model.published_at
37
- end
38
-
39
- def undo_time
40
- model.undo_at || model.undone_at
41
- end
7
+ I18n.t(
8
+ 'workarea.admin.releases.feed.view_release',
9
+ url: release_url(host: Workarea.config.host, id: id)
10
+ )
11
+ end
42
12
 
43
13
  def starts_at
44
- return if publish_time.nil?
45
- time = publish_time.strftime('%Y %m %d %H %M %S').split(' ').map(&:to_i)
46
- DateTime.civil(*time, publish_time.strftime('%z'))
14
+ model.publish_at || model.published_at
47
15
  end
48
16
 
49
17
  def ends_at
50
- return if undo_time.nil?
51
- time = undo_time.strftime('%Y %m %d %H %M %S').split(' ').map(&:to_i)
52
- DateTime.civil(*time, undo_time.strftime('%z'))
18
+ return if starts_at.blank?
19
+ starts_at + Workarea.config.release_publish_calendar_event_size
53
20
  end
54
21
  end
55
22
  end
@@ -15,29 +15,22 @@ module Workarea
15
15
  .reject { |changeset| changeset.releasable.blank? }
16
16
  end
17
17
 
18
- def can_undo?
19
- !undone? && changesets.any? { |c| c.undo.present? }
20
- end
21
-
22
- def published_on_date?(date)
23
- date == publish_time.to_date
24
- end
25
-
26
- def ended_on_date?(date)
27
- return true if content_release?
28
- date == model.undo_at.to_date
18
+ def calendar_at
19
+ model.publish_at || model.published_at
29
20
  end
30
21
 
31
- def content_release?
32
- model.undo_at.blank?
22
+ def calendar_on
23
+ calendar_at&.to_date
33
24
  end
34
25
 
35
- def publish_time
36
- model.publish_at || model.published_at
26
+ def undo
27
+ return unless undo?
28
+ @undo ||= ReleaseViewModel.wrap(model.undo, options)
37
29
  end
38
30
 
39
- def undo_time
40
- model.undo_at || model.undone_at
31
+ def undoes
32
+ return unless undoes?
33
+ @undoes ||= ReleaseViewModel.wrap(model.undoes, options)
41
34
  end
42
35
  end
43
36
  end