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