@wilshop/dashboard 3.5.2

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 (697) hide show
  1. package/README.md +116 -0
  2. package/dist/plugin/api/api-extensions.d.ts +1 -0
  3. package/dist/plugin/api/api-extensions.js +35 -0
  4. package/dist/plugin/api/metrics.resolver.d.ts +8 -0
  5. package/dist/plugin/api/metrics.resolver.js +40 -0
  6. package/dist/plugin/config/metrics-strategies.d.ts +39 -0
  7. package/dist/plugin/config/metrics-strategies.js +74 -0
  8. package/dist/plugin/constants.d.ts +8 -0
  9. package/dist/plugin/constants.js +31 -0
  10. package/dist/plugin/dashboard.plugin.d.ts +115 -0
  11. package/dist/plugin/dashboard.plugin.js +339 -0
  12. package/dist/plugin/default-page.html +193 -0
  13. package/dist/plugin/index.d.ts +2 -0
  14. package/dist/plugin/index.js +18 -0
  15. package/dist/plugin/package.json +3 -0
  16. package/dist/plugin/service/metrics.service.d.ts +15 -0
  17. package/dist/plugin/service/metrics.service.js +129 -0
  18. package/dist/plugin/types.d.ts +20 -0
  19. package/dist/plugin/types.js +9 -0
  20. package/dist/vite/constants.d.ts +5 -0
  21. package/dist/vite/constants.js +278 -0
  22. package/dist/vite/index.d.ts +1 -0
  23. package/dist/vite/index.js +1 -0
  24. package/dist/vite/types.d.ts +79 -0
  25. package/dist/vite/types.js +1 -0
  26. package/dist/vite/utils/ast-utils.d.ts +5 -0
  27. package/dist/vite/utils/ast-utils.js +29 -0
  28. package/dist/vite/utils/ast-utils.spec.d.ts +1 -0
  29. package/dist/vite/utils/ast-utils.spec.js +45 -0
  30. package/dist/vite/utils/compiler.d.ts +23 -0
  31. package/dist/vite/utils/compiler.js +165 -0
  32. package/dist/vite/utils/get-dashboard-paths.d.ts +5 -0
  33. package/dist/vite/utils/get-dashboard-paths.js +20 -0
  34. package/dist/vite/utils/logger.d.ts +3 -0
  35. package/dist/vite/utils/logger.js +39 -0
  36. package/dist/vite/utils/plugin-discovery.d.ts +27 -0
  37. package/dist/vite/utils/plugin-discovery.js +398 -0
  38. package/dist/vite/utils/schema-generator.d.ts +10 -0
  39. package/dist/vite/utils/schema-generator.js +35 -0
  40. package/dist/vite/utils/tsconfig-utils.d.ts +9 -0
  41. package/dist/vite/utils/tsconfig-utils.js +51 -0
  42. package/dist/vite/utils/ui-config.d.ts +3 -0
  43. package/dist/vite/utils/ui-config.js +30 -0
  44. package/dist/vite/vite-plugin-admin-api-schema.d.ts +24 -0
  45. package/dist/vite/vite-plugin-admin-api-schema.js +82 -0
  46. package/dist/vite/vite-plugin-config-loader.d.ts +16 -0
  47. package/dist/vite/vite-plugin-config-loader.js +70 -0
  48. package/dist/vite/vite-plugin-config.d.ts +4 -0
  49. package/dist/vite/vite-plugin-config.js +60 -0
  50. package/dist/vite/vite-plugin-dashboard-metadata.d.ts +7 -0
  51. package/dist/vite/vite-plugin-dashboard-metadata.js +61 -0
  52. package/dist/vite/vite-plugin-gql-tada.d.ts +6 -0
  53. package/dist/vite/vite-plugin-gql-tada.js +51 -0
  54. package/dist/vite/vite-plugin-hmr.d.ts +8 -0
  55. package/dist/vite/vite-plugin-hmr.js +34 -0
  56. package/dist/vite/vite-plugin-lingui-babel.d.ts +27 -0
  57. package/dist/vite/vite-plugin-lingui-babel.js +86 -0
  58. package/dist/vite/vite-plugin-tailwind-source.d.ts +7 -0
  59. package/dist/vite/vite-plugin-tailwind-source.js +48 -0
  60. package/dist/vite/vite-plugin-theme.d.ts +55 -0
  61. package/dist/vite/vite-plugin-theme.js +130 -0
  62. package/dist/vite/vite-plugin-transform-index.d.ts +11 -0
  63. package/dist/vite/vite-plugin-transform-index.js +40 -0
  64. package/dist/vite/vite-plugin-translations.d.ts +31 -0
  65. package/dist/vite/vite-plugin-translations.js +177 -0
  66. package/dist/vite/vite-plugin-ui-config.d.ts +150 -0
  67. package/dist/vite/vite-plugin-ui-config.js +36 -0
  68. package/dist/vite/vite-plugin-vendure-dashboard.d.ts +142 -0
  69. package/dist/vite/vite-plugin-vendure-dashboard.js +170 -0
  70. package/index.html +14 -0
  71. package/lingui.config.js +37 -0
  72. package/package.json +178 -0
  73. package/src/app/app-providers.tsx +31 -0
  74. package/src/app/common/delete-bulk-action.tsx +149 -0
  75. package/src/app/common/duplicate-bulk-action.tsx +147 -0
  76. package/src/app/common/duplicate-entity-dialog.tsx +117 -0
  77. package/src/app/common/map-faceted-filter-fields.ts +21 -0
  78. package/src/app/common/set-document-direction.ts +7 -0
  79. package/src/app/common/use-page-title.test.ts +263 -0
  80. package/src/app/common/use-page-title.ts +86 -0
  81. package/src/app/main.tsx +134 -0
  82. package/src/app/routeTree.gen.ts +1284 -0
  83. package/src/app/routes/__root.tsx +23 -0
  84. package/src/app/routes/_authenticated/_administrators/administrators.graphql.ts +88 -0
  85. package/src/app/routes/_authenticated/_administrators/administrators.tsx +104 -0
  86. package/src/app/routes/_authenticated/_administrators/administrators_.$id.tsx +160 -0
  87. package/src/app/routes/_authenticated/_administrators/components/administrator-bulk-actions.tsx +15 -0
  88. package/src/app/routes/_authenticated/_administrators/components/role-permissions-display.tsx +133 -0
  89. package/src/app/routes/_authenticated/_assets/assets.graphql.ts +76 -0
  90. package/src/app/routes/_authenticated/_assets/assets.tsx +48 -0
  91. package/src/app/routes/_authenticated/_assets/assets_.$id.tsx +181 -0
  92. package/src/app/routes/_authenticated/_assets/components/asset-bulk-actions.tsx +47 -0
  93. package/src/app/routes/_authenticated/_assets/components/asset-tag-filter.tsx +206 -0
  94. package/src/app/routes/_authenticated/_assets/components/asset-tags-editor.tsx +226 -0
  95. package/src/app/routes/_authenticated/_assets/components/manage-tags-dialog.tsx +212 -0
  96. package/src/app/routes/_authenticated/_channels/channels.graphql.ts +102 -0
  97. package/src/app/routes/_authenticated/_channels/channels.tsx +81 -0
  98. package/src/app/routes/_authenticated/_channels/channels_.$id.tsx +251 -0
  99. package/src/app/routes/_authenticated/_channels/components/channel-bulk-actions.tsx +15 -0
  100. package/src/app/routes/_authenticated/_collections/collections.graphql.ts +193 -0
  101. package/src/app/routes/_authenticated/_collections/collections.tsx +337 -0
  102. package/src/app/routes/_authenticated/_collections/collections_.$id.tsx +236 -0
  103. package/src/app/routes/_authenticated/_collections/components/collection-bulk-actions.tsx +130 -0
  104. package/src/app/routes/_authenticated/_collections/components/collection-contents-preview-table.tsx +153 -0
  105. package/src/app/routes/_authenticated/_collections/components/collection-contents-sheet.tsx +50 -0
  106. package/src/app/routes/_authenticated/_collections/components/collection-contents-table.tsx +83 -0
  107. package/src/app/routes/_authenticated/_collections/components/collection-filters-selector.tsx +24 -0
  108. package/src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx +433 -0
  109. package/src/app/routes/_authenticated/_countries/components/country-bulk-actions.tsx +15 -0
  110. package/src/app/routes/_authenticated/_countries/countries.graphql.ts +82 -0
  111. package/src/app/routes/_authenticated/_countries/countries.tsx +72 -0
  112. package/src/app/routes/_authenticated/_countries/countries_.$id.tsx +123 -0
  113. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-bulk-actions.tsx +15 -0
  114. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-sheet.tsx +51 -0
  115. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-table.tsx +134 -0
  116. package/src/app/routes/_authenticated/_customer-groups/customer-groups.graphql.ts +80 -0
  117. package/src/app/routes/_authenticated/_customer-groups/customer-groups.tsx +72 -0
  118. package/src/app/routes/_authenticated/_customer-groups/customer-groups_.$id.tsx +121 -0
  119. package/src/app/routes/_authenticated/_customers/components/customer-address-card.tsx +155 -0
  120. package/src/app/routes/_authenticated/_customers/components/customer-address-form.tsx +347 -0
  121. package/src/app/routes/_authenticated/_customers/components/customer-bulk-actions.tsx +15 -0
  122. package/src/app/routes/_authenticated/_customers/components/customer-group-controls.tsx +4 -0
  123. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-container.tsx +78 -0
  124. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-types.ts +5 -0
  125. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-utils.tsx +124 -0
  126. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history.tsx +113 -0
  127. package/src/app/routes/_authenticated/_customers/components/customer-history/default-customer-history-components.tsx +176 -0
  128. package/src/app/routes/_authenticated/_customers/components/customer-history/index.ts +4 -0
  129. package/src/app/routes/_authenticated/_customers/components/customer-history/use-customer-history.ts +169 -0
  130. package/src/app/routes/_authenticated/_customers/components/customer-order-table.tsx +90 -0
  131. package/src/app/routes/_authenticated/_customers/components/customer-status-badge.tsx +33 -0
  132. package/src/app/routes/_authenticated/_customers/customers.graphql.ts +218 -0
  133. package/src/app/routes/_authenticated/_customers/customers.tsx +104 -0
  134. package/src/app/routes/_authenticated/_customers/customers_.$id.tsx +280 -0
  135. package/src/app/routes/_authenticated/_facets/components/facet-bulk-actions.tsx +99 -0
  136. package/src/app/routes/_authenticated/_facets/components/facet-value-bulk-actions.tsx +16 -0
  137. package/src/app/routes/_authenticated/_facets/components/facet-values-sheet.tsx +49 -0
  138. package/src/app/routes/_authenticated/_facets/components/facet-values-table.tsx +139 -0
  139. package/src/app/routes/_authenticated/_facets/facets.graphql.ts +182 -0
  140. package/src/app/routes/_authenticated/_facets/facets.tsx +121 -0
  141. package/src/app/routes/_authenticated/_facets/facets_.$facetId.values_.$id.tsx +158 -0
  142. package/src/app/routes/_authenticated/_facets/facets_.$id.tsx +152 -0
  143. package/src/app/routes/_authenticated/_global-settings/global-settings.graphql.ts +28 -0
  144. package/src/app/routes/_authenticated/_global-settings/global-settings.tsx +161 -0
  145. package/src/app/routes/_authenticated/_orders/components/add-manual-payment-dialog.tsx +189 -0
  146. package/src/app/routes/_authenticated/_orders/components/add-surcharge-form.tsx +139 -0
  147. package/src/app/routes/_authenticated/_orders/components/customer-address-selector.tsx +100 -0
  148. package/src/app/routes/_authenticated/_orders/components/edit-order-table.tsx +287 -0
  149. package/src/app/routes/_authenticated/_orders/components/fulfill-order-dialog.tsx +320 -0
  150. package/src/app/routes/_authenticated/_orders/components/fulfillment-details.tsx +159 -0
  151. package/src/app/routes/_authenticated/_orders/components/money-gross-net.tsx +20 -0
  152. package/src/app/routes/_authenticated/_orders/components/order-address.tsx +65 -0
  153. package/src/app/routes/_authenticated/_orders/components/order-detail-shared.tsx +307 -0
  154. package/src/app/routes/_authenticated/_orders/components/order-history/default-order-history-components.tsx +98 -0
  155. package/src/app/routes/_authenticated/_orders/components/order-history/index.ts +3 -0
  156. package/src/app/routes/_authenticated/_orders/components/order-history/order-history-container.tsx +80 -0
  157. package/src/app/routes/_authenticated/_orders/components/order-history/order-history-types.ts +5 -0
  158. package/src/app/routes/_authenticated/_orders/components/order-history/order-history-utils.tsx +173 -0
  159. package/src/app/routes/_authenticated/_orders/components/order-history/order-history.tsx +104 -0
  160. package/src/app/routes/_authenticated/_orders/components/order-history/use-order-history.ts +175 -0
  161. package/src/app/routes/_authenticated/_orders/components/order-line-custom-fields-form.tsx +53 -0
  162. package/src/app/routes/_authenticated/_orders/components/order-modification-preview-dialog.tsx +365 -0
  163. package/src/app/routes/_authenticated/_orders/components/order-modification-summary.tsx +261 -0
  164. package/src/app/routes/_authenticated/_orders/components/order-table-totals.tsx +100 -0
  165. package/src/app/routes/_authenticated/_orders/components/order-table.tsx +194 -0
  166. package/src/app/routes/_authenticated/_orders/components/order-tax-summary.tsx +40 -0
  167. package/src/app/routes/_authenticated/_orders/components/payment-details.tsx +293 -0
  168. package/src/app/routes/_authenticated/_orders/components/seller-orders-card.tsx +63 -0
  169. package/src/app/routes/_authenticated/_orders/components/settle-refund-dialog.tsx +80 -0
  170. package/src/app/routes/_authenticated/_orders/components/shipping-method-selector.tsx +64 -0
  171. package/src/app/routes/_authenticated/_orders/components/state-transition-control.tsx +99 -0
  172. package/src/app/routes/_authenticated/_orders/components/use-transition-order-to-state.tsx +151 -0
  173. package/src/app/routes/_authenticated/_orders/orders.graphql.ts +775 -0
  174. package/src/app/routes/_authenticated/_orders/orders.tsx +120 -0
  175. package/src/app/routes/_authenticated/_orders/orders_.$aggregateOrderId_.seller-orders.$sellerOrderId.tsx +50 -0
  176. package/src/app/routes/_authenticated/_orders/orders_.$id.tsx +30 -0
  177. package/src/app/routes/_authenticated/_orders/orders_.$id_.modify.tsx +298 -0
  178. package/src/app/routes/_authenticated/_orders/orders_.draft.$id.tsx +495 -0
  179. package/src/app/routes/_authenticated/_orders/utils/order-detail-loaders.tsx +134 -0
  180. package/src/app/routes/_authenticated/_orders/utils/order-types.ts +10 -0
  181. package/src/app/routes/_authenticated/_orders/utils/order-utils.ts +159 -0
  182. package/src/app/routes/_authenticated/_orders/utils/use-modify-order.ts +335 -0
  183. package/src/app/routes/_authenticated/_payment-methods/components/payment-eligibility-checker-selector.tsx +37 -0
  184. package/src/app/routes/_authenticated/_payment-methods/components/payment-handler-selector.tsx +33 -0
  185. package/src/app/routes/_authenticated/_payment-methods/components/payment-method-bulk-actions.tsx +58 -0
  186. package/src/app/routes/_authenticated/_payment-methods/payment-methods.graphql.ts +110 -0
  187. package/src/app/routes/_authenticated/_payment-methods/payment-methods.tsx +88 -0
  188. package/src/app/routes/_authenticated/_payment-methods/payment-methods_.$id.tsx +197 -0
  189. package/src/app/routes/_authenticated/_product-variants/components/add-currency-dropdown.tsx +49 -0
  190. package/src/app/routes/_authenticated/_product-variants/components/add-stock-location-dropdown.tsx +56 -0
  191. package/src/app/routes/_authenticated/_product-variants/components/product-variant-bulk-actions.tsx +110 -0
  192. package/src/app/routes/_authenticated/_product-variants/components/variant-price-detail.tsx +88 -0
  193. package/src/app/routes/_authenticated/_product-variants/product-variants.graphql.ts +207 -0
  194. package/src/app/routes/_authenticated/_product-variants/product-variants.tsx +98 -0
  195. package/src/app/routes/_authenticated/_product-variants/product-variants_.$id.tsx +471 -0
  196. package/src/app/routes/_authenticated/_products/components/add-option-group-dialog.tsx +127 -0
  197. package/src/app/routes/_authenticated/_products/components/add-product-variant-dialog.tsx +372 -0
  198. package/src/app/routes/_authenticated/_products/components/assign-facet-values-dialog.tsx +282 -0
  199. package/src/app/routes/_authenticated/_products/components/create-product-options-dialog.tsx +416 -0
  200. package/src/app/routes/_authenticated/_products/components/create-product-variants-dialog.tsx +190 -0
  201. package/src/app/routes/_authenticated/_products/components/create-product-variants.tsx +370 -0
  202. package/src/app/routes/_authenticated/_products/components/option-groups-editor.tsx +180 -0
  203. package/src/app/routes/_authenticated/_products/components/option-value-input.tsx +72 -0
  204. package/src/app/routes/_authenticated/_products/components/product-bulk-actions.tsx +117 -0
  205. package/src/app/routes/_authenticated/_products/components/product-option-group-badge.tsx +19 -0
  206. package/src/app/routes/_authenticated/_products/components/product-option-select.tsx +111 -0
  207. package/src/app/routes/_authenticated/_products/components/product-options-table.tsx +114 -0
  208. package/src/app/routes/_authenticated/_products/components/product-variants-table.tsx +120 -0
  209. package/src/app/routes/_authenticated/_products/product-option-groups.graphql.ts +103 -0
  210. package/src/app/routes/_authenticated/_products/products.graphql.ts +352 -0
  211. package/src/app/routes/_authenticated/_products/products.tsx +121 -0
  212. package/src/app/routes/_authenticated/_products/products_.$id.tsx +258 -0
  213. package/src/app/routes/_authenticated/_products/products_.$id_.variants.tsx +405 -0
  214. package/src/app/routes/_authenticated/_products/products_.$productId.option-groups.$id.tsx +177 -0
  215. package/src/app/routes/_authenticated/_products/products_.$productId.option-groups.$productOptionGroupId.options_.$id.tsx +204 -0
  216. package/src/app/routes/_authenticated/_profile/profile.graphql.ts +23 -0
  217. package/src/app/routes/_authenticated/_profile/profile.tsx +119 -0
  218. package/src/app/routes/_authenticated/_promotions/components/promotion-actions-selector.tsx +35 -0
  219. package/src/app/routes/_authenticated/_promotions/components/promotion-bulk-actions.tsx +72 -0
  220. package/src/app/routes/_authenticated/_promotions/components/promotion-conditions-selector.tsx +35 -0
  221. package/src/app/routes/_authenticated/_promotions/promotions.graphql.ts +121 -0
  222. package/src/app/routes/_authenticated/_promotions/promotions.tsx +94 -0
  223. package/src/app/routes/_authenticated/_promotions/promotions_.$id.tsx +245 -0
  224. package/src/app/routes/_authenticated/_roles/components/expandable-permissions.tsx +54 -0
  225. package/src/app/routes/_authenticated/_roles/components/permissions-table-grid.tsx +251 -0
  226. package/src/app/routes/_authenticated/_roles/components/role-bulk-actions.tsx +15 -0
  227. package/src/app/routes/_authenticated/_roles/roles.graphql.ts +76 -0
  228. package/src/app/routes/_authenticated/_roles/roles.tsx +99 -0
  229. package/src/app/routes/_authenticated/_roles/roles_.$id.tsx +146 -0
  230. package/src/app/routes/_authenticated/_sellers/components/seller-bulk-actions.tsx +15 -0
  231. package/src/app/routes/_authenticated/_sellers/sellers.graphql.ts +70 -0
  232. package/src/app/routes/_authenticated/_sellers/sellers.tsx +56 -0
  233. package/src/app/routes/_authenticated/_sellers/sellers_.$id.tsx +112 -0
  234. package/src/app/routes/_authenticated/_shipping-methods/components/fulfillment-handler-selector.tsx +56 -0
  235. package/src/app/routes/_authenticated/_shipping-methods/components/metadata-badges.tsx +15 -0
  236. package/src/app/routes/_authenticated/_shipping-methods/components/price-display.tsx +21 -0
  237. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-calculator-selector.tsx +33 -0
  238. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-eligibility-checker-selector.tsx +36 -0
  239. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-method-bulk-actions.tsx +61 -0
  240. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-method-test-result-wrapper.tsx +87 -0
  241. package/src/app/routes/_authenticated/_shipping-methods/components/test-address-form.tsx +256 -0
  242. package/src/app/routes/_authenticated/_shipping-methods/components/test-order-builder.tsx +244 -0
  243. package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-methods-result.tsx +97 -0
  244. package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-methods-sheet.tsx +41 -0
  245. package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-methods.tsx +74 -0
  246. package/src/app/routes/_authenticated/_shipping-methods/components/test-single-method-result.tsx +90 -0
  247. package/src/app/routes/_authenticated/_shipping-methods/components/test-single-shipping-method-sheet.tsx +56 -0
  248. package/src/app/routes/_authenticated/_shipping-methods/components/test-single-shipping-method.tsx +82 -0
  249. package/src/app/routes/_authenticated/_shipping-methods/components/use-shipping-method-test-state.ts +67 -0
  250. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.graphql.ts +137 -0
  251. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.tsx +76 -0
  252. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods_.$id.tsx +197 -0
  253. package/src/app/routes/_authenticated/_stock-locations/components/stock-location-bulk-actions.tsx +58 -0
  254. package/src/app/routes/_authenticated/_stock-locations/stock-locations.graphql.ts +87 -0
  255. package/src/app/routes/_authenticated/_stock-locations/stock-locations.tsx +65 -0
  256. package/src/app/routes/_authenticated/_stock-locations/stock-locations_.$id.tsx +126 -0
  257. package/src/app/routes/_authenticated/_system/components/payload-dialog.tsx +41 -0
  258. package/src/app/routes/_authenticated/_system/healthchecks.tsx +99 -0
  259. package/src/app/routes/_authenticated/_system/job-queue.graphql.ts +54 -0
  260. package/src/app/routes/_authenticated/_system/job-queue.tsx +265 -0
  261. package/src/app/routes/_authenticated/_system/scheduled-tasks.tsx +249 -0
  262. package/src/app/routes/_authenticated/_tax-categories/components/tax-category-bulk-actions.tsx +15 -0
  263. package/src/app/routes/_authenticated/_tax-categories/tax-categories.graphql.ts +72 -0
  264. package/src/app/routes/_authenticated/_tax-categories/tax-categories.tsx +69 -0
  265. package/src/app/routes/_authenticated/_tax-categories/tax-categories_.$id.tsx +127 -0
  266. package/src/app/routes/_authenticated/_tax-rates/components/tax-rate-bulk-actions.tsx +15 -0
  267. package/src/app/routes/_authenticated/_tax-rates/tax-rates.graphql.ts +84 -0
  268. package/src/app/routes/_authenticated/_tax-rates/tax-rates.tsx +119 -0
  269. package/src/app/routes/_authenticated/_tax-rates/tax-rates_.$id.tsx +149 -0
  270. package/src/app/routes/_authenticated/_zones/components/zone-bulk-actions.tsx +63 -0
  271. package/src/app/routes/_authenticated/_zones/components/zone-countries-add.tsx +0 -0
  272. package/src/app/routes/_authenticated/_zones/components/zone-countries-sheet.tsx +34 -0
  273. package/src/app/routes/_authenticated/_zones/components/zone-countries-table.tsx +94 -0
  274. package/src/app/routes/_authenticated/_zones/zones.graphql.ts +105 -0
  275. package/src/app/routes/_authenticated/_zones/zones.tsx +64 -0
  276. package/src/app/routes/_authenticated/_zones/zones_.$id.tsx +110 -0
  277. package/src/app/routes/_authenticated/index.tsx +233 -0
  278. package/src/app/routes/_authenticated.tsx +35 -0
  279. package/src/app/routes/login.tsx +49 -0
  280. package/src/app/styles.css +100 -0
  281. package/src/app/tailwindcss-animate.css +275 -0
  282. package/src/i18n/common-strings.ts +111 -0
  283. package/src/i18n/locales/ar.po +4972 -0
  284. package/src/i18n/locales/bg.po +3436 -0
  285. package/src/i18n/locales/cs.po +4972 -0
  286. package/src/i18n/locales/de.po +4972 -0
  287. package/src/i18n/locales/en.po +4972 -0
  288. package/src/i18n/locales/es.po +4972 -0
  289. package/src/i18n/locales/fa.po +4972 -0
  290. package/src/i18n/locales/fr.po +4972 -0
  291. package/src/i18n/locales/he.po +4972 -0
  292. package/src/i18n/locales/hr.po +4972 -0
  293. package/src/i18n/locales/it.po +4972 -0
  294. package/src/i18n/locales/ja.po +4972 -0
  295. package/src/i18n/locales/ko.po +4628 -0
  296. package/src/i18n/locales/nb.po +4972 -0
  297. package/src/i18n/locales/ne.po +4972 -0
  298. package/src/i18n/locales/nl.po +4628 -0
  299. package/src/i18n/locales/pl.po +4972 -0
  300. package/src/i18n/locales/pt_BR.po +4972 -0
  301. package/src/i18n/locales/pt_PT.po +4972 -0
  302. package/src/i18n/locales/ru.po +4972 -0
  303. package/src/i18n/locales/sv.po +4972 -0
  304. package/src/i18n/locales/tr.po +4972 -0
  305. package/src/i18n/locales/uk.po +4972 -0
  306. package/src/i18n/locales/zh_Hans.po +4972 -0
  307. package/src/i18n/locales/zh_Hant.po +4972 -0
  308. package/src/lib/components/data-display/boolean.tsx +23 -0
  309. package/src/lib/components/data-display/date-time.tsx +19 -0
  310. package/src/lib/components/data-display/json.tsx +20 -0
  311. package/src/lib/components/data-display/money.tsx +14 -0
  312. package/src/lib/components/data-input/affixed-input.stories.tsx +93 -0
  313. package/src/lib/components/data-input/affixed-input.tsx +79 -0
  314. package/src/lib/components/data-input/boolean-input.stories.tsx +102 -0
  315. package/src/lib/components/data-input/boolean-input.tsx +16 -0
  316. package/src/lib/components/data-input/checkbox-input.stories.tsx +61 -0
  317. package/src/lib/components/data-input/checkbox-input.tsx +15 -0
  318. package/src/lib/components/data-input/combination-mode-input.tsx +61 -0
  319. package/src/lib/components/data-input/configurable-operation-list-input.tsx +58 -0
  320. package/src/lib/components/data-input/custom-field-list-input.tsx +294 -0
  321. package/src/lib/components/data-input/customer-group-input.tsx +61 -0
  322. package/src/lib/components/data-input/datetime-input.stories.tsx +62 -0
  323. package/src/lib/components/data-input/datetime-input.tsx +192 -0
  324. package/src/lib/components/data-input/default-relation-input.tsx +626 -0
  325. package/src/lib/components/data-input/facet-value-input.tsx +78 -0
  326. package/src/lib/components/data-input/index.ts +23 -0
  327. package/src/lib/components/data-input/money-input.stories.tsx +88 -0
  328. package/src/lib/components/data-input/money-input.tsx +122 -0
  329. package/src/lib/components/data-input/number-input.stories.tsx +103 -0
  330. package/src/lib/components/data-input/number-input.tsx +85 -0
  331. package/src/lib/components/data-input/password-form-input.stories.tsx +65 -0
  332. package/src/lib/components/data-input/password-form-input.tsx +23 -0
  333. package/src/lib/components/data-input/product-multi-selector-input.tsx +416 -0
  334. package/src/lib/components/data-input/relation-input.tsx +165 -0
  335. package/src/lib/components/data-input/relation-selector.tsx +476 -0
  336. package/src/lib/components/data-input/rich-text-input.stories.tsx +92 -0
  337. package/src/lib/components/data-input/rich-text-input.tsx +16 -0
  338. package/src/lib/components/data-input/select-with-options.tsx +96 -0
  339. package/src/lib/components/data-input/slug-input.stories.tsx +232 -0
  340. package/src/lib/components/data-input/slug-input.tsx +289 -0
  341. package/src/lib/components/data-input/string-list-input.tsx +268 -0
  342. package/src/lib/components/data-input/struct-form-input.tsx +320 -0
  343. package/src/lib/components/data-input/text-input.stories.tsx +52 -0
  344. package/src/lib/components/data-input/text-input.tsx +16 -0
  345. package/src/lib/components/data-input/textarea-input.stories.tsx +55 -0
  346. package/src/lib/components/data-input/textarea-input.tsx +23 -0
  347. package/src/lib/components/data-table/add-filter-menu.tsx +64 -0
  348. package/src/lib/components/data-table/column-header-wrapper.tsx +106 -0
  349. package/src/lib/components/data-table/data-table-bulk-action-item.tsx +141 -0
  350. package/src/lib/components/data-table/data-table-bulk-actions.tsx +99 -0
  351. package/src/lib/components/data-table/data-table-column-header.tsx +50 -0
  352. package/src/lib/components/data-table/data-table-context.tsx +106 -0
  353. package/src/lib/components/data-table/data-table-faceted-filter.tsx +195 -0
  354. package/src/lib/components/data-table/data-table-filter-badge-editable.tsx +35 -0
  355. package/src/lib/components/data-table/data-table-filter-badge.tsx +101 -0
  356. package/src/lib/components/data-table/data-table-filter-dialog.tsx +92 -0
  357. package/src/lib/components/data-table/data-table-pagination.tsx +103 -0
  358. package/src/lib/components/data-table/data-table-utils.ts +291 -0
  359. package/src/lib/components/data-table/data-table-view-options.tsx +130 -0
  360. package/src/lib/components/data-table/data-table.stories.tsx +249 -0
  361. package/src/lib/components/data-table/data-table.tsx +508 -0
  362. package/src/lib/components/data-table/filters/data-table-boolean-filter.tsx +60 -0
  363. package/src/lib/components/data-table/filters/data-table-datetime-filter.tsx +159 -0
  364. package/src/lib/components/data-table/filters/data-table-id-filter.tsx +63 -0
  365. package/src/lib/components/data-table/filters/data-table-number-filter.tsx +123 -0
  366. package/src/lib/components/data-table/filters/data-table-string-filter.tsx +79 -0
  367. package/src/lib/components/data-table/global-views-bar.tsx +97 -0
  368. package/src/lib/components/data-table/global-views-sheet.tsx +11 -0
  369. package/src/lib/components/data-table/human-readable-operator.tsx +65 -0
  370. package/src/lib/components/data-table/manage-global-views-button.tsx +26 -0
  371. package/src/lib/components/data-table/my-views-button.tsx +47 -0
  372. package/src/lib/components/data-table/refresh-button.tsx +49 -0
  373. package/src/lib/components/data-table/save-view-button.tsx +45 -0
  374. package/src/lib/components/data-table/save-view-dialog.tsx +134 -0
  375. package/src/lib/components/data-table/types.ts +40 -0
  376. package/src/lib/components/data-table/use-all-bulk-actions.ts +19 -0
  377. package/src/lib/components/data-table/use-generated-columns.tsx +411 -0
  378. package/src/lib/components/data-table/user-views-sheet.tsx +11 -0
  379. package/src/lib/components/data-table/views-sheet.tsx +305 -0
  380. package/src/lib/components/date-range-picker.tsx +186 -0
  381. package/src/lib/components/labeled-data.tsx +21 -0
  382. package/src/lib/components/layout/app-layout.tsx +35 -0
  383. package/src/lib/components/layout/app-sidebar.tsx +37 -0
  384. package/src/lib/components/layout/channel-switcher.tsx +229 -0
  385. package/src/lib/components/layout/content-language-selector.tsx +46 -0
  386. package/src/lib/components/layout/dev-mode-indicator.tsx +18 -0
  387. package/src/lib/components/layout/generated-breadcrumbs.tsx +136 -0
  388. package/src/lib/components/layout/language-dialog.tsx +133 -0
  389. package/src/lib/components/layout/manage-languages-dialog.tsx +386 -0
  390. package/src/lib/components/layout/nav-item-wrapper.tsx +107 -0
  391. package/src/lib/components/layout/nav-main.tsx +331 -0
  392. package/src/lib/components/layout/nav-projects.tsx +81 -0
  393. package/src/lib/components/layout/nav-user.tsx +180 -0
  394. package/src/lib/components/login/login-form.tsx +124 -0
  395. package/src/lib/components/shared/alerts.tsx +52 -0
  396. package/src/lib/components/shared/animated-number.tsx +49 -0
  397. package/src/lib/components/shared/asset/asset-bulk-actions.tsx +109 -0
  398. package/src/lib/components/shared/asset/asset-focal-point-editor.tsx +103 -0
  399. package/src/lib/components/shared/asset/asset-gallery.stories.tsx +76 -0
  400. package/src/lib/components/shared/asset/asset-gallery.tsx +623 -0
  401. package/src/lib/components/shared/asset/asset-picker-dialog.stories.tsx +58 -0
  402. package/src/lib/components/shared/asset/asset-picker-dialog.tsx +109 -0
  403. package/src/lib/components/shared/asset/asset-preview-dialog.tsx +38 -0
  404. package/src/lib/components/shared/asset/asset-preview-selector.tsx +32 -0
  405. package/src/lib/components/shared/asset/asset-preview.tsx +114 -0
  406. package/src/lib/components/shared/asset/asset-properties.tsx +44 -0
  407. package/src/lib/components/shared/assign-to-channel-bulk-action.tsx +71 -0
  408. package/src/lib/components/shared/assign-to-channel-dialog.tsx +156 -0
  409. package/src/lib/components/shared/assigned-channels.tsx +108 -0
  410. package/src/lib/components/shared/assigned-facet-values.tsx +61 -0
  411. package/src/lib/components/shared/channel-chip.tsx +43 -0
  412. package/src/lib/components/shared/channel-code-label.tsx +6 -0
  413. package/src/lib/components/shared/channel-selector.tsx +51 -0
  414. package/src/lib/components/shared/configurable-operation-arg-input.tsx +29 -0
  415. package/src/lib/components/shared/configurable-operation-input.tsx +167 -0
  416. package/src/lib/components/shared/configurable-operation-multi-selector.tsx +263 -0
  417. package/src/lib/components/shared/configurable-operation-selector.tsx +156 -0
  418. package/src/lib/components/shared/confirmation-dialog.tsx +58 -0
  419. package/src/lib/components/shared/copyable-text.tsx +30 -0
  420. package/src/lib/components/shared/country-selector.tsx +108 -0
  421. package/src/lib/components/shared/currency-selector.tsx +33 -0
  422. package/src/lib/components/shared/custom-fields-form.tsx +296 -0
  423. package/src/lib/components/shared/customer-address-form.tsx +338 -0
  424. package/src/lib/components/shared/customer-group-chip.tsx +30 -0
  425. package/src/lib/components/shared/customer-group-selector.tsx +65 -0
  426. package/src/lib/components/shared/customer-selector.tsx +112 -0
  427. package/src/lib/components/shared/detail-page-button.stories.tsx +52 -0
  428. package/src/lib/components/shared/detail-page-button.tsx +59 -0
  429. package/src/lib/components/shared/entity-assets.tsx +411 -0
  430. package/src/lib/components/shared/error-page.tsx +31 -0
  431. package/src/lib/components/shared/facet-value-chip.tsx +59 -0
  432. package/src/lib/components/shared/facet-value-selector.stories.tsx +48 -0
  433. package/src/lib/components/shared/facet-value-selector.tsx +458 -0
  434. package/src/lib/components/shared/form-field-wrapper.tsx +111 -0
  435. package/src/lib/components/shared/history-timeline/history-entry-date.tsx +37 -0
  436. package/src/lib/components/shared/history-timeline/history-note-checkbox.tsx +28 -0
  437. package/src/lib/components/shared/history-timeline/history-note-editor.tsx +60 -0
  438. package/src/lib/components/shared/history-timeline/history-note-entry.tsx +65 -0
  439. package/src/lib/components/shared/history-timeline/history-note-input.tsx +39 -0
  440. package/src/lib/components/shared/history-timeline/history-timeline-with-grouping.tsx +141 -0
  441. package/src/lib/components/shared/history-timeline/history-timeline.tsx +16 -0
  442. package/src/lib/components/shared/history-timeline/use-history-note-editor.ts +26 -0
  443. package/src/lib/components/shared/icon-mark.tsx +18 -0
  444. package/src/lib/components/shared/language-selector.tsx +56 -0
  445. package/src/lib/components/shared/logo-mark.tsx +24 -0
  446. package/src/lib/components/shared/multi-select.tsx +159 -0
  447. package/src/lib/components/shared/navigation-confirmation.tsx +64 -0
  448. package/src/lib/components/shared/option-value-input.tsx +97 -0
  449. package/src/lib/components/shared/paginated-list-data-table.stories.tsx +212 -0
  450. package/src/lib/components/shared/paginated-list-data-table.tsx +523 -0
  451. package/src/lib/components/shared/permission-guard.stories.tsx +46 -0
  452. package/src/lib/components/shared/permission-guard.tsx +51 -0
  453. package/src/lib/components/shared/product-variant-selector.tsx +136 -0
  454. package/src/lib/components/shared/remove-from-channel-bulk-action.tsx +93 -0
  455. package/src/lib/components/shared/rich-text-editor/image-dialog.tsx +223 -0
  456. package/src/lib/components/shared/rich-text-editor/link-dialog.tsx +151 -0
  457. package/src/lib/components/shared/rich-text-editor/responsive-toolbar.tsx +443 -0
  458. package/src/lib/components/shared/rich-text-editor/rich-text-editor.tsx +339 -0
  459. package/src/lib/components/shared/rich-text-editor/table-delete-menu.tsx +104 -0
  460. package/src/lib/components/shared/rich-text-editor/table-edit-icons.tsx +225 -0
  461. package/src/lib/components/shared/role-code-label.tsx +12 -0
  462. package/src/lib/components/shared/role-selector.tsx +56 -0
  463. package/src/lib/components/shared/seller-selector.tsx +111 -0
  464. package/src/lib/components/shared/stock-level-label.tsx +22 -0
  465. package/src/lib/components/shared/table-cell/order-table-cell-components.tsx +80 -0
  466. package/src/lib/components/shared/tax-category-selector.tsx +65 -0
  467. package/src/lib/components/shared/translatable-form-field.tsx +149 -0
  468. package/src/lib/components/shared/vendure-image.stories.tsx +167 -0
  469. package/src/lib/components/shared/vendure-image.tsx +307 -0
  470. package/src/lib/components/shared/zone-selector.tsx +65 -0
  471. package/src/lib/components/ui/accordion.stories.tsx +33 -0
  472. package/src/lib/components/ui/accordion.tsx +59 -0
  473. package/src/lib/components/ui/alert-dialog.stories.tsx +48 -0
  474. package/src/lib/components/ui/alert-dialog.tsx +128 -0
  475. package/src/lib/components/ui/alert.stories.tsx +35 -0
  476. package/src/lib/components/ui/alert.tsx +60 -0
  477. package/src/lib/components/ui/aspect-ratio.stories.tsx +28 -0
  478. package/src/lib/components/ui/aspect-ratio.tsx +9 -0
  479. package/src/lib/components/ui/badge.stories.tsx +28 -0
  480. package/src/lib/components/ui/badge.tsx +38 -0
  481. package/src/lib/components/ui/breadcrumb.stories.tsx +41 -0
  482. package/src/lib/components/ui/breadcrumb.tsx +102 -0
  483. package/src/lib/components/ui/button.stories.tsx +38 -0
  484. package/src/lib/components/ui/button.tsx +58 -0
  485. package/src/lib/components/ui/calendar.stories.tsx +22 -0
  486. package/src/lib/components/ui/calendar.tsx +447 -0
  487. package/src/lib/components/ui/card.stories.tsx +28 -0
  488. package/src/lib/components/ui/card.tsx +47 -0
  489. package/src/lib/components/ui/carousel.stories.tsx +34 -0
  490. package/src/lib/components/ui/carousel.tsx +241 -0
  491. package/src/lib/components/ui/chart.tsx +351 -0
  492. package/src/lib/components/ui/checkbox.stories.tsx +31 -0
  493. package/src/lib/components/ui/checkbox.tsx +27 -0
  494. package/src/lib/components/ui/collapsible.stories.tsx +39 -0
  495. package/src/lib/components/ui/collapsible.tsx +33 -0
  496. package/src/lib/components/ui/command.stories.tsx +44 -0
  497. package/src/lib/components/ui/command.tsx +139 -0
  498. package/src/lib/components/ui/context-menu.stories.tsx +38 -0
  499. package/src/lib/components/ui/context-menu.tsx +252 -0
  500. package/src/lib/components/ui/dialog.stories.tsx +52 -0
  501. package/src/lib/components/ui/dialog.tsx +116 -0
  502. package/src/lib/components/ui/drawer.stories.tsx +50 -0
  503. package/src/lib/components/ui/drawer.tsx +133 -0
  504. package/src/lib/components/ui/dropdown-menu.stories.tsx +41 -0
  505. package/src/lib/components/ui/dropdown-menu.tsx +223 -0
  506. package/src/lib/components/ui/form.tsx +141 -0
  507. package/src/lib/components/ui/grid-layout.tsx +376 -0
  508. package/src/lib/components/ui/hover-card.stories.tsx +38 -0
  509. package/src/lib/components/ui/hover-card.tsx +36 -0
  510. package/src/lib/components/ui/input-group.tsx +149 -0
  511. package/src/lib/components/ui/input-otp.stories.tsx +30 -0
  512. package/src/lib/components/ui/input-otp.tsx +77 -0
  513. package/src/lib/components/ui/input.stories.tsx +38 -0
  514. package/src/lib/components/ui/input.tsx +19 -0
  515. package/src/lib/components/ui/label.stories.tsx +24 -0
  516. package/src/lib/components/ui/label.tsx +21 -0
  517. package/src/lib/components/ui/menubar.stories.tsx +53 -0
  518. package/src/lib/components/ui/menubar.tsx +274 -0
  519. package/src/lib/components/ui/navigation-menu.stories.tsx +54 -0
  520. package/src/lib/components/ui/navigation-menu.tsx +168 -0
  521. package/src/lib/components/ui/pagination.stories.tsx +51 -0
  522. package/src/lib/components/ui/pagination.tsx +106 -0
  523. package/src/lib/components/ui/password-input.stories.tsx +32 -0
  524. package/src/lib/components/ui/password-input.tsx +29 -0
  525. package/src/lib/components/ui/popover.stories.tsx +33 -0
  526. package/src/lib/components/ui/popover.tsx +40 -0
  527. package/src/lib/components/ui/progress.stories.tsx +27 -0
  528. package/src/lib/components/ui/progress.tsx +29 -0
  529. package/src/lib/components/ui/radio-group.stories.tsx +34 -0
  530. package/src/lib/components/ui/radio-group.tsx +45 -0
  531. package/src/lib/components/ui/resizable.stories.tsx +32 -0
  532. package/src/lib/components/ui/resizable.tsx +54 -0
  533. package/src/lib/components/ui/scroll-area.stories.tsx +31 -0
  534. package/src/lib/components/ui/scroll-area.tsx +50 -0
  535. package/src/lib/components/ui/select.stories.tsx +36 -0
  536. package/src/lib/components/ui/select.tsx +183 -0
  537. package/src/lib/components/ui/separator.stories.tsx +35 -0
  538. package/src/lib/components/ui/separator.tsx +26 -0
  539. package/src/lib/components/ui/sheet.stories.tsx +50 -0
  540. package/src/lib/components/ui/sheet.tsx +118 -0
  541. package/src/lib/components/ui/sidebar-context.ts +16 -0
  542. package/src/lib/components/ui/sidebar.tsx +686 -0
  543. package/src/lib/components/ui/skeleton.stories.tsx +26 -0
  544. package/src/lib/components/ui/skeleton.tsx +13 -0
  545. package/src/lib/components/ui/slider.stories.tsx +37 -0
  546. package/src/lib/components/ui/slider.tsx +63 -0
  547. package/src/lib/components/ui/sonner.tsx +27 -0
  548. package/src/lib/components/ui/switch.stories.tsx +31 -0
  549. package/src/lib/components/ui/switch.tsx +26 -0
  550. package/src/lib/components/ui/table.stories.tsx +52 -0
  551. package/src/lib/components/ui/table.tsx +82 -0
  552. package/src/lib/components/ui/tabs.stories.tsx +29 -0
  553. package/src/lib/components/ui/tabs.tsx +48 -0
  554. package/src/lib/components/ui/textarea.stories.tsx +32 -0
  555. package/src/lib/components/ui/textarea.tsx +18 -0
  556. package/src/lib/components/ui/toggle-group.stories.tsx +31 -0
  557. package/src/lib/components/ui/toggle-group.tsx +73 -0
  558. package/src/lib/components/ui/toggle.stories.tsx +39 -0
  559. package/src/lib/components/ui/toggle.tsx +45 -0
  560. package/src/lib/components/ui/tooltip.stories.tsx +30 -0
  561. package/src/lib/components/ui/tooltip.tsx +51 -0
  562. package/src/lib/constants.ts +336 -0
  563. package/src/lib/framework/alert/alert-extensions.tsx +19 -0
  564. package/src/lib/framework/alert/alert-item.tsx +44 -0
  565. package/src/lib/framework/alert/alerts-indicator.tsx +22 -0
  566. package/src/lib/framework/alert/search-index-buffer-alert/search-index-buffer-alert.ts +41 -0
  567. package/src/lib/framework/component-registry/component-registry.tsx +18 -0
  568. package/src/lib/framework/component-registry/display-component.tsx +28 -0
  569. package/src/lib/framework/dashboard-widget/base-widget.tsx +101 -0
  570. package/src/lib/framework/dashboard-widget/latest-orders-widget/index.tsx +152 -0
  571. package/src/lib/framework/dashboard-widget/latest-orders-widget/latest-orders-widget.graphql.ts +35 -0
  572. package/src/lib/framework/dashboard-widget/metrics-widget/chart.tsx +40 -0
  573. package/src/lib/framework/dashboard-widget/metrics-widget/index.tsx +96 -0
  574. package/src/lib/framework/dashboard-widget/metrics-widget/metrics-widget.graphql.ts +20 -0
  575. package/src/lib/framework/dashboard-widget/orders-summary/index.tsx +113 -0
  576. package/src/lib/framework/dashboard-widget/orders-summary/order-summary-widget.graphql.ts +14 -0
  577. package/src/lib/framework/dashboard-widget/widget-extensions.tsx +19 -0
  578. package/src/lib/framework/dashboard-widget/widget-filters-context.tsx +36 -0
  579. package/src/lib/framework/data-table/data-table-extensions.ts +35 -0
  580. package/src/lib/framework/defaults.ts +270 -0
  581. package/src/lib/framework/document-extension/extend-detail-form-query.ts +50 -0
  582. package/src/lib/framework/document-extension/extend-document.spec.ts +884 -0
  583. package/src/lib/framework/document-extension/extend-document.ts +159 -0
  584. package/src/lib/framework/document-introspection/add-custom-fields.spec.ts +1458 -0
  585. package/src/lib/framework/document-introspection/add-custom-fields.ts +452 -0
  586. package/src/lib/framework/document-introspection/get-document-structure.spec.ts +581 -0
  587. package/src/lib/framework/document-introspection/get-document-structure.ts +669 -0
  588. package/src/lib/framework/document-introspection/hooks.ts +13 -0
  589. package/src/lib/framework/document-introspection/include-only-selected-list-fields.spec.ts +1840 -0
  590. package/src/lib/framework/document-introspection/include-only-selected-list-fields.ts +940 -0
  591. package/src/lib/framework/document-introspection/testing-utils.ts +161 -0
  592. package/src/lib/framework/extension-api/define-dashboard-extension.ts +99 -0
  593. package/src/lib/framework/extension-api/display-component-extensions.tsx +58 -0
  594. package/src/lib/framework/extension-api/extension-api-types.ts +92 -0
  595. package/src/lib/framework/extension-api/input-component-extensions.tsx +96 -0
  596. package/src/lib/framework/extension-api/logic/alerts.ts +11 -0
  597. package/src/lib/framework/extension-api/logic/data-table.ts +37 -0
  598. package/src/lib/framework/extension-api/logic/detail-forms.ts +35 -0
  599. package/src/lib/framework/extension-api/logic/form-components.ts +14 -0
  600. package/src/lib/framework/extension-api/logic/history-entries.ts +24 -0
  601. package/src/lib/framework/extension-api/logic/index.ts +10 -0
  602. package/src/lib/framework/extension-api/logic/layout.ts +22 -0
  603. package/src/lib/framework/extension-api/logic/login.ts +17 -0
  604. package/src/lib/framework/extension-api/logic/navigation.ts +41 -0
  605. package/src/lib/framework/extension-api/logic/widgets.ts +10 -0
  606. package/src/lib/framework/extension-api/types/alerts.ts +59 -0
  607. package/src/lib/framework/extension-api/types/data-table.ts +159 -0
  608. package/src/lib/framework/extension-api/types/detail-forms.ts +58 -0
  609. package/src/lib/framework/extension-api/types/form-components.ts +41 -0
  610. package/src/lib/framework/extension-api/types/history-entries.ts +120 -0
  611. package/src/lib/framework/extension-api/types/index.ts +10 -0
  612. package/src/lib/framework/extension-api/types/layout.ts +141 -0
  613. package/src/lib/framework/extension-api/types/login.ts +76 -0
  614. package/src/lib/framework/extension-api/types/navigation.ts +105 -0
  615. package/src/lib/framework/extension-api/types/widgets.ts +101 -0
  616. package/src/lib/framework/extension-api/use-dashboard-extensions.ts +27 -0
  617. package/src/lib/framework/extension-api/use-login-extensions.ts +26 -0
  618. package/src/lib/framework/form-engine/custom-form-component-extensions.ts +15 -0
  619. package/src/lib/framework/form-engine/custom-form-component.tsx +16 -0
  620. package/src/lib/framework/form-engine/default-input-for-type.tsx +35 -0
  621. package/src/lib/framework/form-engine/form-control-adapter.tsx +193 -0
  622. package/src/lib/framework/form-engine/form-engine-types.ts +169 -0
  623. package/src/lib/framework/form-engine/form-schema-tools.spec.ts +610 -0
  624. package/src/lib/framework/form-engine/form-schema-tools.ts +417 -0
  625. package/src/lib/framework/form-engine/overridden-form-component.tsx +51 -0
  626. package/src/lib/framework/form-engine/use-generated-form.tsx +226 -0
  627. package/src/lib/framework/form-engine/utils.spec.ts +37 -0
  628. package/src/lib/framework/form-engine/utils.ts +356 -0
  629. package/src/lib/framework/form-engine/value-transformers.ts +150 -0
  630. package/src/lib/framework/history-entry/history-entry-extensions.ts +11 -0
  631. package/src/lib/framework/history-entry/history-entry.tsx +129 -0
  632. package/src/lib/framework/layout-engine/custom-form-page.stories.tsx +344 -0
  633. package/src/lib/framework/layout-engine/dev-mode-button.tsx +24 -0
  634. package/src/lib/framework/layout-engine/layout-extensions.ts +27 -0
  635. package/src/lib/framework/layout-engine/location-wrapper.tsx +122 -0
  636. package/src/lib/framework/layout-engine/page-block-provider.tsx +6 -0
  637. package/src/lib/framework/layout-engine/page-layout.spec.tsx +138 -0
  638. package/src/lib/framework/layout-engine/page-layout.tsx +700 -0
  639. package/src/lib/framework/layout-engine/page-provider.tsx +10 -0
  640. package/src/lib/framework/layout-engine/page.stories.tsx +275 -0
  641. package/src/lib/framework/nav-menu/nav-menu-extensions.ts +112 -0
  642. package/src/lib/framework/page/detail-page-route-loader.tsx +67 -0
  643. package/src/lib/framework/page/detail-page.stories.tsx +151 -0
  644. package/src/lib/framework/page/detail-page.tsx +255 -0
  645. package/src/lib/framework/page/list-page.stories.tsx +217 -0
  646. package/src/lib/framework/page/list-page.tsx +613 -0
  647. package/src/lib/framework/page/page-api.ts +9 -0
  648. package/src/lib/framework/page/page-types.ts +51 -0
  649. package/src/lib/framework/page/use-detail-page.ts +341 -0
  650. package/src/lib/framework/page/use-extended-router.tsx +139 -0
  651. package/src/lib/framework/registry/global-registry.ts +50 -0
  652. package/src/lib/framework/registry/registry-types.ts +32 -0
  653. package/src/lib/graphql/api.ts +123 -0
  654. package/src/lib/graphql/common-operations.ts +37 -0
  655. package/src/lib/graphql/fragments.ts +71 -0
  656. package/src/lib/graphql/graphql-env.d.ts +523 -0
  657. package/src/lib/graphql/graphql.ts +15 -0
  658. package/src/lib/graphql/settings-store-operations.ts +17 -0
  659. package/src/lib/hooks/use-alerts.ts +84 -0
  660. package/src/lib/hooks/use-auth.tsx +21 -0
  661. package/src/lib/hooks/use-channel.ts +27 -0
  662. package/src/lib/hooks/use-custom-field-config.ts +27 -0
  663. package/src/lib/hooks/use-display-locale.ts +40 -0
  664. package/src/lib/hooks/use-drag-and-drop.ts +86 -0
  665. package/src/lib/hooks/use-dynamic-translations.ts +46 -0
  666. package/src/lib/hooks/use-extended-detail-query.ts +37 -0
  667. package/src/lib/hooks/use-extended-list-query.ts +80 -0
  668. package/src/lib/hooks/use-floating-bulk-actions.ts +83 -0
  669. package/src/lib/hooks/use-grouped-permissions.ts +55 -0
  670. package/src/lib/hooks/use-local-format.ts +186 -0
  671. package/src/lib/hooks/use-mobile.ts +19 -0
  672. package/src/lib/hooks/use-page-block.tsx +27 -0
  673. package/src/lib/hooks/use-page.tsx +10 -0
  674. package/src/lib/hooks/use-permissions.ts +40 -0
  675. package/src/lib/hooks/use-saved-views.ts +238 -0
  676. package/src/lib/hooks/use-server-config.ts +4 -0
  677. package/src/lib/hooks/use-sorted-languages.ts +41 -0
  678. package/src/lib/hooks/use-theme.ts +10 -0
  679. package/src/lib/hooks/use-ui-language-loader.ts +30 -0
  680. package/src/lib/hooks/use-user-settings.tsx +12 -0
  681. package/src/lib/index.ts +293 -0
  682. package/src/lib/lib/load-i18n-messages.ts +20 -0
  683. package/src/lib/lib/trans.tsx +20 -0
  684. package/src/lib/lib/utils.ts +111 -0
  685. package/src/lib/providers/alerts-provider.tsx +60 -0
  686. package/src/lib/providers/auth.tsx +232 -0
  687. package/src/lib/providers/channel-provider.tsx +245 -0
  688. package/src/lib/providers/i18n-provider.tsx +21 -0
  689. package/src/lib/providers/server-config.tsx +289 -0
  690. package/src/lib/providers/theme-provider.tsx +56 -0
  691. package/src/lib/providers/user-settings.tsx +244 -0
  692. package/src/lib/types/saved-views.ts +42 -0
  693. package/src/lib/utils/config-utils.ts +19 -0
  694. package/src/lib/utils/global-languages.ts +268 -0
  695. package/src/lib/utils/saved-views-utils.ts +40 -0
  696. package/src/lib/virtual.d.ts +39 -0
  697. package/src/vite-env.d.ts +2 -0
