@leandrosk/dashboard 3.5.5

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 (643) hide show
  1. package/README.md +118 -0
  2. package/index.html +14 -0
  3. package/lingui.config.js +39 -0
  4. package/package.json +183 -0
  5. package/src/app/app-providers.tsx +31 -0
  6. package/src/app/common/delete-bulk-action.tsx +149 -0
  7. package/src/app/common/duplicate-bulk-action.tsx +147 -0
  8. package/src/app/common/duplicate-entity-dialog.tsx +117 -0
  9. package/src/app/common/map-faceted-filter-fields.ts +21 -0
  10. package/src/app/common/set-document-direction.ts +7 -0
  11. package/src/app/common/use-page-title.test.ts +263 -0
  12. package/src/app/common/use-page-title.ts +86 -0
  13. package/src/app/main.tsx +134 -0
  14. package/src/app/routeTree.gen.ts +1284 -0
  15. package/src/app/routes/__root.tsx +23 -0
  16. package/src/app/routes/_authenticated/_administrators/administrators.graphql.ts +88 -0
  17. package/src/app/routes/_authenticated/_administrators/administrators.tsx +104 -0
  18. package/src/app/routes/_authenticated/_administrators/administrators_.$id.tsx +160 -0
  19. package/src/app/routes/_authenticated/_administrators/components/administrator-bulk-actions.tsx +15 -0
  20. package/src/app/routes/_authenticated/_administrators/components/role-permissions-display.tsx +133 -0
  21. package/src/app/routes/_authenticated/_assets/assets.graphql.ts +76 -0
  22. package/src/app/routes/_authenticated/_assets/assets.tsx +48 -0
  23. package/src/app/routes/_authenticated/_assets/assets_.$id.tsx +181 -0
  24. package/src/app/routes/_authenticated/_assets/components/asset-bulk-actions.tsx +47 -0
  25. package/src/app/routes/_authenticated/_assets/components/asset-tag-filter.tsx +206 -0
  26. package/src/app/routes/_authenticated/_assets/components/asset-tags-editor.tsx +226 -0
  27. package/src/app/routes/_authenticated/_assets/components/manage-tags-dialog.tsx +212 -0
  28. package/src/app/routes/_authenticated/_channels/channels.graphql.ts +102 -0
  29. package/src/app/routes/_authenticated/_channels/channels.tsx +81 -0
  30. package/src/app/routes/_authenticated/_channels/channels_.$id.tsx +251 -0
  31. package/src/app/routes/_authenticated/_channels/components/channel-bulk-actions.tsx +15 -0
  32. package/src/app/routes/_authenticated/_collections/collections.graphql.ts +191 -0
  33. package/src/app/routes/_authenticated/_collections/collections.tsx +458 -0
  34. package/src/app/routes/_authenticated/_collections/collections_.$id.tsx +267 -0
  35. package/src/app/routes/_authenticated/_collections/components/collection-bulk-actions.tsx +130 -0
  36. package/src/app/routes/_authenticated/_collections/components/collection-contents-preview-table.tsx +153 -0
  37. package/src/app/routes/_authenticated/_collections/components/collection-contents-sheet.tsx +50 -0
  38. package/src/app/routes/_authenticated/_collections/components/collection-contents-table.tsx +83 -0
  39. package/src/app/routes/_authenticated/_collections/components/collection-filters-selector.tsx +30 -0
  40. package/src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx +433 -0
  41. package/src/app/routes/_authenticated/_countries/components/country-bulk-actions.tsx +15 -0
  42. package/src/app/routes/_authenticated/_countries/countries.graphql.ts +82 -0
  43. package/src/app/routes/_authenticated/_countries/countries.tsx +72 -0
  44. package/src/app/routes/_authenticated/_countries/countries_.$id.tsx +123 -0
  45. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-bulk-actions.tsx +15 -0
  46. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-sheet.tsx +51 -0
  47. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-table.tsx +134 -0
  48. package/src/app/routes/_authenticated/_customer-groups/customer-groups.graphql.ts +80 -0
  49. package/src/app/routes/_authenticated/_customer-groups/customer-groups.tsx +72 -0
  50. package/src/app/routes/_authenticated/_customer-groups/customer-groups_.$id.tsx +121 -0
  51. package/src/app/routes/_authenticated/_customers/components/customer-address-card.tsx +155 -0
  52. package/src/app/routes/_authenticated/_customers/components/customer-address-form.tsx +347 -0
  53. package/src/app/routes/_authenticated/_customers/components/customer-bulk-actions.tsx +15 -0
  54. package/src/app/routes/_authenticated/_customers/components/customer-group-controls.tsx +4 -0
  55. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-container.tsx +78 -0
  56. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-types.ts +5 -0
  57. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-utils.tsx +124 -0
  58. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history.tsx +113 -0
  59. package/src/app/routes/_authenticated/_customers/components/customer-history/default-customer-history-components.tsx +178 -0
  60. package/src/app/routes/_authenticated/_customers/components/customer-history/index.ts +4 -0
  61. package/src/app/routes/_authenticated/_customers/components/customer-history/use-customer-history.ts +169 -0
  62. package/src/app/routes/_authenticated/_customers/components/customer-order-table.tsx +90 -0
  63. package/src/app/routes/_authenticated/_customers/components/customer-status-badge.tsx +33 -0
  64. package/src/app/routes/_authenticated/_customers/customers.graphql.ts +219 -0
  65. package/src/app/routes/_authenticated/_customers/customers.tsx +107 -0
  66. package/src/app/routes/_authenticated/_customers/customers_.$id.tsx +280 -0
  67. package/src/app/routes/_authenticated/_facets/components/facet-bulk-actions.tsx +99 -0
  68. package/src/app/routes/_authenticated/_facets/components/facet-value-bulk-actions.tsx +16 -0
  69. package/src/app/routes/_authenticated/_facets/components/facet-values-sheet.tsx +49 -0
  70. package/src/app/routes/_authenticated/_facets/components/facet-values-table.tsx +139 -0
  71. package/src/app/routes/_authenticated/_facets/facets.graphql.ts +182 -0
  72. package/src/app/routes/_authenticated/_facets/facets.tsx +121 -0
  73. package/src/app/routes/_authenticated/_facets/facets_.$facetId.values_.$id.tsx +158 -0
  74. package/src/app/routes/_authenticated/_facets/facets_.$id.tsx +152 -0
  75. package/src/app/routes/_authenticated/_global-settings/global-settings.graphql.ts +28 -0
  76. package/src/app/routes/_authenticated/_global-settings/global-settings.tsx +161 -0
  77. package/src/app/routes/_authenticated/_orders/components/add-manual-payment-dialog.tsx +189 -0
  78. package/src/app/routes/_authenticated/_orders/components/add-surcharge-form.tsx +139 -0
  79. package/src/app/routes/_authenticated/_orders/components/customer-address-selector.tsx +115 -0
  80. package/src/app/routes/_authenticated/_orders/components/draft-order-status.tsx +48 -0
  81. package/src/app/routes/_authenticated/_orders/components/edit-order-table.tsx +287 -0
  82. package/src/app/routes/_authenticated/_orders/components/fulfill-order-dialog.tsx +323 -0
  83. package/src/app/routes/_authenticated/_orders/components/fulfillment-details.tsx +181 -0
  84. package/src/app/routes/_authenticated/_orders/components/money-gross-net.tsx +20 -0
  85. package/src/app/routes/_authenticated/_orders/components/order-address.tsx +65 -0
  86. package/src/app/routes/_authenticated/_orders/components/order-detail-shared.tsx +332 -0
  87. package/src/app/routes/_authenticated/_orders/components/order-history/default-order-history-components.tsx +138 -0
  88. package/src/app/routes/_authenticated/_orders/components/order-history/index.ts +3 -0
  89. package/src/app/routes/_authenticated/_orders/components/order-history/order-history-container.tsx +80 -0
  90. package/src/app/routes/_authenticated/_orders/components/order-history/order-history-types.ts +5 -0
  91. package/src/app/routes/_authenticated/_orders/components/order-history/order-history-utils.tsx +189 -0
  92. package/src/app/routes/_authenticated/_orders/components/order-history/order-history.tsx +117 -0
  93. package/src/app/routes/_authenticated/_orders/components/order-history/use-order-history.ts +175 -0
  94. package/src/app/routes/_authenticated/_orders/components/order-line-custom-fields-form.tsx +60 -0
  95. package/src/app/routes/_authenticated/_orders/components/order-modification-preview-dialog.tsx +365 -0
  96. package/src/app/routes/_authenticated/_orders/components/order-modification-summary.tsx +277 -0
  97. package/src/app/routes/_authenticated/_orders/components/order-table-totals.tsx +100 -0
  98. package/src/app/routes/_authenticated/_orders/components/order-table.tsx +216 -0
  99. package/src/app/routes/_authenticated/_orders/components/order-tax-summary.tsx +40 -0
  100. package/src/app/routes/_authenticated/_orders/components/payment-details.tsx +293 -0
  101. package/src/app/routes/_authenticated/_orders/components/refund-order-dialog.tsx +372 -0
  102. package/src/app/routes/_authenticated/_orders/components/seller-orders-card.tsx +63 -0
  103. package/src/app/routes/_authenticated/_orders/components/settle-refund-dialog.tsx +80 -0
  104. package/src/app/routes/_authenticated/_orders/components/shipping-method-selector.tsx +64 -0
  105. package/src/app/routes/_authenticated/_orders/components/state-transition-control.tsx +99 -0
  106. package/src/app/routes/_authenticated/_orders/components/use-transition-order-to-state.tsx +151 -0
  107. package/src/app/routes/_authenticated/_orders/hooks/use-refund-order.ts +345 -0
  108. package/src/app/routes/_authenticated/_orders/orders.graphql.ts +817 -0
  109. package/src/app/routes/_authenticated/_orders/orders.tsx +120 -0
  110. package/src/app/routes/_authenticated/_orders/orders_.$aggregateOrderId_.seller-orders.$sellerOrderId.tsx +50 -0
  111. package/src/app/routes/_authenticated/_orders/orders_.$id.tsx +30 -0
  112. package/src/app/routes/_authenticated/_orders/orders_.$id_.modify.tsx +312 -0
  113. package/src/app/routes/_authenticated/_orders/orders_.draft.$id.tsx +513 -0
  114. package/src/app/routes/_authenticated/_orders/utils/order-detail-loaders.tsx +140 -0
  115. package/src/app/routes/_authenticated/_orders/utils/order-types.ts +10 -0
  116. package/src/app/routes/_authenticated/_orders/utils/order-utils.ts +219 -0
  117. package/src/app/routes/_authenticated/_orders/utils/refund-utils.ts +100 -0
  118. package/src/app/routes/_authenticated/_orders/utils/use-modify-order.ts +350 -0
  119. package/src/app/routes/_authenticated/_payment-methods/components/payment-eligibility-checker-selector.tsx +40 -0
  120. package/src/app/routes/_authenticated/_payment-methods/components/payment-handler-selector.tsx +39 -0
  121. package/src/app/routes/_authenticated/_payment-methods/components/payment-method-bulk-actions.tsx +58 -0
  122. package/src/app/routes/_authenticated/_payment-methods/payment-methods.graphql.ts +110 -0
  123. package/src/app/routes/_authenticated/_payment-methods/payment-methods.tsx +88 -0
  124. package/src/app/routes/_authenticated/_payment-methods/payment-methods_.$id.tsx +213 -0
  125. package/src/app/routes/_authenticated/_product-variants/components/add-currency-dropdown.tsx +49 -0
  126. package/src/app/routes/_authenticated/_product-variants/components/add-stock-location-dropdown.tsx +56 -0
  127. package/src/app/routes/_authenticated/_product-variants/components/product-variant-bulk-actions.tsx +110 -0
  128. package/src/app/routes/_authenticated/_product-variants/components/variant-price-detail.tsx +92 -0
  129. package/src/app/routes/_authenticated/_product-variants/product-variants.graphql.ts +213 -0
  130. package/src/app/routes/_authenticated/_product-variants/product-variants.tsx +115 -0
  131. package/src/app/routes/_authenticated/_product-variants/product-variants_.$id.tsx +490 -0
  132. package/src/app/routes/_authenticated/_products/components/add-option-group-dialog.tsx +127 -0
  133. package/src/app/routes/_authenticated/_products/components/add-product-variant-dialog.tsx +372 -0
  134. package/src/app/routes/_authenticated/_products/components/assign-facet-values-dialog.tsx +282 -0
  135. package/src/app/routes/_authenticated/_products/components/create-product-options-dialog.tsx +416 -0
  136. package/src/app/routes/_authenticated/_products/components/create-product-variants-dialog.tsx +190 -0
  137. package/src/app/routes/_authenticated/_products/components/create-product-variants.tsx +370 -0
  138. package/src/app/routes/_authenticated/_products/components/option-groups-editor.tsx +180 -0
  139. package/src/app/routes/_authenticated/_products/components/option-value-input.tsx +72 -0
  140. package/src/app/routes/_authenticated/_products/components/product-bulk-actions.tsx +117 -0
  141. package/src/app/routes/_authenticated/_products/components/product-option-group-badge.tsx +19 -0
  142. package/src/app/routes/_authenticated/_products/components/product-option-select.tsx +111 -0
  143. package/src/app/routes/_authenticated/_products/components/product-options-table.tsx +114 -0
  144. package/src/app/routes/_authenticated/_products/components/product-variants-table.tsx +120 -0
  145. package/src/app/routes/_authenticated/_products/product-option-groups.graphql.ts +103 -0
  146. package/src/app/routes/_authenticated/_products/products.graphql.ts +352 -0
  147. package/src/app/routes/_authenticated/_products/products.tsx +138 -0
  148. package/src/app/routes/_authenticated/_products/products_.$id.tsx +258 -0
  149. package/src/app/routes/_authenticated/_products/products_.$id_.variants.tsx +430 -0
  150. package/src/app/routes/_authenticated/_products/products_.$productId.option-groups.$id.tsx +177 -0
  151. package/src/app/routes/_authenticated/_products/products_.$productId.option-groups.$productOptionGroupId.options_.$id.tsx +204 -0
  152. package/src/app/routes/_authenticated/_profile/profile.graphql.ts +30 -0
  153. package/src/app/routes/_authenticated/_profile/profile.tsx +143 -0
  154. package/src/app/routes/_authenticated/_promotions/components/promotion-actions-selector.tsx +41 -0
  155. package/src/app/routes/_authenticated/_promotions/components/promotion-bulk-actions.tsx +72 -0
  156. package/src/app/routes/_authenticated/_promotions/components/promotion-conditions-selector.tsx +41 -0
  157. package/src/app/routes/_authenticated/_promotions/promotions.graphql.ts +121 -0
  158. package/src/app/routes/_authenticated/_promotions/promotions.tsx +94 -0
  159. package/src/app/routes/_authenticated/_promotions/promotions_.$id.tsx +261 -0
  160. package/src/app/routes/_authenticated/_roles/components/expandable-permissions.tsx +54 -0
  161. package/src/app/routes/_authenticated/_roles/components/permissions-table-grid.tsx +251 -0
  162. package/src/app/routes/_authenticated/_roles/components/role-bulk-actions.tsx +15 -0
  163. package/src/app/routes/_authenticated/_roles/roles.graphql.ts +76 -0
  164. package/src/app/routes/_authenticated/_roles/roles.tsx +99 -0
  165. package/src/app/routes/_authenticated/_roles/roles_.$id.tsx +146 -0
  166. package/src/app/routes/_authenticated/_sellers/components/seller-bulk-actions.tsx +15 -0
  167. package/src/app/routes/_authenticated/_sellers/sellers.graphql.ts +70 -0
  168. package/src/app/routes/_authenticated/_sellers/sellers.tsx +56 -0
  169. package/src/app/routes/_authenticated/_sellers/sellers_.$id.tsx +112 -0
  170. package/src/app/routes/_authenticated/_shipping-methods/components/fulfillment-handler-selector.tsx +56 -0
  171. package/src/app/routes/_authenticated/_shipping-methods/components/metadata-badges.tsx +15 -0
  172. package/src/app/routes/_authenticated/_shipping-methods/components/price-display.tsx +21 -0
  173. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-calculator-selector.tsx +39 -0
  174. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-eligibility-checker-selector.tsx +39 -0
  175. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-method-bulk-actions.tsx +61 -0
  176. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-method-test-result-wrapper.tsx +87 -0
  177. package/src/app/routes/_authenticated/_shipping-methods/components/test-address-form.tsx +256 -0
  178. package/src/app/routes/_authenticated/_shipping-methods/components/test-order-builder.tsx +244 -0
  179. package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-methods-result.tsx +97 -0
  180. package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-methods-sheet.tsx +41 -0
  181. package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-methods.tsx +74 -0
  182. package/src/app/routes/_authenticated/_shipping-methods/components/test-single-method-result.tsx +90 -0
  183. package/src/app/routes/_authenticated/_shipping-methods/components/test-single-shipping-method-sheet.tsx +56 -0
  184. package/src/app/routes/_authenticated/_shipping-methods/components/test-single-shipping-method.tsx +82 -0
  185. package/src/app/routes/_authenticated/_shipping-methods/components/use-shipping-method-test-state.ts +67 -0
  186. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.graphql.ts +137 -0
  187. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.tsx +76 -0
  188. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods_.$id.tsx +209 -0
  189. package/src/app/routes/_authenticated/_stock-locations/components/stock-location-bulk-actions.tsx +58 -0
  190. package/src/app/routes/_authenticated/_stock-locations/stock-locations.graphql.ts +87 -0
  191. package/src/app/routes/_authenticated/_stock-locations/stock-locations.tsx +65 -0
  192. package/src/app/routes/_authenticated/_stock-locations/stock-locations_.$id.tsx +126 -0
  193. package/src/app/routes/_authenticated/_system/components/payload-dialog.tsx +41 -0
  194. package/src/app/routes/_authenticated/_system/healthchecks.tsx +100 -0
  195. package/src/app/routes/_authenticated/_system/job-queue.graphql.ts +54 -0
  196. package/src/app/routes/_authenticated/_system/job-queue.tsx +266 -0
  197. package/src/app/routes/_authenticated/_system/scheduled-tasks.tsx +249 -0
  198. package/src/app/routes/_authenticated/_tax-categories/components/tax-category-bulk-actions.tsx +15 -0
  199. package/src/app/routes/_authenticated/_tax-categories/tax-categories.graphql.ts +72 -0
  200. package/src/app/routes/_authenticated/_tax-categories/tax-categories.tsx +69 -0
  201. package/src/app/routes/_authenticated/_tax-categories/tax-categories_.$id.tsx +127 -0
  202. package/src/app/routes/_authenticated/_tax-rates/components/tax-rate-bulk-actions.tsx +15 -0
  203. package/src/app/routes/_authenticated/_tax-rates/tax-rates.graphql.ts +84 -0
  204. package/src/app/routes/_authenticated/_tax-rates/tax-rates.tsx +119 -0
  205. package/src/app/routes/_authenticated/_tax-rates/tax-rates_.$id.tsx +149 -0
  206. package/src/app/routes/_authenticated/_zones/components/zone-bulk-actions.tsx +63 -0
  207. package/src/app/routes/_authenticated/_zones/components/zone-countries-add.tsx +0 -0
  208. package/src/app/routes/_authenticated/_zones/components/zone-countries-sheet.tsx +34 -0
  209. package/src/app/routes/_authenticated/_zones/components/zone-countries-table.tsx +94 -0
  210. package/src/app/routes/_authenticated/_zones/zones.graphql.ts +105 -0
  211. package/src/app/routes/_authenticated/_zones/zones.tsx +64 -0
  212. package/src/app/routes/_authenticated/_zones/zones_.$id.tsx +110 -0
  213. package/src/app/routes/_authenticated/index.tsx +233 -0
  214. package/src/app/routes/_authenticated.tsx +35 -0
  215. package/src/app/routes/login.tsx +49 -0
  216. package/src/app/styles.css +100 -0
  217. package/src/app/tailwindcss-animate.css +275 -0
  218. package/src/i18n/common-strings.ts +118 -0
  219. package/src/i18n/locales/ar.po +5250 -0
  220. package/src/i18n/locales/bg.po +5287 -0
  221. package/src/i18n/locales/cs.po +5250 -0
  222. package/src/i18n/locales/de.po +5250 -0
  223. package/src/i18n/locales/el.po +5285 -0
  224. package/src/i18n/locales/en.po +5250 -0
  225. package/src/i18n/locales/es.po +5250 -0
  226. package/src/i18n/locales/fa.po +5250 -0
  227. package/src/i18n/locales/fr.po +5250 -0
  228. package/src/i18n/locales/he.po +5250 -0
  229. package/src/i18n/locales/hr.po +5250 -0
  230. package/src/i18n/locales/it.po +5250 -0
  231. package/src/i18n/locales/ja.po +5250 -0
  232. package/src/i18n/locales/ko.po +4628 -0
  233. package/src/i18n/locales/nb.po +5250 -0
  234. package/src/i18n/locales/ne.po +5250 -0
  235. package/src/i18n/locales/nl.po +4628 -0
  236. package/src/i18n/locales/pl.po +5250 -0
  237. package/src/i18n/locales/pt_BR.po +5250 -0
  238. package/src/i18n/locales/pt_PT.po +5250 -0
  239. package/src/i18n/locales/ru.po +5250 -0
  240. package/src/i18n/locales/sv.po +5250 -0
  241. package/src/i18n/locales/tr.po +5250 -0
  242. package/src/i18n/locales/uk.po +5250 -0
  243. package/src/i18n/locales/zh_Hans.po +5250 -0
  244. package/src/i18n/locales/zh_Hant.po +5250 -0
  245. package/src/lib/components/data-display/boolean.tsx +23 -0
  246. package/src/lib/components/data-display/date-time.tsx +19 -0
  247. package/src/lib/components/data-display/json.tsx +20 -0
  248. package/src/lib/components/data-display/money.tsx +14 -0
  249. package/src/lib/components/data-input/affixed-input.stories.tsx +93 -0
  250. package/src/lib/components/data-input/affixed-input.tsx +79 -0
  251. package/src/lib/components/data-input/boolean-input.stories.tsx +102 -0
  252. package/src/lib/components/data-input/boolean-input.tsx +16 -0
  253. package/src/lib/components/data-input/checkbox-input.stories.tsx +61 -0
  254. package/src/lib/components/data-input/checkbox-input.tsx +15 -0
  255. package/src/lib/components/data-input/combination-mode-input.tsx +64 -0
  256. package/src/lib/components/data-input/configurable-operation-list-input.tsx +59 -0
  257. package/src/lib/components/data-input/custom-field-list-input.tsx +294 -0
  258. package/src/lib/components/data-input/customer-group-input.tsx +61 -0
  259. package/src/lib/components/data-input/datetime-input.stories.tsx +62 -0
  260. package/src/lib/components/data-input/datetime-input.tsx +210 -0
  261. package/src/lib/components/data-input/default-relation-input.tsx +626 -0
  262. package/src/lib/components/data-input/facet-value-input.tsx +78 -0
  263. package/src/lib/components/data-input/index.ts +24 -0
  264. package/src/lib/components/data-input/money-input.stories.tsx +88 -0
  265. package/src/lib/components/data-input/money-input.tsx +117 -0
  266. package/src/lib/components/data-input/number-input.stories.tsx +103 -0
  267. package/src/lib/components/data-input/number-input.tsx +85 -0
  268. package/src/lib/components/data-input/password-form-input.stories.tsx +65 -0
  269. package/src/lib/components/data-input/password-form-input.tsx +23 -0
  270. package/src/lib/components/data-input/product-multi-selector-input.tsx +416 -0
  271. package/src/lib/components/data-input/relation-input.tsx +165 -0
  272. package/src/lib/components/data-input/relation-selector.tsx +476 -0
  273. package/src/lib/components/data-input/rich-text-input.stories.tsx +92 -0
  274. package/src/lib/components/data-input/rich-text-input.tsx +16 -0
  275. package/src/lib/components/data-input/select-with-options.tsx +112 -0
  276. package/src/lib/components/data-input/slug-input.stories.tsx +232 -0
  277. package/src/lib/components/data-input/slug-input.tsx +290 -0
  278. package/src/lib/components/data-input/string-list-input.tsx +268 -0
  279. package/src/lib/components/data-input/struct-form-input.tsx +352 -0
  280. package/src/lib/components/data-input/text-input.stories.tsx +52 -0
  281. package/src/lib/components/data-input/text-input.tsx +16 -0
  282. package/src/lib/components/data-input/textarea-input.stories.tsx +55 -0
  283. package/src/lib/components/data-input/textarea-input.tsx +23 -0
  284. package/src/lib/components/data-table/add-filter-menu.tsx +64 -0
  285. package/src/lib/components/data-table/column-header-wrapper.tsx +106 -0
  286. package/src/lib/components/data-table/data-table-bulk-action-item.tsx +141 -0
  287. package/src/lib/components/data-table/data-table-bulk-actions.tsx +100 -0
  288. package/src/lib/components/data-table/data-table-column-header.tsx +50 -0
  289. package/src/lib/components/data-table/data-table-context.tsx +98 -0
  290. package/src/lib/components/data-table/data-table-facet-value-faceted-filter.tsx +308 -0
  291. package/src/lib/components/data-table/data-table-faceted-filter.tsx +195 -0
  292. package/src/lib/components/data-table/data-table-filter-badge-editable.tsx +35 -0
  293. package/src/lib/components/data-table/data-table-filter-badge.tsx +115 -0
  294. package/src/lib/components/data-table/data-table-filter-dialog.tsx +92 -0
  295. package/src/lib/components/data-table/data-table-pagination.tsx +105 -0
  296. package/src/lib/components/data-table/data-table-utils.ts +313 -0
  297. package/src/lib/components/data-table/data-table-view-options.tsx +132 -0
  298. package/src/lib/components/data-table/data-table.stories.tsx +249 -0
  299. package/src/lib/components/data-table/data-table.tsx +554 -0
  300. package/src/lib/components/data-table/filters/data-table-boolean-filter.tsx +60 -0
  301. package/src/lib/components/data-table/filters/data-table-datetime-filter.tsx +159 -0
  302. package/src/lib/components/data-table/filters/data-table-id-filter.tsx +63 -0
  303. package/src/lib/components/data-table/filters/data-table-number-filter.tsx +123 -0
  304. package/src/lib/components/data-table/filters/data-table-string-filter.tsx +79 -0
  305. package/src/lib/components/data-table/global-views-bar.tsx +97 -0
  306. package/src/lib/components/data-table/global-views-sheet.tsx +11 -0
  307. package/src/lib/components/data-table/human-readable-operator.tsx +65 -0
  308. package/src/lib/components/data-table/manage-global-views-button.tsx +26 -0
  309. package/src/lib/components/data-table/my-views-button.tsx +47 -0
  310. package/src/lib/components/data-table/refresh-button.tsx +49 -0
  311. package/src/lib/components/data-table/save-view-button.tsx +45 -0
  312. package/src/lib/components/data-table/save-view-dialog.tsx +134 -0
  313. package/src/lib/components/data-table/types.ts +40 -0
  314. package/src/lib/components/data-table/use-all-bulk-actions.ts +19 -0
  315. package/src/lib/components/data-table/use-generated-columns.tsx +418 -0
  316. package/src/lib/components/data-table/user-views-sheet.tsx +11 -0
  317. package/src/lib/components/data-table/views-sheet.tsx +305 -0
  318. package/src/lib/components/date-range-picker.tsx +186 -0
  319. package/src/lib/components/labeled-data.tsx +21 -0
  320. package/src/lib/components/layout/app-layout.tsx +35 -0
  321. package/src/lib/components/layout/app-sidebar.tsx +37 -0
  322. package/src/lib/components/layout/channel-switcher.tsx +228 -0
  323. package/src/lib/components/layout/content-language-selector.tsx +46 -0
  324. package/src/lib/components/layout/dev-mode-indicator.tsx +18 -0
  325. package/src/lib/components/layout/generated-breadcrumbs.tsx +136 -0
  326. package/src/lib/components/layout/language-dialog.tsx +133 -0
  327. package/src/lib/components/layout/manage-languages-dialog.tsx +387 -0
  328. package/src/lib/components/layout/nav-item-wrapper.tsx +107 -0
  329. package/src/lib/components/layout/nav-main.tsx +331 -0
  330. package/src/lib/components/layout/nav-projects.tsx +81 -0
  331. package/src/lib/components/layout/nav-user.tsx +180 -0
  332. package/src/lib/components/login/login-form.tsx +124 -0
  333. package/src/lib/components/shared/alerts.tsx +52 -0
  334. package/src/lib/components/shared/animated-number.tsx +49 -0
  335. package/src/lib/components/shared/asset/asset-bulk-actions.tsx +109 -0
  336. package/src/lib/components/shared/asset/asset-focal-point-editor.tsx +103 -0
  337. package/src/lib/components/shared/asset/asset-gallery.stories.tsx +76 -0
  338. package/src/lib/components/shared/asset/asset-gallery.tsx +623 -0
  339. package/src/lib/components/shared/asset/asset-picker-dialog.stories.tsx +58 -0
  340. package/src/lib/components/shared/asset/asset-picker-dialog.tsx +109 -0
  341. package/src/lib/components/shared/asset/asset-preview-dialog.tsx +38 -0
  342. package/src/lib/components/shared/asset/asset-preview-selector.tsx +32 -0
  343. package/src/lib/components/shared/asset/asset-preview.tsx +114 -0
  344. package/src/lib/components/shared/asset/asset-properties.tsx +44 -0
  345. package/src/lib/components/shared/assign-to-channel-bulk-action.tsx +71 -0
  346. package/src/lib/components/shared/assign-to-channel-dialog.tsx +156 -0
  347. package/src/lib/components/shared/assigned-channels.tsx +108 -0
  348. package/src/lib/components/shared/assigned-facet-values.tsx +61 -0
  349. package/src/lib/components/shared/channel-chip.tsx +43 -0
  350. package/src/lib/components/shared/channel-code-label.tsx +6 -0
  351. package/src/lib/components/shared/channel-selector.tsx +51 -0
  352. package/src/lib/components/shared/configurable-operation-arg-input.tsx +29 -0
  353. package/src/lib/components/shared/configurable-operation-input.tsx +190 -0
  354. package/src/lib/components/shared/configurable-operation-multi-selector.tsx +308 -0
  355. package/src/lib/components/shared/configurable-operation-selector.tsx +161 -0
  356. package/src/lib/components/shared/confirmation-dialog.tsx +58 -0
  357. package/src/lib/components/shared/copyable-text.tsx +30 -0
  358. package/src/lib/components/shared/country-selector.tsx +108 -0
  359. package/src/lib/components/shared/currency-selector.tsx +33 -0
  360. package/src/lib/components/shared/custom-fields-form.tsx +305 -0
  361. package/src/lib/components/shared/customer-address-form.tsx +338 -0
  362. package/src/lib/components/shared/customer-group-chip.tsx +30 -0
  363. package/src/lib/components/shared/customer-group-selector.tsx +65 -0
  364. package/src/lib/components/shared/customer-selector.tsx +112 -0
  365. package/src/lib/components/shared/detail-page-button.stories.tsx +52 -0
  366. package/src/lib/components/shared/detail-page-button.tsx +59 -0
  367. package/src/lib/components/shared/entity-assets.tsx +411 -0
  368. package/src/lib/components/shared/error-page.tsx +31 -0
  369. package/src/lib/components/shared/facet-value-chip.tsx +59 -0
  370. package/src/lib/components/shared/facet-value-selector.stories.tsx +48 -0
  371. package/src/lib/components/shared/facet-value-selector.tsx +274 -0
  372. package/src/lib/components/shared/form-field-wrapper.tsx +111 -0
  373. package/src/lib/components/shared/history-timeline/history-entry-date.tsx +37 -0
  374. package/src/lib/components/shared/history-timeline/history-note-checkbox.tsx +28 -0
  375. package/src/lib/components/shared/history-timeline/history-note-editor.tsx +60 -0
  376. package/src/lib/components/shared/history-timeline/history-note-entry.tsx +65 -0
  377. package/src/lib/components/shared/history-timeline/history-note-input.tsx +39 -0
  378. package/src/lib/components/shared/history-timeline/history-timeline-with-grouping.tsx +144 -0
  379. package/src/lib/components/shared/history-timeline/history-timeline.tsx +16 -0
  380. package/src/lib/components/shared/history-timeline/use-history-note-editor.ts +26 -0
  381. package/src/lib/components/shared/icon-mark.tsx +18 -0
  382. package/src/lib/components/shared/language-selector.tsx +56 -0
  383. package/src/lib/components/shared/logo-mark.tsx +24 -0
  384. package/src/lib/components/shared/multi-select.tsx +159 -0
  385. package/src/lib/components/shared/navigation-confirmation.tsx +64 -0
  386. package/src/lib/components/shared/option-value-input.tsx +97 -0
  387. package/src/lib/components/shared/paginated-list-context.ts +10 -0
  388. package/src/lib/components/shared/paginated-list-data-table.stories.tsx +212 -0
  389. package/src/lib/components/shared/paginated-list-data-table.tsx +497 -0
  390. package/src/lib/components/shared/permission-guard.stories.tsx +46 -0
  391. package/src/lib/components/shared/permission-guard.tsx +51 -0
  392. package/src/lib/components/shared/product-variant-selector.tsx +136 -0
  393. package/src/lib/components/shared/remove-from-channel-bulk-action.tsx +93 -0
  394. package/src/lib/components/shared/rich-text-editor/image-dialog.tsx +223 -0
  395. package/src/lib/components/shared/rich-text-editor/link-dialog.tsx +151 -0
  396. package/src/lib/components/shared/rich-text-editor/responsive-toolbar.tsx +443 -0
  397. package/src/lib/components/shared/rich-text-editor/rich-text-editor.tsx +339 -0
  398. package/src/lib/components/shared/rich-text-editor/table-delete-menu.tsx +104 -0
  399. package/src/lib/components/shared/rich-text-editor/table-edit-icons.tsx +225 -0
  400. package/src/lib/components/shared/role-code-label.tsx +12 -0
  401. package/src/lib/components/shared/role-selector.tsx +56 -0
  402. package/src/lib/components/shared/seller-selector.tsx +111 -0
  403. package/src/lib/components/shared/stock-level-label.tsx +22 -0
  404. package/src/lib/components/shared/table-cell/order-table-cell-components.tsx +80 -0
  405. package/src/lib/components/shared/tax-category-selector.tsx +65 -0
  406. package/src/lib/components/shared/translatable-form-field.tsx +149 -0
  407. package/src/lib/components/shared/vendure-image.stories.tsx +167 -0
  408. package/src/lib/components/shared/vendure-image.tsx +307 -0
  409. package/src/lib/components/shared/zone-selector.tsx +65 -0
  410. package/src/lib/components/ui/accordion.stories.tsx +33 -0
  411. package/src/lib/components/ui/accordion.tsx +59 -0
  412. package/src/lib/components/ui/alert-dialog.stories.tsx +48 -0
  413. package/src/lib/components/ui/alert-dialog.tsx +128 -0
  414. package/src/lib/components/ui/alert.stories.tsx +35 -0
  415. package/src/lib/components/ui/alert.tsx +62 -0
  416. package/src/lib/components/ui/aspect-ratio.stories.tsx +28 -0
  417. package/src/lib/components/ui/aspect-ratio.tsx +9 -0
  418. package/src/lib/components/ui/badge.stories.tsx +28 -0
  419. package/src/lib/components/ui/badge.tsx +38 -0
  420. package/src/lib/components/ui/breadcrumb.stories.tsx +41 -0
  421. package/src/lib/components/ui/breadcrumb.tsx +102 -0
  422. package/src/lib/components/ui/button.stories.tsx +38 -0
  423. package/src/lib/components/ui/button.tsx +58 -0
  424. package/src/lib/components/ui/calendar.stories.tsx +22 -0
  425. package/src/lib/components/ui/calendar.tsx +447 -0
  426. package/src/lib/components/ui/card.stories.tsx +28 -0
  427. package/src/lib/components/ui/card.tsx +47 -0
  428. package/src/lib/components/ui/carousel.stories.tsx +34 -0
  429. package/src/lib/components/ui/carousel.tsx +241 -0
  430. package/src/lib/components/ui/chart.tsx +351 -0
  431. package/src/lib/components/ui/checkbox.stories.tsx +31 -0
  432. package/src/lib/components/ui/checkbox.tsx +27 -0
  433. package/src/lib/components/ui/collapsible.stories.tsx +39 -0
  434. package/src/lib/components/ui/collapsible.tsx +33 -0
  435. package/src/lib/components/ui/command.stories.tsx +44 -0
  436. package/src/lib/components/ui/command.tsx +139 -0
  437. package/src/lib/components/ui/context-menu.stories.tsx +38 -0
  438. package/src/lib/components/ui/context-menu.tsx +252 -0
  439. package/src/lib/components/ui/dialog.stories.tsx +52 -0
  440. package/src/lib/components/ui/dialog.tsx +116 -0
  441. package/src/lib/components/ui/drawer.stories.tsx +50 -0
  442. package/src/lib/components/ui/drawer.tsx +133 -0
  443. package/src/lib/components/ui/dropdown-menu.stories.tsx +41 -0
  444. package/src/lib/components/ui/dropdown-menu.tsx +223 -0
  445. package/src/lib/components/ui/form.tsx +141 -0
  446. package/src/lib/components/ui/grid-layout.tsx +376 -0
  447. package/src/lib/components/ui/hover-card.stories.tsx +38 -0
  448. package/src/lib/components/ui/hover-card.tsx +36 -0
  449. package/src/lib/components/ui/input-group.tsx +149 -0
  450. package/src/lib/components/ui/input-otp.stories.tsx +30 -0
  451. package/src/lib/components/ui/input-otp.tsx +77 -0
  452. package/src/lib/components/ui/input.stories.tsx +38 -0
  453. package/src/lib/components/ui/input.tsx +19 -0
  454. package/src/lib/components/ui/label.stories.tsx +24 -0
  455. package/src/lib/components/ui/label.tsx +21 -0
  456. package/src/lib/components/ui/menubar.stories.tsx +53 -0
  457. package/src/lib/components/ui/menubar.tsx +274 -0
  458. package/src/lib/components/ui/navigation-menu.stories.tsx +54 -0
  459. package/src/lib/components/ui/navigation-menu.tsx +168 -0
  460. package/src/lib/components/ui/pagination.stories.tsx +51 -0
  461. package/src/lib/components/ui/pagination.tsx +106 -0
  462. package/src/lib/components/ui/password-input.stories.tsx +32 -0
  463. package/src/lib/components/ui/password-input.tsx +29 -0
  464. package/src/lib/components/ui/popover.stories.tsx +33 -0
  465. package/src/lib/components/ui/popover.tsx +40 -0
  466. package/src/lib/components/ui/progress.stories.tsx +27 -0
  467. package/src/lib/components/ui/progress.tsx +29 -0
  468. package/src/lib/components/ui/radio-group.stories.tsx +34 -0
  469. package/src/lib/components/ui/radio-group.tsx +45 -0
  470. package/src/lib/components/ui/resizable.stories.tsx +32 -0
  471. package/src/lib/components/ui/resizable.tsx +54 -0
  472. package/src/lib/components/ui/scroll-area.stories.tsx +31 -0
  473. package/src/lib/components/ui/scroll-area.tsx +50 -0
  474. package/src/lib/components/ui/select.stories.tsx +36 -0
  475. package/src/lib/components/ui/select.tsx +183 -0
  476. package/src/lib/components/ui/separator.stories.tsx +35 -0
  477. package/src/lib/components/ui/separator.tsx +26 -0
  478. package/src/lib/components/ui/sheet.stories.tsx +50 -0
  479. package/src/lib/components/ui/sheet.tsx +118 -0
  480. package/src/lib/components/ui/sidebar-context.ts +16 -0
  481. package/src/lib/components/ui/sidebar.tsx +686 -0
  482. package/src/lib/components/ui/skeleton.stories.tsx +26 -0
  483. package/src/lib/components/ui/skeleton.tsx +13 -0
  484. package/src/lib/components/ui/slider.stories.tsx +37 -0
  485. package/src/lib/components/ui/slider.tsx +63 -0
  486. package/src/lib/components/ui/sonner.tsx +27 -0
  487. package/src/lib/components/ui/switch.stories.tsx +31 -0
  488. package/src/lib/components/ui/switch.tsx +26 -0
  489. package/src/lib/components/ui/table.stories.tsx +52 -0
  490. package/src/lib/components/ui/table.tsx +82 -0
  491. package/src/lib/components/ui/tabs.stories.tsx +29 -0
  492. package/src/lib/components/ui/tabs.tsx +48 -0
  493. package/src/lib/components/ui/textarea.stories.tsx +32 -0
  494. package/src/lib/components/ui/textarea.tsx +18 -0
  495. package/src/lib/components/ui/toggle-group.stories.tsx +31 -0
  496. package/src/lib/components/ui/toggle-group.tsx +73 -0
  497. package/src/lib/components/ui/toggle.stories.tsx +39 -0
  498. package/src/lib/components/ui/toggle.tsx +45 -0
  499. package/src/lib/components/ui/tooltip.stories.tsx +30 -0
  500. package/src/lib/components/ui/tooltip.tsx +51 -0
  501. package/src/lib/constants.ts +24 -0
  502. package/src/lib/framework/alert/alert-extensions.tsx +19 -0
  503. package/src/lib/framework/alert/alert-item.tsx +44 -0
  504. package/src/lib/framework/alert/alerts-indicator.tsx +22 -0
  505. package/src/lib/framework/alert/search-index-buffer-alert/search-index-buffer-alert.ts +41 -0
  506. package/src/lib/framework/component-registry/component-registry.tsx +18 -0
  507. package/src/lib/framework/component-registry/display-component.tsx +28 -0
  508. package/src/lib/framework/dashboard-widget/base-widget.tsx +92 -0
  509. package/src/lib/framework/dashboard-widget/latest-orders-widget/index.tsx +153 -0
  510. package/src/lib/framework/dashboard-widget/latest-orders-widget/latest-orders-widget.graphql.ts +35 -0
  511. package/src/lib/framework/dashboard-widget/metrics-widget/chart.tsx +50 -0
  512. package/src/lib/framework/dashboard-widget/metrics-widget/index.tsx +108 -0
  513. package/src/lib/framework/dashboard-widget/metrics-widget/metrics-widget.graphql.ts +20 -0
  514. package/src/lib/framework/dashboard-widget/orders-summary/index.tsx +113 -0
  515. package/src/lib/framework/dashboard-widget/orders-summary/order-summary-widget.graphql.ts +14 -0
  516. package/src/lib/framework/dashboard-widget/widget-extensions.tsx +19 -0
  517. package/src/lib/framework/dashboard-widget/widget-filters-context.tsx +18 -0
  518. package/src/lib/framework/data-table/data-table-extensions.ts +35 -0
  519. package/src/lib/framework/defaults.ts +270 -0
  520. package/src/lib/framework/document-extension/extend-detail-form-query.ts +50 -0
  521. package/src/lib/framework/document-extension/extend-document.spec.ts +884 -0
  522. package/src/lib/framework/document-extension/extend-document.ts +159 -0
  523. package/src/lib/framework/document-introspection/add-custom-fields.spec.ts +1458 -0
  524. package/src/lib/framework/document-introspection/add-custom-fields.ts +452 -0
  525. package/src/lib/framework/document-introspection/get-document-structure.spec.ts +581 -0
  526. package/src/lib/framework/document-introspection/get-document-structure.ts +669 -0
  527. package/src/lib/framework/document-introspection/hooks.ts +13 -0
  528. package/src/lib/framework/document-introspection/include-only-selected-list-fields.spec.ts +1840 -0
  529. package/src/lib/framework/document-introspection/include-only-selected-list-fields.ts +940 -0
  530. package/src/lib/framework/document-introspection/testing-utils.ts +161 -0
  531. package/src/lib/framework/extension-api/define-dashboard-extension.ts +99 -0
  532. package/src/lib/framework/extension-api/display-component-extensions.tsx +58 -0
  533. package/src/lib/framework/extension-api/extension-api-types.ts +92 -0
  534. package/src/lib/framework/extension-api/input-component-extensions.tsx +100 -0
  535. package/src/lib/framework/extension-api/logic/alerts.ts +11 -0
  536. package/src/lib/framework/extension-api/logic/data-table.ts +37 -0
  537. package/src/lib/framework/extension-api/logic/detail-forms.ts +35 -0
  538. package/src/lib/framework/extension-api/logic/form-components.ts +14 -0
  539. package/src/lib/framework/extension-api/logic/history-entries.ts +24 -0
  540. package/src/lib/framework/extension-api/logic/index.ts +10 -0
  541. package/src/lib/framework/extension-api/logic/layout.ts +22 -0
  542. package/src/lib/framework/extension-api/logic/login.ts +17 -0
  543. package/src/lib/framework/extension-api/logic/navigation.ts +41 -0
  544. package/src/lib/framework/extension-api/logic/widgets.ts +10 -0
  545. package/src/lib/framework/extension-api/types/alerts.ts +59 -0
  546. package/src/lib/framework/extension-api/types/data-table.ts +159 -0
  547. package/src/lib/framework/extension-api/types/detail-forms.ts +58 -0
  548. package/src/lib/framework/extension-api/types/form-components.ts +41 -0
  549. package/src/lib/framework/extension-api/types/history-entries.ts +120 -0
  550. package/src/lib/framework/extension-api/types/index.ts +10 -0
  551. package/src/lib/framework/extension-api/types/layout.ts +141 -0
  552. package/src/lib/framework/extension-api/types/login.ts +76 -0
  553. package/src/lib/framework/extension-api/types/navigation.ts +105 -0
  554. package/src/lib/framework/extension-api/types/widgets.ts +101 -0
  555. package/src/lib/framework/extension-api/use-dashboard-extensions.ts +27 -0
  556. package/src/lib/framework/extension-api/use-login-extensions.ts +26 -0
  557. package/src/lib/framework/form-engine/custom-form-component-extensions.ts +15 -0
  558. package/src/lib/framework/form-engine/custom-form-component.tsx +26 -0
  559. package/src/lib/framework/form-engine/default-input-for-type.tsx +35 -0
  560. package/src/lib/framework/form-engine/form-control-adapter.tsx +193 -0
  561. package/src/lib/framework/form-engine/form-engine-types.ts +167 -0
  562. package/src/lib/framework/form-engine/form-schema-tools.spec.ts +683 -0
  563. package/src/lib/framework/form-engine/form-schema-tools.ts +440 -0
  564. package/src/lib/framework/form-engine/overridden-form-component.tsx +51 -0
  565. package/src/lib/framework/form-engine/use-generated-form.tsx +242 -0
  566. package/src/lib/framework/form-engine/utils.spec.ts +419 -0
  567. package/src/lib/framework/form-engine/utils.ts +457 -0
  568. package/src/lib/framework/form-engine/value-transformers.ts +156 -0
  569. package/src/lib/framework/history-entry/history-entry-extensions.ts +11 -0
  570. package/src/lib/framework/history-entry/history-entry.tsx +129 -0
  571. package/src/lib/framework/layout-engine/custom-form-page.stories.tsx +344 -0
  572. package/src/lib/framework/layout-engine/dev-mode-button.tsx +24 -0
  573. package/src/lib/framework/layout-engine/layout-extensions.ts +27 -0
  574. package/src/lib/framework/layout-engine/location-wrapper.tsx +122 -0
  575. package/src/lib/framework/layout-engine/page-block-provider.tsx +6 -0
  576. package/src/lib/framework/layout-engine/page-layout.spec.tsx +138 -0
  577. package/src/lib/framework/layout-engine/page-layout.tsx +700 -0
  578. package/src/lib/framework/layout-engine/page-provider.tsx +10 -0
  579. package/src/lib/framework/layout-engine/page.stories.tsx +275 -0
  580. package/src/lib/framework/nav-menu/nav-menu-extensions.ts +112 -0
  581. package/src/lib/framework/page/detail-page-route-loader.tsx +69 -0
  582. package/src/lib/framework/page/detail-page.stories.tsx +151 -0
  583. package/src/lib/framework/page/detail-page.tsx +240 -0
  584. package/src/lib/framework/page/list-page.stories.tsx +256 -0
  585. package/src/lib/framework/page/list-page.tsx +621 -0
  586. package/src/lib/framework/page/page-api.ts +9 -0
  587. package/src/lib/framework/page/page-types.ts +51 -0
  588. package/src/lib/framework/page/use-detail-page.ts +341 -0
  589. package/src/lib/framework/page/use-extended-router.tsx +139 -0
  590. package/src/lib/framework/registry/global-registry.ts +50 -0
  591. package/src/lib/framework/registry/registry-types.ts +32 -0
  592. package/src/lib/graphql/api.ts +123 -0
  593. package/src/lib/graphql/common-operations.ts +37 -0
  594. package/src/lib/graphql/fragments.ts +71 -0
  595. package/src/lib/graphql/graphql-env.d.ts +540 -0
  596. package/src/lib/graphql/graphql.ts +15 -0
  597. package/src/lib/graphql/schema-enums.ts +13 -0
  598. package/src/lib/graphql/settings-store-operations.ts +17 -0
  599. package/src/lib/hooks/use-alerts-context.ts +10 -0
  600. package/src/lib/hooks/use-alerts.ts +84 -0
  601. package/src/lib/hooks/use-auth.tsx +21 -0
  602. package/src/lib/hooks/use-channel.ts +27 -0
  603. package/src/lib/hooks/use-custom-field-config.ts +27 -0
  604. package/src/lib/hooks/use-data-table-context.ts +11 -0
  605. package/src/lib/hooks/use-display-locale.ts +40 -0
  606. package/src/lib/hooks/use-drag-and-drop.ts +86 -0
  607. package/src/lib/hooks/use-dynamic-translations.ts +53 -0
  608. package/src/lib/hooks/use-extended-detail-query.ts +37 -0
  609. package/src/lib/hooks/use-extended-list-query.ts +80 -0
  610. package/src/lib/hooks/use-facet-value-browser.ts +292 -0
  611. package/src/lib/hooks/use-floating-bulk-actions.ts +83 -0
  612. package/src/lib/hooks/use-grouped-permissions.ts +55 -0
  613. package/src/lib/hooks/use-job-queue-polling.ts +160 -0
  614. package/src/lib/hooks/use-local-format.ts +175 -0
  615. package/src/lib/hooks/use-mobile.ts +19 -0
  616. package/src/lib/hooks/use-page-block.tsx +27 -0
  617. package/src/lib/hooks/use-page.tsx +10 -0
  618. package/src/lib/hooks/use-paginated-list.ts +28 -0
  619. package/src/lib/hooks/use-permissions.ts +40 -0
  620. package/src/lib/hooks/use-saved-views.ts +238 -0
  621. package/src/lib/hooks/use-server-config.ts +4 -0
  622. package/src/lib/hooks/use-sorted-languages.ts +41 -0
  623. package/src/lib/hooks/use-theme.ts +10 -0
  624. package/src/lib/hooks/use-ui-language-loader.ts +30 -0
  625. package/src/lib/hooks/use-user-settings.tsx +12 -0
  626. package/src/lib/hooks/use-widget-dimensions.ts +12 -0
  627. package/src/lib/hooks/use-widget-filters.ts +21 -0
  628. package/src/lib/index.ts +307 -0
  629. package/src/lib/lib/load-i18n-messages.ts +20 -0
  630. package/src/lib/lib/trans.tsx +20 -0
  631. package/src/lib/lib/utils.ts +111 -0
  632. package/src/lib/providers/alerts-provider.tsx +52 -0
  633. package/src/lib/providers/auth.tsx +232 -0
  634. package/src/lib/providers/channel-provider.tsx +245 -0
  635. package/src/lib/providers/i18n-provider.tsx +21 -0
  636. package/src/lib/providers/server-config.tsx +289 -0
  637. package/src/lib/providers/theme-provider.tsx +56 -0
  638. package/src/lib/providers/user-settings.tsx +244 -0
  639. package/src/lib/types/saved-views.ts +42 -0
  640. package/src/lib/utils/config-utils.ts +19 -0
  641. package/src/lib/utils/saved-views-utils.ts +40 -0
  642. package/src/lib/virtual.d.ts +44 -0
  643. package/src/vite-env.d.ts +2 -0
