spree_backend 4.1.15 → 4.2.0.beta

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 (270) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/backend-add.svg +5 -0
  3. data/app/assets/images/backend-adjust.svg +5 -0
  4. data/app/assets/images/backend-approve.svg +3 -0
  5. data/app/assets/images/backend-arrow-down.svg +1 -0
  6. data/app/assets/images/backend-arrow-left.svg +1 -0
  7. data/app/assets/images/backend-arrow-right.svg +1 -0
  8. data/app/assets/images/backend-arrow-up.svg +1 -0
  9. data/app/assets/images/backend-calendar.svg +9 -0
  10. data/app/assets/images/backend-cancel.svg +7 -0
  11. data/app/assets/images/backend-capture.svg +3 -0
  12. data/app/assets/images/backend-cart.svg +1 -0
  13. data/app/assets/images/backend-chevron-down.svg +1 -0
  14. data/app/assets/images/backend-chevron-left.svg +1 -0
  15. data/app/assets/images/backend-chevron-right.svg +1 -0
  16. data/app/assets/images/backend-chevron-up.svg +1 -0
  17. data/app/assets/images/backend-clone.svg +7 -0
  18. data/app/assets/images/backend-close.svg +7 -0
  19. data/app/assets/images/backend-delete.svg +6 -0
  20. data/app/assets/images/backend-double-chevron-left.svg +15 -0
  21. data/app/assets/images/backend-double-chevron-right.svg +17 -0
  22. data/app/assets/images/backend-edit.svg +14 -0
  23. data/app/assets/images/backend-enter.svg +6 -0
  24. data/app/assets/images/backend-envelope.svg +3 -0
  25. data/app/assets/images/backend-exit.svg +13 -0
  26. data/app/assets/images/backend-extensions.svg +4 -0
  27. data/app/assets/images/backend-eye-open.svg +8 -0
  28. data/app/assets/images/backend-file.svg +6 -0
  29. data/app/assets/images/backend-filter.svg +3 -0
  30. data/app/assets/images/backend-folder.svg +4 -0
  31. data/app/assets/images/backend-images.svg +7 -0
  32. data/app/assets/images/backend-info.svg +7 -0
  33. data/app/assets/images/backend-items.svg +5 -0
  34. data/app/assets/images/backend-leaf.svg +7 -0
  35. data/app/assets/images/backend-list.svg +5 -0
  36. data/app/assets/images/backend-location.svg +4 -0
  37. data/app/assets/images/backend-menu.svg +5 -0
  38. data/app/assets/images/backend-money.svg +1 -0
  39. data/app/assets/images/backend-move.svg +5 -0
  40. data/app/assets/images/backend-ok.svg +3 -0
  41. data/app/assets/images/backend-pagination-double-arrow-right.svg +8 -0
  42. data/app/assets/images/backend-payments.svg +8 -0
  43. data/app/assets/images/backend-pencil.svg +1 -0
  44. data/app/assets/images/backend-products.svg +5 -0
  45. data/app/assets/images/backend-promotion.svg +8 -0
  46. data/app/assets/images/backend-recycle.svg +5 -0
  47. data/app/assets/images/backend-remove.svg +6 -0
  48. data/app/assets/images/backend-report.svg +6 -0
  49. data/app/assets/images/backend-resume.svg +5 -0
  50. data/app/assets/images/backend-returns.svg +3 -0
  51. data/app/assets/images/backend-save.svg +3 -0
  52. data/app/assets/images/backend-search.svg +1 -0
  53. data/app/assets/images/backend-settings.svg +6 -0
  54. data/app/assets/images/backend-shipping.svg +3 -0
  55. data/app/assets/images/backend-slack.svg +3 -0
  56. data/app/assets/images/backend-sort.svg +5 -0
  57. data/app/assets/images/backend-split.svg +3 -0
  58. data/app/assets/images/backend-store.svg +14 -0
  59. data/app/assets/images/backend-tick.svg +3 -0
  60. data/app/assets/images/backend-update.svg +3 -0
  61. data/app/assets/images/backend-user.svg +3 -0
  62. data/app/assets/images/backend-users.svg +6 -0
  63. data/app/assets/images/backend-view.svg +8 -0
  64. data/app/assets/images/backend-void.svg +7 -0
  65. data/app/assets/javascripts/spree/backend/admin.js +156 -147
  66. data/app/assets/javascripts/spree/backend/checkouts/edit.js +1 -0
  67. data/app/assets/javascripts/spree/backend/flatpickr_locals.js +37 -0
  68. data/app/assets/javascripts/spree/backend/multi_currency.js +38 -0
  69. data/app/assets/javascripts/spree/backend/payments/edit.js +4 -3
  70. data/app/assets/javascripts/spree/backend/payments/new.js +18 -18
  71. data/app/assets/javascripts/spree/backend/promotions.js +1 -1
  72. data/app/assets/javascripts/spree/backend/spree-select2.js +18 -4
  73. data/app/assets/javascripts/spree/backend/stock_management.js +2 -1
  74. data/app/assets/javascripts/spree/backend/taxon_tree_menu.js +4 -4
  75. data/app/assets/javascripts/spree/backend/taxonomy.js +8 -1
  76. data/app/assets/javascripts/spree/backend/taxons.js +25 -16
  77. data/app/assets/javascripts/spree/backend/user_picker.js +1 -1
  78. data/app/assets/javascripts/spree/backend/variant_autocomplete.js +1 -1
  79. data/app/assets/javascripts/spree/backend/variant_management.js +2 -1
  80. data/app/assets/javascripts/spree/backend.js +5 -2
  81. data/app/assets/stylesheets/spree/backend/components/_buttons.scss +27 -11
  82. data/app/assets/stylesheets/spree/backend/components/_filters.scss +35 -5
  83. data/app/assets/stylesheets/spree/backend/components/_icons.scss +39 -4
  84. data/app/assets/stylesheets/spree/backend/components/_main.scss +32 -6
  85. data/app/assets/stylesheets/spree/backend/components/_navbar.scss +16 -8
  86. data/app/assets/stylesheets/spree/backend/components/_sidebar.scss +119 -55
  87. data/app/assets/stylesheets/spree/backend/components/_tables.scss +62 -19
  88. data/app/assets/stylesheets/spree/backend/components/_taxon_products_view.scss +26 -63
  89. data/app/assets/stylesheets/spree/backend/global/_variables.scss +5 -1
  90. data/app/assets/stylesheets/spree/backend/plugins/_flatpickr.scss +95 -0
  91. data/app/assets/stylesheets/spree/backend/plugins/_jquery_ui.scss +0 -117
  92. data/app/assets/stylesheets/spree/backend/plugins/_select2.scss +73 -24
  93. data/app/assets/stylesheets/spree/backend/shared/_base.scss +40 -0
  94. data/app/assets/stylesheets/spree/backend/shared/_forms.scss +38 -0
  95. data/app/assets/stylesheets/spree/backend/spree_admin.css.scss +5 -0
  96. data/app/assets/stylesheets/spree/backend/views/_order_payments.scss +12 -0
  97. data/app/assets/stylesheets/spree/backend/views/_product_properties.scss +11 -0
  98. data/app/assets/stylesheets/spree/backend/views/prototypes.scss +42 -0
  99. data/app/assets/stylesheets/spree/backend.css +1 -1
  100. data/app/controllers/spree/admin/general_settings_controller.rb +27 -0
  101. data/app/controllers/spree/admin/prices_controller.rb +39 -0
  102. data/app/controllers/spree/admin/stock_transfers_controller.rb +8 -1
  103. data/app/controllers/spree/admin/stores_controller.rb +61 -1
  104. data/app/controllers/spree/admin/taxons_controller.rb +5 -1
  105. data/app/helpers/spree/admin/base_helper.rb +25 -8
  106. data/app/helpers/spree/admin/navigation_helper.rb +50 -19
  107. data/app/helpers/spree/admin/orders_helper.rb +3 -3
  108. data/app/views/kaminari/{twitter-bootstrap-4 → admin-twitter-bootstrap-4}/_first_page.html.erb +1 -1
  109. data/app/views/kaminari/{twitter-bootstrap-4 → admin-twitter-bootstrap-4}/_gap.html.erb +1 -1
  110. data/app/views/kaminari/{twitter-bootstrap-4 → admin-twitter-bootstrap-4}/_last_page.html.erb +1 -1
  111. data/app/views/kaminari/{twitter-bootstrap-4 → admin-twitter-bootstrap-4}/_next_page.html.erb +1 -1
  112. data/app/views/kaminari/{twitter-bootstrap-4 → admin-twitter-bootstrap-4}/_page.html.erb +0 -0
  113. data/app/views/kaminari/{twitter-bootstrap-4 → admin-twitter-bootstrap-4}/_paginator.html.erb +1 -1
  114. data/app/views/kaminari/{twitter-bootstrap-4 → admin-twitter-bootstrap-4}/_prev_page.html.erb +1 -1
  115. data/app/views/spree/admin/adjustments/_adjustment.html.erb +2 -2
  116. data/app/views/spree/admin/adjustments/_adjustments_table.html.erb +16 -16
  117. data/app/views/spree/admin/adjustments/edit.html.erb +2 -2
  118. data/app/views/spree/admin/adjustments/index.html.erb +3 -3
  119. data/app/views/spree/admin/adjustments/new.html.erb +1 -1
  120. data/app/views/spree/admin/countries/_form.html.erb +9 -4
  121. data/app/views/spree/admin/countries/index.html.erb +27 -24
  122. data/app/views/spree/admin/customer_returns/_reimbursements_table.html.erb +37 -35
  123. data/app/views/spree/admin/customer_returns/_return_item_decision.html.erb +2 -0
  124. data/app/views/spree/admin/customer_returns/_return_item_selection.html.erb +45 -43
  125. data/app/views/spree/admin/customer_returns/index.html.erb +3 -1
  126. data/app/views/spree/admin/customer_returns/new.html.erb +1 -1
  127. data/app/views/spree/admin/general_settings/_form.html.erb +27 -0
  128. data/app/views/spree/admin/general_settings/edit.html.erb +4 -3
  129. data/app/views/spree/admin/images/edit.html.erb +2 -2
  130. data/app/views/spree/admin/images/index.html.erb +7 -7
  131. data/app/views/spree/admin/images/new.html.erb +2 -2
  132. data/app/views/spree/admin/log_entries/index.html.erb +4 -3
  133. data/app/views/spree/admin/option_types/_option_value_fields.html.erb +1 -1
  134. data/app/views/spree/admin/option_types/edit.html.erb +22 -20
  135. data/app/views/spree/admin/option_types/index.html.erb +27 -25
  136. data/app/views/spree/admin/orders/_adjustments.html.erb +26 -26
  137. data/app/views/spree/admin/orders/_line_items.html.erb +7 -7
  138. data/app/views/spree/admin/orders/_order_actions.html.erb +1 -1
  139. data/app/views/spree/admin/orders/_risk_analysis.html.erb +44 -42
  140. data/app/views/spree/admin/orders/_shipment.html.erb +6 -6
  141. data/app/views/spree/admin/orders/_shipment_manifest.html.erb +5 -5
  142. data/app/views/spree/admin/orders/_store_form.html.erb +3 -3
  143. data/app/views/spree/admin/orders/customer_details/_form.html.erb +1 -1
  144. data/app/views/spree/admin/orders/index.html.erb +135 -127
  145. data/app/views/spree/admin/payment_methods/index.html.erb +6 -4
  146. data/app/views/spree/admin/payments/_capture_events.html.erb +18 -16
  147. data/app/views/spree/admin/payments/_form.html.erb +1 -1
  148. data/app/views/spree/admin/payments/_list.html.erb +39 -37
  149. data/app/views/spree/admin/payments/index.html.erb +2 -3
  150. data/app/views/spree/admin/payments/new.html.erb +1 -1
  151. data/app/views/spree/admin/payments/show.html.erb +1 -1
  152. data/app/views/spree/admin/payments/source_forms/_gateway.html.erb +30 -30
  153. data/app/views/spree/admin/payments/source_views/_gateway.html.erb +20 -18
  154. data/app/views/spree/admin/payments/source_views/_storecredit.html.erb +28 -26
  155. data/app/views/spree/admin/prices/_variant_prices.html.erb +43 -0
  156. data/app/views/spree/admin/prices/index.html.erb +21 -0
  157. data/app/views/spree/admin/product_properties/_product_property_fields.html.erb +16 -4
  158. data/app/views/spree/admin/product_properties/index.html.erb +24 -19
  159. data/app/views/spree/admin/products/_add_stock_form.html.erb +1 -1
  160. data/app/views/spree/admin/products/_autocomplete.js.erb +27 -21
  161. data/app/views/spree/admin/products/_form.html.erb +40 -9
  162. data/app/views/spree/admin/products/edit.html.erb +1 -1
  163. data/app/views/spree/admin/products/index.html.erb +24 -19
  164. data/app/views/spree/admin/products/new.html.erb +11 -2
  165. data/app/views/spree/admin/products/stock.html.erb +3 -3
  166. data/app/views/spree/admin/promotion_categories/index.html.erb +4 -1
  167. data/app/views/spree/admin/promotions/_actions.html.erb +2 -2
  168. data/app/views/spree/admin/promotions/_form.html.erb +44 -17
  169. data/app/views/spree/admin/promotions/_promotion_action.html.erb +1 -1
  170. data/app/views/spree/admin/promotions/_promotion_rule.html.erb +1 -1
  171. data/app/views/spree/admin/promotions/_rules.html.erb +4 -4
  172. data/app/views/spree/admin/promotions/edit.html.erb +2 -2
  173. data/app/views/spree/admin/promotions/index.html.erb +5 -3
  174. data/app/views/spree/admin/promotions/new.html.erb +7 -6
  175. data/app/views/spree/admin/promotions/rules/_country.html.erb +1 -1
  176. data/app/views/spree/admin/promotions/rules/_item_total.html.erb +5 -5
  177. data/app/views/spree/admin/promotions/rules/_option_value.html.erb +6 -13
  178. data/app/views/spree/admin/promotions/rules/_product.html.erb +1 -1
  179. data/app/views/spree/admin/promotions/rules/_taxon.html.erb +1 -1
  180. data/app/views/spree/admin/properties/index.html.erb +5 -3
  181. data/app/views/spree/admin/prototypes/_prototypes.html.erb +30 -28
  182. data/app/views/spree/admin/prototypes/index.html.erb +21 -19
  183. data/app/views/spree/admin/prototypes/show.html.erb +21 -8
  184. data/app/views/spree/admin/refunds/edit.html.erb +2 -2
  185. data/app/views/spree/admin/refunds/new.html.erb +2 -2
  186. data/app/views/spree/admin/reimbursement_types/_form.html.erb +4 -4
  187. data/app/views/spree/admin/reimbursement_types/index.html.erb +4 -2
  188. data/app/views/spree/admin/reimbursements/edit.html.erb +66 -63
  189. data/app/views/spree/admin/reimbursements/index.html.erb +21 -20
  190. data/app/views/spree/admin/reimbursements/show.html.erb +66 -60
  191. data/app/views/spree/admin/reports/index.html.erb +18 -17
  192. data/app/views/spree/admin/reports/sales_total.html.erb +20 -19
  193. data/app/views/spree/admin/return_authorizations/_form.html.erb +3 -2
  194. data/app/views/spree/admin/return_authorizations/edit.html.erb +3 -3
  195. data/app/views/spree/admin/return_authorizations/index.html.erb +3 -1
  196. data/app/views/spree/admin/return_authorizations/new.html.erb +2 -2
  197. data/app/views/spree/admin/return_index/customer_returns.html.erb +4 -4
  198. data/app/views/spree/admin/return_index/return_authorizations.html.erb +4 -4
  199. data/app/views/spree/admin/roles/index.html.erb +21 -19
  200. data/app/views/spree/admin/shared/_account_nav.html.erb +51 -65
  201. data/app/views/spree/admin/shared/_address_form.html.erb +31 -73
  202. data/app/views/spree/admin/shared/_cal_close.html.erb +10 -0
  203. data/app/views/spree/admin/shared/_content_header.html.erb +40 -21
  204. data/app/views/spree/admin/shared/_edit_resource_links.html.erb +2 -2
  205. data/app/views/spree/admin/shared/_header.html.erb +14 -11
  206. data/app/views/spree/admin/shared/_index_table_options.html.erb +5 -7
  207. data/app/views/spree/admin/shared/_main_menu.html.erb +25 -14
  208. data/app/views/spree/admin/shared/_new_resource_links.html.erb +2 -2
  209. data/app/views/spree/admin/shared/_order_summary.html.erb +2 -0
  210. data/app/views/spree/admin/shared/_order_tabs.html.erb +9 -9
  211. data/app/views/spree/admin/shared/_product_tabs.html.erb +13 -5
  212. data/app/views/spree/admin/shared/_refunds.html.erb +31 -29
  213. data/app/views/spree/admin/shared/_report_order_criteria.html.erb +27 -6
  214. data/app/views/spree/admin/shared/_sidebar.html.erb +19 -1
  215. data/app/views/spree/admin/shared/_table_filter.html.erb +3 -3
  216. data/app/views/spree/admin/shared/_translations.html.erb +33 -1
  217. data/app/views/spree/admin/shared/_version.html.erb +1 -1
  218. data/app/views/spree/admin/shared/named_types/_index.html.erb +3 -1
  219. data/app/views/spree/admin/shipping_categories/index.html.erb +3 -1
  220. data/app/views/spree/admin/shipping_methods/index.html.erb +3 -1
  221. data/app/views/spree/admin/state_changes/index.html.erb +5 -2
  222. data/app/views/spree/admin/states/_state_list.html.erb +25 -24
  223. data/app/views/spree/admin/states/index.html.erb +1 -1
  224. data/app/views/spree/admin/stock_locations/_transfer_stock_form.html.erb +2 -2
  225. data/app/views/spree/admin/stock_locations/index.html.erb +3 -1
  226. data/app/views/spree/admin/stock_movements/index.html.erb +28 -26
  227. data/app/views/spree/admin/stock_transfers/_stock_movements.html.erb +20 -18
  228. data/app/views/spree/admin/stock_transfers/index.html.erb +6 -4
  229. data/app/views/spree/admin/stock_transfers/new.html.erb +3 -3
  230. data/app/views/spree/admin/stock_transfers/show.html.erb +3 -3
  231. data/app/views/spree/admin/store_credit_categories/index.html.erb +3 -1
  232. data/app/views/spree/admin/store_credits/index.html.erb +3 -1
  233. data/app/views/spree/admin/stores/_form.html.erb +128 -68
  234. data/app/views/spree/admin/stores/edit.html.erb +1 -1
  235. data/app/views/spree/admin/stores/index.html.erb +4 -2
  236. data/app/views/spree/admin/tax_categories/index.html.erb +29 -27
  237. data/app/views/spree/admin/tax_rates/index.html.erb +3 -1
  238. data/app/views/spree/admin/taxonomies/_list.html.erb +24 -22
  239. data/app/views/spree/admin/taxonomies/edit.html.erb +2 -2
  240. data/app/views/spree/admin/taxonomies/index.html.erb +1 -1
  241. data/app/views/spree/admin/taxons/_form.html.erb +3 -3
  242. data/app/views/spree/admin/taxons/_taxon_table.html.erb +24 -22
  243. data/app/views/spree/admin/taxons/edit.html.erb +6 -2
  244. data/app/views/spree/admin/taxons/index.html.erb +1 -1
  245. data/app/views/spree/admin/users/_lifetime_stats.html.erb +24 -23
  246. data/app/views/spree/admin/users/_sidebar.html.erb +5 -5
  247. data/app/views/spree/admin/users/_user_page_actions.html.erb +1 -1
  248. data/app/views/spree/admin/users/edit.html.erb +2 -2
  249. data/app/views/spree/admin/users/index.html.erb +25 -23
  250. data/app/views/spree/admin/users/items.html.erb +3 -2
  251. data/app/views/spree/admin/users/orders.html.erb +30 -29
  252. data/app/views/spree/admin/variants/_autocomplete_line_items_stock.js.erb +3 -3
  253. data/app/views/spree/admin/variants/_autocomplete_stock.js.erb +2 -2
  254. data/app/views/spree/admin/variants/_form.html.erb +14 -2
  255. data/app/views/spree/admin/variants/_split.js.erb +2 -2
  256. data/app/views/spree/admin/variants/index.html.erb +7 -5
  257. data/app/views/spree/admin/zones/index.html.erb +4 -4
  258. data/app/views/spree/layouts/admin.html.erb +33 -27
  259. data/config/initializers/ransack.rb +31 -0
  260. data/config/routes.rb +1 -0
  261. data/lib/spree/backend.rb +2 -0
  262. data/lib/spree_backend.rb +0 -1
  263. data/spec/fixtures/thinking-cat.jpg +0 -0
  264. data/spree_backend.gemspec +6 -4
  265. data/vendor/assets/javascripts/js.cookie.js +154 -156
  266. data/vendor/assets/javascripts/purify.js +1217 -0
  267. data/vendor/assets/javascripts/sortable.js +3709 -0
  268. data/vendor/assets/stylesheets/animate.css +7 -3156
  269. data/vendor/assets/stylesheets/jquery.jstree/themes/spree/style.scss +23 -9
  270. metadata +138 -25