@@ -0,0 +1,417 @@
1
+ import {
2
+ FieldInfo,
3
+ isEnumType,
4
+ isScalarType,
5
+ } from '@/vdb/framework/document-introspection/get-document-structure.js';
6
+ import {
7
+ CustomFieldConfig,
8
+ DateTimeCustomFieldConfig,
9
+ FloatCustomFieldConfig,
10
+ IntCustomFieldConfig,
11
+ StringCustomFieldConfig,
12
+ StructCustomFieldConfig,
13
+ StructField,
14
+ } from '@/vdb/framework/form-engine/form-engine-types.js';
15
+ import { z, ZodRawShape, ZodType, ZodTypeAny } from 'zod';
16
+
17
+ function mapGraphQLCustomFieldToConfig(field: StructField) {
18
+ const { __typename, ...rest } = field;
19
+ const baseConfig: CustomFieldConfig = {
20
+ ...rest,
21
+ list: field.list ?? false,
22
+ readonly: false,
23
+ requiresPermission: [],
24
+ nullable: true, // Default to true since GraphQL fields are nullable by default
25
+ };
26
+
27
+ switch (field.__typename) {
28
+ case 'StringStructFieldConfig':
29
+ return {
30
+ ...baseConfig,
31
+ __typename: 'StringCustomFieldConfig',
32
+ pattern: field.pattern ?? null,
33
+ options: [],
34
+ } satisfies StringCustomFieldConfig;
35
+ case 'IntStructFieldConfig':
36
+ return {
37
+ ...baseConfig,
38
+ __typename: 'IntCustomFieldConfig',
39
+ intMin: field.intMin ?? null,
40
+ intMax: field.intMax ?? null,
41
+ intStep: field.intStep ?? null,
42
+ } satisfies IntCustomFieldConfig;
43
+ case 'FloatStructFieldConfig':
44
+ return {
45
+ ...baseConfig,
46
+ __typename: 'FloatCustomFieldConfig',
47
+ floatMin: field.floatMin ?? null,
48
+ floatMax: field.floatMax ?? null,
49
+ floatStep: field.floatStep ?? null,
50
+ } satisfies FloatCustomFieldConfig;
51
+ case 'DateTimeStructFieldConfig':
52
+ return {
53
+ ...baseConfig,
54
+ __typename: 'DateTimeCustomFieldConfig',
55
+ datetimeMin: field.datetimeMin ?? null,
56
+ datetimeMax: field.datetimeMax ?? null,
57
+ datetimeStep: field.datetimeStep ?? null,
58
+ } satisfies DateTimeCustomFieldConfig;
59
+ default:
60
+ return baseConfig;
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Safely parses a date string into a Date object.
66
+ * Used for parsing datetime constraints in custom field validation.
67
+ *
68
+ * @param dateStr - The date string to parse
69
+ * @returns Parsed Date object or undefined if invalid
70
+ */
71
+ function parseDate(dateStr: string | undefined | null): Date | undefined {
72
+ if (!dateStr) return undefined;
73
+ const date = new Date(dateStr);
74
+ return isNaN(date.getTime()) ? undefined : date;
75
+ }
76
+
77
+ /**
78
+ * Creates a Zod validation schema for datetime fields with optional min/max constraints.
79
+ * Supports both string and Date inputs, which is common in form handling.
80
+ *
81
+ * @param minDate - Optional minimum date constraint
82
+ * @param maxDate - Optional maximum date constraint
83
+ * @returns Zod schema that validates date ranges
84
+ */
85
+ function createDateValidationSchema(minDate: Date | undefined, maxDate: Date | undefined): ZodType {
86
+ const baseSchema = z.union([z.string(), z.date()]);
87
+ if (!minDate && !maxDate) return baseSchema;
88
+
89
+ const dateMinString = minDate?.toLocaleDateString() ?? '';
90
+ const dateMaxString = maxDate?.toLocaleDateString() ?? '';
91
+ const dateMinMessage = minDate ? `Date must be after ${dateMinString}` : '';
92
+ const dateMaxMessage = maxDate ? `Date must be before ${dateMaxString}` : '';
93
+
94
+ return baseSchema.refine(
95
+ val => {
96
+ if (!val) return true;
97
+ const date = val instanceof Date ? val : new Date(val);
98
+ if (minDate && date < minDate) return false;
99
+ if (maxDate && date > maxDate) return false;
100
+ return true;
101
+ },
102
+ val => {
103
+ const date = val instanceof Date ? val : new Date(val);
104
+ if (minDate && date < minDate) return { message: dateMinMessage };
105
+ if (maxDate && date > maxDate) return { message: dateMaxMessage };
106
+ return { message: '' };
107
+ },
108
+ );
109
+ }
110
+
111
+ /**
112
+ * Creates a Zod validation schema for string fields with optional regex pattern validation.
113
+ * Used for string-type custom fields that may have pattern constraints.
114
+ *
115
+ * @param pattern - Optional regex pattern string for validation
116
+ * @returns Zod string schema with optional pattern validation
117
+ */
118
+ function createStringValidationSchema(pattern?: string | null): ZodType {
119
+ let schema = z.string();
120
+ if (pattern) {
121
+ schema = schema.regex(new RegExp(pattern), {
122
+ message: `Value must match pattern: ${pattern}`,
123
+ });
124
+ }
125
+ return schema;
126
+ }
127
+
128
+ /**
129
+ * Creates a Zod validation schema for integer fields with optional min/max constraints.
130
+ * Used for int-type custom fields that may have numeric range limits.
131
+ *
132
+ * @param min - Optional minimum value constraint
133
+ * @param max - Optional maximum value constraint
134
+ * @returns Zod number schema with optional range validation
135
+ */
136
+ function createNumberValidationSchema(min?: number | null, max?: number | null): ZodType {
137
+ let schema = z.number();
138
+ if (min != null) {
139
+ schema = schema.min(min, {
140
+ message: `Value must be at least ${min}`,
141
+ });
142
+ }
143
+ if (max != null) {
144
+ schema = schema.max(max, {
145
+ message: `Value must be at most ${max}`,
146
+ });
147
+ }
148
+ return schema;
149
+ }
150
+
151
+ /**
152
+ * Creates a Zod validation schema for a single custom field based on its type and constraints.
153
+ * This is the main dispatcher that routes different custom field types to their specific
154
+ * validation schema creators. Handles all standard custom field types in Vendure.
155
+ *
156
+ * @param customField - The custom field configuration object
157
+ * @returns Zod schema appropriate for the custom field type
158
+ */
159
+ function createCustomFieldValidationSchema(customField: CustomFieldConfig): ZodType {
160
+ let zodType: ZodType;
161
+
162
+ switch (customField.type) {
163
+ case 'localeString':
164
+ case 'localeText':
165
+ case 'string':
166
+ zodType = createStringValidationSchema((customField as StringCustomFieldConfig).pattern);
167
+ break;
168
+ case 'int':
169
+ zodType = createNumberValidationSchema(
170
+ (customField as IntCustomFieldConfig).intMin,
171
+ (customField as IntCustomFieldConfig).intMax,
172
+ );
173
+ break;
174
+ case 'float':
175
+ zodType = createNumberValidationSchema(
176
+ (customField as FloatCustomFieldConfig).floatMin,
177
+ (customField as FloatCustomFieldConfig).floatMax,
178
+ );
179
+ break;
180
+ case 'datetime': {
181
+ const minDate = parseDate((customField as DateTimeCustomFieldConfig).datetimeMin);
182
+ const maxDate = parseDate((customField as DateTimeCustomFieldConfig).datetimeMax);
183
+ zodType = createDateValidationSchema(minDate, maxDate);
184
+ break;
185
+ }
186
+ case 'boolean':
187
+ zodType = z.boolean();
188
+ break;
189
+ default:
190
+ zodType = z.any();
191
+ break;
192
+ }
193
+
194
+ return zodType;
195
+ }
196
+
197
+ /**
198
+ * Creates a Zod validation schema for struct-type custom fields.
199
+ * Struct fields contain nested sub-fields, each with their own validation rules.
200
+ * This recursively processes each sub-field to create a nested object schema.
201
+ *
202
+ * @param structFieldConfig - The struct custom field configuration with nested fields
203
+ * @returns Zod object schema representing the struct with all sub-field validations
204
+ */
205
+ function createStructFieldSchema(structFieldConfig: StructCustomFieldConfig): ZodType {
206
+ if (!structFieldConfig.fields || !Array.isArray(structFieldConfig.fields)) {
207
+ return z.object({}).passthrough();
208
+ }
209
+
210
+ const nestedSchema: ZodRawShape = {};
211
+ for (const structSubField of structFieldConfig.fields) {
212
+ const config = mapGraphQLCustomFieldToConfig(structSubField);
213
+ let subFieldType = createCustomFieldValidationSchema(config);
214
+
215
+ // Handle list and nullable for struct sub-fields
216
+ if (config.list) {
217
+ subFieldType = z.array(subFieldType);
218
+ }
219
+ if (config.nullable) {
220
+ subFieldType = subFieldType.optional().nullable();
221
+ }
222
+
223
+ nestedSchema[config.name] = subFieldType;
224
+ }
225
+
226
+ return z.object(nestedSchema);
227
+ }
228
+
229
+ /**
230
+ * Applies common list and nullable modifiers to a Zod schema based on custom field configuration.
231
+ * Many custom fields can be configured as lists (arrays) and/or nullable, so this helper
232
+ * centralizes that logic to avoid duplication.
233
+ *
234
+ * @param zodType - The base Zod schema to modify
235
+ * @param customField - Custom field config containing list/nullable flags
236
+ * @returns Modified Zod schema with list/nullable modifiers applied
237
+ */
238
+ function applyCustomFieldModifiers(zodType: ZodType, customField: CustomFieldConfig): ZodType {
239
+ let modifiedType = zodType;
240
+
241
+ if (customField.list) {
242
+ modifiedType = z.array(modifiedType);
243
+ }
244
+ if (customField.nullable !== false) {
245
+ modifiedType = modifiedType.optional().nullable();
246
+ }
247
+ if (customField.readonly) {
248
+ modifiedType = modifiedType.readonly();
249
+ }
250
+ return modifiedType;
251
+ }
252
+
253
+ /**
254
+ * Processes all custom fields and creates a complete validation schema for the customFields object.
255
+ * Handles context-aware filtering (translation vs root context) and orchestrates the creation
256
+ * of validation schemas for all custom field types including complex struct fields.
257
+ *
258
+ * @param customFieldConfigs - Array of all custom field configurations
259
+ * @param isTranslationContext - Whether we're processing fields for translation forms
260
+ * @returns Zod schema shape for the entire customFields object
261
+ */
262
+ function processCustomFieldsSchema(
263
+ customFieldConfigs: CustomFieldConfig[],
264
+ isTranslationContext: boolean,
265
+ ): ZodRawShape {
266
+ const customFieldsSchema: ZodRawShape = {};
267
+ const translatableTypes = ['localeString', 'localeText'];
268
+
269
+ const filteredCustomFields = customFieldConfigs.filter(cf => {
270
+ if (isTranslationContext) {
271
+ return translatableTypes.includes(cf.type);
272
+ } else {
273
+ return !translatableTypes.includes(cf.type);
274
+ }
275
+ });
276
+
277
+ for (const customField of filteredCustomFields) {
278
+ let zodType: ZodType;
279
+
280
+ if (customField.type === 'struct') {
281
+ zodType = createStructFieldSchema(customField as StructCustomFieldConfig);
282
+ } else {
283
+ zodType = createCustomFieldValidationSchema(customField);
284
+ }
285
+
286
+ zodType = applyCustomFieldModifiers(zodType, customField);
287
+ const schemaPropertyName = getGraphQlInputName(customField);
288
+ customFieldsSchema[schemaPropertyName] = zodType;
289
+ }
290
+
291
+ return customFieldsSchema;
292
+ }
293
+
294
+ export function createFormSchemaFromFields(
295
+ fields: FieldInfo[],
296
+ customFieldConfigs?: CustomFieldConfig[],
297
+ isTranslationContext = false,
298
+ ) {
299
+ const schemaConfig: ZodRawShape = {};
300
+
301
+ for (const field of fields) {
302
+ const isScalar = isScalarType(field.type);
303
+ const isEnum = isEnumType(field.type);
304
+
305
+ if ((isScalar || isEnum) && field.name !== 'customFields') {
306
+ schemaConfig[field.name] = getZodTypeFromField(field);
307
+ } else if (field.name === 'customFields') {
308
+ const customFieldsSchema =
309
+ customFieldConfigs && customFieldConfigs.length > 0
310
+ ? processCustomFieldsSchema(customFieldConfigs, isTranslationContext)
311
+ : {};
312
+ schemaConfig[field.name] = z.object(customFieldsSchema).optional();
313
+ } else if (field.typeInfo) {
314
+ const isNestedTranslationContext = field.name === 'translations' || isTranslationContext;
315
+ let nestedType: ZodType = createFormSchemaFromFields(
316
+ field.typeInfo,
317
+ customFieldConfigs,
318
+ isNestedTranslationContext,
319
+ );
320
+
321
+ if (field.nullable) {
322
+ nestedType = nestedType.optional().nullable();
323
+ }
324
+ if (field.list) {
325
+ nestedType = z.array(nestedType);
326
+ }
327
+
328
+ schemaConfig[field.name] = nestedType;
329
+ }
330
+ }
331
+
332
+ return z.object(schemaConfig);
333
+ }
334
+
335
+ export function getDefaultValuesFromFields(fields: FieldInfo[], defaultLanguageCode?: string) {
336
+ const defaultValues: Record<string, any> = {};
337
+ for (const field of fields) {
338
+ if (field.typeInfo) {
339
+ const nestedObjectDefaults = getDefaultValuesFromFields(field.typeInfo, defaultLanguageCode);
340
+ if (field.list) {
341
+ defaultValues[field.name] = [nestedObjectDefaults];
342
+ } else {
343
+ defaultValues[field.name] = nestedObjectDefaults;
344
+ }
345
+ } else {
346
+ defaultValues[field.name] = getDefaultValueFromField(field, defaultLanguageCode);
347
+ }
348
+ }
349
+ return defaultValues;
350
+ }
351
+
352
+ export function getDefaultValueFromField(field: FieldInfo, defaultLanguageCode?: string) {
353
+ if (field.list) {
354
+ return [];
355
+ }
356
+ switch (field.type) {
357
+ case 'String':
358
+ case 'DateTime':
359
+ return '';
360
+ case 'Int':
361
+ case 'Float':
362
+ case 'Money':
363
+ return 0;
364
+ case 'Boolean':
365
+ return false;
366
+ case 'ID':
367
+ return '';
368
+ case 'LanguageCode':
369
+ return defaultLanguageCode || 'en';
370
+ case 'JSON':
371
+ return {};
372
+ default: {
373
+ return '';
374
+ }
375
+ }
376
+ }
377
+
378
+ export function getZodTypeFromField(field: FieldInfo): ZodTypeAny {
379
+ let zodType: ZodType;
380
+
381
+ // This function is only used for non-custom fields, so we don't need custom field logic here
382
+ // Custom fields are handled separately in createFormSchemaFromFields
383
+
384
+ switch (field.type) {
385
+ case 'String':
386
+ case 'ID':
387
+ case 'DateTime':
388
+ zodType = z.string();
389
+ break;
390
+ case 'Int':
391
+ case 'Float':
392
+ case 'Money':
393
+ zodType = z.number();
394
+ break;
395
+ case 'Boolean':
396
+ zodType = z.boolean();
397
+ break;
398
+ default:
399
+ zodType = z.any();
400
+ }
401
+
402
+ if (field.list) {
403
+ zodType = z.array(zodType);
404
+ }
405
+ if (field.nullable) {
406
+ zodType = zodType.optional().nullable();
407
+ }
408
+ return zodType;
409
+ }
410
+
411
+ export function getGraphQlInputName(config: { name: string; type: string; list?: boolean }): string {
412
+ if (config.type === 'relation') {
413
+ return config.list === true ? `${config.name}Ids` : `${config.name}Id`;
414
+ } else {
415
+ return config.name;
416
+ }
417
+ }
@@ -0,0 +1,51 @@
1
+ import {
2
+ DataDisplayComponent,
3
+ useComponentRegistry,
4
+ } from '@/vdb/framework/component-registry/component-registry.js';
5
+ import { generateInputComponentKey } from '@/vdb/framework/extension-api/input-component-extensions.js';
6
+ import { DashboardFormComponent } from '@/vdb/framework/form-engine/form-engine-types.js';
7
+ import { usePageBlock } from '@/vdb/hooks/use-page-block.js';
8
+ import { usePage } from '@/vdb/hooks/use-page.js';
9
+ import { ControllerRenderProps, FieldPath, FieldValues } from 'react-hook-form';
10
+
11
+ export interface OverriddenFormComponent<
12
+ TFieldValues extends FieldValues = any,
13
+ TName extends FieldPath<TFieldValues> = any,
14
+ > {
15
+ fieldName: string;
16
+ field: ControllerRenderProps<TFieldValues, TName>;
17
+ children?: React.ReactNode;
18
+ }
19
+
20
+ /**
21
+ * @description
22
+ * Based on the pageId and blockId of where this is placed, it will check whether any custom components
23
+ * are registered and render them if so. Otherwise, it will render the children, which act as the
24
+ * default if this location has not been overridden.
25
+ *
26
+ * ```tsx
27
+ * <OverriddenFormComponent fieldName="myField" field={field}>
28
+ * <Input {...field} />
29
+ * </OverriddenFormComponent>
30
+ * ```
31
+ */
32
+ export function OverriddenFormComponent({ fieldName, field, children }: Readonly<OverriddenFormComponent>) {
33
+ const page = usePage();
34
+ const pageBlock = usePageBlock({ optional: true });
35
+ const componentRegistry = useComponentRegistry();
36
+ let DisplayComponent: DataDisplayComponent | undefined;
37
+ let InputComponent: DashboardFormComponent | undefined;
38
+ if (page.pageId && pageBlock?.blockId) {
39
+ const customInputComponentKey = generateInputComponentKey(page.pageId, pageBlock.blockId, fieldName);
40
+ DisplayComponent = componentRegistry.getDisplayComponent(customInputComponentKey);
41
+ InputComponent = componentRegistry.getInputComponent(customInputComponentKey);
42
+ }
43
+ if (DisplayComponent) {
44
+ return <DisplayComponent {...field} />;
45
+ }
46
+
47
+ if (InputComponent) {
48
+ return <InputComponent {...field} />;
49
+ }
50
+ return children ?? null;
51
+ }
@@ -0,0 +1,226 @@
1
+ import type { TypedDocumentNode } from '@graphql-typed-document-node/core';
2
+ import { zodResolver } from '@hookform/resolvers/zod';
3
+ import { VariablesOf } from 'gql.tada';
4
+ import { FormEvent } from 'react';
5
+ 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 { removeEmptyIdFields, transformRelationFields } from './utils.js';
11
+
12
+ export type WithLooseCustomFields<T> = T extends { customFields?: any }
13
+ ? Omit<T, 'customFields'> & { customFields?: T['customFields'] | unknown }
14
+ : T;
15
+
16
+ /**
17
+ * @description
18
+ * Options for the useGeneratedForm hook.
19
+ *
20
+ * @docsCategory detail-views
21
+ * @docsPage useGeneratedForm
22
+ * @since 3.3.0
23
+ */
24
+ export interface GeneratedFormOptions<
25
+ T extends TypedDocumentNode<any, any>,
26
+ VarName extends keyof VariablesOf<T> | undefined = 'input',
27
+ E extends Record<string, any> = Record<string, any>,
28
+ > {
29
+ /**
30
+ * @description
31
+ * The document to use to generate the form.
32
+ */
33
+ document?: T;
34
+ /**
35
+ * @description
36
+ * The name of the variable to use in the document.
37
+ */
38
+ varName?: VarName;
39
+ /**
40
+ * @description
41
+ * The entity to use to generate the form.
42
+ */
43
+ entity: E | null | undefined;
44
+ customFieldConfig?: any[]; // Add custom field config for validation
45
+ setValues: (
46
+ entity: NonNullable<E>,
47
+ ) => WithLooseCustomFields<
48
+ VarName extends keyof VariablesOf<T> ? VariablesOf<T>[VarName] : VariablesOf<T>
49
+ >;
50
+ onSubmit?: (
51
+ values: VarName extends keyof VariablesOf<T> ? VariablesOf<T>[VarName] : VariablesOf<T>,
52
+ ) => void;
53
+ }
54
+
55
+ /**
56
+ * @description
57
+ * This hook is used to create a form from a document and an entity.
58
+ * It will create a form with the fields defined in the document's input type.
59
+ * It will also create a submit handler that will submit the form to the server.
60
+ *
61
+ * This hook is mostly used internally by the higher-level {@link useDetailPage} hook,
62
+ * but can in some cases be useful to use directly.
63
+ *
64
+ * @example
65
+ * ```tsx
66
+ * const { form, submitHandler } = useGeneratedForm({
67
+ * document: setDraftOrderCustomFieldsDocument,
68
+ * varName: undefined,
69
+ * entity: entity,
70
+ * setValues: entity => {
71
+ * return {
72
+ * orderId: entity.id,
73
+ * input: {
74
+ * customFields: entity.customFields,
75
+ * },
76
+ * };
77
+ * },
78
+ * });
79
+ * ```
80
+ *
81
+ * @docsCategory detail-views
82
+ * @docsPage useGeneratedForm
83
+ * @since 3.3.0
84
+ * @docsWeight 0
85
+ */
86
+ export function useGeneratedForm<
87
+ T extends TypedDocumentNode<any, any>,
88
+ VarName extends keyof VariablesOf<T> | undefined,
89
+ E extends Record<string, any> = Record<string, any>,
90
+ >(options: GeneratedFormOptions<T, VarName, E>) {
91
+ const { document, entity, setValues, onSubmit, varName, customFieldConfig } = options;
92
+ const { activeChannel } = useChannel();
93
+ const serverConfig = useServerConfig();
94
+ const availableLanguages = serverConfig?.availableLanguages || [];
95
+ const updateFields = document ? getOperationVariablesFields(document, varName) : [];
96
+
97
+ const schema = createFormSchemaFromFields(updateFields, customFieldConfig);
98
+ const defaultValues = getDefaultValuesFromFields(updateFields, activeChannel?.defaultLanguageCode);
99
+ const processedEntity = ensureTranslationsForAllLanguages(entity, availableLanguages, defaultValues);
100
+
101
+ const values = processedEntity
102
+ ? transformRelationFields(updateFields, setValues(processedEntity))
103
+ : defaultValues;
104
+
105
+ const form = useForm({
106
+ resolver: async (values, context, options) => {
107
+ const result = await zodResolver(schema)(values, context, options);
108
+ if (Object.keys(result.errors).length > 0) {
109
+ console.log('Zod form validation errors:', result.errors);
110
+ }
111
+ return result;
112
+ },
113
+ mode: 'onChange',
114
+ defaultValues,
115
+ values,
116
+ });
117
+ let submitHandler = (event: FormEvent): any => {
118
+ event.preventDefault();
119
+ };
120
+ if (onSubmit) {
121
+ submitHandler = async (event: FormEvent) => {
122
+ event.preventDefault();
123
+
124
+ // Trigger validation on ALL fields, not just dirty ones
125
+ const isValid = await form.trigger();
126
+
127
+ if (!isValid) {
128
+ console.log(`Form invalid!`);
129
+ event.stopPropagation();
130
+ return;
131
+ }
132
+
133
+ const onSubmitWrapper = (values: any) => {
134
+ onSubmit(removeEmptyIdFields(values, updateFields));
135
+ };
136
+ form.handleSubmit(onSubmitWrapper)(event);
137
+ };
138
+ }
139
+
140
+ return { form, submitHandler };
141
+ }
142
+
143
+ /**
144
+ * Ensures that an entity with translations has entries for all available languages.
145
+ * If a language is missing, it creates an empty translation based on the structure of existing translations
146
+ * and the expected form structure from defaultValues.
147
+ */
148
+ function ensureTranslationsForAllLanguages<E extends Record<string, any>>(
149
+ entity: E | null | undefined,
150
+ availableLanguages: string[] = [],
151
+ expectedStructure?: Record<string, any>,
152
+ ): E | null | undefined {
153
+ if (
154
+ !entity ||
155
+ !('translations' in entity) ||
156
+ !Array.isArray((entity as any).translations) ||
157
+ !availableLanguages.length
158
+ ) {
159
+ return entity;
160
+ }
161
+
162
+ // Create a deep copy of the entity to avoid mutation
163
+ const processedEntity = { ...entity } as any;
164
+ const translations = [...(processedEntity.translations || [])];
165
+
166
+ // Get existing language codes
167
+ const existingLanguageCodes = new Set(translations.map((t: any) => t.languageCode));
168
+
169
+ // Get the expected translation structure from defaultValues or existing translations
170
+ const existingTemplate = translations[0] || {};
171
+ const expectedTranslationStructure = expectedStructure?.translations?.[0] || {};
172
+
173
+ // Merge the structures to ensure we have all expected fields
174
+ const templateStructure = {
175
+ ...expectedTranslationStructure,
176
+ ...existingTemplate,
177
+ };
178
+
179
+ // Add missing language translations
180
+ for (const langCode of availableLanguages) {
181
+ if (!existingLanguageCodes.has(langCode)) {
182
+ const emptyTranslation: Record<string, any> = {
183
+ languageCode: langCode,
184
+ };
185
+
186
+ // Add empty fields based on merged template structure (excluding languageCode)
187
+ Object.keys(templateStructure).forEach(key => {
188
+ if (key !== 'languageCode') {
189
+ if (typeof templateStructure[key] === 'object' && templateStructure[key] !== null) {
190
+ // For nested objects like customFields, create an empty object
191
+ emptyTranslation[key] = Array.isArray(templateStructure[key]) ? [] : {};
192
+ } else {
193
+ // For primitive values, use empty string as default
194
+ emptyTranslation[key] = '';
195
+ }
196
+ }
197
+ });
198
+
199
+ translations.push(emptyTranslation);
200
+ } else {
201
+ // For existing translations, ensure they have all expected fields
202
+ const existingTranslation = translations.find((t: any) => t.languageCode === langCode);
203
+ if (existingTranslation) {
204
+ Object.keys(expectedTranslationStructure).forEach(key => {
205
+ if (key !== 'languageCode' && !(key in existingTranslation)) {
206
+ if (
207
+ typeof expectedTranslationStructure[key] === 'object' &&
208
+ expectedTranslationStructure[key] !== null
209
+ ) {
210
+ existingTranslation[key] = Array.isArray(expectedTranslationStructure[key])
211
+ ? []
212
+ : {};
213
+ } else {
214
+ existingTranslation[key] = '';
215
+ }
216
+ }
217
+ });
218
+ }
219
+ }
220
+ }
221
+
222
+ // Update the processed entity with complete translations
223
+ processedEntity.translations = translations;
224
+
225
+ return processedEntity as E;
226
+ }