@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
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The framework's address-lookup COMPONENT, for any vendor that supplies a `ProviderAddressLookupAdapter` (#561).
|
|
4
|
+
*
|
|
5
|
+
* A vendor's lookup is four pure functions (build the suggest input, read the suggestions, build the retrieve
|
|
6
|
+
* input, read the address). Everything else a lookup must get right is the same for every vendor and is written
|
|
7
|
+
* once here:
|
|
8
|
+
*
|
|
9
|
+
* - **The keyboard and screen-reader pattern is the engine's `Combobox`**, not new markup: a trigger with
|
|
10
|
+
* `role="combobox"` and `aria-expanded`, and inside it the command list whose text box is a WAI-ARIA combobox
|
|
11
|
+
* over a `listbox` — arrow keys move the active option, which is announced through `aria-activedescendant`,
|
|
12
|
+
* Enter chooses it and Escape closes the list. Server-side results, so the list is not filtered again locally.
|
|
13
|
+
* - **Suggestions start at {@link PROVIDER_ADDRESS_LOOKUP_MINIMUM_QUERY_LENGTH} characters and are debounced**
|
|
14
|
+
* by {@link PROVIDER_ADDRESS_LOOKUP_DEBOUNCE_MS} (#561 D5): fewer characters match half a country, and a
|
|
15
|
+
* request per keystroke spends the person's per-operation allowance at the door.
|
|
16
|
+
* - **A slower, older answer never replaces a newer one.** Each search carries a sequence number and only the
|
|
17
|
+
* latest may write the list — the ordinary way a typeahead shows results for text the person already changed.
|
|
18
|
+
* - **Nothing vendor-owned is kept.** The suggestion's id lives only until the retrieval; the address that comes
|
|
19
|
+
* back is handed to `onSelect` and the field takes it as typed text.
|
|
20
|
+
* - **Every failure is reported, never thrown** (`onError`), so the host can say the lookup is unavailable while
|
|
21
|
+
* the address parts below keep working by hand.
|
|
22
|
+
*
|
|
23
|
+
* The session token and the choice of backend operations are NOT here: the host binds `suggest` / `retrieve` to the
|
|
24
|
+
* operations the provider declared and fills the token itself (#561 D4). The vendor attribution arrives from the host
|
|
25
|
+
* as data and is shown here, inside the suggestion popup beside the results, by {@link ProviderAddressLookupAttribution}.
|
|
26
|
+
*/
|
|
27
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
28
|
+
import { z } from 'zod';
|
|
29
|
+
import { FormFieldAddressLookupLabel, FrontendComponentType } from '@wildo-ai/presets-components-models';
|
|
30
|
+
import { useI18n } from '../../core/i18n/useI18n.js';
|
|
31
|
+
import { Combobox } from '../../components/form/combobox.js';
|
|
32
|
+
/** Characters typed before a search runs (#561 D5). */
|
|
33
|
+
export const PROVIDER_ADDRESS_LOOKUP_MINIMUM_QUERY_LENGTH = 3;
|
|
34
|
+
/** Quiet time after the last keystroke before a search runs, in milliseconds. */
|
|
35
|
+
export const PROVIDER_ADDRESS_LOOKUP_DEBOUNCE_MS = 300;
|
|
36
|
+
/** The search box holds text, never a stored value: the combobox is used for its interaction pattern only. */
|
|
37
|
+
const LOOKUP_QUERY_SCHEMA = z.string();
|
|
38
|
+
/**
|
|
39
|
+
* The vendor answered the retrieval, and the place it describes has no postal address the field can hold (no
|
|
40
|
+
* street line, no town or no country). Reported through `onError` like any failure, as its own class so the host
|
|
41
|
+
* can say "this place cannot be used" rather than "the lookup is unavailable" — the lookup worked.
|
|
42
|
+
*/
|
|
43
|
+
export class ProviderAddressLookupPlaceWithoutAddressError extends Error {
|
|
44
|
+
constructor() {
|
|
45
|
+
super('The chosen place has no postal address the field can hold.');
|
|
46
|
+
this.name = 'ProviderAddressLookupPlaceWithoutAddressError';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* A vendor's required attribution, rendered to the vendor's text rules (#561 D4).
|
|
51
|
+
*
|
|
52
|
+
* Google's rules for its "Google Maps" text, when its logo is not used: never translated (`translate="no"`), never
|
|
53
|
+
* wrapped onto two lines, weight 400, 12–16 px, normal letter spacing, and white, #1F1F1F or #5E5E5E with at least
|
|
54
|
+
* 4.5:1 contrast against its background. The mark is therefore set in #1F1F1F on its own white ground, which keeps
|
|
55
|
+
* that contrast on every theme the application ships — the one place a vendor's colours override the design
|
|
56
|
+
* system's tokens, as a logo would. The sentence around it, for assistive technology, comes from the application's
|
|
57
|
+
* labels; the mark itself is hidden from them so it is not read twice.
|
|
58
|
+
* spec-cite: https://developers.google.com/maps/documentation/places/web-service/policies — "Font color: White, black
|
|
59
|
+
* (#1F1F1F), or gray (#5E5E5E)", "Don't wrap Google Maps onto multiple lines", "Prevent browsers from translating
|
|
60
|
+
* Google Maps by using the HTML attribute translate='no'". Fetched 2026-09-29.
|
|
61
|
+
*/
|
|
62
|
+
export function ProviderAddressLookupAttribution({ attribution }) {
|
|
63
|
+
return (_jsxs("span", { "data-address-lookup-attribution": "", className: "inline-flex", children: [_jsx("span", { className: "sr-only", children: attribution.accessibleLabel }), _jsx("span", { "aria-hidden": "true", translate: "no", className: "whitespace-nowrap rounded-sm px-1 text-xs font-normal tracking-normal", style: { color: '#1F1F1F', backgroundColor: '#FFFFFF' }, children: attribution.mark })] }));
|
|
64
|
+
}
|
|
65
|
+
function asError(value) {
|
|
66
|
+
return value instanceof Error ? value : new Error(String(value));
|
|
67
|
+
}
|
|
68
|
+
export function ProviderAddressLookupCombobox(props) {
|
|
69
|
+
const { adapter, suggest, retrieve, onSelect, onCancel, onError, countriesAllowed, defaultCountry, languageCode, disabled, name, attribution } = props;
|
|
70
|
+
const { tComponent } = useI18n({ component: [FrontendComponentType.LOW_LEVEL_FORM_FIELD_ADDRESS] });
|
|
71
|
+
const label = (key, params) => tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_ADDRESS, key, params);
|
|
72
|
+
const [query, setQuery] = useState('');
|
|
73
|
+
const [suggestions, setSuggestions] = useState([]);
|
|
74
|
+
const [searching, setSearching] = useState(false);
|
|
75
|
+
/** Incremented by every search and every reset; an answer is written only while it is still the latest. */
|
|
76
|
+
const sequenceRef = useRef(0);
|
|
77
|
+
/** Set while a chosen suggestion is being retrieved, so the list closing on a choice is not read as a cancel. */
|
|
78
|
+
const choosingRef = useRef(false);
|
|
79
|
+
const trimmed = query.trim();
|
|
80
|
+
const searchable = trimmed.length >= PROVIDER_ADDRESS_LOOKUP_MINIMUM_QUERY_LENGTH;
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
const sequence = ++sequenceRef.current;
|
|
83
|
+
if (!searchable || disabled) {
|
|
84
|
+
setSuggestions([]);
|
|
85
|
+
setSearching(false);
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
setSearching(true);
|
|
89
|
+
const timer = setTimeout(() => {
|
|
90
|
+
let input;
|
|
91
|
+
try {
|
|
92
|
+
input = adapter.buildSuggestInput({ query: trimmed, countriesAllowed, defaultCountry, languageCode });
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
setSearching(false);
|
|
96
|
+
onError(asError(error));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
suggest(input)
|
|
100
|
+
.then((output) => {
|
|
101
|
+
if (sequence !== sequenceRef.current)
|
|
102
|
+
return;
|
|
103
|
+
setSuggestions(adapter.readSuggestions(output));
|
|
104
|
+
})
|
|
105
|
+
.catch((error) => {
|
|
106
|
+
if (sequence !== sequenceRef.current)
|
|
107
|
+
return;
|
|
108
|
+
setSuggestions([]);
|
|
109
|
+
onError(asError(error));
|
|
110
|
+
})
|
|
111
|
+
.finally(() => {
|
|
112
|
+
if (sequence === sequenceRef.current)
|
|
113
|
+
setSearching(false);
|
|
114
|
+
});
|
|
115
|
+
}, PROVIDER_ADDRESS_LOOKUP_DEBOUNCE_MS);
|
|
116
|
+
return () => clearTimeout(timer);
|
|
117
|
+
// `countriesAllowed` is an array the field re-creates per render; its content is what matters.
|
|
118
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
119
|
+
}, [trimmed, searchable, disabled, adapter, suggest, onError, languageCode, defaultCountry, (countriesAllowed ?? []).join(',')]);
|
|
120
|
+
// The option VALUE is the suggestion's position, never the vendor's id: the command list may normalise an item
|
|
121
|
+
// value (trim it), and a vendor id is opaque text the framework must hand back exactly as it came.
|
|
122
|
+
const options = useMemo(() => suggestions.map((suggestion, index) => ({ value: `suggestion-${index}`, label: suggestion.primaryText, data: suggestion })), [suggestions]);
|
|
123
|
+
const reset = useCallback(() => {
|
|
124
|
+
sequenceRef.current += 1;
|
|
125
|
+
setQuery('');
|
|
126
|
+
setSuggestions([]);
|
|
127
|
+
setSearching(false);
|
|
128
|
+
}, []);
|
|
129
|
+
const handleChoose = useCallback((optionValue) => {
|
|
130
|
+
const suggestion = options.find((option) => option.value === optionValue)?.data;
|
|
131
|
+
if (suggestion === undefined)
|
|
132
|
+
return;
|
|
133
|
+
choosingRef.current = true;
|
|
134
|
+
let input;
|
|
135
|
+
try {
|
|
136
|
+
input = adapter.buildRetrieveInput({ suggestion, languageCode });
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
choosingRef.current = false;
|
|
140
|
+
onError(asError(error));
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
retrieve(input)
|
|
144
|
+
.then((output) => {
|
|
145
|
+
const address = adapter.readAddress(output);
|
|
146
|
+
if (address === undefined) {
|
|
147
|
+
onError(new ProviderAddressLookupPlaceWithoutAddressError());
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
onSelect({ address });
|
|
151
|
+
})
|
|
152
|
+
.catch((error) => onError(asError(error)))
|
|
153
|
+
.finally(() => {
|
|
154
|
+
choosingRef.current = false;
|
|
155
|
+
reset();
|
|
156
|
+
});
|
|
157
|
+
}, [adapter, languageCode, onError, onSelect, options, reset, retrieve]);
|
|
158
|
+
const handleOpenChange = useCallback((open) => {
|
|
159
|
+
if (open || choosingRef.current)
|
|
160
|
+
return;
|
|
161
|
+
// Closed without a choice: the lookup session is abandoned, and the host starts a new one.
|
|
162
|
+
reset();
|
|
163
|
+
onCancel();
|
|
164
|
+
}, [onCancel, reset]);
|
|
165
|
+
const emptyMessage = !searchable
|
|
166
|
+
? label(FormFieldAddressLookupLabel.LOOKUP_TYPE_MORE, { minimum: PROVIDER_ADDRESS_LOOKUP_MINIMUM_QUERY_LENGTH })
|
|
167
|
+
: label(FormFieldAddressLookupLabel.LOOKUP_NO_RESULTS);
|
|
168
|
+
return (_jsx(Combobox, { schema: LOOKUP_QUERY_SCHEMA, name: name,
|
|
169
|
+
// Always empty: the trigger keeps inviting a search, and a chosen place lands in the address parts.
|
|
170
|
+
value: "", options: options, onChange: handleChoose, onSearchChange: setQuery, onOpenChange: handleOpenChange, shouldFilter: false, isLoading: searching, disabled: disabled, placeholder: label(FormFieldAddressLookupLabel.LOOKUP_PLACEHOLDER), searchPlaceholder: label(FormFieldAddressLookupLabel.LOOKUP_SEARCH_PLACEHOLDER), emptyMessage: emptyMessage,
|
|
171
|
+
// Inside the suggestion popup, below the results: the container the vendor's terms put the attribution in.
|
|
172
|
+
listFooter: attribution === undefined ? undefined : _jsx(ProviderAddressLookupAttribution, { attribution: attribution }), renderOption: (option) => {
|
|
173
|
+
// The combobox wrapper erases its option payload type; the payload is the suggestion set above.
|
|
174
|
+
const suggestion = option.data;
|
|
175
|
+
return (_jsxs("span", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "truncate", children: suggestion?.primaryText ?? option.label }), suggestion?.secondaryText ? _jsx("span", { className: "truncate text-xs text-muted-foreground", children: suggestion.secondaryText }) : null] }));
|
|
176
|
+
} }));
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=ProviderAddressLookupCombobox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderAddressLookupCombobox.js","sourceRoot":"","sources":["../../../../../src/core/external-providers/ProviderAddressLookupCombobox.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * The framework's address-lookup COMPONENT, for any vendor that supplies a `ProviderAddressLookupAdapter` (#561).\n *\n * A vendor's lookup is four pure functions (build the suggest input, read the suggestions, build the retrieve\n * input, read the address). Everything else a lookup must get right is the same for every vendor and is written\n * once here:\n *\n * - **The keyboard and screen-reader pattern is the engine's `Combobox`**, not new markup: a trigger with\n * `role=\"combobox\"` and `aria-expanded`, and inside it the command list whose text box is a WAI-ARIA combobox\n * over a `listbox` — arrow keys move the active option, which is announced through `aria-activedescendant`,\n * Enter chooses it and Escape closes the list. Server-side results, so the list is not filtered again locally.\n * - **Suggestions start at {@link PROVIDER_ADDRESS_LOOKUP_MINIMUM_QUERY_LENGTH} characters and are debounced**\n * by {@link PROVIDER_ADDRESS_LOOKUP_DEBOUNCE_MS} (#561 D5): fewer characters match half a country, and a\n * request per keystroke spends the person's per-operation allowance at the door.\n * - **A slower, older answer never replaces a newer one.** Each search carries a sequence number and only the\n * latest may write the list — the ordinary way a typeahead shows results for text the person already changed.\n * - **Nothing vendor-owned is kept.** The suggestion's id lives only until the retrieval; the address that comes\n * back is handed to `onSelect` and the field takes it as typed text.\n * - **Every failure is reported, never thrown** (`onError`), so the host can say the lookup is unavailable while\n * the address parts below keep working by hand.\n *\n * The session token and the choice of backend operations are NOT here: the host binds `suggest` / `retrieve` to the\n * operations the provider declared and fills the token itself (#561 D4). The vendor attribution arrives from the host\n * as data and is shown here, inside the suggestion popup beside the results, by {@link ProviderAddressLookupAttribution}.\n */\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { z } from 'zod';\nimport { FormFieldAddressLookupLabel, FrontendComponentType } from '@wildo-ai/presets-components-models';\nimport type {\n ProviderAddressLookupAdapter,\n ProviderAddressLookupAttributionText,\n ProviderAddressLookupProps,\n ProviderAddressLookupSuggestion,\n} from '@wildo-ai/saas-models';\n\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { Combobox } from '~wildo-frontend-lib/components/form/combobox';\nimport type { FieldOption } from '~wildo-frontend-lib/components/form/form-field-types';\n\n/** Characters typed before a search runs (#561 D5). */\nexport const PROVIDER_ADDRESS_LOOKUP_MINIMUM_QUERY_LENGTH = 3;\n\n/** Quiet time after the last keystroke before a search runs, in milliseconds. */\nexport const PROVIDER_ADDRESS_LOOKUP_DEBOUNCE_MS = 300;\n\n/** The search box holds text, never a stored value: the combobox is used for its interaction pattern only. */\nconst LOOKUP_QUERY_SCHEMA = z.string();\n\nexport interface ProviderAddressLookupComboboxProps extends ProviderAddressLookupProps {\n /** The vendor's four functions. */\n readonly adapter: ProviderAddressLookupAdapter;\n}\n\n/**\n * The vendor answered the retrieval, and the place it describes has no postal address the field can hold (no\n * street line, no town or no country). Reported through `onError` like any failure, as its own class so the host\n * can say \"this place cannot be used\" rather than \"the lookup is unavailable\" — the lookup worked.\n */\nexport class ProviderAddressLookupPlaceWithoutAddressError extends Error {\n constructor() {\n super('The chosen place has no postal address the field can hold.');\n this.name = 'ProviderAddressLookupPlaceWithoutAddressError';\n }\n}\n\n/**\n * A vendor's required attribution, rendered to the vendor's text rules (#561 D4).\n *\n * Google's rules for its \"Google Maps\" text, when its logo is not used: never translated (`translate=\"no\"`), never\n * wrapped onto two lines, weight 400, 12–16 px, normal letter spacing, and white, #1F1F1F or #5E5E5E with at least\n * 4.5:1 contrast against its background. The mark is therefore set in #1F1F1F on its own white ground, which keeps\n * that contrast on every theme the application ships — the one place a vendor's colours override the design\n * system's tokens, as a logo would. The sentence around it, for assistive technology, comes from the application's\n * labels; the mark itself is hidden from them so it is not read twice.\n * spec-cite: https://developers.google.com/maps/documentation/places/web-service/policies — \"Font color: White, black\n * (#1F1F1F), or gray (#5E5E5E)\", \"Don't wrap Google Maps onto multiple lines\", \"Prevent browsers from translating\n * Google Maps by using the HTML attribute translate='no'\". Fetched 2026-09-29.\n */\nexport function ProviderAddressLookupAttribution({ attribution }: { readonly attribution: ProviderAddressLookupAttributionText }): React.ReactElement {\n return (\n <span data-address-lookup-attribution=\"\" className=\"inline-flex\">\n <span className=\"sr-only\">{attribution.accessibleLabel}</span>\n <span\n aria-hidden=\"true\"\n translate=\"no\"\n className=\"whitespace-nowrap rounded-sm px-1 text-xs font-normal tracking-normal\"\n style={{ color: '#1F1F1F', backgroundColor: '#FFFFFF' }}\n >\n {attribution.mark}\n </span>\n </span>\n );\n}\n\nfunction asError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\nexport function ProviderAddressLookupCombobox(props: ProviderAddressLookupComboboxProps): React.ReactElement {\n const { adapter, suggest, retrieve, onSelect, onCancel, onError, countriesAllowed, defaultCountry, languageCode, disabled, name, attribution } = props;\n const { tComponent } = useI18n({ component: [FrontendComponentType.LOW_LEVEL_FORM_FIELD_ADDRESS] });\n const label = (key: FormFieldAddressLookupLabel, params?: Record<string, string | number>) =>\n tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_ADDRESS, key, params);\n\n const [query, setQuery] = useState('');\n const [suggestions, setSuggestions] = useState<readonly ProviderAddressLookupSuggestion[]>([]);\n const [searching, setSearching] = useState(false);\n /** Incremented by every search and every reset; an answer is written only while it is still the latest. */\n const sequenceRef = useRef(0);\n /** Set while a chosen suggestion is being retrieved, so the list closing on a choice is not read as a cancel. */\n const choosingRef = useRef(false);\n\n const trimmed = query.trim();\n const searchable = trimmed.length >= PROVIDER_ADDRESS_LOOKUP_MINIMUM_QUERY_LENGTH;\n\n useEffect(() => {\n const sequence = ++sequenceRef.current;\n if (!searchable || disabled) {\n setSuggestions([]);\n setSearching(false);\n return undefined;\n }\n setSearching(true);\n const timer = setTimeout(() => {\n let input: Record<string, unknown>;\n try {\n input = adapter.buildSuggestInput({ query: trimmed, countriesAllowed, defaultCountry, languageCode });\n } catch (error) {\n setSearching(false);\n onError(asError(error));\n return;\n }\n suggest(input)\n .then((output) => {\n if (sequence !== sequenceRef.current) return;\n setSuggestions(adapter.readSuggestions(output));\n })\n .catch((error: unknown) => {\n if (sequence !== sequenceRef.current) return;\n setSuggestions([]);\n onError(asError(error));\n })\n .finally(() => {\n if (sequence === sequenceRef.current) setSearching(false);\n });\n }, PROVIDER_ADDRESS_LOOKUP_DEBOUNCE_MS);\n return () => clearTimeout(timer);\n // `countriesAllowed` is an array the field re-creates per render; its content is what matters.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [trimmed, searchable, disabled, adapter, suggest, onError, languageCode, defaultCountry, (countriesAllowed ?? []).join(',')]);\n\n // The option VALUE is the suggestion's position, never the vendor's id: the command list may normalise an item\n // value (trim it), and a vendor id is opaque text the framework must hand back exactly as it came.\n const options = useMemo<FieldOption<string, ProviderAddressLookupSuggestion>[]>(\n () => suggestions.map((suggestion, index) => ({ value: `suggestion-${index}`, label: suggestion.primaryText, data: suggestion })),\n [suggestions],\n );\n\n const reset = useCallback(() => {\n sequenceRef.current += 1;\n setQuery('');\n setSuggestions([]);\n setSearching(false);\n }, []);\n\n const handleChoose = useCallback(\n (optionValue: string) => {\n const suggestion = options.find((option) => option.value === optionValue)?.data;\n if (suggestion === undefined) return;\n choosingRef.current = true;\n let input: Record<string, unknown>;\n try {\n input = adapter.buildRetrieveInput({ suggestion, languageCode });\n } catch (error) {\n choosingRef.current = false;\n onError(asError(error));\n return;\n }\n retrieve(input)\n .then((output) => {\n const address = adapter.readAddress(output);\n if (address === undefined) {\n onError(new ProviderAddressLookupPlaceWithoutAddressError());\n return;\n }\n onSelect({ address });\n })\n .catch((error: unknown) => onError(asError(error)))\n .finally(() => {\n choosingRef.current = false;\n reset();\n });\n },\n [adapter, languageCode, onError, onSelect, options, reset, retrieve],\n );\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (open || choosingRef.current) return;\n // Closed without a choice: the lookup session is abandoned, and the host starts a new one.\n reset();\n onCancel();\n },\n [onCancel, reset],\n );\n\n const emptyMessage = !searchable\n ? label(FormFieldAddressLookupLabel.LOOKUP_TYPE_MORE, { minimum: PROVIDER_ADDRESS_LOOKUP_MINIMUM_QUERY_LENGTH })\n : label(FormFieldAddressLookupLabel.LOOKUP_NO_RESULTS);\n\n return (\n <Combobox\n schema={LOOKUP_QUERY_SCHEMA}\n name={name}\n // Always empty: the trigger keeps inviting a search, and a chosen place lands in the address parts.\n value=\"\"\n options={options}\n onChange={handleChoose}\n onSearchChange={setQuery}\n onOpenChange={handleOpenChange}\n shouldFilter={false}\n isLoading={searching}\n disabled={disabled}\n placeholder={label(FormFieldAddressLookupLabel.LOOKUP_PLACEHOLDER)}\n searchPlaceholder={label(FormFieldAddressLookupLabel.LOOKUP_SEARCH_PLACEHOLDER)}\n emptyMessage={emptyMessage}\n // Inside the suggestion popup, below the results: the container the vendor's terms put the attribution in.\n listFooter={attribution === undefined ? undefined : <ProviderAddressLookupAttribution attribution={attribution} />}\n renderOption={(option) => {\n // The combobox wrapper erases its option payload type; the payload is the suggestion set above.\n const suggestion = option.data as ProviderAddressLookupSuggestion | undefined;\n return (\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate\">{suggestion?.primaryText ?? option.label}</span>\n {suggestion?.secondaryText ? <span className=\"truncate text-xs text-muted-foreground\">{suggestion.secondaryText}</span> : null}\n </span>\n );\n }}\n />\n );\n}\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The framework side of an address lookup (#561): offer the live `FRONTEND_ADDRESS_LOOKUP` providers, load the
|
|
3
|
+
* chosen one's component, run its vendor calls through the application backend, hold what it returns to the
|
|
4
|
+
* field's own rules, and keep the field usable by hand whatever happens.
|
|
5
|
+
*
|
|
6
|
+
* `FormField` renders it in every `z_address()` field's `renderLookup` slot. With no live lookup provider — every
|
|
7
|
+
* application that declared none — it renders NOTHING, and the field is the plain multi-part control.
|
|
8
|
+
*
|
|
9
|
+
* ## What the host ENFORCES, because a component could forget (#561 D2, D4)
|
|
10
|
+
*
|
|
11
|
+
* - **The vendor is reached only through the provider-operation door.** The component receives `suggest` and
|
|
12
|
+
* `retrieve`, bound to the two operations its descriptor declares and run through
|
|
13
|
+
* `POST /provider-operations/:providerRef/:operationId` on the application's own account. The page holds no
|
|
14
|
+
* vendor key; the backend admits each operation by `providers.browserOperations`, counts it against the person,
|
|
15
|
+
* and records it. A provider whose component declares no `addressLookup` operations is not offered at all.
|
|
16
|
+
* - **One vendor session per lookup.** The host writes a UUIDv4 into the declared `sessionTokenInput` of every
|
|
17
|
+
* suggestion and of the retrieval, and starts a new one after a retrieval or when the lookup is abandoned — so a
|
|
18
|
+
* vendor that bills by session is never billed per keystroke by a component that forgot the token.
|
|
19
|
+
* - **The vendor's attribution is handed to the component** from the descriptor's `attributionMark` — the mark
|
|
20
|
+
* verbatim and a sentence from the application's labels naming it — for the component to show inside its
|
|
21
|
+
* suggestion popup, the container the vendor's terms require (the framework combobox does, with
|
|
22
|
+
* `ProviderAddressLookupAttribution`).
|
|
23
|
+
* - **The field decides.** A chosen address passes `receiveProviderAddressLookupSelection` against the field's own
|
|
24
|
+
* schema (countries, required parts) and the component's declared place-id retention before `applyAddress`; a
|
|
25
|
+
* refused one fills nothing and says so.
|
|
26
|
+
*
|
|
27
|
+
* ## Manual entry always works (#561 D5)
|
|
28
|
+
*
|
|
29
|
+
* A refusal, a throttle, a vendor timeout, a component that fails to load: each leaves the parts exactly as they
|
|
30
|
+
* were, editable, and shows one status line telling the person to enter the address below. Nothing blocks the
|
|
31
|
+
* form's submission.
|
|
32
|
+
*/
|
|
33
|
+
import React from 'react';
|
|
34
|
+
import type { z } from 'zod';
|
|
35
|
+
import type { AddressFieldLookupHost } from '../../components/form/fields/form-field-address';
|
|
36
|
+
/** Why the lookup is showing a status line instead of (or beside) its search. */
|
|
37
|
+
export declare enum ProviderAddressLookupNotice {
|
|
38
|
+
/** The lookup could not run; the parts work by hand. */
|
|
39
|
+
UNAVAILABLE = "UNAVAILABLE",
|
|
40
|
+
/** The chosen place could not fill this field. */
|
|
41
|
+
ADDRESS_REFUSED = "ADDRESS_REFUSED"
|
|
42
|
+
}
|
|
43
|
+
export interface ProviderAddressLookupHostProps {
|
|
44
|
+
/** What the field hands its `renderLookup` slot. */
|
|
45
|
+
readonly host: AddressFieldLookupHost;
|
|
46
|
+
/** The field's own `z_address()` schema: a chosen address it refuses is refused here, before it fills anything. */
|
|
47
|
+
readonly addressSchema: z.ZodType;
|
|
48
|
+
/** The field's form name; the lookup control is named `<name>.lookup`. */
|
|
49
|
+
readonly fieldName: string;
|
|
50
|
+
}
|
|
51
|
+
export declare function ProviderAddressLookupHost({ host, addressSchema, fieldName }: ProviderAddressLookupHostProps): React.ReactElement | null;
|
|
52
|
+
//# sourceMappingURL=ProviderAddressLookupHost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderAddressLookupHost.d.ts","sourceRoot":"","sources":["../../../../../src/core/external-providers/ProviderAddressLookupHost.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAiD,MAAM,OAAO,CAAC;AACtE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAkB7B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+DAA+D,CAAC;AAS5G,iFAAiF;AACjF,oBAAY,2BAA2B;IACrC,wDAAwD;IACxD,WAAW,gBAAgB;IAC3B,kDAAkD;IAClD,eAAe,oBAAoB;CACpC;AAED,MAAM,WAAW,8BAA8B;IAC7C,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,mHAAmH;IACnH,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC;IAClC,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAOD,wBAAgB,yBAAyB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,8BAA8B,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAkKvI"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The framework side of an address lookup (#561): offer the live `FRONTEND_ADDRESS_LOOKUP` providers, load the
|
|
4
|
+
* chosen one's component, run its vendor calls through the application backend, hold what it returns to the
|
|
5
|
+
* field's own rules, and keep the field usable by hand whatever happens.
|
|
6
|
+
*
|
|
7
|
+
* `FormField` renders it in every `z_address()` field's `renderLookup` slot. With no live lookup provider — every
|
|
8
|
+
* application that declared none — it renders NOTHING, and the field is the plain multi-part control.
|
|
9
|
+
*
|
|
10
|
+
* ## What the host ENFORCES, because a component could forget (#561 D2, D4)
|
|
11
|
+
*
|
|
12
|
+
* - **The vendor is reached only through the provider-operation door.** The component receives `suggest` and
|
|
13
|
+
* `retrieve`, bound to the two operations its descriptor declares and run through
|
|
14
|
+
* `POST /provider-operations/:providerRef/:operationId` on the application's own account. The page holds no
|
|
15
|
+
* vendor key; the backend admits each operation by `providers.browserOperations`, counts it against the person,
|
|
16
|
+
* and records it. A provider whose component declares no `addressLookup` operations is not offered at all.
|
|
17
|
+
* - **One vendor session per lookup.** The host writes a UUIDv4 into the declared `sessionTokenInput` of every
|
|
18
|
+
* suggestion and of the retrieval, and starts a new one after a retrieval or when the lookup is abandoned — so a
|
|
19
|
+
* vendor that bills by session is never billed per keystroke by a component that forgot the token.
|
|
20
|
+
* - **The vendor's attribution is handed to the component** from the descriptor's `attributionMark` — the mark
|
|
21
|
+
* verbatim and a sentence from the application's labels naming it — for the component to show inside its
|
|
22
|
+
* suggestion popup, the container the vendor's terms require (the framework combobox does, with
|
|
23
|
+
* `ProviderAddressLookupAttribution`).
|
|
24
|
+
* - **The field decides.** A chosen address passes `receiveProviderAddressLookupSelection` against the field's own
|
|
25
|
+
* schema (countries, required parts) and the component's declared place-id retention before `applyAddress`; a
|
|
26
|
+
* refused one fills nothing and says so.
|
|
27
|
+
*
|
|
28
|
+
* ## Manual entry always works (#561 D5)
|
|
29
|
+
*
|
|
30
|
+
* A refusal, a throttle, a vendor timeout, a component that fails to load: each leaves the parts exactly as they
|
|
31
|
+
* were, editable, and shows one status line telling the person to enter the address below. Nothing blocks the
|
|
32
|
+
* form's submission.
|
|
33
|
+
*/
|
|
34
|
+
import { useCallback, useMemo, useRef, useState } from 'react';
|
|
35
|
+
import { ButtonSize, FormFieldAddressLookupLabel, FrontendComponentType } from '@wildo-ai/presets-components-models';
|
|
36
|
+
import { CoreResourceType, UserPrivacySchema } from '@wildo-ai/saas-models';
|
|
37
|
+
import { BUILTIN_PROVIDER_CAPABILITY } from '@wildo-ai/saas-models/public-runtime';
|
|
38
|
+
import { getZodObjectShape } from '@wildo-ai/zod-decorators';
|
|
39
|
+
import { ProviderComponentStatus } from '@wildo-ai/external-connectors-public/app';
|
|
40
|
+
import { useApplication } from '../../core/runtime/useApplication.js';
|
|
41
|
+
import { useI18n } from '../../core/i18n/useI18n.js';
|
|
42
|
+
import { useGrantedConsentPurposes } from '../../core/security/useGrantedConsentPurposes.js';
|
|
43
|
+
import { getManualCallsHttpClient } from '../../core/requests/wildo-http-client-manual-calls.frontend.service.js';
|
|
44
|
+
import { useProviderComponent, useProviderComponentChoices, } from '../../core/components-registry/useProviderComponent.frontend.hooks.js';
|
|
45
|
+
import { Button, ButtonVariants_Variant } from '../../components/actions/button.js';
|
|
46
|
+
import { FieldLabel } from '../../components/form/chromes/field.js';
|
|
47
|
+
import { receiveProviderAddressLookupSelection } from './provider-address-lookup-selection.frontend.utils.js';
|
|
48
|
+
import { ProviderAddressLookupPlaceWithoutAddressError } from './ProviderAddressLookupCombobox.js';
|
|
49
|
+
const ADDRESS_LOOKUP_CAPABILITY = BUILTIN_PROVIDER_CAPABILITY.FRONTEND_ADDRESS_LOOKUP;
|
|
50
|
+
/** Consent purposes are worded through the field that stores a person's grant (#966), as the file field does. */
|
|
51
|
+
const CONSENTED_PURPOSES_FIELD_SCHEMA = getZodObjectShape(UserPrivacySchema).consentedPurposes;
|
|
52
|
+
/** Why the lookup is showing a status line instead of (or beside) its search. */
|
|
53
|
+
export var ProviderAddressLookupNotice;
|
|
54
|
+
(function (ProviderAddressLookupNotice) {
|
|
55
|
+
/** The lookup could not run; the parts work by hand. */
|
|
56
|
+
ProviderAddressLookupNotice["UNAVAILABLE"] = "UNAVAILABLE";
|
|
57
|
+
/** The chosen place could not fill this field. */
|
|
58
|
+
ProviderAddressLookupNotice["ADDRESS_REFUSED"] = "ADDRESS_REFUSED";
|
|
59
|
+
})(ProviderAddressLookupNotice || (ProviderAddressLookupNotice = {}));
|
|
60
|
+
/** A fresh vendor session token: a version 4 UUID, as Google recommends for Places session tokens. */
|
|
61
|
+
function newSessionToken() {
|
|
62
|
+
return globalThis.crypto.randomUUID();
|
|
63
|
+
}
|
|
64
|
+
export function ProviderAddressLookupHost({ host, addressSchema, fieldName }) {
|
|
65
|
+
const { providerComponentRegistry, frontendProviderRegistry } = useApplication();
|
|
66
|
+
const { t, tComponent, tResourceFieldEnumValue, currentLanguage } = useI18n({ component: [FrontendComponentType.LOW_LEVEL_FORM_FIELD_ADDRESS] });
|
|
67
|
+
const label = (key, params) => tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_ADDRESS, key, params);
|
|
68
|
+
const allChoices = useProviderComponentChoices(ADDRESS_LOOKUP_CAPABILITY);
|
|
69
|
+
// Offered only when the component declares how it reaches its vendor: without declared operations there is no
|
|
70
|
+
// call this host could make on its behalf, and a component making its own would bypass the door.
|
|
71
|
+
const choices = useMemo(() => allChoices.filter((choice) => providerComponentRegistry?.describe(ADDRESS_LOOKUP_CAPABILITY, choice.providerRef)?.addressLookup !== undefined), [allChoices, providerComponentRegistry]);
|
|
72
|
+
const [pickedRef, setPickedRef] = useState(undefined);
|
|
73
|
+
// A single provider needs no chooser; several are a genuine choice the person makes, never this host.
|
|
74
|
+
const chosen = pickedRef ?? (choices.length === 1 ? choices[0]?.providerRef : undefined);
|
|
75
|
+
const { status, Component, missingConsentPurposes } = useProviderComponent(ADDRESS_LOOKUP_CAPABILITY, chosen);
|
|
76
|
+
const { grant: grantConsent } = useGrantedConsentPurposes();
|
|
77
|
+
const [notice, setNotice] = useState(undefined);
|
|
78
|
+
const descriptor = chosen === undefined ? undefined : providerComponentRegistry?.describe(ADDRESS_LOOKUP_CAPABILITY, chosen);
|
|
79
|
+
const declaration = descriptor?.addressLookup;
|
|
80
|
+
/** The current vendor session; `undefined` until the first call of a session needs one. */
|
|
81
|
+
const sessionTokenRef = useRef(undefined);
|
|
82
|
+
const endSession = useCallback(() => {
|
|
83
|
+
sessionTokenRef.current = undefined;
|
|
84
|
+
}, []);
|
|
85
|
+
const run = useCallback(async (operationId, input) => {
|
|
86
|
+
if (chosen === undefined)
|
|
87
|
+
throw new Error('No address lookup provider is chosen.');
|
|
88
|
+
const tokenInput = declaration?.sessionTokenInput;
|
|
89
|
+
let sent = { ...input };
|
|
90
|
+
if (tokenInput !== undefined) {
|
|
91
|
+
sessionTokenRef.current ??= newSessionToken();
|
|
92
|
+
// Written by the host AFTER the component's input, so a component cannot send its own token instead.
|
|
93
|
+
sent = { ...sent, [tokenInput]: sessionTokenRef.current };
|
|
94
|
+
}
|
|
95
|
+
const answer = await getManualCallsHttpClient().executeProviderOperation(chosen, operationId, { input: sent });
|
|
96
|
+
return answer.output;
|
|
97
|
+
}, [chosen, declaration?.sessionTokenInput]);
|
|
98
|
+
const suggest = useCallback((input) => {
|
|
99
|
+
if (declaration === undefined)
|
|
100
|
+
return Promise.reject(new Error('The address lookup declares no operations.'));
|
|
101
|
+
return run(declaration.suggestOperationId, input);
|
|
102
|
+
}, [declaration, run]);
|
|
103
|
+
const retrieve = useCallback((input) => {
|
|
104
|
+
if (declaration === undefined)
|
|
105
|
+
return Promise.reject(new Error('The address lookup declares no operations.'));
|
|
106
|
+
// The retrieval ends the vendor session whatever it answers: the next search is a new session.
|
|
107
|
+
return run(declaration.retrieveOperationId, input).finally(endSession);
|
|
108
|
+
}, [declaration, endSession, run]);
|
|
109
|
+
const handleSelect = useCallback((selection) => {
|
|
110
|
+
if (chosen === undefined)
|
|
111
|
+
return;
|
|
112
|
+
endSession();
|
|
113
|
+
const outcome = receiveProviderAddressLookupSelection({ providerRef: chosen, descriptor, selection, addressSchema });
|
|
114
|
+
if (outcome.accepted === undefined) {
|
|
115
|
+
setNotice(ProviderAddressLookupNotice.ADDRESS_REFUSED);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
setNotice(undefined);
|
|
119
|
+
host.applyAddress(outcome.accepted.address);
|
|
120
|
+
}, [addressSchema, chosen, descriptor, endSession, host]);
|
|
121
|
+
const handleCancel = useCallback(() => endSession(), [endSession]);
|
|
122
|
+
const handleError = useCallback((error) => {
|
|
123
|
+
endSession();
|
|
124
|
+
// A place with no holdable address is the lookup WORKING and the place being unusable — said as such.
|
|
125
|
+
setNotice(error instanceof ProviderAddressLookupPlaceWithoutAddressError ? ProviderAddressLookupNotice.ADDRESS_REFUSED : ProviderAddressLookupNotice.UNAVAILABLE);
|
|
126
|
+
}, [endSession]);
|
|
127
|
+
if (choices.length === 0)
|
|
128
|
+
return null;
|
|
129
|
+
const chosenChoice = choices.find((choice) => choice.providerRef === chosen);
|
|
130
|
+
const providerName = (choice) => t(choice.displayNameLabelKey) ?? choice.displayName ?? choice.providerRef;
|
|
131
|
+
const lookupName = `${fieldName}.lookup`;
|
|
132
|
+
const Lookup = Component;
|
|
133
|
+
const failedToLoad = status === ProviderComponentStatus.UNAVAILABLE;
|
|
134
|
+
const shownNotice = failedToLoad ? ProviderAddressLookupNotice.UNAVAILABLE : notice;
|
|
135
|
+
return (_jsxs("div", { className: "flex flex-col gap-1", "data-address-lookup": chosen ?? '', children: [_jsx(FieldLabel, { htmlFor: `field-${lookupName}`, className: "text-sm text-muted-foreground", children: label(FormFieldAddressLookupLabel.LOOKUP_LABEL) }), choices.length > 1 ? (_jsx("div", { role: "group", className: "flex flex-wrap gap-item-xs", children: choices.map((choice) => (_jsx(Button, { type: "button", size: ButtonSize.SM, variant: choice.providerRef === chosen ? ButtonVariants_Variant.DEFAULT : ButtonVariants_Variant.OUTLINE, "aria-pressed": choice.providerRef === chosen, onClick: () => { setNotice(undefined); endSession(); setPickedRef(choice.providerRef); }, children: providerName(choice) }, choice.providerRef))) })) : null, status === ProviderComponentStatus.CONSENT_REQUIRED && chosenChoice !== undefined ? (_jsx("div", { role: "status", className: "flex flex-wrap items-center gap-item-xs text-sm text-muted-foreground", children: (() => {
|
|
136
|
+
const purposes = missingConsentPurposes
|
|
137
|
+
.map((purpose) => tResourceFieldEnumValue(CoreResourceType.USER_SELF_PREFERENCES, 'privacy.consentedPurposes', purpose, CONSENTED_PURPOSES_FIELD_SCHEMA))
|
|
138
|
+
.join(', ');
|
|
139
|
+
return (_jsxs(_Fragment, { children: [_jsx("span", { children: label(FormFieldAddressLookupLabel.LOOKUP_CONSENT_REQUIRED, { provider: providerName(chosenChoice), purposes }) }), grantConsent === undefined ? null : (_jsx(Button, { type: "button", size: ButtonSize.SM, variant: ButtonVariants_Variant.OUTLINE, onClick: () => void grantConsent(missingConsentPurposes), children: label(FormFieldAddressLookupLabel.LOOKUP_CONSENT_GRANT, { purposes }) }))] }));
|
|
140
|
+
})() })) : null, status === ProviderComponentStatus.READY && Lookup !== null && chosen !== undefined && declaration !== undefined ? (_jsx(_Fragment, { children: _jsx(Lookup, { providerRef: chosen, publicConfig: frontendProviderRegistry?.getProviderByRef(chosen)?.publicConfig ?? {}, ...(host.countriesAllowed !== undefined ? { countriesAllowed: host.countriesAllowed } : {}), ...(host.defaultCountry !== undefined ? { defaultCountry: host.defaultCountry } : {}), languageCode: currentLanguage, disabled: host.disabled, name: lookupName, ...(declaration.attributionMark !== undefined
|
|
141
|
+
? { attribution: { mark: declaration.attributionMark, accessibleLabel: label(FormFieldAddressLookupLabel.LOOKUP_ATTRIBUTION, { mark: declaration.attributionMark }) } }
|
|
142
|
+
: {}), suggest: suggest, retrieve: retrieve, onSelect: handleSelect, onCancel: handleCancel, onError: handleError }) })) : null, shownNotice !== undefined ? (_jsx("p", { role: "status", className: "text-sm text-muted-foreground", children: label(shownNotice === ProviderAddressLookupNotice.UNAVAILABLE ? FormFieldAddressLookupLabel.LOOKUP_UNAVAILABLE : FormFieldAddressLookupLabel.LOOKUP_ADDRESS_REFUSED) })) : null] }));
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=ProviderAddressLookupHost.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderAddressLookupHost.js","sourceRoot":"","sources":["../../../../../src/core/external-providers/ProviderAddressLookupHost.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * The framework side of an address lookup (#561): offer the live `FRONTEND_ADDRESS_LOOKUP` providers, load the\n * chosen one's component, run its vendor calls through the application backend, hold what it returns to the\n * field's own rules, and keep the field usable by hand whatever happens.\n *\n * `FormField` renders it in every `z_address()` field's `renderLookup` slot. With no live lookup provider — every\n * application that declared none — it renders NOTHING, and the field is the plain multi-part control.\n *\n * ## What the host ENFORCES, because a component could forget (#561 D2, D4)\n *\n * - **The vendor is reached only through the provider-operation door.** The component receives `suggest` and\n * `retrieve`, bound to the two operations its descriptor declares and run through\n * `POST /provider-operations/:providerRef/:operationId` on the application's own account. The page holds no\n * vendor key; the backend admits each operation by `providers.browserOperations`, counts it against the person,\n * and records it. A provider whose component declares no `addressLookup` operations is not offered at all.\n * - **One vendor session per lookup.** The host writes a UUIDv4 into the declared `sessionTokenInput` of every\n * suggestion and of the retrieval, and starts a new one after a retrieval or when the lookup is abandoned — so a\n * vendor that bills by session is never billed per keystroke by a component that forgot the token.\n * - **The vendor's attribution is handed to the component** from the descriptor's `attributionMark` — the mark\n * verbatim and a sentence from the application's labels naming it — for the component to show inside its\n * suggestion popup, the container the vendor's terms require (the framework combobox does, with\n * `ProviderAddressLookupAttribution`).\n * - **The field decides.** A chosen address passes `receiveProviderAddressLookupSelection` against the field's own\n * schema (countries, required parts) and the component's declared place-id retention before `applyAddress`; a\n * refused one fills nothing and says so.\n *\n * ## Manual entry always works (#561 D5)\n *\n * A refusal, a throttle, a vendor timeout, a component that fails to load: each leaves the parts exactly as they\n * were, editable, and shows one status line telling the person to enter the address below. Nothing blocks the\n * form's submission.\n */\n\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\nimport type { z } from 'zod';\nimport { ButtonSize, FormFieldAddressLookupLabel, FrontendComponentType } from '@wildo-ai/presets-components-models';\nimport type { ProviderAddressLookupProps, ProviderAddressLookupSelection, ProviderCapability } from '@wildo-ai/saas-models';\nimport { CoreResourceType, UserPrivacySchema } from '@wildo-ai/saas-models';\nimport { BUILTIN_PROVIDER_CAPABILITY, type ProviderAddressLookupDeclaration } from '@wildo-ai/saas-models/public-runtime';\nimport { getZodObjectShape } from '@wildo-ai/zod-decorators';\nimport { ProviderComponentStatus } from '@wildo-ai/external-connectors-public/app';\n\nimport { useApplication } from '~wildo-frontend-lib/core/runtime/useApplication';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { useGrantedConsentPurposes } from '~wildo-frontend-lib/core/security/useGrantedConsentPurposes';\nimport { getManualCallsHttpClient } from '~wildo-frontend-lib/core/requests/wildo-http-client-manual-calls.frontend.service';\nimport {\n useProviderComponent,\n useProviderComponentChoices,\n} from '~wildo-frontend-lib/core/components-registry/useProviderComponent.frontend.hooks';\nimport { Button, ButtonVariants_Variant } from '~wildo-frontend-lib/components/actions/button';\nimport { FieldLabel } from '~wildo-frontend-lib/components/form/chromes/field';\nimport type { AddressFieldLookupHost } from '~wildo-frontend-lib/components/form/fields/form-field-address';\nimport { receiveProviderAddressLookupSelection } from './provider-address-lookup-selection.frontend.utils';\nimport { ProviderAddressLookupPlaceWithoutAddressError } from './ProviderAddressLookupCombobox';\n\nconst ADDRESS_LOOKUP_CAPABILITY = BUILTIN_PROVIDER_CAPABILITY.FRONTEND_ADDRESS_LOOKUP as ProviderCapability;\n\n/** Consent purposes are worded through the field that stores a person's grant (#966), as the file field does. */\nconst CONSENTED_PURPOSES_FIELD_SCHEMA = getZodObjectShape(UserPrivacySchema).consentedPurposes;\n\n/** Why the lookup is showing a status line instead of (or beside) its search. */\nexport enum ProviderAddressLookupNotice {\n /** The lookup could not run; the parts work by hand. */\n UNAVAILABLE = 'UNAVAILABLE',\n /** The chosen place could not fill this field. */\n ADDRESS_REFUSED = 'ADDRESS_REFUSED',\n}\n\nexport interface ProviderAddressLookupHostProps {\n /** What the field hands its `renderLookup` slot. */\n readonly host: AddressFieldLookupHost;\n /** The field's own `z_address()` schema: a chosen address it refuses is refused here, before it fills anything. */\n readonly addressSchema: z.ZodType;\n /** The field's form name; the lookup control is named `<name>.lookup`. */\n readonly fieldName: string;\n}\n\n/** A fresh vendor session token: a version 4 UUID, as Google recommends for Places session tokens. */\nfunction newSessionToken(): string {\n return globalThis.crypto.randomUUID();\n}\n\nexport function ProviderAddressLookupHost({ host, addressSchema, fieldName }: ProviderAddressLookupHostProps): React.ReactElement | null {\n const { providerComponentRegistry, frontendProviderRegistry } = useApplication();\n const { t, tComponent, tResourceFieldEnumValue, currentLanguage } = useI18n({ component: [FrontendComponentType.LOW_LEVEL_FORM_FIELD_ADDRESS] });\n const label = (key: FormFieldAddressLookupLabel, params?: Record<string, string | number>) =>\n tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD_ADDRESS, key, params);\n\n const allChoices = useProviderComponentChoices(ADDRESS_LOOKUP_CAPABILITY);\n // Offered only when the component declares how it reaches its vendor: without declared operations there is no\n // call this host could make on its behalf, and a component making its own would bypass the door.\n const choices = useMemo(\n () => allChoices.filter((choice) => providerComponentRegistry?.describe(ADDRESS_LOOKUP_CAPABILITY, choice.providerRef)?.addressLookup !== undefined),\n [allChoices, providerComponentRegistry],\n );\n const [pickedRef, setPickedRef] = useState<string | undefined>(undefined);\n // A single provider needs no chooser; several are a genuine choice the person makes, never this host.\n const chosen = pickedRef ?? (choices.length === 1 ? choices[0]?.providerRef : undefined);\n const { status, Component, missingConsentPurposes } = useProviderComponent(ADDRESS_LOOKUP_CAPABILITY, chosen);\n const { grant: grantConsent } = useGrantedConsentPurposes();\n const [notice, setNotice] = useState<ProviderAddressLookupNotice | undefined>(undefined);\n\n const descriptor = chosen === undefined ? undefined : providerComponentRegistry?.describe(ADDRESS_LOOKUP_CAPABILITY, chosen);\n const declaration: ProviderAddressLookupDeclaration | undefined = descriptor?.addressLookup;\n\n /** The current vendor session; `undefined` until the first call of a session needs one. */\n const sessionTokenRef = useRef<string | undefined>(undefined);\n const endSession = useCallback(() => {\n sessionTokenRef.current = undefined;\n }, []);\n\n const run = useCallback(\n async (operationId: string, input: Readonly<Record<string, unknown>>): Promise<unknown> => {\n if (chosen === undefined) throw new Error('No address lookup provider is chosen.');\n const tokenInput = declaration?.sessionTokenInput;\n let sent: Record<string, unknown> = { ...input };\n if (tokenInput !== undefined) {\n sessionTokenRef.current ??= newSessionToken();\n // Written by the host AFTER the component's input, so a component cannot send its own token instead.\n sent = { ...sent, [tokenInput]: sessionTokenRef.current };\n }\n const answer = await getManualCallsHttpClient().executeProviderOperation(chosen, operationId, { input: sent });\n return answer.output;\n },\n [chosen, declaration?.sessionTokenInput],\n );\n\n const suggest = useCallback(\n (input: Readonly<Record<string, unknown>>) => {\n if (declaration === undefined) return Promise.reject(new Error('The address lookup declares no operations.'));\n return run(declaration.suggestOperationId, input);\n },\n [declaration, run],\n );\n\n const retrieve = useCallback(\n (input: Readonly<Record<string, unknown>>) => {\n if (declaration === undefined) return Promise.reject(new Error('The address lookup declares no operations.'));\n // The retrieval ends the vendor session whatever it answers: the next search is a new session.\n return run(declaration.retrieveOperationId, input).finally(endSession);\n },\n [declaration, endSession, run],\n );\n\n const handleSelect = useCallback(\n (selection: ProviderAddressLookupSelection) => {\n if (chosen === undefined) return;\n endSession();\n const outcome = receiveProviderAddressLookupSelection({ providerRef: chosen, descriptor, selection, addressSchema });\n if (outcome.accepted === undefined) {\n setNotice(ProviderAddressLookupNotice.ADDRESS_REFUSED);\n return;\n }\n setNotice(undefined);\n host.applyAddress(outcome.accepted.address);\n },\n [addressSchema, chosen, descriptor, endSession, host],\n );\n\n const handleCancel = useCallback(() => endSession(), [endSession]);\n\n const handleError = useCallback((error: Error) => {\n endSession();\n // A place with no holdable address is the lookup WORKING and the place being unusable — said as such.\n setNotice(error instanceof ProviderAddressLookupPlaceWithoutAddressError ? ProviderAddressLookupNotice.ADDRESS_REFUSED : ProviderAddressLookupNotice.UNAVAILABLE);\n }, [endSession]);\n\n if (choices.length === 0) return null;\n\n const chosenChoice = choices.find((choice) => choice.providerRef === chosen);\n const providerName = (choice: (typeof choices)[number]): string => t(choice.displayNameLabelKey) ?? choice.displayName ?? choice.providerRef;\n const lookupName = `${fieldName}.lookup`;\n const Lookup = Component as React.ComponentType<ProviderAddressLookupProps> | null;\n const failedToLoad = status === ProviderComponentStatus.UNAVAILABLE;\n const shownNotice = failedToLoad ? ProviderAddressLookupNotice.UNAVAILABLE : notice;\n\n return (\n <div className=\"flex flex-col gap-1\" data-address-lookup={chosen ?? ''}>\n <FieldLabel htmlFor={`field-${lookupName}`} className=\"text-sm text-muted-foreground\">\n {label(FormFieldAddressLookupLabel.LOOKUP_LABEL)}\n </FieldLabel>\n {choices.length > 1 ? (\n <div role=\"group\" className=\"flex flex-wrap gap-item-xs\">\n {choices.map((choice) => (\n <Button\n key={choice.providerRef}\n type=\"button\"\n size={ButtonSize.SM}\n variant={choice.providerRef === chosen ? ButtonVariants_Variant.DEFAULT : ButtonVariants_Variant.OUTLINE}\n aria-pressed={choice.providerRef === chosen}\n onClick={() => { setNotice(undefined); endSession(); setPickedRef(choice.providerRef); }}\n >\n {providerName(choice)}\n </Button>\n ))}\n </div>\n ) : null}\n {status === ProviderComponentStatus.CONSENT_REQUIRED && chosenChoice !== undefined ? (\n <div role=\"status\" className=\"flex flex-wrap items-center gap-item-xs text-sm text-muted-foreground\">\n {(() => {\n const purposes = missingConsentPurposes\n .map((purpose) => tResourceFieldEnumValue(CoreResourceType.USER_SELF_PREFERENCES, 'privacy.consentedPurposes', purpose, CONSENTED_PURPOSES_FIELD_SCHEMA))\n .join(', ');\n return (\n <>\n <span>{label(FormFieldAddressLookupLabel.LOOKUP_CONSENT_REQUIRED, { provider: providerName(chosenChoice), purposes })}</span>\n {grantConsent === undefined ? null : (\n <Button type=\"button\" size={ButtonSize.SM} variant={ButtonVariants_Variant.OUTLINE} onClick={() => void grantConsent(missingConsentPurposes)}>\n {label(FormFieldAddressLookupLabel.LOOKUP_CONSENT_GRANT, { purposes })}\n </Button>\n )}\n </>\n );\n })()}\n </div>\n ) : null}\n {status === ProviderComponentStatus.READY && Lookup !== null && chosen !== undefined && declaration !== undefined ? (\n <>\n <Lookup\n providerRef={chosen}\n publicConfig={frontendProviderRegistry?.getProviderByRef(chosen as never)?.publicConfig ?? {}}\n {...(host.countriesAllowed !== undefined ? { countriesAllowed: host.countriesAllowed } : {})}\n {...(host.defaultCountry !== undefined ? { defaultCountry: host.defaultCountry } : {})}\n languageCode={currentLanguage}\n disabled={host.disabled}\n name={lookupName}\n {...(declaration.attributionMark !== undefined\n ? { attribution: { mark: declaration.attributionMark, accessibleLabel: label(FormFieldAddressLookupLabel.LOOKUP_ATTRIBUTION, { mark: declaration.attributionMark }) } }\n : {})}\n suggest={suggest}\n retrieve={retrieve}\n onSelect={handleSelect}\n onCancel={handleCancel}\n onError={handleError}\n />\n </>\n ) : null}\n {shownNotice !== undefined ? (\n <p role=\"status\" className=\"text-sm text-muted-foreground\">\n {label(shownNotice === ProviderAddressLookupNotice.UNAVAILABLE ? FormFieldAddressLookupLabel.LOOKUP_UNAVAILABLE : FormFieldAddressLookupLabel.LOOKUP_ADDRESS_REFUSED)}\n </p>\n ) : null}\n </div>\n );\n}\n"]}
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
* translation becomes invisible.
|
|
30
30
|
*/
|
|
31
31
|
import React from 'react';
|
|
32
|
-
import type { FileStorageAccepted } from '@wildo-ai/saas-models/public-runtime';
|
|
32
|
+
import type { ConsentPurpose, FileStorageAccepted } from '@wildo-ai/saas-models/public-runtime';
|
|
33
33
|
import type { ProviderFilePickerConstraints, ProviderFileSelection } from '@wildo-ai/saas-models/public-runtime';
|
|
34
34
|
import { type ProviderComponentChoice } from '../../core/components-registry/useProviderComponent.frontend.hooks';
|
|
35
35
|
import { type ProviderFileSelectionRejection } from './provider-file-selection.frontend.utils';
|
|
@@ -84,6 +84,27 @@ export interface ProviderFilePickerHostProps {
|
|
|
84
84
|
readonly chosen: string | undefined;
|
|
85
85
|
choose(providerRef: string): void;
|
|
86
86
|
}): React.ReactNode;
|
|
87
|
+
/**
|
|
88
|
+
* Renders the state shown when the chosen provider rests on consent the person has not granted (#1702):
|
|
89
|
+
* nothing of the provider has been downloaded, and the surface owes the person the reason and the way to
|
|
90
|
+
* change it. Supplied by the caller for the same reason as `renderChooser` — it is chrome, and its words
|
|
91
|
+
* are the caller's i18n. The default below names the purposes by their raw values: a missing label that
|
|
92
|
+
* LOOKS missing, never invented text.
|
|
93
|
+
*/
|
|
94
|
+
renderConsentRequired?(input: ProviderFilePickerConsentRequiredInput): React.ReactNode;
|
|
95
|
+
}
|
|
96
|
+
/** What a consent-required state needs to say and to offer. */
|
|
97
|
+
export interface ProviderFilePickerConsentRequiredInput {
|
|
98
|
+
/** The chosen provider, as a choice — its display-name label KEY included. */
|
|
99
|
+
readonly choice: ProviderComponentChoice;
|
|
100
|
+
/** The purposes the person would have to grant, in vocabulary order. Never empty. */
|
|
101
|
+
readonly missingPurposes: readonly ConsentPurpose[];
|
|
102
|
+
/**
|
|
103
|
+
* Records a grant of exactly `missingPurposes` through the person's audited preference write; the picker
|
|
104
|
+
* then loads without a re-mount. `undefined` when there is no signed-in person to record it for — the
|
|
105
|
+
* state must then say what is missing without offering an action it cannot perform.
|
|
106
|
+
*/
|
|
107
|
+
readonly grant: (() => Promise<void>) | undefined;
|
|
87
108
|
}
|
|
88
109
|
export declare function ProviderFilePickerHost(props: ProviderFilePickerHostProps): React.ReactElement | null;
|
|
89
110
|
//# sourceMappingURL=ProviderFilePickerHost.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProviderFilePickerHost.d.ts","sourceRoot":"","sources":["../../../../../src/core/external-providers/ProviderFilePickerHost.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAA4D,MAAM,OAAO,CAAC;AAGjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"ProviderFilePickerHost.d.ts","sourceRoot":"","sources":["../../../../../src/core/external-providers/ProviderFilePickerHost.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAA4D,MAAM,OAAO,CAAC;AAGjF,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChG,OAAO,KAAK,EACV,6BAA6B,EAE7B,qBAAqB,EACtB,MAAM,sCAAsC,CAAC;AAK9C,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,kFAAkF,CAAC;AAC1F,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,0CAA0C,CAAC;AAIlD,MAAM,WAAW,2BAA2B;IAC1C;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,6BAA6B,CAAC;IACpD;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B;;;;;;;;OAQG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAC/D;;;;OAIG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,qBAAqB,EAAE,GAAG,IAAI,CAAC;IAClF,QAAQ,CAAC,IAAI,IAAI,CAAC;IAClB;;;;OAIG;IACH,iBAAiB,CAAC,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,8BAA8B,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7J;;;;OAIG;IACH,aAAa,CAAC,CAAC,KAAK,EAAE;QACpB,QAAQ,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,CAAC;QACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;QACpC,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KACnC,GAAG,KAAK,CAAC,SAAS,CAAC;IACpB;;;;;;OAMG;IACH,qBAAqB,CAAC,CAAC,KAAK,EAAE,sCAAsC,GAAG,KAAK,CAAC,SAAS,CAAC;CACxF;AAED,+DAA+D;AAC/D,MAAM,WAAW,sCAAsC;IACrD,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;IACzC,qFAAqF;IACrF,QAAQ,CAAC,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IACpD;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;CACnD;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAuJpG"}
|
|
@@ -32,8 +32,10 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
|
|
|
32
32
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
33
33
|
import { BUILTIN_PROVIDER_CAPABILITY, layerProviderFilePickerConstraints } from '@wildo-ai/saas-models/public-runtime';
|
|
34
34
|
import { useApplication } from '../../core/runtime/useApplication.js';
|
|
35
|
+
import { useGrantedConsentPurposes } from '../../core/security/useGrantedConsentPurposes.js';
|
|
35
36
|
import { getManualCallsHttpClient } from '../../core/requests/wildo-http-client-manual-calls.frontend.service.js';
|
|
36
|
-
import { ProviderComponentStatus
|
|
37
|
+
import { ProviderComponentStatus } from '@wildo-ai/external-connectors-public/app';
|
|
38
|
+
import { useProviderComponent, useProviderComponentChoices, } from '../../core/components-registry/useProviderComponent.frontend.hooks.js';
|
|
37
39
|
import { receiveProviderFileSelections, } from './provider-file-selection.frontend.utils.js';
|
|
38
40
|
const FILE_PICKER_CAPABILITY = BUILTIN_PROVIDER_CAPABILITY.FRONTEND_FILE_PICKER;
|
|
39
41
|
export function ProviderFilePickerHost(props) {
|
|
@@ -57,7 +59,8 @@ export function ProviderFilePickerHost(props) {
|
|
|
57
59
|
if (soleProviderRef !== undefined && chosen === undefined)
|
|
58
60
|
setChosen(soleProviderRef);
|
|
59
61
|
}, [soleProviderRef, chosen]);
|
|
60
|
-
const { status, Component } = useProviderComponent(FILE_PICKER_CAPABILITY, chosen);
|
|
62
|
+
const { status, Component, missingConsentPurposes } = useProviderComponent(FILE_PICKER_CAPABILITY, chosen);
|
|
63
|
+
const { grant: grantConsent } = useGrantedConsentPurposes();
|
|
61
64
|
const publicConfig = useMemo(() => {
|
|
62
65
|
if (chosen === undefined)
|
|
63
66
|
return {};
|
|
@@ -132,13 +135,30 @@ export function ProviderFilePickerHost(props) {
|
|
|
132
135
|
return null;
|
|
133
136
|
const chooser = props.renderChooser?.({ choices, chosen, choose: setChosen })
|
|
134
137
|
?? defaultChooser({ choices, chosen, choose: setChosen });
|
|
138
|
+
const chosenChoice = choices.find((choice) => choice.providerRef === chosen);
|
|
139
|
+
const consentRequired = status === ProviderComponentStatus.CONSENT_REQUIRED && chosenChoice !== undefined
|
|
140
|
+
? (props.renderConsentRequired ?? defaultConsentRequired)({
|
|
141
|
+
choice: chosenChoice,
|
|
142
|
+
missingPurposes: missingConsentPurposes,
|
|
143
|
+
grant: grantConsent === undefined ? undefined : () => grantConsent(missingConsentPurposes),
|
|
144
|
+
})
|
|
145
|
+
: null;
|
|
135
146
|
// `Component` is typed as the registry's opaque component: this package must
|
|
136
147
|
// not make the registry know any capability's props. The narrowing happens
|
|
137
148
|
// HERE, where the capability is known, and it is the only cast in the path.
|
|
138
149
|
const Picker = Component;
|
|
139
|
-
return (_jsxs(_Fragment, { children: [choices.length > 1 ? chooser : null, status === ProviderComponentStatus.READY && Picker !== null && chosen !== undefined ? (_jsx(Picker, { providerRef: chosen, publicConfig: publicConfig, constraints: constraints, getAccessToken: getAccessToken, onSelect: handleSelect, onCancel: handleCancel, onError: handleError })) : null] }));
|
|
150
|
+
return (_jsxs(_Fragment, { children: [choices.length > 1 ? chooser : null, consentRequired, status === ProviderComponentStatus.READY && Picker !== null && chosen !== undefined ? (_jsx(Picker, { providerRef: chosen, publicConfig: publicConfig, constraints: constraints, getAccessToken: getAccessToken, onSelect: handleSelect, onCancel: handleCancel, onError: handleError })) : null] }));
|
|
140
151
|
}
|
|
141
152
|
function defaultChooser(input) {
|
|
142
153
|
return (_jsx("div", { role: "group", children: input.choices.map((choice) => (_jsx("button", { type: "button", "aria-pressed": choice.providerRef === input.chosen, onClick: () => input.choose(choice.providerRef), children: choice.displayName ?? choice.providerRef }, choice.providerRef))) }));
|
|
143
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* The fallback consent-required state: announced (`role="status"`), with a real, keyboard-reachable
|
|
157
|
+
* button when a grant can be recorded. It names purposes by their RAW values on purpose — a surface with an
|
|
158
|
+
* i18n service passes `renderConsentRequired` and words them; this default must not invent the words.
|
|
159
|
+
*/
|
|
160
|
+
function defaultConsentRequired(input) {
|
|
161
|
+
const purposes = input.missingPurposes.join(', ');
|
|
162
|
+
return (_jsxs("div", { role: "status", "data-provider-consent-required": input.choice.providerRef, children: [_jsx("span", { children: purposes }), input.grant === undefined ? null : (_jsx("button", { type: "button", onClick: () => void input.grant?.(), children: purposes }))] }));
|
|
163
|
+
}
|
|
144
164
|
//# sourceMappingURL=ProviderFilePickerHost.js.map
|