@endora-commerce/mod-catalog 0.100.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.
- package/LICENSE +21 -0
- package/README.md +63 -0
- package/dist/admin/components/PackagingUnitsEditor.d.ts +12 -0
- package/dist/admin/components/PackagingUnitsEditor.d.ts.map +1 -0
- package/dist/admin/components/PackagingUnitsEditor.js +99 -0
- package/dist/admin/components/PackagingUnitsEditor.js.map +1 -0
- package/dist/admin/components/ProductAttributesTab.d.ts +13 -0
- package/dist/admin/components/ProductAttributesTab.d.ts.map +1 -0
- package/dist/admin/components/ProductAttributesTab.js +140 -0
- package/dist/admin/components/ProductAttributesTab.js.map +1 -0
- package/dist/admin/components/ProductInventoryTab.d.ts +14 -0
- package/dist/admin/components/ProductInventoryTab.d.ts.map +1 -0
- package/dist/admin/components/ProductInventoryTab.js +284 -0
- package/dist/admin/components/ProductInventoryTab.js.map +1 -0
- package/dist/admin/components/ProductScopeEditor.d.ts +94 -0
- package/dist/admin/components/ProductScopeEditor.d.ts.map +1 -0
- package/dist/admin/components/ProductScopeEditor.js +395 -0
- package/dist/admin/components/ProductScopeEditor.js.map +1 -0
- package/dist/admin/components/ProductsBulkEditDialog.d.ts +11 -0
- package/dist/admin/components/ProductsBulkEditDialog.d.ts.map +1 -0
- package/dist/admin/components/ProductsBulkEditDialog.js +304 -0
- package/dist/admin/components/ProductsBulkEditDialog.js.map +1 -0
- package/dist/admin/index.d.ts +45 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +184 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/lib/resolve-product-selection.d.ts +21 -0
- package/dist/admin/lib/resolve-product-selection.d.ts.map +1 -0
- package/dist/admin/lib/resolve-product-selection.js +25 -0
- package/dist/admin/lib/resolve-product-selection.js.map +1 -0
- package/dist/admin/pages/AttachmentTypesPage.d.ts +18 -0
- package/dist/admin/pages/AttachmentTypesPage.d.ts.map +1 -0
- package/dist/admin/pages/AttachmentTypesPage.js +92 -0
- package/dist/admin/pages/AttachmentTypesPage.js.map +1 -0
- package/dist/admin/pages/AttributeSetsPage.d.ts +21 -0
- package/dist/admin/pages/AttributeSetsPage.d.ts.map +1 -0
- package/dist/admin/pages/AttributeSetsPage.js +158 -0
- package/dist/admin/pages/AttributeSetsPage.js.map +1 -0
- package/dist/admin/pages/AttributesManager.d.ts +9 -0
- package/dist/admin/pages/AttributesManager.d.ts.map +1 -0
- package/dist/admin/pages/AttributesManager.js +305 -0
- package/dist/admin/pages/AttributesManager.js.map +1 -0
- package/dist/admin/pages/BulkOperationDetailPage.d.ts +9 -0
- package/dist/admin/pages/BulkOperationDetailPage.d.ts.map +1 -0
- package/dist/admin/pages/BulkOperationDetailPage.js +187 -0
- package/dist/admin/pages/BulkOperationDetailPage.js.map +1 -0
- package/dist/admin/pages/BulkOperationsPage.d.ts +9 -0
- package/dist/admin/pages/BulkOperationsPage.d.ts.map +1 -0
- package/dist/admin/pages/BulkOperationsPage.js +98 -0
- package/dist/admin/pages/BulkOperationsPage.js.map +1 -0
- package/dist/admin/pages/CategoriesTree.d.ts +9 -0
- package/dist/admin/pages/CategoriesTree.d.ts.map +1 -0
- package/dist/admin/pages/CategoriesTree.js +176 -0
- package/dist/admin/pages/CategoriesTree.js.map +1 -0
- package/dist/admin/pages/ProductEditor.d.ts +13 -0
- package/dist/admin/pages/ProductEditor.d.ts.map +1 -0
- package/dist/admin/pages/ProductEditor.js +1050 -0
- package/dist/admin/pages/ProductEditor.js.map +1 -0
- package/dist/admin/pages/ProductsList.d.ts +9 -0
- package/dist/admin/pages/ProductsList.d.ts.map +1 -0
- package/dist/admin/pages/ProductsList.js +399 -0
- package/dist/admin/pages/ProductsList.js.map +1 -0
- package/dist/backend/commands/attribute-commands.d.ts +111 -0
- package/dist/backend/commands/attribute-commands.d.ts.map +1 -0
- package/dist/backend/commands/attribute-commands.js +482 -0
- package/dist/backend/commands/attribute-commands.js.map +1 -0
- package/dist/backend/demo/reset.d.ts +23 -0
- package/dist/backend/demo/reset.d.ts.map +1 -0
- package/dist/backend/demo/reset.js +41 -0
- package/dist/backend/demo/reset.js.map +1 -0
- package/dist/backend/demo/rows.d.ts +103 -0
- package/dist/backend/demo/rows.d.ts.map +1 -0
- package/dist/backend/demo/rows.js +162 -0
- package/dist/backend/demo/rows.js.map +1 -0
- package/dist/backend/demo/seed.d.ts +35 -0
- package/dist/backend/demo/seed.d.ts.map +1 -0
- package/dist/backend/demo/seed.js +177 -0
- package/dist/backend/demo/seed.js.map +1 -0
- package/dist/backend/entities/attachment-type.entity.d.ts +16 -0
- package/dist/backend/entities/attachment-type.entity.d.ts.map +1 -0
- package/dist/backend/entities/attachment-type.entity.js +57 -0
- package/dist/backend/entities/attachment-type.entity.js.map +1 -0
- package/dist/backend/entities/attribute-set-attribute.entity.d.ts +26 -0
- package/dist/backend/entities/attribute-set-attribute.entity.d.ts.map +1 -0
- package/dist/backend/entities/attribute-set-attribute.entity.js +55 -0
- package/dist/backend/entities/attribute-set-attribute.entity.js.map +1 -0
- package/dist/backend/entities/attribute-set.entity.d.ts +22 -0
- package/dist/backend/entities/attribute-set.entity.d.ts.map +1 -0
- package/dist/backend/entities/attribute-set.entity.js +67 -0
- package/dist/backend/entities/attribute-set.entity.js.map +1 -0
- package/dist/backend/entities/bulk-operation.entity.d.ts +78 -0
- package/dist/backend/entities/bulk-operation.entity.d.ts.map +1 -0
- package/dist/backend/entities/bulk-operation.entity.js +138 -0
- package/dist/backend/entities/bulk-operation.entity.js.map +1 -0
- package/dist/backend/entities/bundle-slot-option.entity.d.ts +23 -0
- package/dist/backend/entities/bundle-slot-option.entity.d.ts.map +1 -0
- package/dist/backend/entities/bundle-slot-option.entity.js +68 -0
- package/dist/backend/entities/bundle-slot-option.entity.js.map +1 -0
- package/dist/backend/entities/bundle-slot.entity.d.ts +25 -0
- package/dist/backend/entities/bundle-slot.entity.d.ts.map +1 -0
- package/dist/backend/entities/bundle-slot.entity.js +74 -0
- package/dist/backend/entities/bundle-slot.entity.js.map +1 -0
- package/dist/backend/entities/category.entity.d.ts +26 -0
- package/dist/backend/entities/category.entity.d.ts.map +1 -0
- package/dist/backend/entities/category.entity.js +119 -0
- package/dist/backend/entities/category.entity.js.map +1 -0
- package/dist/backend/entities/gallery-item-label.entity.d.ts +22 -0
- package/dist/backend/entities/gallery-item-label.entity.d.ts.map +1 -0
- package/dist/backend/entities/gallery-item-label.entity.js +50 -0
- package/dist/backend/entities/gallery-item-label.entity.js.map +1 -0
- package/dist/backend/entities/gallery-item.entity.d.ts +17 -0
- package/dist/backend/entities/gallery-item.entity.d.ts.map +1 -0
- package/dist/backend/entities/gallery-item.entity.js +58 -0
- package/dist/backend/entities/gallery-item.entity.js.map +1 -0
- package/dist/backend/entities/grouped-item.entity.d.ts +23 -0
- package/dist/backend/entities/grouped-item.entity.d.ts.map +1 -0
- package/dist/backend/entities/grouped-item.entity.js +68 -0
- package/dist/backend/entities/grouped-item.entity.js.map +1 -0
- package/dist/backend/entities/product-attachment.entity.d.ts +23 -0
- package/dist/backend/entities/product-attachment.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-attachment.entity.js +77 -0
- package/dist/backend/entities/product-attachment.entity.js.map +1 -0
- package/dist/backend/entities/product-attribute.entity.d.ts +72 -0
- package/dist/backend/entities/product-attribute.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-attribute.entity.js +161 -0
- package/dist/backend/entities/product-attribute.entity.js.map +1 -0
- package/dist/backend/entities/product-editor-preference.entity.d.ts +28 -0
- package/dist/backend/entities/product-editor-preference.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-editor-preference.entity.js +63 -0
- package/dist/backend/entities/product-editor-preference.entity.js.map +1 -0
- package/dist/backend/entities/product-link.entity.d.ts +25 -0
- package/dist/backend/entities/product-link.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-link.entity.js +70 -0
- package/dist/backend/entities/product-link.entity.js.map +1 -0
- package/dist/backend/entities/product-packaging-unit.entity.d.ts +26 -0
- package/dist/backend/entities/product-packaging-unit.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-packaging-unit.entity.js +76 -0
- package/dist/backend/entities/product-packaging-unit.entity.js.map +1 -0
- package/dist/backend/entities/product-value-override.entity.d.ts +43 -0
- package/dist/backend/entities/product-value-override.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-value-override.entity.js +90 -0
- package/dist/backend/entities/product-value-override.entity.js.map +1 -0
- package/dist/backend/entities/product-variant.entity.d.ts +18 -0
- package/dist/backend/entities/product-variant.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-variant.entity.js +68 -0
- package/dist/backend/entities/product-variant.entity.js.map +1 -0
- package/dist/backend/entities/product.entity.d.ts +108 -0
- package/dist/backend/entities/product.entity.d.ts.map +1 -0
- package/dist/backend/entities/product.entity.js +230 -0
- package/dist/backend/entities/product.entity.js.map +1 -0
- package/dist/backend/index.d.ts +262 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +642 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/plugin.d.ts +216 -0
- package/dist/backend/plugin.d.ts.map +1 -0
- package/dist/backend/plugin.js +223 -0
- package/dist/backend/plugin.js.map +1 -0
- package/dist/backend/prompt-tools.d.ts +47 -0
- package/dist/backend/prompt-tools.d.ts.map +1 -0
- package/dist/backend/prompt-tools.js +284 -0
- package/dist/backend/prompt-tools.js.map +1 -0
- package/dist/backend/routes.admin.d.ts +105 -0
- package/dist/backend/routes.admin.d.ts.map +1 -0
- package/dist/backend/routes.admin.js +1162 -0
- package/dist/backend/routes.admin.js.map +1 -0
- package/dist/backend/routes.api-key.d.ts +33 -0
- package/dist/backend/routes.api-key.d.ts.map +1 -0
- package/dist/backend/routes.api-key.js +43 -0
- package/dist/backend/routes.api-key.js.map +1 -0
- package/dist/backend/routes.external.d.ts +32 -0
- package/dist/backend/routes.external.d.ts.map +1 -0
- package/dist/backend/routes.external.js +115 -0
- package/dist/backend/routes.external.js.map +1 -0
- package/dist/backend/routes.public.d.ts +46 -0
- package/dist/backend/routes.public.d.ts.map +1 -0
- package/dist/backend/routes.public.js +318 -0
- package/dist/backend/routes.public.js.map +1 -0
- package/dist/backend/services/asset-references.d.ts +4 -0
- package/dist/backend/services/asset-references.d.ts.map +1 -0
- package/dist/backend/services/asset-references.js +104 -0
- package/dist/backend/services/asset-references.js.map +1 -0
- package/dist/backend/services/attachment.service.d.ts +45 -0
- package/dist/backend/services/attachment.service.d.ts.map +1 -0
- package/dist/backend/services/attachment.service.js +268 -0
- package/dist/backend/services/attachment.service.js.map +1 -0
- package/dist/backend/services/attribute-option-validator.d.ts +47 -0
- package/dist/backend/services/attribute-option-validator.d.ts.map +1 -0
- package/dist/backend/services/attribute-option-validator.js +69 -0
- package/dist/backend/services/attribute-option-validator.js.map +1 -0
- package/dist/backend/services/attribute-set-validations.d.ts +65 -0
- package/dist/backend/services/attribute-set-validations.d.ts.map +1 -0
- package/dist/backend/services/attribute-set-validations.js +89 -0
- package/dist/backend/services/attribute-set-validations.js.map +1 -0
- package/dist/backend/services/attribute-set.service.d.ts +50 -0
- package/dist/backend/services/attribute-set.service.d.ts.map +1 -0
- package/dist/backend/services/attribute-set.service.js +401 -0
- package/dist/backend/services/attribute-set.service.js.map +1 -0
- package/dist/backend/services/attribute-type-mapping.d.ts +66 -0
- package/dist/backend/services/attribute-type-mapping.d.ts.map +1 -0
- package/dist/backend/services/attribute-type-mapping.js +121 -0
- package/dist/backend/services/attribute-type-mapping.js.map +1 -0
- package/dist/backend/services/attribute-value-key.service.d.ts +48 -0
- package/dist/backend/services/attribute-value-key.service.d.ts.map +1 -0
- package/dist/backend/services/attribute-value-key.service.js +118 -0
- package/dist/backend/services/attribute-value-key.service.js.map +1 -0
- package/dist/backend/services/audit-references.d.ts +13 -0
- package/dist/backend/services/audit-references.d.ts.map +1 -0
- package/dist/backend/services/audit-references.js +51 -0
- package/dist/backend/services/audit-references.js.map +1 -0
- package/dist/backend/services/bulk-operation-queue.d.ts +26 -0
- package/dist/backend/services/bulk-operation-queue.d.ts.map +1 -0
- package/dist/backend/services/bulk-operation-queue.js +34 -0
- package/dist/backend/services/bulk-operation-queue.js.map +1 -0
- package/dist/backend/services/bulk-operation.service.d.ts +195 -0
- package/dist/backend/services/bulk-operation.service.d.ts.map +1 -0
- package/dist/backend/services/bulk-operation.service.js +510 -0
- package/dist/backend/services/bulk-operation.service.js.map +1 -0
- package/dist/backend/services/bundle.service.d.ts +87 -0
- package/dist/backend/services/bundle.service.d.ts.map +1 -0
- package/dist/backend/services/bundle.service.js +286 -0
- package/dist/backend/services/bundle.service.js.map +1 -0
- package/dist/backend/services/catalog-admin.service.d.ts +398 -0
- package/dist/backend/services/catalog-admin.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-admin.service.js +1516 -0
- package/dist/backend/services/catalog-admin.service.js.map +1 -0
- package/dist/backend/services/catalog-attribute-read.service.d.ts +78 -0
- package/dist/backend/services/catalog-attribute-read.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-attribute-read.service.js +216 -0
- package/dist/backend/services/catalog-attribute-read.service.js.map +1 -0
- package/dist/backend/services/catalog-bulk-import.service.d.ts +30 -0
- package/dist/backend/services/catalog-bulk-import.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-bulk-import.service.js +136 -0
- package/dist/backend/services/catalog-bulk-import.service.js.map +1 -0
- package/dist/backend/services/catalog-bulk-update.service.d.ts +91 -0
- package/dist/backend/services/catalog-bulk-update.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-bulk-update.service.js +330 -0
- package/dist/backend/services/catalog-bulk-update.service.js.map +1 -0
- package/dist/backend/services/catalog-category-read.service.d.ts +66 -0
- package/dist/backend/services/catalog-category-read.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-category-read.service.js +248 -0
- package/dist/backend/services/catalog-category-read.service.js.map +1 -0
- package/dist/backend/services/catalog-org-price-decorator.d.ts +90 -0
- package/dist/backend/services/catalog-org-price-decorator.d.ts.map +1 -0
- package/dist/backend/services/catalog-org-price-decorator.js +184 -0
- package/dist/backend/services/catalog-org-price-decorator.js.map +1 -0
- package/dist/backend/services/catalog-product-filter.service.d.ts +82 -0
- package/dist/backend/services/catalog-product-filter.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-product-filter.service.js +275 -0
- package/dist/backend/services/catalog-product-filter.service.js.map +1 -0
- package/dist/backend/services/catalog-product-read.service.d.ts +46 -0
- package/dist/backend/services/catalog-product-read.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-product-read.service.js +197 -0
- package/dist/backend/services/catalog-product-read.service.js.map +1 -0
- package/dist/backend/services/catalog-query.service.d.ts +444 -0
- package/dist/backend/services/catalog-query.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-query.service.js +1633 -0
- package/dist/backend/services/catalog-query.service.js.map +1 -0
- package/dist/backend/services/catalog-quick-search.service.d.ts +78 -0
- package/dist/backend/services/catalog-quick-search.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-quick-search.service.js +159 -0
- package/dist/backend/services/catalog-quick-search.service.js.map +1 -0
- package/dist/backend/services/catalog-write-ports.d.ts +25 -0
- package/dist/backend/services/catalog-write-ports.d.ts.map +1 -0
- package/dist/backend/services/catalog-write-ports.js +63 -0
- package/dist/backend/services/catalog-write-ports.js.map +1 -0
- package/dist/backend/services/category-admin.service.d.ts +102 -0
- package/dist/backend/services/category-admin.service.d.ts.map +1 -0
- package/dist/backend/services/category-admin.service.js +271 -0
- package/dist/backend/services/category-admin.service.js.map +1 -0
- package/dist/backend/services/gallery.service.d.ts +85 -0
- package/dist/backend/services/gallery.service.d.ts.map +1 -0
- package/dist/backend/services/gallery.service.js +326 -0
- package/dist/backend/services/gallery.service.js.map +1 -0
- package/dist/backend/services/grouped.service.d.ts +39 -0
- package/dist/backend/services/grouped.service.d.ts.map +1 -0
- package/dist/backend/services/grouped.service.js +136 -0
- package/dist/backend/services/grouped.service.js.map +1 -0
- package/dist/backend/services/label-resolver.d.ts +16 -0
- package/dist/backend/services/label-resolver.d.ts.map +1 -0
- package/dist/backend/services/label-resolver.js +43 -0
- package/dist/backend/services/label-resolver.js.map +1 -0
- package/dist/backend/services/packaging-unit.service.d.ts +28 -0
- package/dist/backend/services/packaging-unit.service.d.ts.map +1 -0
- package/dist/backend/services/packaging-unit.service.js +197 -0
- package/dist/backend/services/packaging-unit.service.js.map +1 -0
- package/dist/backend/services/primary-asset-url.d.ts +4 -0
- package/dist/backend/services/primary-asset-url.d.ts.map +1 -0
- package/dist/backend/services/primary-asset-url.js +55 -0
- package/dist/backend/services/primary-asset-url.js.map +1 -0
- package/dist/backend/services/product-editor-preferences.service.d.ts +20 -0
- package/dist/backend/services/product-editor-preferences.service.d.ts.map +1 -0
- package/dist/backend/services/product-editor-preferences.service.js +44 -0
- package/dist/backend/services/product-editor-preferences.service.js.map +1 -0
- package/dist/backend/services/product-link.service.d.ts +169 -0
- package/dist/backend/services/product-link.service.d.ts.map +1 -0
- package/dist/backend/services/product-link.service.js +297 -0
- package/dist/backend/services/product-link.service.js.map +1 -0
- package/dist/backend/services/product-overrides.service.d.ts +77 -0
- package/dist/backend/services/product-overrides.service.d.ts.map +1 -0
- package/dist/backend/services/product-overrides.service.js +204 -0
- package/dist/backend/services/product-overrides.service.js.map +1 -0
- package/dist/backend/services/product-scope-context.service.d.ts +36 -0
- package/dist/backend/services/product-scope-context.service.d.ts.map +1 -0
- package/dist/backend/services/product-scope-context.service.js +106 -0
- package/dist/backend/services/product-scope-context.service.js.map +1 -0
- package/dist/backend/services/product-type-validations.d.ts +42 -0
- package/dist/backend/services/product-type-validations.d.ts.map +1 -0
- package/dist/backend/services/product-type-validations.js +55 -0
- package/dist/backend/services/product-type-validations.js.map +1 -0
- package/dist/backend/services/product-value-resolver.service.d.ts +59 -0
- package/dist/backend/services/product-value-resolver.service.d.ts.map +1 -0
- package/dist/backend/services/product-value-resolver.service.js +111 -0
- package/dist/backend/services/product-value-resolver.service.js.map +1 -0
- package/dist/backend/services/system-attribute-scopes.d.ts +18 -0
- package/dist/backend/services/system-attribute-scopes.d.ts.map +1 -0
- package/dist/backend/services/system-attribute-scopes.js +18 -0
- package/dist/backend/services/system-attribute-scopes.js.map +1 -0
- package/dist/backend/services/viewer-organization.d.ts +25 -0
- package/dist/backend/services/viewer-organization.d.ts.map +1 -0
- package/dist/backend/services/viewer-organization.js +31 -0
- package/dist/backend/services/viewer-organization.js.map +1 -0
- package/dist/manifest.d.ts +204 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +686 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrations/20260429T064146_catalog_attribute_sets_init.d.ts +33 -0
- package/dist/migrations/20260429T064146_catalog_attribute_sets_init.d.ts.map +1 -0
- package/dist/migrations/20260429T064146_catalog_attribute_sets_init.js +118 -0
- package/dist/migrations/20260429T064146_catalog_attribute_sets_init.js.map +1 -0
- package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.d.ts +24 -0
- package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.d.ts.map +1 -0
- package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.js +31 -0
- package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.js.map +1 -0
- package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.d.ts +32 -0
- package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.d.ts.map +1 -0
- package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.js +58 -0
- package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.js.map +1 -0
- package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.d.ts +22 -0
- package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.d.ts.map +1 -0
- package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.js +66 -0
- package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.js.map +1 -0
- package/dist/migrations/20260429T112543_catalog_product_attachments.d.ts +18 -0
- package/dist/migrations/20260429T112543_catalog_product_attachments.d.ts.map +1 -0
- package/dist/migrations/20260429T112543_catalog_product_attachments.js +73 -0
- package/dist/migrations/20260429T112543_catalog_product_attachments.js.map +1 -0
- package/dist/migrations/20260429T123726_catalog_product_links.d.ts +21 -0
- package/dist/migrations/20260429T123726_catalog_product_links.d.ts.map +1 -0
- package/dist/migrations/20260429T123726_catalog_product_links.js +48 -0
- package/dist/migrations/20260429T123726_catalog_product_links.js.map +1 -0
- package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.d.ts +23 -0
- package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.d.ts.map +1 -0
- package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.js +94 -0
- package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.js.map +1 -0
- package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.d.ts +24 -0
- package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.d.ts.map +1 -0
- package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.js +31 -0
- package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.js.map +1 -0
- package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.d.ts +31 -0
- package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.d.ts.map +1 -0
- package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.js +133 -0
- package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.js.map +1 -0
- package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.d.ts +16 -0
- package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.d.ts.map +1 -0
- package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.js +23 -0
- package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.js.map +1 -0
- package/dist/migrations/20260526T124736_catalog_product_status_inactive.d.ts +10 -0
- package/dist/migrations/20260526T124736_catalog_product_status_inactive.d.ts.map +1 -0
- package/dist/migrations/20260526T124736_catalog_product_status_inactive.js +22 -0
- package/dist/migrations/20260526T124736_catalog_product_status_inactive.js.map +1 -0
- package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.d.ts +38 -0
- package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.d.ts.map +1 -0
- package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.js +98 -0
- package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.js.map +1 -0
- package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.d.ts +13 -0
- package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.d.ts.map +1 -0
- package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.js +17 -0
- package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.js.map +1 -0
- package/dist/migrations/20260611T140407_catalog_bulk_operations.d.ts +16 -0
- package/dist/migrations/20260611T140407_catalog_bulk_operations.d.ts.map +1 -0
- package/dist/migrations/20260611T140407_catalog_bulk_operations.js +42 -0
- package/dist/migrations/20260611T140407_catalog_bulk_operations.js.map +1 -0
- package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.d.ts +14 -0
- package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.d.ts.map +1 -0
- package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.js +18 -0
- package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.js.map +1 -0
- package/dist/migrations/20260611T140412_catalog_product_packaging_units.d.ts +11 -0
- package/dist/migrations/20260611T140412_catalog_product_packaging_units.d.ts.map +1 -0
- package/dist/migrations/20260611T140412_catalog_product_packaging_units.js +29 -0
- package/dist/migrations/20260611T140412_catalog_product_packaging_units.js.map +1 -0
- package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.d.ts +23 -0
- package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.d.ts.map +1 -0
- package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.js +35 -0
- package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.js.map +1 -0
- package/dist/migrations/20260718T200343_catalog_category_custom_field_values.d.ts +12 -0
- package/dist/migrations/20260718T200343_catalog_category_custom_field_values.d.ts.map +1 -0
- package/dist/migrations/20260718T200343_catalog_category_custom_field_values.js +16 -0
- package/dist/migrations/20260718T200343_catalog_category_custom_field_values.js.map +1 -0
- package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.d.ts +32 -0
- package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.d.ts.map +1 -0
- package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.js +286 -0
- package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.js.map +1 -0
- package/dist/migrations/20260804T152604_catalog_widen_product_sku.d.ts +36 -0
- package/dist/migrations/20260804T152604_catalog_widen_product_sku.d.ts.map +1 -0
- package/dist/migrations/20260804T152604_catalog_widen_product_sku.js +63 -0
- package/dist/migrations/20260804T152604_catalog_widen_product_sku.js.map +1 -0
- package/dist/migrations/20260804T160244_catalog_category_activation.d.ts +18 -0
- package/dist/migrations/20260804T160244_catalog_category_activation.d.ts.map +1 -0
- package/dist/migrations/20260804T160244_catalog_category_activation.js +22 -0
- package/dist/migrations/20260804T160244_catalog_category_activation.js.map +1 -0
- package/dist/migrations/20260912T094557_catalog_sales_channel_products.d.ts +27 -0
- package/dist/migrations/20260912T094557_catalog_sales_channel_products.d.ts.map +1 -0
- package/dist/migrations/20260912T094557_catalog_sales_channel_products.js +44 -0
- package/dist/migrations/20260912T094557_catalog_sales_channel_products.js.map +1 -0
- package/dist/migrations/20260912T094623_catalog_sales_channel_categories.d.ts +27 -0
- package/dist/migrations/20260912T094623_catalog_sales_channel_categories.d.ts.map +1 -0
- package/dist/migrations/20260912T094623_catalog_sales_channel_categories.js +44 -0
- package/dist/migrations/20260912T094623_catalog_sales_channel_categories.js.map +1 -0
- package/dist/migrations/20260925T125527_catalog_inventory_columns.d.ts +36 -0
- package/dist/migrations/20260925T125527_catalog_inventory_columns.d.ts.map +1 -0
- package/dist/migrations/20260925T125527_catalog_inventory_columns.js +87 -0
- package/dist/migrations/20260925T125527_catalog_inventory_columns.js.map +1 -0
- package/dist/migrations/index.d.ts +55 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +80 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/ports/index.d.ts +96 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +2 -0
- package/dist/ports/index.js.map +1 -0
- package/docs/catalog/attachments.md +69 -0
- package/docs/catalog/attribute-sets.md +63 -0
- package/docs/catalog/attributes.md +244 -0
- package/docs/catalog/composite-products.md +115 -0
- package/docs/catalog/gallery-and-labels.md +73 -0
- package/docs/catalog/packaging-units.md +67 -0
- package/docs/catalog/per-channel-per-language-overrides.md +234 -0
- package/docs/catalog/product-links.md +79 -0
- package/docs/catalog.md +207 -0
- package/i18n/en.json +649 -0
- package/i18n/pl.json +649 -0
- package/package.json +109 -0
- package/tailwind.css +14 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { Pencil } from 'lucide-react';
|
|
4
|
+
import { ApiError, apiClient } from '@endora-commerce/admin-kit/lib';
|
|
5
|
+
import { Alert, AlertDescription, Button, Card, CardContent, CardHeader, CardTitle, Checkbox, Input, Label, PageHeader, Select, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@endora-commerce/admin-kit/ui';
|
|
6
|
+
import { useTranslation } from '@endora-commerce/admin-kit/i18n';
|
|
7
|
+
// Feature 002 (T035) — DB-level value types. Foundation 001 had
|
|
8
|
+
// the original 5 (string, number, boolean, enum, date); 002 adds
|
|
9
|
+
// `multiselect` and `price`. The presentation hint
|
|
10
|
+
// `displayAsSlider` is honored only when valueType ∈ (number, price).
|
|
11
|
+
const VALUE_TYPES = ['string', 'number', 'boolean', 'enum', 'multiselect', 'price'];
|
|
12
|
+
// Boolean flags surfaced as togglable checkbox columns in the list.
|
|
13
|
+
const FLAG_KEYS = [
|
|
14
|
+
'isSearchable',
|
|
15
|
+
'isFilterable',
|
|
16
|
+
'isVariantAxis',
|
|
17
|
+
'isComparable',
|
|
18
|
+
'massEditable',
|
|
19
|
+
'quickSearchable',
|
|
20
|
+
'isPromoRule',
|
|
21
|
+
];
|
|
22
|
+
function flagsOf(a) {
|
|
23
|
+
return {
|
|
24
|
+
isSearchable: a.isSearchable,
|
|
25
|
+
isFilterable: a.isFilterable,
|
|
26
|
+
isVariantAxis: a.isVariantAxis,
|
|
27
|
+
isComparable: a.isComparable,
|
|
28
|
+
massEditable: a.massEditable,
|
|
29
|
+
quickSearchable: a.quickSearchable,
|
|
30
|
+
isPromoRule: a.isPromoRule,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function flagsEqual(a, b) {
|
|
34
|
+
return FLAG_KEYS.every((k) => a[k] === b[k]);
|
|
35
|
+
}
|
|
36
|
+
export function AttributesManager() {
|
|
37
|
+
const t = useTranslation('catalog');
|
|
38
|
+
const [attrs, setAttrs] = useState([]);
|
|
39
|
+
const [loading, setLoading] = useState(true);
|
|
40
|
+
const [error, setError] = useState(null);
|
|
41
|
+
const [info, setInfo] = useState(null);
|
|
42
|
+
// Per-attribute local flag drafts; only flushed to the API on Save.
|
|
43
|
+
const [flagDrafts, setFlagDrafts] = useState({});
|
|
44
|
+
const [saving, setSaving] = useState(false);
|
|
45
|
+
const [editingId, setEditingId] = useState(null);
|
|
46
|
+
const refresh = useCallback(async () => {
|
|
47
|
+
setLoading(true);
|
|
48
|
+
setError(null);
|
|
49
|
+
try {
|
|
50
|
+
const res = await apiClient.get('/api/v1/admin/catalog/attributes');
|
|
51
|
+
setAttrs(res.data);
|
|
52
|
+
setFlagDrafts(Object.fromEntries(res.data.map((a) => [a.id, flagsOf(a)])));
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
setError(err instanceof ApiError ? err.envelope.error.message : t('attributes.error.load'));
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
setLoading(false);
|
|
59
|
+
}
|
|
60
|
+
}, [t]);
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
void refresh();
|
|
63
|
+
}, [refresh]);
|
|
64
|
+
const editingAttr = useMemo(() => attrs.find((a) => a.id === editingId) ?? null, [attrs, editingId]);
|
|
65
|
+
// Attributes whose checkbox draft differs from the persisted flags.
|
|
66
|
+
const dirtyIds = useMemo(() => attrs.filter((a) => flagDrafts[a.id] && !flagsEqual(flagDrafts[a.id], flagsOf(a))).map((a) => a.id), [attrs, flagDrafts]);
|
|
67
|
+
const toggleFlag = useCallback((id, key, value) => {
|
|
68
|
+
setFlagDrafts((prev) => ({ ...prev, [id]: { ...prev[id], [key]: value } }));
|
|
69
|
+
}, []);
|
|
70
|
+
const buildAttributePayload = (input) => {
|
|
71
|
+
const label = {};
|
|
72
|
+
if (input.labelEn)
|
|
73
|
+
label['en-US'] = input.labelEn;
|
|
74
|
+
if (input.labelPl)
|
|
75
|
+
label['pl-PL'] = input.labelPl;
|
|
76
|
+
return {
|
|
77
|
+
label,
|
|
78
|
+
isSearchable: input.isSearchable,
|
|
79
|
+
isFilterable: input.isFilterable,
|
|
80
|
+
isVariantAxis: input.isVariantAxis,
|
|
81
|
+
isComparable: input.isComparable,
|
|
82
|
+
massEditable: input.massEditable,
|
|
83
|
+
quickSearchable: input.quickSearchable,
|
|
84
|
+
isPromoRule: input.isPromoRule,
|
|
85
|
+
...(input.valueType === 'number' || input.valueType === 'price'
|
|
86
|
+
? { displayAsSlider: input.displayAsSlider }
|
|
87
|
+
: {}),
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
const handleCreate = useCallback(async (input) => {
|
|
91
|
+
// enumValues required for both `enum` (single-select) and `multiselect`.
|
|
92
|
+
const enumValues = input.valueType === 'enum' || input.valueType === 'multiselect'
|
|
93
|
+
? input.enumValues
|
|
94
|
+
.split(',')
|
|
95
|
+
.map((s) => s.trim())
|
|
96
|
+
.filter(Boolean)
|
|
97
|
+
: undefined;
|
|
98
|
+
try {
|
|
99
|
+
await apiClient.post('/api/v1/admin/catalog/attributes', {
|
|
100
|
+
key: input.key,
|
|
101
|
+
valueType: input.valueType,
|
|
102
|
+
...buildAttributePayload(input),
|
|
103
|
+
...(enumValues !== undefined ? { enumValues } : {}),
|
|
104
|
+
});
|
|
105
|
+
setInfo(t('attributes.success.create', { key: input.key }));
|
|
106
|
+
await refresh();
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
setError(err instanceof ApiError ? err.envelope.error.message : t('attributes.error.create'));
|
|
110
|
+
}
|
|
111
|
+
}, [refresh, t]);
|
|
112
|
+
const handleEditSave = useCallback(async (attr, input) => {
|
|
113
|
+
try {
|
|
114
|
+
await apiClient.patch(`/api/v1/admin/catalog/attributes/${attr.key}`, buildAttributePayload(input));
|
|
115
|
+
setInfo(t('attributes.success.update', { key: attr.key }));
|
|
116
|
+
setEditingId(null);
|
|
117
|
+
await refresh();
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
setError(err instanceof ApiError ? err.envelope.error.message : t('attributes.error.update'));
|
|
121
|
+
}
|
|
122
|
+
}, [refresh, t]);
|
|
123
|
+
// Flush every dirty row's flags in one batch, then refresh once.
|
|
124
|
+
const saveFlags = useCallback(async () => {
|
|
125
|
+
if (dirtyIds.length === 0)
|
|
126
|
+
return;
|
|
127
|
+
setSaving(true);
|
|
128
|
+
setError(null);
|
|
129
|
+
try {
|
|
130
|
+
for (const id of dirtyIds) {
|
|
131
|
+
const attr = attrs.find((a) => a.id === id);
|
|
132
|
+
if (!attr)
|
|
133
|
+
continue;
|
|
134
|
+
await apiClient.patch(`/api/v1/admin/catalog/attributes/${attr.key}`, flagDrafts[id]);
|
|
135
|
+
}
|
|
136
|
+
setInfo(t('attributes.success.flagsSaved', { count: dirtyIds.length }));
|
|
137
|
+
await refresh();
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
setError(err instanceof ApiError ? err.envelope.error.message : t('attributes.error.update'));
|
|
141
|
+
}
|
|
142
|
+
finally {
|
|
143
|
+
setSaving(false);
|
|
144
|
+
}
|
|
145
|
+
}, [attrs, dirtyIds, flagDrafts, refresh, t]);
|
|
146
|
+
const resetFlags = useCallback(() => {
|
|
147
|
+
setFlagDrafts(Object.fromEntries(attrs.map((a) => [a.id, flagsOf(a)])));
|
|
148
|
+
}, [attrs]);
|
|
149
|
+
return (_jsxs(_Fragment, { children: [_jsx(PageHeader, { title: t('attributes.page.title'), description: t('attributes.page.description') }), error ? (_jsx(Alert, { variant: "destructive", className: "mb-4", children: _jsx(AlertDescription, { children: error }) })) : null, info ? (_jsx(Alert, { variant: "success", className: "mb-4", children: _jsx(AlertDescription, { children: info }) })) : null, editingAttr ? (_jsxs(Card, { className: "mb-4", children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('attributes.edit.title', { key: editingAttr.key }) }) }), _jsxs(CardContent, { className: "space-y-6", children: [_jsx(AttributeForm, { mode: "edit", attribute: editingAttr, onSubmit: (input) => handleEditSave(editingAttr, input), onCancel: () => setEditingId(null) }), editingAttr.valueType === 'enum' || editingAttr.valueType === 'multiselect' ? (_jsx(AttributeOptionsEditor, { attribute: editingAttr, onError: setError, onChanged: () => void refresh() })) : null] })] })) : (_jsxs(Card, { className: "mb-4", children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('attributes.create.title') }) }), _jsx(CardContent, { children: _jsx(AttributeForm, { mode: "create", onSubmit: handleCreate }) })] })), dirtyIds.length > 0 ? (_jsx(Card, { className: "mb-4", children: _jsxs(CardContent, { className: "flex flex-wrap items-center gap-3 pt-6", children: [_jsx("span", { className: "text-sm text-muted-foreground", children: t('attributes.batch.unsaved', { count: dirtyIds.length }) }), _jsx(Button, { size: "sm", disabled: saving, onClick: () => void saveFlags(), children: t('attributes.action.save') }), _jsx(Button, { size: "sm", variant: "ghost", disabled: saving, onClick: resetFlags, children: t('attributes.action.cancel') })] }) })) : null, _jsx(Card, { children: _jsx(CardContent, { className: "pt-6", children: loading ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('attributes.loading') })) : attrs.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('attributes.empty') })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: t('attributes.column.key') }), _jsx(TableHead, { children: t('attributes.column.label') }), _jsx(TableHead, { children: t('attributes.column.type') }), _jsx(TableHead, { children: t('attributes.column.enumValues') }), _jsx(TableHead, { children: t('attributes.column.searchable') }), _jsx(TableHead, { children: t('attributes.column.filterable') }), _jsx(TableHead, { children: t('attributes.column.variantAxis') }), _jsx(TableHead, { children: t('attributes.column.comparable') }), _jsx(TableHead, { children: t('attributes.column.massEditable') }), _jsx(TableHead, { children: t('attributes.column.quickSearchable') }), _jsx(TableHead, { children: t('attributes.column.promoRule') }), _jsx(TableHead, { className: "text-right", children: t('attributes.column.actions') })] }) }), _jsx(TableBody, { children: attrs.map((a) => {
|
|
150
|
+
const draft = flagDrafts[a.id] ?? flagsOf(a);
|
|
151
|
+
return (_jsxs(TableRow, { children: [_jsx(TableCell, { children: _jsx("code", { className: "font-mono text-xs", children: a.key }) }), _jsx(TableCell, { children: a.label['en-US'] ?? Object.values(a.label)[0] ?? '' }), _jsx(TableCell, { children: a.valueType }), _jsx(TableCell, { className: "text-muted-foreground", children: a.enumValues && a.enumValues.length ? a.enumValues.join(', ') : '—' }), FLAG_KEYS.map((key) => (_jsx(TableCell, { children: _jsx(Checkbox, { checked: draft[key], "aria-label": `${a.key}-${key}`, onChange: (e) => toggleFlag(a.id, key, e.target.checked) }) }, key))), _jsx(TableCell, { className: "text-right", children: _jsxs(Button, { variant: "outline", size: "sm", onClick: () => {
|
|
152
|
+
setEditingId(a.id);
|
|
153
|
+
setInfo(null);
|
|
154
|
+
}, children: [_jsx(Pencil, {}), t('attributes.action.edit')] }) })] }, a.id));
|
|
155
|
+
}) })] })) }) })] }));
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Shared create/edit form. In `edit` mode the `key` and `valueType` are locked
|
|
159
|
+
* (immutable server-side) while the label and flags stay editable; enum /
|
|
160
|
+
* multiselect options are managed by the separate {@link AttributeOptionsEditor}.
|
|
161
|
+
*/
|
|
162
|
+
function AttributeForm({ mode, attribute, onSubmit, onCancel }) {
|
|
163
|
+
const t = useTranslation('catalog');
|
|
164
|
+
const isEdit = mode === 'edit';
|
|
165
|
+
const [key, setKey] = useState(attribute?.key ?? '');
|
|
166
|
+
// Pre-fill from the stored label, tolerating older rows whose locale keys are
|
|
167
|
+
// `en`/`pl` (or only `labelDefault`) rather than the canonical `en-US`/`pl-PL`.
|
|
168
|
+
const [labelEn, setLabelEn] = useState(attribute?.label['en-US'] ?? attribute?.label['en'] ?? attribute?.labelDefault ?? '');
|
|
169
|
+
const [labelPl, setLabelPl] = useState(attribute?.label['pl-PL'] ?? attribute?.label['pl'] ?? '');
|
|
170
|
+
const [valueType, setValueType] = useState(attribute?.valueType ?? 'string');
|
|
171
|
+
const [enumValues, setEnumValues] = useState('');
|
|
172
|
+
const [isSearchable, setIsSearchable] = useState(attribute?.isSearchable ?? false);
|
|
173
|
+
const [isFilterable, setIsFilterable] = useState(attribute?.isFilterable ?? false);
|
|
174
|
+
const [isVariantAxis, setIsVariantAxis] = useState(attribute?.isVariantAxis ?? false);
|
|
175
|
+
const [displayAsSlider, setDisplayAsSlider] = useState(attribute?.displayAsSlider ?? false);
|
|
176
|
+
const [isComparable, setIsComparable] = useState(attribute?.isComparable ?? false);
|
|
177
|
+
const [massEditable, setMassEditable] = useState(attribute?.massEditable ?? false);
|
|
178
|
+
const [quickSearchable, setQuickSearchable] = useState(attribute?.quickSearchable ?? false);
|
|
179
|
+
const [isPromoRule, setIsPromoRule] = useState(attribute?.isPromoRule ?? false);
|
|
180
|
+
const [busy, setBusy] = useState(false);
|
|
181
|
+
const isNumeric = valueType === 'number' || valueType === 'price';
|
|
182
|
+
const collect = () => ({
|
|
183
|
+
key,
|
|
184
|
+
labelEn,
|
|
185
|
+
labelPl,
|
|
186
|
+
valueType,
|
|
187
|
+
enumValues,
|
|
188
|
+
isSearchable,
|
|
189
|
+
isFilterable,
|
|
190
|
+
isVariantAxis,
|
|
191
|
+
displayAsSlider,
|
|
192
|
+
isComparable,
|
|
193
|
+
massEditable,
|
|
194
|
+
quickSearchable,
|
|
195
|
+
isPromoRule,
|
|
196
|
+
});
|
|
197
|
+
const reset = () => {
|
|
198
|
+
setKey('');
|
|
199
|
+
setLabelEn('');
|
|
200
|
+
setLabelPl('');
|
|
201
|
+
setEnumValues('');
|
|
202
|
+
setIsSearchable(false);
|
|
203
|
+
setIsFilterable(false);
|
|
204
|
+
setIsVariantAxis(false);
|
|
205
|
+
setDisplayAsSlider(false);
|
|
206
|
+
setIsComparable(false);
|
|
207
|
+
setMassEditable(false);
|
|
208
|
+
setQuickSearchable(false);
|
|
209
|
+
setIsPromoRule(false);
|
|
210
|
+
};
|
|
211
|
+
return (_jsxs("form", { className: "space-y-4", onSubmit: (e) => {
|
|
212
|
+
e.preventDefault();
|
|
213
|
+
setBusy(true);
|
|
214
|
+
void onSubmit(collect())
|
|
215
|
+
.then(() => {
|
|
216
|
+
if (!isEdit)
|
|
217
|
+
reset();
|
|
218
|
+
})
|
|
219
|
+
.finally(() => setBusy(false));
|
|
220
|
+
}, children: [_jsxs("div", { className: "grid gap-4 md:grid-cols-2", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "akey", children: t('attributes.field.key') }), _jsx(Input, { id: "akey", value: key, onChange: (e) => setKey(e.target.value), pattern: "[a-z][a-z0-9_]*", required: true, maxLength: 64, disabled: isEdit })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "atype", children: t('attributes.field.type') }), _jsx(Select, { id: "atype", value: valueType, onChange: (e) => setValueType(e.target.value), disabled: isEdit, children: VALUE_TYPES.map((v) => (_jsx("option", { value: v, children: v }, v))) })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "alen", children: t('attributes.field.labelEn') }), _jsx(Input, { id: "alen", value: labelEn, onChange: (e) => setLabelEn(e.target.value) })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "alpl", children: t('attributes.field.labelPl') }), _jsx(Input, { id: "alpl", value: labelPl, onChange: (e) => setLabelPl(e.target.value) })] })] }), isEdit ? (_jsx("p", { className: "text-xs text-muted-foreground", children: t('attributes.edit.lockedHint') })) : null, isEdit && attribute?.customFieldDefinitionId ? (_jsxs("p", { className: "text-xs text-muted-foreground", children: [t('attributes.edit.customFieldDefinitionId'), ' ', _jsx("span", { className: "font-mono", children: attribute.customFieldDefinitionId })] })) : null, !isEdit && (valueType === 'enum' || valueType === 'multiselect') ? (_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "aenum", children: t('attributes.field.enumValues') }), _jsx(Input, { id: "aenum", value: enumValues, onChange: (e) => setEnumValues(e.target.value), placeholder: t('attributes.field.enumValuesPlaceholder'), required: true }), _jsx("p", { className: "text-xs text-muted-foreground", children: valueType === 'multiselect'
|
|
221
|
+
? t('attributes.field.enumValues.help.multiselect')
|
|
222
|
+
: t('attributes.field.enumValues.help.enum') })] })) : null, isNumeric ? (_jsx("div", { children: _jsxs("label", { className: "inline-flex items-center gap-2 text-sm", children: [_jsx(Checkbox, { checked: displayAsSlider, onChange: (e) => setDisplayAsSlider(e.target.checked) }), t('attributes.flag.displayAsSlider')] }) })) : null, _jsxs("div", { className: "space-y-2", children: [_jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx(Checkbox, { checked: isSearchable, onChange: (e) => setIsSearchable(e.target.checked) }), t('attributes.flag.searchable')] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx(Checkbox, { checked: isFilterable, onChange: (e) => setIsFilterable(e.target.checked) }), t('attributes.flag.filterable')] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx(Checkbox, { checked: isVariantAxis, onChange: (e) => setIsVariantAxis(e.target.checked) }), t('attributes.flag.variantAxis')] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx(Checkbox, { checked: isComparable, onChange: (e) => setIsComparable(e.target.checked) }), t('attributes.flag.comparable')] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx(Checkbox, { checked: massEditable, onChange: (e) => setMassEditable(e.target.checked) }), t('attributes.flag.massEditable')] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx(Checkbox, { checked: quickSearchable, onChange: (e) => setQuickSearchable(e.target.checked) }), t('attributes.column.quickSearchable')] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx(Checkbox, { checked: isPromoRule, onChange: (e) => setIsPromoRule(e.target.checked) }), t('attributes.flag.promoRule')] })] }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { type: "submit", disabled: busy, children: isEdit ? t('attributes.action.saveEdit') : t('attributes.action.create') }), onCancel ? (_jsx(Button, { type: "button", variant: "ghost", disabled: busy, onClick: onCancel, children: t('attributes.action.cancel') })) : null] })] }));
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Add / rename / remove the selectable options of an enum or multiselect
|
|
226
|
+
* attribute. Each mutation hits the per-option endpoints and reloads the local
|
|
227
|
+
* list; `onChanged` lets the parent refresh the attribute's `enumValues` cell.
|
|
228
|
+
*/
|
|
229
|
+
function AttributeOptionsEditor({ attribute, onError, onChanged }) {
|
|
230
|
+
const t = useTranslation('catalog');
|
|
231
|
+
const [options, setOptions] = useState([]);
|
|
232
|
+
const [newValue, setNewValue] = useState('');
|
|
233
|
+
const [newLabel, setNewLabel] = useState('');
|
|
234
|
+
const [busy, setBusy] = useState(false);
|
|
235
|
+
const base = `/api/v1/admin/catalog/attributes/${attribute.id}/options`;
|
|
236
|
+
const load = useCallback(async () => {
|
|
237
|
+
try {
|
|
238
|
+
const res = await apiClient.get(base);
|
|
239
|
+
setOptions(res.data.items);
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
onError(err instanceof ApiError ? err.envelope.error.message : t('attributes.error.load'));
|
|
243
|
+
}
|
|
244
|
+
}, [base, onError, t]);
|
|
245
|
+
useEffect(() => {
|
|
246
|
+
void load();
|
|
247
|
+
}, [load]);
|
|
248
|
+
const add = async () => {
|
|
249
|
+
if (!newValue.trim())
|
|
250
|
+
return;
|
|
251
|
+
setBusy(true);
|
|
252
|
+
try {
|
|
253
|
+
await apiClient.post(base, {
|
|
254
|
+
value: newValue.trim(),
|
|
255
|
+
labelDefault: newLabel.trim() || newValue.trim(),
|
|
256
|
+
});
|
|
257
|
+
setNewValue('');
|
|
258
|
+
setNewLabel('');
|
|
259
|
+
await load();
|
|
260
|
+
onChanged();
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
onError(err instanceof ApiError ? err.envelope.error.message : t('attributes.error.update'));
|
|
264
|
+
}
|
|
265
|
+
finally {
|
|
266
|
+
setBusy(false);
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
const rename = async (opt, labelDefault) => {
|
|
270
|
+
try {
|
|
271
|
+
await apiClient.patch(`${base}/${opt.id}`, { labelDefault });
|
|
272
|
+
await load();
|
|
273
|
+
onChanged();
|
|
274
|
+
}
|
|
275
|
+
catch (err) {
|
|
276
|
+
onError(err instanceof ApiError ? err.envelope.error.message : t('attributes.error.update'));
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
const remove = async (opt) => {
|
|
280
|
+
setBusy(true);
|
|
281
|
+
try {
|
|
282
|
+
await apiClient.delete(`${base}/${opt.id}`);
|
|
283
|
+
await load();
|
|
284
|
+
onChanged();
|
|
285
|
+
}
|
|
286
|
+
catch (err) {
|
|
287
|
+
onError(err instanceof ApiError ? err.envelope.error.message : t('attributes.error.update'));
|
|
288
|
+
}
|
|
289
|
+
finally {
|
|
290
|
+
setBusy(false);
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
return (_jsxs("div", { className: "space-y-3 border-t pt-4", children: [_jsx("h3", { className: "text-sm font-semibold", children: t('attributes.options.title') }), options.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('attributes.options.empty') })) : (_jsx("div", { className: "space-y-2", children: options.map((opt) => (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("code", { className: "w-40 shrink-0 font-mono text-xs", children: opt.value }), _jsx(Input, { defaultValue: opt.labelDefault, "aria-label": `option-label-${opt.value}`, onBlur: (e) => {
|
|
294
|
+
const next = e.target.value.trim();
|
|
295
|
+
if (next && next !== opt.labelDefault)
|
|
296
|
+
void rename(opt, next);
|
|
297
|
+
} }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", disabled: busy, onClick: () => void remove(opt), children: t('attributes.options.remove') })] }, opt.id))) })), _jsxs("div", { className: "flex items-end gap-2", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "opt-value", children: t('attributes.options.value') }), _jsx(Input, { id: "opt-value", value: newValue, onChange: (e) => setNewValue(e.target.value), pattern: "[a-z0-9_-]+", placeholder: t('attributes.options.valuePlaceholder') })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "opt-label", children: t('attributes.options.labelDefault') }), _jsx(Input, { id: "opt-label", value: newLabel, onChange: (e) => setNewLabel(e.target.value) })] }), _jsx(Button, { type: "button", disabled: busy || !newValue.trim(), onClick: () => void add(), children: t('attributes.options.add') })] })] }));
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* The default export a route declaration's dynamic-import factory resolves
|
|
301
|
+
* (feature 091, R6). The named export stays: it is the spelling this module's
|
|
302
|
+
* own siblings and tests use.
|
|
303
|
+
*/
|
|
304
|
+
export default AttributesManager;
|
|
305
|
+
//# sourceMappingURL=AttributesManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AttributesManager.js","sourceRoot":"","sources":["../../../src/admin/pages/AttributesManager.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAkC,MAAM,OAAO,CAAC;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACrO,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,gEAAgE;AAChE,iEAAiE;AACjE,mDAAmD;AACnD,sEAAsE;AACtE,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,CAAU,CAAC;AAiC7F,oEAAoE;AACpE,MAAM,SAAS,GAAG;IAChB,cAAc;IACd,cAAc;IACd,eAAe;IACf,cAAc;IACd,cAAc;IACd,iBAAiB;IACjB,aAAa;CACL,CAAC;AAIX,SAAS,OAAO,CAAC,CAAiB;IAChC,OAAO;QACL,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,eAAe,EAAE,CAAC,CAAC,eAAe;QAClC,WAAW,EAAE,CAAC,CAAC,WAAW;KAC3B,CAAC;AACJ,CAAC;AACD,SAAS,UAAU,CAAC,CAAU,EAAE,CAAU;IACxC,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAmB,EAAE,CAAC,CAAC;IACzD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACtD,oEAAoE;IACpE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAA0B,EAAE,CAAC,CAAC;IAC1E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAEhE,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAmB,EAAE;QACpD,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,CAC7B,kCAAkC,CACnC,CAAC;YACF,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACnB,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAC9F,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAER,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,OAAO,EAAE,CAAC;IACjB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,IAAI,IAAI,EACnD,CAAC,KAAK,EAAE,SAAS,CAAC,CACnB,CAAC;IAEF,oEAAoE;IACpE,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC1G,CAAC,KAAK,EAAE,UAAU,CAAC,CACpB,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,EAAU,EAAE,GAAY,EAAE,KAAc,EAAQ,EAAE;QAChF,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,CAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,qBAAqB,GAAG,CAAC,KAA0B,EAA2B,EAAE;QACpF,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,OAAO;YAAE,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;QAClD,IAAI,KAAK,CAAC,OAAO;YAAE,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;QAClD,OAAO;YACL,KAAK;YACL,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO;gBAC7D,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE;gBAC5C,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAC9B,KAAK,EAAE,KAA0B,EAAiB,EAAE;QAClD,yEAAyE;QACzE,MAAM,UAAU,GACd,KAAK,CAAC,SAAS,KAAK,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,aAAa;YAC7D,CAAC,CAAC,KAAK,CAAC,UAAU;iBACb,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC;YACpB,CAAC,CAAC,SAAS,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,IAAI,CAA2B,kCAAkC,EAAE;gBACjF,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,GAAG,qBAAqB,CAAC,KAAK,CAAC;gBAC/B,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpD,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,CAAC,2BAA2B,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC5D,MAAM,OAAO,EAAE,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAChG,CAAC;IACH,CAAC,EACD,CAAC,OAAO,EAAE,CAAC,CAAC,CACb,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAChC,KAAK,EAAE,IAAoB,EAAE,KAA0B,EAAiB,EAAE;QACxE,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,KAAK,CACnB,oCAAoC,IAAI,CAAC,GAAG,EAAE,EAC9C,qBAAqB,CAAC,KAAK,CAAC,CAC7B,CAAC;YACF,OAAO,CAAC,CAAC,CAAC,2BAA2B,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC3D,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,MAAM,OAAO,EAAE,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAChG,CAAC;IACH,CAAC,EACD,CAAC,OAAO,EAAE,CAAC,CAAC,CACb,CAAC;IAEF,iEAAiE;IACjE,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,IAAmB,EAAE;QACtD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAClC,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC5C,IAAI,CAAC,IAAI;oBAAE,SAAS;gBACpB,MAAM,SAAS,CAAC,KAAK,CAAC,oCAAoC,IAAI,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,EAAE,CAAE,CAAC,CAAC;YACzF,CAAC;YACD,OAAO,CAAC,CAAC,CAAC,+BAA+B,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACxE,MAAM,OAAO,EAAE,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAChG,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAE9C,MAAM,UAAU,GAAG,WAAW,CAAC,GAAS,EAAE;QACxC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,CACL,8BACE,KAAC,UAAU,IACT,KAAK,EAAE,CAAC,CAAC,uBAAuB,CAAC,EACjC,WAAW,EAAE,CAAC,CAAC,6BAA6B,CAAC,GAC7C,EAED,KAAK,CAAC,CAAC,CAAC,CACP,KAAC,KAAK,IAAC,OAAO,EAAC,aAAa,EAAC,SAAS,EAAC,MAAM,YAC3C,KAAC,gBAAgB,cAAE,KAAK,GAAoB,GACtC,CACT,CAAC,CAAC,CAAC,IAAI,EACP,IAAI,CAAC,CAAC,CAAC,CACN,KAAC,KAAK,IAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,MAAM,YACvC,KAAC,gBAAgB,cAAE,IAAI,GAAoB,GACrC,CACT,CAAC,CAAC,CAAC,IAAI,EAEP,WAAW,CAAC,CAAC,CAAC,CACb,MAAC,IAAI,IAAC,SAAS,EAAC,MAAM,aACpB,KAAC,UAAU,cACT,KAAC,SAAS,cAAE,CAAC,CAAC,uBAAuB,EAAE,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,GAAa,GAClE,EACb,MAAC,WAAW,IAAC,SAAS,EAAC,WAAW,aAChC,KAAC,aAAa,IACZ,IAAI,EAAC,MAAM,EACX,SAAS,EAAE,WAAW,EACtB,QAAQ,EAAE,CAAC,KAAK,EAAiB,EAAE,CAAC,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,EACtE,QAAQ,EAAE,GAAS,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,GACxC,EACD,WAAW,CAAC,SAAS,KAAK,MAAM,IAAI,WAAW,CAAC,SAAS,KAAK,aAAa,CAAC,CAAC,CAAC,CAC7E,KAAC,sBAAsB,IACrB,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,GAAS,EAAE,CAAC,KAAK,OAAO,EAAE,GACrC,CACH,CAAC,CAAC,CAAC,IAAI,IACI,IACT,CACR,CAAC,CAAC,CAAC,CACF,MAAC,IAAI,IAAC,SAAS,EAAC,MAAM,aACpB,KAAC,UAAU,cACT,KAAC,SAAS,cAAE,CAAC,CAAC,yBAAyB,CAAC,GAAa,GAC1C,EACb,KAAC,WAAW,cACV,KAAC,aAAa,IAAC,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,YAAY,GAAI,GAC3C,IACT,CACR,EAEA,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACrB,KAAC,IAAI,IAAC,SAAS,EAAC,MAAM,YACpB,MAAC,WAAW,IAAC,SAAS,EAAC,wCAAwC,aAC7D,eAAM,SAAS,EAAC,+BAA+B,YAC5C,CAAC,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,GACrD,EACP,KAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAS,EAAE,CAAC,KAAK,SAAS,EAAE,YACtE,CAAC,CAAC,wBAAwB,CAAC,GACrB,EACT,KAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,YACpE,CAAC,CAAC,0BAA0B,CAAC,GACvB,IACG,GACT,CACR,CAAC,CAAC,CAAC,IAAI,EAER,KAAC,IAAI,cACH,KAAC,WAAW,IAAC,SAAS,EAAC,MAAM,YAC1B,OAAO,CAAC,CAAC,CAAC,CACT,YAAG,SAAS,EAAC,+BAA+B,YAAE,CAAC,CAAC,oBAAoB,CAAC,GAAK,CAC3E,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACvB,YAAG,SAAS,EAAC,+BAA+B,YAAE,CAAC,CAAC,kBAAkB,CAAC,GAAK,CACzE,CAAC,CAAC,CAAC,CACF,MAAC,KAAK,eACJ,KAAC,WAAW,cACV,MAAC,QAAQ,eACP,KAAC,SAAS,cAAE,CAAC,CAAC,uBAAuB,CAAC,GAAa,EACnD,KAAC,SAAS,cAAE,CAAC,CAAC,yBAAyB,CAAC,GAAa,EACrD,KAAC,SAAS,cAAE,CAAC,CAAC,wBAAwB,CAAC,GAAa,EACpD,KAAC,SAAS,cAAE,CAAC,CAAC,8BAA8B,CAAC,GAAa,EAC1D,KAAC,SAAS,cAAE,CAAC,CAAC,8BAA8B,CAAC,GAAa,EAC1D,KAAC,SAAS,cAAE,CAAC,CAAC,8BAA8B,CAAC,GAAa,EAC1D,KAAC,SAAS,cAAE,CAAC,CAAC,+BAA+B,CAAC,GAAa,EAC3D,KAAC,SAAS,cAAE,CAAC,CAAC,8BAA8B,CAAC,GAAa,EAC1D,KAAC,SAAS,cAAE,CAAC,CAAC,gCAAgC,CAAC,GAAa,EAC5D,KAAC,SAAS,cAAE,CAAC,CAAC,mCAAmC,CAAC,GAAa,EAC/D,KAAC,SAAS,cAAE,CAAC,CAAC,6BAA6B,CAAC,GAAa,EACzD,KAAC,SAAS,IAAC,SAAS,EAAC,YAAY,YAAE,CAAC,CAAC,2BAA2B,CAAC,GAAa,IACrE,GACC,EACd,KAAC,SAAS,cACP,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oCACf,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;oCAC7C,OAAO,CACL,MAAC,QAAQ,eACP,KAAC,SAAS,cACR,eAAM,SAAS,EAAC,mBAAmB,YAAE,CAAC,CAAC,GAAG,GAAQ,GACxC,EACZ,KAAC,SAAS,cAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAa,EAC5E,KAAC,SAAS,cAAE,CAAC,CAAC,SAAS,GAAa,EACpC,KAAC,SAAS,IAAC,SAAS,EAAC,uBAAuB,YACzC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAC1D,EACX,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACtB,KAAC,SAAS,cACR,KAAC,QAAQ,IACP,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,gBACP,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,EAC7B,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAC9D,IALY,GAAG,CAMP,CACb,CAAC,EACF,KAAC,SAAS,IAAC,SAAS,EAAC,YAAY,YAC/B,MAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,GAAS,EAAE;wDAClB,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wDACnB,OAAO,CAAC,IAAI,CAAC,CAAC;oDAChB,CAAC,aAED,KAAC,MAAM,KAAG,EACT,CAAC,CAAC,wBAAwB,CAAC,IACrB,GACC,KA9BC,CAAC,CAAC,EAAE,CA+BR,CACZ,CAAC;gCACJ,CAAC,CAAC,GACQ,IACN,CACT,GACW,GACT,IACN,CACJ,CAAC;AACJ,CAAC;AAyBD;;;;GAIG;AACH,SAAS,aAAa,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAsB;IAChF,MAAM,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC;IAC/B,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACrD,8EAA8E;IAC9E,gFAAgF;IAChF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CACpC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,YAAY,IAAI,EAAE,CACrF,CAAC;IACF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAClG,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAY,SAAS,EAAE,SAAS,IAAI,QAAQ,CAAC,CAAC;IACxF,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,YAAY,IAAI,KAAK,CAAC,CAAC;IACnF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,YAAY,IAAI,KAAK,CAAC,CAAC;IACnF,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,aAAa,IAAI,KAAK,CAAC,CAAC;IACtF,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,eAAe,IAAI,KAAK,CAAC,CAAC;IAC5F,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,YAAY,IAAI,KAAK,CAAC,CAAC;IACnF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,YAAY,IAAI,KAAK,CAAC,CAAC;IACnF,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,eAAe,IAAI,KAAK,CAAC,CAAC;IAC5F,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,WAAW,IAAI,KAAK,CAAC,CAAC;IAChF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,OAAO,CAAC;IAElE,MAAM,OAAO,GAAG,GAAwB,EAAE,CAAC,CAAC;QAC1C,GAAG;QACH,OAAO;QACP,OAAO;QACP,SAAS;QACT,UAAU;QACV,YAAY;QACZ,YAAY;QACZ,aAAa;QACb,eAAe;QACf,YAAY;QACZ,YAAY;QACZ,eAAe;QACf,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,MAAM,CAAC,EAAE,CAAC,CAAC;QACX,UAAU,CAAC,EAAE,CAAC,CAAC;QACf,UAAU,CAAC,EAAE,CAAC,CAAC;QACf,aAAa,CAAC,EAAE,CAAC,CAAC;QAClB,eAAe,CAAC,KAAK,CAAC,CAAC;QACvB,eAAe,CAAC,KAAK,CAAC,CAAC;QACvB,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACxB,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC1B,eAAe,CAAC,KAAK,CAAC,CAAC;QACvB,eAAe,CAAC,KAAK,CAAC,CAAC;QACvB,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC1B,cAAc,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC;IAEF,OAAO,CACL,gBACE,SAAS,EAAC,WAAW,EACrB,QAAQ,EAAE,CAAC,CAAY,EAAQ,EAAE;YAC/B,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC;YACd,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;iBACrB,IAAI,CAAC,GAAG,EAAE;gBACT,IAAI,CAAC,MAAM;oBAAE,KAAK,EAAE,CAAC;YACvB,CAAC,CAAC;iBACD,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,CAAC,aAED,eAAK,SAAS,EAAC,2BAA2B,aACxC,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,KAAK,IAAC,OAAO,EAAC,MAAM,YAAE,CAAC,CAAC,sBAAsB,CAAC,GAAS,EACzD,KAAC,KAAK,IACJ,EAAE,EAAC,MAAM,EACT,KAAK,EAAE,GAAG,EACV,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC7C,OAAO,EAAC,iBAAiB,EACzB,QAAQ,QACR,SAAS,EAAE,EAAE,EACb,QAAQ,EAAE,MAAM,GAChB,IACE,EACN,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,KAAK,IAAC,OAAO,EAAC,OAAO,YAAE,CAAC,CAAC,uBAAuB,CAAC,GAAS,EAC3D,KAAC,MAAM,IACL,EAAE,EAAC,OAAO,EACV,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAkB,CAAC,EAChE,QAAQ,EAAE,MAAM,YAEf,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACtB,iBAAgB,KAAK,EAAE,CAAC,YACrB,CAAC,IADS,CAAC,CAEL,CACV,CAAC,GACK,IACL,EACN,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,KAAK,IAAC,OAAO,EAAC,MAAM,YAAE,CAAC,CAAC,0BAA0B,CAAC,GAAS,EAC7D,KAAC,KAAK,IAAC,EAAE,EAAC,MAAM,EAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAI,IAClF,EACN,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,KAAK,IAAC,OAAO,EAAC,MAAM,YAAE,CAAC,CAAC,0BAA0B,CAAC,GAAS,EAC7D,KAAC,KAAK,IAAC,EAAE,EAAC,MAAM,EAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAI,IAClF,IACF,EACL,MAAM,CAAC,CAAC,CAAC,CACR,YAAG,SAAS,EAAC,+BAA+B,YAAE,CAAC,CAAC,4BAA4B,CAAC,GAAK,CACnF,CAAC,CAAC,CAAC,IAAI,EACP,MAAM,IAAI,SAAS,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAC9C,aAAG,SAAS,EAAC,+BAA+B,aACzC,CAAC,CAAC,yCAAyC,CAAC,EAAE,GAAG,EAClD,eAAM,SAAS,EAAC,WAAW,YAAE,SAAS,CAAC,uBAAuB,GAAQ,IACpE,CACL,CAAC,CAAC,CAAC,IAAI,EAGP,CAAC,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,CAClE,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,KAAK,IAAC,OAAO,EAAC,OAAO,YAAE,CAAC,CAAC,6BAA6B,CAAC,GAAS,EACjE,KAAC,KAAK,IACJ,EAAE,EAAC,OAAO,EACV,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACpD,WAAW,EAAE,CAAC,CAAC,wCAAwC,CAAC,EACxD,QAAQ,SACR,EACF,YAAG,SAAS,EAAC,+BAA+B,YACzC,SAAS,KAAK,aAAa;4BAC1B,CAAC,CAAC,CAAC,CAAC,8CAA8C,CAAC;4BACnD,CAAC,CAAC,CAAC,CAAC,uCAAuC,CAAC,GAC5C,IACA,CACP,CAAC,CAAC,CAAC,IAAI,EACP,SAAS,CAAC,CAAC,CAAC,CACX,wBACE,iBAAO,SAAS,EAAC,wCAAwC,aACvD,KAAC,QAAQ,IACP,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAC3D,EACD,CAAC,CAAC,iCAAiC,CAAC,IAC/B,GACJ,CACP,CAAC,CAAC,CAAC,IAAI,EACR,eAAK,SAAS,EAAC,WAAW,aACxB,iBAAO,SAAS,EAAC,iCAAiC,aAChD,KAAC,QAAQ,IAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAI,EAC5F,CAAC,CAAC,4BAA4B,CAAC,IAC1B,EACR,iBAAO,SAAS,EAAC,iCAAiC,aAChD,KAAC,QAAQ,IAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAI,EAC5F,CAAC,CAAC,4BAA4B,CAAC,IAC1B,EACR,iBAAO,SAAS,EAAC,iCAAiC,aAChD,KAAC,QAAQ,IAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAI,EAC9F,CAAC,CAAC,6BAA6B,CAAC,IAC3B,EACR,iBAAO,SAAS,EAAC,iCAAiC,aAChD,KAAC,QAAQ,IAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAI,EAC5F,CAAC,CAAC,4BAA4B,CAAC,IAC1B,EACR,iBAAO,SAAS,EAAC,iCAAiC,aAChD,KAAC,QAAQ,IAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAI,EAC5F,CAAC,CAAC,8BAA8B,CAAC,IAC5B,EACR,iBAAO,SAAS,EAAC,iCAAiC,aAChD,KAAC,QAAQ,IACP,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAC3D,EACD,CAAC,CAAC,mCAAmC,CAAC,IACjC,EACR,iBAAO,SAAS,EAAC,iCAAiC,aAChD,KAAC,QAAQ,IAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAI,EAC1F,CAAC,CAAC,2BAA2B,CAAC,IACzB,IACJ,EACN,eAAK,SAAS,EAAC,YAAY,aACzB,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,IAAI,YACjC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC,GAClE,EACR,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,YACpE,CAAC,CAAC,0BAA0B,CAAC,GACvB,CACV,CAAC,CAAC,CAAC,IAAI,IACJ,IACD,CACR,CAAC;AACJ,CAAC;AAiBD;;;;GAIG;AACH,SAAS,sBAAsB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAsB;IACnF,MAAM,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAC;IAC9D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,oCAAoC,SAAS,CAAC,EAAE,UAAU,CAAC;IAExE,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,IAAmB,EAAE;QACjD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,CAAyC,IAAI,CAAC,CAAC;YAC9E,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAEvB,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,IAAI,EAAE,CAAC;IACd,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,GAAG,GAAG,KAAK,IAAmB,EAAE;QACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YAAE,OAAO;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE;gBACzB,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE;gBACtB,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,IAAI,EAAE;aACjD,CAAC,CAAC;YACH,WAAW,CAAC,EAAE,CAAC,CAAC;YAChB,WAAW,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,IAAI,EAAE,CAAC;YACb,SAAS,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAC/F,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,EAAE,GAAoB,EAAE,YAAoB,EAAiB,EAAE;QACjF,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;YAC7D,MAAM,IAAI,EAAE,CAAC;YACb,SAAS,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,EAAE,GAAoB,EAAiB,EAAE;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,IAAI,EAAE,CAAC;YACb,SAAS,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAC/F,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,aAAI,SAAS,EAAC,uBAAuB,YAAE,CAAC,CAAC,0BAA0B,CAAC,GAAM,EACzE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACtB,YAAG,SAAS,EAAC,+BAA+B,YAAE,CAAC,CAAC,0BAA0B,CAAC,GAAK,CACjF,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,WAAW,YACvB,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACpB,eAAkB,SAAS,EAAC,yBAAyB,aACnD,eAAM,SAAS,EAAC,iCAAiC,YAAE,GAAG,CAAC,KAAK,GAAQ,EACpE,KAAC,KAAK,IACJ,YAAY,EAAE,GAAG,CAAC,YAAY,gBAClB,gBAAgB,GAAG,CAAC,KAAK,EAAE,EACvC,MAAM,EAAE,CAAC,CAAC,EAAQ,EAAE;gCAClB,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gCACnC,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,YAAY;oCAAE,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;4BAChE,CAAC,GACD,EACF,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,IAAI,EACT,QAAQ,EAAE,IAAI,EACd,OAAO,EAAE,GAAS,EAAE,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,YAEpC,CAAC,CAAC,2BAA2B,CAAC,GACxB,KAlBD,GAAG,CAAC,EAAE,CAmBV,CACP,CAAC,GACE,CACP,EACD,eAAK,SAAS,EAAC,sBAAsB,aACnC,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,KAAK,IAAC,OAAO,EAAC,WAAW,YAAE,CAAC,CAAC,0BAA0B,CAAC,GAAS,EAClE,KAAC,KAAK,IACJ,EAAE,EAAC,WAAW,EACd,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAClD,OAAO,EAAC,aAAa,EACrB,WAAW,EAAE,CAAC,CAAC,qCAAqC,CAAC,GACrD,IACE,EACN,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,KAAK,IAAC,OAAO,EAAC,WAAW,YAAE,CAAC,CAAC,iCAAiC,CAAC,GAAS,EACzE,KAAC,KAAK,IACJ,EAAE,EAAC,WAAW,EACd,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAQ,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAClD,IACE,EACN,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,GAAS,EAAE,CAAC,KAAK,GAAG,EAAE,YACtF,CAAC,CAAC,wBAAwB,CAAC,GACrB,IACL,IACF,CACP,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export declare function BulkOperationDetailPage(): ReactNode;
|
|
3
|
+
/**
|
|
4
|
+
* The default export a route declaration's dynamic-import factory resolves
|
|
5
|
+
* (feature 091, R6). The named export stays: it is the spelling this module's
|
|
6
|
+
* own siblings and tests use.
|
|
7
|
+
*/
|
|
8
|
+
export default BulkOperationDetailPage;
|
|
9
|
+
//# sourceMappingURL=BulkOperationDetailPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BulkOperationDetailPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/BulkOperationDetailPage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAqE1F,wBAAgB,uBAAuB,IAAI,SAAS,CA0UnD;AAWD;;;;GAIG;AACH,eAAe,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
3
|
+
import { Link, useParams } from 'react-router-dom';
|
|
4
|
+
import { BULK_OPERATION_TYPES, } from '@endora-commerce/contracts';
|
|
5
|
+
import { ApiError, apiClient, formatDateTime } from '@endora-commerce/admin-kit/lib';
|
|
6
|
+
import { Alert, AlertDescription, Badge, Card, CardContent, CardHeader, CardTitle, PageHeader, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@endora-commerce/admin-kit/ui';
|
|
7
|
+
import { useTranslation } from '@endora-commerce/admin-kit/i18n';
|
|
8
|
+
/**
|
|
9
|
+
* Bulk operation detail view — feature: bulk-operations detail.
|
|
10
|
+
*
|
|
11
|
+
* Reached by clicking a row on the "Bulk actions" list. Shows the full
|
|
12
|
+
* processing summary, the operation's lifecycle log trail, and the per-element
|
|
13
|
+
* outcome of the operation. Polls while the operation is still pending /
|
|
14
|
+
* running so progress, logs, and results update live.
|
|
15
|
+
*/
|
|
16
|
+
const ACTIVE_STATUSES = ['pending', 'running'];
|
|
17
|
+
const POLL_INTERVAL_MS = 4000;
|
|
18
|
+
const STATUS_BADGE = {
|
|
19
|
+
pending: 'warning',
|
|
20
|
+
running: 'secondary',
|
|
21
|
+
completed: 'success',
|
|
22
|
+
failed: 'destructive',
|
|
23
|
+
};
|
|
24
|
+
const OUTCOME_BADGE = {
|
|
25
|
+
succeeded: 'success',
|
|
26
|
+
skipped: 'warning',
|
|
27
|
+
failed: 'destructive',
|
|
28
|
+
};
|
|
29
|
+
const LOG_LEVEL_CLASS = {
|
|
30
|
+
info: 'text-foreground',
|
|
31
|
+
warn: 'text-amber-600 dark:text-amber-500',
|
|
32
|
+
error: 'text-destructive',
|
|
33
|
+
};
|
|
34
|
+
const ELEMENT_FILTERS = ['all', 'succeeded', 'skipped', 'failed'];
|
|
35
|
+
const KNOWN_OPERATION_TYPES = new Set([
|
|
36
|
+
BULK_OPERATION_TYPES.PRODUCT_BULK_UPDATE,
|
|
37
|
+
BULK_OPERATION_TYPES.SEARCH_REINDEX,
|
|
38
|
+
]);
|
|
39
|
+
/** Pick a display name from the multilingual product `name` record. */
|
|
40
|
+
function resolveProductName(name) {
|
|
41
|
+
return name['en-US'] ?? name['en'] ?? Object.values(name)[0] ?? '';
|
|
42
|
+
}
|
|
43
|
+
export function BulkOperationDetailPage() {
|
|
44
|
+
const t = useTranslation('catalog');
|
|
45
|
+
const { id = '' } = useParams();
|
|
46
|
+
const [op, setOp] = useState(null);
|
|
47
|
+
const [loading, setLoading] = useState(true);
|
|
48
|
+
const [notFound, setNotFound] = useState(false);
|
|
49
|
+
const [error, setError] = useState(null);
|
|
50
|
+
const [elementFilter, setElementFilter] = useState('all');
|
|
51
|
+
const [productInfo, setProductInfo] = useState({});
|
|
52
|
+
const [undoing, setUndoing] = useState(false);
|
|
53
|
+
const [undoResult, setUndoResult] = useState(null);
|
|
54
|
+
const refresh = useCallback(async () => {
|
|
55
|
+
setError(null);
|
|
56
|
+
try {
|
|
57
|
+
const res = await apiClient.get(`/api/v1/admin/catalog/bulk-operations/${id}`);
|
|
58
|
+
setOp(res.data);
|
|
59
|
+
setNotFound(false);
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
if (err instanceof ApiError && err.envelope.error.code === 'NOT_FOUND') {
|
|
63
|
+
setNotFound(true);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
setError(err instanceof ApiError ? err.envelope.error.message : t('bulkOperations.error.load'));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
setLoading(false);
|
|
71
|
+
}
|
|
72
|
+
}, [id, t]);
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
setLoading(true);
|
|
75
|
+
void refresh();
|
|
76
|
+
}, [refresh]);
|
|
77
|
+
// Poll while the operation is still in flight.
|
|
78
|
+
const isActive = op ? ACTIVE_STATUSES.includes(op.status) : false;
|
|
79
|
+
const refreshRef = useRef(refresh);
|
|
80
|
+
refreshRef.current = refresh;
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
if (!isActive)
|
|
83
|
+
return undefined;
|
|
84
|
+
const handle = window.setInterval(() => {
|
|
85
|
+
void refreshRef.current();
|
|
86
|
+
}, POLL_INTERVAL_MS);
|
|
87
|
+
return () => window.clearInterval(handle);
|
|
88
|
+
}, [isActive]);
|
|
89
|
+
// Stable key over the distinct product ids in the result set so the lookup
|
|
90
|
+
// below doesn't refetch on every poll when the id set is unchanged.
|
|
91
|
+
const productIdsKey = useMemo(() => Array.from(new Set((op?.results ?? []).map((r) => r.productId))).join('|'), [op?.results]);
|
|
92
|
+
// Resolve product name + SKU for the Product column (results only carry the
|
|
93
|
+
// product id). Batched in chunks via the admin batch-by-id endpoint.
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
const ids = productIdsKey ? productIdsKey.split('|') : [];
|
|
96
|
+
if (ids.length === 0) {
|
|
97
|
+
setProductInfo({});
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
let cancelled = false;
|
|
101
|
+
void (async () => {
|
|
102
|
+
const map = {};
|
|
103
|
+
const CHUNK = 500;
|
|
104
|
+
for (let i = 0; i < ids.length; i += CHUNK) {
|
|
105
|
+
const chunk = ids.slice(i, i + CHUNK);
|
|
106
|
+
try {
|
|
107
|
+
const res = await apiClient.post('/api/v1/admin/catalog/products/batch-by-id', { ids: chunk, pageSize: CHUNK });
|
|
108
|
+
for (const p of res.data) {
|
|
109
|
+
map[p.id] = { name: resolveProductName(p.name), sku: p.sku };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
/* fall back to the raw id for this chunk */
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (!cancelled)
|
|
117
|
+
setProductInfo(map);
|
|
118
|
+
})();
|
|
119
|
+
return () => {
|
|
120
|
+
cancelled = true;
|
|
121
|
+
};
|
|
122
|
+
}, [productIdsKey]);
|
|
123
|
+
const typeLabel = op
|
|
124
|
+
? KNOWN_OPERATION_TYPES.has(op.type)
|
|
125
|
+
? t(`bulkOperations.type.${op.type}`)
|
|
126
|
+
: op.type
|
|
127
|
+
: '';
|
|
128
|
+
const filteredResults = useMemo(() => {
|
|
129
|
+
const results = op?.results ?? [];
|
|
130
|
+
if (elementFilter === 'all')
|
|
131
|
+
return results;
|
|
132
|
+
return results.filter((r) => r.status === elementFilter);
|
|
133
|
+
}, [op?.results, elementFilter]);
|
|
134
|
+
// Feature 054 — undo a reversible bulk edit. Restores every affected product
|
|
135
|
+
// whose current state still matches the operation; conflicts are reported.
|
|
136
|
+
const canUndo = !!op && op.status === 'completed' && op.reversible && op.undoStatus !== 'reverted';
|
|
137
|
+
const handleUndo = useCallback(async () => {
|
|
138
|
+
if (!op)
|
|
139
|
+
return;
|
|
140
|
+
if (!confirm(t('bulkOperations.undo.confirm', { count: op.succeeded })))
|
|
141
|
+
return;
|
|
142
|
+
setUndoing(true);
|
|
143
|
+
setError(null);
|
|
144
|
+
setUndoResult(null);
|
|
145
|
+
try {
|
|
146
|
+
const res = await apiClient.post(`/api/v1/admin/catalog/bulk-operations/${op.id}/undo`, {});
|
|
147
|
+
setUndoResult(res.data);
|
|
148
|
+
await refresh();
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
setError(err instanceof ApiError ? err.envelope.error.message : t('bulkOperations.undo.error'));
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
setUndoing(false);
|
|
155
|
+
}
|
|
156
|
+
}, [op, refresh, t]);
|
|
157
|
+
const back = { label: t('bulkOperations.detail.back'), to: '/catalog/bulk-operations' };
|
|
158
|
+
if (loading && !op) {
|
|
159
|
+
return (_jsxs(_Fragment, { children: [_jsx(PageHeader, { title: t('bulkOperations.detail.title'), back: back }), _jsx("p", { className: "text-sm text-muted-foreground", children: t('bulkOperations.loading') })] }));
|
|
160
|
+
}
|
|
161
|
+
if (notFound || !op) {
|
|
162
|
+
return (_jsxs(_Fragment, { children: [_jsx(PageHeader, { title: t('bulkOperations.detail.title'), back: back }), _jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: t('bulkOperations.detail.notFound') }) })] }));
|
|
163
|
+
}
|
|
164
|
+
const pct = op.total > 0 ? Math.round((op.processed / op.total) * 100) : 0;
|
|
165
|
+
return (_jsxs(_Fragment, { children: [_jsx(PageHeader, { title: _jsxs("span", { className: "flex items-center gap-2.5", children: [typeLabel, _jsx(Badge, { variant: STATUS_BADGE[op.status], children: t(`bulkOperations.status.${op.status}`) })] }), description: t('bulkOperations.detail.title'), back: back }), error ? (_jsx(Alert, { variant: "destructive", className: "mb-4", children: _jsx(AlertDescription, { children: error }) })) : null, op.error ? (_jsx(Alert, { variant: "destructive", className: "mb-4", children: _jsx(AlertDescription, { children: op.error }) })) : null, undoResult ? (_jsx(Alert, { variant: undoResult.conflicts.length > 0 ? 'warning' : 'success', className: "mb-4", children: _jsx(AlertDescription, { children: t('bulkOperations.undo.result', {
|
|
166
|
+
reverted: undoResult.reverted,
|
|
167
|
+
conflicts: undoResult.conflicts.length,
|
|
168
|
+
}) }) })) : null, op.undoStatus === 'reverted' && !undoResult ? (_jsx(Alert, { variant: "success", className: "mb-4", children: _jsx(AlertDescription, { children: t('bulkOperations.undo.alreadyReverted') }) })) : null, _jsxs(Card, { className: "mb-4", children: [_jsxs(CardHeader, { className: "flex flex-row flex-wrap items-center justify-between gap-3", children: [_jsx(CardTitle, { children: t('bulkOperations.detail.summary') }), canUndo ? (_jsx("button", { type: "button", className: "b2b-btn b2b-btn--sm b2b-btn--primary", disabled: undoing, onClick: () => void handleUndo(), children: undoing ? t('bulkOperations.undo.running') : t('bulkOperations.undo.action') })) : null] }), _jsx(CardContent, { children: _jsxs("dl", { className: "grid grid-cols-1 gap-x-8 gap-y-3 sm:grid-cols-2 lg:grid-cols-3", children: [_jsx(Field, { label: t('bulkOperations.detail.field.id'), children: _jsx("span", { className: "font-mono text-xs", children: op.id }) }), _jsx(Field, { label: t('bulkOperations.column.type'), children: typeLabel }), _jsxs(Field, { label: t('bulkOperations.column.progress'), children: [_jsxs("span", { className: "font-mono", children: [op.processed, "/", op.total] }), ' ', _jsxs("span", { className: "text-muted-foreground", children: ["(", pct, "%)"] })] }), _jsx(Field, { label: t('bulkOperations.column.succeeded'), children: op.succeeded }), _jsx(Field, { label: t('bulkOperations.column.skipped'), children: op.skipped }), _jsx(Field, { label: t('bulkOperations.column.failed'), children: op.failed }), _jsx(Field, { label: t('bulkOperations.detail.field.requestedBy'), children: _jsx("span", { className: "font-mono text-xs", children: op.requestedByAdminUserId }) }), _jsx(Field, { label: t('bulkOperations.column.created'), children: formatDateTime(op.createdAt) }), _jsx(Field, { label: t('bulkOperations.detail.field.started'), children: op.startedAt ? formatDateTime(op.startedAt) : '—' }), _jsx(Field, { label: t('bulkOperations.detail.field.finished'), children: op.finishedAt ? formatDateTime(op.finishedAt) : '—' }), _jsx(Field, { label: t('bulkOperations.detail.changedFields'), children: op.touchedFields.length > 0 ? op.touchedFields.join(', ') : '—' })] }) })] }), _jsxs(Card, { className: "mb-4", children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('bulkOperations.detail.logs') }) }), _jsx(CardContent, { children: op.logs && op.logs.length > 0 ? (_jsx("ul", { className: "space-y-1 font-mono text-xs", children: op.logs.map((entry, idx) => (_jsxs("li", { className: "flex flex-wrap gap-2", children: [_jsx("span", { className: "text-muted-foreground", children: formatDateTime(entry.ts) }), _jsx("span", { className: `uppercase ${LOG_LEVEL_CLASS[entry.level]}`, children: entry.level }), _jsx("span", { className: LOG_LEVEL_CLASS[entry.level], children: entry.message })] }, idx))) })) : (_jsx("p", { className: "text-sm text-muted-foreground", children: t('bulkOperations.detail.noLogs') })) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row flex-wrap items-center justify-between gap-3", children: [_jsx(CardTitle, { children: t('bulkOperations.detail.elements') }), _jsx("div", { className: "flex flex-wrap gap-1", children: ELEMENT_FILTERS.map((f) => (_jsx("button", { type: "button", className: `b2b-btn b2b-btn--sm ${elementFilter === f ? 'b2b-btn--primary' : 'b2b-btn--ghost'}`, onClick: () => setElementFilter(f), children: f === 'all' ? t('bulkOperations.filter.all') : t(`bulkOperations.outcome.${f}`) }, f))) })] }), _jsx(CardContent, { children: !op.results || op.results.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('bulkOperations.detail.noResults') })) : filteredResults.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('bulkOperations.detail.noElementsForFilter') })) : (_jsx("div", { className: "max-h-[32rem] overflow-auto rounded-md border", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: t('bulkOperations.detail.product') }), _jsx(TableHead, { children: t('bulkOperations.detail.outcome') }), _jsx(TableHead, { children: t('bulkOperations.detail.reason') }), _jsx(TableHead, { children: t('bulkOperations.detail.changedFields') })] }) }), _jsx(TableBody, { children: filteredResults.slice(0, 1000).map((r) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: (() => {
|
|
169
|
+
const info = productInfo[r.productId];
|
|
170
|
+
if (!info) {
|
|
171
|
+
return _jsx("span", { className: "font-mono text-xs", children: r.productId });
|
|
172
|
+
}
|
|
173
|
+
return (_jsxs(Link, { to: `/catalog/products/${r.productId}`, className: "flex flex-col", children: [_jsx("span", { className: "font-medium", children: info.name || r.productId }), _jsxs("span", { className: "text-xs text-muted-foreground", children: [t('productsList.column.sku'), ": ", info.sku] })] }));
|
|
174
|
+
})() }), _jsx(TableCell, { children: _jsx(Badge, { variant: OUTCOME_BADGE[r.status], children: t(`bulkOperations.outcome.${r.status}`) }) }), _jsx(TableCell, { className: "text-sm text-muted-foreground", children: r.reason ?? r.details?.message ?? '—' }), _jsx(TableCell, { className: "text-sm text-muted-foreground", children: r.changedFields && r.changedFields.length > 0
|
|
175
|
+
? r.changedFields.join(', ')
|
|
176
|
+
: '—' })] }, r.productId))) })] }) })) })] })] }));
|
|
177
|
+
}
|
|
178
|
+
function Field({ label, children }) {
|
|
179
|
+
return (_jsxs("div", { children: [_jsx("dt", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: label }), _jsx("dd", { className: "mt-0.5 text-sm", children: children })] }));
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The default export a route declaration's dynamic-import factory resolves
|
|
183
|
+
* (feature 091, R6). The named export stays: it is the spelling this module's
|
|
184
|
+
* own siblings and tests use.
|
|
185
|
+
*/
|
|
186
|
+
export default BulkOperationDetailPage;
|
|
187
|
+
//# sourceMappingURL=BulkOperationDetailPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BulkOperationDetailPage.js","sourceRoot":"","sources":["../../../src/admin/pages/BulkOperationDetailPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export declare function BulkOperationsPage(): ReactNode;
|
|
3
|
+
/**
|
|
4
|
+
* The default export a route declaration's dynamic-import factory resolves
|
|
5
|
+
* (feature 091, R6). The named export stays: it is the spelling this module's
|
|
6
|
+
* own siblings and tests use.
|
|
7
|
+
*/
|
|
8
|
+
export default BulkOperationsPage;
|
|
9
|
+
//# sourceMappingURL=BulkOperationsPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BulkOperationsPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/BulkOperationsPage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAyDjF,wBAAgB,kBAAkB,IAAI,SAAS,CAmI9C;AAED;;;;GAIG;AACH,eAAe,kBAAkB,CAAC"}
|