spree_admin 5.0.2 → 5.1.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 (273) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/login_sidebar_background.png +0 -0
  3. data/app/assets/stylesheets/spree/admin/components/_bulk_panel.scss +8 -1
  4. data/app/assets/stylesheets/spree/admin/components/_buttons.scss +12 -20
  5. data/app/assets/stylesheets/spree/admin/components/_cards.scss +9 -3
  6. data/app/assets/stylesheets/spree/admin/components/_dropdowns.scss +13 -40
  7. data/app/assets/stylesheets/spree/admin/components/_filters.scss +32 -3
  8. data/app/assets/stylesheets/spree/admin/components/_main.scss +107 -31
  9. data/app/assets/stylesheets/spree/admin/components/_media_form.scss +21 -9
  10. data/app/assets/stylesheets/spree/admin/components/_modals.scss +4 -3
  11. data/app/assets/stylesheets/spree/admin/components/_navbar.scss +5 -9
  12. data/app/assets/stylesheets/spree/admin/components/_navigation.scss +0 -1
  13. data/app/assets/stylesheets/spree/admin/components/_sortable_tree.scss +6 -2
  14. data/app/assets/stylesheets/spree/admin/components/_tables.scss +35 -5
  15. data/app/assets/stylesheets/spree/admin/global/_variables.scss +37 -17
  16. data/app/assets/stylesheets/spree/admin/plugins/tom-select.bootstrap4.scss +5 -4
  17. data/app/assets/stylesheets/spree/admin/shared/_base.scss +50 -17
  18. data/app/assets/stylesheets/spree/admin/shared/_forms.scss +6 -2
  19. data/app/assets/stylesheets/spree/admin/views/_page_builder.scss +30 -21
  20. data/app/controllers/concerns/spree/admin/breadcrumb_concern.rb +22 -0
  21. data/app/controllers/concerns/spree/admin/preferences_concern.rb +22 -0
  22. data/app/controllers/concerns/spree/admin/products_breadcrumb_concern.rb +22 -0
  23. data/app/controllers/concerns/spree/admin/promotions_breadcrumb_concern.rb +23 -0
  24. data/app/controllers/concerns/spree/admin/storefront_breadcrumb_concern.rb +12 -0
  25. data/app/controllers/spree/admin/addresses_controller.rb +4 -0
  26. data/app/controllers/spree/admin/admin_users_controller.rb +112 -0
  27. data/app/controllers/spree/admin/assets_controller.rb +7 -9
  28. data/app/controllers/spree/admin/base_controller.rb +21 -10
  29. data/app/controllers/spree/admin/checkouts_controller.rb +4 -0
  30. data/app/controllers/spree/admin/classifications_controller.rb +4 -0
  31. data/app/controllers/spree/admin/coupon_codes_controller.rb +2 -0
  32. data/app/controllers/spree/admin/custom_domains_controller.rb +6 -0
  33. data/app/controllers/spree/admin/customer_returns_controller.rb +4 -0
  34. data/app/controllers/spree/admin/dashboard_controller.rb +19 -14
  35. data/app/controllers/spree/admin/digital_assets_controller.rb +8 -0
  36. data/app/controllers/spree/admin/exports_controller.rb +6 -2
  37. data/app/controllers/spree/admin/integrations_controller.rb +61 -0
  38. data/app/controllers/spree/admin/invitations_controller.rb +128 -0
  39. data/app/controllers/spree/admin/line_items_controller.rb +4 -0
  40. data/app/controllers/spree/admin/oauth_applications_controller.rb +6 -0
  41. data/app/controllers/spree/admin/option_types_controller.rb +15 -0
  42. data/app/controllers/spree/admin/option_values_controller.rb +4 -0
  43. data/app/controllers/spree/admin/orders/return_authorizations_controller.rb +4 -0
  44. data/app/controllers/spree/admin/orders_controller.rb +11 -0
  45. data/app/controllers/spree/admin/page_blocks_controller.rb +12 -3
  46. data/app/controllers/spree/admin/page_links_controller.rb +9 -0
  47. data/app/controllers/spree/admin/page_sections_controller.rb +26 -5
  48. data/app/controllers/spree/admin/pages_controller.rb +7 -0
  49. data/app/controllers/spree/admin/payment_methods_controller.rb +23 -12
  50. data/app/controllers/spree/admin/post_categories_controller.rb +3 -0
  51. data/app/controllers/spree/admin/posts_controller.rb +11 -0
  52. data/app/controllers/spree/admin/products_controller.rb +11 -8
  53. data/app/controllers/spree/admin/promotion_actions_controller.rb +10 -2
  54. data/app/controllers/spree/admin/promotion_rules_controller.rb +10 -2
  55. data/app/controllers/spree/admin/promotions_controller.rb +6 -0
  56. data/app/controllers/spree/admin/properties_controller.rb +15 -0
  57. data/app/controllers/spree/admin/refund_reasons_controller.rb +7 -0
  58. data/app/controllers/spree/admin/refunds_controller.rb +4 -0
  59. data/app/controllers/spree/admin/reimbursement_types_controller.rb +7 -0
  60. data/app/controllers/spree/admin/reimbursements_controller.rb +4 -0
  61. data/app/controllers/spree/admin/reports_controller.rb +12 -2
  62. data/app/controllers/spree/admin/resource_controller.rb +1 -1
  63. data/app/controllers/spree/admin/return_authorization_reasons_controller.rb +7 -0
  64. data/app/controllers/spree/admin/return_authorizations_controller.rb +4 -0
  65. data/app/controllers/spree/admin/return_items_controller.rb +6 -0
  66. data/app/controllers/spree/admin/role_users_controller.rb +36 -0
  67. data/app/controllers/spree/admin/roles_controller.rb +8 -0
  68. data/app/controllers/spree/admin/shipments_controller.rb +2 -2
  69. data/app/controllers/spree/admin/shipping_categories_controller.rb +7 -0
  70. data/app/controllers/spree/admin/shipping_methods_controller.rb +6 -0
  71. data/app/controllers/spree/admin/stock_items_controller.rb +13 -0
  72. data/app/controllers/spree/admin/stock_locations_controller.rb +7 -0
  73. data/app/controllers/spree/admin/stock_transfers_controller.rb +14 -2
  74. data/app/controllers/spree/admin/store_credit_categories_controller.rb +5 -0
  75. data/app/controllers/spree/admin/store_credits_controller.rb +4 -0
  76. data/app/controllers/spree/admin/storefront_controller.rb +3 -0
  77. data/app/controllers/spree/admin/stores_controller.rb +17 -2
  78. data/app/controllers/spree/admin/tax_categories_controller.rb +7 -0
  79. data/app/controllers/spree/admin/tax_rates_controller.rb +6 -0
  80. data/app/controllers/spree/admin/taxonomies_controller.rb +15 -0
  81. data/app/controllers/spree/admin/taxons_controller.rb +24 -1
  82. data/app/controllers/spree/admin/themes_controller.rb +7 -0
  83. data/app/controllers/spree/admin/translations_controller.rb +9 -1
  84. data/app/controllers/spree/admin/user_passwords_controller.rb +22 -0
  85. data/app/controllers/spree/admin/user_sessions_controller.rb +23 -0
  86. data/app/controllers/spree/admin/users_controller.rb +11 -2
  87. data/app/controllers/spree/admin/variants_controller.rb +13 -0
  88. data/app/controllers/spree/admin/webhooks_subscribers_controller.rb +34 -12
  89. data/app/controllers/spree/admin/zones_controller.rb +5 -0
  90. data/app/helpers/spree/admin/base_helper.rb +33 -32
  91. data/app/helpers/spree/admin/bulk_operations_helper.rb +8 -2
  92. data/app/helpers/spree/admin/modal_helper.rb +1 -1
  93. data/app/helpers/spree/admin/navigation_helper.rb +12 -6
  94. data/app/helpers/spree/admin/posts_helper.rb +1 -1
  95. data/app/helpers/spree/admin/products_helper.rb +4 -0
  96. data/app/helpers/spree/admin/session_assets_helper.rb +1 -1
  97. data/app/helpers/spree/admin/stores_helper.rb +1 -18
  98. data/app/helpers/spree/admin/tags_helper.rb +3 -3
  99. data/app/javascript/spree/admin/application.js +2 -2
  100. data/app/javascript/spree/admin/controllers/asset_uploader_controller.js +3 -2
  101. data/app/javascript/spree/admin/controllers/variants_form_controller.js +22 -2
  102. data/app/javascript/spree/admin/helpers/bootstrap.js +3 -3
  103. data/app/javascript/spree/admin/helpers/trix/video_embed.js +2 -2
  104. data/app/views/active_storage/_upload_form.html.erb +1 -1
  105. data/app/views/layouts/spree/minimal.html.erb +22 -0
  106. data/app/views/spree/admin/admin_users/_admin_user.html.erb +19 -0
  107. data/app/views/spree/admin/admin_users/_audit_log.html.erb +5 -0
  108. data/app/views/spree/admin/admin_users/_form.html.erb +12 -0
  109. data/app/views/spree/admin/admin_users/edit.html.erb +35 -0
  110. data/app/views/spree/admin/admin_users/index.html.erb +18 -0
  111. data/app/views/spree/admin/admin_users/new.html.erb +21 -0
  112. data/app/views/spree/admin/admin_users/show.html.erb +113 -0
  113. data/app/views/spree/admin/coupon_codes/index.html.erb +6 -6
  114. data/app/views/spree/admin/custom_domains/_custom_domains.html.erb +1 -1
  115. data/app/views/spree/admin/customer_returns/index.html.erb +1 -1
  116. data/app/views/spree/admin/dashboard/_store_preview.html.erb +1 -1
  117. data/app/views/spree/admin/dashboard/_top_products.html.erb +5 -3
  118. data/app/views/spree/admin/digital_assets/_table.html.erb +1 -1
  119. data/app/views/spree/admin/digital_assets/index.html.erb +0 -1
  120. data/app/views/spree/admin/exports/index.html.erb +1 -1
  121. data/app/views/spree/admin/integrations/_integration.html.erb +36 -0
  122. data/app/views/spree/admin/integrations/edit.html.erb +11 -0
  123. data/app/views/spree/admin/integrations/index.html.erb +23 -0
  124. data/app/views/spree/admin/integrations/new.html.erb +14 -0
  125. data/app/views/spree/admin/invitations/_invitation.html.erb +52 -0
  126. data/app/views/spree/admin/invitations/create.turbo_stream.erb +4 -0
  127. data/app/views/spree/admin/invitations/index.html.erb +21 -0
  128. data/app/views/spree/admin/invitations/new.html.erb +32 -0
  129. data/app/views/spree/admin/invitations/show.html.erb +9 -0
  130. data/app/views/spree/admin/line_items/new.html.erb +2 -2
  131. data/app/views/spree/admin/oauth_applications/index.html.erb +1 -1
  132. data/app/views/spree/admin/option_types/edit.html.erb +1 -1
  133. data/app/views/spree/admin/option_types/index.html.erb +1 -1
  134. data/app/views/spree/admin/orders/_customer.html.erb +1 -2
  135. data/app/views/spree/admin/orders/_filters.html.erb +28 -22
  136. data/app/views/spree/admin/orders/_list.html.erb +1 -1
  137. data/app/views/spree/admin/orders/_refunds.html.erb +1 -1
  138. data/app/views/spree/admin/orders/_shipment.html.erb +1 -1
  139. data/app/views/spree/admin/orders/_summary.html.erb +1 -1
  140. data/app/views/spree/admin/orders/_table_filter_dropdown.html.erb +2 -2
  141. data/app/views/spree/admin/orders/customer_returns/_customer_return.html.erb +1 -1
  142. data/app/views/spree/admin/orders/customer_returns/_return_item_decision.html.erb +1 -1
  143. data/app/views/spree/admin/orders/return_authorizations/_form.html.erb +1 -1
  144. data/app/views/spree/admin/orders/return_authorizations/show.html.erb +2 -2
  145. data/app/views/spree/admin/page_blocks/_form_tab_buttons.html.erb +5 -7
  146. data/app/views/spree/admin/page_blocks/edit.html.erb +3 -5
  147. data/app/views/spree/admin/page_blocks/forms/_image.html.erb +9 -0
  148. data/app/views/spree/admin/page_builder/_add_block.html.erb +1 -1
  149. data/app/views/spree/admin/page_builder/_header.html.erb +35 -28
  150. data/app/views/spree/admin/page_builder/_pages_dropdown.html.erb +15 -21
  151. data/app/views/spree/admin/page_builder/_sidebar.html.erb +1 -1
  152. data/app/views/spree/admin/page_builder/_sidebar_block.html.erb +11 -10
  153. data/app/views/spree/admin/page_builder/_sidebar_sections_toolbar.html.erb +152 -39
  154. data/app/views/spree/admin/page_links/_list.html.erb +2 -2
  155. data/app/views/spree/admin/page_links/edit.html.erb +2 -4
  156. data/app/views/spree/admin/page_sections/_form_tab_buttons.html.erb +6 -10
  157. data/app/views/spree/admin/page_sections/new.html.erb +1 -1
  158. data/app/views/spree/admin/pages/edit.html.erb +2 -2
  159. data/app/views/spree/admin/payment_methods/_form.html.erb +1 -1
  160. data/app/views/spree/admin/payment_methods/index.html.erb +16 -15
  161. data/app/views/spree/admin/payments/_payment.html.erb +1 -1
  162. data/app/views/spree/admin/post_categories/index.html.erb +1 -1
  163. data/app/views/spree/admin/posts/index.html.erb +1 -1
  164. data/app/views/spree/admin/products/_bulk_operations.html.erb +1 -1
  165. data/app/views/spree/admin/products/_filters.html.erb +2 -5
  166. data/app/views/spree/admin/products/_list.html.erb +1 -1
  167. data/app/views/spree/admin/products/_table_filter_dropdown.html.erb +2 -2
  168. data/app/views/spree/admin/products/form/_categorization.html.erb +34 -30
  169. data/app/views/spree/admin/products/form/_inventory.html.erb +1 -1
  170. data/app/views/spree/admin/products/form/_properties.html.erb +1 -1
  171. data/app/views/spree/admin/products/form/_variants.html.erb +1 -0
  172. data/app/views/spree/admin/promotion_actions/_promotion_action.html.erb +1 -1
  173. data/app/views/spree/admin/promotion_rules/_promotion_rule.html.erb +1 -1
  174. data/app/views/spree/admin/promotions/_filters.html.erb +2 -6
  175. data/app/views/spree/admin/promotions/_header.html.erb +1 -3
  176. data/app/views/spree/admin/promotions/_sidebar.html.erb +18 -0
  177. data/app/views/spree/admin/promotions/_table_filter_dropdown.html.erb +2 -2
  178. data/app/views/spree/admin/promotions/index.html.erb +1 -1
  179. data/app/views/spree/admin/properties/edit.html.erb +1 -1
  180. data/app/views/spree/admin/properties/index.html.erb +1 -1
  181. data/app/views/spree/admin/refund_reasons/index.html.erb +1 -1
  182. data/app/views/spree/admin/reimbursement_types/index.html.erb +1 -1
  183. data/app/views/spree/admin/reimbursements/edit.html.erb +2 -2
  184. data/app/views/spree/admin/reimbursements/show.html.erb +1 -1
  185. data/app/views/spree/admin/reports/_report.html.erb +1 -1
  186. data/app/views/spree/admin/return_authorization_reasons/index.html.erb +1 -1
  187. data/app/views/spree/admin/return_authorizations/_filters.html.erb +2 -2
  188. data/app/views/spree/admin/return_authorizations/_list.html.erb +1 -1
  189. data/app/views/spree/admin/roles/edit.html.erb +6 -4
  190. data/app/views/spree/admin/roles/index.html.erb +11 -7
  191. data/app/views/spree/admin/shared/_alerts.html.erb +1 -1
  192. data/app/views/spree/admin/shared/_breadcrumbs.html.erb +13 -0
  193. data/app/views/spree/admin/shared/_calendar_range_picker.html.erb +1 -1
  194. data/app/views/spree/admin/shared/_content_header.html.erb +3 -3
  195. data/app/views/spree/admin/shared/_filters_button.html.erb +1 -1
  196. data/app/views/spree/admin/shared/_filters_search_bar.html.erb +1 -1
  197. data/app/views/spree/admin/shared/_head.html.erb +10 -1
  198. data/app/views/spree/admin/shared/_header.html.erb +26 -17
  199. data/app/views/spree/admin/shared/_index_table_options.html.erb +1 -1
  200. data/app/views/spree/admin/shared/_multi_product_picker.html.erb +1 -1
  201. data/app/views/spree/admin/shared/_new_item_dropdown.html.erb +32 -0
  202. data/app/views/spree/admin/shared/_no_resource_found.html.erb +6 -3
  203. data/app/views/spree/admin/shared/_offcanvas_nav.html.erb +1 -14
  204. data/app/views/spree/admin/shared/_refunds.html.erb +1 -1
  205. data/app/views/spree/admin/shared/_sidebar.html.erb +0 -8
  206. data/app/views/spree/admin/shared/_tax_nav.html.erb +1 -0
  207. data/app/views/spree/admin/shared/_team_nav.html.erb +13 -0
  208. data/app/views/spree/admin/shared/_user.html.erb +1 -1
  209. data/app/views/spree/admin/shared/_user_dropdown.html.erb +25 -20
  210. data/app/views/spree/admin/shared/devise/_links.html.erb +18 -0
  211. data/app/views/spree/admin/shared/sidebar/_enterprise_edition_notice.html.erb +7 -5
  212. data/app/views/spree/admin/shared/sidebar/_integrations_nav.html.erb +5 -7
  213. data/app/views/spree/admin/shared/sidebar/_orders_nav.html.erb +2 -2
  214. data/app/views/spree/admin/shared/sidebar/_products_nav.html.erb +2 -2
  215. data/app/views/spree/admin/shared/sidebar/_promotions_nav.html.erb +17 -0
  216. data/app/views/spree/admin/shared/sidebar/_returns_nav.html.erb +1 -1
  217. data/app/views/spree/admin/shared/sidebar/_store_dropdown.html.erb +33 -75
  218. data/app/views/spree/admin/shared/sidebar/_store_nav.html.erb +17 -36
  219. data/app/views/spree/admin/shared/sidebar/_storefront_nav.html.erb +6 -2
  220. data/app/views/spree/admin/shared/sidebar/_vendors_nav.html.erb +9 -7
  221. data/app/views/spree/admin/shared/sortable_tree/_taxonomy.html.erb +1 -1
  222. data/app/views/spree/admin/shipping_categories/index.html.erb +1 -1
  223. data/app/views/spree/admin/shipping_methods/_form.html.erb +7 -134
  224. data/app/views/spree/admin/shipping_methods/form/_display.html.erb +25 -0
  225. data/app/views/spree/admin/shipping_methods/form/_estimated_transit_business_days.html.erb +23 -0
  226. data/app/views/spree/admin/shipping_methods/form/_shipping_categories.html.erb +21 -0
  227. data/app/views/spree/admin/shipping_methods/form/_tax_category.html.erb +16 -0
  228. data/app/views/spree/admin/shipping_methods/form/_tracking_url.html.erb +18 -0
  229. data/app/views/spree/admin/shipping_methods/form/_zones.html.erb +26 -0
  230. data/app/views/spree/admin/shipping_methods/index.html.erb +1 -1
  231. data/app/views/spree/admin/stock_items/index.html.erb +1 -1
  232. data/app/views/spree/admin/stock_locations/_stock_location.html.erb +5 -3
  233. data/app/views/spree/admin/stock_locations/index.html.erb +4 -2
  234. data/app/views/spree/admin/stock_transfers/index.html.erb +1 -1
  235. data/app/views/spree/admin/store_credit_categories/index.html.erb +1 -1
  236. data/app/views/spree/admin/store_credits/_list.html.erb +1 -1
  237. data/app/views/spree/admin/stores/edit_emails.html.erb +1 -1
  238. data/app/views/spree/admin/stores/form/_basic.html.erb +1 -1
  239. data/app/views/spree/admin/stores/form/_emails.html.erb +1 -1
  240. data/app/views/spree/admin/tax_categories/index.html.erb +1 -1
  241. data/app/views/spree/admin/tax_rates/index.html.erb +1 -1
  242. data/app/views/spree/admin/taxonomies/index.html.erb +1 -1
  243. data/app/views/spree/admin/taxons/_form.html.erb +2 -2
  244. data/app/views/spree/admin/themes/_theme.html.erb +6 -4
  245. data/app/views/spree/admin/themes/_theme_preview_image.html.erb +6 -4
  246. data/app/views/spree/admin/themes/index.html.erb +1 -1
  247. data/app/views/spree/admin/translations/edit.html.erb +1 -1
  248. data/app/views/spree/admin/user_passwords/edit.html.erb +21 -0
  249. data/app/views/spree/admin/user_passwords/new.html.erb +12 -0
  250. data/app/views/spree/admin/user_sessions/new.html.erb +16 -0
  251. data/app/views/spree/admin/users/_form.html.erb +10 -8
  252. data/app/views/spree/admin/users/_user.html.erb +7 -6
  253. data/app/views/spree/admin/users/index.html.erb +7 -6
  254. data/app/views/spree/admin/users/new.html.erb +1 -1
  255. data/app/views/spree/admin/variants/_search_result.html.erb +1 -1
  256. data/app/views/spree/admin/variants/form/_media.html.erb +1 -0
  257. data/app/views/spree/admin/variants/form/_media_asset.html.erb +1 -1
  258. data/app/views/spree/admin/webhooks_subscribers/_form.html.erb +37 -19
  259. data/app/views/spree/admin/webhooks_subscribers/_webhooks_subscriber.html.erb +12 -6
  260. data/app/views/spree/admin/webhooks_subscribers/edit.html.erb +2 -2
  261. data/app/views/spree/admin/webhooks_subscribers/index.html.erb +1 -1
  262. data/app/views/spree/admin/webhooks_subscribers/show.html.erb +58 -47
  263. data/app/views/spree/admin/zones/_form.html.erb +11 -15
  264. data/app/views/spree/admin/zones/index.html.erb +1 -1
  265. data/config/importmap.rb +2 -2
  266. data/config/locales/en.yml +4 -1
  267. data/config/routes.rb +13 -1
  268. data/lib/spree/admin/engine.rb +11 -1
  269. data/lib/spree/admin.rb +1 -0
  270. data/vendor/javascript/bootstrap--dist--js--bootstrap.bundle.min.js.js +4 -4
  271. data/vendor/javascript/dompurify.js +24 -24
  272. metadata +65 -9
  273. data/app/javascript/spree/admin/controllers/webhook_subscriber_events_controller.js +0 -19
