@vendure/dashboard 3.3.6-master-202507050232 → 3.4.0-minor-202506250934

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 (391) hide show
  1. package/README.md +4 -41
  2. package/dist/plugin/utils/config-loader.d.ts +1 -70
  3. package/dist/plugin/utils/config-loader.js +9 -33
  4. package/dist/plugin/vite-plugin-config-loader.js +1 -6
  5. package/dist/plugin/vite-plugin-config.js +7 -6
  6. package/dist/plugin/vite-plugin-dashboard-metadata.d.ts +3 -1
  7. package/dist/plugin/vite-plugin-dashboard-metadata.js +8 -1
  8. package/dist/plugin/vite-plugin-vendure-dashboard.d.ts +0 -41
  9. package/dist/plugin/vite-plugin-vendure-dashboard.js +2 -5
  10. package/package.json +131 -131
  11. package/src/app/app-providers.tsx +6 -6
  12. package/src/app/main.tsx +9 -9
  13. package/src/app/routes/__root.tsx +2 -1
  14. package/src/app/routes/_authenticated/_administrators/administrators.graphql.ts +1 -10
  15. package/src/app/routes/_authenticated/_administrators/administrators.tsx +8 -15
  16. package/src/app/routes/_authenticated/_administrators/administrators_.$id.tsx +12 -16
  17. package/src/app/routes/_authenticated/_administrators/components/role-permissions-display.tsx +16 -16
  18. package/src/app/routes/_authenticated/_assets/assets.graphql.ts +2 -13
  19. package/src/app/routes/_authenticated/_assets/assets.tsx +4 -16
  20. package/src/app/routes/_authenticated/_assets/assets_.$id.tsx +38 -52
  21. package/src/app/routes/_authenticated/_channels/channels.graphql.ts +1 -10
  22. package/src/app/routes/_authenticated/_channels/channels.tsx +10 -17
  23. package/src/app/routes/_authenticated/_channels/channels_.$id.tsx +17 -21
  24. package/src/app/routes/_authenticated/_collections/collections.graphql.ts +3 -60
  25. package/src/app/routes/_authenticated/_collections/collections.tsx +124 -168
  26. package/src/app/routes/_authenticated/_collections/collections_.$id.tsx +16 -20
  27. package/src/app/routes/_authenticated/_collections/components/collection-contents-preview-table.tsx +8 -7
  28. package/src/app/routes/_authenticated/_collections/components/collection-contents-sheet.tsx +5 -9
  29. package/src/app/routes/_authenticated/_collections/components/collection-contents-table.tsx +9 -10
  30. package/src/app/routes/_authenticated/_collections/components/collection-filters-selector.tsx +7 -7
  31. package/src/app/routes/_authenticated/_countries/countries.graphql.ts +2 -11
  32. package/src/app/routes/_authenticated/_countries/countries.tsx +6 -13
  33. package/src/app/routes/_authenticated/_countries/countries_.$id.tsx +17 -21
  34. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-sheet.tsx +5 -12
  35. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-table.tsx +17 -22
  36. package/src/app/routes/_authenticated/_customer-groups/customer-groups.graphql.ts +2 -11
  37. package/src/app/routes/_authenticated/_customer-groups/customer-groups.tsx +6 -13
  38. package/src/app/routes/_authenticated/_customer-groups/customer-groups_.$id.tsx +15 -18
  39. package/src/app/routes/_authenticated/_customers/components/customer-address-card.tsx +19 -19
  40. package/src/app/routes/_authenticated/_customers/components/customer-address-form.tsx +10 -10
  41. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-container.tsx +5 -5
  42. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history.tsx +7 -11
  43. package/src/app/routes/_authenticated/_customers/components/customer-history/use-customer-history.ts +4 -4
  44. package/src/app/routes/_authenticated/_customers/components/customer-order-table.tsx +73 -75
  45. package/src/app/routes/_authenticated/_customers/components/customer-status-badge.tsx +4 -4
  46. package/src/app/routes/_authenticated/_customers/customers.graphql.ts +2 -10
  47. package/src/app/routes/_authenticated/_customers/customers.tsx +6 -13
  48. package/src/app/routes/_authenticated/_customers/customers_.$id.tsx +15 -19
  49. package/src/app/routes/_authenticated/_facets/components/edit-facet-value.tsx +9 -9
  50. package/src/app/routes/_authenticated/_facets/components/facet-values-sheet.tsx +4 -4
  51. package/src/app/routes/_authenticated/_facets/components/facet-values-table.tsx +11 -15
  52. package/src/app/routes/_authenticated/_facets/facets.graphql.ts +1 -31
  53. package/src/app/routes/_authenticated/_facets/facets.tsx +7 -31
  54. package/src/app/routes/_authenticated/_facets/facets_.$id.tsx +13 -17
  55. package/src/app/routes/_authenticated/_global-settings/global-settings.graphql.ts +1 -1
  56. package/src/app/routes/_authenticated/_global-settings/global-settings.tsx +13 -13
  57. package/src/app/routes/_authenticated/_orders/components/customer-address-selector.tsx +14 -11
  58. package/src/app/routes/_authenticated/_orders/components/edit-order-table.tsx +55 -93
  59. package/src/app/routes/_authenticated/_orders/components/money-gross-net.tsx +9 -11
  60. package/src/app/routes/_authenticated/_orders/components/order-address.tsx +6 -5
  61. package/src/app/routes/_authenticated/_orders/components/order-history/order-history-container.tsx +62 -67
  62. package/src/app/routes/_authenticated/_orders/components/order-history/order-history.tsx +6 -11
  63. package/src/app/routes/_authenticated/_orders/components/order-history/use-order-history.ts +5 -9
  64. package/src/app/routes/_authenticated/_orders/components/order-line-custom-fields-form.tsx +7 -11
  65. package/src/app/routes/_authenticated/_orders/components/order-table-totals.tsx +22 -39
  66. package/src/app/routes/_authenticated/_orders/components/order-table.tsx +4 -4
  67. package/src/app/routes/_authenticated/_orders/components/order-tax-summary.tsx +36 -37
  68. package/src/app/routes/_authenticated/_orders/components/payment-details.tsx +33 -18
  69. package/src/app/routes/_authenticated/_orders/components/shipping-method-selector.tsx +44 -43
  70. package/src/app/routes/_authenticated/_orders/orders.graphql.ts +3 -101
  71. package/src/app/routes/_authenticated/_orders/orders.tsx +20 -21
  72. package/src/app/routes/_authenticated/_orders/orders_.$id.tsx +16 -72
  73. package/src/app/routes/_authenticated/_orders/orders_.draft.$id.tsx +90 -188
  74. package/src/app/routes/_authenticated/_payment-methods/components/payment-eligibility-checker-selector.tsx +7 -10
  75. package/src/app/routes/_authenticated/_payment-methods/components/payment-handler-selector.tsx +11 -11
  76. package/src/app/routes/_authenticated/_payment-methods/payment-methods.graphql.ts +2 -29
  77. package/src/app/routes/_authenticated/_payment-methods/payment-methods.tsx +14 -36
  78. package/src/app/routes/_authenticated/_payment-methods/payment-methods_.$id.tsx +15 -22
  79. package/src/app/routes/_authenticated/_product-variants/components/variant-price-detail.tsx +6 -7
  80. package/src/app/routes/_authenticated/_product-variants/product-variants.graphql.ts +3 -64
  81. package/src/app/routes/_authenticated/_product-variants/product-variants.tsx +9 -39
  82. package/src/app/routes/_authenticated/_product-variants/product-variants_.$id.tsx +22 -33
  83. package/src/app/routes/_authenticated/_products/components/add-product-variant-dialog.tsx +10 -10
  84. package/src/app/routes/_authenticated/_products/components/create-product-options-dialog.tsx +41 -57
  85. package/src/app/routes/_authenticated/_products/components/create-product-variants-dialog.tsx +11 -11
  86. package/src/app/routes/_authenticated/_products/components/create-product-variants.tsx +14 -18
  87. package/src/app/routes/_authenticated/_products/components/option-value-input.tsx +15 -21
  88. package/src/app/routes/_authenticated/_products/components/product-option-select.tsx +34 -28
  89. package/src/app/routes/_authenticated/_products/components/product-variants-table.tsx +53 -84
  90. package/src/app/routes/_authenticated/_products/products.graphql.ts +2 -70
  91. package/src/app/routes/_authenticated/_products/products.tsx +7 -36
  92. package/src/app/routes/_authenticated/_products/products_.$id.tsx +24 -33
  93. package/src/app/routes/_authenticated/_profile/profile.graphql.ts +1 -1
  94. package/src/app/routes/_authenticated/_profile/profile.tsx +8 -8
  95. package/src/app/routes/_authenticated/_promotions/components/promotion-actions-selector.tsx +11 -14
  96. package/src/app/routes/_authenticated/_promotions/components/promotion-conditions-selector.tsx +11 -14
  97. package/src/app/routes/_authenticated/_promotions/promotions.graphql.ts +2 -27
  98. package/src/app/routes/_authenticated/_promotions/promotions.tsx +7 -31
  99. package/src/app/routes/_authenticated/_promotions/promotions_.$id.tsx +16 -20
  100. package/src/app/routes/_authenticated/_roles/components/expandable-permissions.tsx +5 -5
  101. package/src/app/routes/_authenticated/_roles/components/permissions-grid.tsx +17 -21
  102. package/src/app/routes/_authenticated/_roles/roles.graphql.ts +1 -10
  103. package/src/app/routes/_authenticated/_roles/roles.tsx +10 -17
  104. package/src/app/routes/_authenticated/_roles/roles_.$id.tsx +12 -16
  105. package/src/app/routes/_authenticated/_sellers/sellers.graphql.ts +1 -10
  106. package/src/app/routes/_authenticated/_sellers/sellers.tsx +6 -13
  107. package/src/app/routes/_authenticated/_sellers/sellers_.$id.tsx +13 -17
  108. package/src/app/routes/_authenticated/_shipping-methods/components/fulfillment-handler-selector.tsx +6 -6
  109. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-calculator-selector.tsx +21 -23
  110. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-eligibility-checker-selector.tsx +21 -25
  111. package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-method-dialog.tsx +3 -3
  112. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.graphql.ts +2 -29
  113. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.tsx +6 -25
  114. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods_.$id.tsx +13 -17
  115. package/src/app/routes/_authenticated/_stock-locations/stock-locations.graphql.ts +1 -26
  116. package/src/app/routes/_authenticated/_stock-locations/stock-locations.tsx +6 -25
  117. package/src/app/routes/_authenticated/_stock-locations/stock-locations_.$id.tsx +12 -16
  118. package/src/app/routes/_authenticated/_system/components/payload-dialog.tsx +4 -4
  119. package/src/app/routes/_authenticated/_system/healthchecks.tsx +4 -4
  120. package/src/app/routes/_authenticated/_system/job-queue.graphql.ts +1 -1
  121. package/src/app/routes/_authenticated/_system/job-queue.tsx +6 -10
  122. package/src/app/routes/_authenticated/_system/scheduled-tasks.tsx +28 -34
  123. package/src/app/routes/_authenticated/_tax-categories/tax-categories.graphql.ts +2 -11
  124. package/src/app/routes/_authenticated/_tax-categories/tax-categories.tsx +7 -14
  125. package/src/app/routes/_authenticated/_tax-categories/tax-categories_.$id.tsx +16 -20
  126. package/src/app/routes/_authenticated/_tax-rates/tax-rates.graphql.ts +2 -11
  127. package/src/app/routes/_authenticated/_tax-rates/tax-rates.tsx +8 -15
  128. package/src/app/routes/_authenticated/_tax-rates/tax-rates_.$id.tsx +18 -22
  129. package/src/app/routes/_authenticated/_zones/components/zone-countries-sheet.tsx +4 -4
  130. package/src/app/routes/_authenticated/_zones/components/zone-countries-table.tsx +8 -12
  131. package/src/app/routes/_authenticated/_zones/zones.graphql.ts +2 -11
  132. package/src/app/routes/_authenticated/_zones/zones.tsx +6 -13
  133. package/src/app/routes/_authenticated/_zones/zones_.$id.tsx +14 -18
  134. package/src/app/routes/_authenticated/index.tsx +4 -4
  135. package/src/app/routes/_authenticated.tsx +3 -3
  136. package/src/app/routes/login.tsx +2 -2
  137. package/src/app/styles.css +1 -4
  138. package/src/lib/components/data-display/boolean.tsx +1 -1
  139. package/src/lib/components/data-display/date-time.tsx +2 -2
  140. package/src/lib/components/data-display/json.tsx +1 -1
  141. package/src/lib/components/data-display/money.tsx +3 -2
  142. package/src/lib/components/data-input/affixed-input.tsx +8 -3
  143. package/src/lib/components/data-input/customer-group-input.tsx +2 -2
  144. package/src/lib/components/data-input/datetime-input.tsx +146 -129
  145. package/src/lib/components/data-input/facet-value-input.tsx +22 -30
  146. package/src/lib/components/data-input/money-input.tsx +12 -5
  147. package/src/lib/components/data-input/{rich-text-input.tsx → richt-text-input.tsx} +1 -1
  148. package/src/lib/components/data-table/add-filter-menu.tsx +18 -9
  149. package/src/lib/components/data-table/data-table-column-header.tsx +22 -4
  150. package/src/lib/components/data-table/data-table-faceted-filter.tsx +8 -8
  151. package/src/lib/components/data-table/data-table-filter-badge.tsx +8 -16
  152. package/src/lib/components/data-table/data-table-filter-dialog.tsx +8 -8
  153. package/src/lib/components/data-table/data-table-pagination.tsx +4 -4
  154. package/src/lib/components/data-table/data-table-view-options.tsx +21 -25
  155. package/src/lib/components/data-table/data-table.tsx +41 -85
  156. package/src/lib/components/data-table/filters/data-table-boolean-filter.tsx +8 -11
  157. package/src/lib/components/data-table/filters/data-table-datetime-filter.tsx +23 -14
  158. package/src/lib/components/data-table/filters/data-table-id-filter.tsx +10 -15
  159. package/src/lib/components/data-table/filters/data-table-number-filter.tsx +17 -18
  160. package/src/lib/components/data-table/filters/data-table-string-filter.tsx +12 -29
  161. package/src/lib/components/data-table/human-readable-operator.tsx +3 -3
  162. package/src/lib/components/data-table/refresh-button.tsx +15 -30
  163. package/src/lib/components/layout/app-layout.tsx +8 -8
  164. package/src/lib/components/layout/app-sidebar.tsx +5 -5
  165. package/src/lib/components/layout/channel-switcher.tsx +8 -8
  166. package/src/lib/components/layout/content-language-selector.tsx +10 -16
  167. package/src/lib/components/layout/generated-breadcrumbs.tsx +1 -1
  168. package/src/lib/components/layout/language-dialog.tsx +11 -5
  169. package/src/lib/components/layout/nav-main.tsx +4 -4
  170. package/src/lib/components/layout/nav-projects.tsx +2 -2
  171. package/src/lib/components/layout/nav-user.tsx +7 -7
  172. package/src/lib/components/layout/prerelease-popup.tsx +1 -1
  173. package/src/lib/components/login/login-form.tsx +5 -5
  174. package/src/lib/components/shared/alerts.tsx +3 -3
  175. package/src/lib/components/shared/animated-number.tsx +2 -2
  176. package/src/lib/components/shared/asset/asset-focal-point-editor.tsx +19 -29
  177. package/src/lib/components/shared/asset/asset-gallery.tsx +18 -23
  178. package/src/lib/components/shared/asset/asset-picker-dialog.tsx +66 -63
  179. package/src/lib/components/shared/asset/asset-preview-dialog.tsx +7 -3
  180. package/src/lib/components/shared/asset/asset-preview-selector.tsx +6 -4
  181. package/src/lib/components/shared/asset/asset-preview.tsx +15 -7
  182. package/src/lib/components/shared/asset/asset-properties.tsx +9 -7
  183. package/src/lib/components/shared/asset/focal-point-control.tsx +13 -5
  184. package/src/lib/components/shared/assigned-facet-values.tsx +5 -1
  185. package/src/lib/components/shared/channel-code-label.tsx +4 -3
  186. package/src/lib/components/shared/channel-selector.tsx +6 -6
  187. package/src/lib/components/shared/configurable-operation-arg-input.tsx +2 -2
  188. package/src/lib/components/shared/configurable-operation-input.tsx +16 -15
  189. package/src/lib/components/shared/confirmation-dialog.tsx +2 -2
  190. package/src/lib/components/shared/copyable-text.tsx +4 -3
  191. package/src/lib/components/shared/country-selector.tsx +18 -21
  192. package/src/lib/components/shared/currency-selector.tsx +5 -5
  193. package/src/lib/components/shared/custom-fields-form.tsx +51 -253
  194. package/src/lib/components/shared/customer-address-form.tsx +13 -18
  195. package/src/lib/components/shared/customer-group-selector.tsx +6 -6
  196. package/src/lib/components/shared/customer-selector.tsx +18 -24
  197. package/src/lib/components/shared/detail-page-button.tsx +1 -3
  198. package/src/lib/components/shared/entity-assets.tsx +34 -33
  199. package/src/lib/components/shared/error-page.tsx +6 -6
  200. package/src/lib/components/shared/facet-value-chip.tsx +5 -12
  201. package/src/lib/components/shared/facet-value-selector.tsx +63 -64
  202. package/src/lib/components/shared/form-field-wrapper.tsx +24 -47
  203. package/src/lib/components/shared/history-timeline/history-entry.tsx +6 -12
  204. package/src/lib/components/shared/history-timeline/history-note-checkbox.tsx +3 -3
  205. package/src/lib/components/shared/history-timeline/history-note-editor.tsx +4 -4
  206. package/src/lib/components/shared/history-timeline/history-note-input.tsx +3 -3
  207. package/src/lib/components/shared/history-timeline/history-timeline.tsx +8 -15
  208. package/src/lib/components/shared/language-selector.tsx +5 -5
  209. package/src/lib/components/shared/logo-mark.tsx +2 -2
  210. package/src/lib/components/shared/multi-select.tsx +5 -5
  211. package/src/lib/components/shared/navigation-confirmation.tsx +9 -24
  212. package/src/lib/components/shared/option-value-input.tsx +15 -17
  213. package/src/lib/components/shared/paginated-list-data-table.tsx +24 -100
  214. package/src/lib/components/shared/permission-guard.tsx +4 -4
  215. package/src/lib/components/shared/product-variant-selector.tsx +31 -32
  216. package/src/lib/components/shared/role-code-label.tsx +6 -10
  217. package/src/lib/components/shared/role-selector.tsx +4 -4
  218. package/src/lib/components/shared/seller-selector.tsx +17 -21
  219. package/src/lib/components/shared/stock-level-label.tsx +5 -5
  220. package/src/lib/components/shared/tax-category-selector.tsx +5 -5
  221. package/src/lib/components/shared/translatable-form-field.tsx +21 -30
  222. package/src/lib/components/shared/vendure-image.tsx +2 -31
  223. package/src/lib/components/shared/zone-selector.tsx +6 -5
  224. package/src/lib/components/ui/accordion.tsx +3 -3
  225. package/src/lib/components/ui/alert-dialog.tsx +10 -10
  226. package/src/lib/components/ui/alert.tsx +3 -3
  227. package/src/lib/components/ui/badge.tsx +2 -2
  228. package/src/lib/components/ui/breadcrumb.tsx +4 -4
  229. package/src/lib/components/ui/button.tsx +3 -10
  230. package/src/lib/components/ui/calendar.tsx +459 -392
  231. package/src/lib/components/ui/card.tsx +2 -2
  232. package/src/lib/components/ui/checkbox.tsx +2 -2
  233. package/src/lib/components/ui/command.tsx +6 -12
  234. package/src/lib/components/ui/dialog.tsx +2 -2
  235. package/src/lib/components/ui/dropdown-menu.tsx +7 -7
  236. package/src/lib/components/ui/form.tsx +4 -4
  237. package/src/lib/components/ui/hover-card.tsx +3 -3
  238. package/src/lib/components/ui/input.tsx +1 -1
  239. package/src/lib/components/ui/label.tsx +2 -2
  240. package/src/lib/components/ui/pagination.tsx +108 -87
  241. package/src/lib/components/ui/popover.tsx +3 -3
  242. package/src/lib/components/ui/scroll-area.tsx +2 -2
  243. package/src/lib/components/ui/select.tsx +129 -151
  244. package/src/lib/components/ui/separator.tsx +2 -2
  245. package/src/lib/components/ui/sheet.tsx +5 -5
  246. package/src/lib/components/ui/sidebar.tsx +10 -10
  247. package/src/lib/components/ui/skeleton.tsx +1 -1
  248. package/src/lib/components/ui/switch.tsx +2 -2
  249. package/src/lib/components/ui/table.tsx +2 -2
  250. package/src/lib/components/ui/tabs.tsx +3 -3
  251. package/src/lib/components/ui/textarea.tsx +1 -1
  252. package/src/lib/components/ui/tooltip.tsx +3 -3
  253. package/src/lib/framework/alert/alert-extensions.tsx +3 -2
  254. package/src/lib/framework/alert/alert-item.tsx +3 -5
  255. package/src/lib/framework/alert/types.ts +13 -0
  256. package/src/lib/framework/component-registry/component-registry.tsx +47 -33
  257. package/src/lib/framework/dashboard-widget/base-widget.tsx +13 -5
  258. package/src/lib/framework/dashboard-widget/latest-orders-widget/index.tsx +8 -8
  259. package/src/lib/framework/dashboard-widget/latest-orders-widget/latest-orders-widget.graphql.ts +1 -1
  260. package/src/lib/framework/dashboard-widget/metrics-widget/index.tsx +7 -6
  261. package/src/lib/framework/dashboard-widget/metrics-widget/metrics-widget.graphql.ts +1 -1
  262. package/src/lib/framework/dashboard-widget/orders-summary/index.tsx +6 -7
  263. package/src/lib/framework/dashboard-widget/orders-summary/order-summary-widget.graphql.ts +1 -1
  264. package/src/lib/framework/dashboard-widget/types.ts +22 -0
  265. package/src/lib/framework/dashboard-widget/widget-extensions.tsx +1 -1
  266. package/src/lib/framework/defaults.ts +1 -1
  267. package/src/lib/framework/document-introspection/add-custom-fields.ts +2 -50
  268. package/src/lib/framework/document-introspection/get-document-structure.ts +10 -43
  269. package/src/lib/framework/document-introspection/hooks.ts +1 -4
  270. package/src/lib/framework/extension-api/define-dashboard-extension.ts +49 -31
  271. package/src/lib/framework/extension-api/extension-api-types.ts +98 -25
  272. package/src/lib/framework/extension-api/use-dashboard-extensions.ts +1 -2
  273. package/src/lib/framework/form-engine/form-schema-tools.ts +1 -1
  274. package/src/lib/framework/form-engine/use-generated-form.tsx +18 -57
  275. package/src/lib/framework/layout-engine/location-wrapper.tsx +72 -105
  276. package/src/lib/framework/layout-engine/page-layout.tsx +52 -70
  277. package/src/lib/framework/page/detail-page-route-loader.tsx +7 -26
  278. package/src/lib/framework/page/detail-page.tsx +37 -94
  279. package/src/lib/framework/page/list-page.tsx +11 -9
  280. package/src/lib/framework/page/use-detail-page.ts +7 -38
  281. package/src/lib/framework/page/use-extended-router.tsx +5 -4
  282. package/src/lib/framework/registry/registry-types.ts +5 -15
  283. package/src/lib/graphql/{fragments.ts → fragments.tsx} +2 -1
  284. package/src/lib/graphql/graphql-env.d.ts +13 -16
  285. package/src/lib/hooks/use-auth.tsx +1 -1
  286. package/src/lib/hooks/use-channel.ts +1 -1
  287. package/src/lib/hooks/use-grouped-permissions.ts +2 -3
  288. package/src/lib/hooks/use-page.tsx +2 -2
  289. package/src/lib/hooks/use-permissions.ts +2 -3
  290. package/src/lib/hooks/use-server-config.ts +1 -1
  291. package/src/lib/hooks/use-theme.ts +1 -1
  292. package/src/lib/hooks/use-user-settings.tsx +1 -1
  293. package/src/lib/index.ts +6 -65
  294. package/src/lib/lib/trans.tsx +3 -3
  295. package/src/lib/lib/utils.ts +0 -49
  296. package/src/lib/providers/auth.tsx +14 -37
  297. package/src/lib/providers/channel-provider.tsx +4 -4
  298. package/src/lib/providers/server-config.tsx +11 -13
  299. package/src/lib/providers/theme-provider.tsx +3 -2
  300. package/vite/utils/config-loader.ts +10 -120
  301. package/vite/vite-plugin-config-loader.ts +1 -6
  302. package/vite/vite-plugin-config.ts +7 -6
  303. package/vite/vite-plugin-dashboard-metadata.ts +9 -1
  304. package/vite/vite-plugin-vendure-dashboard.ts +4 -48
  305. package/dist/plugin/tests/barrel-exports/my-plugin/index.d.ts +0 -1
  306. package/dist/plugin/tests/barrel-exports/my-plugin/index.js +0 -17
  307. package/dist/plugin/tests/barrel-exports/my-plugin/src/my.plugin.d.ts +0 -2
  308. package/dist/plugin/tests/barrel-exports/my-plugin/src/my.plugin.js +0 -20
  309. package/dist/plugin/tests/barrel-exports/vendure-config.d.ts +0 -2
  310. package/dist/plugin/tests/barrel-exports/vendure-config.js +0 -19
  311. package/dist/plugin/tests/barrel-exports.spec.d.ts +0 -1
  312. package/dist/plugin/tests/barrel-exports.spec.js +0 -14
  313. package/dist/plugin/vite-plugin-tailwind-source.d.ts +0 -7
  314. package/dist/plugin/vite-plugin-tailwind-source.js +0 -49
  315. package/src/app/common/delete-bulk-action.tsx +0 -148
  316. package/src/app/common/duplicate-bulk-action.tsx +0 -134
  317. package/src/app/routes/_authenticated/_administrators/components/administrator-bulk-actions.tsx +0 -15
  318. package/src/app/routes/_authenticated/_assets/components/asset-bulk-actions.tsx +0 -45
  319. package/src/app/routes/_authenticated/_channels/components/channel-bulk-actions.tsx +0 -15
  320. package/src/app/routes/_authenticated/_collections/components/collection-bulk-actions.tsx +0 -123
  321. package/src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx +0 -430
  322. package/src/app/routes/_authenticated/_collections/components/move-single-collection.tsx +0 -33
  323. package/src/app/routes/_authenticated/_countries/components/country-bulk-actions.tsx +0 -15
  324. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-bulk-actions.tsx +0 -15
  325. package/src/app/routes/_authenticated/_customers/components/customer-bulk-actions.tsx +0 -15
  326. package/src/app/routes/_authenticated/_facets/components/facet-bulk-actions.tsx +0 -104
  327. package/src/app/routes/_authenticated/_orders/components/add-manual-payment-dialog.tsx +0 -191
  328. package/src/app/routes/_authenticated/_orders/components/fulfill-order-dialog.tsx +0 -320
  329. package/src/app/routes/_authenticated/_orders/components/fulfillment-details.tsx +0 -173
  330. package/src/app/routes/_authenticated/_orders/utils/order-types.ts +0 -7
  331. package/src/app/routes/_authenticated/_orders/utils/order-utils.ts +0 -77
  332. package/src/app/routes/_authenticated/_payment-methods/components/payment-method-bulk-actions.tsx +0 -58
  333. package/src/app/routes/_authenticated/_product-variants/components/product-variant-bulk-actions.tsx +0 -110
  334. package/src/app/routes/_authenticated/_products/components/assign-facet-values-dialog.tsx +0 -281
  335. package/src/app/routes/_authenticated/_products/components/product-bulk-actions.tsx +0 -123
  336. package/src/app/routes/_authenticated/_promotions/components/promotion-bulk-actions.tsx +0 -82
  337. package/src/app/routes/_authenticated/_roles/components/role-bulk-actions.tsx +0 -15
  338. package/src/app/routes/_authenticated/_sellers/components/seller-bulk-actions.tsx +0 -15
  339. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-method-bulk-actions.tsx +0 -61
  340. package/src/app/routes/_authenticated/_stock-locations/components/stock-location-bulk-actions.tsx +0 -58
  341. package/src/app/routes/_authenticated/_tax-categories/components/tax-category-bulk-actions.tsx +0 -15
  342. package/src/app/routes/_authenticated/_tax-rates/components/tax-rate-bulk-actions.tsx +0 -15
  343. package/src/app/routes/_authenticated/_zones/components/zone-bulk-actions.tsx +0 -15
  344. package/src/lib/components/data-input/index.ts +0 -11
  345. package/src/lib/components/data-input/relation-input.tsx +0 -153
  346. package/src/lib/components/data-input/relation-selector.tsx +0 -468
  347. package/src/lib/components/data-table/data-table-bulk-action-item.tsx +0 -101
  348. package/src/lib/components/data-table/data-table-bulk-actions.tsx +0 -95
  349. package/src/lib/components/labeled-data.tsx +0 -21
  350. package/src/lib/components/shared/asset/asset-bulk-actions.tsx +0 -94
  351. package/src/lib/components/shared/assign-to-channel-bulk-action.tsx +0 -71
  352. package/src/lib/components/shared/assign-to-channel-dialog.tsx +0 -155
  353. package/src/lib/components/shared/remove-from-channel-bulk-action.tsx +0 -90
  354. package/src/lib/framework/data-table/data-table-extensions.ts +0 -35
  355. package/src/lib/framework/document-extension/extend-detail-form-query.ts +0 -50
  356. package/src/lib/framework/document-extension/extend-document.spec.ts +0 -884
  357. package/src/lib/framework/document-extension/extend-document.ts +0 -159
  358. package/src/lib/framework/extension-api/display-component-extensions.tsx +0 -69
  359. package/src/lib/framework/extension-api/input-component-extensions.tsx +0 -69
  360. package/src/lib/framework/extension-api/logic/alerts.ts +0 -10
  361. package/src/lib/framework/extension-api/logic/data-table.ts +0 -60
  362. package/src/lib/framework/extension-api/logic/detail-forms.ts +0 -48
  363. package/src/lib/framework/extension-api/logic/form-components.ts +0 -13
  364. package/src/lib/framework/extension-api/logic/index.ts +0 -8
  365. package/src/lib/framework/extension-api/logic/layout.ts +0 -22
  366. package/src/lib/framework/extension-api/logic/navigation.ts +0 -37
  367. package/src/lib/framework/extension-api/logic/widgets.ts +0 -10
  368. package/src/lib/framework/extension-api/types/alerts.ts +0 -54
  369. package/src/lib/framework/extension-api/types/data-table.ts +0 -87
  370. package/src/lib/framework/extension-api/types/detail-forms.ts +0 -81
  371. package/src/lib/framework/extension-api/types/form-components.ts +0 -32
  372. package/src/lib/framework/extension-api/types/index.ts +0 -8
  373. package/src/lib/framework/extension-api/types/layout.ts +0 -78
  374. package/src/lib/framework/extension-api/types/navigation.ts +0 -19
  375. package/src/lib/framework/extension-api/types/widgets.ts +0 -97
  376. package/src/lib/framework/form-engine/custom-form-component-extensions.ts +0 -38
  377. package/src/lib/framework/form-engine/custom-form-component.tsx +0 -33
  378. package/src/lib/framework/form-engine/overridden-form-component.tsx +0 -51
  379. package/src/lib/framework/form-engine/utils.ts +0 -58
  380. package/src/lib/framework/layout-engine/page-block-provider.tsx +0 -6
  381. package/src/lib/graphql/common-operations.ts +0 -18
  382. package/src/lib/hooks/use-extended-detail-query.ts +0 -37
  383. package/src/lib/hooks/use-extended-list-query.ts +0 -73
  384. package/src/lib/hooks/use-page-block.tsx +0 -18
  385. package/vite/tests/barrel-exports/my-plugin/index.ts +0 -1
  386. package/vite/tests/barrel-exports/my-plugin/src/my.plugin.ts +0 -8
  387. package/vite/tests/barrel-exports/package.json +0 -6
  388. package/vite/tests/barrel-exports/vendure-config.ts +0 -19
  389. package/vite/tests/barrel-exports.spec.ts +0 -21
  390. package/vite/vite-plugin-tailwind-source.ts +0 -65
  391. /package/src/lib/components/data-table/{types.ts → data-table-types.ts} +0 -0
