@vendure/dashboard 3.4.0-minor-202506250934 → 3.4.0

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 (523) hide show
  1. package/README.md +102 -3
  2. package/dist/plugin/api/api-extensions.d.ts +1 -0
  3. package/dist/plugin/api/api-extensions.js +38 -0
  4. package/dist/plugin/api/metrics.resolver.d.ts +8 -0
  5. package/dist/plugin/api/metrics.resolver.js +40 -0
  6. package/dist/plugin/config/metrics-strategies.d.ts +39 -0
  7. package/dist/plugin/config/metrics-strategies.js +74 -0
  8. package/dist/plugin/constants.d.ts +4 -3
  9. package/dist/plugin/constants.js +10 -277
  10. package/dist/plugin/dashboard.plugin.d.ts +95 -0
  11. package/dist/plugin/dashboard.plugin.js +168 -0
  12. package/dist/plugin/index.d.ts +2 -1
  13. package/dist/plugin/index.js +18 -1
  14. package/dist/plugin/package.json +3 -0
  15. package/dist/plugin/service/metrics.service.d.ts +15 -0
  16. package/dist/plugin/service/metrics.service.js +145 -0
  17. package/dist/plugin/types.d.ts +23 -0
  18. package/dist/plugin/types.js +13 -0
  19. package/dist/vite/constants.d.ts +5 -0
  20. package/dist/vite/constants.js +277 -0
  21. package/dist/vite/index.d.ts +1 -0
  22. package/dist/vite/index.js +1 -0
  23. package/dist/vite/types.d.ts +40 -0
  24. package/dist/{plugin → vite}/utils/ast-utils.d.ts +0 -5
  25. package/dist/vite/utils/ast-utils.js +29 -0
  26. package/dist/vite/utils/ast-utils.spec.d.ts +1 -0
  27. package/dist/vite/utils/ast-utils.spec.js +45 -0
  28. package/dist/vite/utils/compiler.d.ts +22 -0
  29. package/dist/vite/utils/compiler.js +162 -0
  30. package/dist/vite/utils/config-loader.d.ts +1 -0
  31. package/dist/vite/utils/config-loader.js +1 -0
  32. package/dist/vite/utils/logger.d.ts +3 -0
  33. package/dist/vite/utils/logger.js +39 -0
  34. package/dist/vite/utils/plugin-discovery.d.ts +27 -0
  35. package/dist/vite/utils/plugin-discovery.js +387 -0
  36. package/dist/vite/utils/tsconfig-utils.d.ts +9 -0
  37. package/dist/vite/utils/tsconfig-utils.js +50 -0
  38. package/dist/vite/utils/ui-config.d.ts +3 -0
  39. package/dist/vite/utils/ui-config.js +30 -0
  40. package/dist/{plugin → vite}/vite-plugin-config-loader.d.ts +3 -3
  41. package/dist/{plugin → vite}/vite-plugin-config-loader.js +18 -13
  42. package/dist/{plugin → vite}/vite-plugin-config.js +6 -7
  43. package/dist/{plugin → vite}/vite-plugin-dashboard-metadata.d.ts +1 -3
  44. package/dist/{plugin → vite}/vite-plugin-dashboard-metadata.js +20 -10
  45. package/dist/vite/vite-plugin-tailwind-source.d.ts +7 -0
  46. package/dist/vite/vite-plugin-tailwind-source.js +61 -0
  47. package/dist/vite/vite-plugin-theme.js +130 -0
  48. package/dist/vite/vite-plugin-ui-config.d.ts +123 -0
  49. package/dist/{plugin → vite}/vite-plugin-ui-config.js +3 -11
  50. package/dist/vite/vite-plugin-vendure-dashboard.d.ts +85 -0
  51. package/dist/{plugin → vite}/vite-plugin-vendure-dashboard.js +10 -7
  52. package/index.html +1 -1
  53. package/package.json +56 -31
  54. package/src/app/app-providers.tsx +7 -7
  55. package/src/app/common/delete-bulk-action.tsx +148 -0
  56. package/src/app/common/duplicate-bulk-action.tsx +134 -0
  57. package/src/app/main.tsx +9 -9
  58. package/src/app/routes/__root.tsx +1 -2
  59. package/src/app/routes/_authenticated/_administrators/administrators.graphql.ts +10 -1
  60. package/src/app/routes/_authenticated/_administrators/administrators.tsx +15 -8
  61. package/src/app/routes/_authenticated/_administrators/administrators_.$id.tsx +16 -12
  62. package/src/app/routes/_authenticated/_administrators/components/administrator-bulk-actions.tsx +15 -0
  63. package/src/app/routes/_authenticated/_administrators/components/role-permissions-display.tsx +16 -16
  64. package/src/app/routes/_authenticated/_assets/assets.graphql.ts +13 -2
  65. package/src/app/routes/_authenticated/_assets/assets.tsx +16 -4
  66. package/src/app/routes/_authenticated/_assets/assets_.$id.tsx +52 -38
  67. package/src/app/routes/_authenticated/_assets/components/asset-bulk-actions.tsx +45 -0
  68. package/src/app/routes/_authenticated/_channels/channels.graphql.ts +10 -1
  69. package/src/app/routes/_authenticated/_channels/channels.tsx +17 -10
  70. package/src/app/routes/_authenticated/_channels/channels_.$id.tsx +21 -17
  71. package/src/app/routes/_authenticated/_channels/components/channel-bulk-actions.tsx +15 -0
  72. package/src/app/routes/_authenticated/_collections/collections.graphql.ts +60 -3
  73. package/src/app/routes/_authenticated/_collections/collections.tsx +168 -124
  74. package/src/app/routes/_authenticated/_collections/collections_.$id.tsx +21 -17
  75. package/src/app/routes/_authenticated/_collections/components/collection-bulk-actions.tsx +123 -0
  76. package/src/app/routes/_authenticated/_collections/components/collection-contents-preview-table.tsx +8 -9
  77. package/src/app/routes/_authenticated/_collections/components/collection-contents-sheet.tsx +9 -5
  78. package/src/app/routes/_authenticated/_collections/components/collection-contents-table.tsx +10 -9
  79. package/src/app/routes/_authenticated/_collections/components/collection-filters-selector.tsx +12 -79
  80. package/src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx +430 -0
  81. package/src/app/routes/_authenticated/_collections/components/move-single-collection.tsx +33 -0
  82. package/src/app/routes/_authenticated/_countries/components/country-bulk-actions.tsx +15 -0
  83. package/src/app/routes/_authenticated/_countries/countries.graphql.ts +11 -2
  84. package/src/app/routes/_authenticated/_countries/countries.tsx +13 -6
  85. package/src/app/routes/_authenticated/_countries/countries_.$id.tsx +21 -17
  86. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-bulk-actions.tsx +15 -0
  87. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-sheet.tsx +12 -5
  88. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-table.tsx +22 -17
  89. package/src/app/routes/_authenticated/_customer-groups/customer-groups.graphql.ts +11 -2
  90. package/src/app/routes/_authenticated/_customer-groups/customer-groups.tsx +13 -6
  91. package/src/app/routes/_authenticated/_customer-groups/customer-groups_.$id.tsx +18 -15
  92. package/src/app/routes/_authenticated/_customers/components/customer-address-card.tsx +19 -19
  93. package/src/app/routes/_authenticated/_customers/components/customer-address-form.tsx +10 -10
  94. package/src/app/routes/_authenticated/_customers/components/customer-bulk-actions.tsx +15 -0
  95. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-container.tsx +5 -5
  96. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history.tsx +11 -7
  97. package/src/app/routes/_authenticated/_customers/components/customer-history/use-customer-history.ts +4 -4
  98. package/src/app/routes/_authenticated/_customers/components/customer-order-table.tsx +75 -73
  99. package/src/app/routes/_authenticated/_customers/components/customer-status-badge.tsx +4 -4
  100. package/src/app/routes/_authenticated/_customers/customers.graphql.ts +10 -2
  101. package/src/app/routes/_authenticated/_customers/customers.tsx +13 -6
  102. package/src/app/routes/_authenticated/_customers/customers_.$id.tsx +19 -15
  103. package/src/app/routes/_authenticated/_facets/components/edit-facet-value.tsx +9 -9
  104. package/src/app/routes/_authenticated/_facets/components/facet-bulk-actions.tsx +104 -0
  105. package/src/app/routes/_authenticated/_facets/components/facet-values-sheet.tsx +4 -4
  106. package/src/app/routes/_authenticated/_facets/components/facet-values-table.tsx +76 -65
  107. package/src/app/routes/_authenticated/_facets/facets.graphql.ts +80 -1
  108. package/src/app/routes/_authenticated/_facets/facets.tsx +31 -7
  109. package/src/app/routes/_authenticated/_facets/facets_.$facetId.values_.$id.tsx +147 -0
  110. package/src/app/routes/_authenticated/_facets/facets_.$id.tsx +17 -13
  111. package/src/app/routes/_authenticated/_global-settings/global-settings.graphql.ts +1 -1
  112. package/src/app/routes/_authenticated/_global-settings/global-settings.tsx +26 -18
  113. package/src/app/routes/_authenticated/_orders/components/add-manual-payment-dialog.tsx +191 -0
  114. package/src/app/routes/_authenticated/_orders/components/customer-address-selector.tsx +11 -15
  115. package/src/app/routes/_authenticated/_orders/components/edit-order-table.tsx +111 -80
  116. package/src/app/routes/_authenticated/_orders/components/fulfill-order-dialog.tsx +320 -0
  117. package/src/app/routes/_authenticated/_orders/components/fulfillment-details.tsx +153 -0
  118. package/src/app/routes/_authenticated/_orders/components/money-gross-net.tsx +11 -9
  119. package/src/app/routes/_authenticated/_orders/components/order-address.tsx +19 -13
  120. package/src/app/routes/_authenticated/_orders/components/order-history/order-history-container.tsx +67 -62
  121. package/src/app/routes/_authenticated/_orders/components/order-history/order-history.tsx +391 -39
  122. package/src/app/routes/_authenticated/_orders/components/order-history/use-order-history.ts +9 -5
  123. package/src/app/routes/_authenticated/_orders/components/order-line-custom-fields-form.tsx +28 -13
  124. package/src/app/routes/_authenticated/_orders/components/order-modification-preview-dialog.tsx +364 -0
  125. package/src/app/routes/_authenticated/_orders/components/order-modification-summary.tsx +222 -0
  126. package/src/app/routes/_authenticated/_orders/components/order-table-totals.tsx +39 -22
  127. package/src/app/routes/_authenticated/_orders/components/order-table.tsx +148 -87
  128. package/src/app/routes/_authenticated/_orders/components/order-tax-summary.tsx +37 -36
  129. package/src/app/routes/_authenticated/_orders/components/payment-details.tsx +274 -48
  130. package/src/app/routes/_authenticated/_orders/components/settle-refund-dialog.tsx +80 -0
  131. package/src/app/routes/_authenticated/_orders/components/shipping-method-selector.tsx +43 -44
  132. package/src/app/routes/_authenticated/_orders/components/state-transition-control.tsx +102 -0
  133. package/src/app/routes/_authenticated/_orders/components/use-transition-order-to-state.tsx +144 -0
  134. package/src/app/routes/_authenticated/_orders/orders.graphql.ts +219 -5
  135. package/src/app/routes/_authenticated/_orders/orders.tsx +23 -22
  136. package/src/app/routes/_authenticated/_orders/orders_.$id.tsx +190 -42
  137. package/src/app/routes/_authenticated/_orders/orders_.$id_.modify.tsx +550 -0
  138. package/src/app/routes/_authenticated/_orders/orders_.draft.$id.tsx +187 -107
  139. package/src/app/routes/_authenticated/_orders/utils/order-types.ts +10 -0
  140. package/src/app/routes/_authenticated/_orders/utils/order-utils.ts +78 -0
  141. package/src/app/routes/_authenticated/_payment-methods/components/payment-eligibility-checker-selector.tsx +12 -79
  142. package/src/app/routes/_authenticated/_payment-methods/components/payment-handler-selector.tsx +12 -79
  143. package/src/app/routes/_authenticated/_payment-methods/components/payment-method-bulk-actions.tsx +58 -0
  144. package/src/app/routes/_authenticated/_payment-methods/payment-methods.graphql.ts +29 -2
  145. package/src/app/routes/_authenticated/_payment-methods/payment-methods.tsx +36 -14
  146. package/src/app/routes/_authenticated/_payment-methods/payment-methods_.$id.tsx +22 -15
  147. package/src/app/routes/_authenticated/_product-variants/components/product-variant-bulk-actions.tsx +110 -0
  148. package/src/app/routes/_authenticated/_product-variants/components/variant-price-detail.tsx +7 -6
  149. package/src/app/routes/_authenticated/_product-variants/product-variants.graphql.ts +64 -3
  150. package/src/app/routes/_authenticated/_product-variants/product-variants.tsx +39 -9
  151. package/src/app/routes/_authenticated/_product-variants/product-variants_.$id.tsx +33 -22
  152. package/src/app/routes/_authenticated/_products/components/add-product-variant-dialog.tsx +10 -10
  153. package/src/app/routes/_authenticated/_products/components/assign-facet-values-dialog.tsx +281 -0
  154. package/src/app/routes/_authenticated/_products/components/create-product-options-dialog.tsx +57 -41
  155. package/src/app/routes/_authenticated/_products/components/create-product-variants-dialog.tsx +11 -11
  156. package/src/app/routes/_authenticated/_products/components/create-product-variants.tsx +18 -14
  157. package/src/app/routes/_authenticated/_products/components/option-value-input.tsx +23 -17
  158. package/src/app/routes/_authenticated/_products/components/product-bulk-actions.tsx +123 -0
  159. package/src/app/routes/_authenticated/_products/components/product-option-select.tsx +28 -34
  160. package/src/app/routes/_authenticated/_products/components/product-variants-table.tsx +84 -53
  161. package/src/app/routes/_authenticated/_products/products.graphql.ts +70 -2
  162. package/src/app/routes/_authenticated/_products/products.tsx +36 -7
  163. package/src/app/routes/_authenticated/_products/products_.$id.tsx +34 -26
  164. package/src/app/routes/_authenticated/_profile/profile.graphql.ts +1 -1
  165. package/src/app/routes/_authenticated/_profile/profile.tsx +8 -8
  166. package/src/app/routes/_authenticated/_promotions/components/promotion-actions-selector.tsx +14 -86
  167. package/src/app/routes/_authenticated/_promotions/components/promotion-bulk-actions.tsx +82 -0
  168. package/src/app/routes/_authenticated/_promotions/components/promotion-conditions-selector.tsx +14 -86
  169. package/src/app/routes/_authenticated/_promotions/promotions.graphql.ts +27 -2
  170. package/src/app/routes/_authenticated/_promotions/promotions.tsx +31 -7
  171. package/src/app/routes/_authenticated/_promotions/promotions_.$id.tsx +20 -16
  172. package/src/app/routes/_authenticated/_roles/components/expandable-permissions.tsx +5 -5
  173. package/src/app/routes/_authenticated/_roles/components/permissions-grid.tsx +21 -17
  174. package/src/app/routes/_authenticated/_roles/components/role-bulk-actions.tsx +15 -0
  175. package/src/app/routes/_authenticated/_roles/roles.graphql.ts +10 -1
  176. package/src/app/routes/_authenticated/_roles/roles.tsx +17 -10
  177. package/src/app/routes/_authenticated/_roles/roles_.$id.tsx +16 -12
  178. package/src/app/routes/_authenticated/_sellers/components/seller-bulk-actions.tsx +15 -0
  179. package/src/app/routes/_authenticated/_sellers/sellers.graphql.ts +10 -1
  180. package/src/app/routes/_authenticated/_sellers/sellers.tsx +13 -6
  181. package/src/app/routes/_authenticated/_sellers/sellers_.$id.tsx +17 -13
  182. package/src/app/routes/_authenticated/_shipping-methods/components/fulfillment-handler-selector.tsx +6 -6
  183. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-calculator-selector.tsx +12 -80
  184. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-eligibility-checker-selector.tsx +15 -80
  185. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-method-bulk-actions.tsx +61 -0
  186. package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-method-dialog.tsx +3 -3
  187. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.graphql.ts +29 -2
  188. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.tsx +25 -6
  189. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods_.$id.tsx +25 -19
  190. package/src/app/routes/_authenticated/_stock-locations/components/stock-location-bulk-actions.tsx +58 -0
  191. package/src/app/routes/_authenticated/_stock-locations/stock-locations.graphql.ts +26 -1
  192. package/src/app/routes/_authenticated/_stock-locations/stock-locations.tsx +25 -6
  193. package/src/app/routes/_authenticated/_stock-locations/stock-locations_.$id.tsx +16 -12
  194. package/src/app/routes/_authenticated/_system/components/payload-dialog.tsx +5 -5
  195. package/src/app/routes/_authenticated/_system/healthchecks.tsx +5 -5
  196. package/src/app/routes/_authenticated/_system/job-queue.graphql.ts +12 -1
  197. package/src/app/routes/_authenticated/_system/job-queue.tsx +110 -11
  198. package/src/app/routes/_authenticated/_system/scheduled-tasks.tsx +34 -28
  199. package/src/app/routes/_authenticated/_tax-categories/components/tax-category-bulk-actions.tsx +15 -0
  200. package/src/app/routes/_authenticated/_tax-categories/tax-categories.graphql.ts +11 -2
  201. package/src/app/routes/_authenticated/_tax-categories/tax-categories.tsx +14 -7
  202. package/src/app/routes/_authenticated/_tax-categories/tax-categories_.$id.tsx +20 -16
  203. package/src/app/routes/_authenticated/_tax-rates/components/tax-rate-bulk-actions.tsx +15 -0
  204. package/src/app/routes/_authenticated/_tax-rates/tax-rates.graphql.ts +11 -2
  205. package/src/app/routes/_authenticated/_tax-rates/tax-rates.tsx +15 -8
  206. package/src/app/routes/_authenticated/_tax-rates/tax-rates_.$id.tsx +22 -18
  207. package/src/app/routes/_authenticated/_zones/components/zone-bulk-actions.tsx +15 -0
  208. package/src/app/routes/_authenticated/_zones/components/zone-countries-sheet.tsx +4 -4
  209. package/src/app/routes/_authenticated/_zones/components/zone-countries-table.tsx +12 -15
  210. package/src/app/routes/_authenticated/_zones/zones.graphql.ts +11 -2
  211. package/src/app/routes/_authenticated/_zones/zones.tsx +13 -6
  212. package/src/app/routes/_authenticated/_zones/zones_.$id.tsx +18 -14
  213. package/src/app/routes/_authenticated/index.tsx +6 -6
  214. package/src/app/routes/_authenticated.tsx +4 -4
  215. package/src/app/routes/login.tsx +2 -2
  216. package/src/app/styles.css +5 -2
  217. package/src/lib/components/data-display/boolean.tsx +1 -1
  218. package/src/lib/components/data-display/date-time.tsx +9 -3
  219. package/src/lib/components/data-display/json.tsx +1 -1
  220. package/src/lib/components/data-display/money.tsx +2 -3
  221. package/src/lib/components/data-input/affixed-input.tsx +3 -8
  222. package/src/lib/components/data-input/combination-mode-input.tsx +52 -0
  223. package/src/lib/components/data-input/configurable-operation-list-input.tsx +433 -0
  224. package/src/lib/components/data-input/custom-field-list-input.tsx +297 -0
  225. package/src/lib/components/data-input/customer-group-input.tsx +2 -2
  226. package/src/lib/components/data-input/datetime-input.tsx +132 -146
  227. package/src/lib/components/data-input/default-relation-input.tsx +599 -0
  228. package/src/lib/components/data-input/facet-value-input.tsx +30 -22
  229. package/src/lib/components/data-input/index.ts +17 -0
  230. package/src/lib/components/data-input/money-input.tsx +5 -12
  231. package/src/lib/components/data-input/product-multi-selector.tsx +426 -0
  232. package/src/lib/components/data-input/relation-input.tsx +164 -0
  233. package/src/lib/components/data-input/relation-selector.tsx +476 -0
  234. package/src/lib/components/data-input/{richt-text-input.tsx → rich-text-input.tsx} +15 -9
  235. package/src/lib/components/data-input/select-with-options.tsx +84 -0
  236. package/src/lib/components/data-input/struct-form-input.tsx +324 -0
  237. package/src/lib/components/data-table/add-filter-menu.tsx +9 -18
  238. package/src/lib/components/data-table/data-table-bulk-action-item.tsx +101 -0
  239. package/src/lib/components/data-table/data-table-bulk-actions.tsx +108 -0
  240. package/src/lib/components/data-table/data-table-column-header.tsx +4 -22
  241. package/src/lib/components/data-table/data-table-faceted-filter.tsx +8 -8
  242. package/src/lib/components/data-table/data-table-filter-badge.tsx +16 -8
  243. package/src/lib/components/data-table/data-table-filter-dialog.tsx +8 -8
  244. package/src/lib/components/data-table/data-table-pagination.tsx +4 -4
  245. package/src/lib/components/data-table/data-table-utils.ts +34 -0
  246. package/src/lib/components/data-table/data-table-view-options.tsx +27 -23
  247. package/src/lib/components/data-table/data-table.tsx +90 -43
  248. package/src/lib/components/data-table/filters/data-table-boolean-filter.tsx +11 -8
  249. package/src/lib/components/data-table/filters/data-table-datetime-filter.tsx +14 -23
  250. package/src/lib/components/data-table/filters/data-table-id-filter.tsx +15 -10
  251. package/src/lib/components/data-table/filters/data-table-number-filter.tsx +18 -17
  252. package/src/lib/components/data-table/filters/data-table-string-filter.tsx +29 -12
  253. package/src/lib/components/data-table/human-readable-operator.tsx +3 -3
  254. package/src/lib/components/data-table/refresh-button.tsx +30 -15
  255. package/src/lib/components/data-table/use-generated-columns.tsx +322 -0
  256. package/src/lib/components/labeled-data.tsx +21 -0
  257. package/src/lib/components/layout/app-layout.tsx +8 -13
  258. package/src/lib/components/layout/app-sidebar.tsx +5 -5
  259. package/src/lib/components/layout/channel-switcher.tsx +171 -62
  260. package/src/lib/components/layout/content-language-selector.tsx +16 -10
  261. package/src/lib/components/layout/dev-mode-indicator.tsx +18 -0
  262. package/src/lib/components/layout/generated-breadcrumbs.tsx +1 -1
  263. package/src/lib/components/layout/language-dialog.tsx +7 -12
  264. package/src/lib/components/layout/manage-languages-dialog.tsx +405 -0
  265. package/src/lib/components/layout/nav-item-wrapper.tsx +107 -0
  266. package/src/lib/components/layout/nav-main.tsx +200 -111
  267. package/src/lib/components/layout/nav-projects.tsx +2 -2
  268. package/src/lib/components/layout/nav-user.tsx +7 -7
  269. package/src/lib/components/layout/prerelease-popup.tsx +1 -1
  270. package/src/lib/components/login/login-form.tsx +85 -50
  271. package/src/lib/components/shared/alerts.tsx +3 -3
  272. package/src/lib/components/shared/animated-number.tsx +2 -2
  273. package/src/lib/components/shared/asset/asset-bulk-actions.tsx +109 -0
  274. package/src/lib/components/shared/asset/asset-focal-point-editor.tsx +29 -19
  275. package/src/lib/components/shared/asset/asset-gallery.tsx +25 -20
  276. package/src/lib/components/shared/asset/asset-picker-dialog.tsx +63 -66
  277. package/src/lib/components/shared/asset/asset-preview-dialog.tsx +3 -7
  278. package/src/lib/components/shared/asset/asset-preview-selector.tsx +4 -6
  279. package/src/lib/components/shared/asset/asset-preview.tsx +7 -21
  280. package/src/lib/components/shared/asset/asset-properties.tsx +7 -9
  281. package/src/lib/components/shared/asset/focal-point-control.tsx +5 -13
  282. package/src/lib/components/shared/assign-to-channel-bulk-action.tsx +71 -0
  283. package/src/lib/components/shared/assign-to-channel-dialog.tsx +155 -0
  284. package/src/lib/components/shared/assigned-facet-values.tsx +1 -5
  285. package/src/lib/components/shared/channel-code-label.tsx +3 -4
  286. package/src/lib/components/shared/channel-selector.tsx +6 -6
  287. package/src/lib/components/shared/configurable-operation-arg-input.tsx +367 -23
  288. package/src/lib/components/shared/configurable-operation-input.tsx +87 -48
  289. package/src/lib/components/shared/configurable-operation-multi-selector.tsx +260 -0
  290. package/src/lib/components/shared/configurable-operation-selector.tsx +156 -0
  291. package/src/lib/components/shared/confirmation-dialog.tsx +2 -2
  292. package/src/lib/components/shared/copyable-text.tsx +3 -4
  293. package/src/lib/components/shared/country-selector.tsx +21 -18
  294. package/src/lib/components/shared/currency-selector.tsx +5 -5
  295. package/src/lib/components/shared/custom-fields-form.tsx +423 -50
  296. package/src/lib/components/shared/customer-address-form.tsx +18 -13
  297. package/src/lib/components/shared/customer-group-selector.tsx +6 -6
  298. package/src/lib/components/shared/customer-selector.tsx +24 -18
  299. package/src/lib/components/shared/detail-page-button.tsx +45 -1
  300. package/src/lib/components/shared/entity-assets.tsx +33 -34
  301. package/src/lib/components/shared/error-page.tsx +6 -6
  302. package/src/lib/components/shared/facet-value-chip.tsx +12 -5
  303. package/src/lib/components/shared/facet-value-selector.tsx +64 -63
  304. package/src/lib/components/shared/form-field-wrapper.tsx +47 -24
  305. package/src/lib/components/shared/history-timeline/history-entry-date.tsx +37 -0
  306. package/src/lib/components/shared/history-timeline/history-entry.tsx +146 -70
  307. package/src/lib/components/shared/history-timeline/history-note-checkbox.tsx +3 -3
  308. package/src/lib/components/shared/history-timeline/history-note-editor.tsx +4 -4
  309. package/src/lib/components/shared/history-timeline/history-note-input.tsx +7 -7
  310. package/src/lib/components/shared/history-timeline/history-timeline.tsx +8 -48
  311. package/src/lib/components/shared/language-selector.tsx +5 -5
  312. package/src/lib/components/shared/logo-mark.tsx +2 -2
  313. package/src/lib/components/shared/multi-select.tsx +6 -6
  314. package/src/lib/components/shared/navigation-confirmation.tsx +24 -9
  315. package/src/lib/components/shared/option-value-input.tsx +18 -16
  316. package/src/lib/components/shared/paginated-list-data-table.tsx +35 -230
  317. package/src/lib/components/shared/permission-guard.tsx +4 -4
  318. package/src/lib/components/shared/product-variant-selector.tsx +59 -34
  319. package/src/lib/components/shared/remove-from-channel-bulk-action.tsx +90 -0
  320. package/src/lib/components/shared/role-code-label.tsx +10 -6
  321. package/src/lib/components/shared/role-selector.tsx +4 -4
  322. package/src/lib/components/shared/seller-selector.tsx +21 -17
  323. package/src/lib/components/shared/stock-level-label.tsx +5 -5
  324. package/src/lib/components/shared/tax-category-selector.tsx +5 -5
  325. package/src/lib/components/shared/translatable-form-field.tsx +46 -23
  326. package/src/lib/components/shared/vendure-image.tsx +31 -2
  327. package/src/lib/components/shared/zone-selector.tsx +5 -6
  328. package/src/lib/components/ui/accordion.tsx +3 -3
  329. package/src/lib/components/ui/alert-dialog.tsx +10 -10
  330. package/src/lib/components/ui/alert.tsx +3 -3
  331. package/src/lib/components/ui/aspect-ratio.tsx +9 -0
  332. package/src/lib/components/ui/badge.tsx +2 -2
  333. package/src/lib/components/ui/breadcrumb.tsx +4 -4
  334. package/src/lib/components/ui/button.tsx +10 -3
  335. package/src/lib/components/ui/calendar.tsx +392 -459
  336. package/src/lib/components/ui/card.tsx +2 -2
  337. package/src/lib/components/ui/carousel.tsx +241 -0
  338. package/src/lib/components/ui/chart.tsx +351 -0
  339. package/src/lib/components/ui/checkbox.tsx +2 -2
  340. package/src/lib/components/ui/command.tsx +12 -6
  341. package/src/lib/components/ui/context-menu.tsx +252 -0
  342. package/src/lib/components/ui/dialog.tsx +2 -2
  343. package/src/lib/components/ui/drawer.tsx +133 -0
  344. package/src/lib/components/ui/dropdown-menu.tsx +7 -7
  345. package/src/lib/components/ui/form.tsx +8 -8
  346. package/src/lib/components/ui/hover-card.tsx +3 -3
  347. package/src/lib/components/ui/input-otp.tsx +77 -0
  348. package/src/lib/components/ui/input.tsx +1 -1
  349. package/src/lib/components/ui/label.tsx +2 -2
  350. package/src/lib/components/ui/menubar.tsx +274 -0
  351. package/src/lib/components/ui/navigation-menu.tsx +168 -0
  352. package/src/lib/components/ui/pagination.tsx +87 -108
  353. package/src/lib/components/ui/popover.tsx +3 -3
  354. package/src/lib/components/ui/progress.tsx +29 -0
  355. package/src/lib/components/ui/radio-group.tsx +45 -0
  356. package/src/lib/components/ui/resizable.tsx +54 -0
  357. package/src/lib/components/ui/scroll-area.tsx +2 -2
  358. package/src/lib/components/ui/select.tsx +151 -129
  359. package/src/lib/components/ui/separator.tsx +2 -2
  360. package/src/lib/components/ui/sheet.tsx +5 -5
  361. package/src/lib/components/ui/sidebar.tsx +10 -10
  362. package/src/lib/components/ui/skeleton.tsx +1 -1
  363. package/src/lib/components/ui/slider.tsx +63 -0
  364. package/src/lib/components/ui/switch.tsx +2 -2
  365. package/src/lib/components/ui/table.tsx +2 -2
  366. package/src/lib/components/ui/tabs.tsx +3 -3
  367. package/src/lib/components/ui/textarea.tsx +1 -1
  368. package/src/lib/components/ui/toggle-group.tsx +73 -0
  369. package/src/lib/components/ui/toggle.tsx +45 -0
  370. package/src/lib/components/ui/tooltip.tsx +3 -3
  371. package/src/lib/framework/alert/alert-extensions.tsx +2 -3
  372. package/src/lib/framework/alert/alert-item.tsx +5 -3
  373. package/src/lib/framework/component-registry/component-registry.tsx +33 -47
  374. package/src/lib/framework/component-registry/dynamic-component.tsx +3 -3
  375. package/src/lib/framework/dashboard-widget/base-widget.tsx +5 -13
  376. package/src/lib/framework/dashboard-widget/latest-orders-widget/index.tsx +8 -8
  377. package/src/lib/framework/dashboard-widget/latest-orders-widget/latest-orders-widget.graphql.ts +1 -1
  378. package/src/lib/framework/dashboard-widget/metrics-widget/index.tsx +7 -8
  379. package/src/lib/framework/dashboard-widget/metrics-widget/metrics-widget.graphql.ts +1 -1
  380. package/src/lib/framework/dashboard-widget/orders-summary/index.tsx +7 -8
  381. package/src/lib/framework/dashboard-widget/orders-summary/order-summary-widget.graphql.ts +1 -1
  382. package/src/lib/framework/dashboard-widget/widget-extensions.tsx +1 -1
  383. package/src/lib/framework/data-table/data-table-extensions.ts +35 -0
  384. package/src/lib/framework/defaults.ts +5 -11
  385. package/src/lib/framework/document-extension/extend-detail-form-query.ts +50 -0
  386. package/src/lib/framework/document-extension/extend-document.spec.ts +884 -0
  387. package/src/lib/framework/document-extension/extend-document.ts +159 -0
  388. package/src/lib/framework/document-introspection/add-custom-fields.ts +50 -2
  389. package/src/lib/framework/document-introspection/get-document-structure.spec.ts +321 -2
  390. package/src/lib/framework/document-introspection/get-document-structure.ts +187 -36
  391. package/src/lib/framework/document-introspection/hooks.ts +4 -1
  392. package/src/lib/framework/extension-api/define-dashboard-extension.ts +35 -49
  393. package/src/lib/framework/extension-api/display-component-extensions.tsx +69 -0
  394. package/src/lib/framework/extension-api/extension-api-types.ts +34 -98
  395. package/src/lib/framework/extension-api/input-component-extensions.tsx +73 -0
  396. package/src/lib/framework/extension-api/logic/alerts.ts +10 -0
  397. package/src/lib/framework/extension-api/logic/data-table.ts +60 -0
  398. package/src/lib/framework/extension-api/logic/detail-forms.ts +48 -0
  399. package/src/lib/framework/extension-api/logic/form-components.ts +13 -0
  400. package/src/lib/framework/extension-api/logic/index.ts +9 -0
  401. package/src/lib/framework/extension-api/logic/layout.ts +22 -0
  402. package/src/lib/framework/extension-api/logic/login.ts +17 -0
  403. package/src/lib/framework/extension-api/logic/navigation.ts +38 -0
  404. package/src/lib/framework/extension-api/logic/widgets.ts +10 -0
  405. package/src/lib/framework/extension-api/types/alerts.ts +54 -0
  406. package/src/lib/framework/extension-api/types/data-table.ts +96 -0
  407. package/src/lib/framework/extension-api/types/detail-forms.ts +94 -0
  408. package/src/lib/framework/extension-api/types/form-components.ts +43 -0
  409. package/src/lib/framework/extension-api/types/index.ts +9 -0
  410. package/src/lib/framework/extension-api/types/layout.ts +90 -0
  411. package/src/lib/framework/extension-api/types/login.ts +96 -0
  412. package/src/lib/framework/extension-api/types/navigation.ts +76 -0
  413. package/src/lib/framework/extension-api/types/widgets.ts +93 -0
  414. package/src/lib/framework/extension-api/use-dashboard-extensions.ts +2 -1
  415. package/src/lib/framework/extension-api/use-login-extensions.ts +26 -0
  416. package/src/lib/framework/form-engine/custom-form-component-extensions.ts +38 -0
  417. package/src/lib/framework/form-engine/custom-form-component.tsx +33 -0
  418. package/src/lib/framework/form-engine/form-schema-tools.spec.ts +472 -0
  419. package/src/lib/framework/form-engine/form-schema-tools.ts +341 -6
  420. package/src/lib/framework/form-engine/overridden-form-component.tsx +51 -0
  421. package/src/lib/framework/form-engine/use-generated-form.tsx +82 -24
  422. package/src/lib/framework/form-engine/utils.spec.ts +37 -0
  423. package/src/lib/framework/form-engine/utils.ts +99 -0
  424. package/src/lib/framework/layout-engine/dev-mode-button.tsx +24 -0
  425. package/src/lib/framework/layout-engine/layout-extensions.ts +1 -4
  426. package/src/lib/framework/layout-engine/location-wrapper.tsx +98 -72
  427. package/src/lib/framework/layout-engine/page-block-provider.tsx +6 -0
  428. package/src/lib/framework/layout-engine/page-layout.tsx +135 -58
  429. package/src/lib/framework/page/detail-page-route-loader.tsx +26 -7
  430. package/src/lib/framework/page/detail-page.tsx +94 -37
  431. package/src/lib/framework/page/list-page.tsx +18 -11
  432. package/src/lib/framework/page/use-detail-page.ts +47 -13
  433. package/src/lib/framework/page/use-extended-router.tsx +4 -5
  434. package/src/lib/framework/registry/global-registry.ts +4 -0
  435. package/src/lib/framework/registry/registry-types.ts +17 -5
  436. package/src/lib/graphql/api.ts +25 -3
  437. package/src/lib/graphql/common-operations.ts +18 -0
  438. package/src/lib/graphql/{fragments.tsx → fragments.ts} +1 -2
  439. package/src/lib/graphql/graphql-env.d.ts +27 -24
  440. package/src/lib/graphql/settings-store-operations.ts +17 -0
  441. package/src/lib/hooks/use-auth.tsx +1 -1
  442. package/src/lib/hooks/use-channel.ts +1 -1
  443. package/src/lib/hooks/use-extended-detail-query.ts +37 -0
  444. package/src/lib/hooks/use-extended-list-query.ts +75 -0
  445. package/src/lib/hooks/use-floating-bulk-actions.ts +82 -0
  446. package/src/lib/hooks/use-grouped-permissions.ts +3 -2
  447. package/src/lib/hooks/use-local-format.ts +20 -5
  448. package/src/lib/hooks/use-page-block.tsx +18 -0
  449. package/src/lib/hooks/use-page.tsx +2 -2
  450. package/src/lib/hooks/use-permissions.ts +3 -2
  451. package/src/lib/hooks/use-server-config.ts +1 -1
  452. package/src/lib/hooks/use-theme.ts +1 -1
  453. package/src/lib/hooks/use-user-settings.tsx +1 -1
  454. package/src/lib/index.ts +85 -7
  455. package/src/lib/lib/trans.tsx +3 -3
  456. package/src/lib/lib/utils.ts +52 -1
  457. package/src/lib/providers/auth.tsx +37 -14
  458. package/src/lib/providers/channel-provider.tsx +17 -15
  459. package/src/lib/providers/server-config.tsx +13 -11
  460. package/src/lib/providers/theme-provider.tsx +2 -3
  461. package/src/lib/providers/user-settings.tsx +78 -3
  462. package/src/lib/virtual.d.ts +26 -2
  463. package/src/vite-env.d.ts +2 -0
  464. package/vite/tests/barrel-exports.spec.ts +30 -0
  465. package/vite/tests/fixtures-barrel-exports/my-plugin/index.ts +1 -0
  466. package/vite/tests/fixtures-barrel-exports/my-plugin/src/my.plugin.ts +8 -0
  467. package/vite/tests/fixtures-barrel-exports/package.json +6 -0
  468. package/vite/tests/fixtures-barrel-exports/vendure-config.ts +19 -0
  469. package/vite/tests/fixtures-npm-plugin/fake_node_modules/test-plugin/index.js +20 -0
  470. package/vite/tests/fixtures-npm-plugin/fake_node_modules/test-plugin/package.json +8 -0
  471. package/vite/tests/fixtures-npm-plugin/package.json +6 -0
  472. package/vite/tests/fixtures-npm-plugin/vendure-config.ts +18 -0
  473. package/vite/tests/fixtures-path-alias/js-aliased/index.ts +1 -0
  474. package/vite/tests/fixtures-path-alias/js-aliased/src/js-aliased.plugin.ts +8 -0
  475. package/vite/tests/fixtures-path-alias/package.json +6 -0
  476. package/vite/tests/fixtures-path-alias/star-aliased/index.ts +1 -0
  477. package/vite/tests/fixtures-path-alias/star-aliased/src/star-aliased.plugin.ts +8 -0
  478. package/vite/tests/fixtures-path-alias/ts-aliased/index.ts +1 -0
  479. package/vite/tests/fixtures-path-alias/ts-aliased/src/ts-aliased.plugin.ts +8 -0
  480. package/vite/tests/fixtures-path-alias/vendure-config.ts +20 -0
  481. package/vite/tests/npm-plugin.spec.ts +46 -0
  482. package/vite/tests/path-alias.spec.ts +61 -0
  483. package/vite/tests/tsconfig.json +21 -0
  484. package/vite/types.ts +44 -0
  485. package/vite/utils/ast-utils.spec.ts +1 -80
  486. package/vite/utils/ast-utils.ts +0 -86
  487. package/vite/utils/compiler.ts +244 -0
  488. package/vite/utils/config-loader.ts +0 -445
  489. package/vite/utils/logger.ts +43 -0
  490. package/vite/utils/plugin-discovery.ts +494 -0
  491. package/vite/utils/tsconfig-utils.ts +79 -0
  492. package/vite/utils/ui-config.ts +30 -42
  493. package/vite/vite-plugin-config-loader.ts +25 -17
  494. package/vite/vite-plugin-config.ts +6 -7
  495. package/vite/vite-plugin-dashboard-metadata.ts +27 -16
  496. package/vite/vite-plugin-tailwind-source.ts +81 -0
  497. package/vite/vite-plugin-theme.ts +69 -69
  498. package/vite/vite-plugin-ui-config.ts +119 -17
  499. package/vite/vite-plugin-vendure-dashboard.ts +60 -16
  500. package/dist/plugin/utils/ast-utils.js +0 -96
  501. package/dist/plugin/utils/ast-utils.spec.js +0 -120
  502. package/dist/plugin/utils/config-loader.d.ts +0 -52
  503. package/dist/plugin/utils/config-loader.js +0 -343
  504. package/dist/plugin/utils/ui-config.d.ts +0 -3
  505. package/dist/plugin/utils/ui-config.js +0 -34
  506. package/dist/plugin/vite-plugin-theme.js +0 -130
  507. package/dist/plugin/vite-plugin-ui-config.d.ts +0 -15
  508. package/dist/plugin/vite-plugin-vendure-dashboard.d.ts +0 -44
  509. package/src/lib/components/shared/rich-text-editor.tsx +0 -0
  510. package/src/lib/framework/alert/types.ts +0 -13
  511. package/src/lib/framework/dashboard-widget/types.ts +0 -22
  512. /package/dist/{plugin/utils/ast-utils.spec.d.ts → vite/types.js} +0 -0
  513. /package/dist/{plugin → vite}/utils/schema-generator.d.ts +0 -0
  514. /package/dist/{plugin → vite}/utils/schema-generator.js +0 -0
  515. /package/dist/{plugin → vite}/vite-plugin-admin-api-schema.d.ts +0 -0
  516. /package/dist/{plugin → vite}/vite-plugin-admin-api-schema.js +0 -0
  517. /package/dist/{plugin → vite}/vite-plugin-config.d.ts +0 -0
  518. /package/dist/{plugin → vite}/vite-plugin-gql-tada.d.ts +0 -0
  519. /package/dist/{plugin → vite}/vite-plugin-gql-tada.js +0 -0
  520. /package/dist/{plugin → vite}/vite-plugin-theme.d.ts +0 -0
  521. /package/dist/{plugin → vite}/vite-plugin-transform-index.d.ts +0 -0
  522. /package/dist/{plugin → vite}/vite-plugin-transform-index.js +0 -0
  523. /package/src/lib/components/data-table/{data-table-types.ts → types.ts} +0 -0
