@open-mercato/core 0.7.1-develop.7152.1.a69e92f9c9 → 0.7.1-develop.7153.1.7145d295e6
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/dist/modules/api_keys/backend/api-keys/create/page.js +1 -0
- package/dist/modules/api_keys/backend/api-keys/create/page.js.map +2 -2
- package/dist/modules/api_keys/backend/api-keys/page.js +1 -0
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js +1 -0
- package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
- package/dist/modules/audit_logs/backend/audit-logs/page.js +53 -50
- package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
- package/dist/modules/audit_logs/components/AccessLogsTable.js +1 -0
- package/dist/modules/audit_logs/components/AccessLogsTable.js.map +2 -2
- package/dist/modules/audit_logs/components/AuditLogsActions.js +1 -0
- package/dist/modules/audit_logs/components/AuditLogsActions.js.map +2 -2
- package/dist/modules/auth/backend/roles/[id]/edit/page.js +1 -0
- package/dist/modules/auth/backend/roles/[id]/edit/page.js.map +2 -2
- package/dist/modules/auth/backend/roles/create/page.js +1 -0
- package/dist/modules/auth/backend/roles/create/page.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +1 -0
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/users/[id]/edit/page.js +1 -0
- package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
- package/dist/modules/auth/backend/users/create/page.js +1 -0
- package/dist/modules/auth/backend/users/create/page.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +1 -0
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/business_rules/backend/logs/page.js +1 -0
- package/dist/modules/business_rules/backend/logs/page.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/[id]/page.js +1 -0
- package/dist/modules/business_rules/backend/rules/[id]/page.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/create/page.js +1 -0
- package/dist/modules/business_rules/backend/rules/create/page.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/page.js +1 -0
- package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/[id]/page.js +1 -0
- package/dist/modules/business_rules/backend/sets/[id]/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/create/page.js +1 -0
- package/dist/modules/business_rules/backend/sets/create/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/page.js +1 -0
- package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/categories/[id]/edit/page.js +1 -0
- package/dist/modules/catalog/backend/catalog/categories/[id]/edit/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/categories/create/page.js +1 -0
- package/dist/modules/catalog/backend/catalog/categories/create/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js +1 -0
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js +1 -0
- package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[productId]/variants/create/page.js +1 -0
- package/dist/modules/catalog/backend/catalog/products/[productId]/variants/create/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/create/page.js +1 -0
- package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js +1 -0
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +1 -0
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +1 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.js +2 -1
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/[id]/page.js +1 -0
- package/dist/modules/currencies/backend/currencies/[id]/page.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/create/page.js +1 -0
- package/dist/modules/currencies/backend/currencies/create/page.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/page.js +1 -0
- package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/[id]/page.js +1 -0
- package/dist/modules/currencies/backend/exchange-rates/[id]/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/create/page.js +1 -0
- package/dist/modules/currencies/backend/exchange-rates/create/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js +1 -0
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js +1 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/create/page.js +1 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/create/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +1 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +1 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/create/page.js +1 -0
- package/dist/modules/customers/backend/customers/companies/create/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +1 -0
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +1 -0
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/create/page.js +1 -0
- package/dist/modules/customers/backend/customers/people/create/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js +1 -0
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/components/CustomerTodosTable.js +1 -0
- package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +1 -0
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +1 -0
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/[id]/page.js +1 -0
- package/dist/modules/devices/backend/devices/[id]/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/create/page.js +1 -0
- package/dist/modules/devices/backend/devices/create/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/page.js +1 -0
- package/dist/modules/devices/backend/devices/page.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryTable.js +1 -0
- package/dist/modules/dictionaries/components/DictionaryTable.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/[id]/edit/page.js +1 -0
- package/dist/modules/directory/backend/directory/organizations/[id]/edit/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/create/page.js +1 -0
- package/dist/modules/directory/backend/directory/organizations/create/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js +1 -0
- package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/[id]/edit/page.js +1 -0
- package/dist/modules/directory/backend/directory/tenants/[id]/edit/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/create/page.js +1 -0
- package/dist/modules/directory/backend/directory/tenants/create/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js +1 -0
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/page.js +1 -0
- package/dist/modules/entities/backend/entities/user/[entityId]/page.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/[recordId]/page.js +1 -0
- package/dist/modules/entities/backend/entities/user/[entityId]/records/[recordId]/page.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/create/page.js +1 -0
- package/dist/modules/entities/backend/entities/user/[entityId]/records/create/page.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +1 -0
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/create/page.js +1 -0
- package/dist/modules/entities/backend/entities/user/create/page.js.map +2 -2
- package/dist/modules/entities/components/SystemEntitiesTable.js +1 -0
- package/dist/modules/entities/components/SystemEntitiesTable.js.map +2 -2
- package/dist/modules/entities/components/UserEntitiesTable.js +1 -0
- package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.js +1 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.js +1 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +1 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.js +1 -0
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/create/page.js +1 -0
- package/dist/modules/eudr/backend/eudr/plots/create/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/page.js +1 -0
- package/dist/modules/eudr/backend/eudr/plots/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.js +1 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/create/page.js +1 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/create/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js +1 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.js +1 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.js +1 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +1 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.js +2 -0
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/create/page.js +1 -0
- package/dist/modules/eudr/backend/eudr/statements/create/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.js +1 -0
- package/dist/modules/eudr/backend/eudr/statements/page.js.map +2 -2
- package/dist/modules/eudr/components/MappingSuggestionsDialog.js +1 -0
- package/dist/modules/eudr/components/MappingSuggestionsDialog.js.map +2 -2
- package/dist/modules/eudr/components/MitigationActionsSection.js +1 -0
- package/dist/modules/eudr/components/MitigationActionsSection.js.map +2 -2
- package/dist/modules/eudr/components/StatementRiskSection.js +1 -0
- package/dist/modules/eudr/components/StatementRiskSection.js.map +2 -2
- package/dist/modules/feature_toggles/backend/feature-toggles/global/[id]/edit/page.js +1 -0
- package/dist/modules/feature_toggles/backend/feature-toggles/global/[id]/edit/page.js.map +2 -2
- package/dist/modules/feature_toggles/backend/feature-toggles/global/create/page.js +1 -0
- package/dist/modules/feature_toggles/backend/feature-toggles/global/create/page.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +1 -0
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/OverridesTable.js +1 -0
- package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js +1 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +1 -0
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/messages/components/MessagesInboxPageClient.js +1 -0
- package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/MainMessageHeader.js +1 -1
- package/dist/modules/messages/components/message-detail/panels/MainMessageHeader.js.map +2 -2
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js +1 -0
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +1 -0
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/planner/components/AvailabilityRuleSetForm.js +1 -0
- package/dist/modules/planner/components/AvailabilityRuleSetForm.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/page.js +1 -0
- package/dist/modules/push_notifications/backend/push_notifications/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js +1 -0
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js.map +2 -2
- package/dist/modules/query_index/components/QueryIndexesTable.js +1 -0
- package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +1 -0
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/create/page.js +1 -0
- package/dist/modules/resources/backend/resources/resources/create/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +1 -0
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/resources/components/ResourceCrudForm.js +2 -0
- package/dist/modules/resources/components/ResourceCrudForm.js.map +2 -2
- package/dist/modules/resources/components/ResourceTypeCrudForm.js +1 -0
- package/dist/modules/resources/components/ResourceTypeCrudForm.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/[channelId]/edit/page.js +1 -0
- package/dist/modules/sales/backend/sales/channels/[channelId]/edit/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/create/page.js +1 -0
- package/dist/modules/sales/backend/sales/channels/create/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +2 -1
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/components/channels/ChannelOfferForm.js +1 -0
- package/dist/modules/sales/components/channels/ChannelOfferForm.js.map +2 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +1 -1
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentForm.js +1 -0
- package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +2 -1
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/shipping_carriers/backend/shipping-carriers/create/page.js +2 -1
- package/dist/modules/shipping_carriers/backend/shipping-carriers/create/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/page.js +1 -0
- package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js +1 -0
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/profile/create/page.js +1 -0
- package/dist/modules/staff/backend/staff/profile/create/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/create/page.js +1 -0
- package/dist/modules/staff/backend/staff/team-members/create/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/page.js +1 -0
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +1 -0
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +1 -0
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +1 -0
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.js +1 -0
- package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/create/page.js +1 -0
- package/dist/modules/staff/backend/staff/timesheets/projects/create/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js +1 -0
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
- package/dist/modules/staff/components/LeaveRequestForm.js +1 -0
- package/dist/modules/staff/components/LeaveRequestForm.js.map +2 -2
- package/dist/modules/staff/components/TeamForm.js +1 -0
- package/dist/modules/staff/components/TeamForm.js.map +2 -2
- package/dist/modules/staff/components/TeamMemberForm.js +2 -0
- package/dist/modules/staff/components/TeamMemberForm.js.map +2 -2
- package/dist/modules/staff/components/TeamRoleForm.js +1 -0
- package/dist/modules/staff/components/TeamRoleForm.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.js +1 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/create/page.js +1 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/create/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.js +1 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.js +1 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.js +1 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.js +1 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.js +1 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.js +1 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js +4 -0
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +1 -0
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +1 -0
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js +1 -0
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotsListPage.js +1 -0
- package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js +1 -0
- package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +1 -0
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/[id]/page.js +1 -0
- package/dist/modules/workflows/backend/definitions/[id]/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/create/page.js +1 -0
- package/dist/modules/workflows/backend/definitions/create/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/page.js +1 -0
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/events/page.js +1 -0
- package/dist/modules/workflows/backend/events/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +1 -0
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +1 -0
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/package.json +7 -7
- package/src/modules/api_keys/backend/api-keys/create/page.tsx +1 -0
- package/src/modules/api_keys/backend/api-keys/page.tsx +2 -1
- package/src/modules/attachments/components/AttachmentLibrary.tsx +1 -0
- package/src/modules/audit_logs/backend/audit-logs/page.tsx +2 -1
- package/src/modules/audit_logs/components/AccessLogsTable.tsx +1 -0
- package/src/modules/audit_logs/components/AuditLogsActions.tsx +1 -0
- package/src/modules/auth/backend/roles/[id]/edit/page.tsx +1 -0
- package/src/modules/auth/backend/roles/create/page.tsx +1 -0
- package/src/modules/auth/backend/roles/page.tsx +2 -1
- package/src/modules/auth/backend/users/[id]/edit/page.tsx +1 -0
- package/src/modules/auth/backend/users/create/page.tsx +1 -0
- package/src/modules/auth/backend/users/page.tsx +2 -1
- package/src/modules/business_rules/backend/logs/page.tsx +2 -1
- package/src/modules/business_rules/backend/rules/[id]/page.tsx +1 -0
- package/src/modules/business_rules/backend/rules/create/page.tsx +1 -0
- package/src/modules/business_rules/backend/rules/page.tsx +2 -1
- package/src/modules/business_rules/backend/sets/[id]/page.tsx +1 -0
- package/src/modules/business_rules/backend/sets/create/page.tsx +1 -0
- package/src/modules/business_rules/backend/sets/page.tsx +2 -1
- package/src/modules/catalog/backend/catalog/categories/[id]/edit/page.tsx +1 -0
- package/src/modules/catalog/backend/catalog/categories/create/page.tsx +1 -0
- package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +1 -0
- package/src/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.tsx +1 -0
- package/src/modules/catalog/backend/catalog/products/[productId]/variants/create/page.tsx +1 -0
- package/src/modules/catalog/backend/catalog/products/create/page.tsx +1 -0
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +2 -1
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +2 -1
- package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +1 -0
- package/src/modules/communication_channels/backend/profile/communication-channels/page.tsx +3 -2
- package/src/modules/currencies/backend/currencies/[id]/page.tsx +1 -0
- package/src/modules/currencies/backend/currencies/create/page.tsx +1 -0
- package/src/modules/currencies/backend/currencies/page.tsx +2 -1
- package/src/modules/currencies/backend/exchange-rates/[id]/page.tsx +1 -0
- package/src/modules/currencies/backend/exchange-rates/create/page.tsx +1 -0
- package/src/modules/currencies/backend/exchange-rates/page.tsx +2 -1
- package/src/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.tsx +1 -0
- package/src/modules/customer_accounts/backend/customer_accounts/roles/create/page.tsx +1 -0
- package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +2 -1
- package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +1 -0
- package/src/modules/customers/backend/customers/companies/create/page.tsx +1 -0
- package/src/modules/customers/backend/customers/companies/page.tsx +1 -0
- package/src/modules/customers/backend/customers/deals/page.tsx +1 -0
- package/src/modules/customers/backend/customers/people/create/page.tsx +1 -0
- package/src/modules/customers/backend/customers/people/page.tsx +1 -0
- package/src/modules/customers/components/CustomerTodosTable.tsx +1 -0
- package/src/modules/customers/components/detail/DealForm.tsx +1 -0
- package/src/modules/data_sync/backend/data-sync/page.tsx +1 -0
- package/src/modules/devices/backend/devices/[id]/page.tsx +1 -0
- package/src/modules/devices/backend/devices/create/page.tsx +1 -0
- package/src/modules/devices/backend/devices/page.tsx +2 -1
- package/src/modules/dictionaries/components/DictionaryTable.tsx +1 -0
- package/src/modules/directory/backend/directory/organizations/[id]/edit/page.tsx +1 -0
- package/src/modules/directory/backend/directory/organizations/create/page.tsx +1 -0
- package/src/modules/directory/backend/directory/organizations/page.tsx +2 -1
- package/src/modules/directory/backend/directory/tenants/[id]/edit/page.tsx +1 -0
- package/src/modules/directory/backend/directory/tenants/create/page.tsx +1 -0
- package/src/modules/directory/backend/directory/tenants/page.tsx +2 -1
- package/src/modules/entities/backend/entities/user/[entityId]/page.tsx +1 -0
- package/src/modules/entities/backend/entities/user/[entityId]/records/[recordId]/page.tsx +1 -0
- package/src/modules/entities/backend/entities/user/[entityId]/records/create/page.tsx +1 -0
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +2 -1
- package/src/modules/entities/backend/entities/user/create/page.tsx +1 -0
- package/src/modules/entities/components/SystemEntitiesTable.tsx +1 -0
- package/src/modules/entities/components/UserEntitiesTable.tsx +1 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.tsx +1 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.tsx +1 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +2 -1
- package/src/modules/eudr/backend/eudr/plots/[id]/page.tsx +1 -0
- package/src/modules/eudr/backend/eudr/plots/create/page.tsx +1 -0
- package/src/modules/eudr/backend/eudr/plots/page.tsx +2 -1
- package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.tsx +1 -0
- package/src/modules/eudr/backend/eudr/product-mappings/create/page.tsx +1 -0
- package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +2 -1
- package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.tsx +1 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/create/page.tsx +1 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +2 -1
- package/src/modules/eudr/backend/eudr/statements/[id]/page.tsx +2 -0
- package/src/modules/eudr/backend/eudr/statements/create/page.tsx +1 -0
- package/src/modules/eudr/backend/eudr/statements/page.tsx +2 -1
- package/src/modules/eudr/components/MappingSuggestionsDialog.tsx +1 -0
- package/src/modules/eudr/components/MitigationActionsSection.tsx +1 -0
- package/src/modules/eudr/components/StatementRiskSection.tsx +1 -0
- package/src/modules/feature_toggles/backend/feature-toggles/global/[id]/edit/page.tsx +1 -0
- package/src/modules/feature_toggles/backend/feature-toggles/global/create/page.tsx +1 -0
- package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +2 -1
- package/src/modules/feature_toggles/components/OverridesTable.tsx +2 -1
- package/src/modules/inbox_ops/backend/inbox-ops/page.tsx +2 -1
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +2 -1
- package/src/modules/messages/components/MessagesInboxPageClient.tsx +1 -0
- package/src/modules/messages/components/message-detail/panels/MainMessageHeader.tsx +2 -2
- package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +1 -0
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +2 -1
- package/src/modules/planner/components/AvailabilityRuleSetForm.tsx +1 -0
- package/src/modules/push_notifications/backend/push_notifications/page.tsx +2 -1
- package/src/modules/push_notifications/backend/push_notifications/send/page.tsx +1 -0
- package/src/modules/query_index/components/QueryIndexesTable.tsx +2 -1
- package/src/modules/resources/backend/resources/resource-types/page.tsx +1 -0
- package/src/modules/resources/backend/resources/resources/create/page.tsx +1 -0
- package/src/modules/resources/backend/resources/resources/page.tsx +1 -0
- package/src/modules/resources/components/ResourceCrudForm.tsx +3 -0
- package/src/modules/resources/components/ResourceTypeCrudForm.tsx +1 -0
- package/src/modules/sales/backend/sales/channels/[channelId]/edit/page.tsx +1 -0
- package/src/modules/sales/backend/sales/channels/create/page.tsx +1 -0
- package/src/modules/sales/backend/sales/channels/offers/page.tsx +3 -3
- package/src/modules/sales/backend/sales/channels/page.tsx +3 -2
- package/src/modules/sales/components/channels/ChannelOfferForm.tsx +1 -0
- package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +2 -2
- package/src/modules/sales/components/documents/SalesDocumentForm.tsx +1 -0
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +3 -2
- package/src/modules/shipping_carriers/backend/shipping-carriers/create/page.tsx +2 -1
- package/src/modules/staff/backend/staff/leave-requests/page.tsx +2 -1
- package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +2 -1
- package/src/modules/staff/backend/staff/profile/create/page.tsx +1 -0
- package/src/modules/staff/backend/staff/team-members/create/page.tsx +1 -0
- package/src/modules/staff/backend/staff/team-members/page.tsx +2 -2
- package/src/modules/staff/backend/staff/team-roles/page.tsx +2 -2
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +1 -0
- package/src/modules/staff/backend/staff/teams/page.tsx +2 -1
- package/src/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.tsx +1 -0
- package/src/modules/staff/backend/staff/timesheets/projects/create/page.tsx +1 -0
- package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +2 -1
- package/src/modules/staff/components/LeaveRequestForm.tsx +1 -0
- package/src/modules/staff/components/TeamForm.tsx +1 -0
- package/src/modules/staff/components/TeamMemberForm.tsx +3 -0
- package/src/modules/staff/components/TeamRoleForm.tsx +1 -0
- package/src/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.tsx +1 -0
- package/src/modules/warranty_claims/backend/warranty_claims/create/page.tsx +1 -0
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.tsx +1 -0
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/create/page.tsx +1 -0
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.tsx +1 -0
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.tsx +1 -0
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.tsx +1 -0
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.tsx +1 -0
- package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +4 -0
- package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +1 -0
- package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +1 -0
- package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +1 -0
- package/src/modules/wms/components/backend/WmsLotsListPage.tsx +1 -0
- package/src/modules/wms/components/backend/WmsOperationalDashboardPage.tsx +1 -0
- package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +1 -0
- package/src/modules/workflows/backend/definitions/[id]/page.tsx +1 -0
- package/src/modules/workflows/backend/definitions/create/page.tsx +1 -0
- package/src/modules/workflows/backend/definitions/page.tsx +2 -1
- package/src/modules/workflows/backend/events/page.tsx +2 -1
- package/src/modules/workflows/backend/instances/page.tsx +2 -1
- package/src/modules/workflows/backend/tasks/page.tsx +2 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/business_rules/backend/logs/page.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useQuery } from '@tanstack/react-query'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\n\ntype RuleExecutionLog = {\n id: string\n ruleId: string\n rule?: {\n id: string\n ruleId: string\n ruleName: string\n ruleType: string\n } | null\n entityType: string\n entityId: string | null\n eventType: string | null\n executedAt: string\n executionTimeMs: number\n executionResult: 'SUCCESS' | 'FAILURE' | 'ERROR'\n resultValue: any | null\n errorMessage: string | null\n inputContext: any | null\n outputContext: any | null\n executedBy: string | null\n tenantId: string | null\n organizationId: string | null\n}\n\ntype LogsResponse = {\n items: RuleExecutionLog[]\n total: number\n totalPages: number\n totalIsCapped?: boolean\n}\n\nexport default function ExecutionLogsPage() {\n const [page, setPage] = React.useState(1)\n const [pageSize] = React.useState(50)\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const [totalIsCapped, setTotalIsCapped] = React.useState(false)\n const t = useT()\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n\n const { data, isLoading, error } = useQuery({\n queryKey: ['business-rules', 'logs', filterValues, page],\n queryFn: async () => {\n const params = new URLSearchParams()\n params.set('page', page.toString())\n params.set('pageSize', pageSize.toString())\n params.set('sortField', 'executedAt')\n params.set('sortDir', 'desc')\n\n if (filterValues.ruleId) params.set('ruleId', filterValues.ruleId as string)\n if (filterValues.entityType) params.set('entityType', filterValues.entityType as string)\n if (filterValues.executionResult) params.set('executionResult', filterValues.executionResult as string)\n if (filterValues.executedBy) params.set('executedBy', filterValues.executedBy as string)\n if (filterValues.executedAtFrom) params.set('executedAtFrom', filterValues.executedAtFrom as string)\n if (filterValues.executedAtTo) params.set('executedAtTo', filterValues.executedAtTo as string)\n\n const result = await apiCall<LogsResponse>(\n `/api/business_rules/logs?${params.toString()}`\n )\n\n if (!result.ok) {\n throw new Error('Failed to fetch execution logs')\n }\n\n const response = result.result\n if (response) {\n setTotal(response.total || 0)\n setTotalPages(response.totalPages || 1)\n setTotalIsCapped(response?.totalIsCapped === true)\n }\n\n return response?.items || []\n },\n })\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n const next: FilterValues = {}\n Object.entries(values).forEach(([key, value]) => {\n if (value !== undefined) next[key] = value\n })\n setFilterValues(next)\n setPage(1)\n }, [])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n setPage(1)\n }, [])\n\n const filters: FilterDef[] = [\n {\n id: 'entityType',\n type: 'text',\n label: t('business_rules.logs.filters.entityType'),\n placeholder: t('business_rules.logs.filters.entityTypePlaceholder'),\n },\n {\n id: 'executionResult',\n type: 'select',\n label: t('business_rules.logs.filters.result'),\n options: [\n { value: '', label: t('common.all') },\n { value: 'SUCCESS', label: t('business_rules.logs.result.success') },\n { value: 'FAILURE', label: t('business_rules.logs.result.failure') },\n { value: 'ERROR', label: t('business_rules.logs.result.error') },\n ],\n },\n {\n id: 'executedBy',\n type: 'text',\n label: t('business_rules.logs.filters.executedBy'),\n placeholder: t('business_rules.logs.filters.executedByPlaceholder'),\n },\n {\n id: 'executedAtFrom',\n type: 'dateRange',\n label: t('business_rules.logs.filters.dateFrom'),\n },\n {\n id: 'executedAtTo',\n type: 'dateRange',\n label: t('business_rules.logs.filters.dateTo'),\n },\n ]\n\n const getResultBadgeClass = (result: string) => {\n switch (result) {\n case 'SUCCESS':\n return 'bg-green-100 text-green-800'\n case 'FAILURE':\n return 'bg-yellow-100 text-yellow-800'\n case 'ERROR':\n return 'bg-red-100 text-red-800'\n default:\n return 'bg-muted text-foreground'\n }\n }\n\n const columns: ColumnDef<RuleExecutionLog>[] = [\n {\n id: 'executedAt',\n header: t('business_rules.logs.fields.executedAt'),\n accessorKey: 'executedAt',\n cell: ({ row }) => (\n <div className=\"text-sm\">\n {new Date(row.original.executedAt).toLocaleString()}\n </div>\n ),\n },\n {\n id: 'rule',\n header: t('business_rules.logs.fields.rule'),\n cell: ({ row }) => (\n <div>\n {row.original.rule ? (\n <Link\n href={`/backend/rules/${row.original.rule.id}`}\n className=\"text-blue-600 hover:text-blue-800 hover:underline font-medium\"\n >\n {row.original.rule.ruleName}\n </Link>\n ) : (\n <span className=\"text-muted-foreground text-sm\">\n {t('business_rules.logs.ruleDeleted')}\n </span>\n )}\n {row.original.rule && (\n <div className=\"text-xs text-muted-foreground mt-0.5\">\n {row.original.rule.ruleType}\n </div>\n )}\n </div>\n ),\n },\n {\n id: 'entity',\n header: t('business_rules.logs.fields.entity'),\n cell: ({ row }) => (\n <div className=\"text-sm\">\n <div className=\"font-medium\">{row.original.entityType}</div>\n {row.original.entityId && (\n <div className=\"text-xs text-muted-foreground truncate max-w-[200px]\" title={row.original.entityId}>\n {row.original.entityId}\n </div>\n )}\n </div>\n ),\n },\n {\n id: 'result',\n header: t('business_rules.logs.fields.result'),\n accessorKey: 'executionResult',\n cell: ({ row }) => (\n <span\n className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium ${getResultBadgeClass(\n row.original.executionResult\n )}`}\n >\n {t(`business_rules.logs.result.${row.original.executionResult.toLowerCase()}`)}\n </span>\n ),\n },\n {\n id: 'executionTime',\n header: t('business_rules.logs.fields.executionTime'),\n accessorKey: 'executionTimeMs',\n cell: ({ row }) => (\n <div className=\"text-sm text-muted-foreground\">\n {row.original.executionTimeMs}ms\n </div>\n ),\n },\n {\n id: 'actions',\n header: '',\n cell: ({ row }) => (\n <Link\n href={`/backend/logs/${row.original.id}`}\n className=\"text-sm text-blue-600 hover:text-blue-800 hover:underline\"\n >\n {t('common.details')}\n </Link>\n ),\n },\n ]\n\n return (\n <Page>\n <PageBody>\n <DataTable\n
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useQuery } from '@tanstack/react-query'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\n\ntype RuleExecutionLog = {\n id: string\n ruleId: string\n rule?: {\n id: string\n ruleId: string\n ruleName: string\n ruleType: string\n } | null\n entityType: string\n entityId: string | null\n eventType: string | null\n executedAt: string\n executionTimeMs: number\n executionResult: 'SUCCESS' | 'FAILURE' | 'ERROR'\n resultValue: any | null\n errorMessage: string | null\n inputContext: any | null\n outputContext: any | null\n executedBy: string | null\n tenantId: string | null\n organizationId: string | null\n}\n\ntype LogsResponse = {\n items: RuleExecutionLog[]\n total: number\n totalPages: number\n totalIsCapped?: boolean\n}\n\nexport default function ExecutionLogsPage() {\n const [page, setPage] = React.useState(1)\n const [pageSize] = React.useState(50)\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const [totalIsCapped, setTotalIsCapped] = React.useState(false)\n const t = useT()\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n\n const { data, isLoading, error } = useQuery({\n queryKey: ['business-rules', 'logs', filterValues, page],\n queryFn: async () => {\n const params = new URLSearchParams()\n params.set('page', page.toString())\n params.set('pageSize', pageSize.toString())\n params.set('sortField', 'executedAt')\n params.set('sortDir', 'desc')\n\n if (filterValues.ruleId) params.set('ruleId', filterValues.ruleId as string)\n if (filterValues.entityType) params.set('entityType', filterValues.entityType as string)\n if (filterValues.executionResult) params.set('executionResult', filterValues.executionResult as string)\n if (filterValues.executedBy) params.set('executedBy', filterValues.executedBy as string)\n if (filterValues.executedAtFrom) params.set('executedAtFrom', filterValues.executedAtFrom as string)\n if (filterValues.executedAtTo) params.set('executedAtTo', filterValues.executedAtTo as string)\n\n const result = await apiCall<LogsResponse>(\n `/api/business_rules/logs?${params.toString()}`\n )\n\n if (!result.ok) {\n throw new Error('Failed to fetch execution logs')\n }\n\n const response = result.result\n if (response) {\n setTotal(response.total || 0)\n setTotalPages(response.totalPages || 1)\n setTotalIsCapped(response?.totalIsCapped === true)\n }\n\n return response?.items || []\n },\n })\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n const next: FilterValues = {}\n Object.entries(values).forEach(([key, value]) => {\n if (value !== undefined) next[key] = value\n })\n setFilterValues(next)\n setPage(1)\n }, [])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n setPage(1)\n }, [])\n\n const filters: FilterDef[] = [\n {\n id: 'entityType',\n type: 'text',\n label: t('business_rules.logs.filters.entityType'),\n placeholder: t('business_rules.logs.filters.entityTypePlaceholder'),\n },\n {\n id: 'executionResult',\n type: 'select',\n label: t('business_rules.logs.filters.result'),\n options: [\n { value: '', label: t('common.all') },\n { value: 'SUCCESS', label: t('business_rules.logs.result.success') },\n { value: 'FAILURE', label: t('business_rules.logs.result.failure') },\n { value: 'ERROR', label: t('business_rules.logs.result.error') },\n ],\n },\n {\n id: 'executedBy',\n type: 'text',\n label: t('business_rules.logs.filters.executedBy'),\n placeholder: t('business_rules.logs.filters.executedByPlaceholder'),\n },\n {\n id: 'executedAtFrom',\n type: 'dateRange',\n label: t('business_rules.logs.filters.dateFrom'),\n },\n {\n id: 'executedAtTo',\n type: 'dateRange',\n label: t('business_rules.logs.filters.dateTo'),\n },\n ]\n\n const getResultBadgeClass = (result: string) => {\n switch (result) {\n case 'SUCCESS':\n return 'bg-green-100 text-green-800'\n case 'FAILURE':\n return 'bg-yellow-100 text-yellow-800'\n case 'ERROR':\n return 'bg-red-100 text-red-800'\n default:\n return 'bg-muted text-foreground'\n }\n }\n\n const columns: ColumnDef<RuleExecutionLog>[] = [\n {\n id: 'executedAt',\n header: t('business_rules.logs.fields.executedAt'),\n accessorKey: 'executedAt',\n cell: ({ row }) => (\n <div className=\"text-sm\">\n {new Date(row.original.executedAt).toLocaleString()}\n </div>\n ),\n },\n {\n id: 'rule',\n header: t('business_rules.logs.fields.rule'),\n cell: ({ row }) => (\n <div>\n {row.original.rule ? (\n <Link\n href={`/backend/rules/${row.original.rule.id}`}\n className=\"text-blue-600 hover:text-blue-800 hover:underline font-medium\"\n >\n {row.original.rule.ruleName}\n </Link>\n ) : (\n <span className=\"text-muted-foreground text-sm\">\n {t('business_rules.logs.ruleDeleted')}\n </span>\n )}\n {row.original.rule && (\n <div className=\"text-xs text-muted-foreground mt-0.5\">\n {row.original.rule.ruleType}\n </div>\n )}\n </div>\n ),\n },\n {\n id: 'entity',\n header: t('business_rules.logs.fields.entity'),\n cell: ({ row }) => (\n <div className=\"text-sm\">\n <div className=\"font-medium\">{row.original.entityType}</div>\n {row.original.entityId && (\n <div className=\"text-xs text-muted-foreground truncate max-w-[200px]\" title={row.original.entityId}>\n {row.original.entityId}\n </div>\n )}\n </div>\n ),\n },\n {\n id: 'result',\n header: t('business_rules.logs.fields.result'),\n accessorKey: 'executionResult',\n cell: ({ row }) => (\n <span\n className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium ${getResultBadgeClass(\n row.original.executionResult\n )}`}\n >\n {t(`business_rules.logs.result.${row.original.executionResult.toLowerCase()}`)}\n </span>\n ),\n },\n {\n id: 'executionTime',\n header: t('business_rules.logs.fields.executionTime'),\n accessorKey: 'executionTimeMs',\n cell: ({ row }) => (\n <div className=\"text-sm text-muted-foreground\">\n {row.original.executionTimeMs}ms\n </div>\n ),\n },\n {\n id: 'actions',\n header: '',\n cell: ({ row }) => (\n <Link\n href={`/backend/logs/${row.original.id}`}\n className=\"text-sm text-blue-600 hover:text-blue-800 hover:underline\"\n >\n {t('common.details')}\n </Link>\n ),\n },\n ]\n\n return (\n <Page>\n <PageBody>\n <DataTable\n title={t('business_rules.logs.list.title')}\n titleHeadingLevel={1}\n columns={columns}\n data={data || []}\n filters={filters}\n filterValues={filterValues}\n onFiltersApply={handleFiltersApply}\n onFiltersClear={handleFiltersClear}\n isLoading={isLoading}\n error={error ? t('business_rules.logs.messages.loadFailed') : undefined}\n pagination={{ page, pageSize, total, totalPages, totalIsCapped, onPageChange: setPage }}\n />\n </PageBody>\n </Page>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/modules/business_rules/backend/rules/%5Bid%5D/page.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter, usePathname } from 'next/navigation'\nimport { useQuery } from '@tanstack/react-query'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { CrudForm } from '@open-mercato/ui/backend/CrudForm'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { apiFetch, withScopedApiHeaders } from '@open-mercato/ui/backend/utils/api'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { buildRecordInjectionContext, useSetCurrentRecordInjectionContext } from '@open-mercato/ui/backend/injection/recordContext'\nimport { readJsonSafe } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport {\n businessRuleFormSchema,\n createFormGroups,\n createFieldDefinitions,\n type BusinessRuleFormValues,\n} from '../../../components/formConfig'\nimport { ConditionBuilder } from '../../../components/ConditionBuilder'\nimport { ActionBuilder } from '../../../components/ActionBuilder'\nimport { buildRulePayload, parseRuleToFormValues } from '../../../components/utils/formHelpers'\n\nexport default function EditBusinessRulePage({ params }: { params?: { id?: string } }) {\n const router = useRouter()\n const pathname = usePathname()\n const ruleId = params?.id\n\n const t = useT()\n const { organizationId, tenantId } = useOrganizationScopeDetail()\n\n const { data: rule, isLoading, error } = useQuery({\n queryKey: ['business_rule', ruleId],\n queryFn: async () => {\n const response = await apiFetch(`/api/business_rules/rules/${ruleId}`)\n if (!response.ok) {\n throw new Error(t('business_rules.errors.fetchFailed'))\n }\n const result = await response.json()\n return result\n },\n enabled: !!ruleId,\n })\n\n const initialValues = React.useMemo(() => {\n if (rule) {\n return parseRuleToFormValues(rule)\n }\n return null\n }, [rule])\n\n const handleSubmit = async (values: BusinessRuleFormValues) => {\n // Use tenant/org from the loaded rule if available, otherwise from context\n const effectiveTenantId = rule?.tenantId || tenantId\n const effectiveOrgId = rule?.organizationId || organizationId\n\n if (!effectiveTenantId || !effectiveOrgId) {\n throw new Error(t('business_rules.errors.missingTenantOrOrg'))\n }\n\n const payload = buildRulePayload(values, effectiveTenantId, effectiveOrgId, undefined)\n\n const updateRule = () => apiFetch('/api/business_rules/rules', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n ...payload,\n id: ruleId,\n }),\n })\n const headers = buildOptimisticLockHeader(rule?.updatedAt ?? rule?.updated_at ?? null)\n const response = Object.keys(headers).length\n ? await withScopedApiHeaders(headers, updateRule)\n : await updateRule()\n\n if (!response.ok) {\n const body = (await readJsonSafe<Record<string, unknown>>(response)) ?? {}\n const message =\n (typeof body.error === 'string' && body.error) ||\n (typeof body.message === 'string' && body.message) ||\n t('business_rules.errors.updateFailed')\n throw new CrudHttpError(response.status, { ...body, error: message })\n }\n\n router.push('/backend/rules')\n router.refresh()\n }\n\n const fields = React.useMemo(() => createFieldDefinitions(t), [t])\n\n const formGroups = React.useMemo(\n () => createFormGroups(t, ConditionBuilder, ActionBuilder),\n [t]\n )\n\n // Publish page-load record context to the AppShell-owned `backend:record:current`\n // mount so the enterprise record_locks widget resolves `business_rules.rule` + id\n // explicitly. The resourceKind mirrors the route's `enforceCommandOptimisticLock`\n // call so the held lock matches the save-time conflict surface for the same rule.\n useSetCurrentRecordInjectionContext(\n buildRecordInjectionContext({\n resourceKind: 'business_rules.rule',\n resourceId: ruleId ?? null,\n updatedAt: rule?.updatedAt ?? rule?.updated_at ?? null,\n data: (rule ?? null) as Record<string, unknown> | null,\n path: pathname,\n }),\n )\n\n if (isLoading) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] flex-col items-center justify-center gap-2 text-muted-foreground\">\n <Spinner className=\"h-6 w-6\" />\n <span>{t('business_rules.rules.edit.loading')}</span>\n </div>\n </PageBody>\n </Page>\n )\n }\n\n if (error || !rule) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] flex-col items-center justify-center gap-2 text-muted-foreground\">\n <p>{t('business_rules.errors.loadFailed')}</p>\n <Button asChild variant=\"outline\">\n <Link href=\"/backend/rules\">{t('business_rules.rules.backToList')}</Link>\n </Button>\n </div>\n </PageBody>\n </Page>\n )\n }\n\n if (!initialValues) {\n return null\n }\n\n return (\n <Page>\n <PageBody>\n <CrudForm\n key={ruleId}\n title={t('business_rules.rules.edit.title')}\n backHref=\"/backend/rules\"\n schema={businessRuleFormSchema}\n fields={fields}\n initialValues={initialValues}\n optimisticLockUpdatedAt={rule?.updatedAt ?? rule?.updated_at ?? null}\n onSubmit={handleSubmit}\n cancelHref=\"/backend/rules\"\n groups={formGroups}\n submitLabel={t('business_rules.rules.form.update')}\n />\n </PageBody>\n </Page>\n )\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter, usePathname } from 'next/navigation'\nimport { useQuery } from '@tanstack/react-query'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { CrudForm } from '@open-mercato/ui/backend/CrudForm'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { apiFetch, withScopedApiHeaders } from '@open-mercato/ui/backend/utils/api'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { buildRecordInjectionContext, useSetCurrentRecordInjectionContext } from '@open-mercato/ui/backend/injection/recordContext'\nimport { readJsonSafe } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport {\n businessRuleFormSchema,\n createFormGroups,\n createFieldDefinitions,\n type BusinessRuleFormValues,\n} from '../../../components/formConfig'\nimport { ConditionBuilder } from '../../../components/ConditionBuilder'\nimport { ActionBuilder } from '../../../components/ActionBuilder'\nimport { buildRulePayload, parseRuleToFormValues } from '../../../components/utils/formHelpers'\n\nexport default function EditBusinessRulePage({ params }: { params?: { id?: string } }) {\n const router = useRouter()\n const pathname = usePathname()\n const ruleId = params?.id\n\n const t = useT()\n const { organizationId, tenantId } = useOrganizationScopeDetail()\n\n const { data: rule, isLoading, error } = useQuery({\n queryKey: ['business_rule', ruleId],\n queryFn: async () => {\n const response = await apiFetch(`/api/business_rules/rules/${ruleId}`)\n if (!response.ok) {\n throw new Error(t('business_rules.errors.fetchFailed'))\n }\n const result = await response.json()\n return result\n },\n enabled: !!ruleId,\n })\n\n const initialValues = React.useMemo(() => {\n if (rule) {\n return parseRuleToFormValues(rule)\n }\n return null\n }, [rule])\n\n const handleSubmit = async (values: BusinessRuleFormValues) => {\n // Use tenant/org from the loaded rule if available, otherwise from context\n const effectiveTenantId = rule?.tenantId || tenantId\n const effectiveOrgId = rule?.organizationId || organizationId\n\n if (!effectiveTenantId || !effectiveOrgId) {\n throw new Error(t('business_rules.errors.missingTenantOrOrg'))\n }\n\n const payload = buildRulePayload(values, effectiveTenantId, effectiveOrgId, undefined)\n\n const updateRule = () => apiFetch('/api/business_rules/rules', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n ...payload,\n id: ruleId,\n }),\n })\n const headers = buildOptimisticLockHeader(rule?.updatedAt ?? rule?.updated_at ?? null)\n const response = Object.keys(headers).length\n ? await withScopedApiHeaders(headers, updateRule)\n : await updateRule()\n\n if (!response.ok) {\n const body = (await readJsonSafe<Record<string, unknown>>(response)) ?? {}\n const message =\n (typeof body.error === 'string' && body.error) ||\n (typeof body.message === 'string' && body.message) ||\n t('business_rules.errors.updateFailed')\n throw new CrudHttpError(response.status, { ...body, error: message })\n }\n\n router.push('/backend/rules')\n router.refresh()\n }\n\n const fields = React.useMemo(() => createFieldDefinitions(t), [t])\n\n const formGroups = React.useMemo(\n () => createFormGroups(t, ConditionBuilder, ActionBuilder),\n [t]\n )\n\n // Publish page-load record context to the AppShell-owned `backend:record:current`\n // mount so the enterprise record_locks widget resolves `business_rules.rule` + id\n // explicitly. The resourceKind mirrors the route's `enforceCommandOptimisticLock`\n // call so the held lock matches the save-time conflict surface for the same rule.\n useSetCurrentRecordInjectionContext(\n buildRecordInjectionContext({\n resourceKind: 'business_rules.rule',\n resourceId: ruleId ?? null,\n updatedAt: rule?.updatedAt ?? rule?.updated_at ?? null,\n data: (rule ?? null) as Record<string, unknown> | null,\n path: pathname,\n }),\n )\n\n if (isLoading) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] flex-col items-center justify-center gap-2 text-muted-foreground\">\n <Spinner className=\"h-6 w-6\" />\n <span>{t('business_rules.rules.edit.loading')}</span>\n </div>\n </PageBody>\n </Page>\n )\n }\n\n if (error || !rule) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] flex-col items-center justify-center gap-2 text-muted-foreground\">\n <p>{t('business_rules.errors.loadFailed')}</p>\n <Button asChild variant=\"outline\">\n <Link href=\"/backend/rules\">{t('business_rules.rules.backToList')}</Link>\n </Button>\n </div>\n </PageBody>\n </Page>\n )\n }\n\n if (!initialValues) {\n return null\n }\n\n return (\n <Page>\n <PageBody>\n <CrudForm\n key={ruleId}\n title={t('business_rules.rules.edit.title')}\n titleHeadingLevel={1}\n backHref=\"/backend/rules\"\n schema={businessRuleFormSchema}\n fields={fields}\n initialValues={initialValues}\n optimisticLockUpdatedAt={rule?.updatedAt ?? rule?.updated_at ?? null}\n onSubmit={handleSubmit}\n cancelHref=\"/backend/rules\"\n groups={formGroups}\n submitLabel={t('business_rules.rules.form.update')}\n />\n </PageBody>\n </Page>\n )\n}\n"],
|
|
5
|
+
"mappings": ";AAqHU,SACE,KADF;AAnHV,YAAY,WAAW;AACvB,OAAO,UAAU;AACjB,SAAS,WAAW,mBAAmB;AACvC,SAAS,gBAAgB;AACzB,SAAS,MAAM,gBAAgB;AAC/B,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,cAAc;AACvB,SAAS,UAAU,4BAA4B;AAC/C,SAAS,iCAAiC;AAC1C,SAAS,6BAA6B,2CAA2C;AACjF,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,YAAY;AACrB,SAAS,kCAAkC;AAC3C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,wBAAwB;AACjC,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB,6BAA6B;AAEzC,SAAR,qBAAsC,EAAE,OAAO,GAAiC;AACrF,QAAM,SAAS,UAAU;AACzB,QAAM,WAAW,YAAY;AAC7B,QAAM,SAAS,QAAQ;AAEvB,QAAM,IAAI,KAAK;AACf,QAAM,EAAE,gBAAgB,SAAS,IAAI,2BAA2B;AAEhE,QAAM,EAAE,MAAM,MAAM,WAAW,MAAM,IAAI,SAAS;AAAA,IAChD,UAAU,CAAC,iBAAiB,MAAM;AAAA,IAClC,SAAS,YAAY;AACnB,YAAM,WAAW,MAAM,SAAS,6BAA6B,MAAM,EAAE;AACrE,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,EAAE,mCAAmC,CAAC;AAAA,MACxD;AACA,YAAM,SAAS,MAAM,SAAS,KAAK;AACnC,aAAO;AAAA,IACT;AAAA,IACA,SAAS,CAAC,CAAC;AAAA,EACb,CAAC;AAED,QAAM,gBAAgB,MAAM,QAAQ,MAAM;AACxC,QAAI,MAAM;AACR,aAAO,sBAAsB,IAAI;AAAA,IACnC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,eAAe,OAAO,WAAmC;AAE7D,UAAM,oBAAoB,MAAM,YAAY;AAC5C,UAAM,iBAAiB,MAAM,kBAAkB;AAE/C,QAAI,CAAC,qBAAqB,CAAC,gBAAgB;AACzC,YAAM,IAAI,MAAM,EAAE,0CAA0C,CAAC;AAAA,IAC/D;AAEA,UAAM,UAAU,iBAAiB,QAAQ,mBAAmB,gBAAgB,MAAS;AAErF,UAAM,aAAa,MAAM,SAAS,6BAA6B;AAAA,MAC7D,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU;AAAA,QACnB,GAAG;AAAA,QACH,IAAI;AAAA,MACN,CAAC;AAAA,IACH,CAAC;AACD,UAAM,UAAU,0BAA0B,MAAM,aAAa,MAAM,cAAc,IAAI;AACrF,UAAM,WAAW,OAAO,KAAK,OAAO,EAAE,SAClC,MAAM,qBAAqB,SAAS,UAAU,IAC9C,MAAM,WAAW;AAErB,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,OAAQ,MAAM,aAAsC,QAAQ,KAAM,CAAC;AACzE,YAAM,UACH,OAAO,KAAK,UAAU,YAAY,KAAK,SACvC,OAAO,KAAK,YAAY,YAAY,KAAK,WAC1C,EAAE,oCAAoC;AACxC,YAAM,IAAI,cAAc,SAAS,QAAQ,EAAE,GAAG,MAAM,OAAO,QAAQ,CAAC;AAAA,IACtE;AAEA,WAAO,KAAK,gBAAgB;AAC5B,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,SAAS,MAAM,QAAQ,MAAM,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC;AAEjE,QAAM,aAAa,MAAM;AAAA,IACvB,MAAM,iBAAiB,GAAG,kBAAkB,aAAa;AAAA,IACzD,CAAC,CAAC;AAAA,EACJ;AAMA;AAAA,IACE,4BAA4B;AAAA,MAC1B,cAAc;AAAA,MACd,YAAY,UAAU;AAAA,MACtB,WAAW,MAAM,aAAa,MAAM,cAAc;AAAA,MAClD,MAAO,QAAQ;AAAA,MACf,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,MAAI,WAAW;AACb,WACE,oBAAC,QACC,8BAAC,YACC,+BAAC,SAAI,WAAU,kFACb;AAAA,0BAAC,WAAQ,WAAU,WAAU;AAAA,MAC7B,oBAAC,UAAM,YAAE,mCAAmC,GAAE;AAAA,OAChD,GACF,GACF;AAAA,EAEJ;AAEA,MAAI,SAAS,CAAC,MAAM;AAClB,WACE,oBAAC,QACC,8BAAC,YACG,+BAAC,SAAI,WAAU,kFACf;AAAA,0BAAC,OAAG,YAAE,kCAAkC,GAAE;AAAA,MAC1C,oBAAC,UAAO,SAAO,MAAC,SAAQ,WACtB,8BAAC,QAAK,MAAK,kBAAkB,YAAE,iCAAiC,GAAE,GACpE;AAAA,OACF,GACF,GACF;AAAA,EAEJ;AAEA,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,SACE,oBAAC,QACC,8BAAC,YACC;AAAA,IAAC;AAAA;AAAA,MAEC,OAAO,EAAE,iCAAiC;AAAA,MAC1C,mBAAmB;AAAA,MACnB,UAAS;AAAA,MACT,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,yBAAyB,MAAM,aAAa,MAAM,cAAc;AAAA,MAChE,UAAU;AAAA,MACV,YAAW;AAAA,MACX,QAAQ;AAAA,MACR,aAAa,EAAE,kCAAkC;AAAA;AAAA,IAX5C;AAAA,EAYP,GACF,GACF;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/modules/business_rules/backend/rules/create/page.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { CrudForm } from '@open-mercato/ui/backend/CrudForm'\nimport { apiFetch } from '@open-mercato/ui/backend/utils/api'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport {\n businessRuleFormSchema,\n createFormGroups,\n createFieldDefinitions,\n defaultFormValues,\n type BusinessRuleFormValues,\n} from '../../../components/formConfig'\nimport { ConditionBuilder } from '../../../components/ConditionBuilder'\nimport { ActionBuilder } from '../../../components/ActionBuilder'\nimport { buildRulePayload } from '../../../components/utils/formHelpers'\n\nexport default function CreateBusinessRulePage() {\n const router = useRouter()\n const t = useT()\n\n const handleSubmit = async (values: BusinessRuleFormValues) => {\n // Note: tenantId and organizationId are injected by the API from auth token\n // We only send the rule-specific data\n const payload = {\n ruleId: values.ruleId,\n ruleName: values.ruleName,\n description: values.description || null,\n ruleType: values.ruleType,\n ruleCategory: values.ruleCategory || null,\n entityType: values.entityType,\n eventType: values.eventType || null,\n conditionExpression: values.conditionExpression,\n successActions: values.successActions || null,\n failureActions: values.failureActions || null,\n enabled: values.enabled,\n priority: values.priority,\n version: values.version,\n effectiveFrom: values.effectiveFrom || null,\n effectiveTo: values.effectiveTo || null,\n }\n\n const response = await apiFetch('/api/business_rules/rules', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || error.message || t('business_rules.errors.createFailed'))\n }\n\n const result = await response.json()\n router.push(`/backend/rules/${result.id}`)\n router.refresh()\n }\n\n const fields = React.useMemo(() => createFieldDefinitions(t), [t])\n\n const formGroups = React.useMemo(\n () => createFormGroups(t, ConditionBuilder, ActionBuilder),\n [t]\n )\n\n return (\n <Page>\n <PageBody>\n <CrudForm\n title={t('business_rules.rules.create.title')}\n backHref=\"/backend/rules\"\n schema={businessRuleFormSchema}\n fields={fields}\n initialValues={defaultFormValues}\n onSubmit={handleSubmit}\n cancelHref=\"/backend/rules\"\n groups={formGroups}\n submitLabel={t('business_rules.rules.form.create')}\n />\n </PageBody>\n </Page>\n )\n}\n"],
|
|
5
|
-
"mappings": ";AAuEQ;AArER,YAAY,WAAW;AACvB,SAAS,iBAAiB;AAC1B,SAAS,MAAM,gBAAgB;AAC/B,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,YAAY;AAErB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,wBAAwB;AACjC,SAAS,qBAAqB;AAGf,SAAR,yBAA0C;AAC/C,QAAM,SAAS,UAAU;AACzB,QAAM,IAAI,KAAK;AAEf,QAAM,eAAe,OAAO,WAAmC;AAG7D,UAAM,UAAU;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,MACjB,aAAa,OAAO,eAAe;AAAA,MACnC,UAAU,OAAO;AAAA,MACjB,cAAc,OAAO,gBAAgB;AAAA,MACrC,YAAY,OAAO;AAAA,MACnB,WAAW,OAAO,aAAa;AAAA,MAC/B,qBAAqB,OAAO;AAAA,MAC5B,gBAAgB,OAAO,kBAAkB;AAAA,MACzC,gBAAgB,OAAO,kBAAkB;AAAA,MACzC,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,MACjB,SAAS,OAAO;AAAA,MAChB,eAAe,OAAO,iBAAiB;AAAA,MACvC,aAAa,OAAO,eAAe;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,SAAS,6BAA6B;AAAA,MAC3D,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,OAAO;AAAA,IAC9B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,MAAM,MAAM,SAAS,MAAM,WAAW,EAAE,oCAAoC,CAAC;AAAA,IACzF;AAEA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAO,KAAK,kBAAkB,OAAO,EAAE,EAAE;AACzC,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,SAAS,MAAM,QAAQ,MAAM,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC;AAEjE,QAAM,aAAa,MAAM;AAAA,IACvB,MAAM,iBAAiB,GAAG,kBAAkB,aAAa;AAAA,IACzD,CAAC,CAAC;AAAA,EACJ;AAEA,SACE,oBAAC,QACC,8BAAC,YACC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,mCAAmC;AAAA,MAC5C,UAAS;AAAA,MACT,QAAQ;AAAA,MACR;AAAA,MACA,eAAe;AAAA,MACf,UAAU;AAAA,MACV,YAAW;AAAA,MACX,QAAQ;AAAA,MACR,aAAa,EAAE,kCAAkC;AAAA;AAAA,EACnD,GACF,GACF;AAEJ;",
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { CrudForm } from '@open-mercato/ui/backend/CrudForm'\nimport { apiFetch } from '@open-mercato/ui/backend/utils/api'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport {\n businessRuleFormSchema,\n createFormGroups,\n createFieldDefinitions,\n defaultFormValues,\n type BusinessRuleFormValues,\n} from '../../../components/formConfig'\nimport { ConditionBuilder } from '../../../components/ConditionBuilder'\nimport { ActionBuilder } from '../../../components/ActionBuilder'\nimport { buildRulePayload } from '../../../components/utils/formHelpers'\n\nexport default function CreateBusinessRulePage() {\n const router = useRouter()\n const t = useT()\n\n const handleSubmit = async (values: BusinessRuleFormValues) => {\n // Note: tenantId and organizationId are injected by the API from auth token\n // We only send the rule-specific data\n const payload = {\n ruleId: values.ruleId,\n ruleName: values.ruleName,\n description: values.description || null,\n ruleType: values.ruleType,\n ruleCategory: values.ruleCategory || null,\n entityType: values.entityType,\n eventType: values.eventType || null,\n conditionExpression: values.conditionExpression,\n successActions: values.successActions || null,\n failureActions: values.failureActions || null,\n enabled: values.enabled,\n priority: values.priority,\n version: values.version,\n effectiveFrom: values.effectiveFrom || null,\n effectiveTo: values.effectiveTo || null,\n }\n\n const response = await apiFetch('/api/business_rules/rules', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || error.message || t('business_rules.errors.createFailed'))\n }\n\n const result = await response.json()\n router.push(`/backend/rules/${result.id}`)\n router.refresh()\n }\n\n const fields = React.useMemo(() => createFieldDefinitions(t), [t])\n\n const formGroups = React.useMemo(\n () => createFormGroups(t, ConditionBuilder, ActionBuilder),\n [t]\n )\n\n return (\n <Page>\n <PageBody>\n <CrudForm\n title={t('business_rules.rules.create.title')}\n titleHeadingLevel={1}\n backHref=\"/backend/rules\"\n schema={businessRuleFormSchema}\n fields={fields}\n initialValues={defaultFormValues}\n onSubmit={handleSubmit}\n cancelHref=\"/backend/rules\"\n groups={formGroups}\n submitLabel={t('business_rules.rules.form.create')}\n />\n </PageBody>\n </Page>\n )\n}\n"],
|
|
5
|
+
"mappings": ";AAuEQ;AArER,YAAY,WAAW;AACvB,SAAS,iBAAiB;AAC1B,SAAS,MAAM,gBAAgB;AAC/B,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,YAAY;AAErB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,wBAAwB;AACjC,SAAS,qBAAqB;AAGf,SAAR,yBAA0C;AAC/C,QAAM,SAAS,UAAU;AACzB,QAAM,IAAI,KAAK;AAEf,QAAM,eAAe,OAAO,WAAmC;AAG7D,UAAM,UAAU;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,MACjB,aAAa,OAAO,eAAe;AAAA,MACnC,UAAU,OAAO;AAAA,MACjB,cAAc,OAAO,gBAAgB;AAAA,MACrC,YAAY,OAAO;AAAA,MACnB,WAAW,OAAO,aAAa;AAAA,MAC/B,qBAAqB,OAAO;AAAA,MAC5B,gBAAgB,OAAO,kBAAkB;AAAA,MACzC,gBAAgB,OAAO,kBAAkB;AAAA,MACzC,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,MACjB,SAAS,OAAO;AAAA,MAChB,eAAe,OAAO,iBAAiB;AAAA,MACvC,aAAa,OAAO,eAAe;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,SAAS,6BAA6B;AAAA,MAC3D,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,OAAO;AAAA,IAC9B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,MAAM,MAAM,SAAS,MAAM,WAAW,EAAE,oCAAoC,CAAC;AAAA,IACzF;AAEA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAO,KAAK,kBAAkB,OAAO,EAAE,EAAE;AACzC,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,SAAS,MAAM,QAAQ,MAAM,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC;AAEjE,QAAM,aAAa,MAAM;AAAA,IACvB,MAAM,iBAAiB,GAAG,kBAAkB,aAAa;AAAA,IACzD,CAAC,CAAC;AAAA,EACJ;AAEA,SACE,oBAAC,QACC,8BAAC,YACC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,mCAAmC;AAAA,MAC5C,mBAAmB;AAAA,MACnB,UAAS;AAAA,MACT,QAAQ;AAAA,MACR;AAAA,MACA,eAAe;AAAA,MACf,UAAU;AAAA,MACV,YAAW;AAAA,MACX,QAAQ;AAAA,MACR,aAAa,EAAE,kCAAkC;AAAA;AAAA,EACnD,GACF,GACF;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -261,6 +261,7 @@ function RulesListPage() {
|
|
|
261
261
|
DataTable,
|
|
262
262
|
{
|
|
263
263
|
title: t("business_rules.list.title"),
|
|
264
|
+
titleHeadingLevel: 1,
|
|
264
265
|
actions: /* @__PURE__ */ jsx(Button, { asChild: true, children: /* @__PURE__ */ jsx(Link, { href: "/backend/rules/create", children: t("business_rules.actions.create") }) }),
|
|
265
266
|
columns,
|
|
266
267
|
data: data || [],
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/business_rules/backend/rules/page.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { extensionPoints } from '@open-mercato/core/modules/business_rules/extension-points'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { apiCall, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { ListEmptyState } from '@open-mercato/ui/backend/filters/ListEmptyState'\n\ntype Rule = {\n id: string\n ruleId: string\n ruleName: string\n description: string | null\n ruleType: 'GUARD' | 'VALIDATION' | 'CALCULATION' | 'ACTION' | 'ASSIGNMENT'\n ruleCategory: string | null\n entityType: string\n eventType: string | null\n enabled: boolean\n priority: number\n version: number\n effectiveFrom: string | null\n effectiveTo: string | null\n tenantId: string\n organizationId: string\n createdAt: string\n updatedAt: string\n}\n\ntype RulesResponse = {\n items: Rule[]\n total: number\n totalPages: number\n totalIsCapped?: boolean\n}\n\nexport default function RulesListPage() {\n const [page, setPage] = React.useState(1)\n const [pageSize] = React.useState(20)\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const [totalIsCapped, setTotalIsCapped] = React.useState(false)\n const t = useT()\n const router = useRouter()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n\n const { data, isLoading, error } = useQuery({\n queryKey: ['business-rules', 'list', filterValues, page],\n queryFn: async () => {\n const params = new URLSearchParams()\n params.set('page', page.toString())\n params.set('pageSize', pageSize.toString())\n params.set('sortField', 'priority')\n params.set('sortDir', 'desc')\n\n if (filterValues.enabled) params.set('enabled', filterValues.enabled as string)\n if (filterValues.ruleType) params.set('ruleType', filterValues.ruleType as string)\n if (filterValues.entityType) params.set('entityType', filterValues.entityType as string)\n if (filterValues.eventType) params.set('eventType', filterValues.eventType as string)\n if (filterValues.search) params.set('search', filterValues.search as string)\n\n const result = await apiCall<RulesResponse>(\n `/api/business_rules/rules?${params.toString()}`\n )\n\n if (!result.ok) {\n throw new Error('Failed to fetch rules')\n }\n\n const response = result.result\n if (response) {\n setTotal(response.total || 0)\n setTotalPages(response.totalPages || 1)\n setTotalIsCapped(response?.totalIsCapped === true)\n }\n\n return response?.items || []\n },\n })\n\n const handleDelete = async (id: string, ruleName: string) => {\n const confirmed = await confirm({\n title: t('business_rules.confirm.delete', { name: ruleName }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n const record = (data || []).find((item) => item.id === id)\n const result = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(record?.updatedAt),\n () => apiCall(`/api/business_rules/rules?id=${id}`, {\n method: 'DELETE',\n }),\n )\n\n if (result.ok) {\n flash(t('business_rules.messages.deleted'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules'] })\n } else {\n flash(t('business_rules.messages.deleteFailed'), 'error')\n }\n }\n\n const handleToggleEnabled = async (id: string, currentEnabled: boolean) => {\n const record = (data || []).find((item) => item.id === id)\n const result = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(record?.updatedAt),\n () => apiCall('/api/business_rules/rules', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n id,\n enabled: !currentEnabled,\n }),\n }),\n )\n\n if (result.ok) {\n flash(t('business_rules.messages.updated'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules'] })\n } else {\n flash(t('business_rules.messages.updateFailed'), 'error')\n }\n }\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n const next: FilterValues = {}\n Object.entries(values).forEach(([key, value]) => {\n if (value !== undefined) next[key] = value\n })\n setFilterValues(next)\n setPage(1)\n }, [setFilterValues, setPage])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n setPage(1)\n }, [setFilterValues, setPage])\n\n const filters: FilterDef[] = [\n {\n id: 'search',\n type: 'text',\n label: t('business_rules.filters.search'),\n placeholder: t('business_rules.filters.searchPlaceholder'),\n },\n {\n id: 'enabled',\n type: 'select',\n label: t('business_rules.filters.status'),\n options: [\n { label: t('common.all'), value: '' },\n { label: t('common.enabled'), value: 'true' },\n { label: t('common.disabled'), value: 'false' },\n ],\n },\n {\n id: 'ruleType',\n type: 'select',\n label: t('business_rules.filters.type'),\n options: [\n { label: t('common.all'), value: '' },\n { label: t('business_rules.types.guard'), value: 'GUARD' },\n { label: t('business_rules.types.validation'), value: 'VALIDATION' },\n { label: t('business_rules.types.calculation'), value: 'CALCULATION' },\n { label: t('business_rules.types.action'), value: 'ACTION' },\n { label: t('business_rules.types.assignment'), value: 'ASSIGNMENT' },\n ],\n },\n {\n id: 'entityType',\n type: 'text',\n label: t('business_rules.filters.entityType'),\n placeholder: t('business_rules.filters.entityTypePlaceholder'),\n },\n {\n id: 'eventType',\n type: 'text',\n label: t('business_rules.filters.eventType'),\n placeholder: t('business_rules.filters.eventTypePlaceholder'),\n },\n ]\n\n const columns: ColumnDef<Rule>[] = [\n {\n id: 'ruleId',\n header: t('business_rules.fields.ruleId'),\n accessorKey: 'ruleId',\n cell: ({ row }) => (\n <span className=\"font-mono text-sm\">{row.original.ruleId}</span>\n ),\n },\n {\n id: 'ruleName',\n header: t('business_rules.fields.ruleName'),\n accessorKey: 'ruleName',\n cell: ({ row }) => (\n <div>\n <div className=\"font-medium\">{row.original.ruleName}</div>\n {row.original.description && (\n <div className=\"text-xs text-muted-foreground line-clamp-1\">\n {row.original.description}\n </div>\n )}\n </div>\n ),\n },\n {\n id: 'ruleType',\n header: t('business_rules.fields.ruleType'),\n accessorKey: 'ruleType',\n cell: ({ row }) => {\n const typeColors = {\n GUARD: 'bg-status-error-bg text-status-error-text',\n VALIDATION: 'bg-status-warning-bg text-status-warning-text',\n CALCULATION: 'bg-status-info-bg text-status-info-text',\n ACTION: 'bg-status-success-bg text-status-success-text',\n ASSIGNMENT: 'bg-brand-violet/10 text-brand-violet',\n }\n const color = typeColors[row.original.ruleType] || 'bg-muted text-foreground'\n return (\n <span className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium ${color}`}>\n {row.original.ruleType}\n </span>\n )\n },\n },\n {\n id: 'entityType',\n header: t('business_rules.fields.entityType'),\n accessorKey: 'entityType',\n },\n {\n id: 'eventType',\n header: t('business_rules.fields.eventType'),\n accessorKey: 'eventType',\n cell: ({ row }) => row.original.eventType || '-',\n },\n {\n id: 'enabled',\n header: t('business_rules.fields.enabled'),\n accessorKey: 'enabled',\n cell: ({ row }) => (\n <button\n onClick={() => handleToggleEnabled(row.original.id, row.original.enabled)}\n className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium cursor-pointer ${\n row.original.enabled\n ? 'bg-status-success-bg text-status-success-text hover:bg-status-success-bg/80'\n : 'bg-muted text-muted-foreground hover:bg-muted/50'\n }`}\n title={t('business_rules.actions.toggleEnabled')}\n >\n {row.original.enabled ? t('common.yes') : t('common.no')}\n </button>\n ),\n },\n {\n id: 'priority',\n header: t('business_rules.fields.priority'),\n accessorKey: 'priority',\n cell: ({ row }) => (\n <span className=\"font-mono text-sm\">{row.original.priority}</span>\n ),\n },\n {\n id: 'actions',\n header: '',\n cell: ({ row }) => (\n <RowActions\n items={[\n {\n id: 'edit',\n label: t('common.edit'),\n href: `/backend/rules/${row.original.id}`,\n },\n {\n id: row.original.enabled ? 'disable' : 'enable',\n label: row.original.enabled ? t('common.disable') : t('common.enable'),\n onSelect: () => handleToggleEnabled(row.original.id, row.original.enabled),\n },\n {\n id: 'duplicate',\n label: t('common.duplicate'),\n onSelect: () => {\n // TODO: Implement duplicate functionality in Step 5.2\n flash(t('business_rules.messages.duplicateNotYetImplemented'), 'info')\n },\n },\n {\n id: 'delete',\n label: t('common.delete'),\n onSelect: () => handleDelete(row.original.id, row.original.ruleName),\n destructive: true,\n },\n ]}\n />\n ),\n },\n ]\n\n if (error) {\n return (\n <Page>\n <PageBody>\n <div className=\"p-8 text-center\">\n <p className=\"text-status-error-text\">{t('business_rules.messages.loadFailed')}</p>\n <Button onClick={() => queryClient.invalidateQueries({ queryKey: ['business-rules'] })} className=\"mt-4\">\n {t('common.retry')}\n </Button>\n </div>\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n }\n\n return (\n <Page>\n <PageBody>\n <DataTable\n title={t('business_rules.list.title')}\n actions={(\n <Button asChild>\n <Link href=\"/backend/rules/create\">\n {t('business_rules.actions.create')}\n </Link>\n </Button>\n )}\n columns={columns}\n data={data || []}\n filters={filters}\n filterValues={filterValues}\n onFiltersApply={handleFiltersApply}\n onFiltersClear={handleFiltersClear}\n perspective={{\n tableId: extensionPoints.hosts.rulesTable.tableId,\n }}\n emptyState={(\n <ListEmptyState\n entityName={t('business_rules.list.title')}\n createHref=\"/backend/rules/create\"\n createLabel={t('business_rules.actions.create')}\n />\n )}\n pagination={{ page, pageSize, total, totalPages, totalIsCapped, onPageChange: setPage }}\n />\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { extensionPoints } from '@open-mercato/core/modules/business_rules/extension-points'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { apiCall, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { ListEmptyState } from '@open-mercato/ui/backend/filters/ListEmptyState'\n\ntype Rule = {\n id: string\n ruleId: string\n ruleName: string\n description: string | null\n ruleType: 'GUARD' | 'VALIDATION' | 'CALCULATION' | 'ACTION' | 'ASSIGNMENT'\n ruleCategory: string | null\n entityType: string\n eventType: string | null\n enabled: boolean\n priority: number\n version: number\n effectiveFrom: string | null\n effectiveTo: string | null\n tenantId: string\n organizationId: string\n createdAt: string\n updatedAt: string\n}\n\ntype RulesResponse = {\n items: Rule[]\n total: number\n totalPages: number\n totalIsCapped?: boolean\n}\n\nexport default function RulesListPage() {\n const [page, setPage] = React.useState(1)\n const [pageSize] = React.useState(20)\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const [totalIsCapped, setTotalIsCapped] = React.useState(false)\n const t = useT()\n const router = useRouter()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n\n const { data, isLoading, error } = useQuery({\n queryKey: ['business-rules', 'list', filterValues, page],\n queryFn: async () => {\n const params = new URLSearchParams()\n params.set('page', page.toString())\n params.set('pageSize', pageSize.toString())\n params.set('sortField', 'priority')\n params.set('sortDir', 'desc')\n\n if (filterValues.enabled) params.set('enabled', filterValues.enabled as string)\n if (filterValues.ruleType) params.set('ruleType', filterValues.ruleType as string)\n if (filterValues.entityType) params.set('entityType', filterValues.entityType as string)\n if (filterValues.eventType) params.set('eventType', filterValues.eventType as string)\n if (filterValues.search) params.set('search', filterValues.search as string)\n\n const result = await apiCall<RulesResponse>(\n `/api/business_rules/rules?${params.toString()}`\n )\n\n if (!result.ok) {\n throw new Error('Failed to fetch rules')\n }\n\n const response = result.result\n if (response) {\n setTotal(response.total || 0)\n setTotalPages(response.totalPages || 1)\n setTotalIsCapped(response?.totalIsCapped === true)\n }\n\n return response?.items || []\n },\n })\n\n const handleDelete = async (id: string, ruleName: string) => {\n const confirmed = await confirm({\n title: t('business_rules.confirm.delete', { name: ruleName }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n const record = (data || []).find((item) => item.id === id)\n const result = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(record?.updatedAt),\n () => apiCall(`/api/business_rules/rules?id=${id}`, {\n method: 'DELETE',\n }),\n )\n\n if (result.ok) {\n flash(t('business_rules.messages.deleted'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules'] })\n } else {\n flash(t('business_rules.messages.deleteFailed'), 'error')\n }\n }\n\n const handleToggleEnabled = async (id: string, currentEnabled: boolean) => {\n const record = (data || []).find((item) => item.id === id)\n const result = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(record?.updatedAt),\n () => apiCall('/api/business_rules/rules', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n id,\n enabled: !currentEnabled,\n }),\n }),\n )\n\n if (result.ok) {\n flash(t('business_rules.messages.updated'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules'] })\n } else {\n flash(t('business_rules.messages.updateFailed'), 'error')\n }\n }\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n const next: FilterValues = {}\n Object.entries(values).forEach(([key, value]) => {\n if (value !== undefined) next[key] = value\n })\n setFilterValues(next)\n setPage(1)\n }, [setFilterValues, setPage])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n setPage(1)\n }, [setFilterValues, setPage])\n\n const filters: FilterDef[] = [\n {\n id: 'search',\n type: 'text',\n label: t('business_rules.filters.search'),\n placeholder: t('business_rules.filters.searchPlaceholder'),\n },\n {\n id: 'enabled',\n type: 'select',\n label: t('business_rules.filters.status'),\n options: [\n { label: t('common.all'), value: '' },\n { label: t('common.enabled'), value: 'true' },\n { label: t('common.disabled'), value: 'false' },\n ],\n },\n {\n id: 'ruleType',\n type: 'select',\n label: t('business_rules.filters.type'),\n options: [\n { label: t('common.all'), value: '' },\n { label: t('business_rules.types.guard'), value: 'GUARD' },\n { label: t('business_rules.types.validation'), value: 'VALIDATION' },\n { label: t('business_rules.types.calculation'), value: 'CALCULATION' },\n { label: t('business_rules.types.action'), value: 'ACTION' },\n { label: t('business_rules.types.assignment'), value: 'ASSIGNMENT' },\n ],\n },\n {\n id: 'entityType',\n type: 'text',\n label: t('business_rules.filters.entityType'),\n placeholder: t('business_rules.filters.entityTypePlaceholder'),\n },\n {\n id: 'eventType',\n type: 'text',\n label: t('business_rules.filters.eventType'),\n placeholder: t('business_rules.filters.eventTypePlaceholder'),\n },\n ]\n\n const columns: ColumnDef<Rule>[] = [\n {\n id: 'ruleId',\n header: t('business_rules.fields.ruleId'),\n accessorKey: 'ruleId',\n cell: ({ row }) => (\n <span className=\"font-mono text-sm\">{row.original.ruleId}</span>\n ),\n },\n {\n id: 'ruleName',\n header: t('business_rules.fields.ruleName'),\n accessorKey: 'ruleName',\n cell: ({ row }) => (\n <div>\n <div className=\"font-medium\">{row.original.ruleName}</div>\n {row.original.description && (\n <div className=\"text-xs text-muted-foreground line-clamp-1\">\n {row.original.description}\n </div>\n )}\n </div>\n ),\n },\n {\n id: 'ruleType',\n header: t('business_rules.fields.ruleType'),\n accessorKey: 'ruleType',\n cell: ({ row }) => {\n const typeColors = {\n GUARD: 'bg-status-error-bg text-status-error-text',\n VALIDATION: 'bg-status-warning-bg text-status-warning-text',\n CALCULATION: 'bg-status-info-bg text-status-info-text',\n ACTION: 'bg-status-success-bg text-status-success-text',\n ASSIGNMENT: 'bg-brand-violet/10 text-brand-violet',\n }\n const color = typeColors[row.original.ruleType] || 'bg-muted text-foreground'\n return (\n <span className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium ${color}`}>\n {row.original.ruleType}\n </span>\n )\n },\n },\n {\n id: 'entityType',\n header: t('business_rules.fields.entityType'),\n accessorKey: 'entityType',\n },\n {\n id: 'eventType',\n header: t('business_rules.fields.eventType'),\n accessorKey: 'eventType',\n cell: ({ row }) => row.original.eventType || '-',\n },\n {\n id: 'enabled',\n header: t('business_rules.fields.enabled'),\n accessorKey: 'enabled',\n cell: ({ row }) => (\n <button\n onClick={() => handleToggleEnabled(row.original.id, row.original.enabled)}\n className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium cursor-pointer ${\n row.original.enabled\n ? 'bg-status-success-bg text-status-success-text hover:bg-status-success-bg/80'\n : 'bg-muted text-muted-foreground hover:bg-muted/50'\n }`}\n title={t('business_rules.actions.toggleEnabled')}\n >\n {row.original.enabled ? t('common.yes') : t('common.no')}\n </button>\n ),\n },\n {\n id: 'priority',\n header: t('business_rules.fields.priority'),\n accessorKey: 'priority',\n cell: ({ row }) => (\n <span className=\"font-mono text-sm\">{row.original.priority}</span>\n ),\n },\n {\n id: 'actions',\n header: '',\n cell: ({ row }) => (\n <RowActions\n items={[\n {\n id: 'edit',\n label: t('common.edit'),\n href: `/backend/rules/${row.original.id}`,\n },\n {\n id: row.original.enabled ? 'disable' : 'enable',\n label: row.original.enabled ? t('common.disable') : t('common.enable'),\n onSelect: () => handleToggleEnabled(row.original.id, row.original.enabled),\n },\n {\n id: 'duplicate',\n label: t('common.duplicate'),\n onSelect: () => {\n // TODO: Implement duplicate functionality in Step 5.2\n flash(t('business_rules.messages.duplicateNotYetImplemented'), 'info')\n },\n },\n {\n id: 'delete',\n label: t('common.delete'),\n onSelect: () => handleDelete(row.original.id, row.original.ruleName),\n destructive: true,\n },\n ]}\n />\n ),\n },\n ]\n\n if (error) {\n return (\n <Page>\n <PageBody>\n <div className=\"p-8 text-center\">\n <p className=\"text-status-error-text\">{t('business_rules.messages.loadFailed')}</p>\n <Button onClick={() => queryClient.invalidateQueries({ queryKey: ['business-rules'] })} className=\"mt-4\">\n {t('common.retry')}\n </Button>\n </div>\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n }\n\n return (\n <Page>\n <PageBody>\n <DataTable\n title={t('business_rules.list.title')}\n titleHeadingLevel={1}\n actions={(\n <Button asChild>\n <Link href=\"/backend/rules/create\">\n {t('business_rules.actions.create')}\n </Link>\n </Button>\n )}\n columns={columns}\n data={data || []}\n filters={filters}\n filterValues={filterValues}\n onFiltersApply={handleFiltersApply}\n onFiltersClear={handleFiltersClear}\n perspective={{\n tableId: extensionPoints.hosts.rulesTable.tableId,\n }}\n emptyState={(\n <ListEmptyState\n entityName={t('business_rules.list.title')}\n createHref=\"/backend/rules/create\"\n createLabel={t('business_rules.actions.create')}\n />\n )}\n pagination={{ page, pageSize, total, totalPages, totalIsCapped, onPageChange: setPage }}\n />\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/modules/business_rules/backend/sets/%5Bid%5D/page.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter, usePathname } from 'next/navigation'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { CrudForm } from '@open-mercato/ui/backend/CrudForm'\nimport type { CrudField } from '@open-mercato/ui/backend/CrudForm'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { apiFetch, withScopedApiHeaders } from '@open-mercato/ui/backend/utils/api'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { buildRecordInjectionContext, useSetCurrentRecordInjectionContext } from '@open-mercato/ui/backend/injection/recordContext'\nimport { readJsonSafe } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { z } from 'zod'\nimport { RuleSetMembers } from '@open-mercato/core/modules/business_rules/components/RuleSetMembers'\n\nconst ruleSetFormSchema = z.object({\n setId: z.string().min(1).max(50),\n setName: z.string().min(1).max(200),\n description: z.string().max(5000).optional().nullable(),\n enabled: z.boolean().optional(),\n})\n\ntype RuleSetFormValues = z.infer<typeof ruleSetFormSchema>\n\ntype RuleSetDetail = {\n id: string\n setId: string\n setName: string\n description: string | null\n enabled: boolean\n tenantId: string\n organizationId: string\n createdBy: string | null\n updatedBy: string | null\n createdAt: string\n updatedAt: string\n members: Array<{\n id: string\n ruleId: string\n ruleName: string\n ruleType: string\n sequence: number\n enabled: boolean\n }>\n}\n\nexport default function EditRuleSetPage({ params }: { params?: { id?: string } }) {\n const router = useRouter()\n const pathname = usePathname()\n const setId = params?.id\n\n const t = useT()\n const { organizationId, tenantId } = useOrganizationScopeDetail()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n\n const { data: ruleSet, isLoading, error } = useQuery({\n queryKey: ['business-rules', 'sets', setId],\n queryFn: async () => {\n const response = await apiFetch(`/api/business_rules/sets/${setId}`)\n if (!response.ok) {\n throw new Error(t('business_rules.sets.errors.fetchFailed'))\n }\n const result = await response.json()\n return result as RuleSetDetail\n },\n enabled: !!setId,\n })\n\n const handleSubmit = async (values: RuleSetFormValues) => {\n const payload = {\n id: setId,\n ...values,\n }\n\n const updateSet = () => apiFetch('/api/business_rules/sets', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n const headers = buildOptimisticLockHeader(ruleSet?.updatedAt ?? null)\n const response = Object.keys(headers).length\n ? await withScopedApiHeaders(headers, updateSet)\n : await updateSet()\n\n if (!response.ok) {\n const body = (await readJsonSafe<Record<string, unknown>>(response)) ?? {}\n const message =\n (typeof body.error === 'string' && body.error) ||\n (typeof body.message === 'string' && body.message) ||\n t('business_rules.sets.errors.updateFailed')\n throw new CrudHttpError(response.status, { ...body, error: message })\n }\n\n flash(t('business_rules.sets.messages.updated'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules', 'sets', setId] })\n }\n\n const handleAddMember = async (ruleId: string, sequence: number) => {\n const result = await apiCall(`/api/business_rules/sets/${setId}/members`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n ruleId,\n sequence,\n enabled: true,\n }),\n })\n\n if (result.ok) {\n flash(t('business_rules.sets.members.messages.added'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules', 'sets', setId] })\n } else {\n const error = result.result as { error?: string; message?: string } | null\n if (error?.error?.includes('duplicate') || error?.message?.includes('exists')) {\n flash(t('business_rules.sets.members.messages.alreadyExists'), 'error')\n } else {\n flash(t('business_rules.sets.members.messages.addFailed'), 'error')\n }\n }\n }\n\n const handleUpdateMember = async (memberId: string, updates: { sequence?: number; enabled?: boolean }) => {\n const result = await apiCall(`/api/business_rules/sets/${setId}/members`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n memberId,\n ...updates,\n }),\n })\n\n if (result.ok) {\n flash(t('business_rules.sets.members.messages.updated'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules', 'sets', setId] })\n } else {\n flash(t('business_rules.sets.members.messages.updateFailed'), 'error')\n }\n }\n\n const handleRemoveMember = async (memberId: string, ruleName: string) => {\n const confirmed = await confirm({\n title: t('business_rules.sets.members.confirm.remove', { name: ruleName }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n const result = await apiCall(`/api/business_rules/sets/${setId}/members?memberId=${memberId}`, {\n method: 'DELETE',\n })\n\n if (result.ok) {\n flash(t('business_rules.sets.members.messages.removed'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules', 'sets', setId] })\n } else {\n flash(t('business_rules.sets.members.messages.removeFailed'), 'error')\n }\n }\n\n const fields: CrudField[] = React.useMemo(() => [\n {\n id: 'setId',\n label: t('business_rules.sets.form.setId'),\n type: 'text',\n required: true,\n placeholder: t('business_rules.sets.form.placeholders.setId'),\n description: t('business_rules.sets.form.descriptions.setId'),\n },\n {\n id: 'setName',\n label: t('business_rules.sets.form.setName'),\n type: 'text',\n required: true,\n placeholder: t('business_rules.sets.form.placeholders.setName'),\n },\n {\n id: 'description',\n label: t('business_rules.sets.form.description'),\n type: 'textarea',\n placeholder: t('business_rules.sets.form.placeholders.description'),\n },\n {\n id: 'enabled',\n label: t('business_rules.sets.form.enabled'),\n type: 'checkbox',\n description: t('business_rules.sets.form.descriptions.enabled'),\n },\n ], [t])\n\n const initialValues: Partial<RuleSetFormValues> = React.useMemo(() => {\n if (!ruleSet) return {}\n return {\n setId: ruleSet.setId,\n setName: ruleSet.setName,\n description: ruleSet.description,\n enabled: ruleSet.enabled,\n }\n }, [ruleSet])\n\n const formGroups = React.useMemo(() => {\n if (!ruleSet) return []\n return [\n {\n id: 'details',\n title: t('business_rules.sets.edit.detailsSection'),\n column: 1 as const,\n fields: ['setId', 'setName', 'description', 'enabled'],\n },\n {\n id: 'members',\n title: t('business_rules.sets.edit.membersSection'),\n column: 1 as const,\n component: () => (\n <RuleSetMembers\n members={ruleSet.members}\n onAdd={handleAddMember}\n onUpdate={handleUpdateMember}\n onRemove={handleRemoveMember}\n />\n ),\n },\n ]\n }, [t, ruleSet, handleAddMember, handleUpdateMember, handleRemoveMember])\n\n // Publish page-load record context to the AppShell-owned `backend:record:current`\n // mount so the enterprise record_locks widget resolves the rule set + id\n // explicitly. The resourceKind mirrors the route's `enforceCommandOptimisticLock`\n // call (`business_rules.ruleSet`) so the held lock matches the save-time conflict\n // surface for the same rule set.\n useSetCurrentRecordInjectionContext(\n buildRecordInjectionContext({\n resourceKind: 'business_rules.ruleSet',\n resourceId: setId ?? null,\n updatedAt: ruleSet?.updatedAt ?? null,\n data: (ruleSet ?? null) as Record<string, unknown> | null,\n path: pathname,\n }),\n )\n\n if (isLoading) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] flex-col items-center justify-center gap-2 text-muted-foreground\">\n <Spinner className=\"h-6 w-6\" />\n <span>{t('business_rules.sets.edit.loading')}</span>\n </div>\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n }\n\n if (error || !ruleSet) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] flex-col items-center justify-center gap-2 text-muted-foreground\">\n <p>{t('business_rules.sets.messages.loadFailed')}</p>\n <Button asChild variant=\"outline\">\n <Link href=\"/backend/sets\">{t('business_rules.sets.backToList')}</Link>\n </Button>\n </div>\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n }\n\n return (\n <Page>\n <PageBody>\n <CrudForm\n title={t('business_rules.sets.edit.title')}\n backHref=\"/backend/sets\"\n schema={ruleSetFormSchema}\n fields={fields}\n initialValues={initialValues}\n optimisticLockUpdatedAt={ruleSet.updatedAt}\n onSubmit={handleSubmit}\n cancelHref=\"/backend/sets\"\n submitLabel={t('business_rules.sets.form.update')}\n groups={formGroups}\n />\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter, usePathname } from 'next/navigation'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { CrudForm } from '@open-mercato/ui/backend/CrudForm'\nimport type { CrudField } from '@open-mercato/ui/backend/CrudForm'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { apiFetch, withScopedApiHeaders } from '@open-mercato/ui/backend/utils/api'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { buildRecordInjectionContext, useSetCurrentRecordInjectionContext } from '@open-mercato/ui/backend/injection/recordContext'\nimport { readJsonSafe } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { z } from 'zod'\nimport { RuleSetMembers } from '@open-mercato/core/modules/business_rules/components/RuleSetMembers'\n\nconst ruleSetFormSchema = z.object({\n setId: z.string().min(1).max(50),\n setName: z.string().min(1).max(200),\n description: z.string().max(5000).optional().nullable(),\n enabled: z.boolean().optional(),\n})\n\ntype RuleSetFormValues = z.infer<typeof ruleSetFormSchema>\n\ntype RuleSetDetail = {\n id: string\n setId: string\n setName: string\n description: string | null\n enabled: boolean\n tenantId: string\n organizationId: string\n createdBy: string | null\n updatedBy: string | null\n createdAt: string\n updatedAt: string\n members: Array<{\n id: string\n ruleId: string\n ruleName: string\n ruleType: string\n sequence: number\n enabled: boolean\n }>\n}\n\nexport default function EditRuleSetPage({ params }: { params?: { id?: string } }) {\n const router = useRouter()\n const pathname = usePathname()\n const setId = params?.id\n\n const t = useT()\n const { organizationId, tenantId } = useOrganizationScopeDetail()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n\n const { data: ruleSet, isLoading, error } = useQuery({\n queryKey: ['business-rules', 'sets', setId],\n queryFn: async () => {\n const response = await apiFetch(`/api/business_rules/sets/${setId}`)\n if (!response.ok) {\n throw new Error(t('business_rules.sets.errors.fetchFailed'))\n }\n const result = await response.json()\n return result as RuleSetDetail\n },\n enabled: !!setId,\n })\n\n const handleSubmit = async (values: RuleSetFormValues) => {\n const payload = {\n id: setId,\n ...values,\n }\n\n const updateSet = () => apiFetch('/api/business_rules/sets', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n const headers = buildOptimisticLockHeader(ruleSet?.updatedAt ?? null)\n const response = Object.keys(headers).length\n ? await withScopedApiHeaders(headers, updateSet)\n : await updateSet()\n\n if (!response.ok) {\n const body = (await readJsonSafe<Record<string, unknown>>(response)) ?? {}\n const message =\n (typeof body.error === 'string' && body.error) ||\n (typeof body.message === 'string' && body.message) ||\n t('business_rules.sets.errors.updateFailed')\n throw new CrudHttpError(response.status, { ...body, error: message })\n }\n\n flash(t('business_rules.sets.messages.updated'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules', 'sets', setId] })\n }\n\n const handleAddMember = async (ruleId: string, sequence: number) => {\n const result = await apiCall(`/api/business_rules/sets/${setId}/members`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n ruleId,\n sequence,\n enabled: true,\n }),\n })\n\n if (result.ok) {\n flash(t('business_rules.sets.members.messages.added'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules', 'sets', setId] })\n } else {\n const error = result.result as { error?: string; message?: string } | null\n if (error?.error?.includes('duplicate') || error?.message?.includes('exists')) {\n flash(t('business_rules.sets.members.messages.alreadyExists'), 'error')\n } else {\n flash(t('business_rules.sets.members.messages.addFailed'), 'error')\n }\n }\n }\n\n const handleUpdateMember = async (memberId: string, updates: { sequence?: number; enabled?: boolean }) => {\n const result = await apiCall(`/api/business_rules/sets/${setId}/members`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n memberId,\n ...updates,\n }),\n })\n\n if (result.ok) {\n flash(t('business_rules.sets.members.messages.updated'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules', 'sets', setId] })\n } else {\n flash(t('business_rules.sets.members.messages.updateFailed'), 'error')\n }\n }\n\n const handleRemoveMember = async (memberId: string, ruleName: string) => {\n const confirmed = await confirm({\n title: t('business_rules.sets.members.confirm.remove', { name: ruleName }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n const result = await apiCall(`/api/business_rules/sets/${setId}/members?memberId=${memberId}`, {\n method: 'DELETE',\n })\n\n if (result.ok) {\n flash(t('business_rules.sets.members.messages.removed'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules', 'sets', setId] })\n } else {\n flash(t('business_rules.sets.members.messages.removeFailed'), 'error')\n }\n }\n\n const fields: CrudField[] = React.useMemo(() => [\n {\n id: 'setId',\n label: t('business_rules.sets.form.setId'),\n type: 'text',\n required: true,\n placeholder: t('business_rules.sets.form.placeholders.setId'),\n description: t('business_rules.sets.form.descriptions.setId'),\n },\n {\n id: 'setName',\n label: t('business_rules.sets.form.setName'),\n type: 'text',\n required: true,\n placeholder: t('business_rules.sets.form.placeholders.setName'),\n },\n {\n id: 'description',\n label: t('business_rules.sets.form.description'),\n type: 'textarea',\n placeholder: t('business_rules.sets.form.placeholders.description'),\n },\n {\n id: 'enabled',\n label: t('business_rules.sets.form.enabled'),\n type: 'checkbox',\n description: t('business_rules.sets.form.descriptions.enabled'),\n },\n ], [t])\n\n const initialValues: Partial<RuleSetFormValues> = React.useMemo(() => {\n if (!ruleSet) return {}\n return {\n setId: ruleSet.setId,\n setName: ruleSet.setName,\n description: ruleSet.description,\n enabled: ruleSet.enabled,\n }\n }, [ruleSet])\n\n const formGroups = React.useMemo(() => {\n if (!ruleSet) return []\n return [\n {\n id: 'details',\n title: t('business_rules.sets.edit.detailsSection'),\n column: 1 as const,\n fields: ['setId', 'setName', 'description', 'enabled'],\n },\n {\n id: 'members',\n title: t('business_rules.sets.edit.membersSection'),\n column: 1 as const,\n component: () => (\n <RuleSetMembers\n members={ruleSet.members}\n onAdd={handleAddMember}\n onUpdate={handleUpdateMember}\n onRemove={handleRemoveMember}\n />\n ),\n },\n ]\n }, [t, ruleSet, handleAddMember, handleUpdateMember, handleRemoveMember])\n\n // Publish page-load record context to the AppShell-owned `backend:record:current`\n // mount so the enterprise record_locks widget resolves the rule set + id\n // explicitly. The resourceKind mirrors the route's `enforceCommandOptimisticLock`\n // call (`business_rules.ruleSet`) so the held lock matches the save-time conflict\n // surface for the same rule set.\n useSetCurrentRecordInjectionContext(\n buildRecordInjectionContext({\n resourceKind: 'business_rules.ruleSet',\n resourceId: setId ?? null,\n updatedAt: ruleSet?.updatedAt ?? null,\n data: (ruleSet ?? null) as Record<string, unknown> | null,\n path: pathname,\n }),\n )\n\n if (isLoading) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] flex-col items-center justify-center gap-2 text-muted-foreground\">\n <Spinner className=\"h-6 w-6\" />\n <span>{t('business_rules.sets.edit.loading')}</span>\n </div>\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n }\n\n if (error || !ruleSet) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] flex-col items-center justify-center gap-2 text-muted-foreground\">\n <p>{t('business_rules.sets.messages.loadFailed')}</p>\n <Button asChild variant=\"outline\">\n <Link href=\"/backend/sets\">{t('business_rules.sets.backToList')}</Link>\n </Button>\n </div>\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n }\n\n return (\n <Page>\n <PageBody>\n <CrudForm\n title={t('business_rules.sets.edit.title')}\n titleHeadingLevel={1}\n backHref=\"/backend/sets\"\n schema={ruleSetFormSchema}\n fields={fields}\n initialValues={initialValues}\n optimisticLockUpdatedAt={ruleSet.updatedAt}\n onSubmit={handleSubmit}\n cancelHref=\"/backend/sets\"\n submitLabel={t('business_rules.sets.form.update')}\n groups={formGroups}\n />\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["error"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/modules/business_rules/backend/sets/create/page.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { CrudForm } from '@open-mercato/ui/backend/CrudForm'\nimport type { CrudField } from '@open-mercato/ui/backend/CrudForm'\nimport { apiFetch } from '@open-mercato/ui/backend/utils/api'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { z } from 'zod'\n\nconst createRuleSetFormSchema = (t: (key: string) => string) =>\n z.object({\n setId: z.string().min(1, t('business_rules.sets.form.validation.setIdRequired')).max(50),\n setName: z.string().min(1, t('business_rules.sets.form.validation.setNameRequired')).max(200),\n description: z.string().max(5000).optional().nullable(),\n enabled: z.boolean().optional(),\n })\n\ntype RuleSetFormValues = z.infer<ReturnType<typeof createRuleSetFormSchema>>\n\nexport default function CreateRuleSetPage() {\n const router = useRouter()\n const t = useT()\n const ruleSetFormSchema = React.useMemo(() => createRuleSetFormSchema(t), [t])\n\n const handleSubmit = async (values: RuleSetFormValues) => {\n // Note: tenantId and organizationId are injected by the API from auth token\n const payload = {\n setId: values.setId,\n setName: values.setName,\n description: values.description || null,\n enabled: values.enabled ?? true,\n }\n\n const response = await apiFetch('/api/business_rules/sets', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || error.message || t('business_rules.sets.errors.createFailed'))\n }\n\n const result = await response.json()\n router.push(`/backend/sets/${result.id}`)\n router.refresh()\n }\n\n const fields: CrudField[] = React.useMemo(() => [\n {\n id: 'setId',\n label: t('business_rules.sets.form.setId'),\n type: 'text',\n required: true,\n placeholder: t('business_rules.sets.form.placeholders.setId'),\n description: t('business_rules.sets.form.descriptions.setId'),\n },\n {\n id: 'setName',\n label: t('business_rules.sets.form.setName'),\n type: 'text',\n required: true,\n placeholder: t('business_rules.sets.form.placeholders.setName'),\n },\n {\n id: 'description',\n label: t('business_rules.sets.form.description'),\n type: 'textarea',\n placeholder: t('business_rules.sets.form.placeholders.description'),\n },\n {\n id: 'enabled',\n label: t('business_rules.sets.form.enabled'),\n type: 'checkbox',\n description: t('business_rules.sets.form.descriptions.enabled'),\n },\n ], [t])\n\n const initialValues: Partial<RuleSetFormValues> = {\n enabled: true,\n }\n\n const formGroups = React.useMemo(() => [\n {\n id: 'details',\n column: 1 as const,\n fields: ['setId', 'setName', 'description', 'enabled'],\n },\n ], [])\n\n return (\n <Page>\n <PageBody>\n <CrudForm\n title={t('business_rules.sets.create.title')}\n backHref=\"/backend/sets\"\n schema={ruleSetFormSchema}\n fields={fields}\n initialValues={initialValues}\n onSubmit={handleSubmit}\n cancelHref=\"/backend/sets\"\n submitLabel={t('business_rules.sets.form.create')}\n groups={formGroups}\n />\n </PageBody>\n </Page>\n )\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { CrudForm } from '@open-mercato/ui/backend/CrudForm'\nimport type { CrudField } from '@open-mercato/ui/backend/CrudForm'\nimport { apiFetch } from '@open-mercato/ui/backend/utils/api'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { z } from 'zod'\n\nconst createRuleSetFormSchema = (t: (key: string) => string) =>\n z.object({\n setId: z.string().min(1, t('business_rules.sets.form.validation.setIdRequired')).max(50),\n setName: z.string().min(1, t('business_rules.sets.form.validation.setNameRequired')).max(200),\n description: z.string().max(5000).optional().nullable(),\n enabled: z.boolean().optional(),\n })\n\ntype RuleSetFormValues = z.infer<ReturnType<typeof createRuleSetFormSchema>>\n\nexport default function CreateRuleSetPage() {\n const router = useRouter()\n const t = useT()\n const ruleSetFormSchema = React.useMemo(() => createRuleSetFormSchema(t), [t])\n\n const handleSubmit = async (values: RuleSetFormValues) => {\n // Note: tenantId and organizationId are injected by the API from auth token\n const payload = {\n setId: values.setId,\n setName: values.setName,\n description: values.description || null,\n enabled: values.enabled ?? true,\n }\n\n const response = await apiFetch('/api/business_rules/sets', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || error.message || t('business_rules.sets.errors.createFailed'))\n }\n\n const result = await response.json()\n router.push(`/backend/sets/${result.id}`)\n router.refresh()\n }\n\n const fields: CrudField[] = React.useMemo(() => [\n {\n id: 'setId',\n label: t('business_rules.sets.form.setId'),\n type: 'text',\n required: true,\n placeholder: t('business_rules.sets.form.placeholders.setId'),\n description: t('business_rules.sets.form.descriptions.setId'),\n },\n {\n id: 'setName',\n label: t('business_rules.sets.form.setName'),\n type: 'text',\n required: true,\n placeholder: t('business_rules.sets.form.placeholders.setName'),\n },\n {\n id: 'description',\n label: t('business_rules.sets.form.description'),\n type: 'textarea',\n placeholder: t('business_rules.sets.form.placeholders.description'),\n },\n {\n id: 'enabled',\n label: t('business_rules.sets.form.enabled'),\n type: 'checkbox',\n description: t('business_rules.sets.form.descriptions.enabled'),\n },\n ], [t])\n\n const initialValues: Partial<RuleSetFormValues> = {\n enabled: true,\n }\n\n const formGroups = React.useMemo(() => [\n {\n id: 'details',\n column: 1 as const,\n fields: ['setId', 'setName', 'description', 'enabled'],\n },\n ], [])\n\n return (\n <Page>\n <PageBody>\n <CrudForm\n title={t('business_rules.sets.create.title')}\n titleHeadingLevel={1}\n backHref=\"/backend/sets\"\n schema={ruleSetFormSchema}\n fields={fields}\n initialValues={initialValues}\n onSubmit={handleSubmit}\n cancelHref=\"/backend/sets\"\n submitLabel={t('business_rules.sets.form.create')}\n groups={formGroups}\n />\n </PageBody>\n </Page>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -190,6 +190,7 @@ function RuleSetsListPage() {
|
|
|
190
190
|
DataTable,
|
|
191
191
|
{
|
|
192
192
|
title: t("business_rules.sets.list.title"),
|
|
193
|
+
titleHeadingLevel: 1,
|
|
193
194
|
actions: /* @__PURE__ */ jsx(Button, { asChild: true, children: /* @__PURE__ */ jsx(Link, { href: "/backend/sets/create", children: t("business_rules.sets.actions.create") }) }),
|
|
194
195
|
columns,
|
|
195
196
|
data: data || [],
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/business_rules/backend/sets/page.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { apiCall, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { ListEmptyState } from '@open-mercato/ui/backend/filters/ListEmptyState'\n\ntype RuleSet = {\n id: string\n setId: string\n setName: string\n description: string | null\n enabled: boolean\n tenantId: string\n organizationId: string\n createdBy: string | null\n updatedBy: string | null\n createdAt: string\n updatedAt: string\n}\n\ntype RuleSetsResponse = {\n items: RuleSet[]\n total: number\n totalPages: number\n totalIsCapped?: boolean\n}\n\nexport default function RuleSetsListPage() {\n const [page, setPage] = React.useState(1)\n const [pageSize] = React.useState(20)\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const [totalIsCapped, setTotalIsCapped] = React.useState(false)\n const t = useT()\n const router = useRouter()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n\n const { data, isLoading, error } = useQuery({\n queryKey: ['business-rules', 'sets', filterValues, page],\n queryFn: async () => {\n const params = new URLSearchParams()\n params.set('page', page.toString())\n params.set('pageSize', pageSize.toString())\n params.set('sortField', 'setName')\n params.set('sortDir', 'asc')\n\n if (filterValues.enabled) params.set('enabled', filterValues.enabled as string)\n if (filterValues.search) params.set('search', filterValues.search as string)\n\n const result = await apiCall<RuleSetsResponse>(\n `/api/business_rules/sets?${params.toString()}`\n )\n\n if (!result.ok) {\n throw new Error('Failed to fetch rule sets')\n }\n\n const response = result.result\n if (response) {\n setTotal(response.total || 0)\n setTotalPages(response.totalPages || 1)\n setTotalIsCapped(response?.totalIsCapped === true)\n }\n\n return response?.items || []\n },\n })\n\n const handleDelete = async (id: string, setName: string) => {\n const confirmed = await confirm({\n title: t('business_rules.sets.confirm.delete', { name: setName }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n const record = (data || []).find((item) => item.id === id)\n const result = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(record?.updatedAt),\n () => apiCall(`/api/business_rules/sets?id=${id}`, {\n method: 'DELETE',\n }),\n )\n\n if (result.ok) {\n flash(t('business_rules.sets.messages.deleted'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules', 'sets'] })\n } else {\n flash(t('business_rules.sets.messages.deleteFailed'), 'error')\n }\n }\n\n const handleToggleEnabled = async (id: string, currentEnabled: boolean) => {\n const record = (data || []).find((item) => item.id === id)\n const result = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(record?.updatedAt),\n () => apiCall('/api/business_rules/sets', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n id,\n enabled: !currentEnabled,\n }),\n }),\n )\n\n if (result.ok) {\n flash(t('business_rules.sets.messages.updated'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules', 'sets'] })\n } else {\n flash(t('business_rules.sets.messages.updateFailed'), 'error')\n }\n }\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n const next: FilterValues = {}\n Object.entries(values).forEach(([key, value]) => {\n if (value !== undefined) next[key] = value\n })\n setFilterValues(next)\n setPage(1)\n }, [setFilterValues, setPage])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n setPage(1)\n }, [setFilterValues, setPage])\n\n const filters: FilterDef[] = [\n {\n id: 'search',\n type: 'text',\n label: t('business_rules.filters.search'),\n placeholder: t('business_rules.sets.filters.searchPlaceholder'),\n },\n {\n id: 'enabled',\n type: 'select',\n label: t('business_rules.filters.status'),\n options: [\n { value: '', label: t('common.all') },\n { value: 'true', label: t('common.enabled') },\n { value: 'false', label: t('common.disabled') },\n ],\n },\n ]\n\n const columns: ColumnDef<RuleSet>[] = [\n {\n id: 'setId',\n header: t('business_rules.sets.fields.setId'),\n accessorKey: 'setId',\n cell: ({ row }) => (\n <Link\n href={`/backend/sets/${row.original.id}`}\n className=\"font-mono text-sm text-primary hover:underline\"\n >\n {row.original.setId}\n </Link>\n ),\n },\n {\n id: 'setName',\n header: t('business_rules.sets.fields.setName'),\n accessorKey: 'setName',\n cell: ({ row }) => (\n <div>\n <div className=\"font-medium\">{row.original.setName}</div>\n {row.original.description && (\n <div className=\"text-xs text-muted-foreground mt-0.5 line-clamp-1\">\n {row.original.description}\n </div>\n )}\n </div>\n ),\n },\n {\n id: 'enabled',\n header: t('business_rules.sets.fields.enabled'),\n accessorKey: 'enabled',\n cell: ({ row }) => (\n <button\n onClick={() => handleToggleEnabled(row.original.id, row.original.enabled)}\n className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium cursor-pointer ${\n row.original.enabled\n ? 'bg-status-success-bg text-status-success-text hover:bg-status-success-bg/80'\n : 'bg-muted text-muted-foreground hover:bg-muted/50'\n }`}\n title={t('business_rules.sets.actions.toggleEnabled')}\n >\n {row.original.enabled ? t('common.yes') : t('common.no')}\n </button>\n ),\n },\n {\n id: 'actions',\n header: '',\n cell: ({ row }) => (\n <RowActions\n items={[\n {\n id: 'edit',\n label: t('common.edit'),\n href: `/backend/sets/${row.original.id}`,\n },\n {\n id: row.original.enabled ? 'disable' : 'enable',\n label: row.original.enabled ? t('common.disable') : t('common.enable'),\n onSelect: () => handleToggleEnabled(row.original.id, row.original.enabled),\n },\n {\n id: 'delete',\n label: t('common.delete'),\n onSelect: () => handleDelete(row.original.id, row.original.setName),\n destructive: true,\n },\n ]}\n />\n ),\n },\n ]\n\n return (\n <Page>\n <PageBody>\n <DataTable\n
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { apiCall, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { FilterDef, FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { ListEmptyState } from '@open-mercato/ui/backend/filters/ListEmptyState'\n\ntype RuleSet = {\n id: string\n setId: string\n setName: string\n description: string | null\n enabled: boolean\n tenantId: string\n organizationId: string\n createdBy: string | null\n updatedBy: string | null\n createdAt: string\n updatedAt: string\n}\n\ntype RuleSetsResponse = {\n items: RuleSet[]\n total: number\n totalPages: number\n totalIsCapped?: boolean\n}\n\nexport default function RuleSetsListPage() {\n const [page, setPage] = React.useState(1)\n const [pageSize] = React.useState(20)\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const [totalIsCapped, setTotalIsCapped] = React.useState(false)\n const t = useT()\n const router = useRouter()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n\n const { data, isLoading, error } = useQuery({\n queryKey: ['business-rules', 'sets', filterValues, page],\n queryFn: async () => {\n const params = new URLSearchParams()\n params.set('page', page.toString())\n params.set('pageSize', pageSize.toString())\n params.set('sortField', 'setName')\n params.set('sortDir', 'asc')\n\n if (filterValues.enabled) params.set('enabled', filterValues.enabled as string)\n if (filterValues.search) params.set('search', filterValues.search as string)\n\n const result = await apiCall<RuleSetsResponse>(\n `/api/business_rules/sets?${params.toString()}`\n )\n\n if (!result.ok) {\n throw new Error('Failed to fetch rule sets')\n }\n\n const response = result.result\n if (response) {\n setTotal(response.total || 0)\n setTotalPages(response.totalPages || 1)\n setTotalIsCapped(response?.totalIsCapped === true)\n }\n\n return response?.items || []\n },\n })\n\n const handleDelete = async (id: string, setName: string) => {\n const confirmed = await confirm({\n title: t('business_rules.sets.confirm.delete', { name: setName }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n const record = (data || []).find((item) => item.id === id)\n const result = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(record?.updatedAt),\n () => apiCall(`/api/business_rules/sets?id=${id}`, {\n method: 'DELETE',\n }),\n )\n\n if (result.ok) {\n flash(t('business_rules.sets.messages.deleted'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules', 'sets'] })\n } else {\n flash(t('business_rules.sets.messages.deleteFailed'), 'error')\n }\n }\n\n const handleToggleEnabled = async (id: string, currentEnabled: boolean) => {\n const record = (data || []).find((item) => item.id === id)\n const result = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(record?.updatedAt),\n () => apiCall('/api/business_rules/sets', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n id,\n enabled: !currentEnabled,\n }),\n }),\n )\n\n if (result.ok) {\n flash(t('business_rules.sets.messages.updated'), 'success')\n queryClient.invalidateQueries({ queryKey: ['business-rules', 'sets'] })\n } else {\n flash(t('business_rules.sets.messages.updateFailed'), 'error')\n }\n }\n\n const handleFiltersApply = React.useCallback((values: FilterValues) => {\n const next: FilterValues = {}\n Object.entries(values).forEach(([key, value]) => {\n if (value !== undefined) next[key] = value\n })\n setFilterValues(next)\n setPage(1)\n }, [setFilterValues, setPage])\n\n const handleFiltersClear = React.useCallback(() => {\n setFilterValues({})\n setPage(1)\n }, [setFilterValues, setPage])\n\n const filters: FilterDef[] = [\n {\n id: 'search',\n type: 'text',\n label: t('business_rules.filters.search'),\n placeholder: t('business_rules.sets.filters.searchPlaceholder'),\n },\n {\n id: 'enabled',\n type: 'select',\n label: t('business_rules.filters.status'),\n options: [\n { value: '', label: t('common.all') },\n { value: 'true', label: t('common.enabled') },\n { value: 'false', label: t('common.disabled') },\n ],\n },\n ]\n\n const columns: ColumnDef<RuleSet>[] = [\n {\n id: 'setId',\n header: t('business_rules.sets.fields.setId'),\n accessorKey: 'setId',\n cell: ({ row }) => (\n <Link\n href={`/backend/sets/${row.original.id}`}\n className=\"font-mono text-sm text-primary hover:underline\"\n >\n {row.original.setId}\n </Link>\n ),\n },\n {\n id: 'setName',\n header: t('business_rules.sets.fields.setName'),\n accessorKey: 'setName',\n cell: ({ row }) => (\n <div>\n <div className=\"font-medium\">{row.original.setName}</div>\n {row.original.description && (\n <div className=\"text-xs text-muted-foreground mt-0.5 line-clamp-1\">\n {row.original.description}\n </div>\n )}\n </div>\n ),\n },\n {\n id: 'enabled',\n header: t('business_rules.sets.fields.enabled'),\n accessorKey: 'enabled',\n cell: ({ row }) => (\n <button\n onClick={() => handleToggleEnabled(row.original.id, row.original.enabled)}\n className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium cursor-pointer ${\n row.original.enabled\n ? 'bg-status-success-bg text-status-success-text hover:bg-status-success-bg/80'\n : 'bg-muted text-muted-foreground hover:bg-muted/50'\n }`}\n title={t('business_rules.sets.actions.toggleEnabled')}\n >\n {row.original.enabled ? t('common.yes') : t('common.no')}\n </button>\n ),\n },\n {\n id: 'actions',\n header: '',\n cell: ({ row }) => (\n <RowActions\n items={[\n {\n id: 'edit',\n label: t('common.edit'),\n href: `/backend/sets/${row.original.id}`,\n },\n {\n id: row.original.enabled ? 'disable' : 'enable',\n label: row.original.enabled ? t('common.disable') : t('common.enable'),\n onSelect: () => handleToggleEnabled(row.original.id, row.original.enabled),\n },\n {\n id: 'delete',\n label: t('common.delete'),\n onSelect: () => handleDelete(row.original.id, row.original.setName),\n destructive: true,\n },\n ]}\n />\n ),\n },\n ]\n\n return (\n <Page>\n <PageBody>\n <DataTable\n title={t('business_rules.sets.list.title')}\n titleHeadingLevel={1}\n actions={(\n <Button asChild>\n <Link href=\"/backend/sets/create\">\n {t('business_rules.sets.actions.create')}\n </Link>\n </Button>\n )}\n columns={columns}\n data={data || []}\n filters={filters}\n filterValues={filterValues}\n onFiltersApply={handleFiltersApply}\n onFiltersClear={handleFiltersClear}\n isLoading={isLoading}\n error={error ? t('business_rules.sets.messages.loadFailed') : undefined}\n emptyState={(\n <ListEmptyState\n entityName={t('business_rules.sets.list.title')}\n createHref=\"/backend/sets/create\"\n createLabel={t('business_rules.sets.actions.create')}\n />\n )}\n pagination={{ page, pageSize, total, totalPages, totalIsCapped, onPageChange: setPage }}\n />\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -186,6 +186,7 @@ function EditCatalogCategoryPage({ params }) {
|
|
|
186
186
|
CrudForm,
|
|
187
187
|
{
|
|
188
188
|
title: t("catalog.categories.form.editTitle", "Edit category"),
|
|
189
|
+
titleHeadingLevel: 1,
|
|
189
190
|
backHref: "/backend/catalog/categories",
|
|
190
191
|
versionHistory: { resourceKind: "catalog.category", resourceId: categoryId ? String(categoryId) : "" },
|
|
191
192
|
fields,
|