@@ -1,28 +1,26 @@
1
+ import { getOperationVariablesFields } from '@/framework/document-introspection/get-document-structure.js';
2
+ import {
3
+ createFormSchemaFromFields,
4
+ getDefaultValuesFromFields,
5
+ } from '@/framework/form-engine/form-schema-tools.js';
6
+ import { useChannel } from '@/hooks/use-channel.js';
7
+ import { useServerConfig } from '@/hooks/use-server-config.js';
1
8
  import type { TypedDocumentNode } from '@graphql-typed-document-node/core';
2
9
  import { zodResolver } from '@hookform/resolvers/zod';
3
10
  import { VariablesOf } from 'gql.tada';
4
11
  import { FormEvent } from 'react';
5
12
  import { useForm } from 'react-hook-form';
6
- import { useChannel } from '../../hooks/use-channel.js';
7
- import { useServerConfig } from '../../hooks/use-server-config.js';
8
- import { getOperationVariablesFields } from '../document-introspection/get-document-structure.js';
9
- import { createFormSchemaFromFields, getDefaultValuesFromFields } from './form-schema-tools.js';
10
- import { transformRelationFields } from './utils.js';
11
13
 
12
14
  export interface GeneratedFormOptions<
13
15
  T extends TypedDocumentNode<any, any>,