@@ -1,6 +1,6 @@
1
- import { api } from '@/graphql/api.js';
2
- import { ResultOf, graphql } from '@/graphql/graphql.js';
3
- import { useUserSettings } from '@/hooks/use-user-settings.js';
1
+ import { api } from '@/vdb/graphql/api.js';
2
+ import { graphql, ResultOf } from '@/vdb/graphql/graphql.js';
3
+ import { useUserSettings } from '@/vdb/hooks/use-user-settings.js';
4
4
  import { useQuery, useQueryClient } from '@tanstack/react-query';
5
5
  import * as React from 'react';
6
6
 
@@ -14,7 +14,7 @@ import * as React from 'react';
14
14
  * @since 3.3.0
15
15
  */
16
16
  export interface AuthContext {
17
- status: 'authenticated' | 'verifying' | 'unauthenticated';
17
+ status: 'initial' | 'authenticated' | 'verifying' | 'unauthenticated';
18
18
  authenticationError?: string;
19
19
  isAuthenticated: boolean;
20
20
  login: (username: string, password: string, onSuccess?: () => void) => void;
@@ -70,9 +70,10 @@ const CurrentUserQuery = graphql(`
70
70
 
71
71
  export const AuthContext = React.createContext<AuthContext | null>(null);
72
72
 
73
- export function AuthProvider({ children }: { children: React.ReactNode }) {
74
- const [status, setStatus] = React.useState<AuthContext['status']>('unauthenticated');
73
+ export function AuthProvider({ children }: Readonly<{ children: React.ReactNode }>) {
74
+ const [status, setStatus] = React.useState<AuthContext['status']>('initial');
75
75
  const [authenticationError, setAuthenticationError] = React.useState<string | undefined>();
76
+ const [isLoginLogoutInProgress, setIsLoginLogoutInProgress] = React.useState(false);
76
77
  const { settings, setActiveChannelId } = useUserSettings();
77
78
  const queryClient = useQueryClient();
78
79
 
@@ -84,7 +85,10 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
84
85
  refetch: refetchCurrentUser,
85
86
  } = useQuery({
86
87
  queryKey: ['currentUser'],
87
- queryFn: () => api.query(CurrentUserQuery),
88
+ queryFn: () => {
89
+ return api.query(CurrentUserQuery);
90
+ },
91
+ retry: false, // Disable retries to avoid waiting for multiple attempts
88
92
  });
89
93
 
90
94
  // Set active channel if needed
@@ -97,6 +101,7 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
97
101
  // Auth actions
98
102
  const login = React.useCallback(
99
103
  (username: string, password: string, onLoginSuccess?: () => void) => {
104
+ setIsLoginLogoutInProgress(true);
100
105
  setStatus('verifying');
101
106
  api.mutate(LoginMutation)({ username, password })
102
107
  .then(async data => {
@@ -106,15 +111,18 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
106
111
  // Invalidate all queries to ensure fresh data after login
107
112
  await queryClient.invalidateQueries();
108
113
  setStatus('authenticated');
114
+ setIsLoginLogoutInProgress(false);
109
115
  onLoginSuccess?.();
110
116
  } else {
111
117
  setAuthenticationError(data?.login.message);
112
118
  setStatus('unauthenticated');
119
+ setIsLoginLogoutInProgress(false);
113
120
  }
114
121
  })
115
122
  .catch(error => {
116
123
  setAuthenticationError(error.message);
117
124
  setStatus('unauthenticated');
125
+ setIsLoginLogoutInProgress(false);
118
126
  });
119
127
  },
120
128
  [refetchCurrentUser, queryClient],
@@ -122,6 +130,7 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
122
130
 
123
131
  const logout = React.useCallback(
124
132
  async (onLogoutSuccess?: () => void) => {
133
+ setIsLoginLogoutInProgress(true);
125
134
  setStatus('verifying');
126
135
  api.mutate(LogOutMutation)({}).then(async data => {
127
136
  if (data?.logout.success) {
@@ -131,6 +140,7 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
131
140
  localStorage.removeItem('vendure-selected-channel');
132
141
  localStorage.removeItem('vendure-selected-channel-token');
133
142
  setStatus('unauthenticated');
143
+ setIsLoginLogoutInProgress(false);
134
144
  onLogoutSuccess?.();
135
145
  }
136
146
  });
@@ -141,15 +151,28 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
141
151
  // Determine isAuthenticated from currentUserData
142
152
  const isAuthenticated = !!currentUserData?.me?.id;
143
153
 
144
- // Set status based on query result (only if not in the middle of login/logout)
154
+ // Handle status transitions based on query state
145
155
  React.useEffect(() => {
146
- if (status === 'verifying') return;
147
- if (currentUserError || !currentUserData?.me?.id) {
148
- setStatus('unauthenticated');
149
- } else {
150
- setStatus('authenticated');
156
+ // Don't change status if we're in the middle of login/logout
157
+ if (isLoginLogoutInProgress) {
158
+ return;
159
+ }
160
+
161
+ // If query is loading and we haven't started verifying yet, set to verifying
162
+ if (isLoading && status === 'initial') {
163
+ setStatus('verifying');
164
+ return;
165
+ }
166
+
167
+ // If query has completed (not loading) and we're in verifying state, determine final status
168
+ if (!isLoading && status === 'verifying') {
169
+ if (currentUserError || !currentUserData?.me?.id) {
170
+ setStatus('unauthenticated');
171
+ } else {
172
+ setStatus('authenticated');
173
+ }
151
174
  }
152
- }, [currentUserData, currentUserError]);
175
+ }, [isLoading, currentUserData, currentUserError, status, isLoginLogoutInProgress]);
153
176
 
154
177
  return (
155
178
  <AuthContext.Provider
@@ -1,6 +1,6 @@
1
- import { api } from '@/graphql/api.js';
2
- import { ResultOf, graphql } from '@/graphql/graphql.js';
3
- import { useAuth } from '@/hooks/use-auth.js';
1
+ import { api } from '@/vdb/graphql/api.js';
2
+ import { ResultOf, graphql } from '@/vdb/graphql/graphql.js';
3
+ import { useAuth } from '@/vdb/hooks/use-auth.js';
4
4
  import { useQuery, useQueryClient } from '@tanstack/react-query';
5
5
  import * as React from 'react';
6
6
 
@@ -13,6 +13,7 @@ const channelFragment = graphql(`
13
13
  defaultLanguageCode
14
14
  defaultCurrencyCode
15
15
  pricesIncludeTax
16
+ availableLanguageCodes
16
17
  }
17
18
  `);
18
19
 
@@ -65,7 +66,7 @@ export const ChannelContext = React.createContext<ChannelContext | undefined>(un
65
66
  const SELECTED_CHANNEL_KEY = 'vendure-selected-channel';
66
67
  const SELECTED_CHANNEL_TOKEN_KEY = 'vendure-selected-channel-token';
67
68
 
68
- export function ChannelProvider({ children }: { children: React.ReactNode }) {
69
+ export function ChannelProvider({ children }: Readonly<{ children: React.ReactNode }>) {
69
70
  const queryClient = useQueryClient();
70
71
  const { channels: userChannels, isAuthenticated } = useAuth();
71
72
  const [selectedChannelId, setSelectedChannelId] = React.useState<string | undefined>(() => {
@@ -92,17 +93,18 @@ export function ChannelProvider({ children }: { children: React.ReactNode }) {
92
93
  // If user has specific channels assigned (non-superadmin), use those
93
94
  if (userChannels && userChannels.length > 0) {
94
95
  // Map user channels to match the Channel type structure
95
- return userChannels.map(ch => ({
96
- id: ch.id,
97
- code: ch.code,
98
- token: ch.token,
99
- defaultLanguageCode:
100
- channelsData?.channels.items.find(c => c.id === ch.id)?.defaultLanguageCode || 'en',
101
- defaultCurrencyCode:
102
- channelsData?.channels.items.find(c => c.id === ch.id)?.defaultCurrencyCode || 'USD',
103
- pricesIncludeTax:
104
- channelsData?.channels.items.find(c => c.id === ch.id)?.pricesIncludeTax || false,
105
- }));
96
+ return userChannels.map(ch => {
97
+ const fullChannelData = channelsData?.channels.items.find(c => c.id === ch.id);
98
+ return {
99
+ id: ch.id,
100
+ code: ch.code,
101
+ token: ch.token,
102
+ defaultLanguageCode: fullChannelData?.defaultLanguageCode || 'en',
103
+ defaultCurrencyCode: fullChannelData?.defaultCurrencyCode || 'USD',
104
+ pricesIncludeTax: fullChannelData?.pricesIncludeTax || false,
105
+ availableLanguageCodes: fullChannelData?.availableLanguageCodes || ['en'],
106
+ };
107
+ });
106
108
  }
107
109
  // Otherwise use all channels (superadmin)
108
110
  return channelsData?.channels.items || [];
@@ -1,6 +1,6 @@
1
- import { api } from '@/graphql/api.js';
2
- import { graphql } from '@/graphql/graphql.js';
3
- import { useAuth } from '@/hooks/use-auth.js';
1
+ import { api } from '@/vdb/graphql/api.js';
2
+ import { graphql } from '@/vdb/graphql/graphql.js';
3
+ import { useAuth } from '@/vdb/hooks/use-auth.js';
4
4
  import { useQuery } from '@tanstack/react-query';
5
5
  import { ResultOf } from 'gql.tada';
6
6
  import React from 'react';
@@ -270,14 +270,16 @@ export const ServerConfigProvider = ({ children }: { children: React.ReactNode }
270
270
  enabled: !!user?.id,
271
271
  staleTime: 1000,
272
272
  });
273
- const value: ServerConfig | null = data?.globalSettings ? {
274
- availableLanguages: data?.globalSettings.availableLanguages ?? [],
275
- moneyStrategyPrecision: data?.globalSettings.serverConfig.moneyStrategyPrecision ?? 2,
276
- orderProcess: data?.globalSettings.serverConfig.orderProcess ?? [],
277
- permittedAssetTypes: data?.globalSettings.serverConfig.permittedAssetTypes ?? [],
278
- permissions: data?.globalSettings.serverConfig.permissions ?? [],
279
- entityCustomFields: data?.globalSettings.serverConfig.entityCustomFields ?? [],
280
- } : null;
273
+ const value: ServerConfig | null = data?.globalSettings
274
+ ? {
275
+ availableLanguages: data?.globalSettings.availableLanguages ?? [],
276
+ moneyStrategyPrecision: data?.globalSettings.serverConfig.moneyStrategyPrecision ?? 2,
277
+ orderProcess: data?.globalSettings.serverConfig.orderProcess ?? [],
278
+ permittedAssetTypes: data?.globalSettings.serverConfig.permittedAssetTypes ?? [],
279
+ permissions: data?.globalSettings.serverConfig.permissions ?? [],
280
+ entityCustomFields: data?.globalSettings.serverConfig.entityCustomFields ?? [],
281
+ }
282
+ : null;
281
283
 
282
284
  return <ServerConfigContext.Provider value={value}>{children}</ServerConfigContext.Provider>;
283
285
  };
@@ -1,4 +1,4 @@
1
- import { createContext, useEffect, useState } from 'react';
1
+ import { createContext, useEffect } from 'react';
2
2
  import { useUserSettings } from '../hooks/use-user-settings.js';
3
3
 
4
4
  export type Theme = 'dark' | 'light' | 'system';
@@ -21,7 +21,7 @@ const initialState: ThemeProviderState = {
21
21
 
22
22
  export const ThemeProviderContext = createContext<ThemeProviderState>(initialState);
23
23
 
24
- export function ThemeProvider({ children, defaultTheme = 'system', ...props }: ThemeProviderProps) {
24
+ export function ThemeProvider({ children, defaultTheme = 'system', ...props }: Readonly<ThemeProviderProps>) {
25
25
  const { settings, setTheme } = useUserSettings();
26
26
 
27
27
  useEffect(() => {
@@ -51,4 +51,3 @@ export function ThemeProvider({ children, defaultTheme = 'system', ...props }: T
51
51
  </ThemeProviderContext.Provider>
52
52
  );
53
53
  }
54
-
@@ -1,6 +1,12 @@
1
- import React, { createContext, useState, useEffect } from 'react';
2
- import { Theme } from './theme-provider.js';
1
+ import { QueryClient, useMutation, useQuery } from '@tanstack/react-query';
3
2
  import { ColumnFiltersState } from '@tanstack/react-table';
3
+ import React, { createContext, useEffect, useRef, useState } from 'react';
4
+ import { api } from '../graphql/api.js';
5
+ import {
6
+ getSettingsStoreValueDocument,
7
+ setSettingsStoreValueDocument,
8
+ } from '../graphql/settings-store-operations.js';
9
+ import { Theme } from './theme-provider.js';
4
10
 
5
11
  export interface TableSettings {
6
12
  columnVisibility?: Record<string, boolean>;
@@ -56,8 +62,14 @@ export interface UserSettingsContextType {
56
62
  export const UserSettingsContext = createContext<UserSettingsContextType | undefined>(undefined);
57
63
 
58
64
  const STORAGE_KEY = 'vendure-user-settings';
65
+ const SETTINGS_STORE_KEY = 'vendure.dashboard.userSettings';
59
66
 
60
- export const UserSettingsProvider: React.FC<React.PropsWithChildren<{}>> = ({ children }) => {
67
+ interface UserSettingsProviderProps {
68
+ queryClient?: QueryClient;
69
+ children: React.ReactNode;
70
+ }
71
+
72
+ export const UserSettingsProvider: React.FC<UserSettingsProviderProps> = ({ queryClient, children }) => {
61
73
  // Load settings from localStorage or use defaults
62
74
  const loadSettings = (): UserSettings => {
63
75
  try {
@@ -72,6 +84,49 @@ export const UserSettingsProvider: React.FC<React.PropsWithChildren<{}>> = ({ ch
72
84
  };
73
85
 
74
86
  const [settings, setSettings] = useState<UserSettings>(loadSettings);
87
+ const [serverSettings, setServerSettings] = useState<UserSettings | null>(null);
88
+ const [isReady, setIsReady] = useState(false);
89
+ const previousContentLanguage = useRef(settings.contentLanguage);
90
+
91
+ // Load settings from server on mount
92
+ const { data: serverSettingsResponse, isSuccess: serverSettingsLoaded } = useQuery({
93
+ queryKey: ['user-settings', SETTINGS_STORE_KEY],
94
+ queryFn: () => api.query(getSettingsStoreValueDocument, { key: SETTINGS_STORE_KEY }),
95
+ retry: false,
96
+ staleTime: 0,
97
+ });
98
+
99
+ // Mutation to save settings to server
100
+ const saveToServerMutation = useMutation({
101
+ mutationFn: (settingsToSave: UserSettings) =>
102
+ api.mutate(setSettingsStoreValueDocument, {
103
+ input: { key: SETTINGS_STORE_KEY, value: settingsToSave },
104
+ }),
105
+ onError: error => {
106
+ console.error('Failed to save user settings to server:', error);
107
+ },
108
+ });
109
+
110
+ // Initialize settings from server if available
111
+ useEffect(() => {
112
+ if (serverSettingsLoaded && !isReady) {
113
+ try {
114
+ const serverSettingsData =
115
+ serverSettingsResponse?.getSettingsStoreValue as UserSettings | null;
116
+ if (serverSettingsData) {
117
+ // Server has settings, use them
118
+ const mergedSettings = { ...defaultSettings, ...serverSettingsData };
119
+ setSettings(mergedSettings);
120
+ setServerSettings(mergedSettings);
121
+ setIsReady(true);
122
+ }
123
+ } catch (e) {
124
+ console.error('Failed to parse server settings:', e);
125
+ setServerSettings(settings);
126
+ setIsReady(true);
127
+ }
128
+ }
129
+ }, [serverSettingsLoaded, serverSettingsResponse, settings, isReady]);
75
130
 
76
131
  // Save settings to localStorage whenever they change
77
132
  useEffect(() => {
@@ -82,6 +137,26 @@ export const UserSettingsProvider: React.FC<React.PropsWithChildren<{}>> = ({ ch
82
137
  }
83
138
  }, [settings]);
84
139
 
140
+ // Save to server when settings differ from server state
141
+ useEffect(() => {
142
+ if (isReady && serverSettings) {
143
+ const serverDiffers = JSON.stringify(serverSettings) !== JSON.stringify(settings);
144
+
145
+ if (serverDiffers) {
146
+ saveToServerMutation.mutate(settings);
147
+ setServerSettings(settings);
148
+ }
149
+ }
150
+ }, [settings, serverSettings, isReady, saveToServerMutation]);
151
+
152
+ // Invalidate all queries when content language changes
153
+ useEffect(() => {
154
+ if (queryClient && settings.contentLanguage !== previousContentLanguage.current) {
155
+ void queryClient.invalidateQueries();
156
+ previousContentLanguage.current = settings.contentLanguage;
157
+ }
158
+ }, [settings.contentLanguage, queryClient]);
159
+
85
160
  // Settings updaters
86
161
  const updateSetting = <K extends keyof UserSettings>(key: K, value: UserSettings[K]) => {
87
162
  setSettings(prev => ({ ...prev, [key]: value }));
@@ -7,6 +7,30 @@ declare module 'virtual:dashboard-extensions' {
7
7
  }
8
8
 
9
9
  declare module 'virtual:vendure-ui-config' {
10
- import { AdminUiConfig } from '@vendure/core';
11
- export const uiConfig: AdminUiConfig;
10
+ import { LanguageCode } from '@vendure/core';
11
+
12
+ // TODO: Find a better way to share types between vite plugin and virtual module declaration
13
+ // Currently we have duplicated type definitions here and in vite-plugin-ui-config.ts
14
+ interface ResolvedApiConfig {
15
+ host: string | 'auto';
16
+ port: number | 'auto';
17
+ adminApiPath: string;
18
+ tokenMethod: 'cookie' | 'bearer';
19
+ authTokenHeaderKey: string;
20
+ channelTokenKey: string;
21
+ }
22
+
23
+ interface ResolvedI18nConfig {
24
+ defaultLanguage: LanguageCode;
25
+ defaultLocale: string | undefined;
26
+ availableLanguages: LanguageCode[];
27
+ availableLocales: string[];
28
+ }
29
+
30
+ interface ResolvedUiConfig {
31
+ api: ResolvedApiConfig;
32
+ i18n: ResolvedI18nConfig;
33
+ }
34
+
35
+ export const uiConfig: ResolvedUiConfig;
12
36
  }
@@ -0,0 +1,2 @@
1
+ /// <reference types="vite/client" />
2
+ /// <reference path="./lib/virtual.d.ts" />
@@ -0,0 +1,30 @@
1
+ import { rm } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { describe, expect, it } from 'vitest';
4
+
5
+ import { compile } from '../utils/compiler.js';
6
+ import { debugLogger, noopLogger } from '../utils/logger.js';
7
+
8
+ describe('detecting plugins in barrel exports', () => {
9
+ it(
10
+ 'should detect plugins in barrel exports',
11
+ async () => {
12
+ const tempDir = join(__dirname, './__temp/barrel-exports');
13
+ await rm(tempDir, { recursive: true, force: true });
14
+ const result = await compile({
15
+ outputPath: tempDir,
16
+ vendureConfigPath: join(__dirname, 'fixtures-barrel-exports', 'vendure-config.ts'),
17
+ logger: process.env.LOG ? debugLogger : noopLogger,
18
+ });
19
+
20
+ expect(result.pluginInfo).toHaveLength(1);
21
+ expect(result.pluginInfo[0].name).toBe('MyPlugin');
22
+ expect(result.pluginInfo[0].dashboardEntryPath).toBe('./dashboard/index.tsx');
23
+ expect(result.pluginInfo[0].sourcePluginPath).toBe(
24
+ join(__dirname, 'fixtures-barrel-exports', 'my-plugin', 'src', 'my.plugin.ts'),
25
+ );
26
+ expect(result.pluginInfo[0].pluginPath).toBe(join(tempDir, 'my-plugin', 'src', 'my.plugin.js'));
27
+ },
28
+ { timeout: 10_000 },
29
+ );
30
+ });
@@ -0,0 +1 @@
1
+ export * from './src/my.plugin';
@@ -0,0 +1,8 @@
1
+ import { PluginCommonModule, VendurePlugin } from '@vendure/core';
2
+
3
+ @VendurePlugin({
4
+ imports: [PluginCommonModule],
5
+ providers: [],
6
+ dashboard: './dashboard/index.tsx',
7
+ })
8
+ export class MyPlugin {}
@@ -0,0 +1,6 @@
1
+ {
2
+ "type": "commonjs",
3
+ "name": "barrel-exports",
4
+ "version": "0.0.1",
5
+ "main": "index.ts"
6
+ }
@@ -0,0 +1,19 @@
1
+ import { VendureConfig } from '@vendure/core';
2
+
3
+ import { MyPlugin } from './my-plugin';
4
+
5
+ export const config: VendureConfig = {
6
+ apiOptions: {
7
+ port: 3000,
8
+ },
9
+ authOptions: {
10
+ tokenMethod: 'bearer',
11
+ },
12
+ dbConnectionOptions: {
13
+ type: 'postgres',
14
+ },
15
+ paymentOptions: {
16
+ paymentMethodHandlers: [],
17
+ },
18
+ plugins: [MyPlugin],
19
+ };
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.TestPlugin = void 0;
10
+ const core_1 = require("@vendure/core");
11
+ let TestPlugin = class TestPlugin {
12
+ };
13
+ exports.TestPlugin = TestPlugin;
14
+ exports.TestPlugin = TestPlugin = __decorate([
15
+ (0, core_1.VendurePlugin)({
16
+ imports: [core_1.PluginCommonModule],
17
+ dashboard: './dashboard/index.tsx',
18
+ })
19
+ ], TestPlugin);
20
+ //# sourceMappingURL=reviews-plugin.js.map
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "test-plugin",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "scripts": {
6
+ "build": "echo 'Building test-plugin'"
7
+ }
8
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "type": "commonjs",
3
+ "name": "npm-plugin",
4
+ "version": "0.0.1",
5
+ "main": "index.ts"
6
+ }
@@ -0,0 +1,18 @@
1
+ import { VendureConfig } from '@vendure/core';
2
+ import { TestPlugin } from 'test-plugin';
3
+
4
+ export const config: VendureConfig = {
5
+ apiOptions: {
6
+ port: 3000,
7
+ },
8
+ authOptions: {
9
+ tokenMethod: 'bearer',
10
+ },
11
+ dbConnectionOptions: {
12
+ type: 'postgres',
13
+ },
14
+ paymentOptions: {
15
+ paymentMethodHandlers: [],
16
+ },
17
+ plugins: [TestPlugin],
18
+ };
@@ -0,0 +1 @@
1
+ export * from './src/js-aliased.plugin';
@@ -0,0 +1,8 @@
1
+ import { PluginCommonModule, VendurePlugin } from '@vendure/core';
2
+
3
+ @VendurePlugin({
4
+ imports: [PluginCommonModule],
5
+ providers: [],
6
+ dashboard: './dashboard/index.tsx',
7
+ })
8
+ export class JsAliasedPlugin {}
@@ -0,0 +1,6 @@
1
+ {
2
+ "type": "commonjs",
3
+ "name": "aliased-plugin",
4
+ "version": "0.0.1",
5
+ "main": "index.ts"
6
+ }
@@ -0,0 +1 @@
1
+ export * from './src/star-aliased.plugin';
@@ -0,0 +1,8 @@
1
+ import { PluginCommonModule, VendurePlugin } from '@vendure/core';
2
+
3
+ @VendurePlugin({
4
+ imports: [PluginCommonModule],
5
+ providers: [],
6
+ dashboard: './dashboard/index.tsx',
7
+ })
8
+ export class StarAliasedPlugin {}
@@ -0,0 +1 @@
1
+ export * from './src/ts-aliased.plugin';
@@ -0,0 +1,8 @@
1
+ import { PluginCommonModule, VendurePlugin } from '@vendure/core';
2
+
3
+ @VendurePlugin({
4
+ imports: [PluginCommonModule],
5
+ providers: [],
6
+ dashboard: './dashboard/index.tsx',
7
+ })
8
+ export class TsAliasedPlugin {}
@@ -0,0 +1,20 @@
1
+ import { JsAliasedPlugin } from '@other/js-aliased';
2
+ import { TsAliasedPlugin } from '@other/ts-aliased';
3
+ import { StarAliasedPlugin } from '@plugins/star-aliased';
4
+ import { VendureConfig } from '@vendure/core';
5
+
6
+ export const config: VendureConfig = {
7
+ apiOptions: {
8
+ port: 3000,
9
+ },
10
+ authOptions: {
11
+ tokenMethod: 'bearer',
12
+ },
13
+ dbConnectionOptions: {
14
+ type: 'postgres',
15
+ },
16
+ paymentOptions: {
17
+ paymentMethodHandlers: [],
18
+ },
19
+ plugins: [StarAliasedPlugin, TsAliasedPlugin, JsAliasedPlugin],
20
+ };
@@ -0,0 +1,46 @@
1
+ import { rm } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import tsconfigPaths from 'tsconfig-paths';
4
+ import { describe, expect, it } from 'vitest';
5
+
6
+ import { compile } from '../utils/compiler.js';
7
+ import { debugLogger, noopLogger } from '../utils/logger.js';
8
+
9
+ describe('detecting plugins in npm packages', () => {
10
+ it(
11
+ 'should detect plugins in npm packages',
12
+ async () => {
13
+ const tempDir = join(__dirname, './__temp/npm-plugin');
14
+ await rm(tempDir, { recursive: true, force: true });
15
+ const fakeNodeModules = join(__dirname, 'fixtures-npm-plugin', 'fake_node_modules');
16
+
17
+ // For this test to work, we need to use tsconfigPaths to point
18
+ // the `test-plugin` package to the `fake_node_modules` directory.
19
+ // This is because the `test-plugin` package is not installed in
20
+ // the `node_modules` directory, but in the `fake_node_modules`
21
+ // directory.
22
+ tsconfigPaths.register({
23
+ baseUrl: fakeNodeModules,
24
+ paths: {
25
+ 'test-plugin': [join(fakeNodeModules, 'test-plugin')],
26
+ },
27
+ });
28
+
29
+ const result = await compile({
30
+ outputPath: tempDir,
31
+ vendureConfigPath: join(__dirname, 'fixtures-npm-plugin', 'vendure-config.ts'),
32
+ logger: process.env.LOG ? debugLogger : noopLogger,
33
+ pluginPackageScanner: {
34
+ nodeModulesRoot: fakeNodeModules,
35
+ },
36
+ });
37
+
38
+ expect(result.pluginInfo).toHaveLength(1);
39
+ expect(result.pluginInfo[0].name).toBe('TestPlugin');
40
+ expect(result.pluginInfo[0].dashboardEntryPath).toBe('./dashboard/index.tsx');
41
+ expect(result.pluginInfo[0].sourcePluginPath).toBeUndefined();
42
+ expect(result.pluginInfo[0].pluginPath).toBe(join(fakeNodeModules, 'test-plugin', 'index.js'));
43
+ },
44
+ { timeout: 10_000 },
45
+ );
46
+ });