@leandrosk/dashboard 3.5.5-fork.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 (713) hide show
  1. package/README.md +118 -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 +35 -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 +280 -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 +191 -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/path-transformer.d.ts +20 -0
  37. package/dist/vite/utils/path-transformer.js +116 -0
  38. package/dist/vite/utils/plugin-discovery.d.ts +27 -0
  39. package/dist/vite/utils/plugin-discovery.js +399 -0
  40. package/dist/vite/utils/schema-generator.d.ts +10 -0
  41. package/dist/vite/utils/schema-generator.js +35 -0
  42. package/dist/vite/utils/tsconfig-utils.d.ts +9 -0
  43. package/dist/vite/utils/tsconfig-utils.js +51 -0
  44. package/dist/vite/utils/ui-config.d.ts +3 -0
  45. package/dist/vite/utils/ui-config.js +44 -0
  46. package/dist/vite/vite-plugin-admin-api-schema.d.ts +24 -0
  47. package/dist/vite/vite-plugin-admin-api-schema.js +82 -0
  48. package/dist/vite/vite-plugin-config-loader.d.ts +16 -0
  49. package/dist/vite/vite-plugin-config-loader.js +70 -0
  50. package/dist/vite/vite-plugin-config.d.ts +4 -0
  51. package/dist/vite/vite-plugin-config.js +60 -0
  52. package/dist/vite/vite-plugin-dashboard-metadata.d.ts +7 -0
  53. package/dist/vite/vite-plugin-dashboard-metadata.js +61 -0
  54. package/dist/vite/vite-plugin-gql-tada.d.ts +6 -0
  55. package/dist/vite/vite-plugin-gql-tada.js +51 -0
  56. package/dist/vite/vite-plugin-hmr.d.ts +8 -0
  57. package/dist/vite/vite-plugin-hmr.js +34 -0
  58. package/dist/vite/vite-plugin-lingui-babel.d.ts +40 -0
  59. package/dist/vite/vite-plugin-lingui-babel.js +168 -0
  60. package/dist/vite/vite-plugin-tailwind-source.d.ts +7 -0
  61. package/dist/vite/vite-plugin-tailwind-source.js +48 -0
  62. package/dist/vite/vite-plugin-theme.d.ts +55 -0
  63. package/dist/vite/vite-plugin-theme.js +130 -0
  64. package/dist/vite/vite-plugin-transform-index.d.ts +11 -0
  65. package/dist/vite/vite-plugin-transform-index.js +40 -0
  66. package/dist/vite/vite-plugin-translations.d.ts +31 -0
  67. package/dist/vite/vite-plugin-translations.js +177 -0
  68. package/dist/vite/vite-plugin-ui-config.d.ts +181 -0
  69. package/dist/vite/vite-plugin-ui-config.js +36 -0
  70. package/dist/vite/vite-plugin-vendure-dashboard.d.ts +142 -0
  71. package/dist/vite/vite-plugin-vendure-dashboard.js +170 -0
  72. package/index.html +14 -0
  73. package/lingui.config.js +39 -0
  74. package/package.json +184 -0
  75. package/src/app/app-providers.tsx +31 -0
  76. package/src/app/common/delete-bulk-action.tsx +149 -0
  77. package/src/app/common/duplicate-bulk-action.tsx +147 -0
  78. package/src/app/common/duplicate-entity-dialog.tsx +117 -0
  79. package/src/app/common/map-faceted-filter-fields.ts +21 -0
  80. package/src/app/common/set-document-direction.ts +7 -0
  81. package/src/app/common/use-page-title.test.ts +263 -0
  82. package/src/app/common/use-page-title.ts +86 -0
  83. package/src/app/main.tsx +134 -0
  84. package/src/app/routeTree.gen.ts +1284 -0
  85. package/src/app/routes/__root.tsx +23 -0
  86. package/src/app/routes/_authenticated/_administrators/administrators.graphql.ts +88 -0
  87. package/src/app/routes/_authenticated/_administrators/administrators.tsx +104 -0
  88. package/src/app/routes/_authenticated/_administrators/administrators_.$id.tsx +160 -0
  89. package/src/app/routes/_authenticated/_administrators/components/administrator-bulk-actions.tsx +15 -0
  90. package/src/app/routes/_authenticated/_administrators/components/role-permissions-display.tsx +133 -0
  91. package/src/app/routes/_authenticated/_assets/assets.graphql.ts +76 -0
  92. package/src/app/routes/_authenticated/_assets/assets.tsx +48 -0
  93. package/src/app/routes/_authenticated/_assets/assets_.$id.tsx +181 -0
  94. package/src/app/routes/_authenticated/_assets/components/asset-bulk-actions.tsx +47 -0
  95. package/src/app/routes/_authenticated/_assets/components/asset-tag-filter.tsx +206 -0
  96. package/src/app/routes/_authenticated/_assets/components/asset-tags-editor.tsx +226 -0
  97. package/src/app/routes/_authenticated/_assets/components/manage-tags-dialog.tsx +212 -0
  98. package/src/app/routes/_authenticated/_channels/channels.graphql.ts +102 -0
  99. package/src/app/routes/_authenticated/_channels/channels.tsx +81 -0
  100. package/src/app/routes/_authenticated/_channels/channels_.$id.tsx +251 -0
  101. package/src/app/routes/_authenticated/_channels/components/channel-bulk-actions.tsx +15 -0
  102. package/src/app/routes/_authenticated/_collections/collections.graphql.ts +191 -0
  103. package/src/app/routes/_authenticated/_collections/collections.tsx +458 -0
  104. package/src/app/routes/_authenticated/_collections/collections_.$id.tsx +267 -0
  105. package/src/app/routes/_authenticated/_collections/components/collection-bulk-actions.tsx +130 -0
  106. package/src/app/routes/_authenticated/_collections/components/collection-contents-preview-table.tsx +153 -0
  107. package/src/app/routes/_authenticated/_collections/components/collection-contents-sheet.tsx +50 -0
  108. package/src/app/routes/_authenticated/_collections/components/collection-contents-table.tsx +83 -0
  109. package/src/app/routes/_authenticated/_collections/components/collection-filters-selector.tsx +30 -0
  110. package/src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx +433 -0
  111. package/src/app/routes/_authenticated/_countries/components/country-bulk-actions.tsx +15 -0
  112. package/src/app/routes/_authenticated/_countries/countries.graphql.ts +82 -0
  113. package/src/app/routes/_authenticated/_countries/countries.tsx +72 -0
  114. package/src/app/routes/_authenticated/_countries/countries_.$id.tsx +123 -0
  115. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-bulk-actions.tsx +15 -0
  116. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-sheet.tsx +51 -0
  117. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-table.tsx +134 -0
  118. package/src/app/routes/_authenticated/_customer-groups/customer-groups.graphql.ts +80 -0
  119. package/src/app/routes/_authenticated/_customer-groups/customer-groups.tsx +72 -0
  120. package/src/app/routes/_authenticated/_customer-groups/customer-groups_.$id.tsx +121 -0
  121. package/src/app/routes/_authenticated/_customers/components/customer-address-card.tsx +155 -0
  122. package/src/app/routes/_authenticated/_customers/components/customer-address-form.tsx +347 -0
  123. package/src/app/routes/_authenticated/_customers/components/customer-bulk-actions.tsx +15 -0
  124. package/src/app/routes/_authenticated/_customers/components/customer-group-controls.tsx +4 -0
  125. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-container.tsx +78 -0
  126. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-types.ts +5 -0
  127. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-utils.tsx +124 -0
  128. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history.tsx +113 -0
  129. package/src/app/routes/_authenticated/_customers/components/customer-history/default-customer-history-components.tsx +178 -0
  130. package/src/app/routes/_authenticated/_customers/components/customer-history/index.ts +4 -0
  131. package/src/app/routes/_authenticated/_customers/components/customer-history/use-customer-history.ts +169 -0
  132. package/src/app/routes/_authenticated/_customers/components/customer-order-table.tsx +90 -0
  133. package/src/app/routes/_authenticated/_customers/components/customer-status-badge.tsx +33 -0
  134. package/src/app/routes/_authenticated/_customers/customers.graphql.ts +219 -0
  135. package/src/app/routes/_authenticated/_customers/customers.tsx +107 -0
  136. package/src/app/routes/_authenticated/_customers/customers_.$id.tsx +280 -0
  137. package/src/app/routes/_authenticated/_facets/components/facet-bulk-actions.tsx +99 -0
  138. package/src/app/routes/_authenticated/_facets/components/facet-value-bulk-actions.tsx +16 -0
  139. package/src/app/routes/_authenticated/_facets/components/facet-values-sheet.tsx +49 -0
  140. package/src/app/routes/_authenticated/_facets/components/facet-values-table.tsx +139 -0
  141. package/src/app/routes/_authenticated/_facets/facets.graphql.ts +182 -0
  142. package/src/app/routes/_authenticated/_facets/facets.tsx +121 -0
  143. package/src/app/routes/_authenticated/_facets/facets_.$facetId.values_.$id.tsx +158 -0
  144. package/src/app/routes/_authenticated/_facets/facets_.$id.tsx +152 -0
  145. package/src/app/routes/_authenticated/_global-settings/global-settings.graphql.ts +28 -0
  146. package/src/app/routes/_authenticated/_global-settings/global-settings.tsx +161 -0
  147. package/src/app/routes/_authenticated/_orders/components/add-manual-payment-dialog.tsx +189 -0
  148. package/src/app/routes/_authenticated/_orders/components/add-surcharge-form.tsx +139 -0
  149. package/src/app/routes/_authenticated/_orders/components/customer-address-selector.tsx +115 -0
  150. package/src/app/routes/_authenticated/_orders/components/draft-order-status.tsx +48 -0
  151. package/src/app/routes/_authenticated/_orders/components/edit-order-table.tsx +287 -0
  152. package/src/app/routes/_authenticated/_orders/components/fulfill-order-dialog.tsx +323 -0
  153. package/src/app/routes/_authenticated/_orders/components/fulfillment-details.tsx +181 -0
  154. package/src/app/routes/_authenticated/_orders/components/money-gross-net.tsx +20 -0
  155. package/src/app/routes/_authenticated/_orders/components/order-address.tsx +65 -0
  156. package/src/app/routes/_authenticated/_orders/components/order-detail-shared.tsx +332 -0
  157. package/src/app/routes/_authenticated/_orders/components/order-history/default-order-history-components.tsx +138 -0
  158. package/src/app/routes/_authenticated/_orders/components/order-history/index.ts +3 -0
  159. package/src/app/routes/_authenticated/_orders/components/order-history/order-history-container.tsx +80 -0
  160. package/src/app/routes/_authenticated/_orders/components/order-history/order-history-types.ts +5 -0
  161. package/src/app/routes/_authenticated/_orders/components/order-history/order-history-utils.tsx +189 -0
  162. package/src/app/routes/_authenticated/_orders/components/order-history/order-history.tsx +117 -0
  163. package/src/app/routes/_authenticated/_orders/components/order-history/use-order-history.ts +175 -0
  164. package/src/app/routes/_authenticated/_orders/components/order-line-custom-fields-form.tsx +60 -0
  165. package/src/app/routes/_authenticated/_orders/components/order-modification-preview-dialog.tsx +365 -0
  166. package/src/app/routes/_authenticated/_orders/components/order-modification-summary.tsx +277 -0
  167. package/src/app/routes/_authenticated/_orders/components/order-table-totals.tsx +100 -0
  168. package/src/app/routes/_authenticated/_orders/components/order-table.tsx +216 -0
  169. package/src/app/routes/_authenticated/_orders/components/order-tax-summary.tsx +40 -0
  170. package/src/app/routes/_authenticated/_orders/components/payment-details.tsx +293 -0
  171. package/src/app/routes/_authenticated/_orders/components/refund-order-dialog.tsx +372 -0
  172. package/src/app/routes/_authenticated/_orders/components/seller-orders-card.tsx +63 -0
  173. package/src/app/routes/_authenticated/_orders/components/settle-refund-dialog.tsx +80 -0
  174. package/src/app/routes/_authenticated/_orders/components/shipping-method-selector.tsx +64 -0
  175. package/src/app/routes/_authenticated/_orders/components/state-transition-control.tsx +99 -0
  176. package/src/app/routes/_authenticated/_orders/components/use-transition-order-to-state.tsx +151 -0
  177. package/src/app/routes/_authenticated/_orders/hooks/use-refund-order.ts +345 -0
  178. package/src/app/routes/_authenticated/_orders/orders.graphql.ts +817 -0
  179. package/src/app/routes/_authenticated/_orders/orders.tsx +120 -0
  180. package/src/app/routes/_authenticated/_orders/orders_.$aggregateOrderId_.seller-orders.$sellerOrderId.tsx +50 -0
  181. package/src/app/routes/_authenticated/_orders/orders_.$id.tsx +30 -0
  182. package/src/app/routes/_authenticated/_orders/orders_.$id_.modify.tsx +312 -0
  183. package/src/app/routes/_authenticated/_orders/orders_.draft.$id.tsx +513 -0
  184. package/src/app/routes/_authenticated/_orders/utils/order-detail-loaders.tsx +140 -0
  185. package/src/app/routes/_authenticated/_orders/utils/order-types.ts +10 -0
  186. package/src/app/routes/_authenticated/_orders/utils/order-utils.ts +219 -0
  187. package/src/app/routes/_authenticated/_orders/utils/refund-utils.ts +100 -0
  188. package/src/app/routes/_authenticated/_orders/utils/use-modify-order.ts +350 -0
  189. package/src/app/routes/_authenticated/_payment-methods/components/payment-eligibility-checker-selector.tsx +40 -0
  190. package/src/app/routes/_authenticated/_payment-methods/components/payment-handler-selector.tsx +39 -0
  191. package/src/app/routes/_authenticated/_payment-methods/components/payment-method-bulk-actions.tsx +58 -0
  192. package/src/app/routes/_authenticated/_payment-methods/payment-methods.graphql.ts +110 -0
  193. package/src/app/routes/_authenticated/_payment-methods/payment-methods.tsx +88 -0
  194. package/src/app/routes/_authenticated/_payment-methods/payment-methods_.$id.tsx +213 -0
  195. package/src/app/routes/_authenticated/_product-variants/components/add-currency-dropdown.tsx +49 -0
  196. package/src/app/routes/_authenticated/_product-variants/components/add-stock-location-dropdown.tsx +56 -0
  197. package/src/app/routes/_authenticated/_product-variants/components/product-variant-bulk-actions.tsx +110 -0
  198. package/src/app/routes/_authenticated/_product-variants/components/variant-price-detail.tsx +92 -0
  199. package/src/app/routes/_authenticated/_product-variants/product-variants.graphql.ts +213 -0
  200. package/src/app/routes/_authenticated/_product-variants/product-variants.tsx +115 -0
  201. package/src/app/routes/_authenticated/_product-variants/product-variants_.$id.tsx +490 -0
  202. package/src/app/routes/_authenticated/_products/components/add-option-group-dialog.tsx +127 -0
  203. package/src/app/routes/_authenticated/_products/components/add-product-variant-dialog.tsx +372 -0
  204. package/src/app/routes/_authenticated/_products/components/assign-facet-values-dialog.tsx +282 -0
  205. package/src/app/routes/_authenticated/_products/components/create-product-options-dialog.tsx +416 -0
  206. package/src/app/routes/_authenticated/_products/components/create-product-variants-dialog.tsx +190 -0
  207. package/src/app/routes/_authenticated/_products/components/create-product-variants.tsx +370 -0
  208. package/src/app/routes/_authenticated/_products/components/option-groups-editor.tsx +180 -0
  209. package/src/app/routes/_authenticated/_products/components/option-value-input.tsx +72 -0
  210. package/src/app/routes/_authenticated/_products/components/product-bulk-actions.tsx +117 -0
  211. package/src/app/routes/_authenticated/_products/components/product-option-group-badge.tsx +19 -0
  212. package/src/app/routes/_authenticated/_products/components/product-option-select.tsx +111 -0
  213. package/src/app/routes/_authenticated/_products/components/product-options-table.tsx +114 -0
  214. package/src/app/routes/_authenticated/_products/components/product-variants-table.tsx +120 -0
  215. package/src/app/routes/_authenticated/_products/product-option-groups.graphql.ts +103 -0
  216. package/src/app/routes/_authenticated/_products/products.graphql.ts +352 -0
  217. package/src/app/routes/_authenticated/_products/products.tsx +138 -0
  218. package/src/app/routes/_authenticated/_products/products_.$id.tsx +258 -0
  219. package/src/app/routes/_authenticated/_products/products_.$id_.variants.tsx +430 -0
  220. package/src/app/routes/_authenticated/_products/products_.$productId.option-groups.$id.tsx +177 -0
  221. package/src/app/routes/_authenticated/_products/products_.$productId.option-groups.$productOptionGroupId.options_.$id.tsx +204 -0
  222. package/src/app/routes/_authenticated/_profile/profile.graphql.ts +30 -0
  223. package/src/app/routes/_authenticated/_profile/profile.tsx +143 -0
  224. package/src/app/routes/_authenticated/_promotions/components/promotion-actions-selector.tsx +41 -0
  225. package/src/app/routes/_authenticated/_promotions/components/promotion-bulk-actions.tsx +72 -0
  226. package/src/app/routes/_authenticated/_promotions/components/promotion-conditions-selector.tsx +41 -0
  227. package/src/app/routes/_authenticated/_promotions/promotions.graphql.ts +121 -0
  228. package/src/app/routes/_authenticated/_promotions/promotions.tsx +94 -0
  229. package/src/app/routes/_authenticated/_promotions/promotions_.$id.tsx +261 -0
  230. package/src/app/routes/_authenticated/_roles/components/expandable-permissions.tsx +54 -0
  231. package/src/app/routes/_authenticated/_roles/components/permissions-table-grid.tsx +251 -0
  232. package/src/app/routes/_authenticated/_roles/components/role-bulk-actions.tsx +15 -0
  233. package/src/app/routes/_authenticated/_roles/roles.graphql.ts +76 -0
  234. package/src/app/routes/_authenticated/_roles/roles.tsx +99 -0
  235. package/src/app/routes/_authenticated/_roles/roles_.$id.tsx +146 -0
  236. package/src/app/routes/_authenticated/_sellers/components/seller-bulk-actions.tsx +15 -0
  237. package/src/app/routes/_authenticated/_sellers/sellers.graphql.ts +70 -0
  238. package/src/app/routes/_authenticated/_sellers/sellers.tsx +56 -0
  239. package/src/app/routes/_authenticated/_sellers/sellers_.$id.tsx +112 -0
  240. package/src/app/routes/_authenticated/_shipping-methods/components/fulfillment-handler-selector.tsx +56 -0
  241. package/src/app/routes/_authenticated/_shipping-methods/components/metadata-badges.tsx +15 -0
  242. package/src/app/routes/_authenticated/_shipping-methods/components/price-display.tsx +21 -0
  243. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-calculator-selector.tsx +39 -0
  244. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-eligibility-checker-selector.tsx +39 -0
  245. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-method-bulk-actions.tsx +61 -0
  246. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-method-test-result-wrapper.tsx +87 -0
  247. package/src/app/routes/_authenticated/_shipping-methods/components/test-address-form.tsx +256 -0
  248. package/src/app/routes/_authenticated/_shipping-methods/components/test-order-builder.tsx +244 -0
  249. package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-methods-result.tsx +97 -0
  250. package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-methods-sheet.tsx +41 -0
  251. package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-methods.tsx +74 -0
  252. package/src/app/routes/_authenticated/_shipping-methods/components/test-single-method-result.tsx +90 -0
  253. package/src/app/routes/_authenticated/_shipping-methods/components/test-single-shipping-method-sheet.tsx +56 -0
  254. package/src/app/routes/_authenticated/_shipping-methods/components/test-single-shipping-method.tsx +82 -0
  255. package/src/app/routes/_authenticated/_shipping-methods/components/use-shipping-method-test-state.ts +67 -0
  256. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.graphql.ts +137 -0
  257. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.tsx +76 -0
  258. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods_.$id.tsx +209 -0
  259. package/src/app/routes/_authenticated/_stock-locations/components/stock-location-bulk-actions.tsx +58 -0
  260. package/src/app/routes/_authenticated/_stock-locations/stock-locations.graphql.ts +87 -0
  261. package/src/app/routes/_authenticated/_stock-locations/stock-locations.tsx +65 -0
  262. package/src/app/routes/_authenticated/_stock-locations/stock-locations_.$id.tsx +126 -0
  263. package/src/app/routes/_authenticated/_system/components/payload-dialog.tsx +41 -0
  264. package/src/app/routes/_authenticated/_system/healthchecks.tsx +100 -0
  265. package/src/app/routes/_authenticated/_system/job-queue.graphql.ts +54 -0
  266. package/src/app/routes/_authenticated/_system/job-queue.tsx +266 -0
  267. package/src/app/routes/_authenticated/_system/scheduled-tasks.tsx +249 -0
  268. package/src/app/routes/_authenticated/_tax-categories/components/tax-category-bulk-actions.tsx +15 -0
  269. package/src/app/routes/_authenticated/_tax-categories/tax-categories.graphql.ts +72 -0
  270. package/src/app/routes/_authenticated/_tax-categories/tax-categories.tsx +69 -0
  271. package/src/app/routes/_authenticated/_tax-categories/tax-categories_.$id.tsx +127 -0
  272. package/src/app/routes/_authenticated/_tax-rates/components/tax-rate-bulk-actions.tsx +15 -0
  273. package/src/app/routes/_authenticated/_tax-rates/tax-rates.graphql.ts +84 -0
  274. package/src/app/routes/_authenticated/_tax-rates/tax-rates.tsx +119 -0
  275. package/src/app/routes/_authenticated/_tax-rates/tax-rates_.$id.tsx +149 -0
  276. package/src/app/routes/_authenticated/_zones/components/zone-bulk-actions.tsx +63 -0
  277. package/src/app/routes/_authenticated/_zones/components/zone-countries-add.tsx +0 -0
  278. package/src/app/routes/_authenticated/_zones/components/zone-countries-sheet.tsx +34 -0
  279. package/src/app/routes/_authenticated/_zones/components/zone-countries-table.tsx +94 -0
  280. package/src/app/routes/_authenticated/_zones/zones.graphql.ts +105 -0
  281. package/src/app/routes/_authenticated/_zones/zones.tsx +64 -0
  282. package/src/app/routes/_authenticated/_zones/zones_.$id.tsx +110 -0
  283. package/src/app/routes/_authenticated/index.tsx +233 -0
  284. package/src/app/routes/_authenticated.tsx +35 -0
  285. package/src/app/routes/login.tsx +49 -0
  286. package/src/app/styles.css +100 -0
  287. package/src/app/tailwindcss-animate.css +275 -0
  288. package/src/i18n/common-strings.ts +123 -0
  289. package/src/i18n/locales/ar.po +5250 -0
  290. package/src/i18n/locales/bg.po +5287 -0
  291. package/src/i18n/locales/cs.po +5250 -0
  292. package/src/i18n/locales/de.po +5250 -0
  293. package/src/i18n/locales/el.po +5311 -0
  294. package/src/i18n/locales/en.po +5285 -0
  295. package/src/i18n/locales/es.po +5250 -0
  296. package/src/i18n/locales/fa.po +5250 -0
  297. package/src/i18n/locales/fr.po +5250 -0
  298. package/src/i18n/locales/he.po +5250 -0
  299. package/src/i18n/locales/hr.po +5250 -0
  300. package/src/i18n/locales/it.po +5250 -0
  301. package/src/i18n/locales/ja.po +5250 -0
  302. package/src/i18n/locales/ko.po +4628 -0
  303. package/src/i18n/locales/nb.po +5250 -0
  304. package/src/i18n/locales/ne.po +5250 -0
  305. package/src/i18n/locales/nl.po +4628 -0
  306. package/src/i18n/locales/pl.po +5250 -0
  307. package/src/i18n/locales/pt_BR.po +5250 -0
  308. package/src/i18n/locales/pt_PT.po +5250 -0
  309. package/src/i18n/locales/ru.po +5250 -0
  310. package/src/i18n/locales/sv.po +5250 -0
  311. package/src/i18n/locales/tr.po +5250 -0
  312. package/src/i18n/locales/uk.po +5250 -0
  313. package/src/i18n/locales/zh_Hans.po +5250 -0
  314. package/src/i18n/locales/zh_Hant.po +5250 -0
  315. package/src/lib/components/data-display/boolean.tsx +23 -0
  316. package/src/lib/components/data-display/date-time.tsx +19 -0
  317. package/src/lib/components/data-display/json.tsx +20 -0
  318. package/src/lib/components/data-display/money.tsx +14 -0
  319. package/src/lib/components/data-input/affixed-input.stories.tsx +93 -0
  320. package/src/lib/components/data-input/affixed-input.tsx +79 -0
  321. package/src/lib/components/data-input/boolean-input.stories.tsx +102 -0
  322. package/src/lib/components/data-input/boolean-input.tsx +16 -0
  323. package/src/lib/components/data-input/checkbox-input.stories.tsx +61 -0
  324. package/src/lib/components/data-input/checkbox-input.tsx +15 -0
  325. package/src/lib/components/data-input/combination-mode-input.tsx +64 -0
  326. package/src/lib/components/data-input/configurable-operation-list-input.tsx +59 -0
  327. package/src/lib/components/data-input/custom-field-list-input.tsx +294 -0
  328. package/src/lib/components/data-input/customer-group-input.tsx +61 -0
  329. package/src/lib/components/data-input/datetime-input.stories.tsx +62 -0
  330. package/src/lib/components/data-input/datetime-input.tsx +210 -0
  331. package/src/lib/components/data-input/default-relation-input.tsx +626 -0
  332. package/src/lib/components/data-input/facet-value-input.tsx +78 -0
  333. package/src/lib/components/data-input/index.ts +24 -0
  334. package/src/lib/components/data-input/money-input.stories.tsx +88 -0
  335. package/src/lib/components/data-input/money-input.tsx +117 -0
  336. package/src/lib/components/data-input/number-input.stories.tsx +103 -0
  337. package/src/lib/components/data-input/number-input.tsx +85 -0
  338. package/src/lib/components/data-input/password-form-input.stories.tsx +65 -0
  339. package/src/lib/components/data-input/password-form-input.tsx +23 -0
  340. package/src/lib/components/data-input/product-multi-selector-input.tsx +416 -0
  341. package/src/lib/components/data-input/relation-input.tsx +165 -0
  342. package/src/lib/components/data-input/relation-selector.tsx +476 -0
  343. package/src/lib/components/data-input/rich-text-input.stories.tsx +92 -0
  344. package/src/lib/components/data-input/rich-text-input.tsx +16 -0
  345. package/src/lib/components/data-input/select-with-options.tsx +112 -0
  346. package/src/lib/components/data-input/slug-input.stories.tsx +232 -0
  347. package/src/lib/components/data-input/slug-input.tsx +290 -0
  348. package/src/lib/components/data-input/string-list-input.tsx +268 -0
  349. package/src/lib/components/data-input/struct-form-input.tsx +352 -0
  350. package/src/lib/components/data-input/text-input.stories.tsx +52 -0
  351. package/src/lib/components/data-input/text-input.tsx +16 -0
  352. package/src/lib/components/data-input/textarea-input.stories.tsx +55 -0
  353. package/src/lib/components/data-input/textarea-input.tsx +23 -0
  354. package/src/lib/components/data-table/add-filter-menu.tsx +64 -0
  355. package/src/lib/components/data-table/column-header-wrapper.tsx +106 -0
  356. package/src/lib/components/data-table/data-table-bulk-action-item.tsx +141 -0
  357. package/src/lib/components/data-table/data-table-bulk-actions.tsx +100 -0
  358. package/src/lib/components/data-table/data-table-column-header.tsx +50 -0
  359. package/src/lib/components/data-table/data-table-context.tsx +98 -0
  360. package/src/lib/components/data-table/data-table-facet-value-faceted-filter.tsx +308 -0
  361. package/src/lib/components/data-table/data-table-faceted-filter.tsx +195 -0
  362. package/src/lib/components/data-table/data-table-filter-badge-editable.tsx +35 -0
  363. package/src/lib/components/data-table/data-table-filter-badge.tsx +115 -0
  364. package/src/lib/components/data-table/data-table-filter-dialog.tsx +92 -0
  365. package/src/lib/components/data-table/data-table-pagination.tsx +105 -0
  366. package/src/lib/components/data-table/data-table-utils.ts +313 -0
  367. package/src/lib/components/data-table/data-table-view-options.tsx +132 -0
  368. package/src/lib/components/data-table/data-table.stories.tsx +249 -0
  369. package/src/lib/components/data-table/data-table.tsx +554 -0
  370. package/src/lib/components/data-table/filters/data-table-boolean-filter.tsx +60 -0
  371. package/src/lib/components/data-table/filters/data-table-datetime-filter.tsx +159 -0
  372. package/src/lib/components/data-table/filters/data-table-id-filter.tsx +63 -0
  373. package/src/lib/components/data-table/filters/data-table-number-filter.tsx +123 -0
  374. package/src/lib/components/data-table/filters/data-table-string-filter.tsx +79 -0
  375. package/src/lib/components/data-table/global-views-bar.tsx +97 -0
  376. package/src/lib/components/data-table/global-views-sheet.tsx +11 -0
  377. package/src/lib/components/data-table/human-readable-operator.tsx +65 -0
  378. package/src/lib/components/data-table/manage-global-views-button.tsx +26 -0
  379. package/src/lib/components/data-table/my-views-button.tsx +47 -0
  380. package/src/lib/components/data-table/refresh-button.tsx +49 -0
  381. package/src/lib/components/data-table/save-view-button.tsx +45 -0
  382. package/src/lib/components/data-table/save-view-dialog.tsx +134 -0
  383. package/src/lib/components/data-table/types.ts +40 -0
  384. package/src/lib/components/data-table/use-all-bulk-actions.ts +19 -0
  385. package/src/lib/components/data-table/use-generated-columns.tsx +418 -0
  386. package/src/lib/components/data-table/user-views-sheet.tsx +11 -0
  387. package/src/lib/components/data-table/views-sheet.tsx +305 -0
  388. package/src/lib/components/date-range-picker.tsx +186 -0
  389. package/src/lib/components/labeled-data.tsx +21 -0
  390. package/src/lib/components/layout/app-layout.tsx +35 -0
  391. package/src/lib/components/layout/app-sidebar.tsx +37 -0
  392. package/src/lib/components/layout/channel-switcher.tsx +228 -0
  393. package/src/lib/components/layout/content-language-selector.tsx +46 -0
  394. package/src/lib/components/layout/dev-mode-indicator.tsx +18 -0
  395. package/src/lib/components/layout/generated-breadcrumbs.tsx +136 -0
  396. package/src/lib/components/layout/language-dialog.tsx +133 -0
  397. package/src/lib/components/layout/manage-languages-dialog.tsx +387 -0
  398. package/src/lib/components/layout/nav-item-wrapper.tsx +107 -0
  399. package/src/lib/components/layout/nav-main.tsx +331 -0
  400. package/src/lib/components/layout/nav-projects.tsx +81 -0
  401. package/src/lib/components/layout/nav-user.tsx +180 -0
  402. package/src/lib/components/login/login-form.tsx +124 -0
  403. package/src/lib/components/shared/alerts.tsx +52 -0
  404. package/src/lib/components/shared/animated-number.tsx +49 -0
  405. package/src/lib/components/shared/asset/asset-bulk-actions.tsx +109 -0
  406. package/src/lib/components/shared/asset/asset-focal-point-editor.tsx +103 -0
  407. package/src/lib/components/shared/asset/asset-gallery.stories.tsx +76 -0
  408. package/src/lib/components/shared/asset/asset-gallery.tsx +623 -0
  409. package/src/lib/components/shared/asset/asset-picker-dialog.stories.tsx +58 -0
  410. package/src/lib/components/shared/asset/asset-picker-dialog.tsx +109 -0
  411. package/src/lib/components/shared/asset/asset-preview-dialog.tsx +38 -0
  412. package/src/lib/components/shared/asset/asset-preview-selector.tsx +32 -0
  413. package/src/lib/components/shared/asset/asset-preview.tsx +114 -0
  414. package/src/lib/components/shared/asset/asset-properties.tsx +44 -0
  415. package/src/lib/components/shared/assign-to-channel-bulk-action.tsx +71 -0
  416. package/src/lib/components/shared/assign-to-channel-dialog.tsx +156 -0
  417. package/src/lib/components/shared/assigned-channels.tsx +108 -0
  418. package/src/lib/components/shared/assigned-facet-values.tsx +61 -0
  419. package/src/lib/components/shared/channel-chip.tsx +43 -0
  420. package/src/lib/components/shared/channel-code-label.tsx +6 -0
  421. package/src/lib/components/shared/channel-selector.tsx +51 -0
  422. package/src/lib/components/shared/configurable-operation-arg-input.tsx +29 -0
  423. package/src/lib/components/shared/configurable-operation-input.tsx +190 -0
  424. package/src/lib/components/shared/configurable-operation-multi-selector.tsx +308 -0
  425. package/src/lib/components/shared/configurable-operation-selector.tsx +161 -0
  426. package/src/lib/components/shared/confirmation-dialog.tsx +58 -0
  427. package/src/lib/components/shared/copyable-text.tsx +30 -0
  428. package/src/lib/components/shared/country-selector.tsx +108 -0
  429. package/src/lib/components/shared/currency-selector.tsx +33 -0
  430. package/src/lib/components/shared/custom-fields-form.tsx +305 -0
  431. package/src/lib/components/shared/customer-address-form.tsx +338 -0
  432. package/src/lib/components/shared/customer-group-chip.tsx +30 -0
  433. package/src/lib/components/shared/customer-group-selector.tsx +65 -0
  434. package/src/lib/components/shared/customer-selector.tsx +112 -0
  435. package/src/lib/components/shared/detail-page-button.stories.tsx +52 -0
  436. package/src/lib/components/shared/detail-page-button.tsx +59 -0
  437. package/src/lib/components/shared/entity-assets.tsx +411 -0
  438. package/src/lib/components/shared/error-page.tsx +31 -0
  439. package/src/lib/components/shared/facet-value-chip.tsx +59 -0
  440. package/src/lib/components/shared/facet-value-selector.stories.tsx +48 -0
  441. package/src/lib/components/shared/facet-value-selector.tsx +274 -0
  442. package/src/lib/components/shared/form-field-wrapper.tsx +111 -0
  443. package/src/lib/components/shared/history-timeline/history-entry-date.tsx +37 -0
  444. package/src/lib/components/shared/history-timeline/history-note-checkbox.tsx +28 -0
  445. package/src/lib/components/shared/history-timeline/history-note-editor.tsx +60 -0
  446. package/src/lib/components/shared/history-timeline/history-note-entry.tsx +65 -0
  447. package/src/lib/components/shared/history-timeline/history-note-input.tsx +39 -0
  448. package/src/lib/components/shared/history-timeline/history-timeline-with-grouping.tsx +144 -0
  449. package/src/lib/components/shared/history-timeline/history-timeline.tsx +16 -0
  450. package/src/lib/components/shared/history-timeline/use-history-note-editor.ts +26 -0
  451. package/src/lib/components/shared/icon-mark.tsx +18 -0
  452. package/src/lib/components/shared/language-selector.tsx +56 -0
  453. package/src/lib/components/shared/logo-mark.tsx +24 -0
  454. package/src/lib/components/shared/multi-select.tsx +159 -0
  455. package/src/lib/components/shared/navigation-confirmation.tsx +64 -0
  456. package/src/lib/components/shared/option-value-input.tsx +97 -0
  457. package/src/lib/components/shared/paginated-list-context.ts +10 -0
  458. package/src/lib/components/shared/paginated-list-data-table.stories.tsx +212 -0
  459. package/src/lib/components/shared/paginated-list-data-table.tsx +497 -0
  460. package/src/lib/components/shared/permission-guard.stories.tsx +46 -0
  461. package/src/lib/components/shared/permission-guard.tsx +51 -0
  462. package/src/lib/components/shared/product-variant-selector.tsx +136 -0
  463. package/src/lib/components/shared/remove-from-channel-bulk-action.tsx +93 -0
  464. package/src/lib/components/shared/rich-text-editor/image-dialog.tsx +223 -0
  465. package/src/lib/components/shared/rich-text-editor/link-dialog.tsx +151 -0
  466. package/src/lib/components/shared/rich-text-editor/responsive-toolbar.tsx +443 -0
  467. package/src/lib/components/shared/rich-text-editor/rich-text-editor.tsx +339 -0
  468. package/src/lib/components/shared/rich-text-editor/table-delete-menu.tsx +104 -0
  469. package/src/lib/components/shared/rich-text-editor/table-edit-icons.tsx +225 -0
  470. package/src/lib/components/shared/role-code-label.tsx +12 -0
  471. package/src/lib/components/shared/role-selector.tsx +56 -0
  472. package/src/lib/components/shared/seller-selector.tsx +111 -0
  473. package/src/lib/components/shared/stock-level-label.tsx +22 -0
  474. package/src/lib/components/shared/table-cell/order-table-cell-components.tsx +80 -0
  475. package/src/lib/components/shared/tax-category-selector.tsx +65 -0
  476. package/src/lib/components/shared/translatable-form-field.tsx +149 -0
  477. package/src/lib/components/shared/vendure-image.stories.tsx +167 -0
  478. package/src/lib/components/shared/vendure-image.tsx +307 -0
  479. package/src/lib/components/shared/zone-selector.tsx +65 -0
  480. package/src/lib/components/ui/accordion.stories.tsx +33 -0
  481. package/src/lib/components/ui/accordion.tsx +59 -0
  482. package/src/lib/components/ui/alert-dialog.stories.tsx +48 -0
  483. package/src/lib/components/ui/alert-dialog.tsx +128 -0
  484. package/src/lib/components/ui/alert.stories.tsx +35 -0
  485. package/src/lib/components/ui/alert.tsx +62 -0
  486. package/src/lib/components/ui/aspect-ratio.stories.tsx +28 -0
  487. package/src/lib/components/ui/aspect-ratio.tsx +9 -0
  488. package/src/lib/components/ui/badge.stories.tsx +28 -0
  489. package/src/lib/components/ui/badge.tsx +38 -0
  490. package/src/lib/components/ui/breadcrumb.stories.tsx +41 -0
  491. package/src/lib/components/ui/breadcrumb.tsx +102 -0
  492. package/src/lib/components/ui/button.stories.tsx +38 -0
  493. package/src/lib/components/ui/button.tsx +58 -0
  494. package/src/lib/components/ui/calendar.stories.tsx +22 -0
  495. package/src/lib/components/ui/calendar.tsx +447 -0
  496. package/src/lib/components/ui/card.stories.tsx +28 -0
  497. package/src/lib/components/ui/card.tsx +47 -0
  498. package/src/lib/components/ui/carousel.stories.tsx +34 -0
  499. package/src/lib/components/ui/carousel.tsx +241 -0
  500. package/src/lib/components/ui/chart.tsx +351 -0
  501. package/src/lib/components/ui/checkbox.stories.tsx +31 -0
  502. package/src/lib/components/ui/checkbox.tsx +27 -0
  503. package/src/lib/components/ui/collapsible.stories.tsx +39 -0
  504. package/src/lib/components/ui/collapsible.tsx +33 -0
  505. package/src/lib/components/ui/command.stories.tsx +44 -0
  506. package/src/lib/components/ui/command.tsx +139 -0
  507. package/src/lib/components/ui/context-menu.stories.tsx +38 -0
  508. package/src/lib/components/ui/context-menu.tsx +252 -0
  509. package/src/lib/components/ui/dialog.stories.tsx +52 -0
  510. package/src/lib/components/ui/dialog.tsx +116 -0
  511. package/src/lib/components/ui/drawer.stories.tsx +50 -0
  512. package/src/lib/components/ui/drawer.tsx +133 -0
  513. package/src/lib/components/ui/dropdown-menu.stories.tsx +41 -0
  514. package/src/lib/components/ui/dropdown-menu.tsx +223 -0
  515. package/src/lib/components/ui/form.tsx +141 -0
  516. package/src/lib/components/ui/grid-layout.tsx +376 -0
  517. package/src/lib/components/ui/hover-card.stories.tsx +38 -0
  518. package/src/lib/components/ui/hover-card.tsx +36 -0
  519. package/src/lib/components/ui/input-group.tsx +149 -0
  520. package/src/lib/components/ui/input-otp.stories.tsx +30 -0
  521. package/src/lib/components/ui/input-otp.tsx +77 -0
  522. package/src/lib/components/ui/input.stories.tsx +38 -0
  523. package/src/lib/components/ui/input.tsx +19 -0
  524. package/src/lib/components/ui/label.stories.tsx +24 -0
  525. package/src/lib/components/ui/label.tsx +21 -0
  526. package/src/lib/components/ui/menubar.stories.tsx +53 -0
  527. package/src/lib/components/ui/menubar.tsx +274 -0
  528. package/src/lib/components/ui/navigation-menu.stories.tsx +54 -0
  529. package/src/lib/components/ui/navigation-menu.tsx +168 -0
  530. package/src/lib/components/ui/pagination.stories.tsx +51 -0
  531. package/src/lib/components/ui/pagination.tsx +106 -0
  532. package/src/lib/components/ui/password-input.stories.tsx +32 -0
  533. package/src/lib/components/ui/password-input.tsx +29 -0
  534. package/src/lib/components/ui/popover.stories.tsx +33 -0
  535. package/src/lib/components/ui/popover.tsx +40 -0
  536. package/src/lib/components/ui/progress.stories.tsx +27 -0
  537. package/src/lib/components/ui/progress.tsx +29 -0
  538. package/src/lib/components/ui/radio-group.stories.tsx +34 -0
  539. package/src/lib/components/ui/radio-group.tsx +45 -0
  540. package/src/lib/components/ui/resizable.stories.tsx +32 -0
  541. package/src/lib/components/ui/resizable.tsx +54 -0
  542. package/src/lib/components/ui/scroll-area.stories.tsx +31 -0
  543. package/src/lib/components/ui/scroll-area.tsx +50 -0
  544. package/src/lib/components/ui/select.stories.tsx +36 -0
  545. package/src/lib/components/ui/select.tsx +183 -0
  546. package/src/lib/components/ui/separator.stories.tsx +35 -0
  547. package/src/lib/components/ui/separator.tsx +26 -0
  548. package/src/lib/components/ui/sheet.stories.tsx +50 -0
  549. package/src/lib/components/ui/sheet.tsx +118 -0
  550. package/src/lib/components/ui/sidebar-context.ts +16 -0
  551. package/src/lib/components/ui/sidebar.tsx +686 -0
  552. package/src/lib/components/ui/skeleton.stories.tsx +26 -0
  553. package/src/lib/components/ui/skeleton.tsx +13 -0
  554. package/src/lib/components/ui/slider.stories.tsx +37 -0
  555. package/src/lib/components/ui/slider.tsx +63 -0
  556. package/src/lib/components/ui/sonner.tsx +27 -0
  557. package/src/lib/components/ui/switch.stories.tsx +31 -0
  558. package/src/lib/components/ui/switch.tsx +26 -0
  559. package/src/lib/components/ui/table.stories.tsx +52 -0
  560. package/src/lib/components/ui/table.tsx +82 -0
  561. package/src/lib/components/ui/tabs.stories.tsx +29 -0
  562. package/src/lib/components/ui/tabs.tsx +48 -0
  563. package/src/lib/components/ui/textarea.stories.tsx +32 -0
  564. package/src/lib/components/ui/textarea.tsx +18 -0
  565. package/src/lib/components/ui/toggle-group.stories.tsx +31 -0
  566. package/src/lib/components/ui/toggle-group.tsx +73 -0
  567. package/src/lib/components/ui/toggle.stories.tsx +39 -0
  568. package/src/lib/components/ui/toggle.tsx +45 -0
  569. package/src/lib/components/ui/tooltip.stories.tsx +30 -0
  570. package/src/lib/components/ui/tooltip.tsx +51 -0
  571. package/src/lib/constants.ts +24 -0
  572. package/src/lib/framework/alert/alert-extensions.tsx +19 -0
  573. package/src/lib/framework/alert/alert-item.tsx +44 -0
  574. package/src/lib/framework/alert/alerts-indicator.tsx +22 -0
  575. package/src/lib/framework/alert/search-index-buffer-alert/search-index-buffer-alert.ts +41 -0
  576. package/src/lib/framework/component-registry/component-registry.tsx +18 -0
  577. package/src/lib/framework/component-registry/display-component.tsx +28 -0
  578. package/src/lib/framework/dashboard-widget/base-widget.tsx +92 -0
  579. package/src/lib/framework/dashboard-widget/latest-orders-widget/index.tsx +153 -0
  580. package/src/lib/framework/dashboard-widget/latest-orders-widget/latest-orders-widget.graphql.ts +35 -0
  581. package/src/lib/framework/dashboard-widget/metrics-widget/chart.tsx +50 -0
  582. package/src/lib/framework/dashboard-widget/metrics-widget/index.tsx +108 -0
  583. package/src/lib/framework/dashboard-widget/metrics-widget/metrics-widget.graphql.ts +20 -0
  584. package/src/lib/framework/dashboard-widget/orders-summary/index.tsx +113 -0
  585. package/src/lib/framework/dashboard-widget/orders-summary/order-summary-widget.graphql.ts +14 -0
  586. package/src/lib/framework/dashboard-widget/widget-extensions.tsx +19 -0
  587. package/src/lib/framework/dashboard-widget/widget-filters-context.tsx +18 -0
  588. package/src/lib/framework/data-table/data-table-extensions.ts +35 -0
  589. package/src/lib/framework/defaults.ts +270 -0
  590. package/src/lib/framework/document-extension/extend-detail-form-query.ts +50 -0
  591. package/src/lib/framework/document-extension/extend-document.spec.ts +884 -0
  592. package/src/lib/framework/document-extension/extend-document.ts +159 -0
  593. package/src/lib/framework/document-introspection/add-custom-fields.spec.ts +1458 -0
  594. package/src/lib/framework/document-introspection/add-custom-fields.ts +452 -0
  595. package/src/lib/framework/document-introspection/get-document-structure.spec.ts +581 -0
  596. package/src/lib/framework/document-introspection/get-document-structure.ts +669 -0
  597. package/src/lib/framework/document-introspection/hooks.ts +13 -0
  598. package/src/lib/framework/document-introspection/include-only-selected-list-fields.spec.ts +1840 -0
  599. package/src/lib/framework/document-introspection/include-only-selected-list-fields.ts +940 -0
  600. package/src/lib/framework/document-introspection/testing-utils.ts +161 -0
  601. package/src/lib/framework/extension-api/define-dashboard-extension.ts +99 -0
  602. package/src/lib/framework/extension-api/display-component-extensions.tsx +58 -0
  603. package/src/lib/framework/extension-api/extension-api-types.ts +92 -0
  604. package/src/lib/framework/extension-api/input-component-extensions.tsx +100 -0
  605. package/src/lib/framework/extension-api/logic/alerts.ts +11 -0
  606. package/src/lib/framework/extension-api/logic/data-table.ts +37 -0
  607. package/src/lib/framework/extension-api/logic/detail-forms.ts +35 -0
  608. package/src/lib/framework/extension-api/logic/form-components.ts +14 -0
  609. package/src/lib/framework/extension-api/logic/history-entries.ts +24 -0
  610. package/src/lib/framework/extension-api/logic/index.ts +10 -0
  611. package/src/lib/framework/extension-api/logic/layout.ts +22 -0
  612. package/src/lib/framework/extension-api/logic/login.ts +17 -0
  613. package/src/lib/framework/extension-api/logic/navigation.ts +41 -0
  614. package/src/lib/framework/extension-api/logic/widgets.ts +10 -0
  615. package/src/lib/framework/extension-api/types/alerts.ts +59 -0
  616. package/src/lib/framework/extension-api/types/data-table.ts +159 -0
  617. package/src/lib/framework/extension-api/types/detail-forms.ts +58 -0
  618. package/src/lib/framework/extension-api/types/form-components.ts +41 -0
  619. package/src/lib/framework/extension-api/types/history-entries.ts +120 -0
  620. package/src/lib/framework/extension-api/types/index.ts +10 -0
  621. package/src/lib/framework/extension-api/types/layout.ts +141 -0
  622. package/src/lib/framework/extension-api/types/login.ts +76 -0
  623. package/src/lib/framework/extension-api/types/navigation.ts +105 -0
  624. package/src/lib/framework/extension-api/types/widgets.ts +101 -0
  625. package/src/lib/framework/extension-api/use-dashboard-extensions.ts +27 -0
  626. package/src/lib/framework/extension-api/use-login-extensions.ts +26 -0
  627. package/src/lib/framework/form-engine/custom-form-component-extensions.ts +15 -0
  628. package/src/lib/framework/form-engine/custom-form-component.tsx +26 -0
  629. package/src/lib/framework/form-engine/default-input-for-type.tsx +35 -0
  630. package/src/lib/framework/form-engine/form-control-adapter.tsx +193 -0
  631. package/src/lib/framework/form-engine/form-engine-types.ts +167 -0
  632. package/src/lib/framework/form-engine/form-schema-tools.spec.ts +683 -0
  633. package/src/lib/framework/form-engine/form-schema-tools.ts +440 -0
  634. package/src/lib/framework/form-engine/overridden-form-component.tsx +51 -0
  635. package/src/lib/framework/form-engine/use-generated-form.tsx +242 -0
  636. package/src/lib/framework/form-engine/utils.spec.ts +419 -0
  637. package/src/lib/framework/form-engine/utils.ts +457 -0
  638. package/src/lib/framework/form-engine/value-transformers.ts +156 -0
  639. package/src/lib/framework/history-entry/history-entry-extensions.ts +11 -0
  640. package/src/lib/framework/history-entry/history-entry.tsx +129 -0
  641. package/src/lib/framework/layout-engine/custom-form-page.stories.tsx +344 -0
  642. package/src/lib/framework/layout-engine/dev-mode-button.tsx +24 -0
  643. package/src/lib/framework/layout-engine/layout-extensions.ts +27 -0
  644. package/src/lib/framework/layout-engine/location-wrapper.tsx +122 -0
  645. package/src/lib/framework/layout-engine/page-block-provider.tsx +6 -0
  646. package/src/lib/framework/layout-engine/page-layout.spec.tsx +138 -0
  647. package/src/lib/framework/layout-engine/page-layout.tsx +700 -0
  648. package/src/lib/framework/layout-engine/page-provider.tsx +10 -0
  649. package/src/lib/framework/layout-engine/page.stories.tsx +275 -0
  650. package/src/lib/framework/nav-menu/nav-menu-extensions.ts +112 -0
  651. package/src/lib/framework/page/detail-page-route-loader.tsx +69 -0
  652. package/src/lib/framework/page/detail-page.stories.tsx +151 -0
  653. package/src/lib/framework/page/detail-page.tsx +240 -0
  654. package/src/lib/framework/page/list-page.stories.tsx +256 -0
  655. package/src/lib/framework/page/list-page.tsx +621 -0
  656. package/src/lib/framework/page/page-api.ts +9 -0
  657. package/src/lib/framework/page/page-types.ts +51 -0
  658. package/src/lib/framework/page/use-detail-page.ts +341 -0
  659. package/src/lib/framework/page/use-extended-router.tsx +139 -0
  660. package/src/lib/framework/registry/global-registry.ts +50 -0
  661. package/src/lib/framework/registry/registry-types.ts +32 -0
  662. package/src/lib/graphql/api.ts +123 -0
  663. package/src/lib/graphql/common-operations.ts +37 -0
  664. package/src/lib/graphql/fragments.ts +71 -0
  665. package/src/lib/graphql/graphql-env.d.ts +540 -0
  666. package/src/lib/graphql/graphql.ts +15 -0
  667. package/src/lib/graphql/schema-enums.ts +13 -0
  668. package/src/lib/graphql/settings-store-operations.ts +17 -0
  669. package/src/lib/hooks/use-alerts-context.ts +10 -0
  670. package/src/lib/hooks/use-alerts.ts +84 -0
  671. package/src/lib/hooks/use-auth.tsx +21 -0
  672. package/src/lib/hooks/use-channel.ts +27 -0
  673. package/src/lib/hooks/use-custom-field-config.ts +27 -0
  674. package/src/lib/hooks/use-data-table-context.ts +11 -0
  675. package/src/lib/hooks/use-display-locale.ts +40 -0
  676. package/src/lib/hooks/use-drag-and-drop.ts +86 -0
  677. package/src/lib/hooks/use-dynamic-translations.ts +53 -0
  678. package/src/lib/hooks/use-extended-detail-query.ts +37 -0
  679. package/src/lib/hooks/use-extended-list-query.ts +80 -0
  680. package/src/lib/hooks/use-facet-value-browser.ts +292 -0
  681. package/src/lib/hooks/use-floating-bulk-actions.ts +83 -0
  682. package/src/lib/hooks/use-grouped-permissions.ts +55 -0
  683. package/src/lib/hooks/use-job-queue-polling.ts +160 -0
  684. package/src/lib/hooks/use-local-format.ts +175 -0
  685. package/src/lib/hooks/use-mobile.ts +19 -0
  686. package/src/lib/hooks/use-page-block.tsx +27 -0
  687. package/src/lib/hooks/use-page.tsx +10 -0
  688. package/src/lib/hooks/use-paginated-list.ts +28 -0
  689. package/src/lib/hooks/use-permissions.ts +40 -0
  690. package/src/lib/hooks/use-saved-views.ts +238 -0
  691. package/src/lib/hooks/use-server-config.ts +4 -0
  692. package/src/lib/hooks/use-sorted-languages.ts +41 -0
  693. package/src/lib/hooks/use-theme.ts +10 -0
  694. package/src/lib/hooks/use-ui-language-loader.ts +30 -0
  695. package/src/lib/hooks/use-user-settings.tsx +12 -0
  696. package/src/lib/hooks/use-widget-dimensions.ts +12 -0
  697. package/src/lib/hooks/use-widget-filters.ts +21 -0
  698. package/src/lib/index.ts +307 -0
  699. package/src/lib/lib/load-i18n-messages.ts +20 -0
  700. package/src/lib/lib/trans.tsx +20 -0
  701. package/src/lib/lib/utils.ts +111 -0
  702. package/src/lib/providers/alerts-provider.tsx +52 -0
  703. package/src/lib/providers/auth.tsx +232 -0
  704. package/src/lib/providers/channel-provider.tsx +245 -0
  705. package/src/lib/providers/i18n-provider.tsx +21 -0
  706. package/src/lib/providers/server-config.tsx +289 -0
  707. package/src/lib/providers/theme-provider.tsx +56 -0
  708. package/src/lib/providers/user-settings.tsx +244 -0
  709. package/src/lib/types/saved-views.ts +42 -0
  710. package/src/lib/utils/config-utils.ts +19 -0
  711. package/src/lib/utils/saved-views-utils.ts +40 -0
  712. package/src/lib/virtual.d.ts +44 -0
  713. package/src/vite-env.d.ts +2 -0
