@vendure/dashboard 3.2.0

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 (382) hide show
  1. package/README.md +13 -0
  2. package/dist/plugin/.vendure-dashboard-temp/dev-config.js +227 -0
  3. package/dist/plugin/.vendure-dashboard-temp/dev-config.js.map +1 -0
  4. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/api/api-extensions.js +33 -0
  5. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/api/api-extensions.js.map +1 -0
  6. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/api/mv.resolver.js +69 -0
  7. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/api/mv.resolver.js.map +1 -0
  8. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-order-process.js +110 -0
  9. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-order-process.js.map +1 -0
  10. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-order-seller-strategy.js +134 -0
  11. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-order-seller-strategy.js.map +1 -0
  12. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-payment-handler.js +86 -0
  13. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-payment-handler.js.map +1 -0
  14. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-shipping-eligibility-checker.js +49 -0
  15. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-shipping-eligibility-checker.js.map +1 -0
  16. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-shipping-line-assignment-strategy.js +57 -0
  17. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/config/mv-shipping-line-assignment-strategy.js.map +1 -0
  18. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/constants.js +20 -0
  19. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/constants.js.map +1 -0
  20. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/multivendor.plugin.js +151 -0
  21. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/multivendor.plugin.js.map +1 -0
  22. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/payment/mv-connect-sdk.js +47 -0
  23. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/payment/mv-connect-sdk.js.map +1 -0
  24. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/service/mv.service.js +222 -0
  25. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/service/mv.service.js.map +1 -0
  26. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/types.js +4 -0
  27. package/dist/plugin/.vendure-dashboard-temp/example-plugins/multivendor-plugin/types.js.map +1 -0
  28. package/dist/plugin/.vendure-dashboard-temp/package.json +3 -0
  29. package/dist/plugin/.vendure-dashboard-temp/schema.graphql +6378 -0
  30. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/api-extensions.js +103 -0
  31. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/api-extensions.js.map +1 -0
  32. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/product-entity.resolver.js +105 -0
  33. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/product-entity.resolver.js.map +1 -0
  34. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/product-review-admin.resolver.js +183 -0
  35. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/product-review-admin.resolver.js.map +1 -0
  36. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/product-review-entity.resolver.js +113 -0
  37. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/product-review-entity.resolver.js.map +1 -0
  38. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/product-review-shop.resolver.js +112 -0
  39. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/api/product-review-shop.resolver.js.map +1 -0
  40. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/entities/product-review.entity.js +111 -0
  41. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/entities/product-review.entity.js.map +1 -0
  42. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/generated-admin-types.js +616 -0
  43. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/generated-admin-types.js.map +1 -0
  44. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/generated-shop-types.js +563 -0
  45. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/generated-shop-types.js.map +1 -0
  46. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/reviews-plugin.js +135 -0
  47. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/reviews-plugin.js.map +1 -0
  48. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/types.js +4 -0
  49. package/dist/plugin/.vendure-dashboard-temp/test-plugins/reviews/types.js.map +1 -0
  50. package/dist/plugin/.vendure-dashboard-temp/tsconfig.json +10 -0
  51. package/dist/plugin/config-loader.d.ts +27 -0
  52. package/dist/plugin/config-loader.js +141 -0
  53. package/dist/plugin/constants.d.ts +5 -0
  54. package/dist/plugin/constants.js +277 -0
  55. package/dist/plugin/index.d.ts +1 -0
  56. package/dist/plugin/index.js +1 -0
  57. package/dist/plugin/schema-generator.d.ts +5 -0
  58. package/dist/plugin/schema-generator.js +24 -0
  59. package/dist/plugin/ui-config.d.ts +3 -0
  60. package/dist/plugin/ui-config.js +35 -0
  61. package/dist/plugin/vite-plugin-admin-api-schema.d.ts +24 -0
  62. package/dist/plugin/vite-plugin-admin-api-schema.js +82 -0
  63. package/dist/plugin/vite-plugin-config-loader.d.ts +17 -0
  64. package/dist/plugin/vite-plugin-config-loader.js +56 -0
  65. package/dist/plugin/vite-plugin-config.d.ts +4 -0
  66. package/dist/plugin/vite-plugin-config.js +38 -0
  67. package/dist/plugin/vite-plugin-dashboard-metadata.d.ts +9 -0
  68. package/dist/plugin/vite-plugin-dashboard-metadata.js +52 -0
  69. package/dist/plugin/vite-plugin-gql-tada.d.ts +6 -0
  70. package/dist/plugin/vite-plugin-gql-tada.js +51 -0
  71. package/dist/plugin/vite-plugin-set-root.d.ts +4 -0
  72. package/dist/plugin/vite-plugin-set-root.js +15 -0
  73. package/dist/plugin/vite-plugin-ui-config.d.ts +15 -0
  74. package/dist/plugin/vite-plugin-ui-config.js +43 -0
  75. package/dist/plugin/vite-plugin-vendure-dashboard.d.ts +35 -0
  76. package/dist/plugin/vite-plugin-vendure-dashboard.js +81 -0
  77. package/index.html +15 -0
  78. package/lingui.config.js +12 -0
  79. package/package.json +118 -0
  80. package/src/app/app-providers.tsx +30 -0
  81. package/src/app/main.tsx +97 -0
  82. package/src/app/routeTree.gen.ts +1372 -0
  83. package/src/app/routes/__root.tsx +24 -0
  84. package/src/app/routes/_authenticated/_administrators/administrators.graphql.ts +79 -0
  85. package/src/app/routes/_authenticated/_administrators/administrators.tsx +86 -0
  86. package/src/app/routes/_authenticated/_administrators/administrators_.$id.tsx +155 -0
  87. package/src/app/routes/_authenticated/_administrators/components/role-permissions-display.tsx +133 -0
  88. package/src/app/routes/_authenticated/_assets/assets.tsx +19 -0
  89. package/src/app/routes/_authenticated/_channels/channels.graphql.ts +93 -0
  90. package/src/app/routes/_authenticated/_channels/channels.tsx +60 -0
  91. package/src/app/routes/_authenticated/_channels/channels_.$id.tsx +248 -0
  92. package/src/app/routes/_authenticated/_collections/collections.graphql.ts +133 -0
  93. package/src/app/routes/_authenticated/_collections/collections.tsx +195 -0
  94. package/src/app/routes/_authenticated/_collections/collections_.$id.tsx +224 -0
  95. package/src/app/routes/_authenticated/_collections/components/collection-contents-preview-table.tsx +127 -0
  96. package/src/app/routes/_authenticated/_collections/components/collection-contents-sheet.tsx +46 -0
  97. package/src/app/routes/_authenticated/_collections/components/collection-contents-table.tsx +82 -0
  98. package/src/app/routes/_authenticated/_collections/components/collection-filters-selector.tsx +91 -0
  99. package/src/app/routes/_authenticated/_countries/countries.graphql.ts +69 -0
  100. package/src/app/routes/_authenticated/_countries/countries.tsx +67 -0
  101. package/src/app/routes/_authenticated/_countries/countries_.$id.tsx +122 -0
  102. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-sheet.tsx +44 -0
  103. package/src/app/routes/_authenticated/_customer-groups/components/customer-group-members-table.tsx +129 -0
  104. package/src/app/routes/_authenticated/_customer-groups/customer-groups.graphql.ts +71 -0
  105. package/src/app/routes/_authenticated/_customer-groups/customer-groups.tsx +68 -0
  106. package/src/app/routes/_authenticated/_customer-groups/customer-groups_.$id.tsx +111 -0
  107. package/src/app/routes/_authenticated/_customers/components/customer-address-card.tsx +155 -0
  108. package/src/app/routes/_authenticated/_customers/components/customer-address-form.tsx +344 -0
  109. package/src/app/routes/_authenticated/_customers/components/customer-group-controls.tsx +4 -0
  110. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history-container.tsx +78 -0
  111. package/src/app/routes/_authenticated/_customers/components/customer-history/customer-history.tsx +77 -0
  112. package/src/app/routes/_authenticated/_customers/components/customer-history/index.ts +3 -0
  113. package/src/app/routes/_authenticated/_customers/components/customer-history/use-customer-history.ts +169 -0
  114. package/src/app/routes/_authenticated/_customers/components/customer-order-table.tsx +88 -0
  115. package/src/app/routes/_authenticated/_customers/components/customer-status-badge.tsx +33 -0
  116. package/src/app/routes/_authenticated/_customers/customers.graphql.ts +204 -0
  117. package/src/app/routes/_authenticated/_customers/customers.tsx +82 -0
  118. package/src/app/routes/_authenticated/_customers/customers_.$id.tsx +274 -0
  119. package/src/app/routes/_authenticated/_facets/components/edit-facet-value.tsx +129 -0
  120. package/src/app/routes/_authenticated/_facets/components/facet-values-sheet.tsx +46 -0
  121. package/src/app/routes/_authenticated/_facets/components/facet-values-table.tsx +97 -0
  122. package/src/app/routes/_authenticated/_facets/facets.graphql.ts +104 -0
  123. package/src/app/routes/_authenticated/_facets/facets.tsx +97 -0
  124. package/src/app/routes/_authenticated/_facets/facets_.$id.tsx +139 -0
  125. package/src/app/routes/_authenticated/_global-settings/global-settings.graphql.ts +28 -0
  126. package/src/app/routes/_authenticated/_global-settings/global-settings.tsx +161 -0
  127. package/src/app/routes/_authenticated/_orders/components/order-address.tsx +58 -0
  128. package/src/app/routes/_authenticated/_orders/components/order-history/index.ts +3 -0
  129. package/src/app/routes/_authenticated/_orders/components/order-history/order-history-container.tsx +73 -0
  130. package/src/app/routes/_authenticated/_orders/components/order-history/order-history.tsx +96 -0
  131. package/src/app/routes/_authenticated/_orders/components/order-history/use-order-history.ts +171 -0
  132. package/src/app/routes/_authenticated/_orders/components/order-table.tsx +169 -0
  133. package/src/app/routes/_authenticated/_orders/components/order-tax-summary.tsx +39 -0
  134. package/src/app/routes/_authenticated/_orders/components/payment-details.tsx +61 -0
  135. package/src/app/routes/_authenticated/_orders/orders.graphql.ts +325 -0
  136. package/src/app/routes/_authenticated/_orders/orders.tsx +120 -0
  137. package/src/app/routes/_authenticated/_orders/orders_.$id.tsx +133 -0
  138. package/src/app/routes/_authenticated/_payment-methods/components/payment-eligibility-checker-selector.tsx +104 -0
  139. package/src/app/routes/_authenticated/_payment-methods/components/payment-handler-selector.tsx +100 -0
  140. package/src/app/routes/_authenticated/_payment-methods/payment-methods.graphql.ts +83 -0
  141. package/src/app/routes/_authenticated/_payment-methods/payment-methods.tsx +64 -0
  142. package/src/app/routes/_authenticated/_payment-methods/payment-methods_.$id.tsx +183 -0
  143. package/src/app/routes/_authenticated/_product-variants/components/variant-price-detail.tsx +87 -0
  144. package/src/app/routes/_authenticated/_product-variants/product-variants.graphql.ts +123 -0
  145. package/src/app/routes/_authenticated/_product-variants/product-variants.tsx +78 -0
  146. package/src/app/routes/_authenticated/_product-variants/product-variants_.$id.tsx +331 -0
  147. package/src/app/routes/_authenticated/_products/components/create-product-variants-dialog.tsx +228 -0
  148. package/src/app/routes/_authenticated/_products/components/create-product-variants.tsx +462 -0
  149. package/src/app/routes/_authenticated/_products/components/option-value-input.tsx +96 -0
  150. package/src/app/routes/_authenticated/_products/components/product-variants-table.tsx +87 -0
  151. package/src/app/routes/_authenticated/_products/products.graphql.ts +116 -0
  152. package/src/app/routes/_authenticated/_products/products.tsx +48 -0
  153. package/src/app/routes/_authenticated/_products/products_.$id.tsx +196 -0
  154. package/src/app/routes/_authenticated/_profile/profile.graphql.ts +23 -0
  155. package/src/app/routes/_authenticated/_profile/profile.tsx +122 -0
  156. package/src/app/routes/_authenticated/_promotions/components/promotion-actions-selector.tsx +107 -0
  157. package/src/app/routes/_authenticated/_promotions/components/promotion-conditions-selector.tsx +107 -0
  158. package/src/app/routes/_authenticated/_promotions/promotions.graphql.ts +96 -0
  159. package/src/app/routes/_authenticated/_promotions/promotions.tsx +61 -0
  160. package/src/app/routes/_authenticated/_promotions/promotions_.$id.tsx +235 -0
  161. package/src/app/routes/_authenticated/_roles/components/expandable-permissions.tsx +54 -0
  162. package/src/app/routes/_authenticated/_roles/components/permissions-grid.tsx +116 -0
  163. package/src/app/routes/_authenticated/_roles/roles.graphql.ts +67 -0
  164. package/src/app/routes/_authenticated/_roles/roles.tsx +96 -0
  165. package/src/app/routes/_authenticated/_roles/roles_.$id.tsx +142 -0
  166. package/src/app/routes/_authenticated/_sellers/sellers.graphql.ts +61 -0
  167. package/src/app/routes/_authenticated/_sellers/sellers.tsx +51 -0
  168. package/src/app/routes/_authenticated/_sellers/sellers_.$id.tsx +111 -0
  169. package/src/app/routes/_authenticated/_shipping-methods/components/fulfillment-handler-selector.tsx +56 -0
  170. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-calculator-selector.tsx +101 -0
  171. package/src/app/routes/_authenticated/_shipping-methods/components/shipping-eligibility-checker-selector.tsx +101 -0
  172. package/src/app/routes/_authenticated/_shipping-methods/components/test-shipping-method-dialog.tsx +32 -0
  173. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.graphql.ts +83 -0
  174. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods.tsx +55 -0
  175. package/src/app/routes/_authenticated/_shipping-methods/shipping-methods_.$id.tsx +171 -0
  176. package/src/app/routes/_authenticated/_stock-locations/stock-locations.graphql.ts +62 -0
  177. package/src/app/routes/_authenticated/_stock-locations/stock-locations.tsx +48 -0
  178. package/src/app/routes/_authenticated/_stock-locations/stock-locations_.$id.tsx +115 -0
  179. package/src/app/routes/_authenticated/_system/components/payload-dialog.tsx +34 -0
  180. package/src/app/routes/_authenticated/_system/healthchecks.tsx +93 -0
  181. package/src/app/routes/_authenticated/_system/job-queue.graphql.ts +43 -0
  182. package/src/app/routes/_authenticated/_system/job-queue.tsx +161 -0
  183. package/src/app/routes/_authenticated/_tax-categories/tax-categories.graphql.ts +63 -0
  184. package/src/app/routes/_authenticated/_tax-categories/tax-categories.tsx +65 -0
  185. package/src/app/routes/_authenticated/_tax-categories/tax-categories_.$id.tsx +115 -0
  186. package/src/app/routes/_authenticated/_tax-rates/tax-rates.graphql.ts +75 -0
  187. package/src/app/routes/_authenticated/_tax-rates/tax-rates.tsx +108 -0
  188. package/src/app/routes/_authenticated/_tax-rates/tax-rates_.$id.tsx +148 -0
  189. package/src/app/routes/_authenticated/_zones/components/zone-countries-add.tsx +0 -0
  190. package/src/app/routes/_authenticated/_zones/components/zone-countries-sheet.tsx +31 -0
  191. package/src/app/routes/_authenticated/_zones/components/zone-countries-table.tsx +79 -0
  192. package/src/app/routes/_authenticated/_zones/zones.graphql.ts +96 -0
  193. package/src/app/routes/_authenticated/_zones/zones.tsx +57 -0
  194. package/src/app/routes/_authenticated/_zones/zones_.$id.tsx +103 -0
  195. package/src/app/routes/_authenticated/index.tsx +194 -0
  196. package/src/app/routes/_authenticated.tsx +25 -0
  197. package/src/app/routes/login.tsx +48 -0
  198. package/src/app/styles.css +82 -0
  199. package/src/app/tailwindcss-animate.css +275 -0
  200. package/src/i18n/locales/de.po +1579 -0
  201. package/src/i18n/locales/en.po +1579 -0
  202. package/src/lib/components/data-display/boolean.tsx +23 -0
  203. package/src/lib/components/data-display/date-time.tsx +13 -0
  204. package/src/lib/components/data-display/json.tsx +5 -0
  205. package/src/lib/components/data-display/money.tsx +15 -0
  206. package/src/lib/components/data-input/affixed-input.tsx +49 -0
  207. package/src/lib/components/data-input/customer-group-input.tsx +72 -0
  208. package/src/lib/components/data-input/datetime-input.tsx +150 -0
  209. package/src/lib/components/data-input/facet-value-input.tsx +68 -0
  210. package/src/lib/components/data-input/money-input.tsx +112 -0
  211. package/src/lib/components/data-input/richt-text-input.tsx +99 -0
  212. package/src/lib/components/data-table/data-table-column-header.tsx +73 -0
  213. package/src/lib/components/data-table/data-table-faceted-filter.tsx +172 -0
  214. package/src/lib/components/data-table/data-table-filter-dialog.tsx +73 -0
  215. package/src/lib/components/data-table/data-table-pagination.tsx +87 -0
  216. package/src/lib/components/data-table/data-table-view-options.tsx +53 -0
  217. package/src/lib/components/data-table/data-table.tsx +218 -0
  218. package/src/lib/components/layout/app-layout.tsx +42 -0
  219. package/src/lib/components/layout/app-sidebar.tsx +34 -0
  220. package/src/lib/components/layout/channel-switcher.tsx +87 -0
  221. package/src/lib/components/layout/content-language-selector.tsx +41 -0
  222. package/src/lib/components/layout/generated-breadcrumbs.tsx +82 -0
  223. package/src/lib/components/layout/language-dialog.tsx +104 -0
  224. package/src/lib/components/layout/nav-main.tsx +178 -0
  225. package/src/lib/components/layout/nav-projects.tsx +81 -0
  226. package/src/lib/components/layout/nav-user.tsx +176 -0
  227. package/src/lib/components/layout/prerelease-popup.tsx +38 -0
  228. package/src/lib/components/login/login-form.tsx +173 -0
  229. package/src/lib/components/shared/alerts.tsx +20 -0
  230. package/src/lib/components/shared/animated-number.tsx +49 -0
  231. package/src/lib/components/shared/asset-gallery.tsx +433 -0
  232. package/src/lib/components/shared/asset-picker-dialog.tsx +72 -0
  233. package/src/lib/components/shared/asset-preview-dialog.tsx +48 -0
  234. package/src/lib/components/shared/asset-preview.tsx +345 -0
  235. package/src/lib/components/shared/assigned-facet-values.tsx +68 -0
  236. package/src/lib/components/shared/channel-code-label.tsx +7 -0
  237. package/src/lib/components/shared/channel-selector.tsx +51 -0
  238. package/src/lib/components/shared/configurable-operation-arg-input.tsx +51 -0
  239. package/src/lib/components/shared/configurable-operation-input.tsx +133 -0
  240. package/src/lib/components/shared/confirmation-dialog.tsx +58 -0
  241. package/src/lib/components/shared/copyable-text.tsx +31 -0
  242. package/src/lib/components/shared/country-selector.tsx +105 -0
  243. package/src/lib/components/shared/currency-selector.tsx +33 -0
  244. package/src/lib/components/shared/custom-fields-form.tsx +86 -0
  245. package/src/lib/components/shared/customer-address-form.tsx +330 -0
  246. package/src/lib/components/shared/customer-group-chip.tsx +30 -0
  247. package/src/lib/components/shared/customer-group-selector.tsx +62 -0
  248. package/src/lib/components/shared/customer-selector.tsx +107 -0
  249. package/src/lib/components/shared/detail-page-button.tsx +22 -0
  250. package/src/lib/components/shared/entity-assets.tsx +340 -0
  251. package/src/lib/components/shared/error-page.tsx +31 -0
  252. package/src/lib/components/shared/facet-value-chip.tsx +45 -0
  253. package/src/lib/components/shared/facet-value-selector.tsx +306 -0
  254. package/src/lib/components/shared/focal-point-control.tsx +65 -0
  255. package/src/lib/components/shared/form-field-wrapper.tsx +37 -0
  256. package/src/lib/components/shared/history-timeline/history-entry.tsx +112 -0
  257. package/src/lib/components/shared/history-timeline/history-note-checkbox.tsx +28 -0
  258. package/src/lib/components/shared/history-timeline/history-note-editor.tsx +60 -0
  259. package/src/lib/components/shared/history-timeline/history-note-input.tsx +39 -0
  260. package/src/lib/components/shared/history-timeline/history-timeline.tsx +56 -0
  261. package/src/lib/components/shared/icon-mark.tsx +18 -0
  262. package/src/lib/components/shared/language-selector.tsx +48 -0
  263. package/src/lib/components/shared/logo-mark.tsx +24 -0
  264. package/src/lib/components/shared/multi-select.tsx +159 -0
  265. package/src/lib/components/shared/option-value-input.tsx +95 -0
  266. package/src/lib/components/shared/paginated-list-data-table.tsx +520 -0
  267. package/src/lib/components/shared/permission-guard.tsx +21 -0
  268. package/src/lib/components/shared/rich-text-editor.tsx +0 -0
  269. package/src/lib/components/shared/role-code-label.tsx +8 -0
  270. package/src/lib/components/shared/role-selector.tsx +56 -0
  271. package/src/lib/components/shared/seller-selector.tsx +107 -0
  272. package/src/lib/components/shared/tax-category-selector.tsx +65 -0
  273. package/src/lib/components/shared/translatable-form-field.tsx +74 -0
  274. package/src/lib/components/shared/vendure-image.tsx +159 -0
  275. package/src/lib/components/shared/zone-selector.tsx +66 -0
  276. package/src/lib/components/ui/accordion.tsx +59 -0
  277. package/src/lib/components/ui/alert-dialog.tsx +128 -0
  278. package/src/lib/components/ui/alert.tsx +60 -0
  279. package/src/lib/components/ui/avatar.tsx +38 -0
  280. package/src/lib/components/ui/badge.tsx +38 -0
  281. package/src/lib/components/ui/breadcrumb.tsx +102 -0
  282. package/src/lib/components/ui/button.tsx +51 -0
  283. package/src/lib/components/ui/calendar.tsx +69 -0
  284. package/src/lib/components/ui/card.tsx +47 -0
  285. package/src/lib/components/ui/checkbox.tsx +27 -0
  286. package/src/lib/components/ui/collapsible.tsx +33 -0
  287. package/src/lib/components/ui/command.tsx +133 -0
  288. package/src/lib/components/ui/dialog.tsx +116 -0
  289. package/src/lib/components/ui/dropdown-menu.tsx +220 -0
  290. package/src/lib/components/ui/form.tsx +141 -0
  291. package/src/lib/components/ui/hover-card.tsx +36 -0
  292. package/src/lib/components/ui/input.tsx +19 -0
  293. package/src/lib/components/ui/label.tsx +21 -0
  294. package/src/lib/components/ui/pagination.tsx +127 -0
  295. package/src/lib/components/ui/popover.tsx +40 -0
  296. package/src/lib/components/ui/scroll-area.tsx +50 -0
  297. package/src/lib/components/ui/select.tsx +161 -0
  298. package/src/lib/components/ui/separator.tsx +26 -0
  299. package/src/lib/components/ui/sheet.tsx +118 -0
  300. package/src/lib/components/ui/sidebar.tsx +696 -0
  301. package/src/lib/components/ui/skeleton.tsx +13 -0
  302. package/src/lib/components/ui/sonner.tsx +27 -0
  303. package/src/lib/components/ui/switch.tsx +26 -0
  304. package/src/lib/components/ui/table.tsx +82 -0
  305. package/src/lib/components/ui/tabs.tsx +48 -0
  306. package/src/lib/components/ui/textarea.tsx +18 -0
  307. package/src/lib/components/ui/tooltip.tsx +51 -0
  308. package/src/lib/constants.ts +326 -0
  309. package/src/lib/framework/component-registry/component-registry.tsx +70 -0
  310. package/src/lib/framework/component-registry/dynamic-component.tsx +58 -0
  311. package/src/lib/framework/dashboard-widget/base-widget.tsx +97 -0
  312. package/src/lib/framework/dashboard-widget/latest-orders-widget/index.tsx +96 -0
  313. package/src/lib/framework/dashboard-widget/latest-orders-widget/latest-orders-widget.graphql.ts +35 -0
  314. package/src/lib/framework/dashboard-widget/metrics-widget/chart.tsx +24 -0
  315. package/src/lib/framework/dashboard-widget/metrics-widget/index.tsx +82 -0
  316. package/src/lib/framework/dashboard-widget/metrics-widget/metrics-widget.graphql.ts +14 -0
  317. package/src/lib/framework/dashboard-widget/orders-summary/index.tsx +167 -0
  318. package/src/lib/framework/dashboard-widget/orders-summary/order-summary-widget.graphql.ts +14 -0
  319. package/src/lib/framework/dashboard-widget/types.ts +22 -0
  320. package/src/lib/framework/dashboard-widget/widget-extensions.tsx +19 -0
  321. package/src/lib/framework/defaults.ts +219 -0
  322. package/src/lib/framework/document-introspection/add-custom-fields.spec.ts +242 -0
  323. package/src/lib/framework/document-introspection/add-custom-fields.ts +246 -0
  324. package/src/lib/framework/document-introspection/get-document-structure.spec.ts +310 -0
  325. package/src/lib/framework/document-introspection/get-document-structure.ts +460 -0
  326. package/src/lib/framework/document-introspection/hooks.ts +10 -0
  327. package/src/lib/framework/extension-api/define-dashboard-extension.ts +66 -0
  328. package/src/lib/framework/extension-api/extension-api-types.ts +58 -0
  329. package/src/lib/framework/extension-api/use-dashboard-extensions.ts +26 -0
  330. package/src/lib/framework/form-engine/form-schema-tools.ts +98 -0
  331. package/src/lib/framework/form-engine/use-generated-form.tsx +116 -0
  332. package/src/lib/framework/layout-engine/layout-extensions.ts +30 -0
  333. package/src/lib/framework/layout-engine/location-wrapper.tsx +96 -0
  334. package/src/lib/framework/layout-engine/page-layout.tsx +272 -0
  335. package/src/lib/framework/nav-menu/nav-menu-extensions.ts +66 -0
  336. package/src/lib/framework/page/detail-page-route-loader.tsx +48 -0
  337. package/src/lib/framework/page/detail-page.tsx +131 -0
  338. package/src/lib/framework/page/list-page.tsx +166 -0
  339. package/src/lib/framework/page/page-api.ts +9 -0
  340. package/src/lib/framework/page/page-types.ts +51 -0
  341. package/src/lib/framework/page/use-detail-page.ts +217 -0
  342. package/src/lib/framework/page/use-extended-router.tsx +69 -0
  343. package/src/lib/framework/registry/global-registry.ts +46 -0
  344. package/src/lib/framework/registry/registry-types.ts +15 -0
  345. package/src/lib/graphql/api.ts +61 -0
  346. package/src/lib/graphql/fragments.tsx +54 -0
  347. package/src/lib/graphql/graphql-env.d.ts +499 -0
  348. package/src/lib/graphql/graphql.ts +15 -0
  349. package/src/lib/hooks/use-auth.tsx +11 -0
  350. package/src/lib/hooks/use-channel.ts +12 -0
  351. package/src/lib/hooks/use-custom-field-config.ts +10 -0
  352. package/src/lib/hooks/use-grouped-permissions.ts +54 -0
  353. package/src/lib/hooks/use-local-format.ts +119 -0
  354. package/src/lib/hooks/use-mobile.ts +19 -0
  355. package/src/lib/hooks/use-page.tsx +11 -0
  356. package/src/lib/hooks/use-permissions.ts +22 -0
  357. package/src/lib/hooks/use-server-config.ts +4 -0
  358. package/src/lib/hooks/use-theme.ts +10 -0
  359. package/src/lib/hooks/use-user-settings.tsx +12 -0
  360. package/src/lib/index.ts +149 -0
  361. package/src/lib/lib/trans.tsx +16 -0
  362. package/src/lib/lib/utils.ts +60 -0
  363. package/src/lib/providers/auth.tsx +152 -0
  364. package/src/lib/providers/channel-provider.tsx +121 -0
  365. package/src/lib/providers/i18n-provider.tsx +28 -0
  366. package/src/lib/providers/server-config.tsx +279 -0
  367. package/src/lib/providers/theme-provider.tsx +54 -0
  368. package/src/lib/providers/user-settings.tsx +89 -0
  369. package/src/lib/virtual.d.ts +12 -0
  370. package/vite/config-loader.ts +181 -0
  371. package/vite/constants.ts +280 -0
  372. package/vite/index.ts +1 -0
  373. package/vite/schema-generator.ts +40 -0
  374. package/vite/ui-config.ts +60 -0
  375. package/vite/vite-plugin-admin-api-schema.ts +141 -0
  376. package/vite/vite-plugin-config-loader.ts +64 -0
  377. package/vite/vite-plugin-config.ts +42 -0
  378. package/vite/vite-plugin-dashboard-metadata.ts +58 -0
  379. package/vite/vite-plugin-gql-tada.ts +62 -0
  380. package/vite/vite-plugin-theme.ts +195 -0
  381. package/vite/vite-plugin-ui-config.ts +60 -0
  382. package/vite/vite-plugin-vendure-dashboard.ts +118 -0