@@ -24,3 +24,41 @@ span.or {
24
24
  }
25
25
  }
26
26
  }
27
+
28
+ // Hide number toggler
29
+ // Chrome, Safari, Edge, Opera
30
+ input.hide-number-toggle::-webkit-outer-spin-button,
31
+ input.hide-number-toggle::-webkit-inner-spin-button {
32
+ -webkit-appearance: none;
33
+ margin: 0;
34
+ }
35
+ // Firefox
36
+ input[type=number].hide-number-toggle {
37
+ -moz-appearance: textfield;
38
+ }
39
+
40
+
41
+ // Remove the default 5px outlines and box-shadows
42
+ // from all inputs on focus.
43
+ .form-control:focus {
44
+ box-shadow: none !important;
45
+ }
46
+
47
+ *:focus {
48
+ outline: none;
49
+ }
50
+
51
+ :-webkit-direct-focus {
52
+ outline-color: transparent;
53
+ outline-style: auto;
54
+ outline-width: 0;
55
+ }
56
+
57
+ .custom-select {
58
+ background: $input-bg url(asset-path("backend-chevron-down.svg")) no-repeat right 0.5rem center/8px 10px;
59
+ background-size: 0.7em;
60
+ &:focus{
61
+ outline: none;
62
+ box-shadow: none;
63
+ }
64
+ }
@@ -20,6 +20,11 @@
20
20
 