14
- VarName extends keyof VariablesOf<T> | undefined = 'input',
16
+ VarName extends (keyof VariablesOf<T>) | undefined = 'input',
15
17
  E extends Record<string, any> = Record<string, any>,
16
18
  > {
17
19
  document?: T;
18
20
  varName?: VarName;
19
21
  entity: E | null | undefined;
20
- setValues: (
21
- entity: NonNullable<E>,
22
- ) => VarName extends keyof VariablesOf<T> ? VariablesOf<T>[VarName] : VariablesOf<T>;
23
- onSubmit?: (
24
- values: VarName extends keyof VariablesOf<T> ? VariablesOf<T>[VarName] : VariablesOf<T>,
25
- ) => void;
22
+ setValues: (entity: NonNullable<E>) => VarName extends keyof VariablesOf<T> ? VariablesOf<T>[VarName] : VariablesOf<T>;
23
+ onSubmit?: (values: VarName extends keyof VariablesOf<T> ? VariablesOf<T>[VarName] : VariablesOf<T>) => void;
26
24
  }
27
25
 
28
26
  /**
@@ -43,7 +41,7 @@ export function useGeneratedForm<
43
41
  const updateFields = document ? getOperationVariablesFields(document, varName) : [];
44
42
  const schema = createFormSchemaFromFields(updateFields);
45
43
  const defaultValues = getDefaultValuesFromFields(updateFields, activeChannel?.defaultLanguageCode);
46
- const processedEntity = ensureTranslationsForAllLanguages(entity, availableLanguages, defaultValues);
44
+ const processedEntity = ensureTranslationsForAllLanguages(entity, availableLanguages);
47
45
 
48
46
  const form = useForm({
49
47
  resolver: async (values, context, options) => {
@@ -55,9 +53,7 @@ export function useGeneratedForm<
55
53
  },
56
54
  mode: 'onChange',
57
55
  defaultValues,
58
- values: processedEntity
59
- ? transformRelationFields(updateFields, setValues(processedEntity))
60
- : defaultValues,
56
+ values: processedEntity ? setValues(processedEntity) : defaultValues,
61
57
  });
62
58
  let submitHandler = (event: FormEvent) => {
63
59
  event.preventDefault();
@@ -73,13 +69,11 @@ export function useGeneratedForm<
73
69
 
74
70
  /**
75
71
  * Ensures that an entity with translations has entries for all available languages.
76
- * If a language is missing, it creates an empty translation based on the structure of existing translations
77
- * and the expected form structure from defaultValues.
72
+ * If a language is missing, it creates an empty translation based on the structure of existing translations.
78
73
  */