@@ -37,7 +37,8 @@ export default class extends CheckboxSelectAll {
37
37
  currentStockLocationId: String,
38
38
  stockLocations: Array,
39
39
  optionValuesSelectOptions: Array,
40
- locale: String
40
+ locale: String,
41
+ adminPath: String
41
42
  }
42
43
 
43
44
  connect() {
@@ -67,6 +68,8 @@ export default class extends CheckboxSelectAll {
67
68
  .filter((internalName) => !existingVariantsOnServer.includes(internalName))
68
69
  )
69
70
  }
71
+
72
+ this.inventoryFormTarget = document.querySelector('.inventory-form');
70
73
  }
71
74
 
72
75
  toggleQuantityTracked() {
@@ -236,11 +239,14 @@ export default class extends CheckboxSelectAll {
236
239
  }
237
240
 
238
241
  optionsValueChanged(value, previousValue) {
242
+ let hasNoOptions = true
243
+
239
244
  if (this.hasNewOptionButtonTarget) {
240
245
  const label = this.newOptionButtonLabelTarget
241
246
 
242
247
  if (Object.values(value).filter(Boolean).length) {
243
248
  label.textContent = label.dataset.hasOptionsText
249
+ hasNoOptions = false
244
250
  } else {
245
251
  label.textContent = label.dataset.noOptionsText
246
252
  }
@@ -248,6 +254,8 @@ export default class extends CheckboxSelectAll {
248
254
  this.refreshOptionNameSelect()
249
255
  this.variantsValue = this.generateVariants(value)
250
256
 
257
+ this.toggleInventoryForm(hasNoOptions)
258
+
251
259
  // We want to clear the ignoredVariants when the options change
252
260
  if (previousValue && Object.keys(previousValue).length === 0) return
253
261
  this.ignoredVariants = new Set()
@@ -717,7 +725,7 @@ export default class extends CheckboxSelectAll {
717
725
  this.lastOptionNameId = targetInput.value
718
726
 
719
727
  if (this.lastOptionNameId) {
720
- const response = await get(`/admin/option_types/${this.lastOptionNameId}/option_values/select_options`)
728
+ const response = await get(`${this.adminPathValue}/option_types/${this.lastOptionNameId}/option_values/select_options`)
721
729
 
722
730
  if (response.ok) {
723
731
  this.currentOptionValues[this.lastOptionNameId] = await response.json
@@ -765,6 +773,8 @@ export default class extends CheckboxSelectAll {
765
773
  this.addOption(newOptionName, newOptionValues, newOptionId)
766
774
 
767
775
  this.hideNewOptionForm()
776
+
777
+ this.toggleInventoryForm(false)
768
778
  }
769
779
 
770
780
  hideNewOptionForm() {
@@ -1052,4 +1062,14 @@ export default class extends CheckboxSelectAll {
1052
1062
  }
1053
1063
  }
1054
1064
  }
1065
+
1066
+ toggleInventoryForm(value) {
1067
+ if (!this.inventoryFormTarget) return
1068
+
1069
+ if (value) {
1070
+ this.inventoryFormTarget.classList.remove('d-none')
1071
+ } else {
1072
+ this.inventoryFormTarget.classList.add('d-none')
1073
+ }
1074
+ }
1055
1075
  }
@@ -4,11 +4,11 @@ import { lockScroll, unlockScroll } from 'spree/core/helpers/scroll_lock'
4
4
 
5
5
 
6
6
  const initTooltips = () => {
7
- $('.with-tip, .trix-button').each(function() {
7
+ $('.with-tip, .trix-button, .uppy-Dashboard-close, time').each(function() {
8
8
  $(this).tooltip()
9
9
  })
10
10
 
11
- $('.with-tip, .trix-button').on('show.bs.tooltip', function(event) {
11
+ $('.with-tip, .trix-button, .uppy-Dashboard-close, time').on('show.bs.tooltip', function(event) {
12
12
  if (('ontouchstart' in window)) {
13
13
  event.preventDefault()
14
14
  }
@@ -16,7 +16,7 @@ const initTooltips = () => {
16
16
  }
17
17
 
18
18
  const removeTooltips = () => {
19
- $('.with-tip, .trix-button').each(function() {
19
+ $('.with-tip, .trix-button, .uppy-Dashboard-close, time').each(function() {
20
20
  $(this).tooltip('dispose')
21
21
  })
22
22
  }
@@ -90,7 +90,7 @@ document.addEventListener("trix-attachment-remove", async function(event) {
90
90
  const { attachment } = event
91
91
  const { sgid } = attachment.attachment.attributes.values
92
92
 
93
- destroy(`/admin/action_text/video_embeds/${sgid}`, { responseKind: 'json' })
93
+ destroy(`${Spree.adminPath}/action_text/video_embeds/${sgid}`, { responseKind: 'json' })
94
94
  })
95
95
 
96
96
  function initializeTrixEditor(editor) {
@@ -129,7 +129,7 @@ function initializeTrixEditor(editor) {
129
129
 
130
130
  errorMessage.innerHTML = ''
131
131
 
132
- const response = await post('/admin/action_text/video_embeds', { body: JSON.stringify({ url: input.value }), responseKind: 'json' })
132
+ const response = await post(`${Spree.adminPath}/action_text/video_embeds`, { body: JSON.stringify({ url: input.value }), responseKind: 'json' })
133
133
 
134
134
  if (response.ok) {
135
135
  const { sgid, content } = await response.json
@@ -22,7 +22,7 @@
22
22
  form.object.send(field_name),
23
23
  width: width,
24
24
  height: height,
25
- class: 'img-fluid rounded-lg',
25
+ class: 'img-fluid rounded',
26
26
  data: { active_storage_upload_target: 'thumb' },
27
27
  loading: :lazy
28
28
  ) %>
@@ -0,0 +1,22 @@
1
+ <!DOCTYPE html>
2
+ <html lang="<%= I18n.locale %>">
3
+ <head>
4
+ <%= render "spree/admin/shared/head" %>
5
+ </head>
6
+ <body class="admin min-vh-100 <%= controller_name %> <%= action_name %>">
7
+ <div class="container-fluid">
8
+ <div class="row bg-white">
9
+ <div
10
+ class="col-lg-5 d-none d-lg-flex bg-light min-vh-100"
11
+ style="background-image: url('<%= asset_path('login_sidebar_background.png') %>');background-repeat: no-repeat;background-size: cover;background-position: center')"
12
+ >
13
+ </div>
14
+ <div class="col-lg-6 col-xl-4 offset-xl-1 py-3 d-flex flex-column justify-content-center vh-100">
15
+ <%= yield %>
16
+ </div>
17
+ </div>
18
+ </div>
19
+ <%= render "spree/admin/shared/modal" %>
20
+ <%= render "spree/admin/shared/alerts" %>
21
+ </body>
22
+ </html>
@@ -0,0 +1,19 @@
1
+ <tr id="<%= spree_dom_id admin_user %>" class="cursor-pointer" data-controller="row-link">
2
+ <td class="w-50" data-action="click->row-link#openLink">
3
+ <%= link_to spree.admin_admin_user_path(admin_user), data: { row_link_target: :link }, class: 'd-flex align-items-center' do %>
4
+ <%= render_avatar(admin_user, width: 48, height: 48, class: 'mr-3 avatar') %>
5
+ <div class="d-flex flex-column">
6
+ <%= admin_user.name %>
7
+ <span class="text-muted"><%= admin_user.email %></span>
8
+ </div>
9
+ <% end %>
10
+ </td>
11
+ <td class="w-30" data-action="click->row-link#openLink">
12
+ <% admin_user.role_users.each do |role_user| %>
13
+ <span class="badge badge-light"><%= role_user.role.name %></span>
14
+ <% end %>
15
+ </td>
16
+ <td class="w-20">
17
+ <%= local_time(admin_user.created_at) %>
18
+ </td>
19
+ </tr>
@@ -0,0 +1,5 @@
1
+ <div class="text-muted text-center py-5">
2
+ <p>Audit log is part of the Spree Enterprise offering.</p>
3
+
4
+ <%= external_link_to 'Upgrade to Spree Enterprise', 'https://spreecommerce.org/pricing', class: 'btn btn-primary' %>
5
+ </div>
@@ -0,0 +1,12 @@
1
+ <div class="form-group">
2
+ <%= f.label :email %>
3
+ <%= f.email_field :email, class: 'form-control', required: true, autofocus: true %>
4
+ </div>
5
+ <div class="form-group">
6
+ <%= f.label :first_name %>
7
+ <%= f.text_field :first_name, class: 'form-control', required: true %>
8
+ </div>
9
+ <div class="form-group">
10
+ <%= f.label :last_name %>
11
+ <%= f.text_field :last_name, class: 'form-control', required: true %>
12
+ </div>
@@ -0,0 +1,35 @@
1
+ <% content_for :page_title do %>
2
+ <%= page_header_back_button spree.admin_admin_users_path %>
3
+ <%= @admin_user.name %>
4
+ <% end %>
5
+
6
+ <%= content_for :title do %>
7
+ <%= @admin_user.name %>
8
+ <% end %>
9
+
10
+ <%= turbo_frame_tag :edit_user do %>
11
+ <div class="card-header d-flex align-items-center justify-content-between">
12
+ <h5 class="card-title">
13
+ <%= Spree.t(:details) %>
14
+ </h5>
15
+ <%= link_to Spree.t('actions.discard'), spree.admin_admin_user_path(@admin_user), class: 'btn btn-light btn-sm' %>
16
+ </div>
17
+ <%= form_for [:admin, @admin_user], as: :admin_user, url: spree.admin_admin_user_path(@admin_user), method: :put do |f| %>
18
+ <div class="card-body">
19
+ <%= render'spree/admin/shared/error_messages', target: @admin_user %>
20
+ <%= render 'form', f: f %>
21
+ <% if can?(:manage, Spree::Role) && @roles.any? %>
22
+ <div class="form-group">
23
+ <%= f.label :spree_role_ids, Spree.t(:roles) %>
24
+ <%= f.select :spree_role_ids,
25
+ options_from_collection_for_select(@roles, 'id', 'name', @admin_user.spree_roles.pluck(:id)),
26
+ { prompt: false },
27
+ { multiple: true, data: { controller: 'autocomplete-select' } } %>
28
+ </div>
29
+ <% end %>
30
+ </div>
31
+ <div class="card-footer">
32
+ <%= turbo_save_button_tag Spree.t('actions.update') %>
33
+ </div>
34
+ <% end %>
35
+ <% end%>
@@ -0,0 +1,18 @@
1
+ <%= render 'spree/admin/shared/team_nav' %>
2
+
3
+ <div class="card-lg">
4
+ <div class="table-responsive">
5
+ <table class="table">
6
+ <thead>
7
+ <tr>
8
+ <th class="rounded-lg-top-left"><%= Spree.t(:user) %></th>
9
+ <th><%= Spree.t(:roles) %></th>
10
+ <th class="rounded-lg-top-right"><%= sort_link @search, :created_at, Spree.t(:created_at) %></th>
11
+ </tr>
12
+ </thead>
13
+ <tbody>
14
+ <%= render partial: 'spree/admin/admin_users/admin_user', collection: @collection %>
15
+ </tbody>
16
+ </table>
17
+ </div>
18
+ </div>
@@ -0,0 +1,21 @@
1
+ <%= form_with model: @admin_user, url: spree.admin_admin_users_path(token: @invitation.token), method: :post, scope: :admin_user do |f| %>
2
+ <%= render partial: 'spree/admin/shared/error_messages', locals: { target: @admin_user } %>
3
+
4
+ <div class="rounded border p-3 mb-3 d-flex align-items-center gap-2">
5
+ <%= render_avatar(@invitation.inviter, height: 32, width: 32) %>
6
+ <%= @invitation.inviter.name %> has invited you to join <strong><%= @invitation.resource.name %></strong>
7
+ </div>
8
+
9
+ <%= render 'form', f: f %>
10
+ <div class="form-group">
11
+ <%= f.label :password %>
12
+ <%= f.password_field :password, class: 'form-control', required: true %>
13
+ </div>
14
+ <div class="form-group">
15
+ <%= f.label :password_confirmation %>
16
+ <%= f.password_field :password_confirmation, class: 'form-control', required: true %>
17
+ </div>
18
+
19
+ <%= turbo_save_button_tag(Spree.t('create_a_new_account')) %>
20
+ <% end %>
21
+
@@ -0,0 +1,113 @@
1
+ <% content_for :page_title do %>
2
+ <%= page_header_back_button spree.admin_admin_users_path, @admin_user %>
3
+ <%= @admin_user.name %>
4
+ <% end %>
5
+
6
+ <%= content_for :title do %>
7
+ <%= @admin_user.name %>
8
+ <% end %>
9
+
10
+ <div class="row">
11
+ <div class="col-lg-8">
12
+ <div class="card mb-4">
13
+ <div class="card-header">
14
+ <h5 class="card-title">
15
+ <%= icon 'history', class: 'mr-1' %>
16
+ <%= Spree.t(:audit_log) %>
17
+ </h5>
18
+ </div>
19
+ <div class="card-body">
20
+ <%= render 'audit_log' %>
21
+ </div>
22
+ </div>
23
+ </div>
24
+
25
+ <div class="col-lg-4">
26
+ <div class="card mb-4" id="user-details">
27
+ <%= turbo_frame_tag :edit_user do %>
28
+ <div class="card-header d-flex align-items-center justify-content-between">
29
+ <h5 class="card-title">
30
+ <%= Spree.t(:details) %>
31
+ </h5>
32
+ <%= link_to_with_icon 'edit', Spree.t(:edit), spree.edit_admin_admin_user_path(@admin_user), class: 'btn btn-light btn-sm', data: { turbo_frame: :edit_user } %>
33
+ </div>
34
+ <div class="card-body p-0">
35
+ <ul class="list-group list-group-flush">
36
+ <li class="list-group-item d-flex justify-content-between align-items-center">
37
+ <%= Spree.t(:email) %>
38
+ <span>
39
+ <%= @admin_user.email %>
40
+ </span>
41
+ </li>
42
+ <li class="list-group-item d-flex justify-content-between align-items-center">
43
+ <%= Spree.t(:name) %>
44
+ <span>
45
+ <%= @admin_user.name %>
46
+ </span>
47
+ </li>
48
+ <li class="list-group-item d-flex justify-content-between align-items-center">
49
+ <%= Spree.t(:roles) %>
50
+ <span>
51
+ <% @role_users.each do |role_user| %>
52
+ <span class="badge badge-light"><%= role_user.role.name %></span>
53
+ <% end %>
54
+ </span>
55
+ </li>
56
+ <% if @admin_user.respond_to?(:sign_in_count) %>
57
+ <li class="list-group-item d-flex justify-content-between align-items-center">
58
+ <%= I18n.t('activerecord.attributes.user.sign_in_count') %>
59
+ <span>
60
+ <%= @admin_user.sign_in_count %>
61
+ </span>
62
+ </li>
63
+ <% end %>
64
+ <% if @admin_user.respond_to?(:last_sign_in_at) %>
65
+ <li class="list-group-item d-flex justify-content-between align-items-center">
66
+ <%= I18n.t('activerecord.attributes.user.last_sign_in') %>
67
+ <span>
68
+ <% if @admin_user.last_sign_in_at %>
69
+ <%= local_time(@admin_user.last_sign_in_at) %>
70
+ <% else %>
71
+ <%= Spree.t(:not_available) %>
72
+ <% end %>
73
+ </span>
74
+ </li>
75
+ <% end %>
76
+ <% if @admin_user.respond_to?(:current_sign_in_at) %>
77
+ <li class="list-group-item d-flex justify-content-between align-items-center">
78
+ <%= I18n.t('activerecord.attributes.user.current_sign_in') %>
79
+ <span>
80
+ <% if @admin_user.current_sign_in_at %>
81
+ <%= local_time(@admin_user.current_sign_in_at) %>
82
+ <% else %>
83
+ <%= Spree.t(:not_available) %>
84
+ <% end %>
85
+ </span>
86
+ </li>
87
+ <% end %>
88
+ <li class="list-group-item d-flex justify-content-between align-items-center">
89
+ <%= Spree.t(:created_at) %>
90
+ <span>
91
+ <%= local_time(@admin_user.created_at) %>
92
+ </span>
93
+ </li>
94
+ <li class="list-group-item d-flex justify-content-between align-items-center">
95
+ <%= Spree.t(:updated_at) %>
96
+ <span>
97
+ <%= local_time(@admin_user.updated_at) %>
98
+ </span>
99
+ </li>
100
+ <% if @admin_user.invited_by %>
101
+ <li class="list-group-item d-flex justify-content-between align-items-center">
102
+ <%= Spree.t(:invited_by) %>
103
+ <span>
104
+ <%= @admin_user.invited_by.name %>
105
+ </span>
106
+ </li>
107
+ <% end %>
108
+ </ul>
109
+ </div>
110
+ <% end %>
111
+ </div>
112
+ </div>
113
+ </div>
@@ -8,8 +8,8 @@
8
8
  <%= render 'spree/admin/shared/filters_search_bar', param: :code_eq %>
9
9
 
10
10
  <div class="d-flex align-items-center justify-content-between">
11
- <div class="dropdown h-100">
12
- <button class="btn btn-light h-100 dropdown-toggle" type="button" data-toggle="dropdown" data-display="static" data-flip="false" aria-expanded="false">
11
+ <div class="dropdown">
12
+ <button class="btn btn-light dropdown-toggle" type="button" data-toggle="dropdown" data-display="static" data-flip="false" aria-expanded="false">
13
13
  <span class="text-muted font-weight-normal mr-1">
14
14
  <%= Spree.t(:show) %>
15
15
  </span>
@@ -19,14 +19,14 @@
19
19
  </button>
20
20
  <div class="dropdown-menu w-100 font-size-sm" style="min-width: 200px">
21
21
  <%= active_link_to Spree.t(:all),
22
- spree.admin_promotion_coupon_codes_path,
22
+ spree.admin_promotion_coupon_codes_path(@promotion),
23
23
  class: 'dropdown-item',
24
24
  active: (params[:q] || {}).values_at(:state_eq).all?(&:blank?) %>
25
25
  <%= link_to Spree.t('admin.coupon_codes.used'),
26
- params.merge({q: {state_eq: :used}}).permit!,
26
+ spree.admin_promotion_coupon_codes_path(@promotion, q: {state_eq: :used}),
27
27
  class: "dropdown-item #{'active' if params.dig(:q, :state_eq) == 'used'}" %>
28
28
  <%= link_to Spree.t('admin.coupon_codes.unused'),
29
- params.merge({q: {state_eq: :unused}}).permit!,
29
+ spree.admin_promotion_coupon_codes_path(@promotion, q: {state_eq: :unused}),
30
30
  class: "dropdown-item #{'active' if params.dig(:q, :state_eq) == 'unused'}" %>
31
31
  </div>
32
32
  </div>
@@ -42,7 +42,7 @@
42
42
  <div class="table-responsive">
43
43
  <% if @coupon_codes.any? %>
44
44
  <table class="table">
45
- <thead class="text-muted">
45
+ <thead>
46
46
  <tr data-hook="rate_header">
47
47
  <th><%= Spree.t(:code) %></th>
48
48
  <th><%= Spree.t(:used) %></th>
@@ -1,7 +1,7 @@
1
1
  <% if current_store.custom_domains.any? %>
2
2
  <div class="table-responsive rounded mt-3 border">
3
3
  <table class="table">
4
- <thead class="text-muted">
4
+ <thead>
5
5
  <tr>
6
6
  <th><%= Spree.t(:name) %></th>
7
7
  <th>Active?</th>
@@ -20,7 +20,7 @@
20
20
  <% if @collection.any? %>
21
21
  <div class="table-responsive">
22
22
  <table class="table">
23
- <thead class="text-muted">
23
+ <thead>
24
24
  <tr data-hook="rate_header">
25
25
  <th><%= Spree.t(:number) %></th>
26
26
  <th><%= Spree.t(:created_at) %></th>
@@ -1,5 +1,5 @@
1
1
  <% if current_store.default_theme %>
2
- <div class="card mb-4 bg-transparent">
2
+ <div class="card mb-4">
3
3
  <%= link_to spree.edit_admin_theme_path(current_store.default_theme), class: 'd-block border rounded mx-2 mt-2 mb-0 overflow-auto bg-light position-relative store-preview-link' do %>
4
4
  <div class="position-absolute w-100 h-100 align-items-center justify-content-center overlay-background store-preview-actions">
5
5
  <button class="btn btn-primary">
@@ -5,7 +5,9 @@
5
5
  <h5 class="card-title">
6
6
  <%= Spree.t('admin.dashboard.top_products') %>
7
7
  </h5>
8
- <%= link_to Spree.t('admin.dashboard.view_report'), report_link, class: 'btn btn-light btn-sm', data: { turbo_frame: '_top' } %>
8
+ <% if can?(:manage, Spree::Report) %>
9
+ <%= link_to Spree.t('admin.dashboard.view_report'), report_link, class: 'btn btn-light btn-sm', data: { turbo_frame: '_top' } %>
10
+ <% end %>
9
11
  </div>
10
12
  <div class="card-body m-0 p-0">
11
13
  <div class="table-responsive">
@@ -45,7 +47,7 @@
45
47
  <%= product.name %>
46
48
  <% end %>
47
49
  </td>
48
- <% if enterprise_edition? && defined?(vendor_logo_link) && !@vendor %>
50
+ <% if defined?(vendor_logo_link) && !@vendor %>
49
51
  <td>
50
52
  <%= vendor_logo_link(product.vendor) if product.vendor.present? %>
51
53
  </td>
@@ -72,7 +74,7 @@
72
74
  </tbody>
73
75
  </table>
74
76
  </div>
75
- <% if @top_products.any? %>
77
+ <% if @top_products.any? && can?(:manage, Spree::Report) %>
76
78
  <p class="text-center mt-0 border-top py-2 mb-0">
77
79
  <%= link_to Spree.t('admin.dashboard.view_report'), report_link, class: 'm-2 w-50 btn btn-light mt-2', data: { turbo_frame: '_top' } %>
78
80
  </p>
@@ -1,5 +1,5 @@
1
1
  <table class="table">
2
- <thead class="text-muted">
2
+ <thead>
3
3
  <tr>
4
4
  <% if @product.has_variants? %>
5
5
  <th><%= Spree.t(:variant) %></th>
@@ -1,6 +1,5 @@
1
1
  <% content_for :page_title do %>
2
2
  <%= page_header_back_button spree.admin_product_path(@product) %>
3
- <span class="mr-3"><%= @product.name %></span>
4
3
  <span><%= Spree.t("digital_assets") %></span>
5
4
  <% end %>
6
5
 
@@ -4,7 +4,7 @@
4
4
  <% if @collection.any? %>
5
5
  <div class="table-responsive">
6
6
  <table class="table">
7
- <thead class="text-muted">
7
+ <thead>
8
8
  <tr>
9
9
  <th><%= Spree.t(:number) %></th>
10
10
  <th class="text-center"><%= Spree.t(:kind) %></th>
@@ -0,0 +1,36 @@
1
+ <% integration_name = integration_class.integration_name %>
2
+ <% integration = store_integration(integration_class.integration_key) %>
3
+
4
+ <% integration_description ||= Spree.t("admin.integrations.#{integration_class.integration_key}.description") %>
5
+
6
+ <div id="integration-<%= integration_class.integration_key %>" class="col mb-4 d-flex align-items-stretch">
7
+ <div class="card w-full">
8
+ <div class="card-header border-bottom d-flex align-items-center justify-content-between h-auto pr-3 <% if integration.present? %>bg-success<% end %>">
9
+ <div style="height: 36px" class="d-flex align-items-center">
10
+ <%= image_tag integration_class.icon_path, alt: integration_name, height: 36 if integration_class.icon_path.present? %>
11
+ </div>
12
+
13
+ <% if integration.present? %>
14
+ <span class="badge badge-success small">
15
+ <%= icon('check', class: 'mr-1') %>
16
+ <%= Spree.t(:active) %>
17
+ </span>
18
+ <% end %>
19
+ </div>
20
+
21
+ <div class="card-body">
22
+ <p><%= integration_description %></p>
23
+ </div>
24
+
25
+ <div class="card-footer d-flex <% if integration.present? %>align-items-baseline justify-content-between<% else %>flex-column<% end %>">
26
+ <% if integration.present? %>
27
+ <%= link_to spree.edit_admin_integration_path(integration), class: 'card-link btn btn-sm btn-light' do %>
28
+ <%= icon 'settings' %>
29
+ <%= Spree.t(:settings) %>
30
+ <% end if can?(:update, integration) %>
31
+ <% else %>
32
+ <%= link_to_with_icon 'plus', "#{Spree.t('actions.connect')} #{integration_class.integration_name}", spree.new_admin_integration_path(integration: { type: integration_class.name }), class: 'btn btn-primary' if can?(:create, Spree::Integration) %>
33
+ <% end %>
34
+ </div>
35
+ </div>
36
+ </div>
@@ -0,0 +1,11 @@
1
+ <% content_for :page_title do %>
2
+ <%= page_header_back_button spree.admin_integrations_path %>
3
+ <%= @integration.name %> <%= Spree.t(:settings) %>
4
+ <% end %>
5
+
6
+ <%= render partial: 'spree/admin/shared/error_messages', locals: { target: @integration } %>
7
+
8
+ <%= form_for @integration, as: :integration, url: spree.admin_integration_path(@integration) do |form| %>
9
+ <%= render "spree/admin/integrations/forms/#{@integration.key}", form: form %>
10
+ <%= render 'spree/admin/shared/edit_resource_links', f: form %>
11
+ <% end %>
@@ -0,0 +1,23 @@
1
+ <%= content_for(:page_title) do %>
2
+ <%= Spree.t(:integrations) %>
3
+ <% end %>
4
+
5
+ <%= content_for(:page_alerts) do %>
6
+ <div class="alert alert-info">
7
+ <%= Spree.t('admin.integrations.page_subtitle') %>
8
+ </div>
9
+ <% end %>
10
+
11
+ <div class="container px-lg-0 mt-2">
12
+ <% grouped_available_store_integrations.each do |group, integrations| %>
13
+ <% if group.present? %>
14
+ <div class="my-2 text-muted font-weight-light text-uppercase"><%= Spree.t(group) %></div>
15
+ <% end %>
16
+
17
+ <div class="row row-cols-1 row-cols-md-2 row-cols-lg-4 mb-4">
18
+ <% integrations.each do |integration| %>
19
+ <%= render 'spree/admin/integrations/integration', integration_class: integration %>
20
+ <% end %>
21
+ </div>
22
+ <% end %>
23
+ </div>
@@ -0,0 +1,14 @@
1
+ <% content_for :page_title do %>
2
+ <%= page_header_back_button spree.admin_integrations_path %>
3
+ <%= Spree.t('actions.connect') %> <%= @integration.name %>
4
+ <% end %>
5
+
6
+ <%= render partial: 'spree/admin/shared/error_messages', locals: { target: @integration } %>
7
+
8
+ <%= form_for @integration, as: :integration, url: spree.admin_integrations_path do |form| %>
9
+ <%= form.hidden_field :type %>
10
+ <%= form.hidden_field :active, value: true %>
11
+
12
+ <%= render "spree/admin/integrations/forms/#{@integration.key}", form: form %>
13
+ <%= render 'spree/admin/shared/new_resource_links' %>
14
+ <% end %>
@@ -0,0 +1,52 @@
1
+ <tr id="<%= spree_dom_id invitation %>">
2
+ <td class="w-30">
3
+ <%= invitation.email %>
4
+ </td>
5
+ <td class="w-10">
6
+ <% if can?(:read, invitation.inviter) %>
7
+ <%= link_to invitation.inviter.name, spree.admin_admin_user_path(invitation.inviter) %>
8
+ <% else %>
9
+ <%= invitation.inviter.name %>
10
+ <% end %>
11
+ </td>
12
+ <td class="w-20">
13
+ <span class="badge badge-light"><%= invitation.role.name %></span>
14
+ </td>
15
+ <td class="w-20">
16
+ <% if invitation.accepted? %>
17
+ <span class="badge badge-success"><%= Spree.t(:accepted) %></span>
18
+ <% elsif invitation.deleted? %>
19
+ <span class="badge badge-danger"><%= Spree.t(:deleted) %></span>
20
+ <% elsif invitation.expired? %>
21
+ <span class="badge badge-warning"><%= Spree.t(:expired) %></span>
22
+ <% else %>
23
+ <span class="badge badge-light"><%= Spree.t(:pending) %></span>
24
+ <p class="text-muted font-size-sm mb-0 mt-2 pl-1">Expires at: <%= local_time(invitation.expires_at) %></p>
25
+ <% end %>
26
+ </td>
27
+ <td class="w-10">
28
+ <%= local_time(invitation.created_at) %>
29
+ </td>
30
+ <td class="w-10 actions">
31
+ <% if invitation.pending? && !invitation.expired? %>
32
+ <div class="dropdown" data-controller="clipboard">
33
+ <%= hidden_field_tag nil, spree.admin_invitation_url(invitation, token: invitation.token), data: { clipboard_target: "source" } %>
34
+
35
+ <button class="btn btn-sm btn-light" type="button" id="dropdownMenuButton-<%= invitation.id %>" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
36
+ <%= icon('dots-vertical', class: 'mr-0') %>
37
+ </button>
38
+ <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuButton-<%= invitation.id %>">
39
+ <%= link_to_with_icon 'copy', Spree.t(:copy_link), '#',
40
+ class: "dropdown-item",
41
+ data: { action: "clipboard#copy" } %>
42
+ <%= link_to_with_icon 'send', Spree.t('actions.resend'), spree.resend_admin_invitation_path(invitation),
43
+ class: "dropdown-item",
44
+ data: { turbo_method: :put, turbo_confirm: Spree.t(:are_you_sure) } %>
45
+ <%= link_to_with_icon 'trash', Spree.t('actions.destroy'), spree.admin_invitation_path(invitation),
46
+ class: "dropdown-item btn-danger",
47
+ data: { turbo_method: :delete, turbo_confirm: Spree.t(:are_you_sure) } if can?(:destroy, invitation) %>
48
+ </div>
49
+ </div>
50
+ <% end %>
51
+ </td>
52
+ </tr>