21
21
  @import 'plugins/select2';
22
22
  @import 'plugins/jquery_ui';
23
+ @import 'plugins/flatpickr';
23
24
 
24
25
  @import 'shared/base';
25
26
  @import 'shared/forms';
27
+
28
+ @import 'views/order_payments';
29
+ @import 'views/product_properties';
30
+ @import 'views/prototypes';
@@ -0,0 +1,12 @@
1
+ // Styling For Order Payments
2
+ div.previous_cards {
3
+ ul {
4
+ li {
5
+ list-style: none;
6
+ margin: 5px 0;
7
+ input {
8
+ margin-right: 10px;
9
+ }
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,11 @@
1
+ table#product_properties {
2
+ .show_property {
3
+ text-align: center;
4
+ }
5
+ .property_name input {
6
+ min-width: 140px;
7
+ }
8
+ .value input {
9
+ min-width: 180px;
10
+ }
11
+ }
@@ -0,0 +1,42 @@
1
+ $color_size: 26px;
2
+
3
+ .product-prototype-options {
4
+ .option-type-values {
5
+ &__color {
6
+ display: flex;
7
+ flex-wrap: wrap;
8
+ align-items: center;
9
+ max-width: 350px;
10
+ input {
11
+ display: none;
12
+ }
13
+ }
14
+ li {
15
+ display: flex;
16
+ align-items: center;
17
+ margin: 0.25rem;
18
+ input {
19
+ margin-right: 0.5rem;
20
+ }
21
+ }
22
+ }
23
+ .option-value__color {
24
+ border-radius: 50%;
25
+ border: 2px solid #d3d3d3;
26
+ width: $color_size;
27
+ height: $color_size;
28
+ overflow: hidden;
29
+ padding: 1px;
30
+ &:after {
31
+ content: '';
32
+ display: inline-block;
33
+ width: 100%;
34
+ height: 100%;
35
+ background-color: var(--presentation);
36
+ border-radius: 50%;
37
+ }
38
+ }
39
+ input:checked + .option-value__color {
40
+ border-color: #565656;
41
+ }
42
+ }
@@ -3,9 +3,9 @@
3
3
  * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
4
4
  * the top of the compiled file, but it's generally better to create a new file per style scope.
5
5
 
6
- *= require jquery-ui/datepicker
7
6
  *= require jquery-ui/autocomplete
8
7
  *= require select2
9
8
  *= require animate
9
+ *= require flatpickr
10
10
  *= require spree/backend/spree_admin
11
11
  */
@@ -3,6 +3,8 @@ module Spree
3
3
  class GeneralSettingsController < Spree::Admin::BaseController
4
4
  include Spree::Backend::Callbacks
5
5
 
6
+ before_action :update_currency_settings, only: :update
7
+
6
8
  def edit
7
9
  @preferences_security = []
8
10
  end
@@ -23,6 +25,31 @@ module Spree
23
25
  invoke_callbacks(:clear_cache, :after)
24
26
  head :no_content
25
27
  end
28
+
29
+ def render(*args)
30
+ @preferences_currency |= [:allow_currency_change, :show_currency_selector]
31
+ super
32
+ end
33
+
34
+ private
35
+
36
+ def update_currency_settings
37
+ params.each do |name, value|
38
+ next unless Spree::Config.has_preference?(name) && name.eql?('supported_currencies')
39
+
40
+ value = update_value(value)
41
+ Spree::Config[name] = value
42
+ end
43
+ end
44
+
45
+ def update_value(value)
46
+ value.split(',').
47
+ map { |curr| ::Money::Currency.find(curr.strip).try(:iso_code) }.
48
+ concat([Spree::Config[:currency]]).
49
+ uniq.
50
+ compact.
51
+ join(',')
52
+ end
26
53
  end
27
54
  end
28
55
  end
@@ -0,0 +1,39 @@
1
+ module Spree
2
+ module Admin
3
+ class PricesController < ResourceController
4
+ belongs_to 'spree/product', find_by: :slug
5
+
6
+ helper_method :supported_currencies_for_all_stores
7
+
8
+ def create
9
+ params.require(:vp).permit!
10
+ params[:vp].each do |variant_id, prices|
11
+ next unless variant_id
12
+
13
+ variant = Spree::Variant.find(variant_id)
14
+ next unless variant
15
+
16
+ supported_currencies_for_all_stores.each do |currency|
17
+ price = variant.price_in(currency.iso_code)
18
+ price.price = (prices[currency.iso_code]['price'].blank? ? nil : prices[currency.iso_code]['price'])
19
+ price.compare_at_price = (prices[currency.iso_code]['compare_at_price'].blank? ? nil : prices[currency.iso_code]['compare_at_price'])
20
+ price.save! if price.new_record? && price.price || !price.new_record? && price.changed?
21
+ end
22
+ end
23
+ flash[:success] = Spree.t('notice_messages.prices_saved')
24
+ redirect_to admin_product_path(parent)
25
+ end
26
+
27
+ private
28
+
29
+ def supported_currencies_for_all_stores
30
+ @supported_currencies_for_all_stores = begin
31
+ (
32
+ Spree::Store.pluck(:supported_currencies).map { |c| c&.split(',') }.flatten + Spree::Store.pluck(:default_currency)
33
+ ).
34
+ compact.uniq.map { |code| ::Money::Currency.find(code.strip) }
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -20,7 +20,10 @@ module Spree
20
20
 
21
21
  def create
22
22
  if params[:variant].nil?
23
- flash[:error] = Spree.t('stock_transfer.errors.must_have_variant')
23
+ flash.now[:error] = Spree.t('stock_transfer.errors.must_have_variant')
24
+ render :new
25
+ elsif any_missing_variants?(params[:variant])
26
+ flash.now[:error] = Spree.t('stock_transfer.errors.variants_unavailable', stock: source_location.name)
24
27
  render :new
25
28
  else
26
29
  variants = Hash.new(0)
@@ -51,6 +54,10 @@ module Spree
51
54
  def destination_location
52
55
  @destination_location ||= StockLocation.find(params[:transfer_destination_location_id])
53
56
  end
57
+
58
+ def any_missing_variants?(variant_ids)
59
+ source_location&.stock_items&.where(variant_id: variant_ids, count_on_hand: 0)&.any?
60
+ end
54
61
  end
55
62
  end
56
63
  end
@@ -3,9 +3,43 @@ module Spree
3
3
  class StoresController < Spree::Admin::BaseController
4
4
  before_action :load_store, only: [:new, :edit, :update]
5
5
  before_action :set_default_currency, only: :new
6
+ before_action :set_default_locale, only: :new
7
+ before_action :normalize_supported_currencies, only: [:create, :update]
8
+ before_action :set_default_country_id, only: :new
9
+ before_action :load_all_countries, only: [:new, :edit, :update, :create]
10
+
11
+ if defined?(SpreeI18n)
12
+ include SpreeI18n::LocaleHelper
13
+ end
14
+
15
+ helper_method :all_locales_options
6
16
 
7
17
  def index
8
- @stores = Spree::Store.all
18
+ if params[:ids]
19
+ load_stores_by_ids
20
+ elsif params[:q]
21
+ load_stores_by_query
22
+ else
23
+ @stores = Spree::Store.all
24
+ end
25
+
26
+ respond_with(@stores) do |format|
27
+ format.json { render layout: false }
28
+ end
29
+ end
30
+
31
+ def load_stores_by_ids
32
+ ids = params[:ids].split(',')
33
+ @stores = Spree::Store.where(id: ids)
34
+ end
35
+
36
+ def load_stores_by_query
37
+ @stores = if defined?(SpreeGlobalize)
38
+ Spree::Store.joins(:translations).where("LOWER(#{Store::Translation.table_name}.name) LIKE LOWER(:query)",
39
+ query: "%#{params[:q]}%")
40
+ else
41
+ Spree::Store.where('LOWER(name) LIKE LOWER(:query)', query: "%#{params[:q]}%")
42
+ end
9
43
  end
10
44
 
11
45
  def create
@@ -76,9 +110,35 @@ module Spree
76
110
  @store = Spree::Store.find_by(id: params[:id]) || Spree::Store.new
77
111
  end
78
112
 
113
+ def load_all_countries
114
+ @countries = Spree::Country.all
115
+ end
116
+
79
117
  def set_default_currency
80
118
  @store.default_currency = Spree::Config[:currency]
81
119
  end
120
+
121
+ def set_default_locale
122
+ @store.default_locale = I18n.locale
123
+ end
124
+
125
+ def normalize_supported_currencies
126
+ if params[:store][:supported_currencies]&.is_a?(Array)
127
+ params[:store][:supported_currencies] = params[:store][:supported_currencies].compact.uniq.reject(&:blank?).join(',')
128
+ end
129
+ end
130
+
131
+ def set_default_country_id
132
+ @store.default_country_id = Spree::Config[:default_country_id]
133
+ end
134
+
135
+ # this method is overriten by spree_i18n to add support for more locales
136
+ # in https://github.com/spree-contrib/spree_i18n/blob/master/app/helpers/spree_i18n/locale_helper.rb#L17
137
+ unless defined?(SpreeI18n)
138
+ def all_locales_options
139
+ [['English (EN)', :en]]
140
+ end
141
+ end
82
142
  end
83
143
  end
84
144
  end
@@ -77,7 +77,11 @@ module Spree
77
77
  end
78
78
 
79
79
  def load_taxonomy
80
- @taxonomy = Taxonomy.find(params[:taxonomy_id])
80
+ @taxonomy = if defined?(SpreeGlobalize)
81
+ Taxonomy.includes(:translations, taxons: [:translations]).find(params[:taxonomy_id])
82
+ else
83
+ Taxonomy.find(params[:taxonomy_id])
84
+ end
81
85
  end
82
86
 
83
87
  def set_position
@@ -3,15 +3,13 @@ module Spree
3
3
  module BaseHelper
4
4
  def flash_alert(flash)
5
5
  if flash.present?
6
- close_button = button_tag(class: 'close', 'data-dismiss' => 'alert', 'aria-label' => Spree.t(:close)) do
7
- content_tag('span', '&times;'.html_safe, 'aria-hidden' => true)
8
- end
9
6
  message = flash[:error] || flash[:notice] || flash[:success]
10
7
  flash_class = 'danger' if flash[:error]
11
8
  flash_class = 'info' if flash[:notice]
12
9
  flash_class = 'success' if flash[:success]
13
- flash_div = content_tag(:div, (close_button + message), class: "alert alert-#{flash_class} alert-auto-disappear")
14
- content_tag(:div, flash_div, class: 'col-12')
10
+ flash_div = content_tag(:div, message, class: "alert alert-#{flash_class} mx-2")
11
+ content_tag(:div, flash_div,
12
+ class: 'd-flex justify-content-center position-fixed flash-alert ')
15
13
  end
16
14
  end
17
15
 
@@ -37,6 +35,15 @@ module Spree
37
35
  end
38
36
  end
39
37
 
38
+ def svg_icon(name:, classes: '', width:, height:)
39
+ if name.ends_with?('.svg')
40
+ icon_name = File.basename(name, File.extname(name))
41
+ inline_svg_tag "backend-#{icon_name}.svg", class: "icon-#{icon_name} #{classes}", size: "#{width}px*#{height}px"
42
+ else
43
+ inline_svg_tag "backend-#{name}.svg", class: "icon-#{name} #{classes}", size: "#{width}px*#{height}px"
44
+ end
45
+ end
46
+
40
47
  def datepicker_field_value(date)
41
48
  unless date.blank?
42
49
  l(date, format: Spree.t('date_picker.format', default: '%Y/%m/%d'))
@@ -130,7 +137,7 @@ module Spree
130
137
  # renders hidden field and link to remove record using nested_attributes
131
138
  def link_to_icon_remove_fields(form)
132
139
  url = form.object.persisted? ? [:admin, form.object] : '#'
133
- link_to_with_icon('delete', '', url,
140
+ link_to_with_icon('delete.svg', '', url,
134
141
  class: 'spree_remove_fields btn btn-sm btn-danger',
135
142
  data: {
136
143
  action: 'remove'
@@ -152,7 +159,7 @@ module Spree
152
159
  def order_time(time)
153
160
  return '' if time.blank?
154
161
 
155
- [I18n.l(time.to_date), time.strftime('%l:%M %p').strip].join(' ')
162
+ [I18n.l(time.to_date), time.strftime('%l:%M %p %Z').strip].join(' ')
156
163
  end
157
164
 
158
165
  def required_span_tag
@@ -165,7 +172,17 @@ module Spree
165
172
  button_link_to(
166
173
  Spree.t(:preview_product),
167
174
  spree.product_url(product),
168
- class: 'btn-outline-secondary', icon: 'eye-open', id: 'admin_preview_product', target: :blank
175
+ class: 'btn-outline-secondary', icon: 'view.svg', id: 'admin_preview_product', target: :blank
176
+ )
177
+ end
178
+
179
+ def taxon_preview_link(taxon)
180
+ return unless frontend_available?
181
+
182
+ button_link_to(
183
+ Spree.t(:preview_taxon),
184
+ seo_url(taxon),
185
+ class: 'btn-outline-secondary', icon: 'view.svg', id: 'admin_preview_taxon', target: :blank
169
186
  )
170
187
  end
171
188
  end
@@ -15,6 +15,9 @@ module Spree
15
15
  # Example:
16
16
  # # Link to /admin/orders, also highlight tab for ProductsController and ShipmentsController
17
17
  # tab :orders, :products, :shipments
18
+
19
+ ICON_SIZE = 16
20
+
18
21
  def tab(*args)
19
22
  options = { label: args.first.to_s }
20
23
 
@@ -48,7 +51,7 @@ module Spree
48
51
  link_to(
49
52
  titleized_label,
50
53
  destination_url,
51
- class: "sidebar-submenu-item w-100 py-1 px-3 d-block #{'text-success' if selected}"
54
+ class: "sidebar-submenu-item w-100 py-2 py-md-1 pl-3 d-block #{'text-success' if selected}"
52
55
  )
53
56
  end
54
57
 
@@ -61,9 +64,15 @@ module Spree
61
64
  # Single main menu item
62
65
  def main_menu_item(text, url: nil, icon: nil)
63
66
  link_to url, 'data-toggle': 'collapse', class: 'd-flex w-100 p-3 position-relative align-items-center' do
64
- content_tag(:span, nil, class: "icon icon-#{icon} mr-2") +
65
- content_tag(:span, " #{text}", class: 'text') +
66
- content_tag(:span, nil, class: 'icon icon-chevron-left position-absolute')
67
+ if icon.ends_with?('.svg')
68
+ svg_icon(name: icon, classes: 'mr-2', width: ICON_SIZE, height: ICON_SIZE) +
69
+ content_tag(:span, " #{text}", class: 'text') +
70
+ svg_icon(name: 'chevron-left.svg', classes: 'drop-menu-indicator position-absolute', width: (ICON_SIZE - 4), height: (ICON_SIZE - 4))
71
+ else
72
+ content_tag(:span, nil, class: "icon icon-#{icon} mr-2") +
73
+ content_tag(:span, " #{text}", class: 'text') +
74
+ svg_icon(name: 'chevron-left.svg', classes: 'drop-menu-indicator position-absolute', width: (ICON_SIZE - 4), height: (ICON_SIZE - 4))
75
+ end
67
76
  end
68
77
  end
69
78
 
@@ -86,17 +95,17 @@ module Spree
86
95
  end
87
96
  else
88
97
  per_page_default = Spree::Config.admin_orders_per_page
89
- per_page_options = %w{15 30 45 60}
98
+ per_page_options = %w{25 50 75}
90
99
  end
91
100
 
92
101
  selected_option = params[:per_page].try(:to_i) || per_page_default
93
102
 
94
103
  select_tag(:per_page,
95
104
  options_for_select(per_page_options, selected_option),
96
- class: "form-control pull-right js-per-page-select per-page-selected-#{selected_option}")
105
+ class: "w-auto form-control js-per-page-select per-page-selected-#{selected_option} custom-select")
97
106
  end
98
107
 
99
- # helper method to create proper url to apply per page filtering
108
+ # helper method to create proper url to apply per page ing
100
109
  # fixes https://github.com/spree/spree/issues/6888
101
110
  def per_page_dropdown_params(args = nil)
102
111
  args = params.permit!.to_h.clone
@@ -123,7 +132,7 @@ module Spree
123
132
  options[:data] = { action: 'clone', 'original-title': Spree.t(:clone) }
124
133
  options[:class] = 'btn btn-primary btn-sm with-tip'
125
134
  options[:method] = :post
126
- options[:icon] = :clone
135
+ options[:icon] = 'clone.svg'
127
136
  button_link_to '', clone_object_url(resource), options
128
137
  end
129
138
 
@@ -131,7 +140,7 @@ module Spree
131
140
  options[:data] = { action: 'clone', 'original-title': Spree.t(:clone) }
132
141
  options[:class] = 'btn btn-warning btn-sm with-tip'
133
142
  options[:method] = :post
134
- options[:icon] = :clone
143
+ options[:icon] = 'clone.svg'
135
144
  button_link_to '', clone_admin_promotion_path(promotion), options
136
145
  end
137
146
 
@@ -139,13 +148,13 @@ module Spree
139
148
  url = options[:url] || edit_object_url(resource)
140
149
  options[:data] = { action: 'edit' }
141
150
  options[:class] = 'btn btn-primary btn-sm'
142
- link_to_with_icon('edit', Spree.t(:edit), url, options)
151
+ link_to_with_icon('edit.svg', Spree.t(:edit), url, options)
143
152
  end
144
153
 
145
154
  def link_to_edit_url(url, options = {})
146
155
  options[:data] = { action: 'edit' }
147
156
  options[:class] = 'btn btn-primary btn-sm'
148
- link_to_with_icon('edit', Spree.t(:edit), url, options)
157
+ link_to_with_icon('edit.svg', Spree.t(:edit), url, options)
149
158
  end
150
159
 
151
160
  def link_to_delete(resource, options = {})
@@ -153,7 +162,7 @@ module Spree
153
162
  name = options[:name] || Spree.t(:delete)
154
163
  options[:class] = 'btn btn-danger btn-sm delete-resource'
155
164
  options[:data] = { confirm: Spree.t(:are_you_sure), action: 'remove' }
156
- link_to_with_icon 'delete', name, url, options
165
+ link_to_with_icon 'delete.svg', name, url, options
157
166
  end
158
167
 
159
168
  def link_to_with_icon(icon_name, text, url, options = {})
@@ -162,20 +171,32 @@ module Spree
162
171
  text = options[:no_text] ? '' : content_tag(:span, text, class: 'text')
163
172
  options.delete(:no_text)
164
173
  if icon_name
165
- icon = content_tag(:span, '', class: "#{'mr-2' unless text.empty?} icon icon-#{icon_name}")
174
+ icon = if icon_name.ends_with?('.svg')
175
+ svg_icon(name: icon_name, classes: "#{'mr-2' unless text.empty?} icon icon-#{icon_name}", width: ICON_SIZE, height: ICON_SIZE)
176
+ else
177
+ content_tag(:span, '', class: "#{'mr-2' unless text.empty?} icon icon-#{icon_name}")
178
+ end
166
179
  text = "#{icon} #{text}"
167
180
  end
168
181
  link_to(text.html_safe, url, options)
169
182
  end
170
183
 
171
184
  def spree_icon(icon_name)
172
- icon_name ? content_tag(:i, '', class: icon_name) : ''
185
+ if icon_name.ends_with?('.svg')
186
+ icon_name ? svg_icon(name: icon_name, classes: icon_name, width: ICON_SIZE, height: ICON_SIZE) : ''
187
+ else
188
+ icon_name ? content_tag(:span, '', class: icon_name) : ''
189
+ end
173
190
  end
174
191
 
175
192
  # Override: Add disable_with option to prevent multiple request on consecutive clicks
176
193
  def button(text, icon_name = nil, button_type = 'submit', options = {})
177
194
  if icon_name
178
- icon = content_tag(:span, '', class: "icon icon-#{icon_name}")
195
+ icon = if icon_name.ends_with?('.svg')
196
+ svg_icon(name: icon_name, classes: "icon icon-#{icon_name}", width: ICON_SIZE, height: ICON_SIZE)
197
+ else
198
+ content_tag(:span, '', class: "icon icon-#{icon_name}")
199
+ end
179
200
  text = "#{icon} #{text}"
180
201
  end
181
202
  button_tag(
@@ -192,7 +213,7 @@ module Spree
192
213
  if html_options[:method] &&
193
214
  !html_options[:method].to_s.casecmp('get').zero? &&
194
215
  !html_options[:remote]
195
- form_tag(url, method: html_options.delete(:method), class: 'd-inline') do
216
+ form_tag(url, method: html_options.delete(:method)) do
196
217
  button(text, html_options.delete(:icon), nil, html_options)
197
218
  end
198
219
  else
@@ -206,11 +227,15 @@ module Spree
206
227
  html_options[:class] = html_options[:class] ? "btn #{html_options[:class]}" : 'btn btn-outline-secondary'
207
228
 
208
229
  if html_options[:icon]
209
- icon = content_tag(:span, '', class: "icon icon-#{html_options[:icon]}")
230
+ icon = if html_options[:icon].ends_with?('.svg')
231
+ svg_icon(name: html_options[:icon], classes: "icon icon-#{html_options[:icon]}", width: ICON_SIZE, height: ICON_SIZE)
232
+ else
233
+ content_tag(:span, '', class: "icon icon-#{html_options[:icon]}")
234
+ end
210
235
  text = "#{icon} #{text}"
211
236
  end
212
237
 
213
- link_to(text.html_safe, url, html_options)
238
+ link_to(text.html_safe, url, html_options.except(:icon))
214
239
  end
215
240
  end
216
241
 
@@ -222,7 +247,7 @@ module Spree
222
247
  options[:class] = 'sidebar-menu-item d-block w-100'
223
248
  options[:class] << ' selected' if is_selected
224
249
  content_tag(:li, options) do
225
- link_to(link_text, url, class: "#{'text-success' if is_selected} py-1 px-3 d-block sidebar-submenu-item")
250
+ link_to(link_text, url, class: "#{'text-success' if is_selected} sidebar-submenu-item w-100 py-2 py-md-1 pl-3 d-block")
226
251
  end
227
252
  end
228
253
 
@@ -235,6 +260,9 @@ module Spree
235
260
  end
236
261
 
237
262
  def main_sidebar_classes
263
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
264
+ Admin::NavigationsHelper#main_sidebar_classes is deprecated and will be removed in Spree 5.0.
265
+ DEPRECATION
238
266
  if cookies['sidebar-minimized'] == 'true'
239
267
  'col-3 col-md-2 sidebar'
240
268
  else
@@ -243,6 +271,9 @@ module Spree
243
271
  end
244
272
 
245
273
  def wrapper_classes
274
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
275
+ Admin::NavigationsHelper#wrapper_classes is deprecated and will be removed in Spree 5.0.
276
+ DEPRECATION
246
277
  'sidebar-minimized' if cookies['sidebar-minimized'] == 'true'
247
278
  end
248
279
  end
@@ -10,13 +10,13 @@ module Spree
10
10
  label = Spree.t(event, scope: 'admin.order.events', default: Spree.t(event))
11
11
  links << button_link_to(
12
12
  label.capitalize,
13
- [event.to_sym, :admin, order],
13
+ [event, :admin, order],
14
14
  method: :put,
15
- icon: event.to_s,
15
+ icon: event.to_s + '.svg',
16
16
  data: { confirm: Spree.t(:order_sure_want_to, event: label) }
17
17
  )
18
18
  end
19
- safe_join(links, '&nbsp;'.html_safe)
19
+ safe_join(links, ''.html_safe)
20
20
  end
21
21
 
22
22
  def line_item_shipment_price(line_item, quantity)
@@ -8,6 +8,6 @@
8
8
  -%>
9
9
  <% unless current_page.first? %>
10
10
  <li class="first page-item">
11
- <%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, remote: remote, class: 'page-link' %>
11
+ <%= link_to_unless current_page.first?, svg_icon(name: "double-chevron-left.svg", width: '13', height: '16', classes: 'spree-icon-arrow-left mb-0'), url, remote: remote, class: 'page-link', 'aria-label': 'First page' %>
12
12
  </li>
13
13
  <% end %>
@@ -5,7 +5,7 @@
5
5
  per_page: number of items to fetch per page
6
6
  remote: data-remote
7
7
  -%>
8
- <li class="page gap disabled page-item">
8
+ <li class="page gap disabled page-item d-none d-lg-flex">
9
9
  <a href="#" onclick="return false;" class="page-link">
10
10
  <%= raw(t 'views.pagination.truncate') %>
11
11
  </a>
@@ -8,6 +8,6 @@
8
8
  -%>
9
9
  <% unless current_page.last? %>
10
10
  <li class="last next page-item"><%# "next" class present for border styling in twitter bootstrap %>
11
- <%= link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, remote: remote, class: 'page-link' %>
11
+ <%= link_to_unless current_page.last?, svg_icon(name: "double-chevron-right.svg", width: '13', height: '16', classes: 'spree-icon-arrow-right mb-0'), url, remote: remote, class: 'page-link', 'aria-label': 'Last page' %>
12
12
  </li>
13
13
  <% end %>
@@ -8,6 +8,6 @@
8
8
  -%>
9
9
  <% unless current_page.last? %>
10
10
  <li class="next_page page-item">
11
- <%= link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, rel: 'next', remote: remote, class: 'page-link' %>
11
+ <%= link_to_unless current_page.last?, svg_icon(name: "chevron-right.svg", width: '13', height: '16', classes: 'spree-icon-arrow-right mb-0'), url, rel: 'next', remote: remote, class: 'page-link', 'aria-label': 'Next page' %>
12
12
  </li>
13
13
  <% end %>
@@ -9,7 +9,7 @@
9
9
  <% pagination_class ||= '' %>
10
10
 
11
11
  <%= paginator.render do %>
12
- <ul class="pagination mt-4 <%= pagination_class %>">
12
+ <ul class="pagination d-inline-flex <%= pagination_class %>">
13
13
  <%= first_page_tag unless current_page.first? %>
14
14
  <%= prev_page_tag unless current_page.first? %>
15
15
  <% each_page do |page| %>