@@ -0,0 +1,683 @@
1
+ import { FieldInfo } from '@/vdb/framework/document-introspection/get-document-structure.js';
2
+ import { describe, expect, it } from 'vitest';
3
+
4
+ import {
5
+ createFormSchemaFromFields,
6
+ getDefaultValuesFromFields,
7
+ getZodTypeFromField,
8
+ } from './form-schema-tools.js';
9
+
10
+ // Helper to create mock FieldInfo
11
+ const createMockField = (
12
+ name: string,
13
+ type: string,
14
+ nullable = false,
15
+ list = false,
16
+ typeInfo?: FieldInfo[],
17
+ isScalar = !typeInfo,
18
+ ): FieldInfo => ({
19
+ name,
20
+ type,
21
+ nullable,
22
+ list,
23
+ typeInfo,
24
+ isPaginatedList: false,
25
+ isScalar,
26
+ });
27
+
28
+ // Helper to create mock CustomFieldConfig
29
+ const createMockCustomField = (
30
+ name: string,
31
+ type: string,
32
+ options: {
33
+ pattern?: string;
34
+ intMin?: number;
35
+ intMax?: number;
36
+ floatMin?: number;
37
+ floatMax?: number;
38
+ datetimeMin?: string;
39
+ datetimeMax?: string;
40
+ list?: boolean;
41
+ nullable?: boolean;
42
+ } = {},
43
+ ) => ({
44
+ name,
45
+ type,
46
+ ...options,
47
+ });
48
+
49
+ describe('form-schema-tools', () => {
50
+ describe('getZodTypeFromField', () => {
51
+ it('should create string type for String fields', () => {
52
+ const field = createMockField('name', 'String');
53
+ const schema = getZodTypeFromField(field);
54
+
55
+ expect(() => schema.parse('test')).not.toThrow();
56
+ expect(() => schema.parse(123)).toThrow();
57
+ });
58
+
59
+ it('should create number type for Int fields', () => {
60
+ const field = createMockField('age', 'Int');
61
+ const schema = getZodTypeFromField(field);
62
+
63
+ expect(() => schema.parse(25)).not.toThrow();
64
+ expect(() => schema.parse('25')).toThrow();
65
+ });
66
+
67
+ it('should create number type for Float fields', () => {
68
+ const field = createMockField('price', 'Float');
69
+ const schema = getZodTypeFromField(field);
70
+
71
+ expect(() => schema.parse(29.99)).not.toThrow();
72
+ expect(() => schema.parse('29.99')).toThrow();
73
+ });
74
+
75
+ it('should create boolean type for Boolean fields', () => {
76
+ const field = createMockField('active', 'Boolean');
77
+ const schema = getZodTypeFromField(field);
78
+
79
+ expect(() => schema.parse(true)).not.toThrow();
80
+ expect(() => schema.parse('true')).toThrow();
81
+ });
82
+
83
+ it('should handle nullable fields', () => {
84
+ const field = createMockField('optional', 'String', true);
85
+ const schema = getZodTypeFromField(field);
86
+
87
+ expect(() => schema.parse('test')).not.toThrow();
88
+ expect(() => schema.parse(null)).not.toThrow();
89
+ expect(() => schema.parse(undefined)).not.toThrow();
90
+ });
91
+
92
+ it('should handle list fields', () => {
93
+ const field = createMockField('tags', 'String', false, true);
94
+ const schema = getZodTypeFromField(field);
95
+
96
+ expect(() => schema.parse(['tag1', 'tag2'])).not.toThrow();
97
+ expect(() => schema.parse('tag1')).toThrow();
98
+ });
99
+ });
100
+
101
+ describe('createFormSchemaFromFields - basic functionality', () => {
102
+ it('should create schema for simple fields', () => {
103
+ const fields = [
104
+ createMockField('name', 'String'),
105
+ createMockField('age', 'Int'),
106
+ createMockField('active', 'Boolean'),
107
+ ];
108
+
109
+ const schema = createFormSchemaFromFields(fields);
110
+
111
+ const validData = { name: 'John', age: 25, active: true };
112
+ expect(() => schema.parse(validData)).not.toThrow();
113
+
114
+ const invalidData = { name: 123, age: 'twenty', active: 'yes' };
115
+ expect(() => schema.parse(invalidData)).toThrow();
116
+ });
117
+
118
+ it('should handle nested objects', () => {
119
+ const fields = [
120
+ createMockField('user', 'Object', false, false, [
121
+ createMockField('name', 'String'),
122
+ createMockField('email', 'String'),
123
+ ]),
124
+ ];
125
+
126
+ const schema = createFormSchemaFromFields(fields);
127
+
128
+ const validData = {
129
+ user: {
130
+ name: 'John',
131
+ email: 'john@example.com',
132
+ },
133
+ };
134
+ expect(() => schema.parse(validData)).not.toThrow();
135
+ });
136
+ });
137
+
138
+ describe('createFormSchemaFromFields - custom fields (root context)', () => {
139
+ it('should apply string pattern validation for root custom fields', () => {
140
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
141
+ const customFields = [createMockCustomField('sku', 'string', { pattern: '^[A-Z]{2}-\\d{4}$' })];
142
+
143
+ const schema = createFormSchemaFromFields(fields, customFields, false);
144
+
145
+ const validData = { customFields: { sku: 'AB-1234' } };
146
+ expect(() => schema.parse(validData)).not.toThrow();
147
+
148
+ const invalidData = { customFields: { sku: 'invalid-sku' } };
149
+ expect(() => schema.parse(invalidData)).toThrow();
150
+ });
151
+
152
+ it('should apply int min/max validation for root custom fields', () => {
153
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
154
+ const customFields = [createMockCustomField('quantity', 'int', { intMin: 1, intMax: 100 })];
155
+
156
+ const schema = createFormSchemaFromFields(fields, customFields, false);
157
+
158
+ const validData = { customFields: { quantity: 50 } };
159
+ expect(() => schema.parse(validData)).not.toThrow();
160
+
161
+ const belowMinData = { customFields: { quantity: 0 } };
162
+ expect(() => schema.parse(belowMinData)).toThrow();
163
+
164
+ const aboveMaxData = { customFields: { quantity: 101 } };
165
+ expect(() => schema.parse(aboveMaxData)).toThrow();
166
+ });
167
+
168
+ it('should apply float min/max validation for root custom fields', () => {
169
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
170
+ const customFields = [
171
+ createMockCustomField('weight', 'float', { floatMin: 0.1, floatMax: 999.9 }),
172
+ ];
173
+
174
+ const schema = createFormSchemaFromFields(fields, customFields, false);
175
+
176
+ const validData = { customFields: { weight: 10.5 } };
177
+ expect(() => schema.parse(validData)).not.toThrow();
178
+
179
+ const belowMinData = { customFields: { weight: 0.05 } };
180
+ expect(() => schema.parse(belowMinData)).toThrow();
181
+
182
+ const aboveMaxData = { customFields: { weight: 1000.0 } };
183
+ expect(() => schema.parse(aboveMaxData)).toThrow();
184
+ });
185
+
186
+ it('should apply datetime min/max validation for root custom fields', () => {
187
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
188
+ const customFields = [
189
+ createMockCustomField('releaseDate', 'datetime', {
190
+ datetimeMin: '2020-01-01T00:00:00.000Z',
191
+ datetimeMax: '2025-12-31T23:59:59.999Z',
192
+ }),
193
+ ];
194
+
195
+ const schema = createFormSchemaFromFields(fields, customFields, false);
196
+
197
+ // Test with string
198
+ const validDataString = { customFields: { releaseDate: '2023-06-15T12:00:00.000Z' } };
199
+ expect(() => schema.parse(validDataString)).not.toThrow();
200
+
201
+ // Test with Date object
202
+ const validDataDate = { customFields: { releaseDate: new Date('2023-06-15T12:00:00.000Z') } };
203
+ expect(() => schema.parse(validDataDate)).not.toThrow();
204
+
205
+ const beforeMinData = { customFields: { releaseDate: '2019-12-31T23:59:59.999Z' } };
206
+ expect(() => schema.parse(beforeMinData)).toThrow();
207
+
208
+ const afterMaxData = { customFields: { releaseDate: '2026-01-01T00:00:00.000Z' } };
209
+ expect(() => schema.parse(afterMaxData)).toThrow();
210
+ });
211
+
212
+ it('should handle boolean custom fields', () => {
213
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
214
+ const customFields = [createMockCustomField('featured', 'boolean')];
215
+
216
+ const schema = createFormSchemaFromFields(fields, customFields, false);
217
+
218
+ const validData = { customFields: { featured: true } };
219
+ expect(() => schema.parse(validData)).not.toThrow();
220
+
221
+ const invalidData = { customFields: { featured: 'yes' } };
222
+ expect(() => schema.parse(invalidData)).toThrow();
223
+ });
224
+
225
+ it('should handle list custom fields', () => {
226
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
227
+ const customFields = [createMockCustomField('tags', 'string', { list: true })];
228
+
229
+ const schema = createFormSchemaFromFields(fields, customFields, false);
230
+
231
+ const validData = { customFields: { tags: ['tag1', 'tag2'] } };
232
+ expect(() => schema.parse(validData)).not.toThrow();
233
+
234
+ const invalidData = { customFields: { tags: 'single-tag' } };
235
+ expect(() => schema.parse(invalidData)).toThrow();
236
+ });
237
+
238
+ it('should handle nullable custom fields', () => {
239
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
240
+ const customFields = [createMockCustomField('optionalField', 'string', { nullable: true })];
241
+
242
+ const schema = createFormSchemaFromFields(fields, customFields, false);
243
+
244
+ const validData = { customFields: { optionalField: 'value' } };
245
+ expect(() => schema.parse(validData)).not.toThrow();
246
+
247
+ const nullData = { customFields: { optionalField: null } };
248
+ expect(() => schema.parse(nullData)).not.toThrow();
249
+
250
+ const undefinedData = { customFields: { optionalField: undefined } };
251
+ expect(() => schema.parse(undefinedData)).not.toThrow();
252
+ });
253
+
254
+ it('should only include non-translatable fields in root context', () => {
255
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
256
+ const customFields = [
257
+ createMockCustomField('sku', 'string'), // Should be included
258
+ createMockCustomField('description', 'localeString'), // Should be excluded
259
+ createMockCustomField('content', 'localeText'), // Should be excluded
260
+ createMockCustomField('quantity', 'int'), // Should be included
261
+ ];
262
+
263
+ const schema = createFormSchemaFromFields(fields, customFields, false);
264
+
265
+ // Should accept non-translatable fields
266
+ const validData = { customFields: { sku: 'AB-123', quantity: 5 } };
267
+ expect(() => schema.parse(validData)).not.toThrow();
268
+
269
+ // Should reject translatable fields in root context
270
+ const withTranslatableData = {
271
+ customFields: {
272
+ sku: 'AB-123',
273
+ description: 'Some description', // This should cause validation to fail
274
+ },
275
+ };
276
+ // Note: This might not throw because Zod ignores extra properties by default
277
+ // The important thing is that the schema doesn't validate translatable fields
278
+ });
279
+ });
280
+
281
+ describe('createFormSchemaFromFields - custom fields (translation context)', () => {
282
+ it('should handle localeString custom fields in translation context', () => {
283
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
284
+ const customFields = [
285
+ createMockCustomField('description', 'localeString', { pattern: '^[A-Za-z\\s]+$' }),
286
+ ];
287
+
288
+ const schema = createFormSchemaFromFields(fields, customFields, true);
289
+
290
+ const validData = { customFields: { description: 'Valid Description' } };
291
+ expect(() => schema.parse(validData)).not.toThrow();
292
+
293
+ const invalidData = { customFields: { description: 'Invalid123' } };
294
+ expect(() => schema.parse(invalidData)).toThrow();
295
+ });
296
+
297
+ it('should handle localeText custom fields in translation context', () => {
298
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
299
+ const customFields = [createMockCustomField('content', 'localeText')];
300
+
301
+ const schema = createFormSchemaFromFields(fields, customFields, true);
302
+
303
+ const validData = { customFields: { content: 'Some long text content' } };
304
+ expect(() => schema.parse(validData)).not.toThrow();
305
+
306
+ const invalidData = { customFields: { content: 123 } };
307
+ expect(() => schema.parse(invalidData)).toThrow();
308
+ });
309
+
310
+ it('should only include translatable fields in translation context', () => {
311
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
312
+ const customFields = [
313
+ createMockCustomField('sku', 'string'), // Should be excluded
314
+ createMockCustomField('description', 'localeString'), // Should be included
315
+ createMockCustomField('content', 'localeText'), // Should be included
316
+ createMockCustomField('quantity', 'int'), // Should be excluded
317
+ ];
318
+
319
+ const schema = createFormSchemaFromFields(fields, customFields, true);
320
+
321
+ // Should accept translatable fields
322
+ const validData = {
323
+ customFields: {
324
+ description: 'Description',
325
+ content: 'Content',
326
+ },
327
+ };
328
+ expect(() => schema.parse(validData)).not.toThrow();
329
+ });
330
+ });
331
+
332
+ describe('createFormSchemaFromFields - translation handling', () => {
333
+ it('should handle translations field with custom fields', () => {
334
+ const fields = [
335
+ createMockField('name', 'String'),
336
+ createMockField('translations', 'Object', false, true, [
337
+ createMockField('id', 'ID'),
338
+ createMockField('languageCode', 'String'),
339
+ createMockField('name', 'String'),
340
+ createMockField('customFields', 'Object', false, false, []),
341
+ ]),
342
+ createMockField('customFields', 'Object', false, false, []),
343
+ ];
344
+ const customFields = [
345
+ createMockCustomField('sku', 'string'), // Root custom field
346
+ createMockCustomField('description', 'localeString'), // Translation custom field
347
+ ];
348
+
349
+ const schema = createFormSchemaFromFields(fields, customFields, false);
350
+
351
+ const validData = {
352
+ name: 'Product Name',
353
+ customFields: { sku: 'AB-123' }, // Root custom fields
354
+ translations: [
355
+ {
356
+ id: '1',
357
+ languageCode: 'en',
358
+ name: 'English Name',
359
+ customFields: { description: 'English description' }, // Translation custom fields
360
+ },
361
+ ],
362
+ };
363
+
364
+ expect(() => schema.parse(validData)).not.toThrow();
365
+ });
366
+ });
367
+
368
+ describe('createFormSchemaFromFields - error messages', () => {
369
+ it('should provide clear error messages for pattern validation', () => {
370
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
371
+ const customFields = [createMockCustomField('sku', 'string', { pattern: '^[A-Z]{2}-\\d{4}$' })];
372
+
373
+ const schema = createFormSchemaFromFields(fields, customFields, false);
374
+
375
+ try {
376
+ schema.parse({ customFields: { sku: 'invalid' } });
377
+ expect.fail('Should have thrown validation error');
378
+ } catch (error: any) {
379
+ expect(error.errors[0].message).toContain('Value must match pattern');
380
+ }
381
+ });
382
+
383
+ it('should provide clear error messages for min validation', () => {
384
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
385
+ const customFields = [createMockCustomField('quantity', 'int', { intMin: 1 })];
386
+
387
+ const schema = createFormSchemaFromFields(fields, customFields, false);
388
+
389
+ try {
390
+ schema.parse({ customFields: { quantity: 0 } });
391
+ expect.fail('Should have thrown validation error');
392
+ } catch (error: any) {
393
+ expect(error.errors[0].message).toContain('Value must be at least 1');
394
+ }
395
+ });
396
+
397
+ it('should provide clear error messages for max validation', () => {
398
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
399
+ const customFields = [createMockCustomField('quantity', 'int', { intMax: 100 })];
400
+
401
+ const schema = createFormSchemaFromFields(fields, customFields, false);
402
+
403
+ try {
404
+ schema.parse({ customFields: { quantity: 101 } });
405
+ expect.fail('Should have thrown validation error');
406
+ } catch (error: any) {
407
+ expect(error.errors[0].message).toContain('Value must be at most 100');
408
+ }
409
+ });
410
+
411
+ it('should provide clear error messages for datetime validation', () => {
412
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
413
+ const customFields = [
414
+ createMockCustomField('releaseDate', 'datetime', {
415
+ datetimeMin: '2020-01-01T00:00:00.000Z',
416
+ }),
417
+ ];
418
+
419
+ const schema = createFormSchemaFromFields(fields, customFields, false);
420
+
421
+ try {
422
+ schema.parse({ customFields: { releaseDate: '2019-12-31T23:59:59.999Z' } });
423
+ expect.fail('Should have thrown validation error');
424
+ } catch (error: any) {
425
+ expect(error.issues).toBeDefined();
426
+ expect(error.issues.length).toBeGreaterThan(0);
427
+ expect(error.issues[0].message).toContain('Date must be after');
428
+ }
429
+
430
+ // Test with Date object as well
431
+ try {
432
+ schema.parse({ customFields: { releaseDate: new Date('2019-12-31T23:59:59.999Z') } });
433
+ expect.fail('Should have thrown validation error');
434
+ } catch (error: any) {
435
+ expect(error.issues).toBeDefined();
436
+ expect(error.issues.length).toBeGreaterThan(0);
437
+ expect(error.issues[0].message).toContain('Date must be after');
438
+ }
439
+ });
440
+ });
441
+
442
+ describe('createFormSchemaFromFields - null constraint handling', () => {
443
+ it('should handle int custom fields with null min constraint from GraphQL API', () => {
444
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
445
+ // Simulate GraphQL API response where min/max are null instead of undefined
446
+ const customFields = [
447
+ createMockCustomField('quantity', 'int', {
448
+ intMin: null as any, // This comes as null from GraphQL API
449
+ intMax: 100,
450
+ }),
451
+ ];
452
+
453
+ // This test should fail if the bug exists - the schema creation should work
454
+ // but validation with null constraints should fail
455
+ expect(() => {
456
+ const _schema = createFormSchemaFromFields(fields, customFields, false);
457
+
458
+ // If the bug exists, this will try to validate against null min value
459
+ // which would always be false since no number can be >= null
460
+ const _validData = { customFields: { quantity: 50 } };
461
+ _schema.parse(_validData);
462
+ }).not.toThrow();
463
+
464
+ // Let's also test that we can create the schema without errors
465
+ const schema = createFormSchemaFromFields(fields, customFields, false);
466
+
467
+ // Should not apply min validation since intMin is null (if bug is fixed)
468
+ const validData = { customFields: { quantity: -50 } };
469
+ expect(() => schema.parse(validData)).not.toThrow();
470
+
471
+ // Should still apply max validation since intMax is 100
472
+ const aboveMaxData = { customFields: { quantity: 101 } };
473
+ expect(() => schema.parse(aboveMaxData)).toThrow();
474
+ });
475
+
476
+ it('should handle int custom fields with null max constraint from GraphQL API', () => {
477
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
478
+ // Simulate GraphQL API response where min/max are null instead of undefined
479
+ const customFields = [
480
+ createMockCustomField('quantity', 'int', {
481
+ intMin: 1,
482
+ intMax: null as any, // This comes as null from GraphQL API
483
+ }),
484
+ ];
485
+
486
+ const schema = createFormSchemaFromFields(fields, customFields, false);
487
+
488
+ // Should still apply min validation since intMin is 1
489
+ const belowMinData = { customFields: { quantity: 0 } };
490
+ expect(() => schema.parse(belowMinData)).toThrow();
491
+
492
+ // Should not apply max validation since intMax is null
493
+ const validData = { customFields: { quantity: 999999 } };
494
+ expect(() => schema.parse(validData)).not.toThrow();
495
+ });
496
+
497
+ it('should handle int custom fields with both null min and max constraints from GraphQL API', () => {
498
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
499
+ // Simulate GraphQL API response where min/max are both null
500
+ const customFields = [
501
+ createMockCustomField('quantity', 'int', {
502
+ intMin: null as any, // This comes as null from GraphQL API
503
+ intMax: null as any, // This comes as null from GraphQL API
504
+ }),
505
+ ];
506
+
507
+ const schema = createFormSchemaFromFields(fields, customFields, false);
508
+
509
+ // Should not apply any validation since both are null
510
+ const negativeData = { customFields: { quantity: -999 } };
511
+ expect(() => schema.parse(negativeData)).not.toThrow();
512
+
513
+ const largeData = { customFields: { quantity: 999999 } };
514
+ expect(() => schema.parse(largeData)).not.toThrow();
515
+ });
516
+
517
+ it('should handle float custom fields with null min constraint from GraphQL API', () => {
518
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
519
+ // Simulate GraphQL API response where min/max are null instead of undefined
520
+ const customFields = [
521
+ createMockCustomField('weight', 'float', {
522
+ floatMin: null as any, // This comes as null from GraphQL API
523
+ floatMax: 999.9,
524
+ }),
525
+ ];
526
+
527
+ const schema = createFormSchemaFromFields(fields, customFields, false);
528
+
529
+ // Should not apply min validation since floatMin is null
530
+ const validData = { customFields: { weight: -50.5 } };
531
+ expect(() => schema.parse(validData)).not.toThrow();
532
+
533
+ // Should still apply max validation since floatMax is 999.9
534
+ const aboveMaxData = { customFields: { weight: 1000.0 } };
535
+ expect(() => schema.parse(aboveMaxData)).toThrow();
536
+ });
537
+
538
+ it('should handle float custom fields with null max constraint from GraphQL API', () => {
539
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
540
+ // Simulate GraphQL API response where min/max are null instead of undefined
541
+ const customFields = [
542
+ createMockCustomField('weight', 'float', {
543
+ floatMin: 0.1,
544
+ floatMax: null as any, // This comes as null from GraphQL API
545
+ }),
546
+ ];
547
+
548
+ const schema = createFormSchemaFromFields(fields, customFields, false);
549
+
550
+ // Should still apply min validation since floatMin is 0.1
551
+ const belowMinData = { customFields: { weight: 0.05 } };
552
+ expect(() => schema.parse(belowMinData)).toThrow();
553
+
554
+ // Should not apply max validation since floatMax is null
555
+ const validData = { customFields: { weight: 999999.99 } };
556
+ expect(() => schema.parse(validData)).not.toThrow();
557
+ });
558
+
559
+ it('should handle float custom fields with both null min and max constraints from GraphQL API', () => {
560
+ const fields = [createMockField('customFields', 'Object', false, false, [])];
561
+ // Simulate GraphQL API response where min/max are both null
562
+ const customFields = [
563
+ createMockCustomField('weight', 'float', {
564
+ floatMin: null as any, // This comes as null from GraphQL API
565
+ floatMax: null as any, // This comes as null from GraphQL API
566
+ }),
567
+ ];
568
+
569
+ const schema = createFormSchemaFromFields(fields, customFields, false);
570
+
571
+ // Should not apply any validation since both are null
572
+ const negativeData = { customFields: { weight: -999.99 } };
573
+ expect(() => schema.parse(negativeData)).not.toThrow();
574
+
575
+ const largeData = { customFields: { weight: 999999.99 } };
576
+ expect(() => schema.parse(largeData)).not.toThrow();
577
+ });
578
+ });
579
+
580
+ describe('createFormSchemaFromFields - schema vs defaults contract', () => {
581
+ it('default values for nullable customFields inside translations should pass Zod validation', () => {
582
+ const fields: FieldInfo[] = [
583
+ createMockField('translations', 'Object', false, true, [
584
+ createMockField('id', 'ID'),
585
+ createMockField('languageCode', 'String'),
586
+ createMockField('name', 'String'),
587
+ {
588
+ name: 'customFields',
589
+ type: 'CustomFieldsInput',
590
+ nullable: true,
591
+ list: false,
592
+ isPaginatedList: false,
593
+ isScalar: false,
594
+ typeInfo: undefined,
595
+ },
596
+ ]),
597
+ ];
598
+
599
+ const defaults = getDefaultValuesFromFields(fields, 'en');
600
+ const schema = createFormSchemaFromFields(fields, [], false);
601
+
602
+ // defaults.translations[0].customFields should be {} not null
603
+ expect(defaults.translations[0].customFields).toEqual({});
604
+ expect(() => schema.parse(defaults)).not.toThrow();
605
+ });
606
+
607
+ it('default values for JSON-typed customFields should be {} not null', () => {
608
+ // When custom field structure is not known from introspection,
609
+ // the schema treats customFields as JSON scalar type
610
+ const fields: FieldInfo[] = [
611
+ {
612
+ name: 'customFields',
613
+ type: 'JSON',
614
+ nullable: true,
615
+ list: false,
616
+ isPaginatedList: false,
617
+ isScalar: true,
618
+ typeInfo: undefined,
619
+ },
620
+ ];
621
+
622
+ const defaults = getDefaultValuesFromFields(fields, 'en');
623
+ expect(defaults.customFields).toEqual({});
624
+ });
625
+
626
+ it.each([
627
+ ['Int', null],
628
+ ['Float', null],
629
+ ['Money', null],
630
+ ['DateTime', null],
631
+ ])('nullable %s field should default to null', (type, expected) => {
632
+ const fields: FieldInfo[] = [createMockField('value', type, true)];
633
+ const defaults = getDefaultValuesFromFields(fields, 'en');
634
+ expect(defaults.value).toBe(expected);
635
+ });
636
+
637
+ it.each([
638
+ ['String', ''],
639
+ ['Boolean', false],
640
+ ['ID', ''],
641
+ ])('nullable %s field should default to %s (not null)', (type, expected) => {
642
+ const fields: FieldInfo[] = [createMockField('value', type, true)];
643
+ const defaults = getDefaultValuesFromFields(fields, 'en');
644
+ expect(defaults.value).toBe(expected);
645
+ });
646
+ });
647
+
648
+ describe('createFormSchemaFromFields - edge cases', () => {
649
+ it('should handle empty custom field config', () => {
650
+ const fields = [
651
+ createMockField('name', 'String'),
652
+ createMockField('customFields', 'Object', false, false, []),
653
+ ];
654
+
655
+ const schema = createFormSchemaFromFields(fields, []);
656
+
657
+ const validData = { name: 'Test', customFields: {} };
658
+ expect(() => schema.parse(validData)).not.toThrow();
659
+ });
660
+
661
+ it('should handle no custom field config', () => {
662
+ const fields = [
663
+ createMockField('name', 'String'),
664
+ createMockField('customFields', 'Object', false, false, []),
665
+ ];
666
+
667
+ const schema = createFormSchemaFromFields(fields);
668
+
669
+ const validData = { name: 'Test' };
670
+ expect(() => schema.parse(validData)).not.toThrow();
671
+ });
672
+
673
+ it('should handle fields without customFields', () => {
674
+ const fields = [createMockField('name', 'String'), createMockField('age', 'Int')];
675
+ const customFields = [createMockCustomField('sku', 'string')];
676
+
677
+ const schema = createFormSchemaFromFields(fields, customFields);
678
+
679
+ const validData = { name: 'Test', age: 25 };
680
+ expect(() => schema.parse(validData)).not.toThrow();
681
+ });
682
+ });
683
+ });