@vendure/dashboard 3.3.6-master-202507041203 → 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 (390) 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 +3 -2
  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 +13 -22
  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 +10 -5
  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 +8 -11
  276. package/src/lib/framework/layout-engine/page-layout.tsx +48 -66
  277. package/src/lib/framework/page/detail-page-route-loader.tsx +7 -26
  278. package/src/lib/framework/page/detail-page.tsx +37 -122
  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/utils.ts +0 -58
  379. package/src/lib/framework/layout-engine/page-block-provider.tsx +0 -6
  380. package/src/lib/graphql/common-operations.ts +0 -18
  381. package/src/lib/hooks/use-extended-detail-query.ts +0 -37
  382. package/src/lib/hooks/use-extended-list-query.ts +0 -73
  383. package/src/lib/hooks/use-page-block.tsx +0 -10
  384. package/vite/tests/barrel-exports/my-plugin/index.ts +0 -1
  385. package/vite/tests/barrel-exports/my-plugin/src/my.plugin.ts +0 -8
  386. package/vite/tests/barrel-exports/package.json +0 -6
  387. package/vite/tests/barrel-exports/vendure-config.ts +0 -19
  388. package/vite/tests/barrel-exports.spec.ts +0 -21
  389. package/vite/vite-plugin-tailwind-source.ts +0 -65
  390. /package/src/lib/components/data-table/{types.ts → data-table-types.ts} +0 -0
@@ -1,13 +1,13 @@
1
- import { PaginatedListDataTable } from '@/vdb/components/shared/paginated-list-data-table.js';
2
- import { Button } from '@/vdb/components/ui/button.js';
3
- import { useLocalFormat } from '@/vdb/hooks/use-local-format.js';
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { latestOrdersQuery } from './latest-orders-widget.graphql.js';
3
+ import { DashboardBaseWidget } from '../base-widget.js';
4
+ import { PaginatedListDataTable, addCustomFields, useLocalFormat } from '@/index.js';
5
+ import { ColumnFiltersState } from '@tanstack/react-table';
6
+ import { useState } from 'react';
7
+ import { SortingState } from '@tanstack/react-table';
4
8
  import { Link } from '@tanstack/react-router';
5
- import { ColumnFiltersState, SortingState } from '@tanstack/react-table';
6
9
  import { formatRelative } from 'date-fns';
7
- import { useState } from 'react';
8
- import { DashboardBaseWidget } from '../base-widget.js';
9
- import { latestOrdersQuery } from './latest-orders-widget.graphql.js';
10
-
10
+ import { Button } from '@/components/ui/button.js';
11
11
  export const WIDGET_ID = 'latest-orders-widget';
12
12
 