@@ -0,0 +1,152 @@
1
+ import { api } from '@/graphql/api.js';
2
+ import { ResultOf, graphql } from '@/graphql/graphql.js';
3
+ import { useUserSettings } from '@/hooks/use-user-settings.js';
4
+ import { useMutation, useQuery } from '@tanstack/react-query';
5
+ import * as React from 'react';
6
+
7
+ export interface AuthContext {
8
+ status: 'authenticated' | 'verifying' | 'unauthenticated';
9
+ authenticationError?: string;
10
+ isAuthenticated: boolean;
11
+ login: (username: string, password: string, onSuccess?: () => void) => void;
12
+ logout: (onSuccess?: () => void) => Promise<void>;
13
+ user: ResultOf<typeof CurrentUserQuery>['activeAdministrator'] | undefined;
14
+ channels: NonNullable<ResultOf<typeof CurrentUserQuery>['me']>['channels'] | undefined;
15
+ }
16
+
17
+ const LoginMutation = graphql(`
18
+ mutation Login($username: String!, $password: String!) {
19
+ login(username: $username, password: $password) {
20
+ __typename
21
+ ... on CurrentUser {
22
+ id
23
+ identifier
24
+ }
25
+ ... on ErrorResult {
26
+ message
27
+ errorCode
28
+ }
29
+ }
30
+ }
31
+ `);
32
+
33
+ const LogOutMutation = graphql(`
34
+ mutation LogOut {
35
+ logout {
36
+ success
37
+ }
38
+ }
39
+ `);
40
+
41
+ const CurrentUserQuery = graphql(`
42
+ query CurrentUserInformation {
43
+ me {
44
+ id
45
+ identifier
46
+ channels {
47
+ id
48
+ token
49
+ code
50
+ permissions
51
+ }
52
+ }
53
+ activeAdministrator {
54
+ id
55
+ firstName
56
+ lastName
57
+ emailAddress
58
+ }
59
+ }
60
+ `);
61
+
62
+ export const AuthContext = React.createContext<AuthContext | null>(null);
63
+
64
+ export function AuthProvider({ children }: { children: React.ReactNode }) {
65
+ const [status, setStatus] = React.useState<AuthContext['status']>('verifying');
66
+ const [authenticationError, setAuthenticationError] = React.useState<string | undefined>();
67
+ const { settings, setActiveChannelId } = useUserSettings();
68
+ const onLoginSuccessFn = React.useRef<() => void>(() => {});
69
+ const onLogoutSuccessFn = React.useRef<() => void>(() => {});
70
+ const isAuthenticated = status === 'authenticated';
71
+
72
+ const { data: currentUserData, isLoading } = useQuery({
73
+ queryKey: ['currentUser'],
74
+ queryFn: () => api.query(CurrentUserQuery),
75
+ retry: false,
76
+ });
77
+
78
+ React.useEffect(() => {
79
+ if (!settings.activeChannelId && currentUserData?.me?.channels?.length) {
80
+ setActiveChannelId(currentUserData.me.channels[0].id);
81
+ }
82
+ }, [settings.activeChannelId, currentUserData?.me?.channels]);
83
+
84
+ const loginMutationFn = api.mutate(LoginMutation);
85
+ const loginMutation = useMutation({
86
+ mutationFn: loginMutationFn,
87
+ onSuccess: async data => {
88
+ if (data.login.__typename === 'CurrentUser') {
89
+ setStatus('authenticated');
90
+ onLoginSuccessFn.current();
91
+ } else {
92
+ setAuthenticationError(data?.login.message);
93
+ setStatus('unauthenticated');
94
+ }
95
+ },
96
+ onError: error => {
97
+ setAuthenticationError(error.message);
98
+ setStatus('unauthenticated');
99
+ },
100
+ });
101
+
102
+ const logoutMutationFn = api.mutate(LogOutMutation);
103
+ const logoutMutation = useMutation({
104
+ mutationFn: logoutMutationFn,
105
+ onSuccess: async data => {
106
+ if (data?.logout.success === true) {
107
+ setStatus('unauthenticated');
108
+ onLogoutSuccessFn.current();
109
+ }
110
+ },
111
+ });
112
+
113
+ const logout = React.useCallback(async (onLogoutSuccess?: () => void) => {
114
+ logoutMutation.mutate({});
115
+ onLogoutSuccessFn.current = onLogoutSuccess || (() => {});
116
+ }, []);
117
+
118
+ const login = React.useCallback((username: string, password: string, onLoginSuccess?: () => void) => {
119
+ setStatus('verifying');
120
+ onLoginSuccessFn.current = onLoginSuccess || (() => {});
121
+ loginMutation.mutate({ username, password });
122
+ }, []);
123
+
124
+ React.useEffect(() => {
125
+ if (!isLoading) {
126
+ if (currentUserData?.me?.id) {
127
+ setStatus('authenticated');
128
+ } else {
129
+ setStatus('unauthenticated');
130
+ }
131
+ } else {
132
+ setStatus('verifying');
133
+ }
134
+ }, [isLoading, currentUserData]);
135
+
136
+ return (
137
+ <AuthContext.Provider
138
+ value={{
139
+ isAuthenticated,
140
+ authenticationError,
141
+ status,
142
+ user: currentUserData?.activeAdministrator,
143
+ channels: currentUserData?.me?.channels,
144
+ login,
145
+ logout,
146
+ }}
147
+ >
148
+ {children}
149
+ </AuthContext.Provider>
150
+ );
151
+ }
152
+
@@ -0,0 +1,121 @@
1
+ import * as React from 'react';
2
+ import { api } from '@/graphql/api.js';
3
+ import { ResultOf, graphql } from '@/graphql/graphql.js';
4
+ import { useQuery } from '@tanstack/react-query';
5
+
6
+ // Define the channel fragment for reuse
7
+ const channelFragment = graphql(`
8
+ fragment ChannelInfo on Channel {
9
+ id
10
+ code
11
+ token
12
+ defaultLanguageCode
13
+ defaultCurrencyCode
14
+ pricesIncludeTax
15
+ }
16
+ `);
17
+
18
+ // Query to get all available channels and the active channel
19
+ const ChannelsQuery = graphql(
20
+ `
21
+ query ChannelInformation {
22
+ activeChannel {
23
+ ...ChannelInfo
24
+ defaultTaxZone {
25
+ id
26
+ }
27
+ }
28
+ channels {
29
+ items {
30
+ ...ChannelInfo
31
+ }
32
+ totalItems
33
+ }
34
+ }
35
+ `,
36
+ [channelFragment],
37
+ );
38
+
39
+
40
+ // Define the type for a channel
41
+ type ActiveChannel = ResultOf<typeof ChannelsQuery>['activeChannel'];
42
+ type Channel = ResultOf<typeof channelFragment>;
43
+
44
+ // Define the context interface
45
+ export interface ChannelContext {
46
+ activeChannel: ActiveChannel | undefined;
47
+ channels: Channel[];
48
+ selectedChannelId: string | undefined;
49
+ selectedChannel: Channel | undefined;
50
+ isLoading: boolean;
51
+ setSelectedChannel: (channelId: string) => void;
52
+ }
53
+
54
+ // Create the context
55
+ export const ChannelContext = React.createContext<ChannelContext | undefined>(undefined);
56
+
57
+ // Local storage key for the selected channel
58
+ const SELECTED_CHANNEL_KEY = 'vendure-selected-channel';
59
+
60
+ export function ChannelProvider({ children }: { children: React.ReactNode }) {
61
+ const [selectedChannelId, setSelectedChannelId] = React.useState<string | undefined>(() => {
62
+ // Initialize from localStorage if available
63
+ try {
64
+ const storedChannelId = localStorage.getItem(SELECTED_CHANNEL_KEY);
65
+ return storedChannelId || undefined;
66
+ } catch (e) {
67
+ console.error('Failed to load selected channel from localStorage', e);
68
+ return undefined;
69
+ }
70
+ });
71
+
72
+ // Fetch all available channels
73
+ const { data: channelsData, isLoading: isChannelsLoading } = useQuery({
74
+ queryKey: ['channels'],
75
+ queryFn: () => api.query(ChannelsQuery),
76
+ });
77
+
78
+ // Set the selected channel and update localStorage
79
+ const setSelectedChannel = React.useCallback((channelId: string) => {
80
+ try {
81
+ // Store in localStorage
82
+ localStorage.setItem(SELECTED_CHANNEL_KEY, channelId);
83
+ setSelectedChannelId(channelId);
84
+ } catch (e) {
85
+ console.error('Failed to set selected channel', e);
86
+ }
87
+ }, []);
88
+
89
+ // If no selected channel is set but we have an active channel, use that
90
+ React.useEffect(() => {
91
+ if (!selectedChannelId && channelsData?.activeChannel?.id) {
92
+ setSelectedChannelId(channelsData.activeChannel.id);
93
+ try {
94
+ localStorage.setItem(SELECTED_CHANNEL_KEY, channelsData.activeChannel.id);
95
+ } catch (e) {
96
+ console.error('Failed to store selected channel in localStorage', e);
97
+ }
98
+ }
99
+ }, [selectedChannelId, channelsData]);
100
+
101
+ const channels = channelsData?.channels.items || [];
102
+ const activeChannel = channelsData?.activeChannel;
103
+ const isLoading = isChannelsLoading;
104
+
105
+ // Find the selected channel from the list of channels
106
+ const selectedChannel = React.useMemo(() => {
107
+ return channels.find(channel => channel.id === selectedChannelId);
108
+ }, [channels, selectedChannelId]);
109
+
110
+ const contextValue: ChannelContext = {
111
+ activeChannel,
112
+ channels,
113
+ selectedChannelId,
114
+ selectedChannel,
115
+ isLoading,
116
+ setSelectedChannel,
117
+ };
118
+
119
+ return <ChannelContext.Provider value={contextValue}>{children}</ChannelContext.Provider>;
120
+ }
121
+
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+ // import { i18n } from '@lingui/core';
3
+ // import { I18nProvider as LinguiI18nProvider } from '@lingui/react';
4
+
5
+ export const locales = {
6
+ en: 'English',
7
+ de: 'Deutsch',
8
+ };
9
+ export const defaultLocale = 'en';
10
+
11
+ /**
12
+ * We do a dynamic import of just the catalog that we need
13
+ * @param locale any locale string
14
+ */
15
+ export async function dynamicActivate(locale: string, onActivate?: () => void) {
16
+ // Temporarily disabled because Lingui macros do not work when the dashboard is packaged in an npm module.
17
+ // Related issue: https://github.com/kentcdodds/babel-plugin-macros/issues/87
18
+
19
+ // const { messages } = await import(`../../i18n/locales/${locale}.po`);
20
+ // i18n.load(locale, messages);
21
+ // i18n.activate(locale);
22
+ onActivate?.();
23
+ }
24
+
25
+ export function I18nProvider({ children }: { children: React.ReactNode }) {
26
+ // return <LinguiI18nProvider i18n={i18n}>{children}</LinguiI18nProvider>;
27
+ return <>{children}</>;
28
+ }
@@ -0,0 +1,279 @@
1
+ import { api } from '@/graphql/api.js';
2
+ import { graphql } from '@/graphql/graphql.js';
3
+ import { useQuery } from '@tanstack/react-query';
4
+ import { ResultOf } from 'gql.tada';
5
+ import React from 'react';
6
+
7
+ export const customFieldConfigFragment = graphql(`
8
+ fragment CustomFieldConfig on CustomField {
9
+ name
10
+ type
11
+ list
12
+ description {
13
+ languageCode
14
+ value
15
+ }
16
+ label {
17
+ languageCode
18
+ value
19
+ }
20
+ readonly
21
+ nullable
22
+ requiresPermission
23
+ ui
24
+ }
25
+ `);
26
+
27
+ export const stringCustomFieldFragment = graphql(
28
+ `
29
+ fragment StringCustomField on StringCustomFieldConfig {
30
+ ...CustomFieldConfig
31
+ pattern
32
+ options {
33
+ label {
34
+ languageCode
35
+ value
36
+ }
37
+ value
38
+ }
39
+ }
40
+ `,
41
+ [customFieldConfigFragment],
42
+ );
43
+ export const localeStringCustomFieldFragment = graphql(
44
+ `
45
+ fragment LocaleStringCustomField on LocaleStringCustomFieldConfig {
46
+ ...CustomFieldConfig
47
+ pattern
48
+ }
49
+ `,
50
+ [customFieldConfigFragment],
51
+ );
52
+ export const textCustomFieldFragment = graphql(
53
+ `
54
+ fragment TextCustomField on TextCustomFieldConfig {
55
+ ...CustomFieldConfig
56
+ }
57
+ `,
58
+ [customFieldConfigFragment],
59
+ );
60
+ export const localeTextCustomFieldFragment = graphql(
61
+ `
62
+ fragment LocaleTextCustomField on LocaleTextCustomFieldConfig {
63
+ ...CustomFieldConfig
64
+ }
65
+ `,
66
+ [customFieldConfigFragment],
67
+ );
68
+ export const booleanCustomFieldFragment = graphql(
69
+ `
70
+ fragment BooleanCustomField on BooleanCustomFieldConfig {
71
+ ...CustomFieldConfig
72
+ }
73
+ `,
74
+ [customFieldConfigFragment],
75
+ );
76
+ export const intCustomFieldFragment = graphql(
77
+ `
78
+ fragment IntCustomField on IntCustomFieldConfig {
79
+ ...CustomFieldConfig
80
+ intMin: min
81
+ intMax: max
82
+ intStep: step
83
+ }
84
+ `,
85
+ [customFieldConfigFragment],
86
+ );
87
+ export const floatCustomFieldFragment = graphql(
88
+ `
89
+ fragment FloatCustomField on FloatCustomFieldConfig {
90
+ ...CustomFieldConfig
91
+ floatMin: min
92
+ floatMax: max
93
+ floatStep: step
94
+ }
95
+ `,
96
+ [customFieldConfigFragment],
97
+ );
98
+ export const dateTimeCustomFieldFragment = graphql(
99
+ `
100
+ fragment DateTimeCustomField on DateTimeCustomFieldConfig {
101
+ ...CustomFieldConfig
102
+ datetimeMin: min
103
+ datetimeMax: max
104
+ datetimeStep: step
105
+ }
106
+ `,
107
+ [customFieldConfigFragment],
108
+ );
109
+ export const relationCustomFieldFragment = graphql(
110
+ `
111
+ fragment RelationCustomField on RelationCustomFieldConfig {
112
+ ...CustomFieldConfig
113
+ entity
114
+ scalarFields
115
+ }
116
+ `,
117
+ [customFieldConfigFragment],
118
+ );
119
+
120
+ export const structCustomFieldFragment = graphql(
121
+ `
122
+ fragment StructCustomField on StructCustomFieldConfig {
123
+ ...CustomFieldConfig
124
+ fields {
125
+ ... on StructField {
126
+ name
127
+ type
128
+ list
129
+ description {
130
+ languageCode
131
+ value
132
+ }
133
+ label {
134
+ languageCode
135
+ value
136
+ }
137
+ ui
138
+ }
139
+ ... on StringStructFieldConfig {
140
+ pattern
141
+ options {
142
+ label {
143
+ languageCode
144
+ value
145
+ }
146
+ value
147
+ }
148
+ }
149
+ ... on IntStructFieldConfig {
150
+ intMin: min
151
+ intMax: max
152
+ intStep: step
153
+ }
154
+ ... on FloatStructFieldConfig {
155
+ floatMin: min
156
+ floatMax: max
157
+ floatStep: step
158
+ }
159
+ ... on DateTimeStructFieldConfig {
160
+ datetimeMin: min
161
+ datetimeMax: max
162
+ datetimeStep: step
163
+ }
164
+ }
165
+ }
166
+ `,
167
+ [customFieldConfigFragment],
168
+ );
169
+
170
+ export const allCustomFieldsFragment = graphql(
171
+ `
172
+ fragment CustomFields on CustomField {
173
+ ... on StringCustomFieldConfig {
174
+ ...StringCustomField
175
+ }
176
+ ... on LocaleStringCustomFieldConfig {
177
+ ...LocaleStringCustomField
178
+ }
179
+ ... on TextCustomFieldConfig {
180
+ ...TextCustomField
181
+ }
182
+ ... on LocaleTextCustomFieldConfig {
183
+ ...LocaleTextCustomField
184
+ }
185
+ ... on BooleanCustomFieldConfig {
186
+ ...BooleanCustomField
187
+ }
188
+ ... on IntCustomFieldConfig {
189
+ ...IntCustomField
190
+ }
191
+ ... on FloatCustomFieldConfig {
192
+ ...FloatCustomField
193
+ }
194
+ ... on DateTimeCustomFieldConfig {
195
+ ...DateTimeCustomField
196
+ }
197
+ ... on RelationCustomFieldConfig {
198
+ ...RelationCustomField
199
+ }
200
+ ... on StructCustomFieldConfig {
201
+ ...StructCustomField
202
+ }
203
+ }
204
+ `,
205
+ [
206
+ stringCustomFieldFragment,
207
+ localeStringCustomFieldFragment,
208
+ textCustomFieldFragment,
209
+ localeTextCustomFieldFragment,
210
+ booleanCustomFieldFragment,
211
+ intCustomFieldFragment,
212
+ floatCustomFieldFragment,
213
+ dateTimeCustomFieldFragment,
214
+ relationCustomFieldFragment,
215
+ structCustomFieldFragment,
216
+ ],
217
+ );
218
+
219
+ export const getServerConfigDocument = graphql(
220
+ `
221
+ query GetServerConfig {
222
+ globalSettings {
223
+ id
224
+ availableLanguages
225
+ serverConfig {
226
+ moneyStrategyPrecision
227
+ orderProcess {
228
+ name
229
+ to
230
+ }
231
+ permittedAssetTypes
232
+ permissions {
233
+ name
234
+ description
235
+ assignable
236
+ }
237
+ entityCustomFields {
238
+ entityName
239
+ customFields {
240
+ ...CustomFields
241
+ }
242
+ }
243
+ }
244
+ }
245
+ }
246
+ `,
247
+ [allCustomFieldsFragment],
248
+ );
249
+
250
+ type QueryResult = ResultOf<typeof getServerConfigDocument>['globalSettings']['serverConfig'];
251
+
252
+ export interface ServerConfig {
253
+ availableLanguages: string[];
254
+ moneyStrategyPrecision: QueryResult['moneyStrategyPrecision'];
255
+ orderProcess: QueryResult['orderProcess'];
256
+ permittedAssetTypes: QueryResult['permittedAssetTypes'];
257
+ permissions: QueryResult['permissions'];
258
+ entityCustomFields: QueryResult['entityCustomFields'];
259
+ }
260
+
261
+ // create a provider for the global settings
262
+ export const ServerConfigProvider = ({ children }: { children: React.ReactNode }) => {
263
+ const { data } = useQuery({
264
+ queryKey: ['getServerConfig'],
265
+ queryFn: () => api.query(getServerConfigDocument),
266
+ });
267
+ const value: ServerConfig = {
268
+ availableLanguages: data?.globalSettings.availableLanguages ?? [],
269
+ moneyStrategyPrecision: data?.globalSettings.serverConfig.moneyStrategyPrecision ?? 2,
270
+ orderProcess: data?.globalSettings.serverConfig.orderProcess ?? [],
271
+ permittedAssetTypes: data?.globalSettings.serverConfig.permittedAssetTypes ?? [],
272
+ permissions: data?.globalSettings.serverConfig.permissions ?? [],
273
+ entityCustomFields: data?.globalSettings.serverConfig.entityCustomFields ?? [],
274
+ };
275
+
276
+ return <ServerConfigContext.Provider value={value}>{children}</ServerConfigContext.Provider>;
277
+ };
278
+
279
+ export const ServerConfigContext = React.createContext<ServerConfig | null>(null);
@@ -0,0 +1,54 @@
1
+ import { createContext, useEffect, useState } from 'react';
2
+ import { useUserSettings } from '../hooks/use-user-settings.js';
3
+
4
+ export type Theme = 'dark' | 'light' | 'system';
5
+
6
+ type ThemeProviderProps = {
7
+ children: React.ReactNode;
8
+ defaultTheme?: Theme;
9
+ storageKey?: string;
10
+ };
11
+
12
+ type ThemeProviderState = {
13
+ theme: Theme;
14
+ setTheme: (theme: Theme) => void;
15
+ };
16
+
17
+ const initialState: ThemeProviderState = {
18
+ theme: 'system',
19
+ setTheme: () => null,
20
+ };
21
+
22
+ export const ThemeProviderContext = createContext<ThemeProviderState>(initialState);
23
+
24
+ export function ThemeProvider({ children, defaultTheme = 'system', ...props }: ThemeProviderProps) {
25
+ const { settings, setTheme } = useUserSettings();
26
+
27
+ useEffect(() => {
28
+ const root = window.document.documentElement;
29
+
30
+ root.classList.remove('light', 'dark');
31
+
32
+ if (settings.theme === 'system') {
33
+ const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
34
+
35
+ root.classList.add(systemTheme);
36
+ return;
37
+ }
38
+
39
+ root.classList.add(settings.theme);
40
+ }, [settings.theme]);
41
+
42
+ return (
43
+ <ThemeProviderContext.Provider
44
+ {...props}
45
+ value={{
46
+ theme: settings.theme,
47
+ setTheme: setTheme,
48
+ }}
49
+ >
50
+ {children}
51
+ </ThemeProviderContext.Provider>
52
+ );
53
+ }
54
+