@@ -0,0 +1,457 @@
1
+ import {
2
+ AllCustomFieldConfigs,
3
+ BooleanCustomFieldConfig,
4
+ BooleanStructField,
5
+ ConfigurableArgDef,
6
+ ConfigurableFieldDef,
7
+ DateTimeCustomFieldConfig,
8
+ DateTimeStructField,
9
+ FloatCustomFieldConfig,
10
+ FloatStructField,
11
+ IntCustomFieldConfig,
12
+ IntStructField,
13
+ LocaleStringCustomFieldConfig,
14
+ LocaleTextCustomFieldConfig,
15
+ RelationCustomFieldConfig,
16
+ StringCustomFieldConfig,
17
+ StringStructField,
18
+ StructCustomFieldConfig,
19
+ StructField,
20
+ TextCustomFieldConfig,
21
+ } from '@/vdb/framework/form-engine/form-engine-types.js';
22
+ import { FormEvent } from 'react';
23
+ import { UseFormReturn } from 'react-hook-form';
24
+
25
+ import { FieldInfo } from '../document-introspection/get-document-structure.js';
26
+
27
+ /**
28
+ * Transforms relation fields in an entity, extracting IDs from relation objects.
29
+ * This is primarily used for custom fields of type "ID".
30
+ *
31
+ * @param fields - Array of field information
32
+ * @param entity - The entity to transform
33
+ * @returns A new entity with transformed relation fields
34
+ */
35
+ export function transformRelationFields<E extends Record<string, any>>(fields: FieldInfo[], entity: E): E {
36
+ // Create a shallow copy to avoid mutating the original entity
37
+ const processedEntity = { ...entity, customFields: { ...(entity.customFields ?? {}) } };
38
+
39
+ // Skip processing if there are no custom fields
40
+ if (!entity.customFields || !processedEntity.customFields) {
41
+ return processedEntity;
42
+ }
43
+
44
+ // Find the customFields field info
45
+ const customFieldsInfo = fields.find(field => field.name === 'customFields' && field.typeInfo);
46
+ if (!customFieldsInfo?.typeInfo) {
47
+ return processedEntity;
48
+ }
49
+
50
+ // Process only ID type custom fields
51
+ const idTypeCustomFields = customFieldsInfo.typeInfo.filter(field => field.type === 'ID');
52
+
53
+ for (const customField of idTypeCustomFields) {
54
+ const relationField = customField.name;
55
+
56
+ if (customField.list) {
57
+ // For list fields, the accessor is the field name without the "Ids" suffix
58
+ const propertyAccessorKey = customField.name.replace(/Ids$/, '');
59
+ const relationValue = entity.customFields[propertyAccessorKey];
60
+
61
+ if (Array.isArray(relationValue)) {
62
+ processedEntity.customFields[relationField] = relationValue.map((v: { id: string }) => v.id);
63
+ }
64
+ delete processedEntity.customFields[propertyAccessorKey];
65
+ } else {
66
+ // For single fields, the accessor is the field name without the "Id" suffix
67
+ const propertyAccessorKey = customField.name.replace(/Id$/, '');
68
+ const relationValue = entity.customFields[propertyAccessorKey];
69
+ processedEntity.customFields[relationField] = relationValue?.id;
70
+ delete processedEntity.customFields[propertyAccessorKey];
71
+ }
72
+ }
73
+ return processedEntity;
74
+ }
75
+
76
+ /**
77
+ * @description
78
+ * Due to the schema types, sometimes "create" mutations will have a default empty "id"
79
+ * field which can cause issues if we actually send them with a "create" mutation to the server.
80
+ * This function deletes any empty ID fields on the entity or its nested objects.
81
+ */
82
+ export function removeEmptyIdFields<T extends Record<string, any>>(values: T, fields: FieldInfo[]): T {
83
+ if (!values) {
84
+ return values;
85
+ }
86
+
87
+ // Create a deep copy to avoid mutating the original values
88
+ const result = structuredClone(values);
89
+
90
+ function recursiveRemove(obj: any, fieldDefs: FieldInfo[]) {
91
+ if (Array.isArray(obj)) {
92
+ for (const item of obj) {
93
+ recursiveRemove(item, fieldDefs);
94
+ }
95
+ } else if (typeof obj === 'object' && obj !== null) {
96
+ for (const field of fieldDefs) {
97
+ // Remove empty string ID fields at this level
98
+ if (field.type === 'ID' && typeof obj[field.name] === 'string' && obj[field.name] === '') {
99
+ delete obj[field.name];
100
+ }
101
+ // If the field is an object or array, recurse into it
102
+ if (Array.isArray(obj[field.name])) {
103
+ if (field.typeInfo) {
104
+ for (const item of obj[field.name]) {
105
+ recursiveRemove(item, field.typeInfo);
106
+ }
107
+ }
108
+ } else if (
109
+ typeof obj[field.name] === 'object' &&
110
+ obj[field.name] !== null &&
111
+ field.typeInfo
112
+ ) {
113
+ recursiveRemove(obj[field.name], field.typeInfo);
114
+ }
115
+ }
116
+ }
117
+ }
118
+
119
+ recursiveRemove(result, fields);
120
+ return result;
121
+ }
122
+
123
+ /**
124
+ * Converts empty string values to null for nullable non-string fields before submission.
125
+ * This handles cases where user interaction (e.g. clearing a date picker) leaves
126
+ * empty strings that are invalid for non-string GraphQL types like DateTime or Enums.
127
+ */
128
+ export function convertEmptyStringsToNull<T extends Record<string, any>>(values: T, fields: FieldInfo[]): T {
129
+ if (!values) {
130
+ return values;
131
+ }
132
+ const result = structuredClone(values);
133
+
134
+ function processFields(obj: any, fieldDefs: FieldInfo[]) {
135
+ for (const field of fieldDefs) {
136
+ if (field.nullable && obj[field.name] === '' && field.type !== 'String') {
137
+ obj[field.name] = null;
138
+ }
139
+ if (field.typeInfo && typeof obj[field.name] === 'object' && obj[field.name] !== null) {
140
+ if (Array.isArray(obj[field.name])) {
141
+ for (const item of obj[field.name]) {
142
+ processFields(item, field.typeInfo);
143
+ }
144
+ } else {
145
+ processFields(obj[field.name], field.typeInfo);
146
+ }
147
+ }
148
+ }
149
+ }
150
+
151
+ processFields(result, fields);
152
+ return result;
153
+ }
154
+
155
+ /**
156
+ * Strips null-valued nullable fields from the payload so they are omitted
157
+ * rather than sent as explicit nulls. In GraphQL, omitting a field lets the
158
+ * server apply its own default, whereas sending null means "set to NULL".
159
+ * This is only used for create mutations, to avoid sending explicit nulls for
160
+ * fields the user likely did not touch.
161
+ */
162
+ export function stripNullNullableFields<T extends Record<string, any>>(values: T, fields: FieldInfo[]): T {
163
+ if (!values) return values;
164
+ const result = structuredClone(values);
165
+
166
+ function processFields(obj: any, fieldDefs: FieldInfo[]) {
167
+ for (const field of fieldDefs) {
168
+ if (field.nullable && obj[field.name] === null) {
169
+ delete obj[field.name];
170
+ } else if (field.typeInfo && typeof obj[field.name] === 'object' && obj[field.name] !== null) {
171
+ if (Array.isArray(obj[field.name])) {
172
+ for (const item of obj[field.name]) {
173
+ processFields(item, field.typeInfo);
174
+ }
175
+ } else {
176
+ processFields(obj[field.name], field.typeInfo);
177
+ }
178
+ }
179
+ }
180
+ }
181
+
182
+ processFields(result, fields);
183
+ return result;
184
+ }
185
+
186
+ // =============================================================================
187
+ // TYPE GUARDS FOR CONFIGURABLE FIELD DEFINITIONS
188
+ // =============================================================================
189
+
190
+ /**
191
+ * Determines if a field definition is a custom field config (vs configurable operation arg)
192
+ */
193
+ export function isCustomFieldConfig(input: ConfigurableFieldDef): input is AllCustomFieldConfigs {
194
+ return input.hasOwnProperty('readonly');
195
+ }
196
+
197
+ /**
198
+ * Determines if a field definition is a configurable operation argument
199
+ */
200
+ export function isConfigurableArgDef(input: ConfigurableFieldDef): input is ConfigurableArgDef {
201
+ return !input.hasOwnProperty('readonly');
202
+ }
203
+
204
+ // =============================================================================
205
+ // TYPE GUARDS FOR SPECIFIC CUSTOM FIELD TYPES
206
+ // =============================================================================
207
+
208
+ /**
209
+ * String custom field with optional pattern and options
210
+ */
211
+ export function isStringCustomFieldConfig(input: ConfigurableFieldDef): input is StringCustomFieldConfig {
212
+ return input.type === 'string' && isCustomFieldConfig(input);
213
+ }
214
+
215
+ /**
216
+ * String custom field that has options (select dropdown)
217
+ */
218
+ export function isStringFieldWithOptions(input: ConfigurableFieldDef): input is StringCustomFieldConfig {
219
+ const isCustomFieldWithOptions =
220
+ input.type === 'string' &&
221
+ isCustomFieldConfig(input) &&
222
+ input.hasOwnProperty('options') &&
223
+ Array.isArray((input as any).options);
224
+ if (isCustomFieldWithOptions) {
225
+ return true;
226
+ }
227
+ const isConfigArgWithOptions =
228
+ input.type === 'string' && isConfigurableArgDef(input) && Array.isArray(input.ui?.options);
229
+ if (isConfigArgWithOptions) {
230
+ return true;
231
+ }
232
+ return false;
233
+ }
234
+
235
+ /**
236
+ * Locale string custom field
237
+ */
238
+ export function isLocaleStringCustomFieldConfig(
239
+ input: ConfigurableFieldDef,
240
+ ): input is LocaleStringCustomFieldConfig {
241
+ return input.type === 'localeString' && isCustomFieldConfig(input);
242
+ }
243
+
244
+ /**
245
+ * Text custom field (textarea)
246
+ */
247
+ export function isTextCustomFieldConfig(input: ConfigurableFieldDef): input is TextCustomFieldConfig {
248
+ return input.type === 'text' && isCustomFieldConfig(input);
249
+ }
250
+
251
+ /**
252
+ * Locale text custom field (localized textarea)
253
+ */
254
+ export function isLocaleTextCustomFieldConfig(
255
+ input: ConfigurableFieldDef,
256
+ ): input is LocaleTextCustomFieldConfig {
257
+ return input.type === 'localeText' && isCustomFieldConfig(input);
258
+ }
259
+
260
+ /**
261
+ * Boolean custom field
262
+ */
263
+ export function isBooleanCustomFieldConfig(input: ConfigurableFieldDef): input is BooleanCustomFieldConfig {
264
+ return input.type === 'boolean' && isCustomFieldConfig(input);
265
+ }
266
+
267
+ /**
268
+ * Integer custom field with optional min/max/step
269
+ */
270
+ export function isIntCustomFieldConfig(input: ConfigurableFieldDef): input is IntCustomFieldConfig {
271
+ return input.type === 'int' && isCustomFieldConfig(input);
272
+ }
273
+
274
+ /**
275
+ * Float custom field with optional min/max/step
276
+ */
277
+ export function isFloatCustomFieldConfig(input: ConfigurableFieldDef): input is FloatCustomFieldConfig {
278
+ return input.type === 'float' && isCustomFieldConfig(input);
279
+ }
280
+
281
+ /**
282
+ * DateTime custom field with optional min/max/step
283
+ */
284
+ export function isDateTimeCustomFieldConfig(input: ConfigurableFieldDef): input is DateTimeCustomFieldConfig {
285
+ return input.type === 'datetime' && isCustomFieldConfig(input);
286
+ }
287
+
288
+ /**
289
+ * Relation custom field (references another entity)
290
+ */
291
+ export function isRelationCustomFieldConfig(input: ConfigurableFieldDef): input is RelationCustomFieldConfig {
292
+ return input.type === 'relation' && isCustomFieldConfig(input);
293
+ }
294
+
295
+ /**
296
+ * Struct custom field (nested object with sub-fields)
297
+ */
298
+ export function isStructCustomFieldConfig(input: ConfigurableFieldDef): input is StructCustomFieldConfig {
299
+ return input.type === 'struct' && isCustomFieldConfig(input);
300
+ }
301
+
302
+ // Legacy alias for backward compatibility
303
+ export const isStructFieldConfig = isStructCustomFieldConfig;
304
+
305
+ // =============================================================================
306
+ // TYPE GUARDS FOR STRUCT FIELD TYPES (fields within struct custom fields)
307
+ // =============================================================================
308
+
309
+ /**
310
+ * String field within a struct custom field
311
+ */
312
+ export function isStringStructField(input: StructField): input is StringStructField {
313
+ return input.type === 'string';
314
+ }
315
+
316
+ /**
317
+ * String struct field that has options (select dropdown).
318
+ * Checks for options defined either directly or via ui.options.
319
+ */
320
+ export function isStringStructFieldWithOptions(
321
+ input: StructField,
322
+ ): input is StringStructField & { options: any[] } {
323
+ if (input.type !== 'string') {
324
+ return false;
325
+ }
326
+ // Check for direct options property
327
+ if (input.hasOwnProperty('options') && Array.isArray((input as any).options)) {
328
+ return true;
329
+ }
330
+ // Also check for ui.options (fallback pattern)
331
+ if (Array.isArray((input as any).ui?.options)) {
332
+ return true;
333
+ }
334
+ return false;
335
+ }
336
+
337
+ /**
338
+ * Extracts options from a field definition, normalizing the different locations
339
+ * where options can be defined (direct property or ui.options).
340
+ * Works for both ConfigurableFieldDef and StructField types.
341
+ */
342
+ export function extractFieldOptions(
343
+ field: ConfigurableFieldDef | StructField,
344
+ ): NonNullable<StringCustomFieldConfig['options']> {
345
+ // Check direct options property first
346
+ if ((field as any).options && Array.isArray((field as any).options)) {
347
+ return (field as any).options;
348
+ }
349
+ // Fall back to ui.options
350
+ if (field.ui?.options && Array.isArray(field.ui.options)) {
351
+ return field.ui.options;
352
+ }
353
+ return [];
354
+ }
355
+
356
+ /**
357
+ * Integer field within a struct custom field
358
+ */
359
+ export function isIntStructField(input: StructField): input is IntStructField {
360
+ return input.type === 'int';
361
+ }
362
+
363
+ /**
364
+ * Float field within a struct custom field
365
+ */
366
+ export function isFloatStructField(input: StructField): input is FloatStructField {
367
+ return input.type === 'float';
368
+ }
369
+
370
+ /**
371
+ * Boolean field within a struct custom field
372
+ */
373
+ export function isBooleanStructField(input: StructField): input is BooleanStructField {
374
+ return input.type === 'boolean';
375
+ }
376
+
377
+ /**
378
+ * DateTime field within a struct custom field
379
+ */
380
+ export function isDateTimeStructField(input: StructField): input is DateTimeStructField {
381
+ return input.type === 'datetime';
382
+ }
383
+
384
+ // =============================================================================
385
+ // UTILITY TYPE GUARDS
386
+ // =============================================================================
387
+
388
+ /**
389
+ * Determines if a field is a list/array field
390
+ */
391
+ export function isListField(input?: ConfigurableFieldDef): boolean {
392
+ return input && isCustomFieldConfig(input) ? Boolean(input.list) : false;
393
+ }
394
+
395
+ /**
396
+ * Determines if a field is readonly
397
+ */
398
+ export function isReadonlyField(input?: ConfigurableFieldDef): boolean {
399
+ return input && isCustomFieldConfig(input) ? Boolean(input.readonly) : false;
400
+ }
401
+
402
+ /**
403
+ * Determines if a field should be disabled based on the `disabled` prop from
404
+ * react-hook-form's Controller and the field's own readonly configuration.
405
+ *
406
+ * This centralises the disabled check so that every input component handles
407
+ * both sources of disabled state consistently.
408
+ */
409
+ export function isFieldDisabled(disabled?: boolean, fieldDef?: ConfigurableFieldDef): boolean {
410
+ return Boolean(disabled) || isReadonlyField(fieldDef);
411
+ }
412
+
413
+ /**
414
+ * Determines if a field requires special permissions
415
+ */
416
+ export function hasPermissionRequirement(input: ConfigurableFieldDef): boolean {
417
+ return isCustomFieldConfig(input) && Boolean(input.requiresPermission);
418
+ }
419
+
420
+ /**
421
+ * Determines if a field is nullable
422
+ */
423
+ export function isNullableField(input: ConfigurableFieldDef): boolean {
424
+ return isCustomFieldConfig(input) && Boolean(input.nullable);
425
+ }
426
+
427
+ /**
428
+ * Handles nested form submission to prevent event bubbling in nested forms.
429
+ * This is useful when you have a form inside a dialog that's within another form.
430
+ *
431
+ * @param form - The react-hook-form instance
432
+ * @param onSubmit - The submit handler function
433
+ * @returns An event handler that prevents propagation and handles the form submission
434
+ *
435
+ * @example
436
+ * ```tsx
437
+ * const form = useForm<FormSchema>({ resolver: zodResolver(formSchema) });
438
+ *
439
+ * return (
440
+ * <form onSubmit={handleNestedFormSubmit(form, (data) => {
441
+ * // Handle form submission
442
+ * })}>
443
+ * ...
444
+ * </form>
445
+ * );
446
+ * ```
447
+ */
448
+ export function handleNestedFormSubmit<TFieldValues extends Record<string, any>>(
449
+ form: UseFormReturn<TFieldValues>,
450
+ onSubmit: (data: TFieldValues) => void | Promise<void>,
451
+ ) {
452
+ return (e: FormEvent<HTMLFormElement>) => {
453
+ e.preventDefault();
454
+ e.stopPropagation();
455
+ void form.handleSubmit(onSubmit)(e);
456
+ };
457
+ }
@@ -0,0 +1,156 @@
1
+ import { ConfigurableFieldDef } from '@/vdb/framework/form-engine/form-engine-types.js';
2
+
3
+ export type ValueMode = 'native' | 'json-string';
4
+
5
+ /**
6
+ * Interface for transforming values between native JavaScript types and JSON strings
7
+ */
8
+ export interface ValueTransformer {
9
+ parse: (value: string, fieldDef: ConfigurableFieldDef) => any;
10
+ serialize: (value: any, fieldDef: ConfigurableFieldDef) => string;
11
+ }
12
+
13
+ /**
14
+ * Native value transformer - passes values through unchanged
15
+ */
16
+ export const nativeValueTransformer: ValueTransformer = {
17
+ parse: (value: string, fieldDef: ConfigurableFieldDef) => {
18
+ // For native mode, values are already in their correct JavaScript type
19
+ return value;
20
+ },
21
+ serialize: (value: any, fieldDef: ConfigurableFieldDef) => {
22
+ // For native mode, values are already in their correct JavaScript type
23
+ return value;
24
+ },
25
+ };
26
+
27
+ /**
28
+ * JSON string value transformer - converts between JSON strings and native values
29
+ */
30
+ export const jsonStringValueTransformer: ValueTransformer = {
31
+ parse: (value: string, fieldDef: ConfigurableFieldDef) => {
32
+ if (value === undefined) {
33
+ return getDefaultValue(fieldDef);
34
+ }
35
+ // This case arises often when the administrator is actively editing
36
+ // values and clears out the input. At that point, we don't want to suddenly
37
+ // switch to the default value otherwise it results in poor UX, e.g. pressing
38
+ // backspace to delete a number would result in `0` suddenly appearing as the value.
39
+ if (value === '') {
40
+ return value;
41
+ }
42
+
43
+ // For scalar string fields, return the raw value without JSON parsing.
44
+ // This prevents issues like "0" being parsed as number 0, or "-0" becoming -0 which is "0" in the input.
45
+ if (fieldDef.type === 'string' && !fieldDef.list) {
46
+ return value;
47
+ }
48
+
49
+ try {
50
+ // For JSON string mode, parse the string to get the native value
51
+ const parsed = JSON.parse(value);
52
+
53
+ // Handle special cases for different field types
54
+ switch (fieldDef.type) {
55
+ case 'boolean':
56
+ return parsed === true || parsed === 'true';
57
+ case 'int':
58
+ case 'float':
59
+ return typeof parsed === 'number' ? parsed : parseFloat(parsed) || 0;
60
+ case 'datetime':
61
+ return parsed;
62
+ default:
63
+ return parsed;
64
+ }
65
+ } catch (error) {
66
+ // If parsing fails, try to handle as a plain string for certain types
67
+ switch (fieldDef.type) {
68
+ case 'boolean':
69
+ return value === 'true';
70
+ case 'int':
71
+ case 'float':
72
+ return parseFloat(value) || 0;
73
+ default:
74
+ return value;
75
+ }
76
+ }
77
+ },
78
+ serialize: (value: any, fieldDef: ConfigurableFieldDef) => {
79
+ if (value === null || value === undefined) {
80
+ return '';
81
+ }
82
+
83
+ // Handle special cases for different field types
84
+ switch (fieldDef.type) {
85
+ case 'boolean':
86
+ return (value === true || value === 'true').toString();
87
+ case 'int':
88
+ case 'float':
89
+ return typeof value === 'number' ? value.toString() : (parseFloat(value) || 0).toString();
90
+ case 'string':
91
+ return typeof value === 'string' ? value : JSON.stringify(value);
92
+ default:
93
+ // For complex values (arrays, objects), serialize as JSON
94
+ return typeof value === 'string' ? value : JSON.stringify(value);
95
+ }
96
+ },
97
+ };
98
+
99
+ /**
100
+ * Get the appropriate value transformer based on the value mode
101
+ */
102
+ export function getValueTransformer(valueMode: ValueMode): ValueTransformer {
103
+ switch (valueMode) {
104
+ case 'native':
105
+ return nativeValueTransformer;
106
+ case 'json-string':
107
+ return jsonStringValueTransformer;
108
+ default:
109
+ return nativeValueTransformer;
110
+ }
111
+ }
112
+
113
+ /**
114
+ * Get default value for a field type
115
+ */
116
+ function getDefaultValue(fieldDef: ConfigurableFieldDef): any {
117
+ if (fieldDef.list) {
118
+ return [];
119
+ }
120
+
121
+ switch (fieldDef.type) {
122
+ case 'string':
123
+ case 'ID':
124
+ case 'localeString':
125
+ case 'localeText':
126
+ return '';
127
+ case 'int':
128
+ case 'float':
129
+ return 0;
130
+ case 'boolean':
131
+ return false;
132
+ case 'datetime':
133
+ return '';
134
+ case 'relation':
135
+ return fieldDef.list ? [] : null;
136
+ case 'struct':
137
+ return fieldDef.list ? [] : {};
138
+ default:
139
+ return '';
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Utility to transform a value using the appropriate transformer
145
+ */
146
+ export function transformValue(
147
+ value: any,
148
+ fieldDef: ConfigurableFieldDef,
149
+ valueMode: ValueMode,
150
+ direction: 'parse' | 'serialize',
151
+ ): any {
152
+ const transformer = getValueTransformer(valueMode);
153
+ return direction === 'parse'
154
+ ? transformer.parse(value, fieldDef)
155
+ : transformer.serialize(value, fieldDef);
156
+ }
@@ -0,0 +1,11 @@
1
+ import { DashboardHistoryEntryComponent } from '@/vdb/framework/extension-api/types/index.js';
2
+
3
+ import { globalRegistry } from '../registry/global-registry.js';
4
+
5
+ globalRegistry.register('historyEntries', new Map<string, DashboardHistoryEntryComponent['component']>());
6
+
7
+ export function getCustomHistoryEntryForType(
8
+ type: string,
9
+ ): DashboardHistoryEntryComponent['component'] | undefined {
10
+ return globalRegistry.get('historyEntries').get(type);
11
+ }