13
13
  export function LatestOrdersWidget() {
@@ -1,4 +1,4 @@
1
- import { graphql } from '@/vdb/graphql/graphql.js';
1
+ import { graphql } from '@/graphql/graphql.js';
2
2
 
3
3
  export const latestOrderItemFragment = graphql(`
4
4
  fragment LatestOrderItem on Order {
@@ -1,12 +1,13 @@
1
- import { Tabs, TabsList, TabsTrigger } from '@/vdb/components/ui/tabs.js';
2
- import { api } from '@/vdb/graphql/api.js';
3
- import { useChannel } from '@/vdb/hooks/use-channel.js';
4
- import { useLocalFormat } from '@/vdb/hooks/use-local-format.js';
1
+ import { api } from '@/graphql/api.js';
5
2
  import { useQuery } from '@tanstack/react-query';
6
3
  import { useMemo, useState } from 'react';
7
- import { DashboardBaseWidget } from '../base-widget.js';
8
- import { MetricsChart } from './chart.js';
4
+ import { Area, AreaChart, CartesianGrid, Tooltip, XAxis, YAxis } from 'recharts';
5
+ import { DashboardBaseWidget, useWidgetDimensions } from '../base-widget.js';
9
6
  import { orderChartDataQuery } from './metrics-widget.graphql.js';
7
+ import { MetricsChart } from './chart.js';
8
+ import { useLocalFormat } from '@/hooks/use-local-format.js';
9
+ import { useChannel } from '@/hooks/use-channel.js';
10
+ import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs.js';
10
11
 
11
12
  enum DATA_TYPES {
12
13
  OrderCount = 'OrderCount',
@@ -1,4 +1,4 @@
1
- import { graphql } from '@/vdb/graphql/graphql.js';
1
+ import { graphql } from '@/graphql/graphql.js';
2
2
 
3
3
  export const orderChartDataQuery = graphql(`
4
4
  query GetOrderChartData($refresh: Boolean, $types: [MetricType!]!) {
@@ -1,13 +1,12 @@
1
- import { AnimatedCurrency, AnimatedNumber } from '@/vdb/components/shared/animated-number.js';
2
- import { Tabs, TabsList, TabsTrigger } from '@/vdb/components/ui/tabs.js';
3
- import { api } from '@/vdb/graphql/api.js';
4
- import { useChannel } from '@/vdb/hooks/use-channel.js';
5
- import { useLocalFormat } from '@/vdb/hooks/use-local-format.js';
6
1
  import { useQuery } from '@tanstack/react-query';
7
- import { endOfDay, endOfMonth, startOfDay, startOfMonth, subDays, subMonths } from 'date-fns';
8
- import { useMemo, useState } from 'react';
9
2
  import { DashboardBaseWidget } from '../base-widget.js';
10
3
  import { orderSummaryQuery } from './order-summary-widget.graphql.js';
4
+ import { api } from '@/graphql/api.js';
5
+ import { useMemo, useState } from 'react';
6
+ import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs.js';
7
+ import { useChannel, useLocalFormat } from '@/index.js';
8
+ import { startOfDay, endOfDay, subDays, subMonths, startOfMonth, endOfMonth } from 'date-fns';
9
+ import { AnimatedCurrency, AnimatedNumber } from '@/components/shared/animated-number.js';
11
10
 
12
11
  const WIDGET_ID = 'orders-summary-widget';
13
12
 
@@ -1,4 +1,4 @@
1
- import { graphql } from '@/vdb/graphql/graphql.js';
1
+ import { graphql } from '@/graphql/graphql.js';
2
2
 
3
3
  export const orderSummaryQuery = graphql(`
4
4
  query GetOrderSummary($start: DateTime!, $end: DateTime!) {
@@ -0,0 +1,22 @@
1
+ import { DashboardBaseWidgetProps } from './base-widget.js';
2
+
3
+ export type DashboardWidgetInstance = {
4
+ id: string;
5
+ widgetId: string;
6
+ layout: {
7
+ x: number;
8
+ y: number;
9
+ w: number;
10
+ h: number;
11
+ };
12
+ config?: Record<string, unknown>;
13
+ };
14
+
15
+ export type DashboardWidgetDefinition = {
16
+ id: string;
17
+ name: string;
18
+ component: React.ComponentType<DashboardBaseWidgetProps>;
19
+ defaultSize: { w: number; h: number; x?: number; y?: number };
20
+ minSize?: { w: number; h: number };
21
+ maxSize?: { w: number; h: number };
22
+ };
@@ -1,4 +1,4 @@
1
- import { DashboardWidgetDefinition } from '@/vdb/framework/extension-api/types/index.js';
1
+ import { DashboardWidgetDefinition } from './types.js';
2
2
  import { globalRegistry } from '../registry/global-registry.js';
3
3
 
4
4
  globalRegistry.register('dashboardWidgetRegistry', new Map<string, DashboardWidgetDefinition>());
@@ -1,4 +1,4 @@
1
- import { setNavMenuConfig } from '@/vdb/framework/nav-menu/nav-menu-extensions.js';
1
+ import { setNavMenuConfig } from '@/framework/nav-menu/nav-menu-extensions.js';
2
2
  import {
3
3
  LayoutDashboardIcon,
4
4
  Mail,
@@ -1,9 +1,9 @@
1
- import { Variables } from '@/vdb/graphql/api.js';
1
+ import { Variables } from '@/graphql/api.js';
2
2
  import {
3
3
  getServerConfigDocument,
4
4
  relationCustomFieldFragment,
5
5
  structCustomFieldFragment,
6
- } from '@/vdb/providers/server-config.js';
6
+ } from '@/providers/server-config.js';
7
7
  import type { TypedDocumentNode } from '@graphql-typed-document-node/core';
8
8
  import { CustomFieldConfig } from '@vendure/common/lib/generated-types';
9
9
  import { ResultOf } from 'gql.tada';
@@ -25,35 +25,6 @@ type RelationCustomFieldFragment = ResultOf<typeof relationCustomFieldFragment>;
25
25
 
26
26
  let globalCustomFieldsMap: Map<string, CustomFieldConfig[]> = new Map();
27
27
 
28
- // Memoization cache using WeakMap to avoid memory leaks
29
- const memoizationCache = new WeakMap<DocumentNode, Map<string, TypedDocumentNode<any, any>>>();
30
-
31
- /**
32
- * Creates a cache key for the options object
33
- */
34
- function createOptionsKey(options?: {
35
- customFieldsMap?: Map<string, CustomFieldConfig[]>;
36
- includeCustomFields?: string[];
37
- }): string {
38
- if (!options) return 'default';
39
-
40
- const parts: string[] = [];
41
-
42
- if (options.customFieldsMap) {
43
- // Create a deterministic key for the customFieldsMap
44
- const mapEntries = Array.from(options.customFieldsMap.entries())
45
- .sort(([a], [b]) => a.localeCompare(b))
46
- .map(([key, value]) => `${key}:${value.length}`);
47
- parts.push(`map:${mapEntries.join(',')}`);
48
- }
49
-
50
- if (options.includeCustomFields) {
51
- parts.push(`include:${options.includeCustomFields.sort().join(',')}`);
52
- }
53
-
54
- return parts.join('|') || 'default';
55
- }
56
-
57
28
  /**
58
29
  * @description
59
30
  * This function is used to set the global custom fields map.
@@ -85,8 +56,6 @@ export function getCustomFieldsMap() {
85
56
  /**
86
57
  * Given a GraphQL AST (DocumentNode), this function looks for fragment definitions and adds and configured
87
58
  * custom fields to those fragments.
88
- *
89
- * This function is memoized to return a stable identity for given inputs.
90
59
  */
91
60
  export function addCustomFields<T, V extends Variables = Variables>(
92
61
  documentNode: DocumentNode | TypedDocumentNode<T, V>,
@@ -95,21 +64,6 @@ export function addCustomFields<T, V extends Variables = Variables>(
95
64
  includeCustomFields?: string[];
96
65
  },
97
66
  ): TypedDocumentNode<T, V> {
98
- const optionsKey = createOptionsKey(options);
99
-
100
- // Check if we have a cached result for this document and options
101
- let documentCache = memoizationCache.get(documentNode);
102
- if (!documentCache) {
103
- documentCache = new Map();
104
- memoizationCache.set(documentNode, documentCache);
105
- }
106
-
107
- const cachedResult = documentCache.get(optionsKey);
108
- if (cachedResult) {
109
- return cachedResult as TypedDocumentNode<T, V>;
110
- }
111
-
112
- // If not cached, compute the result
113
67
  const clone = JSON.parse(JSON.stringify(documentNode)) as DocumentNode;
114
68
  const customFields = options?.customFieldsMap || globalCustomFieldsMap;
115
69
 
@@ -255,8 +209,6 @@ export function addCustomFields<T, V extends Variables = Variables>(
255
209
  }
256
210
  }
257
211
 
258
- // Cache the result before returning
259
- documentCache.set(optionsKey, clone);
260
212
  return clone;
261
213
  }
262
214
 
@@ -199,23 +199,6 @@ function unwrapVariableDefinitionType(type: TypeNode): NamedTypeNode {
199
199
  return type;
200
200
  }
201
201
 
202
- /**
203
- * @description
204
- * Helper function to get the first field selection from a query operation definition.
205
- */
206
- function getFirstQueryField(documentNode: DocumentNode): FieldNode {
207
- const operationDefinition = documentNode.definitions.find(
208
- (def): def is OperationDefinitionNode =>
209
- def.kind === 'OperationDefinition' && def.operation === 'query',
210
- );
211
- const firstSelection = operationDefinition?.selectionSet.selections[0];
212
- if (firstSelection?.kind === 'Field') {
213
- return firstSelection;
214
- } else {
215
- throw new Error('Could not determine query field');
216
- }
217
- }
218
-
219
202
  /**
220
203
  * @description
221
204
  * This function is used to get the name of the query from a DocumentNode.
@@ -233,32 +216,16 @@ function getFirstQueryField(documentNode: DocumentNode): FieldNode {
233
216
  * The query name is `product`.
234
217
  */
235
218
  export function getQueryName(documentNode: DocumentNode): string {
236
- const firstField = getFirstQueryField(documentNode);
237
- return firstField.name.value;
238
- }
239
-
240
- /**
241
- * @description
242
- * This function is used to get the entity name from a DocumentNode.
243
- *
244
- * For example, in the following query:
245
- *
246
- * ```graphql
247
- * query ProductDetail($id: ID!) {
248
- * product(id: $id) {
249
- * ...ProductDetail
250
- * }
251
- * }
252
- * ```
253
- *
254
- * The entity name is `Product`.
255
- */
256
- export function getEntityName(documentNode: DocumentNode): string {
257
- const firstField = getFirstQueryField(documentNode);
258
- // Get the return type from the field definition
259
- const fieldName = firstField.name.value;
260
- const queryInfo = getQueryInfo(fieldName);
261
- return queryInfo.type;
219
+ const operationDefinition = documentNode.definitions.find(
220
+ (def): def is OperationDefinitionNode =>
221
+ def.kind === 'OperationDefinition' && def.operation === 'query',
222
+ );
223
+ const firstSelection = operationDefinition?.selectionSet.selections[0];
224
+ if (firstSelection?.kind === 'Field') {
225
+ return firstSelection.name.value;
226
+ } else {
227
+ throw new Error('Could not determine query name');
228
+ }
262
229
  }
263
230
 
264
231
  /**
@@ -1,7 +1,4 @@
1
- import {
2
- FieldInfo,
3
- getListQueryFields,
4
- } from '@/vdb/framework/document-introspection/get-document-structure.js';
1
+ import { FieldInfo, getListQueryFields } from '@/framework/document-introspection/get-document-structure.js';
5
2
  import { DocumentNode } from 'graphql';
6
3
  import { useMemo } from 'react';
7
4
 
@@ -1,15 +1,13 @@
1
+ import { registerDashboardWidget } from '../dashboard-widget/widget-extensions.js';
2
+ import {
3
+ registerDashboardActionBarItem,
4
+ registerDashboardPageBlock,
5
+ } from '../layout-engine/layout-extensions.js';
6
+ import { addNavMenuItem, addNavMenuSection, NavMenuItem } from '../nav-menu/nav-menu-extensions.js';
7
+ import { registerRoute } from '../page/page-api.js';
1
8
  import { globalRegistry } from '../registry/global-registry.js';
2
9
 
3
10
  import { DashboardExtension } from './extension-api-types.js';
4
- import {
5
- registerAlertExtensions,
6
- registerDataTableExtensions,
7
- registerDetailFormExtensions,
8
- registerFormComponentExtensions,
9
- registerLayoutExtensions,
10
- registerNavigationExtensions,
11
- registerWidgetExtensions,
12
- } from './logic/index.js';
13
11
 
14
12
  globalRegistry.register('extensionSourceChangeCallbacks', new Set<() => void>());
15
13
  globalRegistry.register('registerDashboardExtensionCallbacks', new Set<() => void>());
@@ -36,28 +34,48 @@ export function executeDashboardExtensionCallbacks() {
36
34
  */
37
35
  export function defineDashboardExtension(extension: DashboardExtension) {
38
36
  globalRegistry.get('registerDashboardExtensionCallbacks').add(() => {
39
- // Register navigation extensions (nav sections and routes)
40
- registerNavigationExtensions(extension.navSections, extension.routes);
41
-
42
- // Register layout extensions (action bar items and page blocks)
43
- registerLayoutExtensions(extension.actionBarItems, extension.pageBlocks);
44
-
45
- // Register widget extensions
46
- registerWidgetExtensions(extension.widgets);
47
-
48
- // Register form component extensions (custom form components, input components, and display components)
49
- registerFormComponentExtensions(extension.customFormComponents);
50
-
51
- // Register data table extensions
52
- registerDataTableExtensions(extension.dataTables);
53
-
54
- // Register detail form extensions
55
- registerDetailFormExtensions(extension.detailForms);
56
-
57
- // Register alert extensions
58
- registerAlertExtensions(extension.alerts);
59
-
60
- // Execute extension source change callbacks
37
+ if (extension.navSections) {
38
+ for (const section of extension.navSections) {
39
+ addNavMenuSection({
40
+ ...section,
41
+ placement: 'top',
42
+ order: section.order ?? 999,
43
+ items: [],
44
+ });
45
+ }
46
+ }
47
+ if (extension.routes) {
48
+ for (const route of extension.routes) {
49
+ if (route.navMenuItem) {
50
+ // Add the nav menu item
51
+ const item: NavMenuItem = {
52
+ url: route.navMenuItem.url ?? route.path,
53
+ id: route.navMenuItem.id ?? route.path,
54
+ title: route.navMenuItem.title ?? route.path,
55
+ };
56
+ addNavMenuItem(item, route.navMenuItem.sectionId);
57
+ }
58
+ if (route.path) {
59
+ // Configure a list page
60
+ registerRoute(route);
61
+ }
62
+ }
63
+ }
64
+ if (extension.actionBarItems) {
65
+ for (const item of extension.actionBarItems) {
66
+ registerDashboardActionBarItem(item);
67
+ }
68
+ }
69
+ if (extension.pageBlocks) {
70
+ for (const block of extension.pageBlocks) {
71
+ registerDashboardPageBlock(block);
72
+ }
73
+ }
74
+ if (extension.widgets) {
75
+ for (const widget of extension.widgets) {
76
+ registerDashboardWidget(widget);
77
+ }
78
+ }
61
79
  const callbacks = globalRegistry.get('extensionSourceChangeCallbacks');
62
80
  if (callbacks.size) {
63
81
  for (const callback of callbacks) {
@@ -1,15 +1,100 @@
1
- // Import types for the main interface
2
- import {
3
- DashboardActionBarItem,
4
- DashboardAlertDefinition,
5
- DashboardCustomFormComponents,
6
- DashboardDataTableExtensionDefinition,
7
- DashboardDetailFormExtensionDefinition,
8
- DashboardNavSectionDefinition,
9
- DashboardPageBlockDefinition,
10
- DashboardRouteDefinition,
11
- DashboardWidgetDefinition,
12
- } from './types/index.js';
1
+ import { PageContextValue } from '@/framework/layout-engine/page-provider.js';
2
+ import { AnyRoute, RouteOptions } from '@tanstack/react-router';
3
+ import { LucideIcon } from 'lucide-react';
4
+ import type React from 'react';
5
+
6
+ import { DashboardAlertDefinition } from '../alert/types.js';
7
+ import { DashboardWidgetDefinition } from '../dashboard-widget/types.js';
8
+ import { NavMenuItem } from '../nav-menu/nav-menu-extensions.js';
9
+
10
+ export interface DashboardRouteDefinition {
11
+ component: (route: AnyRoute) => React.ReactNode;
12
+ path: string;
13
+ navMenuItem?: Partial<NavMenuItem> & { sectionId: string };
14
+ loader?: RouteOptions['loader'];
15
+ }
16
+
17
+ export interface ActionBarButtonState {
18
+ disabled: boolean;
19
+ visible: boolean;
20
+ }
21
+
22
+ export interface DashboardNavSectionDefinition {
23
+ id: string;
24
+ title: string;
25
+ icon?: LucideIcon;
26
+ order?: number;
27
+ }
28
+
29
+ /**
30
+ * @description
31
+ * **Status: Developer Preview**
32
+ *
33
+ * Allows you to define custom action bar items for any page in the dashboard.
34
+ *
35
+ * @docsCategory extensions
36
+ * @since 3.3.0
37
+ */
38
+ export interface DashboardActionBarItem {
39
+ /**
40
+ * @description
41
+ * The ID of the page where the action bar item should be displayed.
42
+ */
43
+ pageId: string;
44
+ /**
45
+ * @description
46
+ * A React component that will be rendered in the action bar.
47
+ */
48
+ component: React.FunctionComponent<{ context: PageContextValue }>;
49
+ /**
50
+ * @description
51
+ * Any permissions that are required to display this action bar item.
52
+ */
53
+ requiresPermission?: string | string[];
54
+ }
55
+
56
+ export interface DashboardActionBarDropdownMenuItem {
57
+ locationId: string;
58
+ component: React.FunctionComponent<{ context: PageContextValue }>;
59
+ requiresPermission?: string | string[];
60
+ }
61
+
62
+ export type PageBlockPosition = { blockId: string; order: 'before' | 'after' | 'replace' };
63
+
64
+ /**
65
+ * @description
66
+ * **Status: Developer Preview**
67
+ *
68
+ * The location of a page block in the dashboard. The location can be found by turning on
69
+ * "developer mode" in the dashboard user menu (bottom left corner) and then
70
+ * clicking the `< />` icon when hovering over a page block.
71
+ *
72
+ * @docsCategory extensions
73
+ * @since 3.3.0
74
+ */
75
+ export type PageBlockLocation = {
76
+ pageId: string;
77
+ position: PageBlockPosition;
78
+ column: 'main' | 'side';
79
+ };
80
+
81
+ /**
82
+ * @description
83
+ * **Status: Developer Preview**
84
+ *
85
+ * This allows you to insert a custom component into a specific location
86
+ * on any page in the dashboard.
87
+ *
88
+ * @docsCategory extensions
89
+ * @since 3.3.0
90
+ */
91
+ export interface DashboardPageBlockDefinition {
92
+ id: string;
93
+ title?: React.ReactNode;
94
+ location: PageBlockLocation;
95
+ component: React.FunctionComponent<{ context: PageContextValue }>;
96
+ requiresPermission?: string | string[];
97
+ }
13
98
 
14
99
  /**
15
100
  * @description
@@ -43,7 +128,7 @@ export interface DashboardExtension {
43
128
  actionBarItems?: DashboardActionBarItem[];
44
129
  /**
45
130
  * @description
46
- * Allows you to define custom alerts that can be displayed in the dashboard.
131
+ * Not yet implemented
47
132
  */
48
133
  alerts?: DashboardAlertDefinition[];
49
134
  /**
@@ -52,16 +137,4 @@ export interface DashboardExtension {
52
137
  * given components and optionally also add a nav menu item.
53
138
  */
54
139
  widgets?: DashboardWidgetDefinition[];
55
- /**
56
- * @description
57
- * Unified registration for custom form components including custom field components,
58
- * input components, and display components.
59
- */
60
- customFormComponents?: DashboardCustomFormComponents;
61
- /**
62
- * @description
63
- * Allows you to customize aspects of existing data tables in the dashboard.
64
- */
65
- dataTables?: DashboardDataTableExtensionDefinition[];
66
- detailForms?: DashboardDetailFormExtensionDefinition[];
67
140
  }
@@ -1,8 +1,7 @@
1
+ import { onExtensionSourceChange } from '@/framework/extension-api/define-dashboard-extension.js';
1
2
  import { useEffect, useState } from 'react';
2
3
  import { runDashboardExtensions } from 'virtual:dashboard-extensions';
3
4
 
4
- import { onExtensionSourceChange } from './define-dashboard-extension.js';
5
-
6
5
  /**
7
6
  * @description
8
7
  * This hook is used to load dashboard extensions via the `virtual:dashboard-extensions` module,
@@ -2,7 +2,7 @@ import {
2
2
  FieldInfo,
3
3
  isEnumType,
4
4
  isScalarType,
5
- } from '@/vdb/framework/document-introspection/get-document-structure.js';
5
+ } from '@/framework/document-introspection/get-document-structure.js';
6
6
  import { z, ZodRawShape, ZodType, ZodTypeAny } from 'zod';
7
7
 
8
8
  export function createFormSchemaFromFields(fields: FieldInfo[]) {