79
74
  function ensureTranslationsForAllLanguages<E extends Record<string, any>>(
80
75
  entity: E | null | undefined,
81
76
  availableLanguages: string[] = [],
82
- expectedStructure?: Record<string, any>,
83
77
  ): E | null | undefined {
84
78
  if (
85
79
  !entity ||
@@ -97,56 +91,23 @@ function ensureTranslationsForAllLanguages<E extends Record<string, any>>(
97
91
  // Get existing language codes
98
92
  const existingLanguageCodes = new Set(translations.map((t: any) => t.languageCode));
99
93
 
100
- // Get the expected translation structure from defaultValues or existing translations
101
- const existingTemplate = translations[0] || {};
102
- const expectedTranslationStructure = expectedStructure?.translations?.[0] || {};
103
-
104
- // Merge the structures to ensure we have all expected fields
105
- const templateStructure = {
106
- ...expectedTranslationStructure,
107
- ...existingTemplate,
108
- };
109
-
110
94
  // Add missing language translations
111
95
  for (const langCode of availableLanguages) {
112
96
  if (!existingLanguageCodes.has(langCode)) {
97
+ // Find a translation to use as template for field structure
98
+ const template = translations[0] || {};
113
99
  const emptyTranslation: Record<string, any> = {
114
100
  languageCode: langCode,
115
101
  };
116
102
 
117
- // Add empty fields based on merged template structure (excluding languageCode)
118
- Object.keys(templateStructure).forEach(key => {
103
+ // Add empty fields based on template (excluding languageCode)
104
+ Object.keys(template).forEach(key => {
119
105
  if (key !== 'languageCode') {
120
- if (typeof templateStructure[key] === 'object' && templateStructure[key] !== null) {
121
- // For nested objects like customFields, create an empty object
122
- emptyTranslation[key] = Array.isArray(templateStructure[key]) ? [] : {};
123
- } else {
124
- // For primitive values, use empty string as default
125
- emptyTranslation[key] = '';
126
- }
106
+ emptyTranslation[key] = '';
127
107
  }
128
108
  });
129
109
 
130
110
  translations.push(emptyTranslation);
131
- } else {
132
- // For existing translations, ensure they have all expected fields
133
- const existingTranslation = translations.find((t: any) => t.languageCode === langCode);
134
- if (existingTranslation) {
135
- Object.keys(expectedTranslationStructure).forEach(key => {
136
- if (key !== 'languageCode' && !(key in existingTranslation)) {
137
- if (
138
- typeof expectedTranslationStructure[key] === 'object' &&
139
- expectedTranslationStructure[key] !== null
140
- ) {
141
- existingTranslation[key] = Array.isArray(expectedTranslationStructure[key])
142
- ? []
143
- : {};
144
- } else {
145
- existingTranslation[key] = '';
146
- }
147
- }
148
- });
149
- }
150
111
  }
151
112
  }
152
113
 
@@ -1,128 +1,95 @@
1
- import { CopyableText } from '@/vdb/components/shared/copyable-text.js';
2
- import { Button } from '@/vdb/components/ui/button.js';
3
- import { Popover, PopoverContent, PopoverTrigger } from '@/vdb/components/ui/popover.js';
4
- import { usePageBlock } from '@/vdb/hooks/use-page-block.js';
5
- import { usePage } from '@/vdb/hooks/use-page.js';
6
- import { useUserSettings } from '@/vdb/hooks/use-user-settings.js';
7
- import { cn } from '@/vdb/lib/utils.js';
8
- import { CodeXmlIcon } from 'lucide-react';
9
- import React, { useEffect, useState } from 'react';
1
+ import { CopyableText } from '@/components/shared/copyable-text.js';
2
+ import { Button } from '@/components/ui/button.js';
3
+ import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover.js';
4
+ import { usePage } from '@/hooks/use-page.js';
5
+ import { useUserSettings } from '@/hooks/use-user-settings.js';
6
+ import { cn } from '@/lib/utils.js';
7
+ import { Trans } from '@/lib/trans.js';
8
+ import { CodeXmlIcon, InfoIcon } from 'lucide-react';
9
+ import { createContext, useContext, useState } from 'react';
10
10
 
11
- // Singleton state for hover tracking
12
- let globalHoveredId: string | null = null;
13
- const hoverListeners: Set<(id: string | null) => void> = new Set();
11
+ const LocationWrapperContext = createContext<{
12
+ parentId: string | null;
13
+ hoveredId: string | null;
14
+ setHoveredId: ((id: string | null) => void) | null;
15
+ }>({
16
+ parentId: null,
17
+ hoveredId: null,
18
+ setHoveredId: null,
19
+ });
14
20
 
15
- const setGlobalHoveredId = (id: string | null) => {
16
- globalHoveredId = id;
17
- hoverListeners.forEach(listener => listener(id));
18
- };
19
-
20
- export interface LocationWrapperProps {
21
- children: React.ReactNode;
22
- identifier?: string;
23
- }
24
-
25
- export function LocationWrapper({ children, identifier }: Readonly<LocationWrapperProps>) {
21
+ export function LocationWrapper({ children, blockId }: { children: React.ReactNode; blockId?: string }) {
26
22
  const page = usePage();
27
- const pageBlock = usePageBlock({ optional: true });
28
23
  const { settings } = useUserSettings();
29
24
  const [isPopoverOpen, setIsPopoverOpen] = useState(false);
30
- const blockId = pageBlock?.blockId ?? null;
31
25
  const isPageWrapper = !blockId;
32
26
 
33
- const [hoveredId, setHoveredId] = useState<string | null>(globalHoveredId);
34
- const id = `${page.pageId}-${blockId ?? 'page'}-${identifier ?? ''}`;
35
- const isHovered = hoveredId === id;
36
-
37
- // Subscribe to global hover changes
38
- useEffect(() => {
39
- const listener = (newHoveredId: string | null) => {
40
- setHoveredId(newHoveredId);
41
- };
42
- hoverListeners.add(listener);
43
- return () => {
44
- hoverListeners.delete(listener);
45
- };
46
- }, []);
27
+ const [hoveredIdTopLevel, setHoveredIdTopLevel] = useState<string | null>(null);
28
+ const { hoveredId, setHoveredId, parentId } = useContext(LocationWrapperContext);
29
+ const id = `${page.pageId}-${blockId ?? 'page'}`;
30
+ const isHovered = hoveredId === id || hoveredIdTopLevel === id;
47
31
 
48
32
  const setHoverId = (id: string | null) => {
49
- setGlobalHoveredId(id);
50
- };
51
-
52
- const handleMouseEnter = () => {
53
- // Set this element as hovered
54
- setHoverId(id);
55
- };
56
-
57
- const handleMouseLeave = () => {
58
- // If we're at the top level (page wrapper), go to null
59
- // If we're at block level, go to page level
60
- // If we're at identifier level, go to block level
61
- if (isPageWrapper) {
62
- setHoverId(null);
63
- } else if (blockId && !identifier) {
64
- // Block level - go to page level
65
- setHoverId(`${page.pageId}-page-`);
66
- } else if (identifier) {
67
- // Identifier level - go to block level
68
- setHoverId(`${page.pageId}-${blockId}-`);
33
+ if (setHoveredId) {
34
+ setHoveredId(id);
35
+ } else {
36
+ setHoveredIdTopLevel(id);
69
37
  }
70
38
  };
71
39
 
72
40
  if (settings.devMode) {
73
41
  const pageId = page.pageId;
74
42
  return (
75
- <div
76
- className={cn(
77
- `ring-2 transition-all delay-50 relative`,
78
- isHovered || isPopoverOpen ? 'ring-dev-mode' : 'ring-transparent',
79
- isPageWrapper ? 'ring-inset' : '',
80
- identifier ? 'rounded-md' : 'rounded-xl',
81
- )}
82
- onMouseEnter={handleMouseEnter}
83
- onMouseLeave={handleMouseLeave}
43
+ <LocationWrapperContext.Provider
44
+ value={{ hoveredId: hoveredIdTopLevel, setHoveredId: setHoveredIdTopLevel, parentId: id }}
84
45
  >
85
46
  <div
86
- className={`absolute top-1 right-1 transition-all delay-50 z-10 ${isHovered || isPopoverOpen ? 'visible' : 'invisible'}`}
47
+ className={cn(
48
+ `ring-2 rounded-xl transition-all delay-50 relative`,
49
+ isHovered || isPopoverOpen ? 'ring-dev-mode' : 'ring-transparent',
50
+ isPageWrapper ? 'ring-inset' : '',
51
+ )}
52
+ onMouseEnter={() => setHoverId(id)}
53
+ onMouseLeave={() => setHoverId(parentId)}
87
54
  >
88
- <Popover open={isPopoverOpen} onOpenChange={setIsPopoverOpen}>
89
- <PopoverTrigger asChild>
90
- <Button
91
- variant="secondary"
92
- size="icon"
93
- className="h-8 w-8 rounded-full bg-dev-mode/10 hover:bg-dev-mode/20 border border-dev-mode/20 shadow-sm"
94
- >
95
- <CodeXmlIcon className="text-dev-mode w-4 h-4" />
96
- </Button>
97
- </PopoverTrigger>
98
- <PopoverContent className="w-48 p-3">
99
- <div className="space-y-2">
100
- <div className="space-y-1">
101
- {pageId && (
102
- <div className="text-xs">
103
- <div className="text-muted-foreground mb-0.5">pageId</div>
104
- <CopyableText text={pageId} />
105
- </div>
106
- )}
107
- {blockId && (
108
- <div className="text-xs">
109
- <div className="text-muted-foreground mb-0.5">blockId</div>
110
- <CopyableText text={blockId} />
111
- </div>
112
- )}
113
- {identifier && (
114
- <div className="text-xs">
115
- <div className="text-muted-foreground mb-0.5">identifier</div>
116
- <CopyableText text={identifier} />
117
- </div>
118
- )}
55
+ <div
56
+ className={`absolute top-0.5 right-0.5 transition-all delay-50 z-10 ${isHovered || isPopoverOpen ? 'visible' : 'invisible'}`}
57
+ >
58
+ <Popover open={isPopoverOpen} onOpenChange={setIsPopoverOpen}>
59
+ <PopoverTrigger asChild>
60
+ <Button variant="ghost" size="icon" className="rounded-lg">
61
+ <CodeXmlIcon className="text-dev-mode w-5 h-5" />
62
+ </Button>
63
+ </PopoverTrigger>
64
+ <PopoverContent className="w-60">
65
+ <div className="space-y-2">
66
+ <div className="flex items-center gap-2">
67
+ <InfoIcon className="h-4 w-4 text-dev-mode" />
68
+ <span className="font-medium">
69
+ <Trans>Location Details</Trans>
70
+ </span>
71
+ </div>
72
+ <div className="space-y-1.5">
73
+ {pageId && (
74
+ <div>
75
+ <div className="text-xs text-muted-foreground">pageId</div>
76
+ <CopyableText text={pageId} />
77
+ </div>
78
+ )}
79
+ {blockId && (
80
+ <div>
81
+ <div className="text-xs text-muted-foreground">blockId</div>
82
+ <CopyableText text={blockId} />
83
+ </div>
84
+ )}
85
+ </div>
119
86
  </div>
120
- </div>
121
- </PopoverContent>
122
- </Popover>
87
+ </PopoverContent>
88
+ </Popover>
89
+ </div>
90
+ {children}
123
91
  </div>
124
- {children}
125
- </div>
92
+ </LocationWrapperContext.Provider>
126
93
  );
127
94
  }
128
95
  return children;
@@ -1,21 +1,20 @@
1
- import { CustomFieldsForm } from '@/vdb/components/shared/custom-fields-form.js';
2
- import { NavigationConfirmation } from '@/vdb/components/shared/navigation-confirmation.js';
3
- import { PermissionGuard } from '@/vdb/components/shared/permission-guard.js';
4
- import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/vdb/components/ui/card.js';
5
- import { Form } from '@/vdb/components/ui/form.js';
6
- import { useCustomFieldConfig } from '@/vdb/hooks/use-custom-field-config.js';
7
- import { usePage } from '@/vdb/hooks/use-page.js';
8
- import { cn } from '@/vdb/lib/utils.js';
1
+ import { CustomFieldsForm } from '@/components/shared/custom-fields-form.js';
2
+ import { PermissionGuard } from '@/components/shared/permission-guard.js';
3
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card.js';
4
+ import { Form } from '@/components/ui/form.js';
5
+ import { useCustomFieldConfig } from '@/hooks/use-custom-field-config.js';
6
+ import { usePage } from '@/hooks/use-page.js';
7
+ import { cn } from '@/lib/utils.js';
8
+ import { NavigationConfirmation } from '@/components/shared/navigation-confirmation.js';
9
9
  import { useMediaQuery } from '@uidotdev/usehooks';
10
10
  import React, { ComponentProps } from 'react';
11
11
  import { Control, UseFormReturn } from 'react-hook-form';
12
12
 
13
- import { DashboardActionBarItem } from '../extension-api/types/layout.js';
13
+ import { DashboardActionBarItem } from '../extension-api/extension-api-types.js';
14
14
 
15
- import { PageBlockContext } from '@/vdb/framework/layout-engine/page-block-provider.js';
16
- import { PageContext, PageContextValue } from '@/vdb/framework/layout-engine/page-provider.js';
17
15
  import { getDashboardActionBarItems, getDashboardPageBlocks } from './layout-extensions.js';
18
16
  import { LocationWrapper } from './location-wrapper.js';
17
+ import { PageContext, PageContextValue } from '@/framework/layout-engine/page-provider.js';
19
18
 
20
19
  export interface PageProps extends ComponentProps<'div'> {
21
20
  pageId?: string;
@@ -42,11 +41,13 @@ export interface PageProps extends ComponentProps<'div'> {
42
41
  * @docsWeight 0
43
42
  * @since 3.3.0
44
43
  */
45
- export function Page({ children, pageId, entity, form, submitHandler, ...props }: Readonly<PageProps>) {
44
+ export function Page({ children, pageId, entity, form, submitHandler, ...props }: PageProps) {
46
45
  const childArray = React.Children.toArray(children);
47
46
 
48
47
  const pageTitle = childArray.find(child => React.isValidElement(child) && child.type === PageTitle);
49
- const pageActionBar = childArray.find(child => isOfType(child, PageActionBar));
48
+ const pageActionBar = childArray.find(
49
+ child => isOfType(child, PageActionBar),
50
+ );
50
51
 
51
52
  const pageContent = childArray.filter(
52
53
  child => !isOfType(child, PageTitle) && !isOfType(child, PageActionBar),
@@ -72,13 +73,7 @@ export function Page({ children, pageId, entity, form, submitHandler, ...props }
72
73
  );
73
74
  }
74
75
 
75
- function PageContent({
76
- pageHeader,
77
- pageContent,
78
- form,
79
- submitHandler,
80
- ...props
81
- }: {
76
+ function PageContent({ pageHeader, pageContent, form, submitHandler, ...props }: {
82
77
  pageHeader: React.ReactNode;
83
78
  pageContent: React.ReactNode;
84
79
  form?: UseFormReturn<any>;
@@ -99,14 +94,9 @@ function PageContent({
99
94
  );
100
95
  }
101
96
 
102
- export function PageContentWithOptionalForm({
103
- form,
104
- pageHeader,
105
- pageContent,
106
- submitHandler,
107
- }: {
97
+ export function PageContentWithOptionalForm({ form, pageHeader, pageContent, submitHandler }: {
108
98
  form?: UseFormReturn<any>;
109
- pageHeader: React.ReactNode;
99
+ pageHeader: React.ReactNode
110
100
  pageContent: React.ReactNode;
111
101
  submitHandler?: any;
112
102
  }) {
@@ -164,7 +154,7 @@ function isPageBlock(child: unknown): child is React.ReactElement<PageBlockProps
164
154
  * @docsWeight 0
165
155
  * @since 3.3.0
166
156
  */
167
- export function PageLayout({ children, className }: Readonly<PageLayoutProps>) {
157
+ export function PageLayout({ children, className }: PageLayoutProps) {
168
158
  const page = usePage();
169
159
  const isDesktop = useMediaQuery('only screen and (min-width : 769px)');
170
160
  // Separate blocks into categories
@@ -194,7 +184,6 @@ export function PageLayout({ children, className }: Readonly<PageLayoutProps>) {
194
184
  if (extensionBlock) {
195
185
  const ExtensionBlock = (
196
186
  <PageBlock
197
- key={childBlock.key}
198
187
  column={extensionBlock.location.column}
199
188
  blockId={extensionBlock.id}
200
189
  title={extensionBlock.title}
@@ -238,7 +227,7 @@ export function PageLayout({ children, className }: Readonly<PageLayoutProps>) {
238
227
  );
239
228
  }
240
229
 
241
- export function DetailFormGrid({ children }: Readonly<{ children: React.ReactNode }>) {
230
+ export function DetailFormGrid({ children }: { children: React.ReactNode }) {
242
231
  return <div className="md:grid md:grid-cols-2 gap-4 items-start mb-4">{children}</div>;
243
232
  }
244
233
 
@@ -252,7 +241,7 @@ export function DetailFormGrid({ children }: Readonly<{ children: React.ReactNod
252
241
  * @docsPage PageTitle
253
242
  * @since 3.3.0
254
243
  */
255
- export function PageTitle({ children }: Readonly<{ children: React.ReactNode }>) {
244
+ export function PageTitle({ children }: { children: React.ReactNode }) {
256
245
  return <h1 className="text-2xl font-semibold">{children}</h1>;
257
246
  }
258
247
 
@@ -269,11 +258,15 @@ export function PageTitle({ children }: Readonly<{ children: React.ReactNode }>)
269
258
  * @docsWeight 0
270
259
  * @since 3.3.0
271
260
  */
272
- export function PageActionBar({ children }: Readonly<{ children: React.ReactNode }>) {
261
+ export function PageActionBar({ children }: { children: React.ReactNode }) {
273
262
  let childArray = React.Children.toArray(children);
274
263
 
275
- const leftContent = childArray.filter(child => isOfType(child, PageActionBarLeft));
276
- const rightContent = childArray.filter(child => isOfType(child, PageActionBarRight));
264
+ const leftContent = childArray.filter(
265
+ child => isOfType(child, PageActionBarLeft),
266
+ );
267
+ const rightContent = childArray.filter(
268
+ child => isOfType(child, PageActionBarRight),
269
+ );
277
270
 
278
271
  return (
279
272
  <div className={cn('flex gap-2', leftContent.length > 0 ? 'justify-between' : 'justify-end')}>
@@ -291,7 +284,7 @@ export function PageActionBar({ children }: Readonly<{ children: React.ReactNode
291
284
  * @docsPage PageActionBar
292
285
  * @since 3.3.0
293
286
  */
294
- export function PageActionBarLeft({ children }: Readonly<{ children: React.ReactNode }>) {
287
+ export function PageActionBarLeft({ children }: { children: React.ReactNode }) {
295
288
  return <div className="flex justify-start gap-2">{children}</div>;
296
289
  }
297
290
 
@@ -303,7 +296,7 @@ export function PageActionBarLeft({ children }: Readonly<{ children: React.React
303
296
  * @docsPage PageActionBar
304
297
  * @since 3.3.0
305
298
  */
306
- export function PageActionBarRight({ children }: Readonly<{ children: React.ReactNode }>) {
299
+ export function PageActionBarRight({ children }: { children: React.ReactNode }) {
307
300
  const page = usePage();
308
301
  const actionBarItems = page.pageId ? getDashboardActionBarItems(page.pageId) : [];
309
302
  return (
@@ -355,28 +348,19 @@ export type PageBlockProps = {
355
348
  * @docsWeight 0
356
349
  * @since 3.3.0
357
350
  */
358
- export function PageBlock({
359
- children,
360
- title,
361
- description,
362
- className,
363
- blockId,
364
- column,
365
- }: Readonly<PageBlockProps>) {
351
+ export function PageBlock({ children, title, description, className, blockId }: PageBlockProps) {
366
352
  return (
367
- <PageBlockContext.Provider value={{ blockId, title, description, column }}>
368
- <LocationWrapper>
369
- <Card className={cn('w-full', className)}>
370
- {title || description ? (
371
- <CardHeader>
372
- {title && <CardTitle>{title}</CardTitle>}
373
- {description && <CardDescription>{description}</CardDescription>}
374
- </CardHeader>
375
- ) : null}
376
- <CardContent className={cn(!title ? 'pt-6' : '')}>{children}</CardContent>
377
- </Card>
378
- </LocationWrapper>
379
- </PageBlockContext.Provider>
353
+ <LocationWrapper blockId={blockId}>
354
+ <Card className={cn('w-full', className)}>
355
+ {title || description ? (
356
+ <CardHeader>
357
+ {title && <CardTitle>{title}</CardTitle>}
358
+ {description && <CardDescription>{description}</CardDescription>}
359
+ </CardHeader>
360
+ ) : null}
361
+ <CardContent className={cn(!title ? 'pt-6' : '')}>{children}</CardContent>
362
+ </Card>
363
+ </LocationWrapper>
380
364
  );
381
365
  }
382
366
 
@@ -392,16 +376,14 @@ export function PageBlock({
392
376
  * @since 3.3.0
393
377
  */
394
378
  export function FullWidthPageBlock({
395
- children,
396
- className,
397
- blockId,
398
- }: Pick<PageBlockProps, 'children' | 'className' | 'blockId'>) {
379
+ children,
380
+ className,
381
+ blockId,
382
+ }: Pick<PageBlockProps, 'children' | 'className' | 'blockId'>) {
399
383
  return (
400
- <PageBlockContext.Provider value={{ blockId, column: 'main' }}>
401
- <LocationWrapper>
402
- <div className={cn('w-full', className)}>{children}</div>
403
- </LocationWrapper>
404
- </PageBlockContext.Provider>
384
+ <LocationWrapper blockId={blockId}>
385
+ <div className={cn('w-full', className)}>{children}</div>
386
+ </LocationWrapper>
405
387
  );
406
388
  }
407
389
 
@@ -416,10 +398,10 @@ export function FullWidthPageBlock({
416
398
  * @since 3.3.0
417
399
  */
418
400
  export function CustomFieldsPageBlock({
419
- column,
420
- entityType,
421
- control,
422
- }: {
401
+ column,
402
+ entityType,
403
+ control,
404
+ }: {
423
405
  column: 'main' | 'side';
424
406
  entityType: string;
425
407
  control: Control<any, any>;
@@ -1,55 +1,36 @@
1
- import { NEW_ENTITY_PATH } from '@/vdb/constants.js';
1
+ import { NEW_ENTITY_PATH } from '@/constants.js';
2
2
 
3
- import { PageBreadcrumb } from '@/vdb/components/layout/generated-breadcrumbs.js';
4
- import { extendDetailFormQuery } from '@/vdb/framework/document-extension/extend-detail-form-query.js';
3
+ import { PageBreadcrumb } from '@/components/layout/generated-breadcrumbs.js';
5
4
  import { TypedDocumentNode } from '@graphql-typed-document-node/core';
6
- import { FileBaseRouteOptions, ParsedLocation } from '@tanstack/react-router';
7
- import { addCustomFields } from '../document-introspection/add-custom-fields.js';
5
+ import { FileBaseRouteOptions } from '@tanstack/react-router';
8
6
  import { getQueryName, getQueryTypeFieldInfo } from '../document-introspection/get-document-structure.js';
9
7
  import { DetailEntity } from './page-types.js';
10
8
  import { getDetailQueryOptions } from './use-detail-page.js';
11
-
9
+ import { addCustomFields } from '../document-introspection/add-custom-fields.js';
12
10
  export interface DetailPageRouteLoaderConfig<T extends TypedDocumentNode<any, any>> {
13
- /**
14
- * @description
15
- * The pageId is used to ensure any detail form extensions (such as extensions to
16
- * the detail query document) get correctly applied at the route loader level.
17
- */
18
- pageId?: string;
19
11
  queryDocument: T;
20
- breadcrumb: (
21
- isNew: boolean,
22
- entity: DetailEntity<T>,
23
- location: ParsedLocation,
24
- ) => Array<PageBreadcrumb | undefined>;
12
+ breadcrumb: (isNew: boolean, entity: DetailEntity<T>) => Array<PageBreadcrumb | undefined>;
25
13
  }
26
14
 
27
15
  export function detailPageRouteLoader<T extends TypedDocumentNode<any, any>>({
28
- pageId,
29
16
  queryDocument,
30
17
  breadcrumb,
31
18
  }: DetailPageRouteLoaderConfig<T>) {
32
19
  const loader: FileBaseRouteOptions<any, any>['loader'] = async ({
33
20
  context,
34
21
  params,
35
- location,
36
22
  }: {
37
23
  context: any;
38
24
  params: any;
39
- location: ParsedLocation;
40
25
  }) => {
41
26
  if (!params.id) {
42
27
  throw new Error('ID param is required');
43
28
  }
44
29
  const isNew = params.id === NEW_ENTITY_PATH;
45
- const { extendedQuery: extendedQueryDocument } = extendDetailFormQuery(
46
- addCustomFields(queryDocument),
47
- pageId,
48
- );
49
30
  const result = isNew
50
31
  ? null
51
32
  : await context.queryClient.ensureQueryData(
52
- getDetailQueryOptions(extendedQueryDocument, { id: params.id }),
33
+ getDetailQueryOptions(addCustomFields(queryDocument), { id: params.id }),
53
34
  { id: params.id },
54
35
  );
55
36
 
@@ -60,7 +41,7 @@ export function detailPageRouteLoader<T extends TypedDocumentNode<any, any>>({
60
41
  throw new Error(`${entityName} with the ID ${params.id} was not found`);
61
42
  }
62
43
  return {
63
- breadcrumb: breadcrumb(isNew, result?.[entityField], location),
44
+ breadcrumb: breadcrumb(isNew, result?.[entityField]),
64
45
  };
65
46
  };
66
47
  return loader;