@wildo-ai/saas-frontend-lib 1.1.5 → 1.1.6
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/esm/components/actions/action-bar.d.ts +15 -0
- package/dist/esm/components/actions/action-bar.d.ts.map +1 -1
- package/dist/esm/components/actions/action-bar.js +15 -0
- package/dist/esm/components/actions/action-bar.js.map +1 -1
- package/dist/esm/components/ai-elements/decision/approval.d.ts +97 -7
- package/dist/esm/components/ai-elements/decision/approval.d.ts.map +1 -1
- package/dist/esm/components/ai-elements/decision/approval.js.map +1 -1
- package/dist/esm/components/app/AppLayout_AuthenticatedRoute.d.ts.map +1 -1
- package/dist/esm/components/app/AppLayout_AuthenticatedRoute.js +8 -3
- package/dist/esm/components/app/AppLayout_AuthenticatedRoute.js.map +1 -1
- package/dist/esm/components/auth/Auth_EnrollmentRequired.d.ts.map +1 -1
- package/dist/esm/components/auth/Auth_EnrollmentRequired.js +5 -1
- package/dist/esm/components/auth/Auth_EnrollmentRequired.js.map +1 -1
- package/dist/esm/components/auth/Auth_Main.d.ts.map +1 -1
- package/dist/esm/components/auth/Auth_Main.js +1 -4
- package/dist/esm/components/auth/Auth_Main.js.map +1 -1
- package/dist/esm/components/auth/Auth_Register.d.ts.map +1 -1
- package/dist/esm/components/auth/Auth_Register.js +1 -3
- package/dist/esm/components/auth/Auth_Register.js.map +1 -1
- package/dist/esm/components/auth/StepUpAuthDialog.d.ts +7 -0
- package/dist/esm/components/auth/StepUpAuthDialog.d.ts.map +1 -1
- package/dist/esm/components/auth/StepUpAuthDialog.js +13 -7
- package/dist/esm/components/auth/StepUpAuthDialog.js.map +1 -1
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.d.ts.map +1 -1
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.js +32 -33
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.js.map +1 -1
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.d.ts.map +1 -1
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.js +18 -20
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.js.map +1 -1
- package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.d.ts.map +1 -1
- package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.js +2 -3
- package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.js.map +1 -1
- package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.d.ts +13 -16
- package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.d.ts.map +1 -1
- package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.js +18 -15
- package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.js.map +1 -1
- package/dist/esm/components/billing/billing-invoice-history.js +2 -2
- package/dist/esm/components/billing/billing-invoice-history.js.map +1 -1
- package/dist/esm/components/billing/billing-portal-link.js +2 -2
- package/dist/esm/components/billing/billing-portal-link.js.map +1 -1
- package/dist/esm/components/billing/billing-pricing-table.d.ts +33 -1
- package/dist/esm/components/billing/billing-pricing-table.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-pricing-table.js +34 -5
- package/dist/esm/components/billing/billing-pricing-table.js.map +1 -1
- package/dist/esm/components/billing/billing-subscription-status.js +2 -2
- package/dist/esm/components/billing/billing-subscription-status.js.map +1 -1
- package/dist/esm/components/billing/billing-usage-dashboard.d.ts +2 -0
- package/dist/esm/components/billing/billing-usage-dashboard.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-usage-dashboard.js +1 -0
- package/dist/esm/components/billing/billing-usage-dashboard.js.map +1 -1
- package/dist/esm/components/data-display/DisplayField.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayField.js +15 -1
- package/dist/esm/components/data-display/DisplayField.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldArray.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldArray.js +11 -0
- package/dist/esm/components/data-display/DisplayFieldArray.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldEditable.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldEditable.js +2 -2
- package/dist/esm/components/data-display/DisplayFieldEditable.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldEditableArray.d.ts +12 -2
- package/dist/esm/components/data-display/DisplayFieldEditableArray.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldEditableArray.js +3 -2
- package/dist/esm/components/data-display/DisplayFieldEditableArray.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldReadOnly.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldReadOnly.js +2 -2
- package/dist/esm/components/data-display/DisplayFieldReadOnly.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.js +8 -2
- package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.js.map +1 -1
- package/dist/esm/components/data-display/DisplayValueDispatcher.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayValueDispatcher.js +18 -4
- package/dist/esm/components/data-display/DisplayValueDispatcher.js.map +1 -1
- package/dist/esm/components/data-display/ResourceAutomaticDisplayer.d.ts.map +1 -1
- package/dist/esm/components/data-display/ResourceAutomaticDisplayer.js +61 -3
- package/dist/esm/components/data-display/ResourceAutomaticDisplayer.js.map +1 -1
- package/dist/esm/components/data-display/ResourceSummaryDisplayer.d.ts +7 -5
- package/dist/esm/components/data-display/ResourceSummaryDisplayer.d.ts.map +1 -1
- package/dist/esm/components/data-display/ResourceSummaryDisplayer.js.map +1 -1
- package/dist/esm/components/data-display/chromes/DisplayFieldChrome.d.ts +11 -1
- package/dist/esm/components/data-display/chromes/DisplayFieldChrome.d.ts.map +1 -1
- package/dist/esm/components/data-display/chromes/DisplayFieldChrome.js +36 -11
- package/dist/esm/components/data-display/chromes/DisplayFieldChrome.js.map +1 -1
- package/dist/esm/components/data-display/display-field-resolved-props.d.ts +6 -0
- package/dist/esm/components/data-display/display-field-resolved-props.d.ts.map +1 -1
- package/dist/esm/components/data-display/display-field-resolved-props.js.map +1 -1
- package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.d.ts +23 -0
- package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.d.ts.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.js +35 -0
- package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.js.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.d.ts +47 -0
- package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.d.ts.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.js +124 -0
- package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.js.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.d.ts +8 -0
- package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.d.ts.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.js +46 -0
- package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.js.map +1 -0
- package/dist/esm/components/feedback/resource-empty-state.d.ts +21 -8
- package/dist/esm/components/feedback/resource-empty-state.d.ts.map +1 -1
- package/dist/esm/components/feedback/resource-empty-state.js +56 -26
- package/dist/esm/components/feedback/resource-empty-state.js.map +1 -1
- package/dist/esm/components/flows-actors/approval.d.ts +29 -7
- package/dist/esm/components/flows-actors/approval.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/approval.js +231 -101
- package/dist/esm/components/flows-actors/approval.js.map +1 -1
- package/dist/esm/components/flows-actors/approval.labels.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/approval.labels.js +57 -0
- package/dist/esm/components/flows-actors/approval.labels.js.map +1 -1
- package/dist/esm/components/flows-actors/system-catalog.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/system-catalog.js +4 -4
- package/dist/esm/components/flows-actors/system-catalog.js.map +1 -1
- package/dist/esm/components/flows-actors/system-catalog.labels.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/system-catalog.labels.js +0 -5
- package/dist/esm/components/flows-actors/system-catalog.labels.js.map +1 -1
- package/dist/esm/components/form/Form.d.ts +2 -2
- package/dist/esm/components/form/Form.js +2 -2
- package/dist/esm/components/form/Form.js.map +1 -1
- package/dist/esm/components/form/automated/AutomatedArrayField.d.ts +28 -3
- package/dist/esm/components/form/automated/AutomatedArrayField.d.ts.map +1 -1
- package/dist/esm/components/form/automated/AutomatedArrayField.js +43 -14
- package/dist/esm/components/form/automated/AutomatedArrayField.js.map +1 -1
- package/dist/esm/components/form/automated/FormField.d.ts +3 -0
- package/dist/esm/components/form/automated/FormField.d.ts.map +1 -1
- package/dist/esm/components/form/automated/FormField.js +60 -21
- package/dist/esm/components/form/automated/FormField.js.map +1 -1
- package/dist/esm/components/form/automated/FormFieldArray.d.ts +6 -3
- package/dist/esm/components/form/automated/FormFieldArray.d.ts.map +1 -1
- package/dist/esm/components/form/automated/FormFieldArray.js +3 -2
- package/dist/esm/components/form/automated/FormFieldArray.js.map +1 -1
- package/dist/esm/components/form/automated/ResourceAutomatedForm.d.ts +5 -4
- package/dist/esm/components/form/automated/ResourceAutomatedForm.d.ts.map +1 -1
- package/dist/esm/components/form/automated/ResourceAutomatedForm.js +148 -55
- package/dist/esm/components/form/automated/ResourceAutomatedForm.js.map +1 -1
- package/dist/esm/components/form/automated/ResourceFormActionsContext.d.ts +30 -0
- package/dist/esm/components/form/automated/ResourceFormActionsContext.d.ts.map +1 -1
- package/dist/esm/components/form/automated/ResourceFormActionsContext.js +30 -1
- package/dist/esm/components/form/automated/ResourceFormActionsContext.js.map +1 -1
- package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.d.ts +79 -0
- package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.d.ts.map +1 -0
- package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.js +203 -0
- package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.js.map +1 -0
- package/dist/esm/components/form/automated/automated-form-submit.utils.d.ts +12 -0
- package/dist/esm/components/form/automated/automated-form-submit.utils.d.ts.map +1 -1
- package/dist/esm/components/form/automated/automated-form-submit.utils.js +11 -0
- package/dist/esm/components/form/automated/automated-form-submit.utils.js.map +1 -1
- package/dist/esm/components/form/chromes/FormFieldChrome.d.ts.map +1 -1
- package/dist/esm/components/form/chromes/FormFieldChrome.js +2 -2
- package/dist/esm/components/form/chromes/FormFieldChrome.js.map +1 -1
- package/dist/esm/components/form/combobox.d.ts +7 -0
- package/dist/esm/components/form/combobox.d.ts.map +1 -1
- package/dist/esm/components/form/combobox.js.map +1 -1
- package/dist/esm/components/form/controls/form-field-checkbox-group.d.ts.map +1 -1
- package/dist/esm/components/form/controls/form-field-checkbox-group.js +13 -0
- package/dist/esm/components/form/controls/form-field-checkbox-group.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-address.d.ts +58 -0
- package/dist/esm/components/form/fields/form-field-address.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-address.js +34 -6
- package/dist/esm/components/form/fields/form-field-address.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-address.labels.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-address.labels.js +60 -1
- package/dist/esm/components/form/fields/form-field-address.labels.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.d.ts +0 -12
- package/dist/esm/components/form/fields/form-field-file.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.js +34 -13
- package/dist/esm/components/form/fields/form-field-file.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.labels.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.labels.js +46 -0
- package/dist/esm/components/form/fields/form-field-file.labels.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-string-organization-role.d.ts +73 -0
- package/dist/esm/components/form/fields/form-field-string-organization-role.d.ts.map +1 -0
- package/dist/esm/components/form/fields/form-field-string-organization-role.js +64 -0
- package/dist/esm/components/form/fields/form-field-string-organization-role.js.map +1 -0
- package/dist/esm/components/form/fields/form-field-string.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-string.js +8 -1
- package/dist/esm/components/form/fields/form-field-string.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-string.labels.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-string.labels.js +4 -0
- package/dist/esm/components/form/fields/form-field-string.labels.js.map +1 -1
- package/dist/esm/components/form/validation-errors/FormErrorSummary.js +1 -1
- package/dist/esm/components/form/validation-errors/FormErrorSummary.js.map +1 -1
- package/dist/esm/components/form/validation-errors/resolver-error-nesting.d.ts +31 -0
- package/dist/esm/components/form/validation-errors/resolver-error-nesting.d.ts.map +1 -0
- package/dist/esm/components/form/validation-errors/resolver-error-nesting.js +81 -0
- package/dist/esm/components/form/validation-errors/resolver-error-nesting.js.map +1 -0
- package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.d.ts +14 -1
- package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.d.ts.map +1 -1
- package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.js +14 -0
- package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.js.map +1 -1
- package/dist/esm/components/form/validation-errors/zod-issue-resolver.d.ts +22 -0
- package/dist/esm/components/form/validation-errors/zod-issue-resolver.d.ts.map +1 -1
- package/dist/esm/components/form/validation-errors/zod-issue-resolver.js +1 -22
- package/dist/esm/components/form/validation-errors/zod-issue-resolver.js.map +1 -1
- package/dist/esm/components/layout/resizable.d.ts +11 -0
- package/dist/esm/components/layout/resizable.d.ts.map +1 -1
- package/dist/esm/components/layout/resizable.js.map +1 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.d.ts +11 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.js +15 -3
- package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.js.map +1 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.d.ts +2 -2
- package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.js.map +1 -1
- package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.d.ts +2 -2
- package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.js +2 -2
- package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.js.map +1 -1
- package/dist/esm/components/navigation/app-level/SidebarResourceBrowser.js +18 -20
- package/dist/esm/components/navigation/app-level/SidebarResourceBrowser.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.js +7 -1
- package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useMenuBarBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useMenuBarBehavior.js +4 -1
- package/dist/esm/components/navigation/app-level/useMenuBarBehavior.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.js +18 -2
- package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useSidebarBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useSidebarBehavior.js +82 -10
- package/dist/esm/components/navigation/app-level/useSidebarBehavior.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useStatusBarBehavior.d.ts +2 -2
- package/dist/esm/components/navigation/app-level/useStatusBarBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useStatusBarBehavior.js.map +1 -1
- package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.js +8 -1
- package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.js.map +1 -1
- package/dist/esm/components/resources/ResourceCollectionToolbar.d.ts +8 -2
- package/dist/esm/components/resources/ResourceCollectionToolbar.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceCollectionToolbar.js +6 -2
- package/dist/esm/components/resources/ResourceCollectionToolbar.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Breadcrumb.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Breadcrumb.js +31 -16
- package/dist/esm/components/resources/ResourceLayout_Breadcrumb.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.js +23 -8
- package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ContainerNested.js +2 -2
- package/dist/esm/components/resources/ResourceLayout_ContainerNested.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Header.d.ts +13 -0
- package/dist/esm/components/resources/ResourceLayout_Header.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Header.js +55 -28
- package/dist/esm/components/resources/ResourceLayout_Header.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_List.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_List.js +41 -20
- package/dist/esm/components/resources/ResourceLayout_List.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_List.labels.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_List.labels.js +1 -2
- package/dist/esm/components/resources/ResourceLayout_List.labels.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Read.d.ts +9 -4
- package/dist/esm/components/resources/ResourceLayout_Read.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Read.js +30 -11
- package/dist/esm/components/resources/ResourceLayout_Read.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ReadSummary.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ReadSummary.js +4 -2
- package/dist/esm/components/resources/ResourceLayout_ReadSummary.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.js +6 -2
- package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Search.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Search.js +30 -14
- package/dist/esm/components/resources/ResourceLayout_Search.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.js +14 -198
- package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Update.d.ts +2 -2
- package/dist/esm/components/resources/ResourceLayout_Update.js +2 -2
- package/dist/esm/components/resources/ResourceLayout_Update.js.map +1 -1
- package/dist/esm/components/resources/ResourceListItemRenderer.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceListItemRenderer.js +69 -39
- package/dist/esm/components/resources/ResourceListItemRenderer.js.map +1 -1
- package/dist/esm/components/resources/ResourceOperationActionDropdown.d.ts +32 -0
- package/dist/esm/components/resources/ResourceOperationActionDropdown.d.ts.map +1 -0
- package/dist/esm/components/resources/ResourceOperationActionDropdown.js +130 -0
- package/dist/esm/components/resources/ResourceOperationActionDropdown.js.map +1 -0
- package/dist/esm/components/resources/collection-create-placement.utils.d.ts +32 -0
- package/dist/esm/components/resources/collection-create-placement.utils.d.ts.map +1 -0
- package/dist/esm/components/resources/collection-create-placement.utils.js +37 -0
- package/dist/esm/components/resources/collection-create-placement.utils.js.map +1 -0
- package/dist/esm/components/resources/embeds/RelatedResourcePreview.d.ts.map +1 -1
- package/dist/esm/components/resources/embeds/RelatedResourcePreview.js +5 -1
- package/dist/esm/components/resources/embeds/RelatedResourcePreview.js.map +1 -1
- package/dist/esm/components/resources/embeds/RelatedResourceSections.d.ts +8 -1
- package/dist/esm/components/resources/embeds/RelatedResourceSections.d.ts.map +1 -1
- package/dist/esm/components/resources/embeds/RelatedResourceSections.js +49 -2
- package/dist/esm/components/resources/embeds/RelatedResourceSections.js.map +1 -1
- package/dist/esm/components/resources/embeds/ResourceEmbeds.d.ts +22 -0
- package/dist/esm/components/resources/embeds/ResourceEmbeds.d.ts.map +1 -1
- package/dist/esm/components/resources/embeds/ResourceEmbeds.js +85 -2
- package/dist/esm/components/resources/embeds/ResourceEmbeds.js.map +1 -1
- package/dist/esm/components/resources/resourceLayout.utils.d.ts +14 -0
- package/dist/esm/components/resources/resourceLayout.utils.d.ts.map +1 -1
- package/dist/esm/components/resources/resourceLayout.utils.js +22 -0
- package/dist/esm/components/resources/resourceLayout.utils.js.map +1 -1
- package/dist/esm/components/resources/skeleton/ArrayField.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/ArrayField.js +3 -0
- package/dist/esm/components/resources/skeleton/ArrayField.js.map +1 -1
- package/dist/esm/components/resources/skeleton/FormLayout.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/FormLayout.js +33 -1
- package/dist/esm/components/resources/skeleton/FormLayout.js.map +1 -1
- package/dist/esm/components/resources/skeleton/ObjectScope.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/ObjectScope.js +3 -0
- package/dist/esm/components/resources/skeleton/ObjectScope.js.map +1 -1
- package/dist/esm/components/resources/skeleton/Section.d.ts +12 -0
- package/dist/esm/components/resources/skeleton/Section.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/Section.js +28 -2
- package/dist/esm/components/resources/skeleton/Section.js.map +1 -1
- package/dist/esm/components/resources/skeleton/SectionFieldsContext.d.ts +70 -0
- package/dist/esm/components/resources/skeleton/SectionFieldsContext.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/SectionFieldsContext.js +157 -1
- package/dist/esm/components/resources/skeleton/SectionFieldsContext.js.map +1 -1
- package/dist/esm/components/resources/skeleton/WizardLayout.d.ts +6 -0
- package/dist/esm/components/resources/skeleton/WizardLayout.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/WizardLayout.js +13 -2
- package/dist/esm/components/resources/skeleton/WizardLayout.js.map +1 -1
- package/dist/esm/components/resources/skeleton/WizardStep.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/WizardStep.js +2 -1
- package/dist/esm/components/resources/skeleton/WizardStep.js.map +1 -1
- package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.d.ts.map +1 -1
- package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.js +61 -15
- package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.js.map +1 -1
- package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.d.ts +24 -2
- package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.d.ts.map +1 -1
- package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.js +69 -1
- package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.js.map +1 -1
- package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.d.ts.map +1 -1
- package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.js +18 -19
- package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.js.map +1 -1
- package/dist/esm/components/sections/ContentSectionContainer.d.ts.map +1 -1
- package/dist/esm/components/sections/ContentSectionContainer.js +5 -4
- package/dist/esm/components/sections/ContentSectionContainer.js.map +1 -1
- package/dist/esm/components/sections/stepper.d.ts +5 -0
- package/dist/esm/components/sections/stepper.d.ts.map +1 -1
- package/dist/esm/components/sections/stepper.js.map +1 -1
- package/dist/esm/components/sections/surface.d.ts.map +1 -1
- package/dist/esm/components/sections/surface.js +12 -3
- package/dist/esm/components/sections/surface.js.map +1 -1
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.d.ts +43 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.d.ts.map +1 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.js +129 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.js.map +1 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.d.ts +3 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.d.ts.map +1 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.js +34 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.js.map +1 -0
- package/dist/esm/components/settings/AppPage_AppearanceSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_AppearanceSettings.js +9 -11
- package/dist/esm/components/settings/AppPage_AppearanceSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.js +3 -2
- package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/AppPage_BillingSettings.d.ts +4 -2
- package/dist/esm/components/settings/AppPage_BillingSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_BillingSettings.js +21 -3
- package/dist/esm/components/settings/AppPage_BillingSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_BillingSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_BillingSettings.labels.js +5 -10
- package/dist/esm/components/settings/AppPage_BillingSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.d.ts +58 -0
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.js +243 -40
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.js +67 -6
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/AppPage_InvitationsSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_InvitationsSettings.js +19 -11
- package/dist/esm/components/settings/AppPage_InvitationsSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.js +4 -2
- package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/SettingsHub.d.ts.map +1 -1
- package/dist/esm/components/settings/SettingsHub.js +3 -0
- package/dist/esm/components/settings/SettingsHub.js.map +1 -1
- package/dist/esm/components/settings/SettingsResourceOperationPanel.d.ts.map +1 -1
- package/dist/esm/components/settings/SettingsResourceOperationPanel.js +16 -1
- package/dist/esm/components/settings/SettingsResourceOperationPanel.js.map +1 -1
- package/dist/esm/components/settings/useOwnerProviderConnections.d.ts +59 -0
- package/dist/esm/components/settings/useOwnerProviderConnections.d.ts.map +1 -0
- package/dist/esm/components/settings/useOwnerProviderConnections.js +136 -0
- package/dist/esm/components/settings/useOwnerProviderConnections.js.map +1 -0
- package/dist/esm/components/views/chart-view/chart-view.utils.d.ts +5 -0
- package/dist/esm/components/views/chart-view/chart-view.utils.d.ts.map +1 -1
- package/dist/esm/components/views/chart-view/chart-view.utils.js +5 -0
- package/dist/esm/components/views/chart-view/chart-view.utils.js.map +1 -1
- package/dist/esm/components/views/chart-view/useResourceChartData.d.ts +50 -0
- package/dist/esm/components/views/chart-view/useResourceChartData.d.ts.map +1 -0
- package/dist/esm/components/views/chart-view/useResourceChartData.js +72 -0
- package/dist/esm/components/views/chart-view/useResourceChartData.js.map +1 -0
- package/dist/esm/components/views/composite-view/CompositeLayout.d.ts.map +1 -1
- package/dist/esm/components/views/composite-view/CompositeLayout.js +2 -1
- package/dist/esm/components/views/composite-view/CompositeLayout.js.map +1 -1
- package/dist/esm/core/app-shell/AppShellBuildingBlocks.d.ts +86 -0
- package/dist/esm/core/app-shell/AppShellBuildingBlocks.d.ts.map +1 -0
- package/dist/esm/core/app-shell/AppShellBuildingBlocks.js +187 -0
- package/dist/esm/core/app-shell/AppShellBuildingBlocks.js.map +1 -0
- package/dist/esm/core/app-shell/PortalContainerContext.d.ts +5 -2
- package/dist/esm/core/app-shell/PortalContainerContext.d.ts.map +1 -1
- package/dist/esm/core/app-shell/PortalContainerContext.js +5 -2
- package/dist/esm/core/app-shell/PortalContainerContext.js.map +1 -1
- package/dist/esm/core/app-shell/app-shell.schemas.d.ts +18 -9
- package/dist/esm/core/app-shell/app-shell.schemas.d.ts.map +1 -1
- package/dist/esm/core/app-shell/app-shell.schemas.js +1 -0
- package/dist/esm/core/app-shell/app-shell.schemas.js.map +1 -1
- package/dist/esm/core/app-shell/useAppShellLayout.d.ts +10 -0
- package/dist/esm/core/app-shell/useAppShellLayout.d.ts.map +1 -1
- package/dist/esm/core/app-shell/useAppShellLayout.js +28 -5
- package/dist/esm/core/app-shell/useAppShellLayout.js.map +1 -1
- package/dist/esm/core/app-shell/usePublicShellLayout.d.ts.map +1 -1
- package/dist/esm/core/app-shell/usePublicShellLayout.js +38 -0
- package/dist/esm/core/app-shell/usePublicShellLayout.js.map +1 -1
- package/dist/esm/core/automated-layout/automated-layout.frontend.utils.d.ts +15 -1
- package/dist/esm/core/automated-layout/automated-layout.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/automated-layout/automated-layout.frontend.utils.js +47 -13
- package/dist/esm/core/automated-layout/automated-layout.frontend.utils.js.map +1 -1
- package/dist/esm/core/billing/BillingContext.d.ts +25 -2
- package/dist/esm/core/billing/BillingContext.d.ts.map +1 -1
- package/dist/esm/core/billing/BillingContext.js +16 -25
- package/dist/esm/core/billing/BillingContext.js.map +1 -1
- package/dist/esm/core/billing/billing-provider-display.frontend.utils.d.ts +11 -3
- package/dist/esm/core/billing/billing-provider-display.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/billing/billing-provider-display.frontend.utils.js +14 -8
- package/dist/esm/core/billing/billing-provider-display.frontend.utils.js.map +1 -1
- package/dist/esm/core/billing/useBillingPlanChange.d.ts.map +1 -1
- package/dist/esm/core/billing/useBillingPlanChange.js +2 -0
- package/dist/esm/core/billing/useBillingPlanChange.js.map +1 -1
- package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.d.ts.map +1 -1
- package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.js +1 -0
- package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.js.map +1 -1
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.d.ts +29 -229
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.js +29 -327
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.js.map +1 -1
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.d.ts +17 -27
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.d.ts.map +1 -1
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.js +28 -48
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.js.map +1 -1
- package/dist/esm/core/config/app-configuration-frontend.schemas.d.ts +21 -11
- package/dist/esm/core/config/app-configuration-frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/app-configuration-frontend.schemas.js +4 -4
- package/dist/esm/core/config/app-configuration-frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/app-level-components.frontend.schemas.d.ts +17 -0
- package/dist/esm/core/config/app-level-components.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/app-level-components.frontend.schemas.js +17 -0
- package/dist/esm/core/config/app-level-components.frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/chart-view.frontend.schemas.d.ts +10 -10
- package/dist/esm/core/config/engine-settings-destinations.d.ts.map +1 -1
- package/dist/esm/core/config/engine-settings-destinations.js +221 -6
- package/dist/esm/core/config/engine-settings-destinations.js.map +1 -1
- package/dist/esm/core/config/launcher-items.frontend.schemas.d.ts +8 -0
- package/dist/esm/core/config/launcher-items.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/launcher-items.frontend.schemas.js +1 -0
- package/dist/esm/core/config/launcher-items.frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/settings-hub.frontend.schemas.d.ts +10 -1
- package/dist/esm/core/config/settings-hub.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/settings-hub.frontend.schemas.js +9 -0
- package/dist/esm/core/config/settings-hub.frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/verify-launcher-content.d.ts.map +1 -1
- package/dist/esm/core/config/verify-launcher-content.js +30 -19
- package/dist/esm/core/config/verify-launcher-content.js.map +1 -1
- package/dist/esm/core/errors/ErrorContext.d.ts.map +1 -1
- package/dist/esm/core/errors/ErrorContext.js +9 -1
- package/dist/esm/core/errors/ErrorContext.js.map +1 -1
- package/dist/esm/core/errors/GlobalErrorHandler.d.ts.map +1 -1
- package/dist/esm/core/errors/GlobalErrorHandler.js +5 -4
- package/dist/esm/core/errors/GlobalErrorHandler.js.map +1 -1
- package/dist/esm/core/errors/RouterErrorBoundary.js +1 -1
- package/dist/esm/core/errors/RouterErrorBoundary.js.map +1 -1
- package/dist/esm/core/errors/errors-builder.frontend.services.d.ts +2 -2
- package/dist/esm/core/errors/errors-builder.frontend.services.d.ts.map +1 -1
- package/dist/esm/core/errors/errors-builder.frontend.services.js +4 -4
- package/dist/esm/core/errors/errors-builder.frontend.services.js.map +1 -1
- package/dist/esm/core/errors/user-facing-error-message.frontend.utils.js +1 -1
- package/dist/esm/core/errors/user-facing-error-message.frontend.utils.js.map +1 -1
- package/dist/esm/core/events/NotificationContext.d.ts.map +1 -1
- package/dist/esm/core/events/NotificationContext.js +23 -5
- package/dist/esm/core/events/NotificationContext.js.map +1 -1
- package/dist/esm/core/events/events.frontend.schemas.d.ts +110 -43
- package/dist/esm/core/events/events.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/events/events.frontend.schemas.js +89 -15
- package/dist/esm/core/events/events.frontend.schemas.js.map +1 -1
- package/dist/esm/core/execution/useExecutionParticipationRMM.d.ts +2 -0
- package/dist/esm/core/execution/useExecutionParticipationRMM.d.ts.map +1 -1
- package/dist/esm/core/execution/useExecutionParticipationRMM.js +2 -1
- package/dist/esm/core/execution/useExecutionParticipationRMM.js.map +1 -1
- package/dist/esm/core/execution/useExecutionResourceOperationSurface.d.ts +1 -1
- package/dist/esm/core/execution/useExecutionResourceOperationSurface.d.ts.map +1 -1
- package/dist/esm/core/execution/useExecutionResourceOperationSurface.js +5 -2
- package/dist/esm/core/execution/useExecutionResourceOperationSurface.js.map +1 -1
- package/dist/esm/core/external-providers/ConsentBasedProviderSdks.d.ts +63 -0
- package/dist/esm/core/external-providers/ConsentBasedProviderSdks.d.ts.map +1 -0
- package/dist/esm/core/external-providers/ConsentBasedProviderSdks.js +131 -0
- package/dist/esm/core/external-providers/ConsentBasedProviderSdks.js.map +1 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.d.ts +61 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.d.ts.map +1 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.js +178 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.js.map +1 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupHost.d.ts +52 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupHost.d.ts.map +1 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupHost.js +144 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupHost.js.map +1 -0
- package/dist/esm/core/external-providers/ProviderFilePickerHost.d.ts +22 -1
- package/dist/esm/core/external-providers/ProviderFilePickerHost.d.ts.map +1 -1
- package/dist/esm/core/external-providers/ProviderFilePickerHost.js +23 -3
- package/dist/esm/core/external-providers/ProviderFilePickerHost.js.map +1 -1
- package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.d.ts +55 -0
- package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.d.ts.map +1 -0
- package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.js +65 -0
- package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.js.map +1 -0
- package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.d.ts +63 -0
- package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.d.ts.map +1 -0
- package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.js +100 -0
- package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.js.map +1 -0
- package/dist/esm/core/flows-actors/FlowsActorsContext.d.ts +45 -7
- package/dist/esm/core/flows-actors/FlowsActorsContext.d.ts.map +1 -1
- package/dist/esm/core/flows-actors/FlowsActorsContext.js +112 -28
- package/dist/esm/core/flows-actors/FlowsActorsContext.js.map +1 -1
- package/dist/esm/core/flows-actors/usePendingDecisions.d.ts +32 -0
- package/dist/esm/core/flows-actors/usePendingDecisions.d.ts.map +1 -0
- package/dist/esm/core/flows-actors/usePendingDecisions.js +91 -0
- package/dist/esm/core/flows-actors/usePendingDecisions.js.map +1 -0
- package/dist/esm/core/guidance/GuidanceRenderer.d.ts.map +1 -1
- package/dist/esm/core/guidance/GuidanceRenderer.js +3 -2
- package/dist/esm/core/guidance/GuidanceRenderer.js.map +1 -1
- package/dist/esm/core/i18n/I18nContext.d.ts +22 -8
- package/dist/esm/core/i18n/I18nContext.d.ts.map +1 -1
- package/dist/esm/core/i18n/I18nContext.js +21 -9
- package/dist/esm/core/i18n/I18nContext.js.map +1 -1
- package/dist/esm/core/i18n/component-label-resolution.utils.d.ts +5 -3
- package/dist/esm/core/i18n/component-label-resolution.utils.d.ts.map +1 -1
- package/dist/esm/core/i18n/component-label-resolution.utils.js +5 -3
- package/dist/esm/core/i18n/component-label-resolution.utils.js.map +1 -1
- package/dist/esm/core/i18n/useI18n.d.ts +2 -1
- package/dist/esm/core/i18n/useI18n.d.ts.map +1 -1
- package/dist/esm/core/i18n/useI18n.js +2 -1
- package/dist/esm/core/i18n/useI18n.js.map +1 -1
- package/dist/esm/core/loading/LoadingContext.d.ts.map +1 -1
- package/dist/esm/core/loading/LoadingContext.js +7 -1
- package/dist/esm/core/loading/LoadingContext.js.map +1 -1
- package/dist/esm/core/loading/LoadingGate.d.ts.map +1 -1
- package/dist/esm/core/loading/LoadingGate.js +19 -1
- package/dist/esm/core/loading/LoadingGate.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/AnalyticsContext.d.ts +15 -2
- package/dist/esm/core/monitoring/analytics/AnalyticsContext.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/AnalyticsContext.js +183 -20
- package/dist/esm/core/monitoring/analytics/AnalyticsContext.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/AnalyticsEventBridge.js +2 -2
- package/dist/esm/core/monitoring/analytics/AnalyticsEventBridge.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.d.ts +7 -15
- package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.js +8 -26
- package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.d.ts +12 -3
- package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.js +3 -2
- package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.d.ts +42 -0
- package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.js +89 -5
- package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.d.ts +2 -0
- package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.js +2 -0
- package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.js.map +1 -1
- package/dist/esm/core/navigation/NavigationContentAreas.d.ts +78 -0
- package/dist/esm/core/navigation/NavigationContentAreas.d.ts.map +1 -1
- package/dist/esm/core/navigation/NavigationContentAreas.js +264 -16
- package/dist/esm/core/navigation/NavigationContentAreas.js.map +1 -1
- package/dist/esm/core/navigation/NavigationContext.d.ts +8 -0
- package/dist/esm/core/navigation/NavigationContext.d.ts.map +1 -1
- package/dist/esm/core/navigation/NavigationContext.js +137 -30
- package/dist/esm/core/navigation/NavigationContext.js.map +1 -1
- package/dist/esm/core/navigation/launcher-resolution.d.ts +2 -0
- package/dist/esm/core/navigation/launcher-resolution.d.ts.map +1 -1
- package/dist/esm/core/navigation/launcher-resolution.js +1 -0
- package/dist/esm/core/navigation/launcher-resolution.js.map +1 -1
- package/dist/esm/core/navigation/navigation-cascade.d.ts +46 -0
- package/dist/esm/core/navigation/navigation-cascade.d.ts.map +1 -0
- package/dist/esm/core/navigation/navigation-cascade.js +222 -0
- package/dist/esm/core/navigation/navigation-cascade.js.map +1 -0
- package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.js +21 -2
- package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.js.map +1 -1
- package/dist/esm/core/navigation/navigation-controller-internals.d.ts +71 -0
- package/dist/esm/core/navigation/navigation-controller-internals.d.ts.map +1 -0
- package/dist/esm/core/navigation/navigation-controller-internals.js +84 -0
- package/dist/esm/core/navigation/navigation-controller-internals.js.map +1 -0
- package/dist/esm/core/navigation/navigation-policy-resolver.service.d.ts +86 -2
- package/dist/esm/core/navigation/navigation-policy-resolver.service.d.ts.map +1 -1
- package/dist/esm/core/navigation/navigation-policy-resolver.service.js +242 -124
- package/dist/esm/core/navigation/navigation-policy-resolver.service.js.map +1 -1
- package/dist/esm/core/navigation/navigation.schemas.d.ts +170 -8
- package/dist/esm/core/navigation/navigation.schemas.d.ts.map +1 -1
- package/dist/esm/core/navigation/navigation.schemas.js +121 -2
- package/dist/esm/core/navigation/navigation.schemas.js.map +1 -1
- package/dist/esm/core/navigation/navigation.utils.d.ts +102 -6
- package/dist/esm/core/navigation/navigation.utils.d.ts.map +1 -1
- package/dist/esm/core/navigation/navigation.utils.js +283 -34
- package/dist/esm/core/navigation/navigation.utils.js.map +1 -1
- package/dist/esm/core/navigation/useIsStackEntryActive.d.ts +0 -10
- package/dist/esm/core/navigation/useIsStackEntryActive.d.ts.map +0 -1
- package/dist/esm/core/navigation/useIsStackEntryActive.js.map +0 -1
- package/dist/esm/core/navigation/useNavigationController.d.ts +28 -157
- package/dist/esm/core/navigation/useNavigationController.d.ts.map +1 -1
- package/dist/esm/core/navigation/useNavigationController.js +211 -1189
- package/dist/esm/core/navigation/useNavigationController.js.map +1 -1
- package/dist/esm/core/navigation/useNavigationRouterSync.d.ts +174 -0
- package/dist/esm/core/navigation/useNavigationRouterSync.d.ts.map +1 -0
- package/dist/esm/core/navigation/useNavigationRouterSync.js +977 -0
- package/dist/esm/core/navigation/useNavigationRouterSync.js.map +1 -0
- package/dist/esm/core/navigation/useOverlayTitle.d.ts +13 -1
- package/dist/esm/core/navigation/useOverlayTitle.d.ts.map +1 -1
- package/dist/esm/core/navigation/useOverlayTitle.js +15 -10
- package/dist/esm/core/navigation/useOverlayTitle.js.map +1 -1
- package/dist/esm/core/navigation/useResponsiveZoneMigration.d.ts +43 -0
- package/dist/esm/core/navigation/useResponsiveZoneMigration.d.ts.map +1 -0
- package/dist/esm/core/navigation/useResponsiveZoneMigration.js +44 -0
- package/dist/esm/core/navigation/useResponsiveZoneMigration.js.map +1 -0
- package/dist/esm/core/navigation/zone-collapse-migration.d.ts +83 -0
- package/dist/esm/core/navigation/zone-collapse-migration.d.ts.map +1 -0
- package/dist/esm/core/navigation/zone-collapse-migration.js +116 -0
- package/dist/esm/core/navigation/zone-collapse-migration.js.map +1 -0
- package/dist/esm/core/navigation/zone-collapse.d.ts +51 -0
- package/dist/esm/core/navigation/zone-collapse.d.ts.map +1 -0
- package/dist/esm/core/navigation/zone-collapse.js +59 -0
- package/dist/esm/core/navigation/zone-collapse.js.map +1 -0
- package/dist/esm/core/navigation/zone-emphasis.d.ts +3 -0
- package/dist/esm/core/navigation/zone-emphasis.d.ts.map +1 -1
- package/dist/esm/core/navigation/zone-emphasis.js +26 -4
- package/dist/esm/core/navigation/zone-emphasis.js.map +1 -1
- package/dist/esm/core/navigation/zone-visible-entry.d.ts +22 -0
- package/dist/esm/core/navigation/zone-visible-entry.d.ts.map +1 -1
- package/dist/esm/core/navigation/zone-visible-entry.js +25 -0
- package/dist/esm/core/navigation/zone-visible-entry.js.map +1 -1
- package/dist/esm/core/requests/websockets/WebSocketContext.d.ts.map +1 -1
- package/dist/esm/core/requests/websockets/WebSocketContext.js +53 -18
- package/dist/esm/core/requests/websockets/WebSocketContext.js.map +1 -1
- package/dist/esm/core/requests/websockets/WebSocketEventBridge.d.ts.map +1 -1
- package/dist/esm/core/requests/websockets/WebSocketEventBridge.js +3 -1
- package/dist/esm/core/requests/websockets/WebSocketEventBridge.js.map +1 -1
- package/dist/esm/core/requests/websockets/useNotificationBadges.d.ts +22 -0
- package/dist/esm/core/requests/websockets/useNotificationBadges.d.ts.map +1 -1
- package/dist/esm/core/requests/websockets/useNotificationBadges.js +72 -3
- package/dist/esm/core/requests/websockets/useNotificationBadges.js.map +1 -1
- package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.d.ts +28 -0
- package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.d.ts.map +1 -0
- package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.js +86 -0
- package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.js.map +1 -0
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.d.ts +38 -3
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.js +57 -2
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.js.map +1 -1
- package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.js +4 -2
- package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.js.map +1 -1
- package/dist/esm/core/requests/wildo-http-client.frontend.service.d.ts +30 -1
- package/dist/esm/core/requests/wildo-http-client.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/requests/wildo-http-client.frontend.service.js +47 -4
- package/dist/esm/core/requests/wildo-http-client.frontend.service.js.map +1 -1
- package/dist/esm/core/resources/ResourceRegistryContext.d.ts.map +1 -1
- package/dist/esm/core/resources/ResourceRegistryContext.js +22 -1
- package/dist/esm/core/resources/ResourceRegistryContext.js.map +1 -1
- package/dist/esm/core/resources/context-resource-identifiers.frontend.utils.js +1 -1
- package/dist/esm/core/resources/context-resource-identifiers.frontend.utils.js.map +1 -1
- package/dist/esm/core/resources/frontend-resource.utils.d.ts +22 -1
- package/dist/esm/core/resources/frontend-resource.utils.d.ts.map +1 -1
- package/dist/esm/core/resources/frontend-resource.utils.js +25 -2
- package/dist/esm/core/resources/frontend-resource.utils.js.map +1 -1
- package/dist/esm/core/resources/operation-semantics.frontend.utils.d.ts +113 -13
- package/dist/esm/core/resources/operation-semantics.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/resources/operation-semantics.frontend.utils.js +173 -20
- package/dist/esm/core/resources/operation-semantics.frontend.utils.js.map +1 -1
- package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.d.ts +11 -0
- package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.js +7 -0
- package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.js.map +1 -1
- package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.d.ts +3 -2
- package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.js +13 -5
- package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.js.map +1 -1
- package/dist/esm/core/resources/resources-repository.frontend.service.d.ts +6 -0
- package/dist/esm/core/resources/resources-repository.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/resources/resources-repository.frontend.service.js +90 -1
- package/dist/esm/core/resources/resources-repository.frontend.service.js.map +1 -1
- package/dist/esm/core/resources/resources.frontend.schemas.d.ts +139 -16
- package/dist/esm/core/resources/resources.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/resources/resources.frontend.schemas.js +110 -11
- package/dist/esm/core/resources/resources.frontend.schemas.js.map +1 -1
- package/dist/esm/core/resources/rmm/ResourceMutationManager.d.ts.map +1 -1
- package/dist/esm/core/resources/rmm/ResourceMutationManager.js +3 -1
- package/dist/esm/core/resources/rmm/ResourceMutationManager.js.map +1 -1
- package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.d.ts +10 -0
- package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.d.ts.map +1 -1
- package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.js +8 -0
- package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.js.map +1 -1
- package/dist/esm/core/resources/rmm/useResourceRMM.d.ts +7 -0
- package/dist/esm/core/resources/rmm/useResourceRMM.d.ts.map +1 -1
- package/dist/esm/core/resources/rmm/useResourceRMM.js +9 -2
- package/dist/esm/core/resources/rmm/useResourceRMM.js.map +1 -1
- package/dist/esm/core/resources/useOperationDirectExecution.d.ts +59 -0
- package/dist/esm/core/resources/useOperationDirectExecution.d.ts.map +1 -0
- package/dist/esm/core/resources/useOperationDirectExecution.js +278 -0
- package/dist/esm/core/resources/useOperationDirectExecution.js.map +1 -0
- package/dist/esm/core/resources/useResourceOperationActions.d.ts +1 -1
- package/dist/esm/core/resources/useResourceOperationActions.d.ts.map +1 -1
- package/dist/esm/core/resources/useResourceOperationActions.js +69 -22
- package/dist/esm/core/resources/useResourceOperationActions.js.map +1 -1
- package/dist/esm/core/resources/useResourceOperationSurface.d.ts +8 -6
- package/dist/esm/core/resources/useResourceOperationSurface.d.ts.map +1 -1
- package/dist/esm/core/resources/useResourceOperationSurface.js +3 -2
- package/dist/esm/core/resources/useResourceOperationSurface.js.map +1 -1
- package/dist/esm/core/runtime/AppRouter.d.ts.map +1 -1
- package/dist/esm/core/runtime/AppRouter.js +23 -2
- package/dist/esm/core/runtime/AppRouter.js.map +1 -1
- package/dist/esm/core/runtime/ApplicationContext.shared.d.ts +4 -2
- package/dist/esm/core/runtime/ApplicationContext.shared.d.ts.map +1 -1
- package/dist/esm/core/runtime/ApplicationContext.shared.js.map +1 -1
- package/dist/esm/core/runtime/ApplicationMainContext.d.ts +12 -2
- package/dist/esm/core/runtime/ApplicationMainContext.d.ts.map +1 -1
- package/dist/esm/core/runtime/ApplicationMainContext.js +5 -2
- package/dist/esm/core/runtime/ApplicationMainContext.js.map +1 -1
- package/dist/esm/core/runtime/domain-module.frontend.definitions.d.ts +25 -1
- package/dist/esm/core/runtime/domain-module.frontend.definitions.d.ts.map +1 -1
- package/dist/esm/core/runtime/domain-module.frontend.definitions.js +37 -1
- package/dist/esm/core/runtime/domain-module.frontend.definitions.js.map +1 -1
- package/dist/esm/core/runtime/start-application.frontend.service.d.ts +21 -2
- package/dist/esm/core/runtime/start-application.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/runtime/start-application.frontend.service.js +51 -4
- package/dist/esm/core/runtime/start-application.frontend.service.js.map +1 -1
- package/dist/esm/core/security/AuthSessionContext.d.ts +11 -0
- package/dist/esm/core/security/AuthSessionContext.d.ts.map +1 -1
- package/dist/esm/core/security/AuthSessionContext.js +70 -22
- package/dist/esm/core/security/AuthSessionContext.js.map +1 -1
- package/dist/esm/core/security/StepUpAuthContext.d.ts.map +1 -1
- package/dist/esm/core/security/StepUpAuthContext.js +10 -2
- package/dist/esm/core/security/StepUpAuthContext.js.map +1 -1
- package/dist/esm/core/security/UserOrgsContext.d.ts.map +1 -1
- package/dist/esm/core/security/UserOrgsContext.js +72 -8
- package/dist/esm/core/security/UserOrgsContext.js.map +1 -1
- package/dist/esm/core/security/route-organization-access.frontend.utils.d.ts +7 -0
- package/dist/esm/core/security/route-organization-access.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/security/route-organization-access.frontend.utils.js +8 -2
- package/dist/esm/core/security/route-organization-access.frontend.utils.js.map +1 -1
- package/dist/esm/core/security/useGrantedConsentPurposes.d.ts +30 -0
- package/dist/esm/core/security/useGrantedConsentPurposes.d.ts.map +1 -0
- package/dist/esm/core/security/useGrantedConsentPurposes.js +38 -0
- package/dist/esm/core/security/useGrantedConsentPurposes.js.map +1 -0
- package/dist/esm/core/ui/UIContext.d.ts.map +1 -1
- package/dist/esm/core/ui/UIContext.js +10 -6
- package/dist/esm/core/ui/UIContext.js.map +1 -1
- package/dist/esm/core/ui/color-conversion.utils.d.ts +20 -0
- package/dist/esm/core/ui/color-conversion.utils.d.ts.map +1 -1
- package/dist/esm/core/ui/color-conversion.utils.js +39 -5
- package/dist/esm/core/ui/color-conversion.utils.js.map +1 -1
- package/dist/esm/core/ui/themes/default.theme.d.ts.map +1 -1
- package/dist/esm/core/ui/themes/default.theme.js +22 -2
- package/dist/esm/core/ui/themes/default.theme.js.map +1 -1
- package/dist/esm/core/ui/ui.frontend.schemas.d.ts +6 -6
- package/dist/esm/core/ui/ui.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/ui/ui.frontend.schemas.js +3 -3
- package/dist/esm/core/ui/ui.frontend.schemas.js.map +1 -1
- package/dist/esm/index.d.ts +10 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +19 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/testing/app-shell-placement-coverage.d.ts +43 -0
- package/dist/esm/testing/app-shell-placement-coverage.d.ts.map +1 -0
- package/dist/esm/testing/app-shell-placement-coverage.js +114 -0
- package/dist/esm/testing/app-shell-placement-coverage.js.map +1 -0
- package/dist/esm/testing/mock-builders.d.ts.map +1 -1
- package/dist/esm/testing/mock-builders.js +5 -0
- package/dist/esm/testing/mock-builders.js.map +1 -1
- package/dist/esm/testing.d.ts +1 -0
- package/dist/esm/testing.d.ts.map +1 -1
- package/dist/esm/testing.js +1 -0
- package/dist/esm/testing.js.map +1 -1
- package/package.json +9 -7
- package/dist/esm/core/navigation/useIsStackEntryActive.js +0 -15
- package/dist/tsconfig.build.tsbuildinfo +0 -1
|
@@ -41,13 +41,14 @@ import { ResourceCollectionFilterPresets } from './ResourceCollectionFilterPrese
|
|
|
41
41
|
import { ResourceLayout_SortControl } from './ResourceLayout_SortControl.js';
|
|
42
42
|
import { ResourceViewModeToggle } from './ResourceViewModeToggle.js';
|
|
43
43
|
import { CollectionSelectionControls } from './CollectionSelectionControls.js';
|
|
44
|
+
import { CollectionFilterPanelVisibility } from '../../core/resources/resources.frontend.schemas.js';
|
|
44
45
|
/**
|
|
45
46
|
* Width transition for the expand-on-focus search field. Timing + curve come from
|
|
46
47
|
* the theme motion tokens (so a theme retunes them); suppressed under
|
|
47
48
|
* `prefers-reduced-motion` (the field still opens, just instantly).
|
|
48
49
|
*/
|
|
49
50
|
const SEARCH_WIDTH_TRANSITION = 'motion-safe:transition-[width] motion-safe:duration-[var(--motion-duration-normal)] motion-safe:ease-[var(--motion-easing-default)] motion-reduce:transition-none';
|
|
50
|
-
export const ResourceCollectionToolbar = ({ resourceType, quickFilter, presetFilters, search, filterFields, filterValues, onFiltersChange, sort, viewMode, primaryAction, selection, bulkActions, collectionActions, className, }) => {
|
|
51
|
+
export const ResourceCollectionToolbar = ({ resourceType, quickFilter, presetFilters, search, filterFields, filterPanel = CollectionFilterPanelVisibility.OFFERED, filterValues, onFiltersChange, sort, viewMode, primaryAction, selection, bulkActions, collectionActions, className, }) => {
|
|
51
52
|
const [searchExpanded, setSearchExpanded] = useState(false);
|
|
52
53
|
const [filtersExpanded, setFiltersExpanded] = useState(false);
|
|
53
54
|
const { tComponent } = useI18n({ component: FrontendComponentType.RESOURCES_LAYOUTS_LIST });
|
|
@@ -67,6 +68,9 @@ export const ResourceCollectionToolbar = ({ resourceType, quickFilter, presetFil
|
|
|
67
68
|
}
|
|
68
69
|
}, [search]);
|
|
69
70
|
const hasFilters = filterFields.length > 0;
|
|
71
|
+
// The panel is a separate question from the chips: HIDDEN withdraws the trigger and the panel, and
|
|
72
|
+
// leaves the chips — the readout of what is narrowing the list — exactly where they were.
|
|
73
|
+
const offersFilterPanel = hasFilters && filterPanel !== CollectionFilterPanelVisibility.HIDDEN;
|
|
70
74
|
const hasSort = !!sort && sort.sortFields.length > 0;
|
|
71
75
|
// Count ONLY the panel's own fields. `filterValues` also carries the promoted
|
|
72
76
|
// quick-filter field's value (it shares this state object) but that field is
|
|
@@ -75,6 +79,6 @@ export const ResourceCollectionToolbar = ({ resourceType, quickFilter, presetFil
|
|
|
75
79
|
// empty. Scoping to `filterFields` keeps the badge in sync with the panel.
|
|
76
80
|
const activeFilterCount = countActiveFilters(filterValues, filterFields.map(f => f.fieldName));
|
|
77
81
|
const isSearchOpen = !!search && (searchExpanded || !!search.query);
|
|
78
|
-
return (_jsxs("div", { className: cn('flex flex-col gap-element-sm', className), "data-slot": "collection-toolbar", children: [quickFilter && (_jsx(ResourceCollectionQuickFilterTabs, { resourceType: resourceType, field: quickFilter.field, value: quickFilter.value, onChange: quickFilter.onChange })), presetFilters && presetFilters.length > 0 && (_jsx(ResourceCollectionFilterPresets, { resourceType: resourceType, presets: presetFilters, currentFilters: filterValues, onFiltersChange: onFiltersChange })), _jsxs("div", { className: "flex flex-wrap items-center gap-element", children: [search && !isSearchOpen && (_jsx(Button, { type: "button", variant: ButtonVariants_Variant.GHOST, size: ButtonSize.ICON, onClick: () => setSearchExpanded(true), "aria-label": searchPlaceholder, "data-slot": "collection-toolbar-search-trigger", children: renderIcon(StandardIconReference.SEARCH, { size: IconSize.SM }) })), search && isSearchOpen && (_jsx("div", { className: cn('overflow-hidden shrink-0 w-64 max-w-full', SEARCH_WIDTH_TRANSITION), "data-state": "open", children: _jsx(InlineSearchInput, { query: search.query, onChange: search.onChange, onClear: search.onClear, resourceType: resourceType, autoFocus: true, onFocus: () => setSearchExpanded(true), onBlur: handleSearchBlur, onKeyDown: handleSearchKeyDown }) })),
|
|
82
|
+
return (_jsxs("div", { className: cn('flex flex-col gap-element-sm', className), "data-slot": "collection-toolbar", children: [quickFilter && (_jsx(ResourceCollectionQuickFilterTabs, { resourceType: resourceType, field: quickFilter.field, value: quickFilter.value, onChange: quickFilter.onChange })), presetFilters && presetFilters.length > 0 && (_jsx(ResourceCollectionFilterPresets, { resourceType: resourceType, presets: presetFilters, currentFilters: filterValues, onFiltersChange: onFiltersChange })), _jsxs("div", { className: "flex flex-wrap items-center gap-element", children: [search && !isSearchOpen && (_jsx(Button, { type: "button", variant: ButtonVariants_Variant.GHOST, size: ButtonSize.ICON, onClick: () => setSearchExpanded(true), "aria-label": searchPlaceholder, "data-slot": "collection-toolbar-search-trigger", children: renderIcon(StandardIconReference.SEARCH, { size: IconSize.SM }) })), search && isSearchOpen && (_jsx("div", { className: cn('overflow-hidden shrink-0 w-64 max-w-full', SEARCH_WIDTH_TRANSITION), "data-state": "open", children: _jsx(InlineSearchInput, { query: search.query, onChange: search.onChange, onClear: search.onClear, resourceType: resourceType, autoFocus: true, onFocus: () => setSearchExpanded(true), onBlur: handleSearchBlur, onKeyDown: handleSearchKeyDown }) })), offersFilterPanel && (_jsx(ResourceLayout_FiltersTrigger, { activeCount: activeFilterCount, isExpanded: filtersExpanded, onToggle: () => setFiltersExpanded(prev => !prev) })), hasSort && (_jsx(ResourceLayout_SortControl, { resourceType: resourceType, sortFields: sort.sortFields, currentSorts: sort.sortStates, onSortChange: sort.onSortChange })), selection && (_jsxs(_Fragment, { children: [selection.count > 0 && _jsx("div", { className: "h-5 w-px bg-border", "aria-hidden": "true" }), _jsx(CollectionSelectionControls, { count: selection.count, onClear: selection.onClear, ...(selection.matchAllOffer ? { matchAllOffer: selection.matchAllOffer } : {}), ...(selection.isMatchAllSelected ? { isMatchAllSelected: true } : {}) })] })), (viewMode || primaryAction || bulkActions || collectionActions) && (_jsxs("div", { className: "flex items-center gap-element ms-auto", children: [viewMode && (_jsx(ResourceViewModeToggle, { viewMode: viewMode.viewMode, onViewModeChange: viewMode.onViewModeChange })), collectionActions, selection && selection.count > 0 && bulkActions ? bulkActions : primaryAction] }))] }), offersFilterPanel && filtersExpanded && (_jsx(ResourceLayout_FiltersPanel, { resourceType: resourceType, filterFields: filterFields, currentFilters: filterValues, onFiltersChange: onFiltersChange })), hasFilters && (_jsx(ResourceLayout_FilterChips, { resourceType: resourceType, filterFields: filterFields, currentFilters: filterValues, onFiltersChange: onFiltersChange }))] }));
|
|
79
83
|
};
|
|
80
84
|
//# sourceMappingURL=ResourceCollectionToolbar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceCollectionToolbar.js","sourceRoot":"","sources":["../../../../../src/components/resources/ResourceCollectionToolbar.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * ResourceCollectionToolbar — the shared, zoned control region for every resource\n * collection view (LIST cards, LIST table, SEARCH).\n *\n * Layout (a single responsive flex row + stacked sub-rows):\n * [ search · filters · sort ] ───────────────── [ view-mode · primary action ]\n * [ filters panel (when expanded, full-width) ]\n * [ active filter chips ]\n *\n * \"Refine\" controls (search/filters/sort) cluster at the leading edge — search is\n * always first; \"view + act\" controls (view-mode toggle, Create) cluster at the\n * trailing edge via `ms-auto`. `flex-wrap` handles narrow widths with no media\n * queries.\n *\n * The search is an expand-on-focus field: collapsed it reads as a search icon\n * (icon-width), and it animates open to a full field when focused — the width\n * transition is driven by the theme motion tokens (`--motion-duration-*` /\n * `--motion-easing-*`) and respects `prefers-reduced-motion`, so any theme retunes\n * the speed/curve. Filters and sort sit beside it as compact icon controls.\n *\n * The total item count is intentionally NOT shown here — the pagination footer\n * owns the total (\"Showing X–Y of Z\") to keep a single source of truth.\n *\n * Presentational + slot-based: it owns only its own ephemeral UI state (search\n * expand, filters-panel expand). All data/state/handlers are supplied by the\n * collection host, so the same toolbar serves cards, table, and search.\n */\n\nimport React, { useCallback, useState } from 'react';\nimport { cn } from '~wildo-frontend-lib/core/ui/cn';\nimport { FrontendComponentType, ButtonSize } from '@wildo-ai/presets-components-models';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { useIconRegistry } from '~wildo-frontend-lib/core/icons/useIconRegistry';\nimport { StandardIconReference, IconSize } from '~wildo-frontend-lib/core/icons/icon-registry.frontend.schemas';\nimport { Button, ButtonVariants_Variant } from '~wildo-frontend-lib/components/actions/button';\nimport { InlineSearchInput } from './InlineSearchInput';\nimport {\n ResourceLayout_FiltersTrigger,\n ResourceLayout_FiltersPanel,\n countActiveFilters,\n type FilterFieldDefinition,\n type FilterValues,\n} from './ResourceLayout_FiltersControl';\nimport { ResourceLayout_FilterChips } from './ResourceLayout_FilterChips';\nimport { ResourceCollectionQuickFilterTabs } from './ResourceCollectionQuickFilterTabs';\nimport { ResourceCollectionFilterPresets } from './ResourceCollectionFilterPresets';\nimport { ResourceLayout_SortControl, type SortState } from './ResourceLayout_SortControl';\nimport { ResourceViewModeToggle } from './ResourceViewModeToggle';\nimport { CollectionSelectionControls } from './CollectionSelectionControls';\nimport { CollectionDisplayMode, type CollectionFilterPreset } from '~wildo-frontend-lib/core/resources/resources.frontend.schemas';\n\n/**\n * Width transition for the expand-on-focus search field. Timing + curve come from\n * the theme motion tokens (so a theme retunes them); suppressed under\n * `prefers-reduced-motion` (the field still opens, just instantly).\n */\nconst SEARCH_WIDTH_TRANSITION =\n 'motion-safe:transition-[width] motion-safe:duration-[var(--motion-duration-normal)] motion-safe:ease-[var(--motion-easing-default)] motion-reduce:transition-none';\n\nexport interface ResourceCollectionToolbarSearch {\n query: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onClear: () => void;\n}\n\nexport interface ResourceCollectionToolbarSort {\n sortFields: readonly string[];\n /** Active sort rules, highest priority first (empty = no sorting). */\n sortStates: readonly SortState[];\n onSortChange: (sorts: SortState[]) => void;\n}\n\nexport interface ResourceCollectionToolbarViewMode {\n viewMode: CollectionDisplayMode;\n onViewModeChange: (mode: CollectionDisplayMode) => void;\n}\n\nexport interface ResourceCollectionToolbarSelection {\n /** Number of currently-selected items. */\n count: number;\n /** Clear the whole selection. */\n onClear: () => void;\n /**\n * Offered by the host when every row on the page is selected and the listing matches more rows\n * than the page holds — see `CollectionSelectionControls`, which owns the wording and the rule\n * about when it appears.\n */\n matchAllOffer?: { matchedCount: number; onSelectAllMatching: () => void };\n /** True once the selection IS the query rather than a set of ticked rows. */\n isMatchAllSelected?: boolean;\n}\n\nexport interface ResourceCollectionToolbarQuickFilter {\n /** The promoted enum filter field (see `collectionDisplayConfig.quickFilterField`). */\n field: FilterFieldDefinition;\n /** Current filter value for the field — `undefined` = the \"All\" tab. */\n value: string | undefined;\n /** Set (or clear, with `undefined`) the promoted field's filter value. */\n onChange: (value: string | undefined) => void;\n}\n\nexport interface ResourceCollectionToolbarProps {\n /** Resource type for i18n label resolution. */\n resourceType: string;\n /**\n * Quick-filter tab strip (\"All · <value> · …\") rendered above the toolbar\n * row — a promoted enum filter that shares the collection's filter state.\n * The host must EXCLUDE the promoted field from `filterFields` so the panel\n * and the tabs never render competing controls for the same field.\n */\n quickFilter?: ResourceCollectionToolbarQuickFilter;\n /**\n * Named one-click narrowings, rendered as toggleable pills between the quick-filter tabs and the\n * toolbar row. They share this toolbar's `filterValues`/`onFiltersChange`, so a pill and the\n * filters panel are two views of one state and cannot disagree.\n */\n presetFilters?: readonly CollectionFilterPreset[];\n /** Inline search state — omit to hide the search affordance entirely. */\n search?: ResourceCollectionToolbarSearch;\n /** Filter fields + state. Trigger/panel/chips are hidden when there are none. */\n filterFields: readonly FilterFieldDefinition[];\n filterValues: FilterValues;\n onFiltersChange: (filters: FilterValues) => void;\n /**\n * Sort state — omit to hide the toolbar sort control (e.g. TABLE mode, where\n * sorting lives in the column headers).\n */\n sort?: ResourceCollectionToolbarSort;\n /** View-mode toggle — omit when only one display is available. */\n viewMode?: ResourceCollectionToolbarViewMode;\n /** Primary action node (e.g. the Create button), placed at the trailing edge. */\n primaryAction?: React.ReactNode;\n /**\n * Selection SUMMARY — omit for non-selectable collections. When present, an \"N selected\" + clear\n * cluster renders in the leading (refine) zone beside search/filter/sort.\n *\n * The select-ALL checkbox is deliberately NOT here: it belongs in the column of row checkboxes it\n * commands (the table's header cell, or `CollectionSelectionHeaderRail` above a cards list), not\n * in a toolbar row a couple of hundred pixels to their right. See `CollectionSelectionControls`.\n */\n selection?: ResourceCollectionToolbarSelection;\n /**\n * Bulk-action node (the contextual bulk `ActionBar`). When a selection is\n * active (`selection.count > 0`), this REPLACES `primaryAction` in the\n * trailing zone; Create returns when the selection clears. Local to this\n * collection — there is no global/floating bulk bar.\n */\n bulkActions?: React.ReactNode;\n /**\n * Collection-scoped action node (e.g. the `ResourceLayout_CollectionActions`\n * bar for whole-scope \"retry all\" / \"purge all\"). Rendered in the trailing zone\n * alongside the primary/bulk action. Unlike bulk (which contextually REPLACES\n * the primary action during a selection), collection actions target the whole\n * scope and stay visible regardless of selection. Omit when the resource has no\n * collection-scoped operations.\n */\n collectionActions?: React.ReactNode;\n /** Additional CSS classes for the toolbar region. */\n className?: string;\n}\n\nexport const ResourceCollectionToolbar = ({\n resourceType,\n quickFilter,\n presetFilters,\n search,\n filterFields,\n filterValues,\n onFiltersChange,\n sort,\n viewMode,\n primaryAction,\n selection,\n bulkActions,\n collectionActions,\n className,\n}: ResourceCollectionToolbarProps): React.JSX.Element => {\n const [searchExpanded, setSearchExpanded] = useState(false);\n const [filtersExpanded, setFiltersExpanded] = useState(false);\n const { tComponent } = useI18n({ component: FrontendComponentType.RESOURCES_LAYOUTS_LIST });\n const { renderIcon } = useIconRegistry();\n const searchPlaceholder = tComponent(FrontendComponentType.RESOURCES_LAYOUTS_LIST, 'searchPlaceholder');\n\n const handleSearchBlur = useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n // Collapse back to the icon only when leaving an EMPTY field — an active\n // query keeps the field open so the filter stays obvious.\n if (!e.currentTarget.value) setSearchExpanded(false);\n }, []);\n\n const handleSearchKeyDown = useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n search?.onClear();\n setSearchExpanded(false);\n e.currentTarget.blur();\n }\n }, [search]);\n\n const hasFilters = filterFields.length > 0;\n const hasSort = !!sort && sort.sortFields.length > 0;\n // Count ONLY the panel's own fields. `filterValues` also carries the promoted\n // quick-filter field's value (it shares this state object) but that field is\n // rendered as the tab strip, not in the panel/chips — counting it here would\n // show \"Filters (1)\" for a selected quick-filter tab while the opened panel is\n // empty. Scoping to `filterFields` keeps the badge in sync with the panel.\n const activeFilterCount = countActiveFilters(filterValues, filterFields.map(f => f.fieldName));\n const isSearchOpen = !!search && (searchExpanded || !!search.query);\n\n return (\n <div className={cn('flex flex-col gap-element-sm', className)} data-slot=\"collection-toolbar\">\n {/* ── Quick-filter tab strip (promoted enum filter) — above the toolbar row ── */}\n {quickFilter && (\n <ResourceCollectionQuickFilterTabs\n resourceType={resourceType}\n field={quickFilter.field}\n value={quickFilter.value}\n onChange={quickFilter.onChange}\n />\n )}\n\n {/* ── Preset pills — BELOW the exclusive tab strip and ABOVE the controls ──\n The order is the meaning: the tabs say which slice of the collection this is, the pills\n add named narrowings within it, and the toolbar row refines whatever those two leave. */}\n {presetFilters && presetFilters.length > 0 && (\n <ResourceCollectionFilterPresets\n resourceType={resourceType}\n presets={presetFilters}\n currentFilters={filterValues}\n onFiltersChange={onFiltersChange}\n />\n )}\n\n <div className=\"flex flex-wrap items-center gap-element\">\n {/* ── Refine cluster: search (always first) · filters · sort ──\n Collapsed search is a REAL icon button, not a width-clipped input:\n clipping a bordered InputRoot to icon width leaked a sheared slice of\n the input box behind the icon (square corners, cut border). The\n button expands to the field on click; the field keeps the animated\n width while open and collapses back on empty-blur / Escape. */}\n {search && !isSearchOpen && (\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.GHOST}\n size={ButtonSize.ICON}\n onClick={() => setSearchExpanded(true)}\n aria-label={searchPlaceholder}\n data-slot=\"collection-toolbar-search-trigger\"\n >\n {renderIcon(StandardIconReference.SEARCH, { size: IconSize.SM })}\n </Button>\n )}\n {search && isSearchOpen && (\n <div\n className={cn('overflow-hidden shrink-0 w-64 max-w-full', SEARCH_WIDTH_TRANSITION)}\n data-state=\"open\"\n >\n <InlineSearchInput\n query={search.query}\n onChange={search.onChange}\n onClear={search.onClear}\n resourceType={resourceType}\n autoFocus\n onFocus={() => setSearchExpanded(true)}\n onBlur={handleSearchBlur}\n onKeyDown={handleSearchKeyDown}\n />\n </div>\n )}\n\n {hasFilters && (\n <ResourceLayout_FiltersTrigger\n activeCount={activeFilterCount}\n isExpanded={filtersExpanded}\n onToggle={() => setFiltersExpanded(prev => !prev)}\n />\n )}\n\n {hasSort && (\n <ResourceLayout_SortControl\n resourceType={resourceType}\n sortFields={sort!.sortFields}\n currentSorts={sort!.sortStates}\n onSortChange={sort!.onSortChange}\n />\n )}\n\n {/* ── Selection summary (leading, beside the refine controls) ──\n \"N selected\" + clear. Local to this list; there is no global floating selection display.\n The CLUSTER stays mounted at count 0 — it is nothing but an sr-only live region there,\n and that region has to pre-exist the first selection or the 0→1 announcement is lost\n (see `CollectionSelectionControls`). Only the DIVIDER is conditional, so an empty\n selection does not draw a separator with nothing after it. */}\n {selection && (\n <>\n {selection.count > 0 && <div className=\"h-5 w-px bg-border\" aria-hidden=\"true\" />}\n <CollectionSelectionControls\n count={selection.count}\n onClear={selection.onClear}\n {...(selection.matchAllOffer ? { matchAllOffer: selection.matchAllOffer } : {})}\n {...(selection.isMatchAllSelected ? { isMatchAllSelected: true } : {})}\n />\n </>\n )}\n\n {/* ── View + act cluster (trailing) ── the bulk actions CONTEXTUALLY\n replace the primary (Create) action while a selection is active. */}\n {(viewMode || primaryAction || bulkActions || collectionActions) && (\n <div className=\"flex items-center gap-element ms-auto\">\n {viewMode && (\n <ResourceViewModeToggle\n viewMode={viewMode.viewMode}\n onViewModeChange={viewMode.onViewModeChange}\n />\n )}\n {/* Whole-scope maintenance actions (retry all / purge all) sit before\n the create/bulk slot and are not swapped out by a selection. */}\n {collectionActions}\n {selection && selection.count > 0 && bulkActions ? bulkActions : primaryAction}\n </div>\n )}\n </div>\n\n {hasFilters && filtersExpanded && (\n <ResourceLayout_FiltersPanel\n resourceType={resourceType}\n filterFields={filterFields}\n currentFilters={filterValues}\n onFiltersChange={onFiltersChange}\n />\n )}\n\n {hasFilters && (\n <ResourceLayout_FilterChips\n resourceType={resourceType}\n filterFields={filterFields}\n currentFilters={filterValues}\n onFiltersChange={onFiltersChange}\n />\n )}\n </div>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"ResourceCollectionToolbar.js","sourceRoot":"","sources":["../../../../../src/components/resources/ResourceCollectionToolbar.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * ResourceCollectionToolbar — the shared, zoned control region for every resource\n * collection view (LIST cards, LIST table, SEARCH).\n *\n * Layout (a single responsive flex row + stacked sub-rows):\n * [ search · filters · sort ] ───────────────── [ view-mode · primary action ]\n * [ filters panel (when expanded, full-width) ]\n * [ active filter chips ]\n *\n * \"Refine\" controls (search/filters/sort) cluster at the leading edge — search is\n * always first; \"view + act\" controls (view-mode toggle, Create) cluster at the\n * trailing edge via `ms-auto`. `flex-wrap` handles narrow widths with no media\n * queries.\n *\n * The search is an expand-on-focus field: collapsed it reads as a search icon\n * (icon-width), and it animates open to a full field when focused — the width\n * transition is driven by the theme motion tokens (`--motion-duration-*` /\n * `--motion-easing-*`) and respects `prefers-reduced-motion`, so any theme retunes\n * the speed/curve. Filters and sort sit beside it as compact icon controls.\n *\n * The total item count is intentionally NOT shown here — the pagination footer\n * owns the total (\"Showing X–Y of Z\") to keep a single source of truth.\n *\n * Presentational + slot-based: it owns only its own ephemeral UI state (search\n * expand, filters-panel expand). All data/state/handlers are supplied by the\n * collection host, so the same toolbar serves cards, table, and search.\n */\n\nimport React, { useCallback, useState } from 'react';\nimport { cn } from '~wildo-frontend-lib/core/ui/cn';\nimport { FrontendComponentType, ButtonSize } from '@wildo-ai/presets-components-models';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { useIconRegistry } from '~wildo-frontend-lib/core/icons/useIconRegistry';\nimport { StandardIconReference, IconSize } from '~wildo-frontend-lib/core/icons/icon-registry.frontend.schemas';\nimport { Button, ButtonVariants_Variant } from '~wildo-frontend-lib/components/actions/button';\nimport { InlineSearchInput } from './InlineSearchInput';\nimport {\n ResourceLayout_FiltersTrigger,\n ResourceLayout_FiltersPanel,\n countActiveFilters,\n type FilterFieldDefinition,\n type FilterValues,\n} from './ResourceLayout_FiltersControl';\nimport { ResourceLayout_FilterChips } from './ResourceLayout_FilterChips';\nimport { ResourceCollectionQuickFilterTabs } from './ResourceCollectionQuickFilterTabs';\nimport { ResourceCollectionFilterPresets } from './ResourceCollectionFilterPresets';\nimport { ResourceLayout_SortControl, type SortState } from './ResourceLayout_SortControl';\nimport { ResourceViewModeToggle } from './ResourceViewModeToggle';\nimport { CollectionSelectionControls } from './CollectionSelectionControls';\nimport { CollectionDisplayMode, CollectionFilterPanelVisibility, type CollectionFilterPreset } from '~wildo-frontend-lib/core/resources/resources.frontend.schemas';\n\n/**\n * Width transition for the expand-on-focus search field. Timing + curve come from\n * the theme motion tokens (so a theme retunes them); suppressed under\n * `prefers-reduced-motion` (the field still opens, just instantly).\n */\nconst SEARCH_WIDTH_TRANSITION =\n 'motion-safe:transition-[width] motion-safe:duration-[var(--motion-duration-normal)] motion-safe:ease-[var(--motion-easing-default)] motion-reduce:transition-none';\n\nexport interface ResourceCollectionToolbarSearch {\n query: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onClear: () => void;\n}\n\nexport interface ResourceCollectionToolbarSort {\n sortFields: readonly string[];\n /** Active sort rules, highest priority first (empty = no sorting). */\n sortStates: readonly SortState[];\n onSortChange: (sorts: SortState[]) => void;\n}\n\nexport interface ResourceCollectionToolbarViewMode {\n viewMode: CollectionDisplayMode;\n onViewModeChange: (mode: CollectionDisplayMode) => void;\n}\n\nexport interface ResourceCollectionToolbarSelection {\n /** Number of currently-selected items. */\n count: number;\n /** Clear the whole selection. */\n onClear: () => void;\n /**\n * Offered by the host when every row on the page is selected and the listing matches more rows\n * than the page holds — see `CollectionSelectionControls`, which owns the wording and the rule\n * about when it appears.\n */\n matchAllOffer?: { matchedCount: number; onSelectAllMatching: () => void };\n /** True once the selection IS the query rather than a set of ticked rows. */\n isMatchAllSelected?: boolean;\n}\n\nexport interface ResourceCollectionToolbarQuickFilter {\n /** The promoted enum filter field (see `collectionDisplayConfig.quickFilterField`). */\n field: FilterFieldDefinition;\n /** Current filter value for the field — `undefined` = the \"All\" tab. */\n value: string | undefined;\n /** Set (or clear, with `undefined`) the promoted field's filter value. */\n onChange: (value: string | undefined) => void;\n}\n\nexport interface ResourceCollectionToolbarProps {\n /** Resource type for i18n label resolution. */\n resourceType: string;\n /**\n * Quick-filter tab strip (\"All · <value> · …\") rendered above the toolbar\n * row — a promoted enum filter that shares the collection's filter state.\n * The host must EXCLUDE the promoted field from `filterFields` so the panel\n * and the tabs never render competing controls for the same field.\n */\n quickFilter?: ResourceCollectionToolbarQuickFilter;\n /**\n * Named one-click narrowings, rendered as toggleable pills between the quick-filter tabs and the\n * toolbar row. They share this toolbar's `filterValues`/`onFiltersChange`, so a pill and the\n * filters panel are two views of one state and cannot disagree.\n */\n presetFilters?: readonly CollectionFilterPreset[];\n /** Inline search state — omit to hide the search affordance entirely. */\n search?: ResourceCollectionToolbarSearch;\n /** Filter fields + state. Trigger/panel/chips are hidden when there are none. */\n filterFields: readonly FilterFieldDefinition[];\n /**\n * Whether the \"Filters\" trigger and its panel are offered (see `collectionDisplayConfig.filterPanel`).\n * Omitted means OFFERED. HIDDEN removes only the trigger and panel — the chips stay, so an active\n * filter is never invisible.\n */\n filterPanel?: CollectionFilterPanelVisibility;\n filterValues: FilterValues;\n onFiltersChange: (filters: FilterValues) => void;\n /**\n * Sort state — omit to hide the toolbar sort control (e.g. TABLE mode, where\n * sorting lives in the column headers).\n */\n sort?: ResourceCollectionToolbarSort;\n /** View-mode toggle — omit when only one display is available. */\n viewMode?: ResourceCollectionToolbarViewMode;\n /** Primary action node (e.g. the Create button), placed at the trailing edge. */\n primaryAction?: React.ReactNode;\n /**\n * Selection SUMMARY — omit for non-selectable collections. When present, an \"N selected\" + clear\n * cluster renders in the leading (refine) zone beside search/filter/sort.\n *\n * The select-ALL checkbox is deliberately NOT here: it belongs in the column of row checkboxes it\n * commands (the table's header cell, or `CollectionSelectionHeaderRail` above a cards list), not\n * in a toolbar row a couple of hundred pixels to their right. See `CollectionSelectionControls`.\n */\n selection?: ResourceCollectionToolbarSelection;\n /**\n * Bulk-action node (the contextual bulk `ActionBar`). When a selection is\n * active (`selection.count > 0`), this REPLACES `primaryAction` in the\n * trailing zone; Create returns when the selection clears. Local to this\n * collection — there is no global/floating bulk bar.\n */\n bulkActions?: React.ReactNode;\n /**\n * Collection-scoped action node (e.g. the `ResourceLayout_CollectionActions`\n * bar for whole-scope \"retry all\" / \"purge all\"). Rendered in the trailing zone\n * alongside the primary/bulk action. Unlike bulk (which contextually REPLACES\n * the primary action during a selection), collection actions target the whole\n * scope and stay visible regardless of selection. Omit when the resource has no\n * collection-scoped operations.\n */\n collectionActions?: React.ReactNode;\n /** Additional CSS classes for the toolbar region. */\n className?: string;\n}\n\nexport const ResourceCollectionToolbar = ({\n resourceType,\n quickFilter,\n presetFilters,\n search,\n filterFields,\n filterPanel = CollectionFilterPanelVisibility.OFFERED,\n filterValues,\n onFiltersChange,\n sort,\n viewMode,\n primaryAction,\n selection,\n bulkActions,\n collectionActions,\n className,\n}: ResourceCollectionToolbarProps): React.JSX.Element => {\n const [searchExpanded, setSearchExpanded] = useState(false);\n const [filtersExpanded, setFiltersExpanded] = useState(false);\n const { tComponent } = useI18n({ component: FrontendComponentType.RESOURCES_LAYOUTS_LIST });\n const { renderIcon } = useIconRegistry();\n const searchPlaceholder = tComponent(FrontendComponentType.RESOURCES_LAYOUTS_LIST, 'searchPlaceholder');\n\n const handleSearchBlur = useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n // Collapse back to the icon only when leaving an EMPTY field — an active\n // query keeps the field open so the filter stays obvious.\n if (!e.currentTarget.value) setSearchExpanded(false);\n }, []);\n\n const handleSearchKeyDown = useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n search?.onClear();\n setSearchExpanded(false);\n e.currentTarget.blur();\n }\n }, [search]);\n\n const hasFilters = filterFields.length > 0;\n // The panel is a separate question from the chips: HIDDEN withdraws the trigger and the panel, and\n // leaves the chips — the readout of what is narrowing the list — exactly where they were.\n const offersFilterPanel = hasFilters && filterPanel !== CollectionFilterPanelVisibility.HIDDEN;\n const hasSort = !!sort && sort.sortFields.length > 0;\n // Count ONLY the panel's own fields. `filterValues` also carries the promoted\n // quick-filter field's value (it shares this state object) but that field is\n // rendered as the tab strip, not in the panel/chips — counting it here would\n // show \"Filters (1)\" for a selected quick-filter tab while the opened panel is\n // empty. Scoping to `filterFields` keeps the badge in sync with the panel.\n const activeFilterCount = countActiveFilters(filterValues, filterFields.map(f => f.fieldName));\n const isSearchOpen = !!search && (searchExpanded || !!search.query);\n\n return (\n <div className={cn('flex flex-col gap-element-sm', className)} data-slot=\"collection-toolbar\">\n {/* ── Quick-filter tab strip (promoted enum filter) — above the toolbar row ── */}\n {quickFilter && (\n <ResourceCollectionQuickFilterTabs\n resourceType={resourceType}\n field={quickFilter.field}\n value={quickFilter.value}\n onChange={quickFilter.onChange}\n />\n )}\n\n {/* ── Preset pills — BELOW the exclusive tab strip and ABOVE the controls ──\n The order is the meaning: the tabs say which slice of the collection this is, the pills\n add named narrowings within it, and the toolbar row refines whatever those two leave. */}\n {presetFilters && presetFilters.length > 0 && (\n <ResourceCollectionFilterPresets\n resourceType={resourceType}\n presets={presetFilters}\n currentFilters={filterValues}\n onFiltersChange={onFiltersChange}\n />\n )}\n\n <div className=\"flex flex-wrap items-center gap-element\">\n {/* ── Refine cluster: search (always first) · filters · sort ──\n Collapsed search is a REAL icon button, not a width-clipped input:\n clipping a bordered InputRoot to icon width leaked a sheared slice of\n the input box behind the icon (square corners, cut border). The\n button expands to the field on click; the field keeps the animated\n width while open and collapses back on empty-blur / Escape. */}\n {search && !isSearchOpen && (\n <Button\n type=\"button\"\n variant={ButtonVariants_Variant.GHOST}\n size={ButtonSize.ICON}\n onClick={() => setSearchExpanded(true)}\n aria-label={searchPlaceholder}\n data-slot=\"collection-toolbar-search-trigger\"\n >\n {renderIcon(StandardIconReference.SEARCH, { size: IconSize.SM })}\n </Button>\n )}\n {search && isSearchOpen && (\n <div\n className={cn('overflow-hidden shrink-0 w-64 max-w-full', SEARCH_WIDTH_TRANSITION)}\n data-state=\"open\"\n >\n <InlineSearchInput\n query={search.query}\n onChange={search.onChange}\n onClear={search.onClear}\n resourceType={resourceType}\n autoFocus\n onFocus={() => setSearchExpanded(true)}\n onBlur={handleSearchBlur}\n onKeyDown={handleSearchKeyDown}\n />\n </div>\n )}\n\n {offersFilterPanel && (\n <ResourceLayout_FiltersTrigger\n activeCount={activeFilterCount}\n isExpanded={filtersExpanded}\n onToggle={() => setFiltersExpanded(prev => !prev)}\n />\n )}\n\n {hasSort && (\n <ResourceLayout_SortControl\n resourceType={resourceType}\n sortFields={sort!.sortFields}\n currentSorts={sort!.sortStates}\n onSortChange={sort!.onSortChange}\n />\n )}\n\n {/* ── Selection summary (leading, beside the refine controls) ──\n \"N selected\" + clear. Local to this list; there is no global floating selection display.\n The CLUSTER stays mounted at count 0 — it is nothing but an sr-only live region there,\n and that region has to pre-exist the first selection or the 0→1 announcement is lost\n (see `CollectionSelectionControls`). Only the DIVIDER is conditional, so an empty\n selection does not draw a separator with nothing after it. */}\n {selection && (\n <>\n {selection.count > 0 && <div className=\"h-5 w-px bg-border\" aria-hidden=\"true\" />}\n <CollectionSelectionControls\n count={selection.count}\n onClear={selection.onClear}\n {...(selection.matchAllOffer ? { matchAllOffer: selection.matchAllOffer } : {})}\n {...(selection.isMatchAllSelected ? { isMatchAllSelected: true } : {})}\n />\n </>\n )}\n\n {/* ── View + act cluster (trailing) ── the bulk actions CONTEXTUALLY\n replace the primary (Create) action while a selection is active. */}\n {(viewMode || primaryAction || bulkActions || collectionActions) && (\n <div className=\"flex items-center gap-element ms-auto\">\n {viewMode && (\n <ResourceViewModeToggle\n viewMode={viewMode.viewMode}\n onViewModeChange={viewMode.onViewModeChange}\n />\n )}\n {/* Whole-scope maintenance actions (retry all / purge all) sit before\n the create/bulk slot and are not swapped out by a selection. */}\n {collectionActions}\n {selection && selection.count > 0 && bulkActions ? bulkActions : primaryAction}\n </div>\n )}\n </div>\n\n {offersFilterPanel && filtersExpanded && (\n <ResourceLayout_FiltersPanel\n resourceType={resourceType}\n filterFields={filterFields}\n currentFilters={filterValues}\n onFiltersChange={onFiltersChange}\n />\n )}\n\n {hasFilters && (\n <ResourceLayout_FilterChips\n resourceType={resourceType}\n filterFields={filterFields}\n currentFilters={filterValues}\n onFiltersChange={onFiltersChange}\n />\n )}\n </div>\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceLayout_Breadcrumb.d.ts","sourceRoot":"","sources":["../../../../../src/components/resources/ResourceLayout_Breadcrumb.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAA+C,MAAM,OAAO,CAAC;AAsBpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kFAAkF,CAAA;AAGvH,OAAO,EAAE,wBAAwB,EAAE,MAAM,qDAAqD,CAAA;AAG9F,MAAM,WAAW,4CAA6C,SAAQ,wBAAwB;IAC5F,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"ResourceLayout_Breadcrumb.d.ts","sourceRoot":"","sources":["../../../../../src/components/resources/ResourceLayout_Breadcrumb.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAA+C,MAAM,OAAO,CAAC;AAsBpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kFAAkF,CAAA;AAGvH,OAAO,EAAE,wBAAwB,EAAE,MAAM,qDAAqD,CAAA;AAG9F,MAAM,WAAW,4CAA6C,SAAQ,wBAAwB;IAC5F,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAoDD,eAAO,MAAM,uCAAuC,EAAE,KAAK,CAAC,EAAE,CAAC,4CAA4C,CAgV1G,CAAC;AAOF,wBAAgB,yBAAyB,CAAC,EAAE,MAAgC,EAAE,GAAG,KAAK,EAAE,EAAE,4CAA4C,GAAG,oBAAoB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAGhL"}
|
|
@@ -80,13 +80,11 @@ function buildSegmentContextIdentifiers(params) {
|
|
|
80
80
|
export const ResourceLayoutPreset_Breadcrumb_Default = ({ resourceContext, navigationZone, navigationInitiator, maxDepth = 5, }) => {
|
|
81
81
|
const { resourceType, contextResourceIdentifiers, parentResourcesRequirements } = resourceContext;
|
|
82
82
|
const { registry, doOperation } = useResourceRegistry();
|
|
83
|
-
const { tResourceHeader, t, isReady } = useI18n({ resource: resourceType });
|
|
83
|
+
const { tResourceHeader, t, formatDate, formatDateTime, isReady } = useI18n({ resource: resourceType });
|
|
84
84
|
const { navigate } = useNavigationController();
|
|
85
|
-
//
|
|
85
|
+
// A stable ref, so the label fetch does not re-run when `doOperation` changes identity.
|
|
86
86
|
const doOperationRef = useRef(doOperation);
|
|
87
|
-
const tRef = useRef(t);
|
|
88
87
|
doOperationRef.current = doOperation;
|
|
89
|
-
tRef.current = t;
|
|
90
88
|
// Build ordered parent segments from parentResourcesRequirements
|
|
91
89
|
const parentSegments = useMemo(() => {
|
|
92
90
|
if (!parentResourcesRequirements || parentResourcesRequirements.length === 0)
|
|
@@ -196,13 +194,7 @@ export const ResourceLayoutPreset_Breadcrumb_Default = ({ resourceContext, navig
|
|
|
196
194
|
}
|
|
197
195
|
try {
|
|
198
196
|
const data = await doOperationRef.current(operationPath, params);
|
|
199
|
-
|
|
200
|
-
resourceType: seg.resourceType,
|
|
201
|
-
registry,
|
|
202
|
-
currentObject: data,
|
|
203
|
-
t: tRef.current,
|
|
204
|
-
});
|
|
205
|
-
return { ...seg, label: label || seg.resourceId, isLoading: false };
|
|
197
|
+
return { ...seg, label: null, record: data, isLoading: false };
|
|
206
198
|
}
|
|
207
199
|
catch {
|
|
208
200
|
return fallbackSegment();
|
|
@@ -218,6 +210,20 @@ export const ResourceLayoutPreset_Breadcrumb_Default = ({ resourceContext, navig
|
|
|
218
210
|
return () => { cancelled = true; };
|
|
219
211
|
// eslint-disable-next-line react-hooks/exhaustive-deps -- using refs for unstable functions
|
|
220
212
|
}, [contextResourceIdentifiers, parentSegments, registry, tResourceHeader]);
|
|
213
|
+
// Each read ancestor is named from its row at render, with the CURRENT `t` and formatters (see `record`).
|
|
214
|
+
const displayedSegments = useMemo(() => resolvedSegments.map((segment) => segment.record === undefined
|
|
215
|
+
? segment
|
|
216
|
+
: {
|
|
217
|
+
...segment,
|
|
218
|
+
label: FrontendResourceUtils.computeFrontendResourceLabel({
|
|
219
|
+
resourceType: segment.resourceType,
|
|
220
|
+
registry,
|
|
221
|
+
currentObject: segment.record,
|
|
222
|
+
t,
|
|
223
|
+
formatDate,
|
|
224
|
+
formatDateTime,
|
|
225
|
+
}) || segment.resourceId,
|
|
226
|
+
}), [resolvedSegments, registry, t, formatDate, formatDateTime]);
|
|
221
227
|
// Resolve the DISPLAYABLE read surface for one ancestor segment — the single
|
|
222
228
|
// predicate behind both the render gate (link vs plain text) and the click
|
|
223
229
|
// handler, so they cannot disagree. Displayable means the READ has a rendered
|
|
@@ -248,10 +254,15 @@ export const ResourceLayoutPreset_Breadcrumb_Default = ({ resourceContext, navig
|
|
|
248
254
|
return undefined;
|
|
249
255
|
return { segmentResourceConfig, segmentContextIdentifiers, readOp };
|
|
250
256
|
};
|
|
251
|
-
// Per-segment clickability, index-aligned with
|
|
252
|
-
//
|
|
253
|
-
//
|
|
254
|
-
|
|
257
|
+
// Per-segment clickability, keyed on the SEGMENT'S IDENTITY. It used to be index-aligned with
|
|
258
|
+
// `parentSegments` and read by index over `resolvedSegments` — but `resolvedSegments` is state set
|
|
259
|
+
// in an effect, one render behind. On the render where the chain changed, index i of one array was
|
|
260
|
+
// a different ancestor from index i of the other, so a crumb's link-or-text was decided from its
|
|
261
|
+
// neighbour. Derived synchronously from the registry — label loading does not affect it.
|
|
262
|
+
const segmentClickability = useMemo(() => new Map(parentSegments.map((segment) => [
|
|
263
|
+
breadcrumbSegmentKey(segment),
|
|
264
|
+
resolveSegmentDisplayableRead(segment) !== undefined,
|
|
265
|
+
])),
|
|
255
266
|
// eslint-disable-next-line react-hooks/exhaustive-deps -- resolver reads registry + contextResourceIdentifiers, both listed
|
|
256
267
|
[parentSegments, registry, contextResourceIdentifiers]);
|
|
257
268
|
// Handle breadcrumb segment click — navigate via navigation controller
|
|
@@ -303,8 +314,12 @@ export const ResourceLayoutPreset_Breadcrumb_Default = ({ resourceContext, navig
|
|
|
303
314
|
// trailing separator ("Org ›", "Org › List ›"): the path visually terminates
|
|
304
315
|
// on the page heading beneath it, which is what keeps a single-ancestor
|
|
305
316
|
// trail legible AS a breadcrumb rather than one orphaned link.
|
|
306
|
-
return (_jsx(Breadcrumb, { children: _jsx(BreadcrumbList, { children:
|
|
317
|
+
return (_jsx(Breadcrumb, { children: _jsx(BreadcrumbList, { children: displayedSegments.map((segment) => (_jsxs(React.Fragment, { children: [_jsx(BreadcrumbItem, { children: segmentClickability.get(breadcrumbSegmentKey(segment)) ? (_jsx(BreadcrumbLink, { href: "#", onClick: (e) => handleSegmentClick(segment, e), className: segment.isLoading ? 'animate-pulse motion-reduce:animate-none' : undefined, children: segment.isLoading ? '...' : segment.label })) : (_jsx("span", { className: segment.isLoading ? 'animate-pulse motion-reduce:animate-none' : undefined, children: segment.isLoading ? '...' : segment.label })) }), _jsx(BreadcrumbSeparator, {})] }, breadcrumbSegmentKey(segment)))) }) }));
|
|
307
318
|
};
|
|
319
|
+
/** One ancestor's identity in the trail — the key both the rendered crumb and its clickability use. */
|
|
320
|
+
function breadcrumbSegmentKey(segment) {
|
|
321
|
+
return `${segment.resourceType}-${segment.resourceId}`;
|
|
322
|
+
}
|
|
308
323
|
export function ResourceLayout_Breadcrumb({ preset = CorePresetNames.DEFAULT, ...props }) {
|
|
309
324
|
const Component = createComponentResolver(FrontendComponentType.RESOURCES_LAYOUTS_BREADCRUMB, 'ResourceLayout_Breadcrumb')(preset);
|
|
310
325
|
return _jsx(Component, { ...props });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceLayout_Breadcrumb.js","sourceRoot":"","sources":["../../../../../src/components/resources/ResourceLayout_Breadcrumb.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * ResourceLayoutPreset_Breadcrumb_Default\n *\n * Renders a breadcrumb navigation chain from the resource's parentResourcesRequirements.\n * Each segment represents a parent resource in the hierarchy chain. The trail is\n * ANCESTORS-ONLY: the current resource is deliberately not rendered as a terminal\n * crumb — the breadcrumb is the path TO the resource, and the resource's own name\n * is already the page heading directly below (2026-08-19). The PRIMARY-SCOPE\n * anchor (tenant/user) is excluded too: it is ambient context owned by the\n * quick-switcher and prefixes every page, so it carries no navigational\n * information — scope-level pages therefore render no breadcrumb at all.\n *\n * Data flow:\n * 1. parentResourcesRequirements → ordered parent chain (from route/context)\n * 2. contextResourceIdentifiers → parent IDs for each segment\n * 3. computeFrontendResourceLabel → async label resolution for each parent\n * 4. selectMatchingRoutePath → URL building for each segment\n *\n * ## Self-referencing tree support (F-12-C)\n *\n * For self-referencing hierarchies (e.g., ORGANIZATION_UNITS tree), the parent\n * requirement has the SAME resource type as the current resource, distinguished\n * by `foreignKeyField` (e.g., `parentUnitId`).\n *\n * - **Deduplication** uses `foreignKeyField || resourceType` as key instead of\n * just resource type, so a self-ref parent entry doesn't collide with different\n * parent types.\n *\n * - **ID lookup** for self-ref parents checks `contextResourceIdentifiers[foreignKeyField]`\n * (e.g., `contextResourceIdentifiers[\"parentUnitId\"]`) because `extractResourceIdentifiersFromUrlParams`\n * stores self-ref parent IDs under the FK field name to avoid key collision\n * with the resource's own entry.\n *\n * - **Depth limit**: `maxDepth` (default 5) caps segments for deep trees.\n * Multi-level tree breadcrumbs (grandparent → parent → child) require the\n * ancestor chain to be fetched from the API — only the immediate parent\n * is available in `contextResourceIdentifiers`.\n */\n\nimport React, { useEffect, useState, useRef, useMemo } from 'react';\nimport { useResourceRegistry } from '~wildo-frontend-lib/core/resources/useResourceRegistry';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { resolveResourceHeaderLabel } from '~wildo-frontend-lib/core/i18n/component-label-resolution.utils';\nimport { useNavigationController } from '~wildo-frontend-lib/core/navigation/useNavigationController';\nimport { FrontendResourceUtils, frontendResourceUtils } from '~wildo-frontend-lib/core/resources/frontend-resource.utils';\nimport { pickPreferredOperationForCoreSemanticAddressability } from '~wildo-frontend-lib/core/resources/resource-addressability.frontend.utils';\nimport { isOperationAddressable, isOperationHeadless } from '~wildo-frontend-lib/core/resources/resources.frontend.schemas';\nimport type { FrontendResource_ParentResourceRequirement } from '~wildo-frontend-lib/core/resources/resource-path.frontend.schemas';\nimport {\n CoreResourceOperation,\n ResourcesConfigOperationsUrlsBuilderUtils,\n} from '@wildo-ai/saas-models';\nimport { NavigationContentType } from '~wildo-frontend-lib/core/navigation/navigation.schemas';\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbSeparator,\n} from '~wildo-frontend-lib/components/navigation/breadcrumb';\n\nimport { ComponentPresetProps } from '~wildo-frontend-lib/core/components-registry/component-registry.frontend.schemas'\nimport { createComponentResolver } from '~wildo-frontend-lib/core/components-registry/component-resolver.frontend.helper'\nimport { CorePresetNames, FrontendComponentType } from '@wildo-ai/presets-components-models'\nimport { BaseResourcesLayoutProps } from './component-props.resources-layout.frontend.schemas'\n\n// --- Contract ---\nexport interface ResourceLayoutPreset_Breadcrumb_DefaultProps extends BaseResourcesLayoutProps {\n /** Maximum depth of breadcrumb segments (loop prevention). Default: 5 */\n maxDepth?: number;\n}\n\n// =============================================================================\n// TYPES (internal)\n// =============================================================================\n\ninterface BreadcrumbSegment {\n resourceType: string;\n resourceId: string;\n ancestorRequirements: FrontendResource_ParentResourceRequirement[];\n label: string | null;\n isLoading: boolean;\n}\n\nfunction buildSegmentContextIdentifiers(params: {\n segment: Pick<BreadcrumbSegment, 'resourceType' | 'resourceId' | 'ancestorRequirements'>;\n contextResourceIdentifiers: ResourceLayoutPreset_Breadcrumb_DefaultProps['resourceContext']['contextResourceIdentifiers'];\n}): Record<string, string | { fieldIdentifier: string; resourceId: string }> {\n const segmentContextIdentifiers: Record<string, string | { fieldIdentifier: string; resourceId: string }> = {};\n for (const requirement of params.segment.ancestorRequirements) {\n const contextKey = requirement.foreignKeyField || requirement.resourceType;\n const identifier = params.contextResourceIdentifiers[contextKey] ?? params.contextResourceIdentifiers[requirement.resourceType];\n const id = typeof identifier === 'string'\n ? identifier\n : identifier?.resourceId;\n if (!id) {\n continue;\n }\n\n if (requirement.foreignKeyField) {\n segmentContextIdentifiers[contextKey] = {\n fieldIdentifier: requirement.foreignKeyField,\n resourceId: id,\n };\n } else {\n segmentContextIdentifiers[requirement.resourceType] = id;\n }\n }\n segmentContextIdentifiers[params.segment.resourceType] = params.segment.resourceId;\n\n return segmentContextIdentifiers;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport const ResourceLayoutPreset_Breadcrumb_Default: React.FC<ResourceLayoutPreset_Breadcrumb_DefaultProps> = ({\n resourceContext,\n navigationZone,\n navigationInitiator,\n maxDepth = 5,\n}) => {\n const { resourceType, contextResourceIdentifiers, parentResourcesRequirements } = resourceContext;\n const { registry, doOperation } = useResourceRegistry();\n const { tResourceHeader, t, isReady } = useI18n({ resource: resourceType });\n const { navigate } = useNavigationController();\n\n // Stable refs for async operations\n const doOperationRef = useRef(doOperation);\n const tRef = useRef(t);\n doOperationRef.current = doOperation;\n tRef.current = t;\n\n // Build ordered parent segments from parentResourcesRequirements\n const parentSegments = useMemo(() => {\n if (!parentResourcesRequirements || parentResourcesRequirements.length === 0) return [];\n\n const segments: Array<{\n resourceType: string;\n resourceId: string;\n ancestorRequirements: FrontendResource_ParentResourceRequirement[];\n }> = [];\n // Use FK field (or resource type) as dedupe key — allows one entry per distinct FK,\n // so self-ref parents (e.g., parentUnitId) and the resource itself (unitId) don't collide.\n const seenKeys = new Set<string>();\n const resolvedRequirementChain: FrontendResource_ParentResourceRequirement[] = [];\n\n for (const req of parentResourcesRequirements) {\n const dedupeKey = req.foreignKeyField || req.resourceType;\n if (seenKeys.has(dedupeKey)) continue;\n seenKeys.add(dedupeKey);\n\n if (segments.length >= maxDepth) break;\n\n // For self-ref parents (FK-keyed), look up by FK field name in contextResourceIdentifiers.\n // For normal parents, look up by resource type.\n let resourceId: string | undefined;\n \n if (req.foreignKeyField && contextResourceIdentifiers[req.foreignKeyField]) {\n const entry = contextResourceIdentifiers[req.foreignKeyField];\n resourceId = typeof entry === 'string' ? entry : entry.resourceId;\n } else {\n const identifier = contextResourceIdentifiers[req.resourceType];\n if (!identifier) continue;\n resourceId = typeof identifier === 'string' ? identifier : identifier.resourceId;\n }\n\n if (resourceId) {\n // PRIMARY-SCOPE anchor (the tenant / user scope): ambient context owned\n // by the quick-switcher, not a navigational ancestor — NEVER rendered\n // as a crumb (2026-08-19; on scope-level pages this leaves the trail\n // empty and the breadcrumb self-hides). It still joins the resolved\n // requirement chain so DEEPER crumbs keep resolving their routes and\n // context — their URLs still carry the scope segment.\n if (!req.isPrimaryScope) {\n segments.push({\n resourceType: req.resourceType,\n resourceId,\n ancestorRequirements: [...resolvedRequirementChain],\n });\n }\n resolvedRequirementChain.push(req);\n }\n }\n\n return segments;\n }, [parentResourcesRequirements, contextResourceIdentifiers, maxDepth]);\n\n // State for resolved labels (async)\n const [resolvedSegments, setResolvedSegments] = useState<BreadcrumbSegment[]>([]);\n\n // Resolve labels for each parent segment\n useEffect(() => {\n if (parentSegments.length === 0) {\n setResolvedSegments([]);\n return;\n }\n\n // Initialize with loading state\n setResolvedSegments(\n parentSegments.map(seg => ({\n ...seg,\n label: null,\n isLoading: true,\n }))\n );\n\n let cancelled = false;\n\n const resolveLabels = async () => {\n const results = await Promise.allSettled(\n parentSegments.map(async (seg) => {\n const segmentResourceConfig = registry.resourceConfigurations[seg.resourceType];\n const params = FrontendResourceUtils.buildForeignKeyFetchParams(seg.resourceType, seg.resourceId, registry);\n const segmentContextResourceIdentifiers = buildSegmentContextIdentifiers({\n segment: seg,\n contextResourceIdentifiers,\n });\n const readOperation = segmentResourceConfig\n ? pickPreferredOperationForCoreSemanticAddressability({\n resourceConfig: segmentResourceConfig,\n operations: segmentResourceConfig.operations ?? [],\n coreOperation: CoreResourceOperation.READ,\n registry,\n hasResourceId: true,\n requireFrontendAddressable: true,\n contextResourceIdentifiers: segmentContextResourceIdentifiers,\n contextualParameters: {\n ...FrontendResourceUtils.buildContextualParameters(segmentContextResourceIdentifiers, registry),\n ...(params.contextualParameters ?? {}),\n },\n })\n : undefined;\n // Opportunistic label fetch — non-throwing so a segment whose resource\n // has no URL-bearing READ (e.g. an embedded/LIST-only config) falls back\n // to the header title instead of rejecting the whole segment map.\n const operationPath = FrontendResourceUtils.tryBuildForeignKeyReadOperationPath(\n seg.resourceType,\n registry,\n readOperation,\n );\n\n // Fallback: resource header title + ID fragment.\n const fallbackSegment = () => {\n const headerTitle = resolveResourceHeaderLabel({\n tResourceHeader,\n resourceType: seg.resourceType,\n key: 'title',\n });\n return {\n ...seg,\n // An unlabelled resource shows its header KEY here, never a bare id fragment (#1414).\n label: `${headerTitle} #${seg.resourceId.slice(0, 8)}`,\n isLoading: false,\n };\n };\n\n if (!operationPath) {\n return fallbackSegment();\n }\n\n try {\n const data = await doOperationRef.current(operationPath, params);\n const label = FrontendResourceUtils.computeFrontendResourceLabel({\n resourceType: seg.resourceType,\n registry,\n currentObject: data,\n t: tRef.current,\n });\n return { ...seg, label: label || seg.resourceId, isLoading: false };\n } catch {\n return fallbackSegment();\n }\n })\n );\n\n if (cancelled) return;\n\n setResolvedSegments(\n results.map((result, i) =>\n result.status === 'fulfilled'\n ? result.value\n : { ...parentSegments[i], label: parentSegments[i].resourceId.slice(0, 8), isLoading: false }\n )\n );\n };\n\n resolveLabels();\n\n return () => { cancelled = true; };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- using refs for unstable functions\n }, [contextResourceIdentifiers, parentSegments, registry, tResourceHeader]);\n\n // Resolve the DISPLAYABLE read surface for one ancestor segment — the single\n // predicate behind both the render gate (link vs plain text) and the click\n // handler, so they cannot disagree. Displayable means the READ has a rendered\n // interface: surface ADDRESSABLE (routable page) or EMBEDDED (overlay/zone\n // content). API_ONLY (headless) reads are filtered out up front — a crumb for\n // such an ancestor renders as plain text. Note the deliberate difference from\n // `requireFrontendAddressable: true` (strict ADDRESSABLE): an EMBEDDED read is\n // still a legitimate click target, it just navigates as zone content without\n // owning a URL.\n const resolveSegmentDisplayableRead = (\n segment: Pick<BreadcrumbSegment, 'resourceType' | 'resourceId' | 'ancestorRequirements'>,\n ) => {\n const segmentResourceConfig = registry.resourceConfigurations[segment.resourceType];\n if (!segmentResourceConfig) return undefined;\n\n const segmentContextIdentifiers = buildSegmentContextIdentifiers({\n segment,\n contextResourceIdentifiers,\n });\n const readOp = pickPreferredOperationForCoreSemanticAddressability({\n resourceConfig: segmentResourceConfig,\n operations: (segmentResourceConfig.operations ?? []).filter(\n (operation) => !isOperationHeadless(operation.operationFrontendConfig),\n ),\n coreOperation: CoreResourceOperation.READ,\n registry,\n hasResourceId: true,\n contextResourceIdentifiers: segmentContextIdentifiers,\n contextualParameters: FrontendResourceUtils.buildContextualParameters(\n segmentContextIdentifiers,\n registry,\n ),\n });\n if (!readOp) return undefined;\n return { segmentResourceConfig, segmentContextIdentifiers, readOp };\n };\n\n // Per-segment clickability, index-aligned with `parentSegments` (and therefore\n // with `resolvedSegments`, which is its label-resolved projection). Derived\n // synchronously from the registry — label loading does not affect it.\n const segmentClickability = useMemo(\n () => parentSegments.map((segment) => resolveSegmentDisplayableRead(segment) !== undefined),\n // eslint-disable-next-line react-hooks/exhaustive-deps -- resolver reads registry + contextResourceIdentifiers, both listed\n [parentSegments, registry, contextResourceIdentifiers],\n );\n\n // Handle breadcrumb segment click — navigate via navigation controller\n const handleSegmentClick = (segment: BreadcrumbSegment, e: React.MouseEvent) => {\n e.preventDefault();\n\n const resolved = resolveSegmentDisplayableRead(segment);\n if (!resolved) return;\n const { segmentResourceConfig, segmentContextIdentifiers, readOp } = resolved;\n\n const readContext = frontendResourceUtils.createFrontendResourceOperationContextFromOperation({\n resourceType: segment.resourceType,\n operation: readOp,\n contextResourceIdentifiers: segmentContextIdentifiers,\n isOperationDefault: true,\n parentResourcesRequirements: segment.ancestorRequirements,\n });\n\n // Only an ADDRESSABLE read owns a browser URL. An EMBEDDED read navigates\n // as pure zone/overlay content — handing it a urlPath would point the\n // browser at a route AppRouter never registered (broken refresh/deep-link).\n let urlPath: string | undefined;\n if (isOperationAddressable(readOp.operationFrontendConfig)) {\n const routePaths = ResourcesConfigOperationsUrlsBuilderUtils.buildOperationFrontendRoutePaths(\n segmentResourceConfig,\n readOp,\n registry.allResourceFieldIdentifiers\n );\n urlPath = frontendResourceUtils.selectMatchingRoutePath(\n routePaths,\n segmentContextIdentifiers,\n segmentResourceConfig.resourceIdentifier,\n segmentResourceConfig.resourceFieldIdentifier,\n segment.ancestorRequirements,\n )?.url;\n }\n\n navigate({\n content: {\n contentType: NavigationContentType.RESOURCE_OPERATION,\n resourceContext: readContext,\n },\n urlPath,\n initiator: {\n sourceZone: navigationZone,\n },\n });\n };\n\n // Don't render if no parent segments. MUST stay below every hook: this\n // condition can flip between renders (context identifiers hydrate after\n // mount), and an early return above a hook would shift the hook order and\n // crash the whole surface (\"Rendered more hooks than during the previous\n // render\") the first time a parent chain appears.\n if (parentSegments.length === 0) {\n return null;\n }\n\n if (!isReady) return null;\n\n // The trail is the PATH TO the resource — ancestors only, the current\n // resource itself excluded (its name is the page heading right below;\n // repeating it as a terminal crumb was redundant). EVERY ancestor carries a\n // trailing separator (\"Org ›\", \"Org › List ›\"): the path visually terminates\n // on the page heading beneath it, which is what keeps a single-ancestor\n // trail legible AS a breadcrumb rather than one orphaned link.\n return (\n <Breadcrumb>\n <BreadcrumbList>\n {resolvedSegments.map((segment, index) => (\n <React.Fragment key={`${segment.resourceType}-${segment.resourceId}`}>\n <BreadcrumbItem>\n {/* A crumb is a LINK only when the ancestor's READ is displayable\n (ADDRESSABLE or EMBEDDED — never API_ONLY) and satisfiable from\n the current context; otherwise the segment stays visible as\n plain text so the path is never silently shortened. */}\n {segmentClickability[index] ? (\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => handleSegmentClick(segment, e)}\n className={segment.isLoading ? 'animate-pulse motion-reduce:animate-none' : undefined}\n >\n {segment.isLoading ? '...' : segment.label}\n </BreadcrumbLink>\n ) : (\n <span className={segment.isLoading ? 'animate-pulse motion-reduce:animate-none' : undefined}>\n {segment.isLoading ? '...' : segment.label}\n </span>\n )}\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n </React.Fragment>\n ))}\n </BreadcrumbList>\n </Breadcrumb>\n );\n};\n\nexport function ResourceLayout_Breadcrumb({ preset = CorePresetNames.DEFAULT, ...props }: ResourceLayoutPreset_Breadcrumb_DefaultProps & ComponentPresetProps): React.JSX.Element {\n const Component = createComponentResolver<ResourceLayoutPreset_Breadcrumb_DefaultProps>(FrontendComponentType.RESOURCES_LAYOUTS_BREADCRUMB, 'ResourceLayout_Breadcrumb')(preset);\n return <Component {...props} />;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ResourceLayout_Breadcrumb.js","sourceRoot":"","sources":["../../../../../src/components/resources/ResourceLayout_Breadcrumb.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wDAAwD,CAAC;AAC7F,OAAO,EAAE,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAChE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gEAAgE,CAAC;AAC5G,OAAO,EAAE,uBAAuB,EAAE,MAAM,6DAA6D,CAAC;AACtG,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,4DAA4D,CAAC;AAC1H,OAAO,EAAE,mDAAmD,EAAE,MAAM,2EAA2E,CAAC;AAChJ,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,+DAA+D,CAAC;AAE5H,OAAO,EACL,qBAAqB,EACrB,yCAAyC,GAC1C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,wDAAwD,CAAC;AAC/F,OAAO,EACL,UAAU,EACV,cAAc,EACd,cAAc,EACd,cAAc,EACd,mBAAmB,GACpB,MAAM,sDAAsD,CAAC;AAG9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iFAAiF,CAAA;AACzH,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAA;AA0B5F,SAAS,8BAA8B,CAAC,MAGvC;IACC,MAAM,yBAAyB,GAA6E,EAAE,CAAC;IAC/G,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;QAC9D,MAAM,UAAU,GAAG,WAAW,CAAC,eAAe,IAAI,WAAW,CAAC,YAAY,CAAC;QAC3E,MAAM,UAAU,GAAG,MAAM,CAAC,0BAA0B,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,0BAA0B,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAChI,MAAM,EAAE,GAAG,OAAO,UAAU,KAAK,QAAQ;YACvC,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC;QAC3B,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,SAAS;QACX,CAAC;QAED,IAAI,WAAW,CAAC,eAAe,EAAE,CAAC;YAChC,yBAAyB,CAAC,UAAU,CAAC,GAAG;gBACtC,eAAe,EAAE,WAAW,CAAC,eAAe;gBAC5C,UAAU,EAAE,EAAE;aACf,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,yBAAyB,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;IAEnF,OAAO,yBAAyB,CAAC;AACnC,CAAC;AAED,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,MAAM,CAAC,MAAM,uCAAuC,GAA2D,CAAC,EAC9G,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,QAAQ,GAAG,CAAC,GACb,EAAE,EAAE;IACH,MAAM,EAAE,YAAY,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,GAAG,eAAe,CAAC;IAClG,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACxD,MAAM,EAAE,eAAe,EAAE,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;IACxG,MAAM,EAAE,QAAQ,EAAE,GAAG,uBAAuB,EAAE,CAAC;IAE/C,wFAAwF;IACxF,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3C,cAAc,CAAC,OAAO,GAAG,WAAW,CAAC;IAErC,iEAAiE;IACjE,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;QAClC,IAAI,CAAC,2BAA2B,IAAI,2BAA2B,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAExF,MAAM,QAAQ,GAIT,EAAE,CAAC;QACR,oFAAoF;QACpF,2FAA2F;QAC3F,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,MAAM,wBAAwB,GAAiD,EAAE,CAAC;QAElF,KAAK,MAAM,GAAG,IAAI,2BAA2B,EAAE,CAAC;YAC9C,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,YAAY,CAAC;YAC1D,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,SAAS;YACtC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAExB,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ;gBAAE,MAAM;YAEvC,2FAA2F;YAC3F,gDAAgD;YAChD,IAAI,UAA8B,CAAC;YAEnC,IAAI,GAAG,CAAC,eAAe,IAAI,0BAA0B,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC3E,MAAM,KAAK,GAAG,0BAA0B,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBAC9D,UAAU,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,MAAM,UAAU,GAAG,0BAA0B,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAChE,IAAI,CAAC,UAAU;oBAAE,SAAS;gBAC1B,UAAU,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;YACnF,CAAC;YAED,IAAI,UAAU,EAAE,CAAC;gBACf,wEAAwE;gBACxE,sEAAsE;gBACtE,qEAAqE;gBACrE,oEAAoE;gBACpE,qEAAqE;gBACrE,sDAAsD;gBACtD,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;oBACxB,QAAQ,CAAC,IAAI,CAAC;wBACZ,YAAY,EAAE,GAAG,CAAC,YAAY;wBAC9B,UAAU;wBACV,oBAAoB,EAAE,CAAC,GAAG,wBAAwB,CAAC;qBACpD,CAAC,CAAC;gBACL,CAAC;gBACD,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC,EAAE,CAAC,2BAA2B,EAAE,0BAA0B,EAAE,QAAQ,CAAC,CAAC,CAAC;IAExE,oCAAoC;IACpC,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAsB,EAAE,CAAC,CAAC;IAElF,yCAAyC;IACzC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,mBAAmB,CAAC,EAAE,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QAED,gCAAgC;QAChC,mBAAmB,CACjB,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzB,GAAG,GAAG;YACN,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC,CACJ,CAAC;QAEF,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;YAC/B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC/B,MAAM,qBAAqB,GAAG,QAAQ,CAAC,sBAAsB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAChF,MAAM,MAAM,GAAG,qBAAqB,CAAC,0BAA0B,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAC5G,MAAM,iCAAiC,GAAG,8BAA8B,CAAC;oBACvE,OAAO,EAAE,GAAG;oBACZ,0BAA0B;iBAC3B,CAAC,CAAC;gBACH,MAAM,aAAa,GAAG,qBAAqB;oBACzC,CAAC,CAAC,mDAAmD,CAAC;wBACpD,cAAc,EAAE,qBAAqB;wBACrC,UAAU,EAAE,qBAAqB,CAAC,UAAU,IAAI,EAAE;wBAClD,aAAa,EAAE,qBAAqB,CAAC,IAAI;wBACzC,QAAQ;wBACR,aAAa,EAAE,IAAI;wBACnB,0BAA0B,EAAE,IAAI;wBAChC,0BAA0B,EAAE,iCAAiC;wBAC7D,oBAAoB,EAAE;4BACpB,GAAG,qBAAqB,CAAC,yBAAyB,CAAC,iCAAiC,EAAE,QAAQ,CAAC;4BAC/F,GAAG,CAAC,MAAM,CAAC,oBAAoB,IAAI,EAAE,CAAC;yBACvC;qBACF,CAAC;oBACF,CAAC,CAAC,SAAS,CAAC;gBACd,uEAAuE;gBACvE,yEAAyE;gBACzE,kEAAkE;gBAClE,MAAM,aAAa,GAAG,qBAAqB,CAAC,mCAAmC,CAC7E,GAAG,CAAC,YAAY,EAChB,QAAQ,EACR,aAAa,CACd,CAAC;gBAEF,iDAAiD;gBACjD,MAAM,eAAe,GAAG,GAAG,EAAE;oBAC3B,MAAM,WAAW,GAAG,0BAA0B,CAAC;wBAC7C,eAAe;wBACf,YAAY,EAAE,GAAG,CAAC,YAAY;wBAC9B,GAAG,EAAE,OAAO;qBACb,CAAC,CAAC;oBACH,OAAO;wBACL,GAAG,GAAG;wBACN,sFAAsF;wBACtF,KAAK,EAAE,GAAG,WAAW,KAAK,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;wBACtD,SAAS,EAAE,KAAK;qBACjB,CAAC;gBACJ,CAAC,CAAC;gBAEF,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,OAAO,eAAe,EAAE,CAAC;gBAC3B,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;oBACjE,OAAO,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBACjE,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,eAAe,EAAE,CAAC;gBAC3B,CAAC;YACH,CAAC,CAAC,CACH,CAAC;YAEF,IAAI,SAAS;gBAAE,OAAO;YAEtB,mBAAmB,CACjB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CACxB,MAAM,CAAC,MAAM,KAAK,WAAW;gBAC3B,CAAC,CAAC,MAAM,CAAC,KAAK;gBACd,CAAC,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAChG,CACF,CAAC;QACJ,CAAC,CAAC;QAEF,aAAa,EAAE,CAAC;QAEhB,OAAO,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,4FAA4F;IAC5F,CAAC,EAAE,CAAC,0BAA0B,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;IAE5E,0GAA0G;IAC1G,MAAM,iBAAiB,GAAG,OAAO,CAC/B,GAAG,EAAE,CACH,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAC/B,OAAO,CAAC,MAAM,KAAK,SAAS;QAC1B,CAAC,CAAC,OAAO;QACT,CAAC,CAAC;YACA,GAAG,OAAO;YACV,KAAK,EACH,qBAAqB,CAAC,4BAA4B,CAAC;gBACjD,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,QAAQ;gBACR,aAAa,EAAE,OAAO,CAAC,MAAM;gBAC7B,CAAC;gBACD,UAAU;gBACV,cAAc;aACf,CAAC,IAAI,OAAO,CAAC,UAAU;SAC3B,CACJ,EACH,CAAC,gBAAgB,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,cAAc,CAAC,CAC5D,CAAC;IAEF,6EAA6E;IAC7E,2EAA2E;IAC3E,8EAA8E;IAC9E,2EAA2E;IAC3E,8EAA8E;IAC9E,8EAA8E;IAC9E,+EAA+E;IAC/E,6EAA6E;IAC7E,gBAAgB;IAChB,MAAM,6BAA6B,GAAG,CACpC,OAAwF,EACxF,EAAE;QACF,MAAM,qBAAqB,GAAG,QAAQ,CAAC,sBAAsB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACpF,IAAI,CAAC,qBAAqB;YAAE,OAAO,SAAS,CAAC;QAE7C,MAAM,yBAAyB,GAAG,8BAA8B,CAAC;YAC/D,OAAO;YACP,0BAA0B;SAC3B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,mDAAmD,CAAC;YACjE,cAAc,EAAE,qBAAqB;YACrC,UAAU,EAAE,CAAC,qBAAqB,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,CACzD,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,uBAAuB,CAAC,CACvE;YACD,aAAa,EAAE,qBAAqB,CAAC,IAAI;YACzC,QAAQ;YACR,aAAa,EAAE,IAAI;YACnB,0BAA0B,EAAE,yBAAyB;YACrD,oBAAoB,EAAE,qBAAqB,CAAC,yBAAyB,CACnE,yBAAyB,EACzB,QAAQ,CACT;SACF,CAAC,CAAC;QACH,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC9B,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,EAAE,CAAC;IACtE,CAAC,CAAC;IAEF,8FAA8F;IAC9F,mGAAmG;IACnG,mGAAmG;IACnG,iGAAiG;IACjG,yFAAyF;IACzF,MAAM,mBAAmB,GAAG,OAAO,CACjC,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,oBAAoB,CAAC,OAAO,CAAC;QAC7B,6BAA6B,CAAC,OAAO,CAAC,KAAK,SAAS;KACrD,CAAC,CAAC;IACH,4HAA4H;IAC5H,CAAC,cAAc,EAAE,QAAQ,EAAE,0BAA0B,CAAC,CACvD,CAAC;IAEF,uEAAuE;IACvE,MAAM,kBAAkB,GAAG,CAAC,OAA0B,EAAE,CAAmB,EAAE,EAAE;QAC7E,CAAC,CAAC,cAAc,EAAE,CAAC;QAEnB,MAAM,QAAQ,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;QAE9E,MAAM,WAAW,GAAG,qBAAqB,CAAC,mDAAmD,CAAC;YAC5F,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,SAAS,EAAE,MAAM;YACjB,0BAA0B,EAAE,yBAAyB;YACrD,kBAAkB,EAAE,IAAI;YACxB,2BAA2B,EAAE,OAAO,CAAC,oBAAoB;SAC1D,CAAC,CAAC;QAEH,0EAA0E;QAC1E,sEAAsE;QACtE,4EAA4E;QAC5E,IAAI,OAA2B,CAAC;QAChC,IAAI,sBAAsB,CAAC,MAAM,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAC3D,MAAM,UAAU,GAAG,yCAAyC,CAAC,gCAAgC,CAC3F,qBAAqB,EACrB,MAAM,EACN,QAAQ,CAAC,2BAA2B,CACrC,CAAC;YACF,OAAO,GAAG,qBAAqB,CAAC,uBAAuB,CACrD,UAAU,EACV,yBAAyB,EACzB,qBAAqB,CAAC,kBAAkB,EACxC,qBAAqB,CAAC,uBAAuB,EAC7C,OAAO,CAAC,oBAAoB,CAC7B,EAAE,GAAG,CAAC;QACT,CAAC;QAED,QAAQ,CAAC;YACP,OAAO,EAAE;gBACP,WAAW,EAAE,qBAAqB,CAAC,kBAAkB;gBACrD,eAAe,EAAE,WAAW;aAC7B;YACD,OAAO;YACP,SAAS,EAAE;gBACT,UAAU,EAAE,cAAc;aAC3B;SACF,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,uEAAuE;IACvE,wEAAwE;IACxE,0EAA0E;IAC1E,yEAAyE;IACzE,kDAAkD;IAClD,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,sEAAsE;IACtE,sEAAsE;IACtE,4EAA4E;IAC5E,6EAA6E;IAC7E,wEAAwE;IACxE,+DAA+D;IAC/D,OAAO,CACL,KAAC,UAAU,cACT,KAAC,cAAc,cACZ,iBAAiB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAClC,MAAC,KAAK,CAAC,QAAQ,eACb,KAAC,cAAc,cAKZ,mBAAmB,CAAC,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CACxD,KAAC,cAAc,IACb,IAAI,EAAC,GAAG,EACR,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,EAC9C,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAC,SAAS,YAEpF,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,GAC3B,CAClB,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAC,SAAS,YACxF,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,GACrC,CACR,GACc,EACjB,KAAC,mBAAmB,KAAG,KApBJ,oBAAoB,CAAC,OAAO,CAAC,CAqBjC,CAClB,CAAC,GACa,GACN,CACd,CAAC;AACJ,CAAC,CAAC;AAEF,uGAAuG;AACvG,SAAS,oBAAoB,CAAC,OAA+D;IAC3F,OAAO,GAAG,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,GAAG,KAAK,EAAuE;IAC3J,MAAM,SAAS,GAAG,uBAAuB,CAA+C,qBAAqB,CAAC,4BAA4B,EAAE,2BAA2B,CAAC,CAAC,MAAM,CAAC,CAAC;IACjL,OAAO,KAAC,SAAS,OAAK,KAAK,GAAI,CAAC;AAClC,CAAC","sourcesContent":["/**\n * ResourceLayoutPreset_Breadcrumb_Default\n *\n * Renders a breadcrumb navigation chain from the resource's parentResourcesRequirements.\n * Each segment represents a parent resource in the hierarchy chain. The trail is\n * ANCESTORS-ONLY: the current resource is deliberately not rendered as a terminal\n * crumb — the breadcrumb is the path TO the resource, and the resource's own name\n * is already the page heading directly below (2026-08-19). The PRIMARY-SCOPE\n * anchor (tenant/user) is excluded too: it is ambient context owned by the\n * quick-switcher and prefixes every page, so it carries no navigational\n * information — scope-level pages therefore render no breadcrumb at all.\n *\n * Data flow:\n * 1. parentResourcesRequirements → ordered parent chain (from route/context)\n * 2. contextResourceIdentifiers → parent IDs for each segment\n * 3. computeFrontendResourceLabel → async label resolution for each parent\n * 4. selectMatchingRoutePath → URL building for each segment\n *\n * ## Self-referencing tree support (F-12-C)\n *\n * For self-referencing hierarchies (e.g., ORGANIZATION_UNITS tree), the parent\n * requirement has the SAME resource type as the current resource, distinguished\n * by `foreignKeyField` (e.g., `parentUnitId`).\n *\n * - **Deduplication** uses `foreignKeyField || resourceType` as key instead of\n * just resource type, so a self-ref parent entry doesn't collide with different\n * parent types.\n *\n * - **ID lookup** for self-ref parents checks `contextResourceIdentifiers[foreignKeyField]`\n * (e.g., `contextResourceIdentifiers[\"parentUnitId\"]`) because `extractResourceIdentifiersFromUrlParams`\n * stores self-ref parent IDs under the FK field name to avoid key collision\n * with the resource's own entry.\n *\n * - **Depth limit**: `maxDepth` (default 5) caps segments for deep trees.\n * Multi-level tree breadcrumbs (grandparent → parent → child) require the\n * ancestor chain to be fetched from the API — only the immediate parent\n * is available in `contextResourceIdentifiers`.\n */\n\nimport React, { useEffect, useState, useRef, useMemo } from 'react';\nimport { useResourceRegistry } from '~wildo-frontend-lib/core/resources/useResourceRegistry';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { resolveResourceHeaderLabel } from '~wildo-frontend-lib/core/i18n/component-label-resolution.utils';\nimport { useNavigationController } from '~wildo-frontend-lib/core/navigation/useNavigationController';\nimport { FrontendResourceUtils, frontendResourceUtils } from '~wildo-frontend-lib/core/resources/frontend-resource.utils';\nimport { pickPreferredOperationForCoreSemanticAddressability } from '~wildo-frontend-lib/core/resources/resource-addressability.frontend.utils';\nimport { isOperationAddressable, isOperationHeadless } from '~wildo-frontend-lib/core/resources/resources.frontend.schemas';\nimport type { FrontendResource_ParentResourceRequirement } from '~wildo-frontend-lib/core/resources/resource-path.frontend.schemas';\nimport {\n CoreResourceOperation,\n ResourcesConfigOperationsUrlsBuilderUtils,\n} from '@wildo-ai/saas-models';\nimport { NavigationContentType } from '~wildo-frontend-lib/core/navigation/navigation.schemas';\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbSeparator,\n} from '~wildo-frontend-lib/components/navigation/breadcrumb';\n\nimport { ComponentPresetProps } from '~wildo-frontend-lib/core/components-registry/component-registry.frontend.schemas'\nimport { createComponentResolver } from '~wildo-frontend-lib/core/components-registry/component-resolver.frontend.helper'\nimport { CorePresetNames, FrontendComponentType } from '@wildo-ai/presets-components-models'\nimport { BaseResourcesLayoutProps } from './component-props.resources-layout.frontend.schemas'\n\n// --- Contract ---\nexport interface ResourceLayoutPreset_Breadcrumb_DefaultProps extends BaseResourcesLayoutProps {\n /** Maximum depth of breadcrumb segments (loop prevention). Default: 5 */\n maxDepth?: number;\n}\n\n// =============================================================================\n// TYPES (internal)\n// =============================================================================\n\ninterface BreadcrumbSegment {\n resourceType: string;\n resourceId: string;\n ancestorRequirements: FrontendResource_ParentResourceRequirement[];\n label: string | null;\n isLoading: boolean;\n /**\n * The ancestor row as read, when the read succeeded. Its name is derived from it at render, so a name built\n * with `t` or a date formatter follows the viewer's language and regional preferences without a re-read.\n */\n record?: unknown;\n}\n\nfunction buildSegmentContextIdentifiers(params: {\n segment: Pick<BreadcrumbSegment, 'resourceType' | 'resourceId' | 'ancestorRequirements'>;\n contextResourceIdentifiers: ResourceLayoutPreset_Breadcrumb_DefaultProps['resourceContext']['contextResourceIdentifiers'];\n}): Record<string, string | { fieldIdentifier: string; resourceId: string }> {\n const segmentContextIdentifiers: Record<string, string | { fieldIdentifier: string; resourceId: string }> = {};\n for (const requirement of params.segment.ancestorRequirements) {\n const contextKey = requirement.foreignKeyField || requirement.resourceType;\n const identifier = params.contextResourceIdentifiers[contextKey] ?? params.contextResourceIdentifiers[requirement.resourceType];\n const id = typeof identifier === 'string'\n ? identifier\n : identifier?.resourceId;\n if (!id) {\n continue;\n }\n\n if (requirement.foreignKeyField) {\n segmentContextIdentifiers[contextKey] = {\n fieldIdentifier: requirement.foreignKeyField,\n resourceId: id,\n };\n } else {\n segmentContextIdentifiers[requirement.resourceType] = id;\n }\n }\n segmentContextIdentifiers[params.segment.resourceType] = params.segment.resourceId;\n\n return segmentContextIdentifiers;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport const ResourceLayoutPreset_Breadcrumb_Default: React.FC<ResourceLayoutPreset_Breadcrumb_DefaultProps> = ({\n resourceContext,\n navigationZone,\n navigationInitiator,\n maxDepth = 5,\n}) => {\n const { resourceType, contextResourceIdentifiers, parentResourcesRequirements } = resourceContext;\n const { registry, doOperation } = useResourceRegistry();\n const { tResourceHeader, t, formatDate, formatDateTime, isReady } = useI18n({ resource: resourceType });\n const { navigate } = useNavigationController();\n\n // A stable ref, so the label fetch does not re-run when `doOperation` changes identity.\n const doOperationRef = useRef(doOperation);\n doOperationRef.current = doOperation;\n\n // Build ordered parent segments from parentResourcesRequirements\n const parentSegments = useMemo(() => {\n if (!parentResourcesRequirements || parentResourcesRequirements.length === 0) return [];\n\n const segments: Array<{\n resourceType: string;\n resourceId: string;\n ancestorRequirements: FrontendResource_ParentResourceRequirement[];\n }> = [];\n // Use FK field (or resource type) as dedupe key — allows one entry per distinct FK,\n // so self-ref parents (e.g., parentUnitId) and the resource itself (unitId) don't collide.\n const seenKeys = new Set<string>();\n const resolvedRequirementChain: FrontendResource_ParentResourceRequirement[] = [];\n\n for (const req of parentResourcesRequirements) {\n const dedupeKey = req.foreignKeyField || req.resourceType;\n if (seenKeys.has(dedupeKey)) continue;\n seenKeys.add(dedupeKey);\n\n if (segments.length >= maxDepth) break;\n\n // For self-ref parents (FK-keyed), look up by FK field name in contextResourceIdentifiers.\n // For normal parents, look up by resource type.\n let resourceId: string | undefined;\n \n if (req.foreignKeyField && contextResourceIdentifiers[req.foreignKeyField]) {\n const entry = contextResourceIdentifiers[req.foreignKeyField];\n resourceId = typeof entry === 'string' ? entry : entry.resourceId;\n } else {\n const identifier = contextResourceIdentifiers[req.resourceType];\n if (!identifier) continue;\n resourceId = typeof identifier === 'string' ? identifier : identifier.resourceId;\n }\n\n if (resourceId) {\n // PRIMARY-SCOPE anchor (the tenant / user scope): ambient context owned\n // by the quick-switcher, not a navigational ancestor — NEVER rendered\n // as a crumb (2026-08-19; on scope-level pages this leaves the trail\n // empty and the breadcrumb self-hides). It still joins the resolved\n // requirement chain so DEEPER crumbs keep resolving their routes and\n // context — their URLs still carry the scope segment.\n if (!req.isPrimaryScope) {\n segments.push({\n resourceType: req.resourceType,\n resourceId,\n ancestorRequirements: [...resolvedRequirementChain],\n });\n }\n resolvedRequirementChain.push(req);\n }\n }\n\n return segments;\n }, [parentResourcesRequirements, contextResourceIdentifiers, maxDepth]);\n\n // State for resolved labels (async)\n const [resolvedSegments, setResolvedSegments] = useState<BreadcrumbSegment[]>([]);\n\n // Resolve labels for each parent segment\n useEffect(() => {\n if (parentSegments.length === 0) {\n setResolvedSegments([]);\n return;\n }\n\n // Initialize with loading state\n setResolvedSegments(\n parentSegments.map(seg => ({\n ...seg,\n label: null,\n isLoading: true,\n }))\n );\n\n let cancelled = false;\n\n const resolveLabels = async () => {\n const results = await Promise.allSettled(\n parentSegments.map(async (seg) => {\n const segmentResourceConfig = registry.resourceConfigurations[seg.resourceType];\n const params = FrontendResourceUtils.buildForeignKeyFetchParams(seg.resourceType, seg.resourceId, registry);\n const segmentContextResourceIdentifiers = buildSegmentContextIdentifiers({\n segment: seg,\n contextResourceIdentifiers,\n });\n const readOperation = segmentResourceConfig\n ? pickPreferredOperationForCoreSemanticAddressability({\n resourceConfig: segmentResourceConfig,\n operations: segmentResourceConfig.operations ?? [],\n coreOperation: CoreResourceOperation.READ,\n registry,\n hasResourceId: true,\n requireFrontendAddressable: true,\n contextResourceIdentifiers: segmentContextResourceIdentifiers,\n contextualParameters: {\n ...FrontendResourceUtils.buildContextualParameters(segmentContextResourceIdentifiers, registry),\n ...(params.contextualParameters ?? {}),\n },\n })\n : undefined;\n // Opportunistic label fetch — non-throwing so a segment whose resource\n // has no URL-bearing READ (e.g. an embedded/LIST-only config) falls back\n // to the header title instead of rejecting the whole segment map.\n const operationPath = FrontendResourceUtils.tryBuildForeignKeyReadOperationPath(\n seg.resourceType,\n registry,\n readOperation,\n );\n\n // Fallback: resource header title + ID fragment.\n const fallbackSegment = () => {\n const headerTitle = resolveResourceHeaderLabel({\n tResourceHeader,\n resourceType: seg.resourceType,\n key: 'title',\n });\n return {\n ...seg,\n // An unlabelled resource shows its header KEY here, never a bare id fragment (#1414).\n label: `${headerTitle} #${seg.resourceId.slice(0, 8)}`,\n isLoading: false,\n };\n };\n\n if (!operationPath) {\n return fallbackSegment();\n }\n\n try {\n const data = await doOperationRef.current(operationPath, params);\n return { ...seg, label: null, record: data, isLoading: false };\n } catch {\n return fallbackSegment();\n }\n })\n );\n\n if (cancelled) return;\n\n setResolvedSegments(\n results.map((result, i) =>\n result.status === 'fulfilled'\n ? result.value\n : { ...parentSegments[i], label: parentSegments[i].resourceId.slice(0, 8), isLoading: false }\n )\n );\n };\n\n resolveLabels();\n\n return () => { cancelled = true; };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- using refs for unstable functions\n }, [contextResourceIdentifiers, parentSegments, registry, tResourceHeader]);\n\n // Each read ancestor is named from its row at render, with the CURRENT `t` and formatters (see `record`).\n const displayedSegments = useMemo(\n () =>\n resolvedSegments.map((segment) =>\n segment.record === undefined\n ? segment\n : {\n ...segment,\n label:\n FrontendResourceUtils.computeFrontendResourceLabel({\n resourceType: segment.resourceType,\n registry,\n currentObject: segment.record,\n t,\n formatDate,\n formatDateTime,\n }) || segment.resourceId,\n },\n ),\n [resolvedSegments, registry, t, formatDate, formatDateTime],\n );\n\n // Resolve the DISPLAYABLE read surface for one ancestor segment — the single\n // predicate behind both the render gate (link vs plain text) and the click\n // handler, so they cannot disagree. Displayable means the READ has a rendered\n // interface: surface ADDRESSABLE (routable page) or EMBEDDED (overlay/zone\n // content). API_ONLY (headless) reads are filtered out up front — a crumb for\n // such an ancestor renders as plain text. Note the deliberate difference from\n // `requireFrontendAddressable: true` (strict ADDRESSABLE): an EMBEDDED read is\n // still a legitimate click target, it just navigates as zone content without\n // owning a URL.\n const resolveSegmentDisplayableRead = (\n segment: Pick<BreadcrumbSegment, 'resourceType' | 'resourceId' | 'ancestorRequirements'>,\n ) => {\n const segmentResourceConfig = registry.resourceConfigurations[segment.resourceType];\n if (!segmentResourceConfig) return undefined;\n\n const segmentContextIdentifiers = buildSegmentContextIdentifiers({\n segment,\n contextResourceIdentifiers,\n });\n const readOp = pickPreferredOperationForCoreSemanticAddressability({\n resourceConfig: segmentResourceConfig,\n operations: (segmentResourceConfig.operations ?? []).filter(\n (operation) => !isOperationHeadless(operation.operationFrontendConfig),\n ),\n coreOperation: CoreResourceOperation.READ,\n registry,\n hasResourceId: true,\n contextResourceIdentifiers: segmentContextIdentifiers,\n contextualParameters: FrontendResourceUtils.buildContextualParameters(\n segmentContextIdentifiers,\n registry,\n ),\n });\n if (!readOp) return undefined;\n return { segmentResourceConfig, segmentContextIdentifiers, readOp };\n };\n\n // Per-segment clickability, keyed on the SEGMENT'S IDENTITY. It used to be index-aligned with\n // `parentSegments` and read by index over `resolvedSegments` — but `resolvedSegments` is state set\n // in an effect, one render behind. On the render where the chain changed, index i of one array was\n // a different ancestor from index i of the other, so a crumb's link-or-text was decided from its\n // neighbour. Derived synchronously from the registry — label loading does not affect it.\n const segmentClickability = useMemo(\n () => new Map(parentSegments.map((segment) => [\n breadcrumbSegmentKey(segment),\n resolveSegmentDisplayableRead(segment) !== undefined,\n ])),\n // eslint-disable-next-line react-hooks/exhaustive-deps -- resolver reads registry + contextResourceIdentifiers, both listed\n [parentSegments, registry, contextResourceIdentifiers],\n );\n\n // Handle breadcrumb segment click — navigate via navigation controller\n const handleSegmentClick = (segment: BreadcrumbSegment, e: React.MouseEvent) => {\n e.preventDefault();\n\n const resolved = resolveSegmentDisplayableRead(segment);\n if (!resolved) return;\n const { segmentResourceConfig, segmentContextIdentifiers, readOp } = resolved;\n\n const readContext = frontendResourceUtils.createFrontendResourceOperationContextFromOperation({\n resourceType: segment.resourceType,\n operation: readOp,\n contextResourceIdentifiers: segmentContextIdentifiers,\n isOperationDefault: true,\n parentResourcesRequirements: segment.ancestorRequirements,\n });\n\n // Only an ADDRESSABLE read owns a browser URL. An EMBEDDED read navigates\n // as pure zone/overlay content — handing it a urlPath would point the\n // browser at a route AppRouter never registered (broken refresh/deep-link).\n let urlPath: string | undefined;\n if (isOperationAddressable(readOp.operationFrontendConfig)) {\n const routePaths = ResourcesConfigOperationsUrlsBuilderUtils.buildOperationFrontendRoutePaths(\n segmentResourceConfig,\n readOp,\n registry.allResourceFieldIdentifiers\n );\n urlPath = frontendResourceUtils.selectMatchingRoutePath(\n routePaths,\n segmentContextIdentifiers,\n segmentResourceConfig.resourceIdentifier,\n segmentResourceConfig.resourceFieldIdentifier,\n segment.ancestorRequirements,\n )?.url;\n }\n\n navigate({\n content: {\n contentType: NavigationContentType.RESOURCE_OPERATION,\n resourceContext: readContext,\n },\n urlPath,\n initiator: {\n sourceZone: navigationZone,\n },\n });\n };\n\n // Don't render if no parent segments. MUST stay below every hook: this\n // condition can flip between renders (context identifiers hydrate after\n // mount), and an early return above a hook would shift the hook order and\n // crash the whole surface (\"Rendered more hooks than during the previous\n // render\") the first time a parent chain appears.\n if (parentSegments.length === 0) {\n return null;\n }\n\n if (!isReady) return null;\n\n // The trail is the PATH TO the resource — ancestors only, the current\n // resource itself excluded (its name is the page heading right below;\n // repeating it as a terminal crumb was redundant). EVERY ancestor carries a\n // trailing separator (\"Org ›\", \"Org › List ›\"): the path visually terminates\n // on the page heading beneath it, which is what keeps a single-ancestor\n // trail legible AS a breadcrumb rather than one orphaned link.\n return (\n <Breadcrumb>\n <BreadcrumbList>\n {displayedSegments.map((segment) => (\n <React.Fragment key={breadcrumbSegmentKey(segment)}>\n <BreadcrumbItem>\n {/* A crumb is a LINK only when the ancestor's READ is displayable\n (ADDRESSABLE or EMBEDDED — never API_ONLY) and satisfiable from\n the current context; otherwise the segment stays visible as\n plain text so the path is never silently shortened. */}\n {segmentClickability.get(breadcrumbSegmentKey(segment)) ? (\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => handleSegmentClick(segment, e)}\n className={segment.isLoading ? 'animate-pulse motion-reduce:animate-none' : undefined}\n >\n {segment.isLoading ? '...' : segment.label}\n </BreadcrumbLink>\n ) : (\n <span className={segment.isLoading ? 'animate-pulse motion-reduce:animate-none' : undefined}>\n {segment.isLoading ? '...' : segment.label}\n </span>\n )}\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n </React.Fragment>\n ))}\n </BreadcrumbList>\n </Breadcrumb>\n );\n};\n\n/** One ancestor's identity in the trail — the key both the rendered crumb and its clickability use. */\nfunction breadcrumbSegmentKey(segment: Pick<BreadcrumbSegment, 'resourceType' | 'resourceId'>): string {\n return `${segment.resourceType}-${segment.resourceId}`;\n}\n\nexport function ResourceLayout_Breadcrumb({ preset = CorePresetNames.DEFAULT, ...props }: ResourceLayoutPreset_Breadcrumb_DefaultProps & ComponentPresetProps): React.JSX.Element {\n const Component = createComponentResolver<ResourceLayoutPreset_Breadcrumb_DefaultProps>(FrontendComponentType.RESOURCES_LAYOUTS_BREADCRUMB, 'ResourceLayout_Breadcrumb')(preset);\n return <Component {...props} />;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceLayout_ContainerDialogs.d.ts","sourceRoot":"","sources":["../../../../../src/components/resources/ResourceLayout_ContainerDialogs.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAA+B,MAAM,OAAO,CAAC;AAcpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kFAAkF,CAAA;AAEvH,OAAO,EAAE,wBAAwB,EAAE,MAAM,qDAAqD,CAAA;AAG9F,MAAM,WAAW,kDAAmD,SAAQ,wBAAwB;CAAG;
|
|
1
|
+
{"version":3,"file":"ResourceLayout_ContainerDialogs.d.ts","sourceRoot":"","sources":["../../../../../src/components/resources/ResourceLayout_ContainerDialogs.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAA+B,MAAM,OAAO,CAAC;AAcpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kFAAkF,CAAA;AAEvH,OAAO,EAAE,wBAAwB,EAAE,MAAM,qDAAqD,CAAA;AAG9F,MAAM,WAAW,kDAAmD,SAAQ,wBAAwB;CAAG;AAsFvG,eAAO,MAAM,6CAA6C,EAAE,KAAK,CAAC,EAAE,CAAC,kDAAkD,CAStH,CAAC;AAEF,wBAAgB,+BAA+B,CAAC,EAAE,MAAgC,EAAE,GAAG,KAAK,EAAE,EAAE,kDAAkD,GAAG,oBAAoB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAG5L"}
|
|
@@ -33,17 +33,32 @@ import { createComponentResolver } from '../../core/components-registry/componen
|
|
|
33
33
|
// HELPERS
|
|
34
34
|
// =============================================================================
|
|
35
35
|
/**
|
|
36
|
-
* Build overlay container config from the entry's appearance.
|
|
36
|
+
* Build overlay container config from the entry's appearance AND its authored behaviour.
|
|
37
|
+
*
|
|
38
|
+
* ## `overlayBehavior` was ignored here entirely until 2026-09-25
|
|
39
|
+
*
|
|
40
|
+
* The three fields exist so an operation can say a stray backdrop click must not destroy a
|
|
41
|
+
* half-filled create form (`closeOnOutsideClick: false`), that the page behind stays usable
|
|
42
|
+
* (`modal: false`), or that it is not dimmed (`showBackdrop: false`). This preset hardcoded
|
|
43
|
+
* `closeOnOutsideClick: true` and never set `modal` or `showBackdrop`, so an operation that declared
|
|
44
|
+
* any of them got the opposite with no diagnostic. Core's own overlay handler honours all three; a
|
|
45
|
+
* preset slot that renders the same layer must not disagree with it.
|
|
46
|
+
*
|
|
47
|
+
* Defaults match the contract on `NavigationStackEntry.overlayBehavior`: all three default `true`.
|
|
37
48
|
*/
|
|
38
|
-
function buildOverlayConfig(appearance) {
|
|
49
|
+
function buildOverlayConfig(appearance, behavior) {
|
|
39
50
|
const mode = overlayAppearanceToContainerMode(appearance);
|
|
51
|
+
const shared = {
|
|
52
|
+
size: OverlaySize.LG,
|
|
53
|
+
closeOnEscape: true,
|
|
54
|
+
closeOnOutsideClick: behavior?.closeOnOutsideClick ?? true,
|
|
55
|
+
modal: behavior?.modal ?? true,
|
|
56
|
+
showBackdrop: behavior?.showBackdrop ?? true,
|
|
57
|
+
};
|
|
40
58
|
if (mode === OverlayContainerMode.SHEET) {
|
|
41
|
-
return { mode, side: PlacementSide.END,
|
|
42
|
-
}
|
|
43
|
-
if (mode === OverlayContainerMode.DRAWER) {
|
|
44
|
-
return { mode, size: OverlaySize.LG, closeOnEscape: true, closeOnOutsideClick: true };
|
|
59
|
+
return { mode, side: PlacementSide.END, ...shared };
|
|
45
60
|
}
|
|
46
|
-
return { mode,
|
|
61
|
+
return { mode, ...shared };
|
|
47
62
|
}
|
|
48
63
|
// =============================================================================
|
|
49
64
|
// SUB-COMPONENT: Unified overlay handler reading from state.overlay
|
|
@@ -55,7 +70,7 @@ const OverlayHandler = () => {
|
|
|
55
70
|
const topEntry = overlayStack.length > 0 ? overlayStack[overlayStack.length - 1] : undefined;
|
|
56
71
|
const isOpen = overlayStack.length > 0;
|
|
57
72
|
const { title, description } = useOverlayTitle(topEntry);
|
|
58
|
-
const overlayConfig = useMemo(() => buildOverlayConfig(topEntry?.appearance), [topEntry?.appearance]);
|
|
73
|
+
const overlayConfig = useMemo(() => buildOverlayConfig(topEntry?.appearance, topEntry?.overlayBehavior), [topEntry?.appearance, topEntry?.overlayBehavior]);
|
|
59
74
|
const handleOpenChange = useCallback((open) => {
|
|
60
75
|
if (!open) {
|
|
61
76
|
closeOverlay();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceLayout_ContainerDialogs.js","sourceRoot":"","sources":["../../../../../src/components/resources/ResourceLayout_ContainerDialogs.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAc,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGhE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEzH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qEAAqE,CAAC;AACvG,OAAO,EAAE,gCAAgC,EAAE,MAAM,uFAAuF,CAAC;AACzI,OAAO,EAAE,kBAAkB,EAAE,MAAM,wDAAwD,CAAC;AAC5F,OAAO,EAAE,uBAAuB,EAAE,MAAM,6DAA6D,CAAC;AACtG,OAAO,EAAE,yBAAyB,EAAE,MAAM,4DAA4D,CAAC;AACvG,OAAO,EAAE,eAAe,EAAE,MAAM,qDAAqD,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,wDAAwD,CAAC;AAGxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,iFAAiF,CAAA;AAMzH,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF
|
|
1
|
+
{"version":3,"file":"ResourceLayout_ContainerDialogs.js","sourceRoot":"","sources":["../../../../../src/components/resources/ResourceLayout_ContainerDialogs.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * ContainerDialogs_Default — Preset-customizable overlay handler for the unified overlay stack.\n *\n * Renders dialog/sheet/drawer overlays driven by the navigation state system.\n * Uses `OverlayContainer` for the chrome and `NavigationContentRenderer` for the content.\n *\n * In v3, overlay appearances are no longer separate navigation panes. Instead, a single\n * `state.overlay` stack holds all overlay entries, and each entry's `appearance` field\n * (from `NavigationResolutionResult`) determines whether it renders as a dialog, sheet, or drawer.\n *\n * Design notes:\n * - This preset reads navigation state internally via `useNavigationState` / `useNavigationController`.\n * - The `resourceContext` from `BaseResourcesLayoutProps` represents the \"host\" resource page\n * where this component is mounted. The actual overlay content's context comes from the navigation\n * stack entry, not from props.\n * - The global `NavigationOverlays` (in `NavigationContentAreas.tsx`) provides a non-customizable\n * overlay handler. This preset provides the same functionality but through the component preset system,\n * enabling per-resource overlay customization (size, chrome, behavior).\n */\n\nimport React, { useCallback, useMemo } from 'react';\nimport { OverlayContainerMode } from '@wildo-ai/zod-decorators';\nimport { OverlayAppearance } from '@wildo-ai/saas-models';\nimport type { OverlayContainerConfig } from '@wildo-ai/presets-components-models';\nimport { CorePresetNames, FrontendComponentType, OverlaySize, PlacementSide } from '@wildo-ai/presets-components-models';\n\nimport { OverlayContainer } from '~wildo-frontend-lib/components/overlays/containers/OverlayContainer';\nimport { overlayAppearanceToContainerMode } from '~wildo-frontend-lib/components/overlays/containers/navigation-overlay-container.utils';\nimport { useNavigationState } from '~wildo-frontend-lib/core/navigation/useNavigationState';\nimport { useNavigationController } from '~wildo-frontend-lib/core/navigation/useNavigationController';\nimport { NavigationContentRenderer } from '~wildo-frontend-lib/core/navigation/NavigationContentAreas';\nimport { useOverlayTitle } from '~wildo-frontend-lib/core/navigation/useOverlayTitle';\nimport { NavigationZone } from '~wildo-frontend-lib/core/navigation/navigation.schemas';\n\nimport { ComponentPresetProps } from '~wildo-frontend-lib/core/components-registry/component-registry.frontend.schemas'\nimport { createComponentResolver } from '~wildo-frontend-lib/core/components-registry/component-resolver.frontend.helper'\nimport { BaseResourcesLayoutProps } from './component-props.resources-layout.frontend.schemas'\n\n// --- Contract ---\nexport interface ResourceLayoutPreset_ContainerDialogs_DefaultProps extends BaseResourcesLayoutProps {}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Build overlay container config from the entry's appearance AND its authored behaviour.\n *\n * ## `overlayBehavior` was ignored here entirely until 2026-09-25\n *\n * The three fields exist so an operation can say a stray backdrop click must not destroy a\n * half-filled create form (`closeOnOutsideClick: false`), that the page behind stays usable\n * (`modal: false`), or that it is not dimmed (`showBackdrop: false`). This preset hardcoded\n * `closeOnOutsideClick: true` and never set `modal` or `showBackdrop`, so an operation that declared\n * any of them got the opposite with no diagnostic. Core's own overlay handler honours all three; a\n * preset slot that renders the same layer must not disagree with it.\n *\n * Defaults match the contract on `NavigationStackEntry.overlayBehavior`: all three default `true`.\n */\nfunction buildOverlayConfig(\n appearance?: OverlayAppearance,\n behavior?: { modal?: boolean; closeOnOutsideClick?: boolean; showBackdrop?: boolean },\n): OverlayContainerConfig {\n const mode = overlayAppearanceToContainerMode(appearance);\n const shared = {\n size: OverlaySize.LG,\n closeOnEscape: true,\n closeOnOutsideClick: behavior?.closeOnOutsideClick ?? true,\n modal: behavior?.modal ?? true,\n showBackdrop: behavior?.showBackdrop ?? true,\n };\n if (mode === OverlayContainerMode.SHEET) {\n return { mode, side: PlacementSide.END, ...shared };\n }\n return { mode, ...shared };\n}\n\n// =============================================================================\n// SUB-COMPONENT: Unified overlay handler reading from state.overlay\n// =============================================================================\n\nconst OverlayHandler: React.FC = () => {\n const { state } = useNavigationState();\n const { closeOverlay } = useNavigationController();\n\n const overlayStack = state.overlay;\n const topEntry = overlayStack.length > 0 ? overlayStack[overlayStack.length - 1] : undefined;\n const isOpen = overlayStack.length > 0;\n const { title, description } = useOverlayTitle(topEntry);\n\n const overlayConfig = useMemo(\n () => buildOverlayConfig(topEntry?.appearance, topEntry?.overlayBehavior),\n [topEntry?.appearance, topEntry?.overlayBehavior]\n );\n\n const handleOpenChange = useCallback((open: boolean) => {\n if (!open) {\n closeOverlay();\n }\n }, [closeOverlay]);\n\n return (\n <OverlayContainer\n open={isOpen}\n onOpenChange={handleOpenChange}\n title={title || undefined}\n description={description}\n config={overlayConfig}\n >\n {topEntry && (\n <NavigationContentRenderer\n content={topEntry.content}\n zone={NavigationZone.OVERLAY}\n initiator={topEntry.initiator}\n entryId={topEntry.id}\n />\n )}\n </OverlayContainer>\n );\n};\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\nexport const ResourceLayoutPreset_ContainerDialogs_Default: React.FC<ResourceLayoutPreset_ContainerDialogs_DefaultProps> = ({\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n resourceContext: _resourceContext,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n navigationZone: _navigationZone,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n navigationInitiator: _navigationInitiator,\n}) => {\n return <OverlayHandler />;\n};\n\nexport function ResourceLayout_ContainerDialogs({ preset = CorePresetNames.DEFAULT, ...props }: ResourceLayoutPreset_ContainerDialogs_DefaultProps & ComponentPresetProps): React.JSX.Element {\n const Component = createComponentResolver<ResourceLayoutPreset_ContainerDialogs_DefaultProps>(FrontendComponentType.RESOURCES_LAYOUTS_CONTAINER_DIALOGS, 'ResourceLayout_ContainerDialogs')(preset);\n return <Component {...props} />;\n}\n"]}
|
|
@@ -358,7 +358,7 @@ export const ResourceLayoutPreset_ContainerNested_Default = ({ resourceContext,
|
|
|
358
358
|
childResourceType: config.childResourceType,
|
|
359
359
|
foreignKeyField: config.foreignKeyField,
|
|
360
360
|
relationshipEdgeKey: config.relationshipEdgeKey,
|
|
361
|
-
inChildView: config.
|
|
361
|
+
inChildView: config.inChildView,
|
|
362
362
|
},
|
|
363
363
|
},
|
|
364
364
|
relationshipTransition: config.transition,
|
|
@@ -423,7 +423,7 @@ export const ResourceLayoutPreset_ContainerNested_Default = ({ resourceContext,
|
|
|
423
423
|
childResourceType: config.childResourceType,
|
|
424
424
|
foreignKeyField: config.foreignKeyField,
|
|
425
425
|
relationshipEdgeKey: config.relationshipEdgeKey,
|
|
426
|
-
inChildView: config.
|
|
426
|
+
inChildView: config.inChildView,
|
|
427
427
|
} }, config.relationshipEdgeKey));
|
|
428
428
|
};
|
|
429
429
|
const buildRelationshipContentSection = useCallback((config) => ({
|