@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
|
@@ -11,7 +11,7 @@ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-run
|
|
|
11
11
|
*/
|
|
12
12
|
import React, { useMemo } from 'react';
|
|
13
13
|
import { ErrorCustomMessageReference, } from '@wildo-ai/saas-models';
|
|
14
|
-
import {
|
|
14
|
+
import { getEnumValues, DisplayChromeMode, ViewportBreakpoint } from '@wildo-ai/zod-decorators';
|
|
15
15
|
import { UIContext } from '../../core/ui/UIContext.js';
|
|
16
16
|
import { useLongPress } from '../../components/resources/useLongPress.js';
|
|
17
17
|
import { DisplayField } from '../../components/data-display/DisplayField.js';
|
|
@@ -19,7 +19,9 @@ import { DisplayChromeProvider } from '../../components/data-display/chromes/Dis
|
|
|
19
19
|
import { ResourceSummaryDisplayer } from '../../components/data-display/ResourceSummaryDisplayer.js';
|
|
20
20
|
import { Text } from '../../components/typography/text.js';
|
|
21
21
|
import { FrontendResourceUtils } from '../../core/resources/frontend-resource.utils.js';
|
|
22
|
+
import { useI18n } from '../../core/i18n/useI18n.js';
|
|
22
23
|
import { AutomatedLayoutFrontendUtils } from '../../core/automated-layout/automated-layout.frontend.utils.js';
|
|
24
|
+
import { resolveResourceLabelEnumSchema } from '../../core/resources/resource-label-field-paths.frontend.utils.js';
|
|
23
25
|
import { cn } from '../../core/ui/cn.js';
|
|
24
26
|
import { CheckboxRoot } from '../../components/form/controls/boolean/checkbox.js';
|
|
25
27
|
import { CARD_ROW_PADDING_CLASS, CARD_SELECTION_RAIL_CLASS, CARD_SELECTION_SLOT_CLASS, } from '../../components/resources/collection-card-layout.utils.js';
|
|
@@ -49,10 +51,16 @@ export function FieldValueRenderer({ fieldName, value, fieldSchema, fieldLabel,
|
|
|
49
51
|
// Build the enum value→label map from the same i18n translator the list
|
|
50
52
|
// already uses, so enum badges show translated labels rather than raw enum
|
|
51
53
|
// values. Hook runs unconditionally, before the null-value early return.
|
|
54
|
+
//
|
|
55
|
+
// The vocabulary is read off the ENUM-BEARING schema — the field, or an array's element — through the
|
|
56
|
+
// resolver the detail views and the labelling planner share. Asking only "is the field itself an enum"
|
|
57
|
+
// left every array of an enum raw in a list or a table: a member directory printed `ORG_MEMBER` while
|
|
58
|
+
// the same roles read "Organization member" on the member's own page.
|
|
52
59
|
const enumLabels = useMemo(() => {
|
|
53
|
-
|
|
60
|
+
const enumSchema = fieldSchema ? resolveResourceLabelEnumSchema(fieldSchema) : undefined;
|
|
61
|
+
if (!enumSchema)
|
|
54
62
|
return undefined;
|
|
55
|
-
const enumValues = getEnumValues(
|
|
63
|
+
const enumValues = getEnumValues(enumSchema);
|
|
56
64
|
if (enumValues.length === 0)
|
|
57
65
|
return undefined;
|
|
58
66
|
return Object.fromEntries(enumValues.map((enumValue) => [enumValue, tResourceFieldEnumValue(resourceType, fieldName, enumValue, fieldSchema)]));
|
|
@@ -86,14 +94,24 @@ export function ResourceListItemRenderer({ item, resourceType, resourceConfig, r
|
|
|
86
94
|
// Primary display: use computeFrontendResourceLabel for the primary value.
|
|
87
95
|
// For a junction this resolves the server-projected instance label (e.g. a
|
|
88
96
|
// `forwardedLabel` virtual field referenced by `getFrontendResourceLabel`).
|
|
97
|
+
/*
|
|
98
|
+
* The translator goes to the label callback. Without it `computeFrontendResourceLabel` falls back
|
|
99
|
+
* to an IDENTITY `t`, so a label callback that words its row through the label tree rendered the
|
|
100
|
+
* key — then its own fallback, a ref — on every card, while the same row's page header (which
|
|
101
|
+
* passes `t`) read correctly (#1454: governed documents titled `document-definition:…` in lists).
|
|
102
|
+
*/
|
|
103
|
+
const { t: tLabel, formatDate, formatDateTime } = useI18n({ resource: resourceType });
|
|
89
104
|
const primaryLabel = useMemo(() => {
|
|
90
105
|
const label = FrontendResourceUtils.computeFrontendResourceLabel({
|
|
91
106
|
resourceType,
|
|
92
107
|
registry,
|
|
93
108
|
currentObject: item,
|
|
109
|
+
t: tLabel,
|
|
110
|
+
formatDate,
|
|
111
|
+
formatDateTime,
|
|
94
112
|
});
|
|
95
113
|
return String(label || item[summaryFields[0]] || `${resourceType} #${itemId}`);
|
|
96
|
-
}, [item, resourceType, registry, summaryFields, itemId]);
|
|
114
|
+
}, [item, resourceType, registry, summaryFields, itemId, tLabel, formatDate, formatDateTime]);
|
|
97
115
|
// Secondary fields: every summary field EXCEPT the one already shown as the
|
|
98
116
|
// primary label (title). The title comes from `computeFrontendResourceLabel`
|
|
99
117
|
// — an arbitrary label strategy (a `string[]` join or a function), NOT
|
|
@@ -170,43 +188,55 @@ export function ResourceListItemRenderer({ item, resourceType, resourceConfig, r
|
|
|
170
188
|
}
|
|
171
189
|
onItemClick?.(item);
|
|
172
190
|
};
|
|
173
|
-
|
|
191
|
+
/*
|
|
192
|
+
* ─── The card is NOT a button; its ACTIVATOR is ────────────────────────────────────────────
|
|
193
|
+
*
|
|
194
|
+
* The card root used to be `role="button"` with `tabIndex={0}` and Enter/Space handling, and it
|
|
195
|
+
* CONTAINED the row's selection checkbox and its "More actions" button. ARIA does not allow
|
|
196
|
+
* interactive descendants inside a button, and assistive technology may flatten the whole card
|
|
197
|
+
* into one control — a screen-reader user could reach "open this record" but not reliably
|
|
198
|
+
* "select it" or "its actions". axe reported it as `nested-interactive`, serious, on every card
|
|
199
|
+
* of the todos list (#1718).
|
|
200
|
+
*
|
|
201
|
+
* This is the settled card-with-a-primary-action shape: a real `<button>` carries the name and
|
|
202
|
+
* the keyboard activation, and it is a SIBLING of the checkbox and the actions rather than their
|
|
203
|
+
* container. It is laid over the whole card (`absolute inset-0`) so its focus ring outlines the
|
|
204
|
+
* card and a click on empty space lands on it; the rail after it is positioned too, so it stacks
|
|
205
|
+
* above and its controls stay directly clickable. The root keeps its pointer `onClick` and the
|
|
206
|
+
* long-press, so a click on the card's TEXT still opens the record — pointer behaviour is
|
|
207
|
+
* unchanged, and the keyboard path is now a button that needs no hand-written key handling.
|
|
208
|
+
*/
|
|
209
|
+
return (_jsxs("div", { className: cn(CARD_ROW_PADDING_CLASS, transitionClass, isActivatable && 'relative',
|
|
174
210
|
// Both only when a click leads somewhere — see `isActivatable`.
|
|
175
211
|
isActivatable && hoverClass, isActivatable && 'cursor-pointer', isSelected && 'bg-primary/5',
|
|
176
212
|
// Prevent the browser text-selection that a long-press would start.
|
|
177
|
-
selectable && 'select-none', className), onClick: isActivatable ? handleActivate : undefined,
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
})] })) }), operationsSlot && (
|
|
206
|
-
// stopPropagation on click, keydown AND touchstart: an action tap or
|
|
207
|
-
// keyboard activation must not also navigate the row, and a hold over
|
|
208
|
-
// an action must not arm the row's long-press selection. (Mirrors the
|
|
209
|
-
// checkbox rail — all three axes.)
|
|
210
|
-
_jsx("div", { className: placement.actionsClass, onClick: (e) => e.stopPropagation(), onKeyDown: (e) => e.stopPropagation(), onTouchStart: (e) => e.stopPropagation(), children: operationsSlot }))] })] }) }));
|
|
213
|
+
selectable && 'select-none', className), onClick: isActivatable ? handleActivate : undefined, ...longPress.handlers, children: [isActivatable && (_jsx("button", { type: "button", "aria-label": String(primaryLabel),
|
|
214
|
+
// Selection state is conveyed by the row's checkbox; the bg tint is a purely visual
|
|
215
|
+
// reinforcement, and `aria-pressed` would misdescribe a button that OPENS the record.
|
|
216
|
+
className: "absolute inset-0 rounded-[inherit] focus-ring-inset outline-hidden", onClick: (e) => {
|
|
217
|
+
// The root's own onClick would run the same activation again for this click.
|
|
218
|
+
e.stopPropagation();
|
|
219
|
+
handleActivate();
|
|
220
|
+
} })), _jsxs("div", { className: cn(CARD_SELECTION_RAIL_CLASS, isActivatable && 'relative'), children: [selectable && (_jsx("div", {
|
|
221
|
+
// `pt-0.5` optically centres the box on the first line of text beside it; the
|
|
222
|
+
// HORIZONTAL half comes from the shared constant, which the header rail also reads.
|
|
223
|
+
className: cn(CARD_SELECTION_SLOT_CLASS, 'pt-0.5'), onClick: (e) => e.stopPropagation(), onKeyDown: (e) => e.stopPropagation(), onTouchStart: (e) => e.stopPropagation(), children: _jsx(CheckboxRoot, { checked: isSelected, onCheckedChange: () => onToggleSelect?.(item), "aria-label": selectAriaLabel ?? String(primaryLabel) }) })), _jsxs("div", { className: cn(placement.containerClass, 'min-w-0 flex-1'), children: [_jsx("div", { className: cn('space-y-item-xs', placement.contentClass), children: authoredSummaryTemplate && resourceConfig?.mainSchema ? (
|
|
224
|
+
// Authored template owns title + body. The title is fed via
|
|
225
|
+
// SummaryContext (primaryLabel) and rendered by `<SummaryTitle />`
|
|
226
|
+
// inside the template, so we do NOT render our own title here. The
|
|
227
|
+
// region stays click-through so the whole card navigates (same as the
|
|
228
|
+
// legacy body); an author who embeds a genuinely interactive control
|
|
229
|
+
// stops propagation within their own template.
|
|
230
|
+
_jsx(ResourceSummaryDisplayer, { resourceType: resourceType, schema: resourceConfig.mainSchema, data: item, primaryLabel: primaryLabel })) : (_jsxs(_Fragment, { children: [_jsx(Text, { as: "p", className: "font-medium text-foreground", truncate: true, children: primaryLabel }), secondaryFields.map((fieldName) => {
|
|
231
|
+
const value = item[fieldName];
|
|
232
|
+
if (value === null || value === undefined)
|
|
233
|
+
return null;
|
|
234
|
+
return (_jsx("div", { children: _jsx(FieldValueRenderer, { fieldName: fieldName, value: value, fieldSchema: schemaShape?.[fieldName], fieldLabel: fieldLabelsMap[fieldName], resourceType: resourceType, record: item, tResourceFieldEnumValue: tResourceFieldEnumValue }) }, fieldName));
|
|
235
|
+
})] })) }), operationsSlot && (
|
|
236
|
+
// stopPropagation on click, keydown AND touchstart: an action tap or
|
|
237
|
+
// keyboard activation must not also navigate the row, and a hold over
|
|
238
|
+
// an action must not arm the row's long-press selection. (Mirrors the
|
|
239
|
+
// checkbox rail — all three axes.)
|
|
240
|
+
_jsx("div", { className: placement.actionsClass, onClick: (e) => e.stopPropagation(), onKeyDown: (e) => e.stopPropagation(), onTouchStart: (e) => e.stopPropagation(), children: operationsSlot }))] })] })] }));
|
|
211
241
|
}
|
|
212
242
|
//# sourceMappingURL=ResourceListItemRenderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceListItemRenderer.js","sourceRoot":"","sources":["../../../../../src/components/resources/ResourceListItemRenderer.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * ResourceListItemRenderer\n *\n * Shared item renderer for List and Search presets.\n * Encapsulates schema-aware field rendering (FK, enum, date, array),\n * primary/secondary field split, and per-item operations.\n *\n * Used by List_Default and Search_Default to ensure parity in how\n * resource items are displayed.\n */\n\nimport React, { useMemo, useCallback } from 'react';\nimport { z } from 'zod';\nimport {\n CoreResourceOperation,\n ResourceOperationDisplayMode,\n ErrorCustomMessageReference,\n} from '@wildo-ai/saas-models';\nimport type { AnyFrontendResourceConfiguration, FrontendResourcesRegistry } from '~wildo-frontend-lib/core/resources/resources.frontend.schemas';\nimport { getSchemaType, FieldSchemaType, getEnumValues, DisplayChromeMode, ViewportBreakpoint } from '@wildo-ai/zod-decorators';\nimport { UIContext } from '~wildo-frontend-lib/core/ui/UIContext';\nimport { useLongPress } from '~wildo-frontend-lib/components/resources/useLongPress';\nimport { DisplayField } from '~wildo-frontend-lib/components/data-display/DisplayField';\nimport { DisplayChromeProvider } from '~wildo-frontend-lib/components/data-display/chromes/DisplayChromeContext';\nimport { ResourceSummaryDisplayer } from '~wildo-frontend-lib/components/data-display/ResourceSummaryDisplayer';\nimport { Text } from '~wildo-frontend-lib/components/typography/text';\nimport { FrontendResourceUtils, frontendResourceUtils } from '~wildo-frontend-lib/core/resources/frontend-resource.utils';\nimport { AutomatedLayoutFrontendUtils } from '~wildo-frontend-lib/core/automated-layout/automated-layout.frontend.utils';\nimport type { FrontendResourceOperationContext } from '~wildo-frontend-lib/core/resources/resources.frontend.schemas';\nimport { cn } from '~wildo-frontend-lib/core/ui/cn';\nimport { CheckboxRoot } from '~wildo-frontend-lib/components/form/controls/boolean/checkbox';\nimport {\n CARD_ROW_PADDING_CLASS,\n CARD_SELECTION_RAIL_CLASS,\n CARD_SELECTION_SLOT_CLASS,\n} from '~wildo-frontend-lib/components/resources/collection-card-layout.utils';\nimport type { CardActionPlacement } from '~wildo-frontend-lib/core/resources/resources.frontend.schemas';\nimport { resolveCardActionPlacementClasses } from './card-action-placement.utils';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ResourceListItemRendererProps {\n /** The data item to render */\n item: Record<string, unknown>;\n /** Resource type */\n resourceType: string;\n /** Resource configuration */\n resourceConfig: AnyFrontendResourceConfiguration;\n /** Resource registry */\n registry: FrontendResourcesRegistry;\n /** Ordered list of summary fields to display */\n summaryFields: string[];\n /** Pre-resolved field labels (from i18n) */\n fieldLabelsMap: Record<string, string>;\n /** Function to resolve enum display values via i18n — `fieldSchema` names the enum the field declares (#966) */\n tResourceFieldEnumValue: (resourceType: string, fieldName: string, enumValue: string, fieldSchema: z.ZodTypeAny | undefined) => string;\n /**\n * What a click on the row does — and, by its ABSENCE, that a click does nothing.\n *\n * Optional since 2026-09-20, and the optionality is the point. The card used to take this\n * REQUIRED and paint itself `cursor-pointer` + `role=\"button\"` + `tabIndex={0}` unconditionally,\n * so every summary row in the product announced itself as a button. Whether the click could act\n * was decided somewhere else entirely — in the host, by whether a READ operation resolves to a\n * view — and the two were never compared. On the audit trail the answer was \"it cannot\", so the\n * row invited a click, took focus, answered Enter and Space, and did nothing at any of them.\n *\n * A host that cannot open a row now omits this, and the affordance disappears with the behaviour\n * because both are read off the same value.\n */\n onItemClick?: (item: Record<string, unknown>) => void;\n /** Optional operations component to render for this item */\n operationsSlot?: React.ReactNode;\n /**\n * Where the per-item operations sit within the card (2-axis anchor +\n * orientation). Resolved by the host from `collectionDisplayConfig.cardActionPlacement`.\n * Omitted → the default (inline-end, vertically centered, horizontal row).\n */\n cardActionPlacement?: CardActionPlacement;\n /**\n * Selection affordance. When `selectable`, a leading checkbox renders and\n * toggles selection via `onToggleSelect` (independent of the row click, which\n * still navigates). `isSelected` drives the checkbox + a selected highlight.\n */\n selectable?: boolean;\n isSelected?: boolean;\n onToggleSelect?: (item: Record<string, unknown>) => void;\n /**\n * Whether the collection is currently in SELECTION MODE (any item selected).\n * Mobile UX: a long-press enters selection mode, and while active a plain TAP\n * toggles selection instead of navigating (the \"long-press to multi-select\"\n * pattern). Gated to touch/mobile — on desktop a click always navigates and\n * the checkbox is the explicit toggle.\n */\n selectionActive?: boolean;\n /** Accessible label for the selection checkbox (host provides the i18n string). */\n selectAriaLabel?: string;\n /** Optional className for the root container */\n className?: string;\n /** Interactive CSS classes from design system (hover state, transition) */\n interactiveClasses?: {\n hover?: string;\n transition?: string;\n };\n}\n\n// =============================================================================\n// FIELD VALUE RENDERER\n// =============================================================================\n\nexport interface FieldValueRendererProps {\n fieldName: string;\n value: unknown;\n fieldSchema: z.ZodTypeAny | undefined;\n fieldLabel: string | undefined;\n resourceType: string;\n tResourceFieldEnumValue: (resourceType: string, fieldName: string, enumValue: string, fieldSchema: z.ZodTypeAny | undefined) => string;\n /**\n * The whole record this cell belongs to, forwarded to the dispatcher as `parentData`.\n *\n * Optional so a caller rendering a bare value is unaffected — but every collection caller passes\n * it, because a field frequently needs a sibling to render correctly and a cell that does not know\n * its row cannot reach one.\n */\n record?: Record<string, unknown>;\n}\n\n/**\n * Renders a single summary field VALUE through the shared decorator-driven\n * display pipeline (`DisplayField` → `DisplayValueDispatcher` → presets) — the\n * SAME path the detail/read view uses — so the FULL zod-UI display policy is\n * honored in lists/tables by default: enum → badge (+ per-value colors),\n * boolean → checkmark / yes-no, string → truncate / multiline, FK → reference,\n * date → formatted, money/bigdecimal/duration/etc.\n *\n * Previously this re-implemented a weak subset (enum-as-plain-text, naive array\n * join, `String(value)` fallback) that silently ignored every\n * `{primitive}UI().display` decorator, so listings/tables diverged from the\n * detail view (e.g. a `displayMode: BADGE` enum rendered as plain text). Routing\n * through `DisplayField` removes that divergence and the maintenance burden of a\n * parallel renderer.\n *\n * The card (\"Label:\" prefix) and the table (column header) own the label, so the\n * value is rendered under COMPACT chrome — a bare value with no framework\n * label/description wrapper. i18n enum labels are threaded explicitly via\n * `enumLabels` because there is no surrounding `DisplayTemplateContext`\n * (which is what supplies them inside `AutomaticDisplayer`).\n */\nexport function FieldValueRenderer({\n fieldName,\n value,\n fieldSchema,\n fieldLabel,\n resourceType,\n record,\n tResourceFieldEnumValue,\n}: FieldValueRendererProps): React.JSX.Element | null {\n // Build the enum value→label map from the same i18n translator the list\n // already uses, so enum badges show translated labels rather than raw enum\n // values. Hook runs unconditionally, before the null-value early return.\n const enumLabels = useMemo<Record<string, string> | undefined>(() => {\n if (!fieldSchema || getSchemaType(fieldSchema) !== FieldSchemaType.ENUM) return undefined;\n const enumValues = getEnumValues(fieldSchema);\n if (enumValues.length === 0) return undefined;\n return Object.fromEntries(\n enumValues.map((enumValue) => [enumValue, tResourceFieldEnumValue(resourceType, fieldName, enumValue, fieldSchema)]),\n );\n }, [fieldSchema, resourceType, fieldName, tResourceFieldEnumValue]);\n\n if (value === null || value === undefined) return null;\n\n return (\n <div className=\"flex min-w-0 items-baseline gap-element-sm\">\n {fieldLabel && <span className=\"text-xs text-muted-foreground\">{fieldLabel}:</span>}\n {fieldSchema ? (\n // COMPACT chrome → bare value with the full decorator policy applied.\n <DisplayChromeProvider displayChromeMode={DisplayChromeMode.COMPACT}>\n <DisplayField\n name={fieldName}\n schema={fieldSchema}\n value={value}\n enumLabels={enumLabels}\n // The ROW this cell belongs to. Every other display surface hands the dispatcher its\n // record as `parentData`; a collection cell did not, so anything a field needs from its\n // siblings was unreachable from a list or a table — including a foreign key's\n // `labelFallbackField`, which is why a member directory printed raw ObjectIds.\n parentData={record}\n disableInlineEdit\n className=\"min-w-0 truncate text-sm text-muted-foreground\"\n />\n </DisplayChromeProvider>\n ) : (\n // No schema resolved for this field — `DisplayField` requires a schema,\n // so fall back to a plain string (matches the previous default branch).\n <span className=\"min-w-0 truncate text-sm text-muted-foreground\">{String(value)}</span>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\nexport function ResourceListItemRenderer({\n item,\n resourceType,\n resourceConfig,\n registry,\n summaryFields,\n fieldLabelsMap,\n tResourceFieldEnumValue,\n onItemClick,\n operationsSlot,\n cardActionPlacement,\n selectable = false,\n isSelected = false,\n onToggleSelect,\n selectionActive = false,\n selectAriaLabel,\n className,\n interactiveClasses,\n}: ResourceListItemRendererProps): React.JSX.Element {\n if (!resourceConfig?.resourceFieldIdentifier) {\n throw FrontendResourceUtils.buildConfigurationError(\n ErrorCustomMessageReference.FRONTEND_RESOURCE_FIELD_IDENTIFIER_NOT_FOUND,\n { resourceType, component: 'ResourceListItemRenderer' }\n );\n }\n const fieldIdentifier = resourceConfig.resourceFieldIdentifier as string;\n // Resolve the record's own id (`_id`), not the cross-resource field-identifier\n // name (`<resource>Id`) which is absent from a plain record — see\n // FrontendResourceUtils.getResourceObjectId.\n const itemId = FrontendResourceUtils.getResourceObjectId(item, fieldIdentifier);\n\n // Primary display: use computeFrontendResourceLabel for the primary value.\n // For a junction this resolves the server-projected instance label (e.g. a\n // `forwardedLabel` virtual field referenced by `getFrontendResourceLabel`).\n const primaryLabel = useMemo((): string => {\n const label = FrontendResourceUtils.computeFrontendResourceLabel({\n resourceType,\n registry,\n currentObject: item,\n });\n return String(label || item[summaryFields[0]] || `${resourceType} #${itemId}`);\n }, [item, resourceType, registry, summaryFields, itemId]);\n\n // Secondary fields: every summary field EXCEPT the one already shown as the\n // primary label (title). The title comes from `computeFrontendResourceLabel`\n // — an arbitrary label strategy (a `string[]` join or a function), NOT\n // necessarily `summaryFields[0]`. Excluding the title positionally (`slice(1)`)\n // had two bugs: (a) it REPEATED the title when the label field wasn't first\n // (e.g. a list whose label is `name` but whose first summary field is `status`\n // → \"Name: …\" rendered under the identical title), and (b) it silently DROPPED\n // `summaryFields[0]` whenever that field wasn't the label. Excluding the title\n // by VALUE fixes both: the field whose value equals the title is the label\n // field wherever it sits, and every genuine non-label summary field is kept.\n // (The primary-scope FK is dropped upstream by\n // `ResourceLayoutUtils.detectSummaryFields`, so it never reaches here.)\n const secondaryFields = useMemo(\n () => summaryFields.filter((fieldName) => {\n const value = item[fieldName];\n if (value === null || value === undefined) return false;\n return String(value) !== primaryLabel;\n }),\n [summaryFields, item, primaryLabel],\n );\n\n // Schema shape for field type detection\n const schemaShape = useMemo(() => {\n const mainSchema = resourceConfig?.mainSchema;\n if (!mainSchema) return null;\n // Polymorphic resources feed a discriminated-union schema; resolve the union-aware field shape (else getObjectShape returns null for the union → no field labels).\n return AutomatedLayoutFrontendUtils.getObjectLikeFieldShape(mainSchema, { commonOnly: false }) ?? null;\n }, [resourceConfig]);\n\n // AUTHORED summary template — the `layout.summary` contract promises coverage\n // of \"cards, list items, FK references\". When a resource authors one, the card\n // defers its ENTIRE content region (title + body) to `ResourceSummaryDisplayer`:\n // the title is now a first-class template element (`<SummaryTitle />`, placed by\n // `<SummaryLayout>`), so a status badge can sit inline with the title and the\n // exact same composition renders in the FK popover. We pass the primary label we\n // already computed (correct `t`, junction forwardedLabel) into the displayer's\n // SummaryContext instead of rendering our own title above it.\n //\n // Resources WITHOUT an authored template keep the legacy host-owned title +\n // generic \"Label: value\" body: routing them through the GENERATED default\n // template would restyle every list in every app for no authored reason.\n const authoredSummaryTemplate = resourceConfig?.frontendConfiguration?.layout?.summary;\n\n const hoverClass = interactiveClasses?.hover ?? '';\n const transitionClass = interactiveClasses?.transition ?? '';\n // Resolve where the per-item actions sit (2-axis anchor → flex classes). The\n // content + actions share one flex container so actions never overlap text.\n const placement = resolveCardActionPlacementClasses(cardActionPlacement);\n\n // Mobile multi-select: a long-press ENTERS selection mode (selects this item);\n // while selection mode is active (`selectionActive`), a plain TAP toggles\n // selection instead of navigating. Gated to a mobile viewport — on desktop a\n // click always navigates and the checkbox is the explicit toggle. Long-press\n // is touch-only (the hook binds touch handlers).\n // Optional UIContext read: a rendering leaf shouldn't hard-require the shell's\n // UIProvider just to check the breakpoint — outside a provider (isolated\n // renders/tests) it degrades to desktop behavior (isMobile = false).\n const ui = React.useContext(UIContext);\n const isMobile = ui?.UIConfig?.currentBreakpoint === ViewportBreakpoint.MOBILE;\n const tapTogglesSelection = selectable && selectionActive && isMobile;\n // Long-press ENTERS selection mode — gated to the SAME condition as tap-toggle\n // (selectable + mobile viewport) so the two can't disagree (e.g. enter mode on\n // a tablet where tap-toggle is off, stranding the user mid-multiselect).\n const longPress = useLongPress(\n () => onToggleSelect?.(item),\n { enabled: selectable && !!onToggleSelect && isMobile },\n );\n\n /*\n * A row is INTERACTIVE when something can happen on it: the host gave it a click handler, or the\n * view is in mobile multi-select where a tap toggles selection. Everything the card says about\n * itself — the pointer, the button role, the focusability, the key handling — is read off this one\n * value, so the promise and the behaviour cannot drift apart.\n */\n const isActivatable = Boolean(onItemClick) || tapTogglesSelection;\n\n const handleActivate = () => {\n // Swallow the synthetic click that follows a long-press (it already selected).\n if (longPress.consumeLongPress()) return;\n if (tapTogglesSelection) {\n onToggleSelect?.(item);\n return;\n }\n onItemClick?.(item);\n };\n\n return (\n <div\n className={cn(\n CARD_ROW_PADDING_CLASS, transitionClass,\n // Both only when a click leads somewhere — see `isActivatable`.\n isActivatable && hoverClass,\n isActivatable && 'cursor-pointer',\n isSelected && 'bg-primary/5',\n // Prevent the browser text-selection that a long-press would start.\n selectable && 'select-none',\n className,\n )}\n onClick={isActivatable ? handleActivate : undefined}\n role={isActivatable ? 'button' : undefined}\n tabIndex={isActivatable ? 0 : undefined}\n aria-label={String(primaryLabel)}\n {...longPress.handlers}\n // Selection state is conveyed by the row's checkbox (aria-selected is not\n // valid on role=\"button\"); the bg tint is a purely visual reinforcement.\n onKeyDown={isActivatable ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (tapTogglesSelection) {\n onToggleSelect?.(item);\n } else {\n onItemClick?.(item);\n }\n }\n } : undefined}\n >\n {/* Leading selection rail (only when the view is selectable). The checkbox\n toggles selection and stops propagation so it never triggers the row's\n navigation — mirrors the table select-cell contract. */}\n <div className={CARD_SELECTION_RAIL_CLASS}>\n {/* stopPropagation on click, keydown AND touchstart: the row is a\n role=\"button\" with Enter/Space navigation and a touch long-press, so\n without these guards toggling the checkbox (tap/keyboard) would also\n navigate, and a hold over it would arm the row's long-press. */}\n {selectable && (\n <div\n // `pt-0.5` optically centres the box on the first line of text beside it; the\n // HORIZONTAL half comes from the shared constant, which the header rail also reads.\n className={cn(CARD_SELECTION_SLOT_CLASS, 'pt-0.5')}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n onTouchStart={(e) => e.stopPropagation()}\n >\n <CheckboxRoot\n checked={isSelected}\n onCheckedChange={() => onToggleSelect?.(item)}\n aria-label={selectAriaLabel ?? String(primaryLabel)}\n />\n </div>\n )}\n <div className={cn(placement.containerClass, 'min-w-0 flex-1')}>\n <div className={cn('space-y-item-xs', placement.contentClass)}>\n {authoredSummaryTemplate && resourceConfig?.mainSchema ? (\n // Authored template owns title + body. The title is fed via\n // SummaryContext (primaryLabel) and rendered by `<SummaryTitle />`\n // inside the template, so we do NOT render our own title here. The\n // region stays click-through so the whole card navigates (same as the\n // legacy body); an author who embeds a genuinely interactive control\n // stops propagation within their own template.\n <ResourceSummaryDisplayer\n resourceType={resourceType}\n schema={resourceConfig.mainSchema}\n data={item}\n primaryLabel={primaryLabel}\n />\n ) : (\n <>\n <Text as=\"p\" className=\"font-medium text-foreground\" truncate>{primaryLabel}</Text>\n {secondaryFields.map((fieldName) => {\n const value = item[fieldName];\n if (value === null || value === undefined) return null;\n return (\n <div key={fieldName}>\n <FieldValueRenderer\n fieldName={fieldName}\n value={value}\n fieldSchema={schemaShape?.[fieldName] as z.ZodTypeAny | undefined}\n fieldLabel={fieldLabelsMap[fieldName]}\n resourceType={resourceType}\n record={item as Record<string, unknown>}\n tResourceFieldEnumValue={tResourceFieldEnumValue}\n />\n </div>\n );\n })}\n </>\n )}\n </div>\n {operationsSlot && (\n // stopPropagation on click, keydown AND touchstart: an action tap or\n // keyboard activation must not also navigate the row, and a hold over\n // an action must not arm the row's long-press selection. (Mirrors the\n // checkbox rail — all three axes.)\n <div\n className={placement.actionsClass}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n onTouchStart={(e) => e.stopPropagation()}\n >\n {operationsSlot}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ResourceListItemRenderer.js","sourceRoot":"","sources":["../../../../../src/components/resources/ResourceListItemRenderer.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * ResourceListItemRenderer\n *\n * Shared item renderer for List and Search presets.\n * Encapsulates schema-aware field rendering (FK, enum, date, array),\n * primary/secondary field split, and per-item operations.\n *\n * Used by List_Default and Search_Default to ensure parity in how\n * resource items are displayed.\n */\n\nimport React, { useMemo, useCallback } from 'react';\nimport { z } from 'zod';\nimport {\n CoreResourceOperation,\n ResourceOperationDisplayMode,\n ErrorCustomMessageReference,\n} from '@wildo-ai/saas-models';\nimport type { AnyFrontendResourceConfiguration, FrontendResourcesRegistry } from '~wildo-frontend-lib/core/resources/resources.frontend.schemas';\nimport { getEnumValues, DisplayChromeMode, ViewportBreakpoint } from '@wildo-ai/zod-decorators';\nimport { UIContext } from '~wildo-frontend-lib/core/ui/UIContext';\nimport { useLongPress } from '~wildo-frontend-lib/components/resources/useLongPress';\nimport { DisplayField } from '~wildo-frontend-lib/components/data-display/DisplayField';\nimport { DisplayChromeProvider } from '~wildo-frontend-lib/components/data-display/chromes/DisplayChromeContext';\nimport { ResourceSummaryDisplayer } from '~wildo-frontend-lib/components/data-display/ResourceSummaryDisplayer';\nimport { Text } from '~wildo-frontend-lib/components/typography/text';\nimport { FrontendResourceUtils, frontendResourceUtils } from '~wildo-frontend-lib/core/resources/frontend-resource.utils';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { AutomatedLayoutFrontendUtils } from '~wildo-frontend-lib/core/automated-layout/automated-layout.frontend.utils';\nimport { resolveResourceLabelEnumSchema } from '~wildo-frontend-lib/core/resources/resource-label-field-paths.frontend.utils';\nimport type { FrontendResourceOperationContext } from '~wildo-frontend-lib/core/resources/resources.frontend.schemas';\nimport { cn } from '~wildo-frontend-lib/core/ui/cn';\nimport { CheckboxRoot } from '~wildo-frontend-lib/components/form/controls/boolean/checkbox';\nimport {\n CARD_ROW_PADDING_CLASS,\n CARD_SELECTION_RAIL_CLASS,\n CARD_SELECTION_SLOT_CLASS,\n} from '~wildo-frontend-lib/components/resources/collection-card-layout.utils';\nimport type { CardActionPlacement } from '~wildo-frontend-lib/core/resources/resources.frontend.schemas';\nimport { resolveCardActionPlacementClasses } from './card-action-placement.utils';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ResourceListItemRendererProps {\n /** The data item to render */\n item: Record<string, unknown>;\n /** Resource type */\n resourceType: string;\n /** Resource configuration */\n resourceConfig: AnyFrontendResourceConfiguration;\n /** Resource registry */\n registry: FrontendResourcesRegistry;\n /** Ordered list of summary fields to display */\n summaryFields: string[];\n /** Pre-resolved field labels (from i18n) */\n fieldLabelsMap: Record<string, string>;\n /** Function to resolve enum display values via i18n — `fieldSchema` names the enum the field declares (#966) */\n tResourceFieldEnumValue: (resourceType: string, fieldName: string, enumValue: string, fieldSchema: z.ZodTypeAny | undefined) => string;\n /**\n * What a click on the row does — and, by its ABSENCE, that a click does nothing.\n *\n * Optional since 2026-09-20, and the optionality is the point. The card used to take this\n * REQUIRED and paint itself `cursor-pointer` + `role=\"button\"` + `tabIndex={0}` unconditionally,\n * so every summary row in the product announced itself as a button. Whether the click could act\n * was decided somewhere else entirely — in the host, by whether a READ operation resolves to a\n * view — and the two were never compared. On the audit trail the answer was \"it cannot\", so the\n * row invited a click, took focus, answered Enter and Space, and did nothing at any of them.\n *\n * A host that cannot open a row now omits this, and the affordance disappears with the behaviour\n * because both are read off the same value.\n */\n onItemClick?: (item: Record<string, unknown>) => void;\n /** Optional operations component to render for this item */\n operationsSlot?: React.ReactNode;\n /**\n * Where the per-item operations sit within the card (2-axis anchor +\n * orientation). Resolved by the host from `collectionDisplayConfig.cardActionPlacement`.\n * Omitted → the default (inline-end, vertically centered, horizontal row).\n */\n cardActionPlacement?: CardActionPlacement;\n /**\n * Selection affordance. When `selectable`, a leading checkbox renders and\n * toggles selection via `onToggleSelect` (independent of the row click, which\n * still navigates). `isSelected` drives the checkbox + a selected highlight.\n */\n selectable?: boolean;\n isSelected?: boolean;\n onToggleSelect?: (item: Record<string, unknown>) => void;\n /**\n * Whether the collection is currently in SELECTION MODE (any item selected).\n * Mobile UX: a long-press enters selection mode, and while active a plain TAP\n * toggles selection instead of navigating (the \"long-press to multi-select\"\n * pattern). Gated to touch/mobile — on desktop a click always navigates and\n * the checkbox is the explicit toggle.\n */\n selectionActive?: boolean;\n /** Accessible label for the selection checkbox (host provides the i18n string). */\n selectAriaLabel?: string;\n /** Optional className for the root container */\n className?: string;\n /** Interactive CSS classes from design system (hover state, transition) */\n interactiveClasses?: {\n hover?: string;\n transition?: string;\n };\n}\n\n// =============================================================================\n// FIELD VALUE RENDERER\n// =============================================================================\n\nexport interface FieldValueRendererProps {\n fieldName: string;\n value: unknown;\n fieldSchema: z.ZodTypeAny | undefined;\n fieldLabel: string | undefined;\n resourceType: string;\n tResourceFieldEnumValue: (resourceType: string, fieldName: string, enumValue: string, fieldSchema: z.ZodTypeAny | undefined) => string;\n /**\n * The whole record this cell belongs to, forwarded to the dispatcher as `parentData`.\n *\n * Optional so a caller rendering a bare value is unaffected — but every collection caller passes\n * it, because a field frequently needs a sibling to render correctly and a cell that does not know\n * its row cannot reach one.\n */\n record?: Record<string, unknown>;\n}\n\n/**\n * Renders a single summary field VALUE through the shared decorator-driven\n * display pipeline (`DisplayField` → `DisplayValueDispatcher` → presets) — the\n * SAME path the detail/read view uses — so the FULL zod-UI display policy is\n * honored in lists/tables by default: enum → badge (+ per-value colors),\n * boolean → checkmark / yes-no, string → truncate / multiline, FK → reference,\n * date → formatted, money/bigdecimal/duration/etc.\n *\n * Previously this re-implemented a weak subset (enum-as-plain-text, naive array\n * join, `String(value)` fallback) that silently ignored every\n * `{primitive}UI().display` decorator, so listings/tables diverged from the\n * detail view (e.g. a `displayMode: BADGE` enum rendered as plain text). Routing\n * through `DisplayField` removes that divergence and the maintenance burden of a\n * parallel renderer.\n *\n * The card (\"Label:\" prefix) and the table (column header) own the label, so the\n * value is rendered under COMPACT chrome — a bare value with no framework\n * label/description wrapper. i18n enum labels are threaded explicitly via\n * `enumLabels` because there is no surrounding `DisplayTemplateContext`\n * (which is what supplies them inside `AutomaticDisplayer`).\n */\nexport function FieldValueRenderer({\n fieldName,\n value,\n fieldSchema,\n fieldLabel,\n resourceType,\n record,\n tResourceFieldEnumValue,\n}: FieldValueRendererProps): React.JSX.Element | null {\n // Build the enum value→label map from the same i18n translator the list\n // already uses, so enum badges show translated labels rather than raw enum\n // values. Hook runs unconditionally, before the null-value early return.\n //\n // The vocabulary is read off the ENUM-BEARING schema — the field, or an array's element — through the\n // resolver the detail views and the labelling planner share. Asking only \"is the field itself an enum\"\n // left every array of an enum raw in a list or a table: a member directory printed `ORG_MEMBER` while\n // the same roles read \"Organization member\" on the member's own page.\n const enumLabels = useMemo<Record<string, string> | undefined>(() => {\n const enumSchema = fieldSchema ? resolveResourceLabelEnumSchema(fieldSchema) : undefined;\n if (!enumSchema) return undefined;\n const enumValues = getEnumValues(enumSchema);\n if (enumValues.length === 0) return undefined;\n return Object.fromEntries(\n enumValues.map((enumValue) => [enumValue, tResourceFieldEnumValue(resourceType, fieldName, enumValue, fieldSchema)]),\n );\n }, [fieldSchema, resourceType, fieldName, tResourceFieldEnumValue]);\n\n if (value === null || value === undefined) return null;\n\n return (\n <div className=\"flex min-w-0 items-baseline gap-element-sm\">\n {fieldLabel && <span className=\"text-xs text-muted-foreground\">{fieldLabel}:</span>}\n {fieldSchema ? (\n // COMPACT chrome → bare value with the full decorator policy applied.\n <DisplayChromeProvider displayChromeMode={DisplayChromeMode.COMPACT}>\n <DisplayField\n name={fieldName}\n schema={fieldSchema}\n value={value}\n enumLabels={enumLabels}\n // The ROW this cell belongs to. Every other display surface hands the dispatcher its\n // record as `parentData`; a collection cell did not, so anything a field needs from its\n // siblings was unreachable from a list or a table — including a foreign key's\n // `labelFallbackField`, which is why a member directory printed raw ObjectIds.\n parentData={record}\n disableInlineEdit\n className=\"min-w-0 truncate text-sm text-muted-foreground\"\n />\n </DisplayChromeProvider>\n ) : (\n // No schema resolved for this field — `DisplayField` requires a schema,\n // so fall back to a plain string (matches the previous default branch).\n <span className=\"min-w-0 truncate text-sm text-muted-foreground\">{String(value)}</span>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\nexport function ResourceListItemRenderer({\n item,\n resourceType,\n resourceConfig,\n registry,\n summaryFields,\n fieldLabelsMap,\n tResourceFieldEnumValue,\n onItemClick,\n operationsSlot,\n cardActionPlacement,\n selectable = false,\n isSelected = false,\n onToggleSelect,\n selectionActive = false,\n selectAriaLabel,\n className,\n interactiveClasses,\n}: ResourceListItemRendererProps): React.JSX.Element {\n if (!resourceConfig?.resourceFieldIdentifier) {\n throw FrontendResourceUtils.buildConfigurationError(\n ErrorCustomMessageReference.FRONTEND_RESOURCE_FIELD_IDENTIFIER_NOT_FOUND,\n { resourceType, component: 'ResourceListItemRenderer' }\n );\n }\n const fieldIdentifier = resourceConfig.resourceFieldIdentifier as string;\n // Resolve the record's own id (`_id`), not the cross-resource field-identifier\n // name (`<resource>Id`) which is absent from a plain record — see\n // FrontendResourceUtils.getResourceObjectId.\n const itemId = FrontendResourceUtils.getResourceObjectId(item, fieldIdentifier);\n\n // Primary display: use computeFrontendResourceLabel for the primary value.\n // For a junction this resolves the server-projected instance label (e.g. a\n // `forwardedLabel` virtual field referenced by `getFrontendResourceLabel`).\n /*\n * The translator goes to the label callback. Without it `computeFrontendResourceLabel` falls back\n * to an IDENTITY `t`, so a label callback that words its row through the label tree rendered the\n * key — then its own fallback, a ref — on every card, while the same row's page header (which\n * passes `t`) read correctly (#1454: governed documents titled `document-definition:…` in lists).\n */\n const { t: tLabel, formatDate, formatDateTime } = useI18n({ resource: resourceType });\n const primaryLabel = useMemo((): string => {\n const label = FrontendResourceUtils.computeFrontendResourceLabel({\n resourceType,\n registry,\n currentObject: item,\n t: tLabel,\n formatDate,\n formatDateTime,\n });\n return String(label || item[summaryFields[0]] || `${resourceType} #${itemId}`);\n }, [item, resourceType, registry, summaryFields, itemId, tLabel, formatDate, formatDateTime]);\n\n // Secondary fields: every summary field EXCEPT the one already shown as the\n // primary label (title). The title comes from `computeFrontendResourceLabel`\n // — an arbitrary label strategy (a `string[]` join or a function), NOT\n // necessarily `summaryFields[0]`. Excluding the title positionally (`slice(1)`)\n // had two bugs: (a) it REPEATED the title when the label field wasn't first\n // (e.g. a list whose label is `name` but whose first summary field is `status`\n // → \"Name: …\" rendered under the identical title), and (b) it silently DROPPED\n // `summaryFields[0]` whenever that field wasn't the label. Excluding the title\n // by VALUE fixes both: the field whose value equals the title is the label\n // field wherever it sits, and every genuine non-label summary field is kept.\n // (The primary-scope FK is dropped upstream by\n // `ResourceLayoutUtils.detectSummaryFields`, so it never reaches here.)\n const secondaryFields = useMemo(\n () => summaryFields.filter((fieldName) => {\n const value = item[fieldName];\n if (value === null || value === undefined) return false;\n return String(value) !== primaryLabel;\n }),\n [summaryFields, item, primaryLabel],\n );\n\n // Schema shape for field type detection\n const schemaShape = useMemo(() => {\n const mainSchema = resourceConfig?.mainSchema;\n if (!mainSchema) return null;\n // Polymorphic resources feed a discriminated-union schema; resolve the union-aware field shape (else getObjectShape returns null for the union → no field labels).\n return AutomatedLayoutFrontendUtils.getObjectLikeFieldShape(mainSchema, { commonOnly: false }) ?? null;\n }, [resourceConfig]);\n\n // AUTHORED summary template — the `layout.summary` contract promises coverage\n // of \"cards, list items, FK references\". When a resource authors one, the card\n // defers its ENTIRE content region (title + body) to `ResourceSummaryDisplayer`:\n // the title is now a first-class template element (`<SummaryTitle />`, placed by\n // `<SummaryLayout>`), so a status badge can sit inline with the title and the\n // exact same composition renders in the FK popover. We pass the primary label we\n // already computed (correct `t`, junction forwardedLabel) into the displayer's\n // SummaryContext instead of rendering our own title above it.\n //\n // Resources WITHOUT an authored template keep the legacy host-owned title +\n // generic \"Label: value\" body: routing them through the GENERATED default\n // template would restyle every list in every app for no authored reason.\n const authoredSummaryTemplate = resourceConfig?.frontendConfiguration?.layout?.summary;\n\n const hoverClass = interactiveClasses?.hover ?? '';\n const transitionClass = interactiveClasses?.transition ?? '';\n // Resolve where the per-item actions sit (2-axis anchor → flex classes). The\n // content + actions share one flex container so actions never overlap text.\n const placement = resolveCardActionPlacementClasses(cardActionPlacement);\n\n // Mobile multi-select: a long-press ENTERS selection mode (selects this item);\n // while selection mode is active (`selectionActive`), a plain TAP toggles\n // selection instead of navigating. Gated to a mobile viewport — on desktop a\n // click always navigates and the checkbox is the explicit toggle. Long-press\n // is touch-only (the hook binds touch handlers).\n // Optional UIContext read: a rendering leaf shouldn't hard-require the shell's\n // UIProvider just to check the breakpoint — outside a provider (isolated\n // renders/tests) it degrades to desktop behavior (isMobile = false).\n const ui = React.useContext(UIContext);\n const isMobile = ui?.UIConfig?.currentBreakpoint === ViewportBreakpoint.MOBILE;\n const tapTogglesSelection = selectable && selectionActive && isMobile;\n // Long-press ENTERS selection mode — gated to the SAME condition as tap-toggle\n // (selectable + mobile viewport) so the two can't disagree (e.g. enter mode on\n // a tablet where tap-toggle is off, stranding the user mid-multiselect).\n const longPress = useLongPress(\n () => onToggleSelect?.(item),\n { enabled: selectable && !!onToggleSelect && isMobile },\n );\n\n /*\n * A row is INTERACTIVE when something can happen on it: the host gave it a click handler, or the\n * view is in mobile multi-select where a tap toggles selection. Everything the card says about\n * itself — the pointer, the button role, the focusability, the key handling — is read off this one\n * value, so the promise and the behaviour cannot drift apart.\n */\n const isActivatable = Boolean(onItemClick) || tapTogglesSelection;\n\n const handleActivate = () => {\n // Swallow the synthetic click that follows a long-press (it already selected).\n if (longPress.consumeLongPress()) return;\n if (tapTogglesSelection) {\n onToggleSelect?.(item);\n return;\n }\n onItemClick?.(item);\n };\n\n /*\n * ─── The card is NOT a button; its ACTIVATOR is ────────────────────────────────────────────\n *\n * The card root used to be `role=\"button\"` with `tabIndex={0}` and Enter/Space handling, and it\n * CONTAINED the row's selection checkbox and its \"More actions\" button. ARIA does not allow\n * interactive descendants inside a button, and assistive technology may flatten the whole card\n * into one control — a screen-reader user could reach \"open this record\" but not reliably\n * \"select it\" or \"its actions\". axe reported it as `nested-interactive`, serious, on every card\n * of the todos list (#1718).\n *\n * This is the settled card-with-a-primary-action shape: a real `<button>` carries the name and\n * the keyboard activation, and it is a SIBLING of the checkbox and the actions rather than their\n * container. It is laid over the whole card (`absolute inset-0`) so its focus ring outlines the\n * card and a click on empty space lands on it; the rail after it is positioned too, so it stacks\n * above and its controls stay directly clickable. The root keeps its pointer `onClick` and the\n * long-press, so a click on the card's TEXT still opens the record — pointer behaviour is\n * unchanged, and the keyboard path is now a button that needs no hand-written key handling.\n */\n return (\n <div\n className={cn(\n CARD_ROW_PADDING_CLASS, transitionClass,\n isActivatable && 'relative',\n // Both only when a click leads somewhere — see `isActivatable`.\n isActivatable && hoverClass,\n isActivatable && 'cursor-pointer',\n isSelected && 'bg-primary/5',\n // Prevent the browser text-selection that a long-press would start.\n selectable && 'select-none',\n className,\n )}\n onClick={isActivatable ? handleActivate : undefined}\n {...longPress.handlers}\n >\n {isActivatable && (\n <button\n type=\"button\"\n aria-label={String(primaryLabel)}\n // Selection state is conveyed by the row's checkbox; the bg tint is a purely visual\n // reinforcement, and `aria-pressed` would misdescribe a button that OPENS the record.\n className=\"absolute inset-0 rounded-[inherit] focus-ring-inset outline-hidden\"\n onClick={(e) => {\n // The root's own onClick would run the same activation again for this click.\n e.stopPropagation();\n handleActivate();\n }}\n />\n )}\n {/* Leading selection rail (only when the view is selectable). The checkbox\n toggles selection and stops propagation so it never triggers the row's\n navigation — mirrors the table select-cell contract. */}\n <div className={cn(CARD_SELECTION_RAIL_CLASS, isActivatable && 'relative')}>\n {/* stopPropagation on click, keydown AND touchstart: the card opens on a\n click and arms a long-press on a touch hold, so without these guards\n toggling the checkbox would also navigate, and a hold over it would arm\n the row's long-press. */}\n {selectable && (\n <div\n // `pt-0.5` optically centres the box on the first line of text beside it; the\n // HORIZONTAL half comes from the shared constant, which the header rail also reads.\n className={cn(CARD_SELECTION_SLOT_CLASS, 'pt-0.5')}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n onTouchStart={(e) => e.stopPropagation()}\n >\n <CheckboxRoot\n checked={isSelected}\n onCheckedChange={() => onToggleSelect?.(item)}\n aria-label={selectAriaLabel ?? String(primaryLabel)}\n />\n </div>\n )}\n <div className={cn(placement.containerClass, 'min-w-0 flex-1')}>\n <div className={cn('space-y-item-xs', placement.contentClass)}>\n {authoredSummaryTemplate && resourceConfig?.mainSchema ? (\n // Authored template owns title + body. The title is fed via\n // SummaryContext (primaryLabel) and rendered by `<SummaryTitle />`\n // inside the template, so we do NOT render our own title here. The\n // region stays click-through so the whole card navigates (same as the\n // legacy body); an author who embeds a genuinely interactive control\n // stops propagation within their own template.\n <ResourceSummaryDisplayer\n resourceType={resourceType}\n schema={resourceConfig.mainSchema}\n data={item}\n primaryLabel={primaryLabel}\n />\n ) : (\n <>\n <Text as=\"p\" className=\"font-medium text-foreground\" truncate>{primaryLabel}</Text>\n {secondaryFields.map((fieldName) => {\n const value = item[fieldName];\n if (value === null || value === undefined) return null;\n return (\n <div key={fieldName}>\n <FieldValueRenderer\n fieldName={fieldName}\n value={value}\n fieldSchema={schemaShape?.[fieldName] as z.ZodTypeAny | undefined}\n fieldLabel={fieldLabelsMap[fieldName]}\n resourceType={resourceType}\n record={item as Record<string, unknown>}\n tResourceFieldEnumValue={tResourceFieldEnumValue}\n />\n </div>\n );\n })}\n </>\n )}\n </div>\n {operationsSlot && (\n // stopPropagation on click, keydown AND touchstart: an action tap or\n // keyboard activation must not also navigate the row, and a hold over\n // an action must not arm the row's long-press selection. (Mirrors the\n // checkbox rail — all three axes.)\n <div\n className={placement.actionsClass}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n onTouchStart={(e) => e.stopPropagation()}\n >\n {operationsSlot}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { FrontendResourceOperationContext } from '../../core/resources/resources.frontend.schemas';
|
|
3
|
+
import type { NavigationZone } from '../../core/navigation/navigation.schemas';
|
|
4
|
+
export interface ResourceOperationActionDropdownBodyProps {
|
|
5
|
+
resourceContext: FrontendResourceOperationContext;
|
|
6
|
+
navigationZone: NavigationZone;
|
|
7
|
+
/** The value the acted-on row currently holds for the choice field, marked ✓. Absent in bulk. */
|
|
8
|
+
currentValue?: string;
|
|
9
|
+
/** Closes the anchored list — on a successful pick, and on picking the value already held. */
|
|
10
|
+
onDismiss: () => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The body of a DROPDOWN action (`ResourceOperationActionPresentation.DROPDOWN`): the operation's
|
|
14
|
+
* admissible values, anchored to its button. Picking one executes the operation with it.
|
|
15
|
+
*
|
|
16
|
+
* ## A detached host, like the popover it sits beside
|
|
17
|
+
*
|
|
18
|
+
* It is drawn inside whatever page opened it, so it establishes its OWN operation view first — the
|
|
19
|
+
* rule `ResourceOperationDetachedHost` exists for, and the reason execution here cannot run the
|
|
20
|
+
* listing's operation by accident. Execution is `useOperationDirectExecution`, the same form-less path
|
|
21
|
+
* the operation fallback uses: RMM for an update-like row action, the bulk selection merged for a
|
|
22
|
+
* bulk one, the outcome announced either way.
|
|
23
|
+
*
|
|
24
|
+
* ## Two lists, because the two domains are different things
|
|
25
|
+
*
|
|
26
|
+
* An ENUM is closed and known: every value is listed, labelled by the same `useResourceLabels` call
|
|
27
|
+
* the form makes, so the menu and the form can never disagree about a word. A REFERENCE is records on
|
|
28
|
+
* the server: the list is `useResourceSearch`, the hook behind the form's reference picker, so its
|
|
29
|
+
* scoping (tenant, M:N junction, parent context) is the picker's by construction rather than a copy.
|
|
30
|
+
*/
|
|
31
|
+
export declare function ResourceOperationActionDropdownBody({ resourceContext, navigationZone, currentValue, onDismiss, }: ResourceOperationActionDropdownBodyProps): React.JSX.Element;
|
|
32
|
+
//# sourceMappingURL=ResourceOperationActionDropdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceOperationActionDropdown.d.ts","sourceRoot":"","sources":["../../../../../src/components/resources/ResourceOperationActionDropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAM/D,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,+DAA+D,CAAC;AACtH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wDAAwD,CAAC;AA+B7F,MAAM,WAAW,wCAAwC;IACvD,eAAe,EAAE,gCAAgC,CAAC;IAClD,cAAc,EAAE,cAAc,CAAC;IAC/B,iGAAiG;IACjG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8FAA8F;IAC9F,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mCAAmC,CAAC,EAClD,eAAe,EACf,cAAc,EACd,YAAY,EACZ,SAAS,GACV,EAAE,wCAAwC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAM9D"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo } from 'react';
|
|
3
|
+
import { FrontendComponentType } from '@wildo-ai/presets-components-models';
|
|
4
|
+
import { useI18n } from '../../core/i18n/useI18n.js';
|
|
5
|
+
import { resolveComponentLabel } from '../../core/i18n/component-label-resolution.utils.js';
|
|
6
|
+
import { ResourceOperationViewProvider } from '../../core/resources/ResourceOperationViewProvider.js';
|
|
7
|
+
import { useResourceOperationViewContext } from '../../core/resources/ResourceOperationViewContext.js';
|
|
8
|
+
import { useOperationDirectExecution } from '../../core/resources/useOperationDirectExecution.js';
|
|
9
|
+
import { useResourceLabels } from '../../core/resources/useResourceLabels.js';
|
|
10
|
+
import { ResourceOperationChoiceDomain, resolveResourceOperationDropdownChoice, } from '../../core/resources/operation-semantics.frontend.utils.js';
|
|
11
|
+
import { useResourceSearch } from '../../components/resources-fields/resource-reference/useResourceSearch.js';
|
|
12
|
+
import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from '../../components/navigation/command.js';
|
|
13
|
+
import { LoadingSpinner } from '../../components/feedback/loading-spinner.js';
|
|
14
|
+
import { useIconRegistry } from '../../core/icons/useIconRegistry.js';
|
|
15
|
+
import { IconSize, StandardIconReference } from '../../core/icons/icon-registry.frontend.schemas.js';
|
|
16
|
+
import { cn } from '../../core/ui/cn.js';
|
|
17
|
+
import { getEnumValues } from '@wildo-ai/zod-decorators';
|
|
18
|
+
/**
|
|
19
|
+
* Above this many enum values the list gets a search input. Below it, typing is slower than
|
|
20
|
+
* scanning — a status menu of five does not want a text box above it.
|
|
21
|
+
*/
|
|
22
|
+
const ENUM_CHOICE_SEARCH_THRESHOLD = 7;
|
|
23
|
+
/**
|
|
24
|
+
* The body of a DROPDOWN action (`ResourceOperationActionPresentation.DROPDOWN`): the operation's
|
|
25
|
+
* admissible values, anchored to its button. Picking one executes the operation with it.
|
|
26
|
+
*
|
|
27
|
+
* ## A detached host, like the popover it sits beside
|
|
28
|
+
*
|
|
29
|
+
* It is drawn inside whatever page opened it, so it establishes its OWN operation view first — the
|
|
30
|
+
* rule `ResourceOperationDetachedHost` exists for, and the reason execution here cannot run the
|
|
31
|
+
* listing's operation by accident. Execution is `useOperationDirectExecution`, the same form-less path
|
|
32
|
+
* the operation fallback uses: RMM for an update-like row action, the bulk selection merged for a
|
|
33
|
+
* bulk one, the outcome announced either way.
|
|
34
|
+
*
|
|
35
|
+
* ## Two lists, because the two domains are different things
|
|
36
|
+
*
|
|
37
|
+
* An ENUM is closed and known: every value is listed, labelled by the same `useResourceLabels` call
|
|
38
|
+
* the form makes, so the menu and the form can never disagree about a word. A REFERENCE is records on
|
|
39
|
+
* the server: the list is `useResourceSearch`, the hook behind the form's reference picker, so its
|
|
40
|
+
* scoping (tenant, M:N junction, parent context) is the picker's by construction rather than a copy.
|
|
41
|
+
*/
|
|
42
|
+
export function ResourceOperationActionDropdownBody({ resourceContext, navigationZone, currentValue, onDismiss, }) {
|
|
43
|
+
return (_jsx(ResourceOperationViewProvider, { resourceContext: resourceContext, navigationZone: navigationZone, children: _jsx(ResourceOperationChoiceList, { currentValue: currentValue, onDismiss: onDismiss }) }));
|
|
44
|
+
}
|
|
45
|
+
function ResourceOperationChoiceList({ currentValue, onDismiss }) {
|
|
46
|
+
const { operation, resourceType } = useResourceOperationViewContext();
|
|
47
|
+
// Resource-scoped like the executor and the fallback: a resource may override the component's words.
|
|
48
|
+
const { tComponent } = useI18n({ component: FrontendComponentType.RESOURCES_LAYOUTS_ACTION, resource: resourceType });
|
|
49
|
+
const choice = useMemo(() => resolveResourceOperationDropdownChoice(operation), [operation]);
|
|
50
|
+
const { execute, isExecuting, isBootstrapping } = useOperationDirectExecution({
|
|
51
|
+
onSuccess: onDismiss,
|
|
52
|
+
errorMessage: resolveComponentLabel({
|
|
53
|
+
tComponent,
|
|
54
|
+
componentType: FrontendComponentType.RESOURCES_LAYOUTS_ACTION,
|
|
55
|
+
key: 'executionFailed',
|
|
56
|
+
}),
|
|
57
|
+
errorComponent: 'ResourceOperationActionDropdownBody',
|
|
58
|
+
});
|
|
59
|
+
const handlePick = useCallback((value) => {
|
|
60
|
+
if (!choice)
|
|
61
|
+
return;
|
|
62
|
+
// Picking what the row already holds is a no-op a person expects to simply close the menu —
|
|
63
|
+
// sending it would write an identical value and announce a change that did not happen.
|
|
64
|
+
if (value === currentValue) {
|
|
65
|
+
onDismiss();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
void execute({ [choice.fieldName]: value });
|
|
69
|
+
}, [choice, currentValue, execute, onDismiss]);
|
|
70
|
+
// The resolver only selects DROPDOWN when a choice field exists, so this is a defensive boundary:
|
|
71
|
+
// an operation reshaped under a live panel renders nothing rather than a list for a field it lost.
|
|
72
|
+
if (!choice)
|
|
73
|
+
return null;
|
|
74
|
+
const busy = isExecuting || isBootstrapping;
|
|
75
|
+
return choice.domain === ResourceOperationChoiceDomain.REFERENCE
|
|
76
|
+
? _jsx(ReferenceChoiceList, { choice: choice, currentValue: currentValue, busy: busy, onPick: handlePick })
|
|
77
|
+
: _jsx(EnumChoiceList, { choice: choice, currentValue: currentValue, busy: busy, onPick: handlePick });
|
|
78
|
+
}
|
|
79
|
+
function EnumChoiceList({ choice, currentValue, busy, onPick }) {
|
|
80
|
+
const { resourceType, operation } = useResourceOperationViewContext();
|
|
81
|
+
const { tComponent, isReady } = useI18n({ component: FrontendComponentType.LOW_LEVEL_FORM_FIELD });
|
|
82
|
+
const { enumLabels, isReady: areLabelsReady } = useResourceLabels(
|
|
83
|
+
// A choice exists only for an object request body, so this is that body.
|
|
84
|
+
operation.requestDto, { resourceType, operationId: String(operation.operationIdentifier) }, undefined, 'edit');
|
|
85
|
+
const values = useMemo(() => getEnumValues(choice.fieldSchema) ?? [], [choice.fieldSchema]);
|
|
86
|
+
const labels = enumLabels[choice.fieldName];
|
|
87
|
+
const searchable = values.length > ENUM_CHOICE_SEARCH_THRESHOLD;
|
|
88
|
+
// Nothing until the words exist: a value list drawn before its labels load shows raw wire values
|
|
89
|
+
// for a frame, which reads as the missing labels this repository refuses to invent.
|
|
90
|
+
if (isReady === false || areLabelsReady === false)
|
|
91
|
+
return _jsx(ChoiceListLoading, {});
|
|
92
|
+
return (_jsxs(Command, { shouldFilter: searchable, children: [searchable && (_jsx(CommandInput, { placeholder: tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD, 'searchPlaceholder') })), _jsxs(CommandList, { children: [_jsx(CommandEmpty, { children: tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD, 'noResults') }), _jsx(CommandGroup, { children: values.map((value) => {
|
|
93
|
+
const label = labels?.[value] ?? value;
|
|
94
|
+
return (_jsx(ChoiceItem, { value: value, label: label, isCurrent: value === currentValue, disabled: busy, onPick: onPick }, value));
|
|
95
|
+
}) })] })] }));
|
|
96
|
+
}
|
|
97
|
+
function ReferenceChoiceList({ choice, currentValue, busy, onPick }) {
|
|
98
|
+
const { tComponent, isReady } = useI18n({ component: FrontendComponentType.LOW_LEVEL_FORM_FIELD });
|
|
99
|
+
const { options, isLoading, setIsOpen, handleSearchChange, emptyMessage, fetchError } = useResourceSearch({
|
|
100
|
+
schema: choice.fieldSchema,
|
|
101
|
+
name: choice.fieldName,
|
|
102
|
+
value: currentValue,
|
|
103
|
+
});
|
|
104
|
+
// The list IS the open dropdown: it exists only while the panel is open, so it asks for its first
|
|
105
|
+
// page on mount and releases the search on unmount, exactly as the picker does on open/close.
|
|
106
|
+
useEffect(() => {
|
|
107
|
+
setIsOpen(true);
|
|
108
|
+
return () => setIsOpen(false);
|
|
109
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
110
|
+
}, []);
|
|
111
|
+
if (isReady === false)
|
|
112
|
+
return _jsx(ChoiceListLoading, {});
|
|
113
|
+
return (
|
|
114
|
+
// Server-side search: the options arriving are already the matches, so cmdk must not filter them
|
|
115
|
+
// a second time against the label it happens to hold.
|
|
116
|
+
_jsxs(Command, { shouldFilter: false, children: [_jsx(CommandInput, { placeholder: tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD, 'searchPlaceholder'), onValueChange: handleSearchChange, autoFocus: true }), _jsxs(CommandList, { children: [_jsx(CommandEmpty, { children: isLoading ? _jsx(ChoiceListLoading, {}) : (fetchError?.message ?? emptyMessage) }), _jsx(CommandGroup, { children: options.map((option) => (_jsx(ChoiceItem, { value: option.value, label: option.label, isCurrent: option.value === currentValue, disabled: busy || option.disabled === true, onPick: onPick }, option.value))) })] })] }));
|
|
117
|
+
}
|
|
118
|
+
/** The list's place while its words load — the same spinner the reference search shows. */
|
|
119
|
+
function ChoiceListLoading() {
|
|
120
|
+
return _jsx("span", { className: "flex justify-center py-element", children: _jsx(LoadingSpinner, { size: 16 }) });
|
|
121
|
+
}
|
|
122
|
+
/** One value. The ✓ column is always reserved, so labels align whether or not a row is current. */
|
|
123
|
+
function ChoiceItem({ value, label, isCurrent, disabled, onPick }) {
|
|
124
|
+
const { renderIcon } = useIconRegistry();
|
|
125
|
+
return (_jsxs(CommandItem, { value: value, keywords: [label], disabled: disabled, onSelect: () => onPick(value), "aria-current": isCurrent ? 'true' : undefined, "data-choice-value": value, children: [renderIcon(StandardIconReference.CHECK, {
|
|
126
|
+
size: IconSize.SM,
|
|
127
|
+
className: cn('me-2 shrink-0', isCurrent ? 'opacity-100' : 'opacity-0'),
|
|
128
|
+
}), _jsx("span", { className: "truncate", children: label })] }));
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=ResourceOperationActionDropdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceOperationActionDropdown.js","sourceRoot":"","sources":["../../../../../src/components/resources/ResourceOperationActionDropdown.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useMemo } from 'react';\nimport type { z } from 'zod';\n\nimport { FrontendComponentType } from '@wildo-ai/presets-components-models';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { resolveComponentLabel } from '~wildo-frontend-lib/core/i18n/component-label-resolution.utils';\nimport type { FrontendResourceOperationContext } from '~wildo-frontend-lib/core/resources/resources.frontend.schemas';\nimport type { NavigationZone } from '~wildo-frontend-lib/core/navigation/navigation.schemas';\nimport { ResourceOperationViewProvider } from '~wildo-frontend-lib/core/resources/ResourceOperationViewProvider';\nimport { useResourceOperationViewContext } from '~wildo-frontend-lib/core/resources/ResourceOperationViewContext';\nimport { useOperationDirectExecution } from '~wildo-frontend-lib/core/resources/useOperationDirectExecution';\nimport { useResourceLabels } from '~wildo-frontend-lib/core/resources/useResourceLabels';\nimport {\n ResourceOperationChoiceDomain,\n resolveResourceOperationDropdownChoice,\n type ResourceOperationDropdownChoice,\n} from '~wildo-frontend-lib/core/resources/operation-semantics.frontend.utils';\nimport { useResourceSearch } from '~wildo-frontend-lib/components/resources-fields/resource-reference/useResourceSearch';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '~wildo-frontend-lib/components/navigation/command';\nimport { LoadingSpinner } from '~wildo-frontend-lib/components/feedback/loading-spinner';\nimport { useIconRegistry } from '~wildo-frontend-lib/core/icons/useIconRegistry';\nimport { IconSize, StandardIconReference } from '~wildo-frontend-lib/core/icons/icon-registry.frontend.schemas';\nimport { cn } from '~wildo-frontend-lib/core/ui/cn';\nimport { getEnumValues } from '@wildo-ai/zod-decorators';\n\n/**\n * Above this many enum values the list gets a search input. Below it, typing is slower than\n * scanning — a status menu of five does not want a text box above it.\n */\nconst ENUM_CHOICE_SEARCH_THRESHOLD = 7;\n\nexport interface ResourceOperationActionDropdownBodyProps {\n resourceContext: FrontendResourceOperationContext;\n navigationZone: NavigationZone;\n /** The value the acted-on row currently holds for the choice field, marked ✓. Absent in bulk. */\n currentValue?: string;\n /** Closes the anchored list — on a successful pick, and on picking the value already held. */\n onDismiss: () => void;\n}\n\n/**\n * The body of a DROPDOWN action (`ResourceOperationActionPresentation.DROPDOWN`): the operation's\n * admissible values, anchored to its button. Picking one executes the operation with it.\n *\n * ## A detached host, like the popover it sits beside\n *\n * It is drawn inside whatever page opened it, so it establishes its OWN operation view first — the\n * rule `ResourceOperationDetachedHost` exists for, and the reason execution here cannot run the\n * listing's operation by accident. Execution is `useOperationDirectExecution`, the same form-less path\n * the operation fallback uses: RMM for an update-like row action, the bulk selection merged for a\n * bulk one, the outcome announced either way.\n *\n * ## Two lists, because the two domains are different things\n *\n * An ENUM is closed and known: every value is listed, labelled by the same `useResourceLabels` call\n * the form makes, so the menu and the form can never disagree about a word. A REFERENCE is records on\n * the server: the list is `useResourceSearch`, the hook behind the form's reference picker, so its\n * scoping (tenant, M:N junction, parent context) is the picker's by construction rather than a copy.\n */\nexport function ResourceOperationActionDropdownBody({\n resourceContext,\n navigationZone,\n currentValue,\n onDismiss,\n}: ResourceOperationActionDropdownBodyProps): React.JSX.Element {\n return (\n <ResourceOperationViewProvider resourceContext={resourceContext} navigationZone={navigationZone}>\n <ResourceOperationChoiceList currentValue={currentValue} onDismiss={onDismiss} />\n </ResourceOperationViewProvider>\n );\n}\n\ninterface ChoiceListProps {\n currentValue?: string;\n onDismiss: () => void;\n}\n\nfunction ResourceOperationChoiceList({ currentValue, onDismiss }: ChoiceListProps): React.JSX.Element | null {\n const { operation, resourceType } = useResourceOperationViewContext();\n // Resource-scoped like the executor and the fallback: a resource may override the component's words.\n const { tComponent } = useI18n({ component: FrontendComponentType.RESOURCES_LAYOUTS_ACTION, resource: resourceType });\n const choice = useMemo(() => resolveResourceOperationDropdownChoice(operation), [operation]);\n\n const { execute, isExecuting, isBootstrapping } = useOperationDirectExecution({\n onSuccess: onDismiss,\n errorMessage: resolveComponentLabel({\n tComponent,\n componentType: FrontendComponentType.RESOURCES_LAYOUTS_ACTION,\n key: 'executionFailed',\n }),\n errorComponent: 'ResourceOperationActionDropdownBody',\n });\n\n const handlePick = useCallback((value: string) => {\n if (!choice) return;\n // Picking what the row already holds is a no-op a person expects to simply close the menu —\n // sending it would write an identical value and announce a change that did not happen.\n if (value === currentValue) {\n onDismiss();\n return;\n }\n void execute({ [choice.fieldName]: value });\n }, [choice, currentValue, execute, onDismiss]);\n\n // The resolver only selects DROPDOWN when a choice field exists, so this is a defensive boundary:\n // an operation reshaped under a live panel renders nothing rather than a list for a field it lost.\n if (!choice) return null;\n\n const busy = isExecuting || isBootstrapping;\n return choice.domain === ResourceOperationChoiceDomain.REFERENCE\n ? <ReferenceChoiceList choice={choice} currentValue={currentValue} busy={busy} onPick={handlePick} />\n : <EnumChoiceList choice={choice} currentValue={currentValue} busy={busy} onPick={handlePick} />;\n}\n\ninterface DomainListProps {\n choice: ResourceOperationDropdownChoice;\n currentValue?: string;\n busy: boolean;\n onPick: (value: string) => void;\n}\n\nfunction EnumChoiceList({ choice, currentValue, busy, onPick }: DomainListProps): React.JSX.Element {\n const { resourceType, operation } = useResourceOperationViewContext();\n const { tComponent, isReady } = useI18n({ component: FrontendComponentType.LOW_LEVEL_FORM_FIELD });\n const { enumLabels, isReady: areLabelsReady } = useResourceLabels(\n // A choice exists only for an object request body, so this is that body.\n operation.requestDto as z.ZodTypeAny,\n { resourceType, operationId: String(operation.operationIdentifier) },\n undefined,\n 'edit',\n );\n const values = useMemo(() => getEnumValues(choice.fieldSchema) ?? [], [choice.fieldSchema]);\n const labels = enumLabels[choice.fieldName];\n const searchable = values.length > ENUM_CHOICE_SEARCH_THRESHOLD;\n\n // Nothing until the words exist: a value list drawn before its labels load shows raw wire values\n // for a frame, which reads as the missing labels this repository refuses to invent.\n if (isReady === false || areLabelsReady === false) return <ChoiceListLoading />;\n\n return (\n <Command shouldFilter={searchable}>\n {searchable && (\n <CommandInput placeholder={tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD, 'searchPlaceholder')} />\n )}\n <CommandList>\n <CommandEmpty>{tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD, 'noResults')}</CommandEmpty>\n <CommandGroup>\n {values.map((value) => {\n const label = labels?.[value] ?? value;\n return (\n <ChoiceItem\n key={value}\n value={value}\n label={label}\n isCurrent={value === currentValue}\n disabled={busy}\n onPick={onPick}\n />\n );\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n );\n}\n\nfunction ReferenceChoiceList({ choice, currentValue, busy, onPick }: DomainListProps): React.JSX.Element {\n const { tComponent, isReady } = useI18n({ component: FrontendComponentType.LOW_LEVEL_FORM_FIELD });\n const { options, isLoading, setIsOpen, handleSearchChange, emptyMessage, fetchError } = useResourceSearch({\n schema: choice.fieldSchema,\n name: choice.fieldName,\n value: currentValue,\n });\n\n // The list IS the open dropdown: it exists only while the panel is open, so it asks for its first\n // page on mount and releases the search on unmount, exactly as the picker does on open/close.\n useEffect(() => {\n setIsOpen(true);\n return () => setIsOpen(false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (isReady === false) return <ChoiceListLoading />;\n\n return (\n // Server-side search: the options arriving are already the matches, so cmdk must not filter them\n // a second time against the label it happens to hold.\n <Command shouldFilter={false}>\n <CommandInput\n placeholder={tComponent(FrontendComponentType.LOW_LEVEL_FORM_FIELD, 'searchPlaceholder')}\n onValueChange={handleSearchChange}\n autoFocus\n />\n <CommandList>\n <CommandEmpty>\n {isLoading ? <ChoiceListLoading /> : (fetchError?.message ?? emptyMessage)}\n </CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <ChoiceItem\n key={option.value}\n value={option.value}\n label={option.label}\n isCurrent={option.value === currentValue}\n disabled={busy || option.disabled === true}\n onPick={onPick}\n />\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n );\n}\n\n/** The list's place while its words load — the same spinner the reference search shows. */\nfunction ChoiceListLoading(): React.JSX.Element {\n return <span className=\"flex justify-center py-element\"><LoadingSpinner size={16} /></span>;\n}\n\ninterface ChoiceItemProps {\n value: string;\n label: string;\n isCurrent: boolean;\n disabled: boolean;\n onPick: (value: string) => void;\n}\n\n/** One value. The ✓ column is always reserved, so labels align whether or not a row is current. */\nfunction ChoiceItem({ value, label, isCurrent, disabled, onPick }: ChoiceItemProps): React.JSX.Element {\n const { renderIcon } = useIconRegistry();\n return (\n <CommandItem\n value={value}\n keywords={[label]}\n disabled={disabled}\n onSelect={() => onPick(value)}\n aria-current={isCurrent ? 'true' : undefined}\n data-choice-value={value}\n >\n {renderIcon(StandardIconReference.CHECK, {\n size: IconSize.SM,\n className: cn('me-2 shrink-0', isCurrent ? 'opacity-100' : 'opacity-0'),\n })}\n <span className=\"truncate\">{label}</span>\n </CommandItem>\n );\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a collection offers "create" — the toolbar, or the empty state — decided in ONE place.
|
|
3
|
+
*
|
|
4
|
+
* One create, one place. While the collection is genuinely EMPTY and its empty state offers the
|
|
5
|
+
* first-item action, that call to action IS the create affordance: a toolbar button beside it was the
|
|
6
|
+
* same verb twice, often under two labels ("Add draft" above, "Add note" below — measured on Wonder
|
|
7
|
+
* Todos). A NARROWED listing — an inline search, or any active filter such as a status tab or a preset
|
|
8
|
+
* pill — is not empty: it matched nothing. It shows the "no matching items" message rather than the
|
|
9
|
+
* empty state (whose "none yet" would be false), and the toolbar keeps its button.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Whether one filter value narrows the listing. Unset shapes — `undefined`, `null`, `''`, an empty array,
|
|
13
|
+
* an empty object — narrow nothing; anything else (a scalar, a picked set, a preset's relative range)
|
|
14
|
+
* does.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isActiveFilterValue(value: unknown): boolean;
|
|
17
|
+
/** Whether the listing is narrowed by a search or by any active filter. */
|
|
18
|
+
export declare function isCollectionNarrowed(args: {
|
|
19
|
+
isSearchActive: boolean;
|
|
20
|
+
filterValues: Record<string, unknown>;
|
|
21
|
+
}): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Whether the TOOLBAR shows the create action. `false` exactly when the empty state renders and visibly
|
|
24
|
+
* offers it; `hasLoadedOnce` keeps the button from blinking out during the initial fetch.
|
|
25
|
+
*/
|
|
26
|
+
export declare function toolbarOffersCreate(args: {
|
|
27
|
+
hasLoadedOnce: boolean;
|
|
28
|
+
itemCount: number;
|
|
29
|
+
isNarrowed: boolean;
|
|
30
|
+
emptyStateOffersCreate: boolean;
|
|
31
|
+
}): boolean;
|
|
32
|
+
//# sourceMappingURL=collection-create-placement.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-create-placement.utils.d.ts","sourceRoot":"","sources":["../../../../../src/components/resources/collection-create-placement.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAK3D;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IAAE,cAAc,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,OAAO,CAEtH;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,sBAAsB,EAAE,OAAO,CAAC;CACjC,GAAG,OAAO,CAGV"}
|