@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.
Files changed (777) hide show
  1. package/dist/esm/components/actions/action-bar.d.ts +15 -0
  2. package/dist/esm/components/actions/action-bar.d.ts.map +1 -1
  3. package/dist/esm/components/actions/action-bar.js +15 -0
  4. package/dist/esm/components/actions/action-bar.js.map +1 -1
  5. package/dist/esm/components/ai-elements/decision/approval.d.ts +97 -7
  6. package/dist/esm/components/ai-elements/decision/approval.d.ts.map +1 -1
  7. package/dist/esm/components/ai-elements/decision/approval.js.map +1 -1
  8. package/dist/esm/components/app/AppLayout_AuthenticatedRoute.d.ts.map +1 -1
  9. package/dist/esm/components/app/AppLayout_AuthenticatedRoute.js +8 -3
  10. package/dist/esm/components/app/AppLayout_AuthenticatedRoute.js.map +1 -1
  11. package/dist/esm/components/auth/Auth_EnrollmentRequired.d.ts.map +1 -1
  12. package/dist/esm/components/auth/Auth_EnrollmentRequired.js +5 -1
  13. package/dist/esm/components/auth/Auth_EnrollmentRequired.js.map +1 -1
  14. package/dist/esm/components/auth/Auth_Main.d.ts.map +1 -1
  15. package/dist/esm/components/auth/Auth_Main.js +1 -4
  16. package/dist/esm/components/auth/Auth_Main.js.map +1 -1
  17. package/dist/esm/components/auth/Auth_Register.d.ts.map +1 -1
  18. package/dist/esm/components/auth/Auth_Register.js +1 -3
  19. package/dist/esm/components/auth/Auth_Register.js.map +1 -1
  20. package/dist/esm/components/auth/StepUpAuthDialog.d.ts +7 -0
  21. package/dist/esm/components/auth/StepUpAuthDialog.d.ts.map +1 -1
  22. package/dist/esm/components/auth/StepUpAuthDialog.js +13 -7
  23. package/dist/esm/components/auth/StepUpAuthDialog.js.map +1 -1
  24. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.d.ts.map +1 -1
  25. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.js +32 -33
  26. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.js.map +1 -1
  27. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.d.ts.map +1 -1
  28. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.js +18 -20
  29. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.js.map +1 -1
  30. package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.d.ts.map +1 -1
  31. package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.js +2 -3
  32. package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.js.map +1 -1
  33. package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.d.ts +13 -16
  34. package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.d.ts.map +1 -1
  35. package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.js +18 -15
  36. package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.js.map +1 -1
  37. package/dist/esm/components/billing/billing-invoice-history.js +2 -2
  38. package/dist/esm/components/billing/billing-invoice-history.js.map +1 -1
  39. package/dist/esm/components/billing/billing-portal-link.js +2 -2
  40. package/dist/esm/components/billing/billing-portal-link.js.map +1 -1
  41. package/dist/esm/components/billing/billing-pricing-table.d.ts +33 -1
  42. package/dist/esm/components/billing/billing-pricing-table.d.ts.map +1 -1
  43. package/dist/esm/components/billing/billing-pricing-table.js +34 -5
  44. package/dist/esm/components/billing/billing-pricing-table.js.map +1 -1
  45. package/dist/esm/components/billing/billing-subscription-status.js +2 -2
  46. package/dist/esm/components/billing/billing-subscription-status.js.map +1 -1
  47. package/dist/esm/components/billing/billing-usage-dashboard.d.ts +2 -0
  48. package/dist/esm/components/billing/billing-usage-dashboard.d.ts.map +1 -1
  49. package/dist/esm/components/billing/billing-usage-dashboard.js +1 -0
  50. package/dist/esm/components/billing/billing-usage-dashboard.js.map +1 -1
  51. package/dist/esm/components/data-display/DisplayField.d.ts.map +1 -1
  52. package/dist/esm/components/data-display/DisplayField.js +15 -1
  53. package/dist/esm/components/data-display/DisplayField.js.map +1 -1
  54. package/dist/esm/components/data-display/DisplayFieldArray.d.ts.map +1 -1
  55. package/dist/esm/components/data-display/DisplayFieldArray.js +11 -0
  56. package/dist/esm/components/data-display/DisplayFieldArray.js.map +1 -1
  57. package/dist/esm/components/data-display/DisplayFieldEditable.d.ts.map +1 -1
  58. package/dist/esm/components/data-display/DisplayFieldEditable.js +2 -2
  59. package/dist/esm/components/data-display/DisplayFieldEditable.js.map +1 -1
  60. package/dist/esm/components/data-display/DisplayFieldEditableArray.d.ts +12 -2
  61. package/dist/esm/components/data-display/DisplayFieldEditableArray.d.ts.map +1 -1
  62. package/dist/esm/components/data-display/DisplayFieldEditableArray.js +3 -2
  63. package/dist/esm/components/data-display/DisplayFieldEditableArray.js.map +1 -1
  64. package/dist/esm/components/data-display/DisplayFieldReadOnly.d.ts.map +1 -1
  65. package/dist/esm/components/data-display/DisplayFieldReadOnly.js +2 -2
  66. package/dist/esm/components/data-display/DisplayFieldReadOnly.js.map +1 -1
  67. package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.d.ts.map +1 -1
  68. package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.js +8 -2
  69. package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.js.map +1 -1
  70. package/dist/esm/components/data-display/DisplayValueDispatcher.d.ts.map +1 -1
  71. package/dist/esm/components/data-display/DisplayValueDispatcher.js +18 -4
  72. package/dist/esm/components/data-display/DisplayValueDispatcher.js.map +1 -1
  73. package/dist/esm/components/data-display/ResourceAutomaticDisplayer.d.ts.map +1 -1
  74. package/dist/esm/components/data-display/ResourceAutomaticDisplayer.js +61 -3
  75. package/dist/esm/components/data-display/ResourceAutomaticDisplayer.js.map +1 -1
  76. package/dist/esm/components/data-display/ResourceSummaryDisplayer.d.ts +7 -5
  77. package/dist/esm/components/data-display/ResourceSummaryDisplayer.d.ts.map +1 -1
  78. package/dist/esm/components/data-display/ResourceSummaryDisplayer.js.map +1 -1
  79. package/dist/esm/components/data-display/chromes/DisplayFieldChrome.d.ts +11 -1
  80. package/dist/esm/components/data-display/chromes/DisplayFieldChrome.d.ts.map +1 -1
  81. package/dist/esm/components/data-display/chromes/DisplayFieldChrome.js +36 -11
  82. package/dist/esm/components/data-display/chromes/DisplayFieldChrome.js.map +1 -1
  83. package/dist/esm/components/data-display/display-field-resolved-props.d.ts +6 -0
  84. package/dist/esm/components/data-display/display-field-resolved-props.d.ts.map +1 -1
  85. package/dist/esm/components/data-display/display-field-resolved-props.js.map +1 -1
  86. package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.d.ts +23 -0
  87. package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.d.ts.map +1 -0
  88. package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.js +35 -0
  89. package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.js.map +1 -0
  90. package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.d.ts +47 -0
  91. package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.d.ts.map +1 -0
  92. package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.js +124 -0
  93. package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.js.map +1 -0
  94. package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.d.ts +8 -0
  95. package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.d.ts.map +1 -0
  96. package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.js +46 -0
  97. package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.js.map +1 -0
  98. package/dist/esm/components/feedback/resource-empty-state.d.ts +21 -8
  99. package/dist/esm/components/feedback/resource-empty-state.d.ts.map +1 -1
  100. package/dist/esm/components/feedback/resource-empty-state.js +56 -26
  101. package/dist/esm/components/feedback/resource-empty-state.js.map +1 -1
  102. package/dist/esm/components/flows-actors/approval.d.ts +29 -7
  103. package/dist/esm/components/flows-actors/approval.d.ts.map +1 -1
  104. package/dist/esm/components/flows-actors/approval.js +231 -101
  105. package/dist/esm/components/flows-actors/approval.js.map +1 -1
  106. package/dist/esm/components/flows-actors/approval.labels.d.ts.map +1 -1
  107. package/dist/esm/components/flows-actors/approval.labels.js +57 -0
  108. package/dist/esm/components/flows-actors/approval.labels.js.map +1 -1
  109. package/dist/esm/components/flows-actors/system-catalog.d.ts.map +1 -1
  110. package/dist/esm/components/flows-actors/system-catalog.js +4 -4
  111. package/dist/esm/components/flows-actors/system-catalog.js.map +1 -1
  112. package/dist/esm/components/flows-actors/system-catalog.labels.d.ts.map +1 -1
  113. package/dist/esm/components/flows-actors/system-catalog.labels.js +0 -5
  114. package/dist/esm/components/flows-actors/system-catalog.labels.js.map +1 -1
  115. package/dist/esm/components/form/Form.d.ts +2 -2
  116. package/dist/esm/components/form/Form.js +2 -2
  117. package/dist/esm/components/form/Form.js.map +1 -1
  118. package/dist/esm/components/form/automated/AutomatedArrayField.d.ts +28 -3
  119. package/dist/esm/components/form/automated/AutomatedArrayField.d.ts.map +1 -1
  120. package/dist/esm/components/form/automated/AutomatedArrayField.js +43 -14
  121. package/dist/esm/components/form/automated/AutomatedArrayField.js.map +1 -1
  122. package/dist/esm/components/form/automated/FormField.d.ts +3 -0
  123. package/dist/esm/components/form/automated/FormField.d.ts.map +1 -1
  124. package/dist/esm/components/form/automated/FormField.js +60 -21
  125. package/dist/esm/components/form/automated/FormField.js.map +1 -1
  126. package/dist/esm/components/form/automated/FormFieldArray.d.ts +6 -3
  127. package/dist/esm/components/form/automated/FormFieldArray.d.ts.map +1 -1
  128. package/dist/esm/components/form/automated/FormFieldArray.js +3 -2
  129. package/dist/esm/components/form/automated/FormFieldArray.js.map +1 -1
  130. package/dist/esm/components/form/automated/ResourceAutomatedForm.d.ts +5 -4
  131. package/dist/esm/components/form/automated/ResourceAutomatedForm.d.ts.map +1 -1
  132. package/dist/esm/components/form/automated/ResourceAutomatedForm.js +148 -55
  133. package/dist/esm/components/form/automated/ResourceAutomatedForm.js.map +1 -1
  134. package/dist/esm/components/form/automated/ResourceFormActionsContext.d.ts +30 -0
  135. package/dist/esm/components/form/automated/ResourceFormActionsContext.d.ts.map +1 -1
  136. package/dist/esm/components/form/automated/ResourceFormActionsContext.js +30 -1
  137. package/dist/esm/components/form/automated/ResourceFormActionsContext.js.map +1 -1
  138. package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.d.ts +79 -0
  139. package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.d.ts.map +1 -0
  140. package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.js +203 -0
  141. package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.js.map +1 -0
  142. package/dist/esm/components/form/automated/automated-form-submit.utils.d.ts +12 -0
  143. package/dist/esm/components/form/automated/automated-form-submit.utils.d.ts.map +1 -1
  144. package/dist/esm/components/form/automated/automated-form-submit.utils.js +11 -0
  145. package/dist/esm/components/form/automated/automated-form-submit.utils.js.map +1 -1
  146. package/dist/esm/components/form/chromes/FormFieldChrome.d.ts.map +1 -1
  147. package/dist/esm/components/form/chromes/FormFieldChrome.js +2 -2
  148. package/dist/esm/components/form/chromes/FormFieldChrome.js.map +1 -1
  149. package/dist/esm/components/form/combobox.d.ts +7 -0
  150. package/dist/esm/components/form/combobox.d.ts.map +1 -1
  151. package/dist/esm/components/form/combobox.js.map +1 -1
  152. package/dist/esm/components/form/controls/form-field-checkbox-group.d.ts.map +1 -1
  153. package/dist/esm/components/form/controls/form-field-checkbox-group.js +13 -0
  154. package/dist/esm/components/form/controls/form-field-checkbox-group.js.map +1 -1
  155. package/dist/esm/components/form/fields/form-field-address.d.ts +58 -0
  156. package/dist/esm/components/form/fields/form-field-address.d.ts.map +1 -1
  157. package/dist/esm/components/form/fields/form-field-address.js +34 -6
  158. package/dist/esm/components/form/fields/form-field-address.js.map +1 -1
  159. package/dist/esm/components/form/fields/form-field-address.labels.d.ts.map +1 -1
  160. package/dist/esm/components/form/fields/form-field-address.labels.js +60 -1
  161. package/dist/esm/components/form/fields/form-field-address.labels.js.map +1 -1
  162. package/dist/esm/components/form/fields/form-field-file.d.ts +0 -12
  163. package/dist/esm/components/form/fields/form-field-file.d.ts.map +1 -1
  164. package/dist/esm/components/form/fields/form-field-file.js +34 -13
  165. package/dist/esm/components/form/fields/form-field-file.js.map +1 -1
  166. package/dist/esm/components/form/fields/form-field-file.labels.d.ts.map +1 -1
  167. package/dist/esm/components/form/fields/form-field-file.labels.js +46 -0
  168. package/dist/esm/components/form/fields/form-field-file.labels.js.map +1 -1
  169. package/dist/esm/components/form/fields/form-field-string-organization-role.d.ts +73 -0
  170. package/dist/esm/components/form/fields/form-field-string-organization-role.d.ts.map +1 -0
  171. package/dist/esm/components/form/fields/form-field-string-organization-role.js +64 -0
  172. package/dist/esm/components/form/fields/form-field-string-organization-role.js.map +1 -0
  173. package/dist/esm/components/form/fields/form-field-string.d.ts.map +1 -1
  174. package/dist/esm/components/form/fields/form-field-string.js +8 -1
  175. package/dist/esm/components/form/fields/form-field-string.js.map +1 -1
  176. package/dist/esm/components/form/fields/form-field-string.labels.d.ts.map +1 -1
  177. package/dist/esm/components/form/fields/form-field-string.labels.js +4 -0
  178. package/dist/esm/components/form/fields/form-field-string.labels.js.map +1 -1
  179. package/dist/esm/components/form/validation-errors/FormErrorSummary.js +1 -1
  180. package/dist/esm/components/form/validation-errors/FormErrorSummary.js.map +1 -1
  181. package/dist/esm/components/form/validation-errors/resolver-error-nesting.d.ts +31 -0
  182. package/dist/esm/components/form/validation-errors/resolver-error-nesting.d.ts.map +1 -0
  183. package/dist/esm/components/form/validation-errors/resolver-error-nesting.js +81 -0
  184. package/dist/esm/components/form/validation-errors/resolver-error-nesting.js.map +1 -0
  185. package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.d.ts +14 -1
  186. package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.d.ts.map +1 -1
  187. package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.js +14 -0
  188. package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.js.map +1 -1
  189. package/dist/esm/components/form/validation-errors/zod-issue-resolver.d.ts +22 -0
  190. package/dist/esm/components/form/validation-errors/zod-issue-resolver.d.ts.map +1 -1
  191. package/dist/esm/components/form/validation-errors/zod-issue-resolver.js +1 -22
  192. package/dist/esm/components/form/validation-errors/zod-issue-resolver.js.map +1 -1
  193. package/dist/esm/components/layout/resizable.d.ts +11 -0
  194. package/dist/esm/components/layout/resizable.d.ts.map +1 -1
  195. package/dist/esm/components/layout/resizable.js.map +1 -1
  196. package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.d.ts +11 -1
  197. package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.d.ts.map +1 -1
  198. package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.js +15 -3
  199. package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.js.map +1 -1
  200. package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.d.ts +2 -2
  201. package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.d.ts.map +1 -1
  202. package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.js.map +1 -1
  203. package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.d.ts +2 -2
  204. package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.js +2 -2
  205. package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.js.map +1 -1
  206. package/dist/esm/components/navigation/app-level/SidebarResourceBrowser.js +18 -20
  207. package/dist/esm/components/navigation/app-level/SidebarResourceBrowser.js.map +1 -1
  208. package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.d.ts.map +1 -1
  209. package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.js +7 -1
  210. package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.js.map +1 -1
  211. package/dist/esm/components/navigation/app-level/useMenuBarBehavior.d.ts.map +1 -1
  212. package/dist/esm/components/navigation/app-level/useMenuBarBehavior.js +4 -1
  213. package/dist/esm/components/navigation/app-level/useMenuBarBehavior.js.map +1 -1
  214. package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.d.ts.map +1 -1
  215. package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.js +18 -2
  216. package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.js.map +1 -1
  217. package/dist/esm/components/navigation/app-level/useSidebarBehavior.d.ts.map +1 -1
  218. package/dist/esm/components/navigation/app-level/useSidebarBehavior.js +82 -10
  219. package/dist/esm/components/navigation/app-level/useSidebarBehavior.js.map +1 -1
  220. package/dist/esm/components/navigation/app-level/useStatusBarBehavior.d.ts +2 -2
  221. package/dist/esm/components/navigation/app-level/useStatusBarBehavior.d.ts.map +1 -1
  222. package/dist/esm/components/navigation/app-level/useStatusBarBehavior.js.map +1 -1
  223. package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.d.ts.map +1 -1
  224. package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.js +8 -1
  225. package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.js.map +1 -1
  226. package/dist/esm/components/resources/ResourceCollectionToolbar.d.ts +8 -2
  227. package/dist/esm/components/resources/ResourceCollectionToolbar.d.ts.map +1 -1
  228. package/dist/esm/components/resources/ResourceCollectionToolbar.js +6 -2
  229. package/dist/esm/components/resources/ResourceCollectionToolbar.js.map +1 -1
  230. package/dist/esm/components/resources/ResourceLayout_Breadcrumb.d.ts.map +1 -1
  231. package/dist/esm/components/resources/ResourceLayout_Breadcrumb.js +31 -16
  232. package/dist/esm/components/resources/ResourceLayout_Breadcrumb.js.map +1 -1
  233. package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.d.ts.map +1 -1
  234. package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.js +23 -8
  235. package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.js.map +1 -1
  236. package/dist/esm/components/resources/ResourceLayout_ContainerNested.js +2 -2
  237. package/dist/esm/components/resources/ResourceLayout_ContainerNested.js.map +1 -1
  238. package/dist/esm/components/resources/ResourceLayout_Header.d.ts +13 -0
  239. package/dist/esm/components/resources/ResourceLayout_Header.d.ts.map +1 -1
  240. package/dist/esm/components/resources/ResourceLayout_Header.js +55 -28
  241. package/dist/esm/components/resources/ResourceLayout_Header.js.map +1 -1
  242. package/dist/esm/components/resources/ResourceLayout_List.d.ts.map +1 -1
  243. package/dist/esm/components/resources/ResourceLayout_List.js +41 -20
  244. package/dist/esm/components/resources/ResourceLayout_List.js.map +1 -1
  245. package/dist/esm/components/resources/ResourceLayout_List.labels.d.ts.map +1 -1
  246. package/dist/esm/components/resources/ResourceLayout_List.labels.js +1 -2
  247. package/dist/esm/components/resources/ResourceLayout_List.labels.js.map +1 -1
  248. package/dist/esm/components/resources/ResourceLayout_Read.d.ts +9 -4
  249. package/dist/esm/components/resources/ResourceLayout_Read.d.ts.map +1 -1
  250. package/dist/esm/components/resources/ResourceLayout_Read.js +30 -11
  251. package/dist/esm/components/resources/ResourceLayout_Read.js.map +1 -1
  252. package/dist/esm/components/resources/ResourceLayout_ReadSummary.d.ts.map +1 -1
  253. package/dist/esm/components/resources/ResourceLayout_ReadSummary.js +4 -2
  254. package/dist/esm/components/resources/ResourceLayout_ReadSummary.js.map +1 -1
  255. package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.d.ts.map +1 -1
  256. package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.js +6 -2
  257. package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.js.map +1 -1
  258. package/dist/esm/components/resources/ResourceLayout_Search.d.ts.map +1 -1
  259. package/dist/esm/components/resources/ResourceLayout_Search.js +30 -14
  260. package/dist/esm/components/resources/ResourceLayout_Search.js.map +1 -1
  261. package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.d.ts.map +1 -1
  262. package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.js +14 -198
  263. package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.js.map +1 -1
  264. package/dist/esm/components/resources/ResourceLayout_Update.d.ts +2 -2
  265. package/dist/esm/components/resources/ResourceLayout_Update.js +2 -2
  266. package/dist/esm/components/resources/ResourceLayout_Update.js.map +1 -1
  267. package/dist/esm/components/resources/ResourceListItemRenderer.d.ts.map +1 -1
  268. package/dist/esm/components/resources/ResourceListItemRenderer.js +69 -39
  269. package/dist/esm/components/resources/ResourceListItemRenderer.js.map +1 -1
  270. package/dist/esm/components/resources/ResourceOperationActionDropdown.d.ts +32 -0
  271. package/dist/esm/components/resources/ResourceOperationActionDropdown.d.ts.map +1 -0
  272. package/dist/esm/components/resources/ResourceOperationActionDropdown.js +130 -0
  273. package/dist/esm/components/resources/ResourceOperationActionDropdown.js.map +1 -0
  274. package/dist/esm/components/resources/collection-create-placement.utils.d.ts +32 -0
  275. package/dist/esm/components/resources/collection-create-placement.utils.d.ts.map +1 -0
  276. package/dist/esm/components/resources/collection-create-placement.utils.js +37 -0
  277. package/dist/esm/components/resources/collection-create-placement.utils.js.map +1 -0
  278. package/dist/esm/components/resources/embeds/RelatedResourcePreview.d.ts.map +1 -1
  279. package/dist/esm/components/resources/embeds/RelatedResourcePreview.js +5 -1
  280. package/dist/esm/components/resources/embeds/RelatedResourcePreview.js.map +1 -1
  281. package/dist/esm/components/resources/embeds/RelatedResourceSections.d.ts +8 -1
  282. package/dist/esm/components/resources/embeds/RelatedResourceSections.d.ts.map +1 -1
  283. package/dist/esm/components/resources/embeds/RelatedResourceSections.js +49 -2
  284. package/dist/esm/components/resources/embeds/RelatedResourceSections.js.map +1 -1
  285. package/dist/esm/components/resources/embeds/ResourceEmbeds.d.ts +22 -0
  286. package/dist/esm/components/resources/embeds/ResourceEmbeds.d.ts.map +1 -1
  287. package/dist/esm/components/resources/embeds/ResourceEmbeds.js +85 -2
  288. package/dist/esm/components/resources/embeds/ResourceEmbeds.js.map +1 -1
  289. package/dist/esm/components/resources/resourceLayout.utils.d.ts +14 -0
  290. package/dist/esm/components/resources/resourceLayout.utils.d.ts.map +1 -1
  291. package/dist/esm/components/resources/resourceLayout.utils.js +22 -0
  292. package/dist/esm/components/resources/resourceLayout.utils.js.map +1 -1
  293. package/dist/esm/components/resources/skeleton/ArrayField.d.ts.map +1 -1
  294. package/dist/esm/components/resources/skeleton/ArrayField.js +3 -0
  295. package/dist/esm/components/resources/skeleton/ArrayField.js.map +1 -1
  296. package/dist/esm/components/resources/skeleton/FormLayout.d.ts.map +1 -1
  297. package/dist/esm/components/resources/skeleton/FormLayout.js +33 -1
  298. package/dist/esm/components/resources/skeleton/FormLayout.js.map +1 -1
  299. package/dist/esm/components/resources/skeleton/ObjectScope.d.ts.map +1 -1
  300. package/dist/esm/components/resources/skeleton/ObjectScope.js +3 -0
  301. package/dist/esm/components/resources/skeleton/ObjectScope.js.map +1 -1
  302. package/dist/esm/components/resources/skeleton/Section.d.ts +12 -0
  303. package/dist/esm/components/resources/skeleton/Section.d.ts.map +1 -1
  304. package/dist/esm/components/resources/skeleton/Section.js +28 -2
  305. package/dist/esm/components/resources/skeleton/Section.js.map +1 -1
  306. package/dist/esm/components/resources/skeleton/SectionFieldsContext.d.ts +70 -0
  307. package/dist/esm/components/resources/skeleton/SectionFieldsContext.d.ts.map +1 -1
  308. package/dist/esm/components/resources/skeleton/SectionFieldsContext.js +157 -1
  309. package/dist/esm/components/resources/skeleton/SectionFieldsContext.js.map +1 -1
  310. package/dist/esm/components/resources/skeleton/WizardLayout.d.ts +6 -0
  311. package/dist/esm/components/resources/skeleton/WizardLayout.d.ts.map +1 -1
  312. package/dist/esm/components/resources/skeleton/WizardLayout.js +13 -2
  313. package/dist/esm/components/resources/skeleton/WizardLayout.js.map +1 -1
  314. package/dist/esm/components/resources/skeleton/WizardStep.d.ts.map +1 -1
  315. package/dist/esm/components/resources/skeleton/WizardStep.js +2 -1
  316. package/dist/esm/components/resources/skeleton/WizardStep.js.map +1 -1
  317. package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.d.ts.map +1 -1
  318. package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.js +61 -15
  319. package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.js.map +1 -1
  320. package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.d.ts +24 -2
  321. package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.d.ts.map +1 -1
  322. package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.js +69 -1
  323. package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.js.map +1 -1
  324. package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.d.ts.map +1 -1
  325. package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.js +18 -19
  326. package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.js.map +1 -1
  327. package/dist/esm/components/sections/ContentSectionContainer.d.ts.map +1 -1
  328. package/dist/esm/components/sections/ContentSectionContainer.js +5 -4
  329. package/dist/esm/components/sections/ContentSectionContainer.js.map +1 -1
  330. package/dist/esm/components/sections/stepper.d.ts +5 -0
  331. package/dist/esm/components/sections/stepper.d.ts.map +1 -1
  332. package/dist/esm/components/sections/stepper.js.map +1 -1
  333. package/dist/esm/components/sections/surface.d.ts.map +1 -1
  334. package/dist/esm/components/sections/surface.js +12 -3
  335. package/dist/esm/components/sections/surface.js.map +1 -1
  336. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.d.ts +43 -0
  337. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.d.ts.map +1 -0
  338. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.js +129 -0
  339. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.js.map +1 -0
  340. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.d.ts +3 -0
  341. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.d.ts.map +1 -0
  342. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.js +34 -0
  343. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.js.map +1 -0
  344. package/dist/esm/components/settings/AppPage_AppearanceSettings.d.ts.map +1 -1
  345. package/dist/esm/components/settings/AppPage_AppearanceSettings.js +9 -11
  346. package/dist/esm/components/settings/AppPage_AppearanceSettings.js.map +1 -1
  347. package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.d.ts.map +1 -1
  348. package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.js +3 -2
  349. package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.js.map +1 -1
  350. package/dist/esm/components/settings/AppPage_BillingSettings.d.ts +4 -2
  351. package/dist/esm/components/settings/AppPage_BillingSettings.d.ts.map +1 -1
  352. package/dist/esm/components/settings/AppPage_BillingSettings.js +21 -3
  353. package/dist/esm/components/settings/AppPage_BillingSettings.js.map +1 -1
  354. package/dist/esm/components/settings/AppPage_BillingSettings.labels.d.ts.map +1 -1
  355. package/dist/esm/components/settings/AppPage_BillingSettings.labels.js +5 -10
  356. package/dist/esm/components/settings/AppPage_BillingSettings.labels.js.map +1 -1
  357. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.d.ts +58 -0
  358. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.d.ts.map +1 -1
  359. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.js +243 -40
  360. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.js.map +1 -1
  361. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.d.ts.map +1 -1
  362. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.js +67 -6
  363. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.js.map +1 -1
  364. package/dist/esm/components/settings/AppPage_InvitationsSettings.d.ts.map +1 -1
  365. package/dist/esm/components/settings/AppPage_InvitationsSettings.js +19 -11
  366. package/dist/esm/components/settings/AppPage_InvitationsSettings.js.map +1 -1
  367. package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.d.ts.map +1 -1
  368. package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.js +4 -2
  369. package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.js.map +1 -1
  370. package/dist/esm/components/settings/SettingsHub.d.ts.map +1 -1
  371. package/dist/esm/components/settings/SettingsHub.js +3 -0
  372. package/dist/esm/components/settings/SettingsHub.js.map +1 -1
  373. package/dist/esm/components/settings/SettingsResourceOperationPanel.d.ts.map +1 -1
  374. package/dist/esm/components/settings/SettingsResourceOperationPanel.js +16 -1
  375. package/dist/esm/components/settings/SettingsResourceOperationPanel.js.map +1 -1
  376. package/dist/esm/components/settings/useOwnerProviderConnections.d.ts +59 -0
  377. package/dist/esm/components/settings/useOwnerProviderConnections.d.ts.map +1 -0
  378. package/dist/esm/components/settings/useOwnerProviderConnections.js +136 -0
  379. package/dist/esm/components/settings/useOwnerProviderConnections.js.map +1 -0
  380. package/dist/esm/components/views/chart-view/chart-view.utils.d.ts +5 -0
  381. package/dist/esm/components/views/chart-view/chart-view.utils.d.ts.map +1 -1
  382. package/dist/esm/components/views/chart-view/chart-view.utils.js +5 -0
  383. package/dist/esm/components/views/chart-view/chart-view.utils.js.map +1 -1
  384. package/dist/esm/components/views/chart-view/useResourceChartData.d.ts +50 -0
  385. package/dist/esm/components/views/chart-view/useResourceChartData.d.ts.map +1 -0
  386. package/dist/esm/components/views/chart-view/useResourceChartData.js +72 -0
  387. package/dist/esm/components/views/chart-view/useResourceChartData.js.map +1 -0
  388. package/dist/esm/components/views/composite-view/CompositeLayout.d.ts.map +1 -1
  389. package/dist/esm/components/views/composite-view/CompositeLayout.js +2 -1
  390. package/dist/esm/components/views/composite-view/CompositeLayout.js.map +1 -1
  391. package/dist/esm/core/app-shell/AppShellBuildingBlocks.d.ts +86 -0
  392. package/dist/esm/core/app-shell/AppShellBuildingBlocks.d.ts.map +1 -0
  393. package/dist/esm/core/app-shell/AppShellBuildingBlocks.js +187 -0
  394. package/dist/esm/core/app-shell/AppShellBuildingBlocks.js.map +1 -0
  395. package/dist/esm/core/app-shell/PortalContainerContext.d.ts +5 -2
  396. package/dist/esm/core/app-shell/PortalContainerContext.d.ts.map +1 -1
  397. package/dist/esm/core/app-shell/PortalContainerContext.js +5 -2
  398. package/dist/esm/core/app-shell/PortalContainerContext.js.map +1 -1
  399. package/dist/esm/core/app-shell/app-shell.schemas.d.ts +18 -9
  400. package/dist/esm/core/app-shell/app-shell.schemas.d.ts.map +1 -1
  401. package/dist/esm/core/app-shell/app-shell.schemas.js +1 -0
  402. package/dist/esm/core/app-shell/app-shell.schemas.js.map +1 -1
  403. package/dist/esm/core/app-shell/useAppShellLayout.d.ts +10 -0
  404. package/dist/esm/core/app-shell/useAppShellLayout.d.ts.map +1 -1
  405. package/dist/esm/core/app-shell/useAppShellLayout.js +28 -5
  406. package/dist/esm/core/app-shell/useAppShellLayout.js.map +1 -1
  407. package/dist/esm/core/app-shell/usePublicShellLayout.d.ts.map +1 -1
  408. package/dist/esm/core/app-shell/usePublicShellLayout.js +38 -0
  409. package/dist/esm/core/app-shell/usePublicShellLayout.js.map +1 -1
  410. package/dist/esm/core/automated-layout/automated-layout.frontend.utils.d.ts +15 -1
  411. package/dist/esm/core/automated-layout/automated-layout.frontend.utils.d.ts.map +1 -1
  412. package/dist/esm/core/automated-layout/automated-layout.frontend.utils.js +47 -13
  413. package/dist/esm/core/automated-layout/automated-layout.frontend.utils.js.map +1 -1
  414. package/dist/esm/core/billing/BillingContext.d.ts +25 -2
  415. package/dist/esm/core/billing/BillingContext.d.ts.map +1 -1
  416. package/dist/esm/core/billing/BillingContext.js +16 -25
  417. package/dist/esm/core/billing/BillingContext.js.map +1 -1
  418. package/dist/esm/core/billing/billing-provider-display.frontend.utils.d.ts +11 -3
  419. package/dist/esm/core/billing/billing-provider-display.frontend.utils.d.ts.map +1 -1
  420. package/dist/esm/core/billing/billing-provider-display.frontend.utils.js +14 -8
  421. package/dist/esm/core/billing/billing-provider-display.frontend.utils.js.map +1 -1
  422. package/dist/esm/core/billing/useBillingPlanChange.d.ts.map +1 -1
  423. package/dist/esm/core/billing/useBillingPlanChange.js +2 -0
  424. package/dist/esm/core/billing/useBillingPlanChange.js.map +1 -1
  425. package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.d.ts.map +1 -1
  426. package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.js +1 -0
  427. package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.js.map +1 -1
  428. package/dist/esm/core/components-registry/provider-component-registry.frontend.service.d.ts +29 -229
  429. package/dist/esm/core/components-registry/provider-component-registry.frontend.service.d.ts.map +1 -1
  430. package/dist/esm/core/components-registry/provider-component-registry.frontend.service.js +29 -327
  431. package/dist/esm/core/components-registry/provider-component-registry.frontend.service.js.map +1 -1
  432. package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.d.ts +17 -27
  433. package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.d.ts.map +1 -1
  434. package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.js +28 -48
  435. package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.js.map +1 -1
  436. package/dist/esm/core/config/app-configuration-frontend.schemas.d.ts +21 -11
  437. package/dist/esm/core/config/app-configuration-frontend.schemas.d.ts.map +1 -1
  438. package/dist/esm/core/config/app-configuration-frontend.schemas.js +4 -4
  439. package/dist/esm/core/config/app-configuration-frontend.schemas.js.map +1 -1
  440. package/dist/esm/core/config/app-level-components.frontend.schemas.d.ts +17 -0
  441. package/dist/esm/core/config/app-level-components.frontend.schemas.d.ts.map +1 -1
  442. package/dist/esm/core/config/app-level-components.frontend.schemas.js +17 -0
  443. package/dist/esm/core/config/app-level-components.frontend.schemas.js.map +1 -1
  444. package/dist/esm/core/config/chart-view.frontend.schemas.d.ts +10 -10
  445. package/dist/esm/core/config/engine-settings-destinations.d.ts.map +1 -1
  446. package/dist/esm/core/config/engine-settings-destinations.js +221 -6
  447. package/dist/esm/core/config/engine-settings-destinations.js.map +1 -1
  448. package/dist/esm/core/config/launcher-items.frontend.schemas.d.ts +8 -0
  449. package/dist/esm/core/config/launcher-items.frontend.schemas.d.ts.map +1 -1
  450. package/dist/esm/core/config/launcher-items.frontend.schemas.js +1 -0
  451. package/dist/esm/core/config/launcher-items.frontend.schemas.js.map +1 -1
  452. package/dist/esm/core/config/settings-hub.frontend.schemas.d.ts +10 -1
  453. package/dist/esm/core/config/settings-hub.frontend.schemas.d.ts.map +1 -1
  454. package/dist/esm/core/config/settings-hub.frontend.schemas.js +9 -0
  455. package/dist/esm/core/config/settings-hub.frontend.schemas.js.map +1 -1
  456. package/dist/esm/core/config/verify-launcher-content.d.ts.map +1 -1
  457. package/dist/esm/core/config/verify-launcher-content.js +30 -19
  458. package/dist/esm/core/config/verify-launcher-content.js.map +1 -1
  459. package/dist/esm/core/errors/ErrorContext.d.ts.map +1 -1
  460. package/dist/esm/core/errors/ErrorContext.js +9 -1
  461. package/dist/esm/core/errors/ErrorContext.js.map +1 -1
  462. package/dist/esm/core/errors/GlobalErrorHandler.d.ts.map +1 -1
  463. package/dist/esm/core/errors/GlobalErrorHandler.js +5 -4
  464. package/dist/esm/core/errors/GlobalErrorHandler.js.map +1 -1
  465. package/dist/esm/core/errors/RouterErrorBoundary.js +1 -1
  466. package/dist/esm/core/errors/RouterErrorBoundary.js.map +1 -1
  467. package/dist/esm/core/errors/errors-builder.frontend.services.d.ts +2 -2
  468. package/dist/esm/core/errors/errors-builder.frontend.services.d.ts.map +1 -1
  469. package/dist/esm/core/errors/errors-builder.frontend.services.js +4 -4
  470. package/dist/esm/core/errors/errors-builder.frontend.services.js.map +1 -1
  471. package/dist/esm/core/errors/user-facing-error-message.frontend.utils.js +1 -1
  472. package/dist/esm/core/errors/user-facing-error-message.frontend.utils.js.map +1 -1
  473. package/dist/esm/core/events/NotificationContext.d.ts.map +1 -1
  474. package/dist/esm/core/events/NotificationContext.js +23 -5
  475. package/dist/esm/core/events/NotificationContext.js.map +1 -1
  476. package/dist/esm/core/events/events.frontend.schemas.d.ts +110 -43
  477. package/dist/esm/core/events/events.frontend.schemas.d.ts.map +1 -1
  478. package/dist/esm/core/events/events.frontend.schemas.js +89 -15
  479. package/dist/esm/core/events/events.frontend.schemas.js.map +1 -1
  480. package/dist/esm/core/execution/useExecutionParticipationRMM.d.ts +2 -0
  481. package/dist/esm/core/execution/useExecutionParticipationRMM.d.ts.map +1 -1
  482. package/dist/esm/core/execution/useExecutionParticipationRMM.js +2 -1
  483. package/dist/esm/core/execution/useExecutionParticipationRMM.js.map +1 -1
  484. package/dist/esm/core/execution/useExecutionResourceOperationSurface.d.ts +1 -1
  485. package/dist/esm/core/execution/useExecutionResourceOperationSurface.d.ts.map +1 -1
  486. package/dist/esm/core/execution/useExecutionResourceOperationSurface.js +5 -2
  487. package/dist/esm/core/execution/useExecutionResourceOperationSurface.js.map +1 -1
  488. package/dist/esm/core/external-providers/ConsentBasedProviderSdks.d.ts +63 -0
  489. package/dist/esm/core/external-providers/ConsentBasedProviderSdks.d.ts.map +1 -0
  490. package/dist/esm/core/external-providers/ConsentBasedProviderSdks.js +131 -0
  491. package/dist/esm/core/external-providers/ConsentBasedProviderSdks.js.map +1 -0
  492. package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.d.ts +61 -0
  493. package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.d.ts.map +1 -0
  494. package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.js +178 -0
  495. package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.js.map +1 -0
  496. package/dist/esm/core/external-providers/ProviderAddressLookupHost.d.ts +52 -0
  497. package/dist/esm/core/external-providers/ProviderAddressLookupHost.d.ts.map +1 -0
  498. package/dist/esm/core/external-providers/ProviderAddressLookupHost.js +144 -0
  499. package/dist/esm/core/external-providers/ProviderAddressLookupHost.js.map +1 -0
  500. package/dist/esm/core/external-providers/ProviderFilePickerHost.d.ts +22 -1
  501. package/dist/esm/core/external-providers/ProviderFilePickerHost.d.ts.map +1 -1
  502. package/dist/esm/core/external-providers/ProviderFilePickerHost.js +23 -3
  503. package/dist/esm/core/external-providers/ProviderFilePickerHost.js.map +1 -1
  504. package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.d.ts +55 -0
  505. package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.d.ts.map +1 -0
  506. package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.js +65 -0
  507. package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.js.map +1 -0
  508. package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.d.ts +63 -0
  509. package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.d.ts.map +1 -0
  510. package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.js +100 -0
  511. package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.js.map +1 -0
  512. package/dist/esm/core/flows-actors/FlowsActorsContext.d.ts +45 -7
  513. package/dist/esm/core/flows-actors/FlowsActorsContext.d.ts.map +1 -1
  514. package/dist/esm/core/flows-actors/FlowsActorsContext.js +112 -28
  515. package/dist/esm/core/flows-actors/FlowsActorsContext.js.map +1 -1
  516. package/dist/esm/core/flows-actors/usePendingDecisions.d.ts +32 -0
  517. package/dist/esm/core/flows-actors/usePendingDecisions.d.ts.map +1 -0
  518. package/dist/esm/core/flows-actors/usePendingDecisions.js +91 -0
  519. package/dist/esm/core/flows-actors/usePendingDecisions.js.map +1 -0
  520. package/dist/esm/core/guidance/GuidanceRenderer.d.ts.map +1 -1
  521. package/dist/esm/core/guidance/GuidanceRenderer.js +3 -2
  522. package/dist/esm/core/guidance/GuidanceRenderer.js.map +1 -1
  523. package/dist/esm/core/i18n/I18nContext.d.ts +22 -8
  524. package/dist/esm/core/i18n/I18nContext.d.ts.map +1 -1
  525. package/dist/esm/core/i18n/I18nContext.js +21 -9
  526. package/dist/esm/core/i18n/I18nContext.js.map +1 -1
  527. package/dist/esm/core/i18n/component-label-resolution.utils.d.ts +5 -3
  528. package/dist/esm/core/i18n/component-label-resolution.utils.d.ts.map +1 -1
  529. package/dist/esm/core/i18n/component-label-resolution.utils.js +5 -3
  530. package/dist/esm/core/i18n/component-label-resolution.utils.js.map +1 -1
  531. package/dist/esm/core/i18n/useI18n.d.ts +2 -1
  532. package/dist/esm/core/i18n/useI18n.d.ts.map +1 -1
  533. package/dist/esm/core/i18n/useI18n.js +2 -1
  534. package/dist/esm/core/i18n/useI18n.js.map +1 -1
  535. package/dist/esm/core/loading/LoadingContext.d.ts.map +1 -1
  536. package/dist/esm/core/loading/LoadingContext.js +7 -1
  537. package/dist/esm/core/loading/LoadingContext.js.map +1 -1
  538. package/dist/esm/core/loading/LoadingGate.d.ts.map +1 -1
  539. package/dist/esm/core/loading/LoadingGate.js +19 -1
  540. package/dist/esm/core/loading/LoadingGate.js.map +1 -1
  541. package/dist/esm/core/monitoring/analytics/AnalyticsContext.d.ts +15 -2
  542. package/dist/esm/core/monitoring/analytics/AnalyticsContext.d.ts.map +1 -1
  543. package/dist/esm/core/monitoring/analytics/AnalyticsContext.js +183 -20
  544. package/dist/esm/core/monitoring/analytics/AnalyticsContext.js.map +1 -1
  545. package/dist/esm/core/monitoring/analytics/AnalyticsEventBridge.js +2 -2
  546. package/dist/esm/core/monitoring/analytics/AnalyticsEventBridge.js.map +1 -1
  547. package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.d.ts +7 -15
  548. package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.d.ts.map +1 -1
  549. package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.js +8 -26
  550. package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.js.map +1 -1
  551. package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.d.ts +12 -3
  552. package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.d.ts.map +1 -1
  553. package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.js +3 -2
  554. package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.js.map +1 -1
  555. package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.d.ts +42 -0
  556. package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.d.ts.map +1 -1
  557. package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.js +89 -5
  558. package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.js.map +1 -1
  559. package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.d.ts +2 -0
  560. package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.d.ts.map +1 -1
  561. package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.js +2 -0
  562. package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.js.map +1 -1
  563. package/dist/esm/core/navigation/NavigationContentAreas.d.ts +78 -0
  564. package/dist/esm/core/navigation/NavigationContentAreas.d.ts.map +1 -1
  565. package/dist/esm/core/navigation/NavigationContentAreas.js +264 -16
  566. package/dist/esm/core/navigation/NavigationContentAreas.js.map +1 -1
  567. package/dist/esm/core/navigation/NavigationContext.d.ts +8 -0
  568. package/dist/esm/core/navigation/NavigationContext.d.ts.map +1 -1
  569. package/dist/esm/core/navigation/NavigationContext.js +137 -30
  570. package/dist/esm/core/navigation/NavigationContext.js.map +1 -1
  571. package/dist/esm/core/navigation/launcher-resolution.d.ts +2 -0
  572. package/dist/esm/core/navigation/launcher-resolution.d.ts.map +1 -1
  573. package/dist/esm/core/navigation/launcher-resolution.js +1 -0
  574. package/dist/esm/core/navigation/launcher-resolution.js.map +1 -1
  575. package/dist/esm/core/navigation/navigation-cascade.d.ts +46 -0
  576. package/dist/esm/core/navigation/navigation-cascade.d.ts.map +1 -0
  577. package/dist/esm/core/navigation/navigation-cascade.js +222 -0
  578. package/dist/esm/core/navigation/navigation-cascade.js.map +1 -0
  579. package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.d.ts.map +1 -1
  580. package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.js +21 -2
  581. package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.js.map +1 -1
  582. package/dist/esm/core/navigation/navigation-controller-internals.d.ts +71 -0
  583. package/dist/esm/core/navigation/navigation-controller-internals.d.ts.map +1 -0
  584. package/dist/esm/core/navigation/navigation-controller-internals.js +84 -0
  585. package/dist/esm/core/navigation/navigation-controller-internals.js.map +1 -0
  586. package/dist/esm/core/navigation/navigation-policy-resolver.service.d.ts +86 -2
  587. package/dist/esm/core/navigation/navigation-policy-resolver.service.d.ts.map +1 -1
  588. package/dist/esm/core/navigation/navigation-policy-resolver.service.js +242 -124
  589. package/dist/esm/core/navigation/navigation-policy-resolver.service.js.map +1 -1
  590. package/dist/esm/core/navigation/navigation.schemas.d.ts +170 -8
  591. package/dist/esm/core/navigation/navigation.schemas.d.ts.map +1 -1
  592. package/dist/esm/core/navigation/navigation.schemas.js +121 -2
  593. package/dist/esm/core/navigation/navigation.schemas.js.map +1 -1
  594. package/dist/esm/core/navigation/navigation.utils.d.ts +102 -6
  595. package/dist/esm/core/navigation/navigation.utils.d.ts.map +1 -1
  596. package/dist/esm/core/navigation/navigation.utils.js +283 -34
  597. package/dist/esm/core/navigation/navigation.utils.js.map +1 -1
  598. package/dist/esm/core/navigation/useIsStackEntryActive.d.ts +0 -10
  599. package/dist/esm/core/navigation/useIsStackEntryActive.d.ts.map +0 -1
  600. package/dist/esm/core/navigation/useIsStackEntryActive.js.map +0 -1
  601. package/dist/esm/core/navigation/useNavigationController.d.ts +28 -157
  602. package/dist/esm/core/navigation/useNavigationController.d.ts.map +1 -1
  603. package/dist/esm/core/navigation/useNavigationController.js +211 -1189
  604. package/dist/esm/core/navigation/useNavigationController.js.map +1 -1
  605. package/dist/esm/core/navigation/useNavigationRouterSync.d.ts +174 -0
  606. package/dist/esm/core/navigation/useNavigationRouterSync.d.ts.map +1 -0
  607. package/dist/esm/core/navigation/useNavigationRouterSync.js +977 -0
  608. package/dist/esm/core/navigation/useNavigationRouterSync.js.map +1 -0
  609. package/dist/esm/core/navigation/useOverlayTitle.d.ts +13 -1
  610. package/dist/esm/core/navigation/useOverlayTitle.d.ts.map +1 -1
  611. package/dist/esm/core/navigation/useOverlayTitle.js +15 -10
  612. package/dist/esm/core/navigation/useOverlayTitle.js.map +1 -1
  613. package/dist/esm/core/navigation/useResponsiveZoneMigration.d.ts +43 -0
  614. package/dist/esm/core/navigation/useResponsiveZoneMigration.d.ts.map +1 -0
  615. package/dist/esm/core/navigation/useResponsiveZoneMigration.js +44 -0
  616. package/dist/esm/core/navigation/useResponsiveZoneMigration.js.map +1 -0
  617. package/dist/esm/core/navigation/zone-collapse-migration.d.ts +83 -0
  618. package/dist/esm/core/navigation/zone-collapse-migration.d.ts.map +1 -0
  619. package/dist/esm/core/navigation/zone-collapse-migration.js +116 -0
  620. package/dist/esm/core/navigation/zone-collapse-migration.js.map +1 -0
  621. package/dist/esm/core/navigation/zone-collapse.d.ts +51 -0
  622. package/dist/esm/core/navigation/zone-collapse.d.ts.map +1 -0
  623. package/dist/esm/core/navigation/zone-collapse.js +59 -0
  624. package/dist/esm/core/navigation/zone-collapse.js.map +1 -0
  625. package/dist/esm/core/navigation/zone-emphasis.d.ts +3 -0
  626. package/dist/esm/core/navigation/zone-emphasis.d.ts.map +1 -1
  627. package/dist/esm/core/navigation/zone-emphasis.js +26 -4
  628. package/dist/esm/core/navigation/zone-emphasis.js.map +1 -1
  629. package/dist/esm/core/navigation/zone-visible-entry.d.ts +22 -0
  630. package/dist/esm/core/navigation/zone-visible-entry.d.ts.map +1 -1
  631. package/dist/esm/core/navigation/zone-visible-entry.js +25 -0
  632. package/dist/esm/core/navigation/zone-visible-entry.js.map +1 -1
  633. package/dist/esm/core/requests/websockets/WebSocketContext.d.ts.map +1 -1
  634. package/dist/esm/core/requests/websockets/WebSocketContext.js +53 -18
  635. package/dist/esm/core/requests/websockets/WebSocketContext.js.map +1 -1
  636. package/dist/esm/core/requests/websockets/WebSocketEventBridge.d.ts.map +1 -1
  637. package/dist/esm/core/requests/websockets/WebSocketEventBridge.js +3 -1
  638. package/dist/esm/core/requests/websockets/WebSocketEventBridge.js.map +1 -1
  639. package/dist/esm/core/requests/websockets/useNotificationBadges.d.ts +22 -0
  640. package/dist/esm/core/requests/websockets/useNotificationBadges.d.ts.map +1 -1
  641. package/dist/esm/core/requests/websockets/useNotificationBadges.js +72 -3
  642. package/dist/esm/core/requests/websockets/useNotificationBadges.js.map +1 -1
  643. package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.d.ts +28 -0
  644. package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.d.ts.map +1 -0
  645. package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.js +86 -0
  646. package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.js.map +1 -0
  647. package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.d.ts +38 -3
  648. package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.d.ts.map +1 -1
  649. package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.js +57 -2
  650. package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.js.map +1 -1
  651. package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.d.ts.map +1 -1
  652. package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.js +4 -2
  653. package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.js.map +1 -1
  654. package/dist/esm/core/requests/wildo-http-client.frontend.service.d.ts +30 -1
  655. package/dist/esm/core/requests/wildo-http-client.frontend.service.d.ts.map +1 -1
  656. package/dist/esm/core/requests/wildo-http-client.frontend.service.js +47 -4
  657. package/dist/esm/core/requests/wildo-http-client.frontend.service.js.map +1 -1
  658. package/dist/esm/core/resources/ResourceRegistryContext.d.ts.map +1 -1
  659. package/dist/esm/core/resources/ResourceRegistryContext.js +22 -1
  660. package/dist/esm/core/resources/ResourceRegistryContext.js.map +1 -1
  661. package/dist/esm/core/resources/context-resource-identifiers.frontend.utils.js +1 -1
  662. package/dist/esm/core/resources/context-resource-identifiers.frontend.utils.js.map +1 -1
  663. package/dist/esm/core/resources/frontend-resource.utils.d.ts +22 -1
  664. package/dist/esm/core/resources/frontend-resource.utils.d.ts.map +1 -1
  665. package/dist/esm/core/resources/frontend-resource.utils.js +25 -2
  666. package/dist/esm/core/resources/frontend-resource.utils.js.map +1 -1
  667. package/dist/esm/core/resources/operation-semantics.frontend.utils.d.ts +113 -13
  668. package/dist/esm/core/resources/operation-semantics.frontend.utils.d.ts.map +1 -1
  669. package/dist/esm/core/resources/operation-semantics.frontend.utils.js +173 -20
  670. package/dist/esm/core/resources/operation-semantics.frontend.utils.js.map +1 -1
  671. package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.d.ts +11 -0
  672. package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.d.ts.map +1 -1
  673. package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.js +7 -0
  674. package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.js.map +1 -1
  675. package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.d.ts +3 -2
  676. package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.d.ts.map +1 -1
  677. package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.js +13 -5
  678. package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.js.map +1 -1
  679. package/dist/esm/core/resources/resources-repository.frontend.service.d.ts +6 -0
  680. package/dist/esm/core/resources/resources-repository.frontend.service.d.ts.map +1 -1
  681. package/dist/esm/core/resources/resources-repository.frontend.service.js +90 -1
  682. package/dist/esm/core/resources/resources-repository.frontend.service.js.map +1 -1
  683. package/dist/esm/core/resources/resources.frontend.schemas.d.ts +139 -16
  684. package/dist/esm/core/resources/resources.frontend.schemas.d.ts.map +1 -1
  685. package/dist/esm/core/resources/resources.frontend.schemas.js +110 -11
  686. package/dist/esm/core/resources/resources.frontend.schemas.js.map +1 -1
  687. package/dist/esm/core/resources/rmm/ResourceMutationManager.d.ts.map +1 -1
  688. package/dist/esm/core/resources/rmm/ResourceMutationManager.js +3 -1
  689. package/dist/esm/core/resources/rmm/ResourceMutationManager.js.map +1 -1
  690. package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.d.ts +10 -0
  691. package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.d.ts.map +1 -1
  692. package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.js +8 -0
  693. package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.js.map +1 -1
  694. package/dist/esm/core/resources/rmm/useResourceRMM.d.ts +7 -0
  695. package/dist/esm/core/resources/rmm/useResourceRMM.d.ts.map +1 -1
  696. package/dist/esm/core/resources/rmm/useResourceRMM.js +9 -2
  697. package/dist/esm/core/resources/rmm/useResourceRMM.js.map +1 -1
  698. package/dist/esm/core/resources/useOperationDirectExecution.d.ts +59 -0
  699. package/dist/esm/core/resources/useOperationDirectExecution.d.ts.map +1 -0
  700. package/dist/esm/core/resources/useOperationDirectExecution.js +278 -0
  701. package/dist/esm/core/resources/useOperationDirectExecution.js.map +1 -0
  702. package/dist/esm/core/resources/useResourceOperationActions.d.ts +1 -1
  703. package/dist/esm/core/resources/useResourceOperationActions.d.ts.map +1 -1
  704. package/dist/esm/core/resources/useResourceOperationActions.js +69 -22
  705. package/dist/esm/core/resources/useResourceOperationActions.js.map +1 -1
  706. package/dist/esm/core/resources/useResourceOperationSurface.d.ts +8 -6
  707. package/dist/esm/core/resources/useResourceOperationSurface.d.ts.map +1 -1
  708. package/dist/esm/core/resources/useResourceOperationSurface.js +3 -2
  709. package/dist/esm/core/resources/useResourceOperationSurface.js.map +1 -1
  710. package/dist/esm/core/runtime/AppRouter.d.ts.map +1 -1
  711. package/dist/esm/core/runtime/AppRouter.js +23 -2
  712. package/dist/esm/core/runtime/AppRouter.js.map +1 -1
  713. package/dist/esm/core/runtime/ApplicationContext.shared.d.ts +4 -2
  714. package/dist/esm/core/runtime/ApplicationContext.shared.d.ts.map +1 -1
  715. package/dist/esm/core/runtime/ApplicationContext.shared.js.map +1 -1
  716. package/dist/esm/core/runtime/ApplicationMainContext.d.ts +12 -2
  717. package/dist/esm/core/runtime/ApplicationMainContext.d.ts.map +1 -1
  718. package/dist/esm/core/runtime/ApplicationMainContext.js +5 -2
  719. package/dist/esm/core/runtime/ApplicationMainContext.js.map +1 -1
  720. package/dist/esm/core/runtime/domain-module.frontend.definitions.d.ts +25 -1
  721. package/dist/esm/core/runtime/domain-module.frontend.definitions.d.ts.map +1 -1
  722. package/dist/esm/core/runtime/domain-module.frontend.definitions.js +37 -1
  723. package/dist/esm/core/runtime/domain-module.frontend.definitions.js.map +1 -1
  724. package/dist/esm/core/runtime/start-application.frontend.service.d.ts +21 -2
  725. package/dist/esm/core/runtime/start-application.frontend.service.d.ts.map +1 -1
  726. package/dist/esm/core/runtime/start-application.frontend.service.js +51 -4
  727. package/dist/esm/core/runtime/start-application.frontend.service.js.map +1 -1
  728. package/dist/esm/core/security/AuthSessionContext.d.ts +11 -0
  729. package/dist/esm/core/security/AuthSessionContext.d.ts.map +1 -1
  730. package/dist/esm/core/security/AuthSessionContext.js +70 -22
  731. package/dist/esm/core/security/AuthSessionContext.js.map +1 -1
  732. package/dist/esm/core/security/StepUpAuthContext.d.ts.map +1 -1
  733. package/dist/esm/core/security/StepUpAuthContext.js +10 -2
  734. package/dist/esm/core/security/StepUpAuthContext.js.map +1 -1
  735. package/dist/esm/core/security/UserOrgsContext.d.ts.map +1 -1
  736. package/dist/esm/core/security/UserOrgsContext.js +72 -8
  737. package/dist/esm/core/security/UserOrgsContext.js.map +1 -1
  738. package/dist/esm/core/security/route-organization-access.frontend.utils.d.ts +7 -0
  739. package/dist/esm/core/security/route-organization-access.frontend.utils.d.ts.map +1 -1
  740. package/dist/esm/core/security/route-organization-access.frontend.utils.js +8 -2
  741. package/dist/esm/core/security/route-organization-access.frontend.utils.js.map +1 -1
  742. package/dist/esm/core/security/useGrantedConsentPurposes.d.ts +30 -0
  743. package/dist/esm/core/security/useGrantedConsentPurposes.d.ts.map +1 -0
  744. package/dist/esm/core/security/useGrantedConsentPurposes.js +38 -0
  745. package/dist/esm/core/security/useGrantedConsentPurposes.js.map +1 -0
  746. package/dist/esm/core/ui/UIContext.d.ts.map +1 -1
  747. package/dist/esm/core/ui/UIContext.js +10 -6
  748. package/dist/esm/core/ui/UIContext.js.map +1 -1
  749. package/dist/esm/core/ui/color-conversion.utils.d.ts +20 -0
  750. package/dist/esm/core/ui/color-conversion.utils.d.ts.map +1 -1
  751. package/dist/esm/core/ui/color-conversion.utils.js +39 -5
  752. package/dist/esm/core/ui/color-conversion.utils.js.map +1 -1
  753. package/dist/esm/core/ui/themes/default.theme.d.ts.map +1 -1
  754. package/dist/esm/core/ui/themes/default.theme.js +22 -2
  755. package/dist/esm/core/ui/themes/default.theme.js.map +1 -1
  756. package/dist/esm/core/ui/ui.frontend.schemas.d.ts +6 -6
  757. package/dist/esm/core/ui/ui.frontend.schemas.d.ts.map +1 -1
  758. package/dist/esm/core/ui/ui.frontend.schemas.js +3 -3
  759. package/dist/esm/core/ui/ui.frontend.schemas.js.map +1 -1
  760. package/dist/esm/index.d.ts +10 -1
  761. package/dist/esm/index.d.ts.map +1 -1
  762. package/dist/esm/index.js +19 -1
  763. package/dist/esm/index.js.map +1 -1
  764. package/dist/esm/testing/app-shell-placement-coverage.d.ts +43 -0
  765. package/dist/esm/testing/app-shell-placement-coverage.d.ts.map +1 -0
  766. package/dist/esm/testing/app-shell-placement-coverage.js +114 -0
  767. package/dist/esm/testing/app-shell-placement-coverage.js.map +1 -0
  768. package/dist/esm/testing/mock-builders.d.ts.map +1 -1
  769. package/dist/esm/testing/mock-builders.js +5 -0
  770. package/dist/esm/testing/mock-builders.js.map +1 -1
  771. package/dist/esm/testing.d.ts +1 -0
  772. package/dist/esm/testing.d.ts.map +1 -1
  773. package/dist/esm/testing.js +1 -0
  774. package/dist/esm/testing.js.map +1 -1
  775. package/package.json +9 -7
  776. package/dist/esm/core/navigation/useIsStackEntryActive.js +0 -15
  777. package/dist/tsconfig.build.tsbuildinfo +0 -1
@@ -22,7 +22,7 @@ import { ApplicationLevelComponentType } from '../../../core/config/app-level-co
22
22
  import { ScopeUtilsService } from '../../../core/scope/scope.utils.frontend.service.js';
23
23
  import { useAppScopeSafe } from '../../../core/scope/useAppScope.js';
24
24
  import { useResourceRegistry } from '../../../core/resources/useResourceRegistry.js';
25
- import { frontendResourceUtils } from '../../../core/resources/frontend-resource.utils.js';
25
+ import { frontendResourceUtils, FrontendResourceUtils } from '../../../core/resources/frontend-resource.utils.js';
26
26
  import { FrontendComponentType } from '@wildo-ai/presets-components-models';
27
27
  import { useI18n } from '../../../core/i18n/useI18n.js';
28
28
  import { resolveResourceHeaderLabel } from '../../../core/i18n/component-label-resolution.utils.js';
@@ -74,7 +74,7 @@ export const SidebarResourceBrowser = ({ resourceType, operation, operationVaria
74
74
  const { registry, doOperation } = useResourceRegistry();
75
75
  const { navigateToResource } = useNavigationController();
76
76
  const appScope = useAppScopeSafe();
77
- const { tResourceHeader, tResourceEmptyState, t, tComponent } = useI18n({ resource: resourceType, component: SIDEBAR_RESOURCE_BROWSER_LABEL_COMPONENTS });
77
+ const { tResourceHeader, tResourceEmptyState, t, tComponent, formatDate, formatDateTime } = useI18n({ resource: resourceType, component: SIDEBAR_RESOURCE_BROWSER_LABEL_COMPONENTS });
78
78
  // Stable identity, so the fetch effect below may call it without listing it.
79
79
  const toUserFacingErrorMessage = useUserFacingErrorMessage();
80
80
  const { renderIcon } = useIconRegistry();
@@ -238,25 +238,23 @@ export const SidebarResourceBrowser = ({ resourceType, operation, operationVaria
238
238
  navigateToResource,
239
239
  boundOperation,
240
240
  ]);
241
+ /*
242
+ * A record's name through the ONE shared resolver, like every other surface that names a record (#1851). This
243
+ * browser used to call the label callback itself with only `currentObject`, so a callback reading `t`, a date
244
+ * formatter or the resource type threw, and the catch fell back to `name`/`title`/`id` — a product showed its id
245
+ * here while its list row showed its word. The shared resolver's own fallback is the record's declared summary
246
+ * fields, then its id.
247
+ */
241
248
  const getInstanceLabel = useCallback((instance) => {
242
- const labelConfig = resourceConfig?.frontendConfiguration?.getFrontendResourceLabel;
243
- if (labelConfig) {
244
- try {
245
- if (typeof labelConfig === 'function') {
246
- return labelConfig({ currentObject: instance }) ?? String(instance.name ?? instance.title ?? instance.id ?? '');
247
- }
248
- if (Array.isArray(labelConfig)) {
249
- const parts = labelConfig.map(field => String(instance[field] ?? '')).filter(Boolean);
250
- if (parts.length > 0)
251
- return parts.join(' ');
252
- }
253
- }
254
- catch {
255
- // fallback
256
- }
257
- }
258
- return String(instance.name ?? instance.title ?? instance.id ?? '');
259
- }, [resourceConfig]);
249
+ return FrontendResourceUtils.computeFrontendResourceLabel({
250
+ resourceType,
251
+ registry,
252
+ currentObject: instance,
253
+ t,
254
+ formatDate,
255
+ formatDateTime,
256
+ }) ?? String(instance._id ?? '');
257
+ }, [resourceType, registry, t, formatDate, formatDateTime]);
260
258
  const resourceIcon = useMemo(() => {
261
259
  return renderIcon({ category: IconCategory.RESOURCES, resourceType }, { size: IconSize.SM });
262
260
  }, [renderIcon, resourceType]);
@@ -1 +1 @@
1
- {"version":3,"file":"SidebarResourceBrowser.js","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/SidebarResourceBrowser.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * SidebarResourceBrowser — renders a filterable list of resource instances\n * inside a sidebar section.\n *\n * Uses `useResourceRegistry()` → `doOperation()` for data fetching, following\n * the same pattern as `ResourceLayout_List.tsx`. The bound operation defaults\n * to `CoreResourceOperation.LIST` unless overridden in the section config.\n *\n * Features:\n * - Fetches instances via `doOperation` with scope-aware `contextualParameters`\n * - Applies `instanceFilter` (client-side predicate) after fetching\n * - `onInstanceClick` callback (default: navigate to instance)\n * - Lightweight rendering for always-visible sidebar\n *\n * @see launcher-operation-binding-analysis.md §3.3.6\n * @see app-shell-implementation-plan.md Step 7b\n */\n\nimport React, { useEffect, useState, useRef, useCallback, useMemo } from 'react';\n\nimport {\n CoreResourceOperation,\n ResourcesConfig_OperationPathUtils,\n} from '@wildo-ai/saas-models';\n\nimport { ApplicationLevelComponentType } from '~wildo-frontend-lib/core/config/app-level-components.frontend.schemas';\nimport { ScopeUtilsService } from '~wildo-frontend-lib/core/scope/scope.utils.frontend.service';\nimport { useAppScopeSafe } from '~wildo-frontend-lib/core/scope/useAppScope';\nimport { useResourceRegistry } from '~wildo-frontend-lib/core/resources/useResourceRegistry';\nimport { frontendResourceUtils } from '~wildo-frontend-lib/core/resources/frontend-resource.utils';\nimport { FrontendComponentType } from '@wildo-ai/presets-components-models';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { resolveResourceHeaderLabel } from '~wildo-frontend-lib/core/i18n/component-label-resolution.utils';\nimport { resolveSidebarBrowserEmptyLabel } from '~wildo-frontend-lib/components/navigation/app-level/sidebar-resource-browser-empty-label';\nimport { useIconRegistry } from '~wildo-frontend-lib/core/icons/useIconRegistry';\nimport { NavigationUtils } from '~wildo-frontend-lib/core/navigation/navigation.utils';\nimport { useNavigationController } from '~wildo-frontend-lib/core/navigation/useNavigationController';\nimport { IconCategory, IconSize } from '~wildo-frontend-lib/core/icons/icon-registry.frontend.schemas';\nimport { LoggerFrontendService } from '~wildo-frontend-lib/core/monitoring/logger.frontend.service';\nimport { useUserFacingErrorMessage } from '~wildo-frontend-lib/core/errors/useUserFacingErrorMessage';\nimport type { ResourceBrowserClickContext } from '~wildo-frontend-lib/core/config/launcher-items.frontend.schemas';\nimport type { AnyFrontendResourceConfiguration, FrontendResourceConfiguration_Operation } from '~wildo-frontend-lib/core/resources/resources.frontend.schemas';\nimport { LoadingGate } from '~wildo-frontend-lib/core/loading/LoadingGate';\nimport { buildResourceLoadingScope } from '~wildo-frontend-lib/core/loading/loading-scope.frontend.utils';\nimport type { LoadingScope } from '~wildo-frontend-lib/core/loading/loading-types.frontend.schemas';\n\nconst logger: LoggerFrontendService = LoggerFrontendService.getLogger();\nconst logDebug: (message: string, context?: Record<string, unknown>) => void = logger.debugByType('sidebar-resource-browser');\nlogger.setDebugTypeLogging('sidebar-resource-browser', false);\n\nfunction resolveOperation(\n resourceConfig: AnyFrontendResourceConfiguration,\n operationIdentifier: string,\n variantKey?: string,\n): FrontendResourceConfiguration_Operation<any, any, any> | undefined {\n const matchingOperations = resourceConfig.operations.filter(\n (operation: FrontendResourceConfiguration_Operation<any, any, any>) => (\n operation.operationIdentifier === operationIdentifier\n && (variantKey === undefined || operation.variantKey === variantKey)\n ),\n );\n\n if (matchingOperations.length === 1) {\n return matchingOperations[0];\n }\n\n const defaultNonBulkOperations = matchingOperations.filter(\n (operation) => operation.isOperationDefault === true && operation.isBulkOperation !== true,\n );\n if (variantKey === undefined && defaultNonBulkOperations.length === 1) {\n return defaultNonBulkOperations[0];\n }\n\n logDebug('Unable to resolve sidebar resource operation unambiguously', {\n resourceType: resourceConfig.resourceIdentifier,\n operationIdentifier,\n variantKey,\n candidates: matchingOperations.map((candidate) => ({\n variantType: candidate.variantType,\n variantKey: candidate.variantKey,\n isOperationDefault: candidate.isOperationDefault,\n isBulkOperation: candidate.isBulkOperation,\n })),\n });\n return undefined;\n}\n\n/** Both bundles this browser reads: its own words, and the generic list's `noItems` empty-state default. */\nconst SIDEBAR_RESOURCE_BROWSER_LABEL_COMPONENTS = [\n FrontendComponentType.APPLICATION_LEVEL_SIDEBAR,\n FrontendComponentType.RESOURCES_LAYOUTS_LIST,\n];\n\nexport interface SidebarResourceBrowserProps {\n resourceType: string;\n operation?: string;\n operationVariant?: string;\n navigateOperation?: string;\n navigateOperationVariant?: string;\n instanceFilter?: (instance: Record<string, unknown>) => boolean;\n onInstanceClick?: (context: ResourceBrowserClickContext) => void;\n isCollapsed?: boolean;\n}\n\n/**\n * Sidebar resource browser — fetches and displays a lightweight list\n * of resource instances for browsing within the sidebar.\n */\nexport const SidebarResourceBrowser: React.FC<SidebarResourceBrowserProps> = ({\n resourceType,\n operation,\n operationVariant,\n navigateOperation,\n navigateOperationVariant,\n instanceFilter,\n onInstanceClick,\n isCollapsed = false,\n}) => {\n const { registry, doOperation } = useResourceRegistry();\n const { navigateToResource } = useNavigationController();\n const appScope = useAppScopeSafe();\n const { tResourceHeader, tResourceEmptyState, t, tComponent } = useI18n({ resource: resourceType, component: SIDEBAR_RESOURCE_BROWSER_LABEL_COMPONENTS });\n // Stable identity, so the fetch effect below may call it without listing it.\n const toUserFacingErrorMessage = useUserFacingErrorMessage();\n const { renderIcon } = useIconRegistry();\n\n const [instances, setInstances] = useState<Record<string, unknown>[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n // A configuration problem, not a caught error: its words are a label, resolved at render.\n const [operationUnresolvable, setOperationUnresolvable] = useState(false);\n\n const doOperationRef = useRef(doOperation);\n doOperationRef.current = doOperation;\n\n const resourceConfig: AnyFrontendResourceConfiguration | undefined = registry.resourceConfigurations[resourceType];\n\n const boundOperation: FrontendResourceConfiguration_Operation<any, any, any> | undefined = useMemo(() => {\n if (!resourceConfig) return undefined;\n return resolveOperation(resourceConfig, operation ?? CoreResourceOperation.LIST, operationVariant);\n }, [resourceConfig, operation, operationVariant]);\n\n const navigationOperationResolved: FrontendResourceConfiguration_Operation<any, any, any> | undefined = useMemo(() => {\n if (!resourceConfig) return undefined;\n\n if (navigateOperation) {\n return resolveOperation(resourceConfig, navigateOperation, navigateOperationVariant);\n }\n\n if (operation && operation !== CoreResourceOperation.LIST) {\n return resolveOperation(resourceConfig, operation, operationVariant);\n }\n\n return (\n resolveOperation(resourceConfig, CoreResourceOperation.READ) ??\n boundOperation\n );\n }, [resourceConfig, navigateOperation, navigateOperationVariant, operation, operationVariant, boundOperation]);\n\n const scopedContextIdentifiers = useMemo((): Record<string, string> => {\n if (!resourceConfig) return {};\n\n const primaryScopeInitiatorIds = ScopeUtilsService.buildInitiatorIds({\n userId: appScope?.currentUserId,\n organizationId: appScope?.currentOrganizationId,\n applicationId: appScope?.currentApplicationId,\n anonymousUserId: appScope?.currentAnonymousUserId,\n });\n\n return {\n ...ScopeUtilsService.primaryScopeToContextIdentifiers(\n primaryScopeInitiatorIds,\n resourceConfig.resourcePrimaryScope,\n ),\n ...(appScope?.buildContextResourceIdentifiers() ?? {}),\n };\n }, [\n resourceConfig,\n appScope?.currentUserId,\n appScope?.currentOrganizationId,\n appScope?.currentApplicationId,\n appScope?.currentAnonymousUserId,\n appScope,\n ]);\n\n const operationPathKey = useMemo(() => {\n if (!boundOperation) return null;\n return ResourcesConfig_OperationPathUtils.createOperationPathKeyFromOperation(boundOperation);\n }, [boundOperation]);\n\n useEffect(() => {\n setOperationUnresolvable(Boolean(resourceConfig) && !operationPathKey);\n if (!operationPathKey || !resourceConfig) {\n setInstances([]);\n if (resourceConfig && !operationPathKey) {\n const message = `Sidebar resource browser cannot resolve operation \"${operation ?? CoreResourceOperation.LIST}\" on resource \"${resourceType}\".`;\n setError(null);\n logger.warn(message, {\n resourceType,\n operationIdentifier: operation ?? CoreResourceOperation.LIST,\n operationVariant,\n });\n } else {\n if (!resourceConfig) {\n // The person reads the `resourceBrowserUnavailable` label; the identifier belongs in the log.\n logger.warn(`Sidebar resource browser: resource type \"${resourceType}\" is not registered.`, { resourceType });\n }\n setError(null);\n }\n setIsLoading(false);\n return;\n }\n\n let cancelled = false;\n\n const fetchInstances = async () => {\n setIsLoading(true);\n setError(null);\n try {\n logDebug('Fetching resource instances', { resourceType, operationPathKey });\n const result = await doOperationRef.current(operationPathKey, {\n contextualParameters: scopedContextIdentifiers,\n queryParameters: { limit: 100 },\n });\n\n if (cancelled) return;\n\n const items = Array.isArray(result) ? result : (result as any)?.data ?? [];\n setInstances(items as Record<string, unknown>[]);\n logDebug('Fetched instances', { count: items.length });\n } catch (err) {\n if (cancelled) return;\n // Rendered to the person, so resolved to localized text — `extractErrorInfo(err).message` was the\n // backend's i18n REFERENCE (#1160).\n setError(toUserFacingErrorMessage(err));\n logger.error('SidebarResourceBrowser fetch failed', { resourceType, error: err });\n } finally {\n if (!cancelled) setIsLoading(false);\n }\n };\n\n fetchInstances();\n return () => { cancelled = true; };\n }, [operationPathKey, resourceType, resourceConfig, scopedContextIdentifiers, operation, operationVariant]);\n\n const filteredInstances = useMemo(() => {\n if (!instanceFilter) return instances;\n return instances.filter(instanceFilter);\n }, [instances, instanceFilter]);\n const resourceListAriaLabel = useMemo(\n () => resolveResourceHeaderLabel({\n tResourceHeader,\n resourceType,\n key: 'title',\n }),\n [resourceType, tResourceHeader],\n );\n\n const handleInstanceClick = useCallback((instance: Record<string, unknown>) => {\n const instanceId = (instance.id ?? instance._id ?? '') as string;\n\n if (onInstanceClick) {\n onInstanceClick({\n resourceType,\n instanceId,\n instanceData: instance,\n });\n return;\n }\n\n if (resourceConfig && navigationOperationResolved) {\n const contextIdentifiers: Record<string, string> = {\n ...scopedContextIdentifiers,\n [resourceType]: instanceId,\n };\n const parentResourcesRequirements = frontendResourceUtils.buildParentResourcesRequirements(\n resourceType as any,\n contextIdentifiers,\n registry,\n );\n\n const resourceContext = frontendResourceUtils.createFrontendResourceOperationContextFromOperation({\n resourceType: resourceType as any,\n operation: navigationOperationResolved,\n contextResourceIdentifiers: contextIdentifiers,\n parentResourcesRequirements,\n });\n navigateToResource(\n resourceContext,\n NavigationUtils.createAppLevelInitiator(ApplicationLevelComponentType.SIDEBAR),\n );\n return;\n }\n\n logger.warn('SidebarResourceBrowser navigation skipped: no navigation operation resolved', {\n resourceType,\n fetchOperationIdentifier: boundOperation?.operationIdentifier,\n navigationOperationIdentifier: navigateOperation ?? CoreResourceOperation.READ,\n navigationOperationVariant: navigateOperationVariant,\n instanceId,\n });\n }, [\n resourceType,\n onInstanceClick,\n resourceConfig,\n navigationOperationResolved,\n navigateOperation,\n navigateOperationVariant,\n scopedContextIdentifiers,\n registry,\n navigateToResource,\n boundOperation,\n ]);\n\n const getInstanceLabel = useCallback((instance: Record<string, unknown>): string => {\n const labelConfig = resourceConfig?.frontendConfiguration?.getFrontendResourceLabel;\n if (labelConfig) {\n try {\n if (typeof labelConfig === 'function') {\n return labelConfig({ currentObject: instance } as any) ?? String(instance.name ?? instance.title ?? instance.id ?? '');\n }\n if (Array.isArray(labelConfig)) {\n const parts = labelConfig.map(field => String(instance[field] ?? '')).filter(Boolean);\n if (parts.length > 0) return parts.join(' ');\n }\n } catch {\n // fallback\n }\n }\n return String(instance.name ?? instance.title ?? instance.id ?? '');\n }, [resourceConfig]);\n\n const resourceIcon = useMemo(() => {\n return renderIcon(\n { category: IconCategory.RESOURCES, resourceType },\n { size: IconSize.SM },\n );\n }, [renderIcon, resourceType]);\n\n const loadingScopes = useMemo<LoadingScope[]>(() => {\n if (!boundOperation) return [];\n return [\n buildResourceLoadingScope({\n resourceType,\n operation: boundOperation.operationIdentifier,\n }),\n ];\n }, [resourceType, boundOperation]);\n\n const i18nKeys = useMemo(() => [`resources.${resourceType}`], [resourceType]);\n\n const renderSidebarSkeleton = useCallback(() => (\n <div className=\"px-card-sm py-item-xs space-y-item-xs\" role=\"status\" aria-live=\"polite\">\n {[1, 2, 3].map(i => (\n <div key={i} className=\"animate-pulse motion-reduce:animate-none h-7 bg-surface-sunken-accent rounded\" aria-hidden=\"true\" />\n ))}\n </div>\n ), []);\n\n if (!resourceConfig) {\n return (\n <div className=\"px-card-sm py-item-xs text-xs text-destructive\">\n {tComponent(FrontendComponentType.APPLICATION_LEVEL_SIDEBAR, 'resourceBrowserUnavailable')}\n </div>\n );\n }\n\n const gatedContent = (() => {\n if (operationUnresolvable || error) {\n return (\n <div className=\"px-card-sm py-item-xs text-xs text-destructive\">\n {operationUnresolvable ? tComponent(FrontendComponentType.APPLICATION_LEVEL_SIDEBAR, 'resourceBrowserUnavailable') : error}\n </div>\n );\n }\n\n if (filteredInstances.length === 0) {\n return (\n <div className=\"px-card-sm py-item-xs text-xs text-muted-foreground\">\n {resolveSidebarBrowserEmptyLabel({ resourceType, tResourceEmptyState, tComponent })}\n </div>\n );\n }\n\n if (isCollapsed) {\n return (\n <div className=\"flex flex-col items-center gap-item-xs py-item-xs\">\n <span className=\"flex-shrink-0\">{resourceIcon}</span>\n <span className=\"text-[10px] text-muted-foreground\">{filteredInstances.length}</span>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-item-xs\" role=\"listbox\" aria-label={resourceListAriaLabel}>\n {filteredInstances.map((instance, idx) => {\n const label = getInstanceLabel(instance);\n const instanceId = (instance.id ?? instance._id ?? idx) as string;\n const instanceKey = instance.id ?? instance._id ?? `sidebar-resource-${idx}`;\n\n return (\n <button\n key={String(instanceKey)}\n type=\"button\"\n role=\"option\"\n onClick={() => handleInstanceClick(instance)}\n className=\"w-full text-start px-card-sm py-item-xs text-sm rounded-sm hover:bg-surface-sunken-accent/50 transition-colors flex items-center gap-field-sm min-h-7\"\n >\n <span className=\"flex-shrink-0\">{resourceIcon}</span>\n <span className=\"truncate flex-1\">{label}</span>\n </button>\n );\n })}\n </div>\n );\n })();\n\n return (\n <LoadingGate\n i18nKeys={i18nKeys}\n loadingScopes={loadingScopes}\n readiness={[{ id: 'sidebar-resource-browser-data', isReady: !isLoading || error !== null }]}\n renderLoading={renderSidebarSkeleton}\n >\n {gatedContent}\n </LoadingGate>\n );\n};\n"]}
1
+ {"version":3,"file":"SidebarResourceBrowser.js","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/SidebarResourceBrowser.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * SidebarResourceBrowser — renders a filterable list of resource instances\n * inside a sidebar section.\n *\n * Uses `useResourceRegistry()` → `doOperation()` for data fetching, following\n * the same pattern as `ResourceLayout_List.tsx`. The bound operation defaults\n * to `CoreResourceOperation.LIST` unless overridden in the section config.\n *\n * Features:\n * - Fetches instances via `doOperation` with scope-aware `contextualParameters`\n * - Applies `instanceFilter` (client-side predicate) after fetching\n * - `onInstanceClick` callback (default: navigate to instance)\n * - Lightweight rendering for always-visible sidebar\n *\n * @see launcher-operation-binding-analysis.md §3.3.6\n * @see app-shell-implementation-plan.md Step 7b\n */\n\nimport React, { useEffect, useState, useRef, useCallback, useMemo } from 'react';\n\nimport {\n CoreResourceOperation,\n ResourcesConfig_OperationPathUtils,\n} from '@wildo-ai/saas-models';\n\nimport { ApplicationLevelComponentType } from '~wildo-frontend-lib/core/config/app-level-components.frontend.schemas';\nimport { ScopeUtilsService } from '~wildo-frontend-lib/core/scope/scope.utils.frontend.service';\nimport { useAppScopeSafe } from '~wildo-frontend-lib/core/scope/useAppScope';\nimport { useResourceRegistry } from '~wildo-frontend-lib/core/resources/useResourceRegistry';\nimport { frontendResourceUtils, FrontendResourceUtils } from '~wildo-frontend-lib/core/resources/frontend-resource.utils';\nimport { FrontendComponentType } from '@wildo-ai/presets-components-models';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { resolveResourceHeaderLabel } from '~wildo-frontend-lib/core/i18n/component-label-resolution.utils';\nimport { resolveSidebarBrowserEmptyLabel } from '~wildo-frontend-lib/components/navigation/app-level/sidebar-resource-browser-empty-label';\nimport { useIconRegistry } from '~wildo-frontend-lib/core/icons/useIconRegistry';\nimport { NavigationUtils } from '~wildo-frontend-lib/core/navigation/navigation.utils';\nimport { useNavigationController } from '~wildo-frontend-lib/core/navigation/useNavigationController';\nimport { IconCategory, IconSize } from '~wildo-frontend-lib/core/icons/icon-registry.frontend.schemas';\nimport { LoggerFrontendService } from '~wildo-frontend-lib/core/monitoring/logger.frontend.service';\nimport { useUserFacingErrorMessage } from '~wildo-frontend-lib/core/errors/useUserFacingErrorMessage';\nimport type { ResourceBrowserClickContext } from '~wildo-frontend-lib/core/config/launcher-items.frontend.schemas';\nimport type { AnyFrontendResourceConfiguration, FrontendResourceConfiguration_Operation } from '~wildo-frontend-lib/core/resources/resources.frontend.schemas';\nimport { LoadingGate } from '~wildo-frontend-lib/core/loading/LoadingGate';\nimport { buildResourceLoadingScope } from '~wildo-frontend-lib/core/loading/loading-scope.frontend.utils';\nimport type { LoadingScope } from '~wildo-frontend-lib/core/loading/loading-types.frontend.schemas';\n\nconst logger: LoggerFrontendService = LoggerFrontendService.getLogger();\nconst logDebug: (message: string, context?: Record<string, unknown>) => void = logger.debugByType('sidebar-resource-browser');\nlogger.setDebugTypeLogging('sidebar-resource-browser', false);\n\nfunction resolveOperation(\n resourceConfig: AnyFrontendResourceConfiguration,\n operationIdentifier: string,\n variantKey?: string,\n): FrontendResourceConfiguration_Operation<any, any, any> | undefined {\n const matchingOperations = resourceConfig.operations.filter(\n (operation: FrontendResourceConfiguration_Operation<any, any, any>) => (\n operation.operationIdentifier === operationIdentifier\n && (variantKey === undefined || operation.variantKey === variantKey)\n ),\n );\n\n if (matchingOperations.length === 1) {\n return matchingOperations[0];\n }\n\n const defaultNonBulkOperations = matchingOperations.filter(\n (operation) => operation.isOperationDefault === true && operation.isBulkOperation !== true,\n );\n if (variantKey === undefined && defaultNonBulkOperations.length === 1) {\n return defaultNonBulkOperations[0];\n }\n\n logDebug('Unable to resolve sidebar resource operation unambiguously', {\n resourceType: resourceConfig.resourceIdentifier,\n operationIdentifier,\n variantKey,\n candidates: matchingOperations.map((candidate) => ({\n variantType: candidate.variantType,\n variantKey: candidate.variantKey,\n isOperationDefault: candidate.isOperationDefault,\n isBulkOperation: candidate.isBulkOperation,\n })),\n });\n return undefined;\n}\n\n/** Both bundles this browser reads: its own words, and the generic list's `noItems` empty-state default. */\nconst SIDEBAR_RESOURCE_BROWSER_LABEL_COMPONENTS = [\n FrontendComponentType.APPLICATION_LEVEL_SIDEBAR,\n FrontendComponentType.RESOURCES_LAYOUTS_LIST,\n];\n\nexport interface SidebarResourceBrowserProps {\n resourceType: string;\n operation?: string;\n operationVariant?: string;\n navigateOperation?: string;\n navigateOperationVariant?: string;\n instanceFilter?: (instance: Record<string, unknown>) => boolean;\n onInstanceClick?: (context: ResourceBrowserClickContext) => void;\n isCollapsed?: boolean;\n}\n\n/**\n * Sidebar resource browser — fetches and displays a lightweight list\n * of resource instances for browsing within the sidebar.\n */\nexport const SidebarResourceBrowser: React.FC<SidebarResourceBrowserProps> = ({\n resourceType,\n operation,\n operationVariant,\n navigateOperation,\n navigateOperationVariant,\n instanceFilter,\n onInstanceClick,\n isCollapsed = false,\n}) => {\n const { registry, doOperation } = useResourceRegistry();\n const { navigateToResource } = useNavigationController();\n const appScope = useAppScopeSafe();\n const { tResourceHeader, tResourceEmptyState, t, tComponent, formatDate, formatDateTime } = useI18n({ resource: resourceType, component: SIDEBAR_RESOURCE_BROWSER_LABEL_COMPONENTS });\n // Stable identity, so the fetch effect below may call it without listing it.\n const toUserFacingErrorMessage = useUserFacingErrorMessage();\n const { renderIcon } = useIconRegistry();\n\n const [instances, setInstances] = useState<Record<string, unknown>[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n // A configuration problem, not a caught error: its words are a label, resolved at render.\n const [operationUnresolvable, setOperationUnresolvable] = useState(false);\n\n const doOperationRef = useRef(doOperation);\n doOperationRef.current = doOperation;\n\n const resourceConfig: AnyFrontendResourceConfiguration | undefined = registry.resourceConfigurations[resourceType];\n\n const boundOperation: FrontendResourceConfiguration_Operation<any, any, any> | undefined = useMemo(() => {\n if (!resourceConfig) return undefined;\n return resolveOperation(resourceConfig, operation ?? CoreResourceOperation.LIST, operationVariant);\n }, [resourceConfig, operation, operationVariant]);\n\n const navigationOperationResolved: FrontendResourceConfiguration_Operation<any, any, any> | undefined = useMemo(() => {\n if (!resourceConfig) return undefined;\n\n if (navigateOperation) {\n return resolveOperation(resourceConfig, navigateOperation, navigateOperationVariant);\n }\n\n if (operation && operation !== CoreResourceOperation.LIST) {\n return resolveOperation(resourceConfig, operation, operationVariant);\n }\n\n return (\n resolveOperation(resourceConfig, CoreResourceOperation.READ) ??\n boundOperation\n );\n }, [resourceConfig, navigateOperation, navigateOperationVariant, operation, operationVariant, boundOperation]);\n\n const scopedContextIdentifiers = useMemo((): Record<string, string> => {\n if (!resourceConfig) return {};\n\n const primaryScopeInitiatorIds = ScopeUtilsService.buildInitiatorIds({\n userId: appScope?.currentUserId,\n organizationId: appScope?.currentOrganizationId,\n applicationId: appScope?.currentApplicationId,\n anonymousUserId: appScope?.currentAnonymousUserId,\n });\n\n return {\n ...ScopeUtilsService.primaryScopeToContextIdentifiers(\n primaryScopeInitiatorIds,\n resourceConfig.resourcePrimaryScope,\n ),\n ...(appScope?.buildContextResourceIdentifiers() ?? {}),\n };\n }, [\n resourceConfig,\n appScope?.currentUserId,\n appScope?.currentOrganizationId,\n appScope?.currentApplicationId,\n appScope?.currentAnonymousUserId,\n appScope,\n ]);\n\n const operationPathKey = useMemo(() => {\n if (!boundOperation) return null;\n return ResourcesConfig_OperationPathUtils.createOperationPathKeyFromOperation(boundOperation);\n }, [boundOperation]);\n\n useEffect(() => {\n setOperationUnresolvable(Boolean(resourceConfig) && !operationPathKey);\n if (!operationPathKey || !resourceConfig) {\n setInstances([]);\n if (resourceConfig && !operationPathKey) {\n const message = `Sidebar resource browser cannot resolve operation \"${operation ?? CoreResourceOperation.LIST}\" on resource \"${resourceType}\".`;\n setError(null);\n logger.warn(message, {\n resourceType,\n operationIdentifier: operation ?? CoreResourceOperation.LIST,\n operationVariant,\n });\n } else {\n if (!resourceConfig) {\n // The person reads the `resourceBrowserUnavailable` label; the identifier belongs in the log.\n logger.warn(`Sidebar resource browser: resource type \"${resourceType}\" is not registered.`, { resourceType });\n }\n setError(null);\n }\n setIsLoading(false);\n return;\n }\n\n let cancelled = false;\n\n const fetchInstances = async () => {\n setIsLoading(true);\n setError(null);\n try {\n logDebug('Fetching resource instances', { resourceType, operationPathKey });\n const result = await doOperationRef.current(operationPathKey, {\n contextualParameters: scopedContextIdentifiers,\n queryParameters: { limit: 100 },\n });\n\n if (cancelled) return;\n\n const items = Array.isArray(result) ? result : (result as any)?.data ?? [];\n setInstances(items as Record<string, unknown>[]);\n logDebug('Fetched instances', { count: items.length });\n } catch (err) {\n if (cancelled) return;\n // Rendered to the person, so resolved to localized text — `extractErrorInfo(err).message` was the\n // backend's i18n REFERENCE (#1160).\n setError(toUserFacingErrorMessage(err));\n logger.error('SidebarResourceBrowser fetch failed', { resourceType, error: err });\n } finally {\n if (!cancelled) setIsLoading(false);\n }\n };\n\n fetchInstances();\n return () => { cancelled = true; };\n }, [operationPathKey, resourceType, resourceConfig, scopedContextIdentifiers, operation, operationVariant]);\n\n const filteredInstances = useMemo(() => {\n if (!instanceFilter) return instances;\n return instances.filter(instanceFilter);\n }, [instances, instanceFilter]);\n const resourceListAriaLabel = useMemo(\n () => resolveResourceHeaderLabel({\n tResourceHeader,\n resourceType,\n key: 'title',\n }),\n [resourceType, tResourceHeader],\n );\n\n const handleInstanceClick = useCallback((instance: Record<string, unknown>) => {\n const instanceId = (instance.id ?? instance._id ?? '') as string;\n\n if (onInstanceClick) {\n onInstanceClick({\n resourceType,\n instanceId,\n instanceData: instance,\n });\n return;\n }\n\n if (resourceConfig && navigationOperationResolved) {\n const contextIdentifiers: Record<string, string> = {\n ...scopedContextIdentifiers,\n [resourceType]: instanceId,\n };\n const parentResourcesRequirements = frontendResourceUtils.buildParentResourcesRequirements(\n resourceType as any,\n contextIdentifiers,\n registry,\n );\n\n const resourceContext = frontendResourceUtils.createFrontendResourceOperationContextFromOperation({\n resourceType: resourceType as any,\n operation: navigationOperationResolved,\n contextResourceIdentifiers: contextIdentifiers,\n parentResourcesRequirements,\n });\n navigateToResource(\n resourceContext,\n NavigationUtils.createAppLevelInitiator(ApplicationLevelComponentType.SIDEBAR),\n );\n return;\n }\n\n logger.warn('SidebarResourceBrowser navigation skipped: no navigation operation resolved', {\n resourceType,\n fetchOperationIdentifier: boundOperation?.operationIdentifier,\n navigationOperationIdentifier: navigateOperation ?? CoreResourceOperation.READ,\n navigationOperationVariant: navigateOperationVariant,\n instanceId,\n });\n }, [\n resourceType,\n onInstanceClick,\n resourceConfig,\n navigationOperationResolved,\n navigateOperation,\n navigateOperationVariant,\n scopedContextIdentifiers,\n registry,\n navigateToResource,\n boundOperation,\n ]);\n\n /*\n * A record's name through the ONE shared resolver, like every other surface that names a record (#1851). This\n * browser used to call the label callback itself with only `currentObject`, so a callback reading `t`, a date\n * formatter or the resource type threw, and the catch fell back to `name`/`title`/`id` — a product showed its id\n * here while its list row showed its word. The shared resolver's own fallback is the record's declared summary\n * fields, then its id.\n */\n const getInstanceLabel = useCallback((instance: Record<string, unknown>): string => {\n return FrontendResourceUtils.computeFrontendResourceLabel({\n resourceType,\n registry,\n currentObject: instance,\n t,\n formatDate,\n formatDateTime,\n }) ?? String(instance._id ?? '');\n }, [resourceType, registry, t, formatDate, formatDateTime]);\n\n const resourceIcon = useMemo(() => {\n return renderIcon(\n { category: IconCategory.RESOURCES, resourceType },\n { size: IconSize.SM },\n );\n }, [renderIcon, resourceType]);\n\n const loadingScopes = useMemo<LoadingScope[]>(() => {\n if (!boundOperation) return [];\n return [\n buildResourceLoadingScope({\n resourceType,\n operation: boundOperation.operationIdentifier,\n }),\n ];\n }, [resourceType, boundOperation]);\n\n const i18nKeys = useMemo(() => [`resources.${resourceType}`], [resourceType]);\n\n const renderSidebarSkeleton = useCallback(() => (\n <div className=\"px-card-sm py-item-xs space-y-item-xs\" role=\"status\" aria-live=\"polite\">\n {[1, 2, 3].map(i => (\n <div key={i} className=\"animate-pulse motion-reduce:animate-none h-7 bg-surface-sunken-accent rounded\" aria-hidden=\"true\" />\n ))}\n </div>\n ), []);\n\n if (!resourceConfig) {\n return (\n <div className=\"px-card-sm py-item-xs text-xs text-destructive\">\n {tComponent(FrontendComponentType.APPLICATION_LEVEL_SIDEBAR, 'resourceBrowserUnavailable')}\n </div>\n );\n }\n\n const gatedContent = (() => {\n if (operationUnresolvable || error) {\n return (\n <div className=\"px-card-sm py-item-xs text-xs text-destructive\">\n {operationUnresolvable ? tComponent(FrontendComponentType.APPLICATION_LEVEL_SIDEBAR, 'resourceBrowserUnavailable') : error}\n </div>\n );\n }\n\n if (filteredInstances.length === 0) {\n return (\n <div className=\"px-card-sm py-item-xs text-xs text-muted-foreground\">\n {resolveSidebarBrowserEmptyLabel({ resourceType, tResourceEmptyState, tComponent })}\n </div>\n );\n }\n\n if (isCollapsed) {\n return (\n <div className=\"flex flex-col items-center gap-item-xs py-item-xs\">\n <span className=\"flex-shrink-0\">{resourceIcon}</span>\n <span className=\"text-[10px] text-muted-foreground\">{filteredInstances.length}</span>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-item-xs\" role=\"listbox\" aria-label={resourceListAriaLabel}>\n {filteredInstances.map((instance, idx) => {\n const label = getInstanceLabel(instance);\n const instanceId = (instance.id ?? instance._id ?? idx) as string;\n const instanceKey = instance.id ?? instance._id ?? `sidebar-resource-${idx}`;\n\n return (\n <button\n key={String(instanceKey)}\n type=\"button\"\n role=\"option\"\n onClick={() => handleInstanceClick(instance)}\n className=\"w-full text-start px-card-sm py-item-xs text-sm rounded-sm hover:bg-surface-sunken-accent/50 transition-colors flex items-center gap-field-sm min-h-7\"\n >\n <span className=\"flex-shrink-0\">{resourceIcon}</span>\n <span className=\"truncate flex-1\">{label}</span>\n </button>\n );\n })}\n </div>\n );\n })();\n\n return (\n <LoadingGate\n i18nKeys={i18nKeys}\n loadingScopes={loadingScopes}\n readiness={[{ id: 'sidebar-resource-browser-data', isReady: !isLoading || error !== null }]}\n renderLoading={renderSidebarSkeleton}\n >\n {gatedContent}\n </LoadingGate>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"useCommandMenuBehavior.d.ts","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/useCommandMenuBehavior.ts"],"names":[],"mappings":"AA0CA,OAAO,KAAK,EACV,mBAAmB,EAMpB,MAAM,sDAAsD,CAAC;AA6G9D;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,cAAc,CAAC,EAAE,OAAO,EACxB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,EACtC,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C,mBAAmB,CA8crB"}
1
+ {"version":3,"file":"useCommandMenuBehavior.d.ts","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/useCommandMenuBehavior.ts"],"names":[],"mappings":"AA0CA,OAAO,KAAK,EACV,mBAAmB,EAMpB,MAAM,sDAAsD,CAAC;AA6G9D;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,cAAc,CAAC,EAAE,OAAO,EACxB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,EACtC,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C,mBAAmB,CAodrB"}
@@ -114,7 +114,7 @@ export function useCommandMenuBehavior(externalIsOpen, onOpenChange, options = {
114
114
  const { appComponentsConfiguration } = useUI();
115
115
  const { on, emit } = useEventBus();
116
116
  const { register } = useHotkeyRegistry();
117
- const { t, tComponent } = useI18n({
117
+ const { t, tComponent, formatDate, formatDateTime } = useI18n({
118
118
  component: FrontendComponentType.APPLICATION_LEVEL_COMMAND_MENU,
119
119
  });
120
120
  const commandMenuConfig = appComponentsConfiguration?.[ApplicationLevelComponentType.COMMAND_MENU];
@@ -288,6 +288,10 @@ export function useCommandMenuBehavior(externalIsOpen, onOpenChange, options = {
288
288
  handleOpenChangeRef.current = handleOpenChange;
289
289
  const tRef = useRef(t);
290
290
  tRef.current = t;
291
+ const formatDateRef = useRef(formatDate);
292
+ formatDateRef.current = formatDate;
293
+ const formatDateTimeRef = useRef(formatDateTime);
294
+ formatDateTimeRef.current = formatDateTime;
291
295
  const tComponentRef = useRef(tComponent);
292
296
  tComponentRef.current = tComponent;
293
297
  const searchResourcesRef = useRef(searchResources);
@@ -427,6 +431,8 @@ export function useCommandMenuBehavior(externalIsOpen, onOpenChange, options = {
427
431
  registry: currentRegistry,
428
432
  currentObject: item,
429
433
  t: tRef.current,
434
+ formatDate: formatDateRef.current,
435
+ formatDateTime: formatDateTimeRef.current,
430
436
  }) ?? id;
431
437
  return [{
432
438
  id: `omnibox:${entry.resourceType}:${id}`,
@@ -1 +1 @@
1
- {"version":3,"file":"useCommandMenuBehavior.js","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/useCommandMenuBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { FrontendComponentType } from '@wildo-ai/presets-components-models';\nimport { CoreResourceOperation } from '@wildo-ai/saas-models';\nimport { ForeignKeyDisplayMode } from '@wildo-ai/zod-decorators';\n\nimport {\n ApplicationLevelComponentType,\n HotkeyGroup,\n HotkeyScope,\n} from '~wildo-frontend-lib/core/config/app-level-components.frontend.schemas';\nimport { CommandMenuDisplayPolicy } from '~wildo-frontend-lib/core/config/app-level-components.frontend.schemas';\nimport { CommandBarPolicy } from '~wildo-frontend-lib/core/config/app-configuration-frontend.schemas';\nimport type { CommandMenuCommand, CommandMenuSearchResource } from '~wildo-frontend-lib/core/config/launcher-items.frontend.schemas';\nimport { useResourceRegistry } from '~wildo-frontend-lib/core/resources/useResourceRegistry';\nimport { useAppScopeSafe } from '~wildo-frontend-lib/core/scope/useAppScope';\nimport { ScopeUtilsService } from '~wildo-frontend-lib/core/scope/scope.utils.frontend.service';\nimport { frontendResourceUtils, FrontendResourceUtils } from '~wildo-frontend-lib/core/resources/frontend-resource.utils';\nimport {\n pickPreferredOperationForCoreSemantic,\n resolveEffectiveCoreOperationFromOperation,\n type ResourceOperationSemanticsLike,\n} from '~wildo-frontend-lib/core/resources/operation-semantics.frontend.utils';\nimport { extractErrorInfo } from '~wildo-frontend-lib/core/errors/errors.frontend.schemas';\nimport { LoggerFrontendService } from '~wildo-frontend-lib/core/monitoring/logger.frontend.service';\nimport {\n FrontendEvents,\n type FrontendEvent_HotkeyCommandMenuOpen,\n} from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\nimport {\n filterCommandMenuCommandsByRuntimeAvailability,\n useLauncherRuntimeAvailabilityContext,\n} from '~wildo-frontend-lib/core/navigation/launcher-runtime-availability';\nimport { NavigationUtils } from '~wildo-frontend-lib/core/navigation/navigation.utils';\nimport { resolveCommandMenuCommands, type ResolvedCommandMenuItem } from '~wildo-frontend-lib/core/navigation/launcher-resolution';\nimport { useLauncherResolutionContext } from '~wildo-frontend-lib/core/navigation/useLauncherResolutionContext';\nimport { useNavigationController } from '~wildo-frontend-lib/core/navigation/useNavigationController';\nimport { useUI } from '~wildo-frontend-lib/core/ui/useUI';\nimport { useHotkeyRegistry } from '~wildo-frontend-lib/core/hotkey/useHotkey';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\n\nimport { envLoader } from '~wildo-frontend-lib/core/runtime/env-variable-loader.frontend.service';\nimport type {\n CommandMenuBehavior,\n CommandMenuItem,\n CommandMenuGroup,\n CommandMenuSearchResultItem,\n CommandMenuSearchResultGroup,\n CommandMenuPaletteGroup,\n} from '~wildo-frontend-lib/core/app-shell/app-shell.schemas';\nimport { CommandMenuPaletteGroupKind } from '~wildo-frontend-lib/core/app-shell/app-shell.schemas';\n\nconst DEFAULT_CATEGORY_ORDER: readonly string[] = ['navigation', 'actions'];\n\n/**\n * Order weights for the SINGLE palette ordering axis. Record groups occupy the\n * low band (0..), static command-category groups the high band (1000..), so\n * live record matches surface ABOVE static commands by default while searching.\n * An app overrides per record group via `CommandMenuSearchResource.order`.\n */\nconst RECORD_GROUP_ORDER_BASE = 0;\nconst COMMAND_GROUP_ORDER_BASE = 1000;\n\n/** Omnibox record-search tuning — mirrors `useResourceSearch` (FK picker). */\nconst OMNIBOX_SEARCH_DEBOUNCE_MS = 300;\nconst OMNIBOX_MIN_SEARCH_CHARS = 2;\nconst OMNIBOX_DEFAULT_MAX_RESULTS = 5;\n\nconst omniboxLogger: LoggerFrontendService = LoggerFrontendService.getLogger();\n\n/**\n * Maps a command's core operation semantic to the command-menu component label\n * key holding that operation's LOCALIZED search synonyms (a comma-separated\n * list). `_MANY` variants share their base action's synonyms. Operations\n * without a meaningful synonym set (COUNT) are omitted — they contribute no\n * extra keywords and the command's localized label still matches.\n */\nconst OPERATION_KEYWORD_LABEL_KEY: Partial<Record<CoreResourceOperation, string>> = {\n [CoreResourceOperation.CREATE]: 'keywordsCreate',\n [CoreResourceOperation.CREATE_MANY]: 'keywordsCreate',\n [CoreResourceOperation.LIST]: 'keywordsList',\n [CoreResourceOperation.SEARCH]: 'keywordsSearch',\n [CoreResourceOperation.READ]: 'keywordsRead',\n [CoreResourceOperation.UPDATE]: 'keywordsUpdate',\n [CoreResourceOperation.UPDATE_MANY]: 'keywordsUpdate',\n [CoreResourceOperation.DELETE]: 'keywordsDelete',\n [CoreResourceOperation.DELETE_MANY]: 'keywordsDelete',\n};\n\ntype TComponentFn = (component: FrontendComponentType, key: string, params?: Record<string, string | number>) => string;\n\n/**\n * Resolve a command-menu component keyword label into its list of localized\n * synonyms. The label is authored (and translated) as a comma-separated string;\n * we split it into individual match terms. Fails OPEN to `[]` when the key is\n * not yet generated (`tComponent` returns the raw key path) so a missing\n * translation never injects the literal key path as a bogus keyword.\n */\nfunction resolveKeywordSynonyms(tComponent: TComponentFn, key: string): string[] {\n const componentType = FrontendComponentType.APPLICATION_LEVEL_COMMAND_MENU;\n const base = `components.${componentType}.${key}`;\n const resolved = tComponent(componentType, key);\n if (!resolved || resolved === base) return [];\n return resolved.split(',').map(term => term.trim()).filter(Boolean);\n}\n\n/** Localized verb synonyms for a resource-operation command's core semantic. */\nfunction resolveOperationKeywords(\n tComponent: TComponentFn,\n operation: ResourceOperationSemanticsLike | undefined,\n): string[] {\n if (!operation) return [];\n const coreOperation = resolveEffectiveCoreOperationFromOperation(operation);\n const key = coreOperation ? OPERATION_KEYWORD_LABEL_KEY[coreOperation] : undefined;\n return key ? resolveKeywordSynonyms(tComponent, key) : [];\n}\n\n/**\n * The category heading a person reads, from the label tree and nowhere else.\n *\n * This was `resolved === baseKey ? humanizeCategory(category) : resolved` — the exact shape\n * `.claude/rules/display-text-comes-from-i18n.md` names as forbidden, and the reason it is forbidden\n * is visible here: the formatter ran ONLY when the label was missing, which is precisely the case\n * somebody needs to notice. The palette read as finished in every locale, so the keys were never\n * authored and a French user was shown English produced by code — invisible to a translator, because\n * it was never in the tree at all.\n *\n * `tComponent` already answers with the KEY when it cannot resolve one, so returning its answer\n * unchanged IS the missing-looks-missing behaviour. A category with no label now shows its key,\n * which is what makes somebody author it.\n */\nfunction resolveCategoryLabel(\n tComponent: (component: FrontendComponentType, key: string, params?: Record<string, string | number>) => string,\n category: string,\n): string {\n return tComponent(FrontendComponentType.APPLICATION_LEVEL_COMMAND_MENU, category);\n}\n\nfunction isCommandMenuConfigObject(\n config: unknown,\n): config is {\n policy?: CommandBarPolicy;\n showRecent?: boolean;\n maxRecentItems?: number;\n showShortcuts?: boolean;\n openShortcut?: string;\n defaultCategory?: string;\n categoryOrder?: string[];\n commands?: CommandMenuCommand[];\n searchResources?: CommandMenuSearchResource[];\n dialogWidth?: string;\n} {\n return typeof config === 'object' && config !== null && !Array.isArray(config);\n}\n\n/** Default desktop max-width class for the palette dialog (see `dialogWidth`). */\nconst DEFAULT_COMMAND_MENU_DIALOG_WIDTH = 'sm:max-w-2xl';\n\n/**\n * Behavior hook for CommandMenu — manages open state (controlled or\n * uncontrolled), search, recent commands, hotkey subscription, and\n * navigation items mapped to command menu entries.\n */\nexport function useCommandMenuBehavior(\n externalIsOpen?: boolean,\n onOpenChange?: (open: boolean) => void,\n options: { listenForHotkeys?: boolean } = {},\n): CommandMenuBehavior {\n const resolutionCtx = useLauncherResolutionContext();\n const { navigate, navigateToResource } = useNavigationController();\n const { registry, doOperation } = useResourceRegistry();\n const appScope = useAppScopeSafe();\n const { appComponentsConfiguration } = useUI();\n const { on, emit } = useEventBus();\n const { register } = useHotkeyRegistry();\n const { t, tComponent } = useI18n({\n component: FrontendComponentType.APPLICATION_LEVEL_COMMAND_MENU,\n });\n\n const commandMenuConfig = appComponentsConfiguration?.[ApplicationLevelComponentType.COMMAND_MENU];\n const commandMenuObj = isCommandMenuConfigObject(commandMenuConfig) ? commandMenuConfig : undefined;\n const openShortcut = commandMenuObj?.openShortcut;\n const showRecent = commandMenuObj?.showRecent !== false;\n const maxRecentItems = commandMenuObj?.maxRecentItems ?? 5;\n const showShortcuts = commandMenuObj?.showShortcuts !== false;\n const defaultCategory = commandMenuObj?.defaultCategory ?? 'navigation';\n const categoryOrder = commandMenuObj?.categoryOrder ?? DEFAULT_CATEGORY_ORDER;\n const isOmnibox = commandMenuObj?.policy === CommandBarPolicy.OMNIBOX;\n const searchResources = commandMenuObj?.searchResources;\n const dialogWidth = commandMenuObj?.dialogWidth ?? DEFAULT_COMMAND_MENU_DIALOG_WIDTH;\n const runtimeAvailabilityContext = useLauncherRuntimeAvailabilityContext();\n const configCommands = useMemo(() => (\n filterCommandMenuCommandsByRuntimeAvailability(\n commandMenuObj?.commands,\n runtimeAvailabilityContext,\n )\n ), [commandMenuObj?.commands, runtimeAvailabilityContext]);\n\n const [internalIsOpen, setInternalIsOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [recentCommandIds, setRecentCommandIds] = useState<string[]>([]);\n\n const isControlled = externalIsOpen !== undefined && onOpenChange !== undefined;\n const isOpen = isControlled ? externalIsOpen : internalIsOpen;\n const isOpenRef = useRef(isOpen);\n isOpenRef.current = isOpen;\n const listenForHotkeys = options.listenForHotkeys !== false;\n\n const handleOpenChange = useCallback((open: boolean) => {\n if (isControlled && onOpenChange) {\n onOpenChange(open);\n } else {\n setInternalIsOpen(open);\n }\n if (!open) {\n setSearchQuery('');\n }\n }, [isControlled, onOpenChange]);\n\n useEffect(() => {\n if (!listenForHotkeys) return;\n const unsubscribe = on(FrontendEvents.HOTKEY_COMMAND_MENU_OPEN, () => {\n handleOpenChange(!isOpenRef.current);\n });\n return unsubscribe;\n }, [on, handleOpenChange, listenForHotkeys]);\n\n useEffect(() => {\n if (!listenForHotkeys) return;\n if (!openShortcut || commandMenuConfig === false) return;\n return register({\n id: 'app-command-menu-open-shortcut',\n shortcut: openShortcut,\n description: t('engine.hotkeys.commandMenuOpen'),\n scope: HotkeyScope.GLOBAL,\n group: HotkeyGroup.NAVIGATION,\n launcher: ApplicationLevelComponentType.COMMAND_MENU,\n preventDefault: true,\n handler: () => {\n emit(FrontendEvents.HOTKEY_COMMAND_MENU_OPEN, {} as FrontendEvent_HotkeyCommandMenuOpen);\n },\n });\n }, [openShortcut, commandMenuConfig, register, emit, t, listenForHotkeys]);\n\n const resolvedCommands = useMemo((): ResolvedCommandMenuItem[] => {\n if (!configCommands || !resolutionCtx) return [];\n return resolveCommandMenuCommands(configCommands, resolutionCtx);\n }, [configCommands, resolutionCtx]);\n\n const commandItems = useMemo((): CommandMenuItem[] => {\n return resolvedCommands\n .filter(cmd => {\n const dp = cmd.displayPolicy;\n if (dp === undefined || dp === CommandMenuDisplayPolicy.ALWAYS) return true;\n if (dp === CommandMenuDisplayPolicy.NEVER) return false;\n if (dp === CommandMenuDisplayPolicy.RECENT) return true;\n if (dp === CommandMenuDisplayPolicy.CONTEXTUAL) {\n if (envLoader.isDevelopment()) {\n console.warn(`[CommandMenu] CONTEXTUAL displayPolicy requires a contextual source and is excluded from the global app-level menu for \"${cmd.id}\"`);\n }\n return false;\n }\n if (envLoader.isDevelopment()) {\n console.warn(`[CommandMenu] Unknown displayPolicy \"${dp}\" for command \"${cmd.id}\" — treating as ALWAYS`);\n }\n return true;\n })\n .map(cmd => ({\n id: cmd.id,\n label: cmd.label,\n shortcut: cmd.shortcut ?? '',\n icon: cmd.icon ?? null,\n category: cmd.category ?? defaultCategory,\n // Localized operation-verb synonyms (translated) + any app-specific\n // literal supplements. The command's localized `label` covers the noun.\n keywords: [\n ...resolveOperationKeywords(tComponent, cmd.operation),\n ...(cmd.searchKeywords ?? []),\n ],\n displayPolicy: cmd.displayPolicy,\n onExecute: () => {\n handleOpenChange(false);\n setRecentCommandIds(prev => {\n const next = [cmd.id, ...prev.filter(id => id !== cmd.id)];\n return next.slice(0, maxRecentItems);\n });\n if (cmd.urlPath) {\n NavigationUtils.dispatchNavigationForResolvedTarget(navigate, cmd, ApplicationLevelComponentType.COMMAND_MENU);\n }\n },\n }));\n }, [resolvedCommands, handleOpenChange, navigate, maxRecentItems, defaultCategory, tComponent]);\n\n const groupedItems = useMemo((): CommandMenuGroup[] => {\n const categoryMap = new Map<string, CommandMenuItem[]>();\n\n for (const item of commandItems) {\n if (item.displayPolicy === CommandMenuDisplayPolicy.RECENT) continue;\n const category = item.category;\n const existing = categoryMap.get(category) ?? [];\n existing.push(item);\n categoryMap.set(category, existing);\n }\n\n for (const items of categoryMap.values()) {\n items.sort((a, b) => a.label.localeCompare(b.label));\n }\n\n const ordered: CommandMenuGroup[] = [];\n for (const cat of categoryOrder) {\n const items = categoryMap.get(cat);\n if (items) {\n ordered.push({ category: cat, label: resolveCategoryLabel(tComponent, cat), items });\n categoryMap.delete(cat);\n }\n }\n for (const [cat, items] of categoryMap.entries()) {\n ordered.push({ category: cat, label: resolveCategoryLabel(tComponent, cat), items });\n }\n\n return ordered;\n }, [commandItems, categoryOrder, tComponent]);\n\n const recentItems = useMemo(() => {\n if (recentCommandIds.length === 0) return [];\n const itemById = new Map(commandItems.map(item => [item.id, item]));\n return recentCommandIds.map(id => itemById.get(id)).filter(Boolean) as CommandMenuItem[];\n }, [commandItems, recentCommandIds]);\n\n // ===================================================================\n // Omnibox record-search layer (policy: OMNIBOX)\n // ===================================================================\n //\n // A live, debounced query against each configured resource's addressable\n // SEARCH operation (falling back to LIST). This is the ONLY query-driven data\n // path in the command menu — static commands remain a synchronous, config-only\n // source. Scope + navigation reuse the proven `SidebarResourceBrowser`\n // precedent: the current org/user/app scope is projected into\n // `contextualParameters` (and `ScopedResourceRegistryProvider` additionally\n // injects the field-identifier-keyed org id onto every `doOperation`), and a\n // selection navigates to the record's addressable READ view.\n\n const [searchResultGroups, setSearchResultGroups] = useState<CommandMenuSearchResultGroup[]>([]);\n const [isSearching, setIsSearching] = useState(false);\n\n // Read mutable dependencies through refs so the debounced fetch effect only\n // re-fires on a genuine (isOpen, query, policy, resource-set) change — never\n // on incidental identity churn of the registry / scope / navigation handles\n // (see the react-effect-identity-churn discipline).\n const doOperationRef = useRef(doOperation);\n doOperationRef.current = doOperation;\n const registryRef = useRef(registry);\n registryRef.current = registry;\n const appScopeRef = useRef(appScope);\n appScopeRef.current = appScope;\n const navigateToResourceRef = useRef(navigateToResource);\n navigateToResourceRef.current = navigateToResource;\n const handleOpenChangeRef = useRef(handleOpenChange);\n handleOpenChangeRef.current = handleOpenChange;\n const tRef = useRef(t);\n tRef.current = t;\n const tComponentRef = useRef(tComponent);\n tComponentRef.current = tComponent;\n const searchResourcesRef = useRef(searchResources);\n searchResourcesRef.current = searchResources;\n const omniboxTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n /**\n * Project the current primary scope (user/org/app/anon) into the resource's\n * scope-filtered context identifiers — the same shape `SidebarResourceBrowser`\n * passes to `doOperation`. Keyed by resource type; the scoped provider maps\n * the org id to its field identifier (`organizationId`) on the wire.\n */\n const buildOmniboxScopeIdentifiers = useCallback((resourcePrimaryScope: unknown): Record<string, string> => {\n const scope = appScopeRef.current;\n const primaryScopeInitiatorIds = ScopeUtilsService.buildInitiatorIds({\n userId: scope?.currentUserId,\n organizationId: scope?.currentOrganizationId,\n applicationId: scope?.currentApplicationId,\n anonymousUserId: scope?.currentAnonymousUserId,\n });\n return {\n ...ScopeUtilsService.primaryScopeToContextIdentifiers(\n primaryScopeInitiatorIds,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resourcePrimaryScope as any,\n ),\n ...(scope?.buildContextResourceIdentifiers() ?? {}),\n };\n }, []);\n\n /** Navigate to a matched record's addressable READ view, then close the menu. */\n const navigateToRecord = useCallback((resourceType: string, recordId: string): void => {\n const currentRegistry = registryRef.current;\n const resourceConfig = currentRegistry.resourceConfigurations[resourceType];\n if (!resourceConfig) return;\n\n const readOperation = pickPreferredOperationForCoreSemantic(\n resourceConfig.operations ?? [],\n CoreResourceOperation.READ,\n );\n if (!readOperation) {\n omniboxLogger.warn('[CommandMenu] Omnibox result has no addressable READ operation', { resourceType, recordId });\n return;\n }\n\n const contextIdentifiers: Record<string, string> = {\n ...buildOmniboxScopeIdentifiers(resourceConfig.resourcePrimaryScope),\n [resourceType]: recordId,\n };\n const parentResourcesRequirements = frontendResourceUtils.buildParentResourcesRequirements(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resourceType as any,\n contextIdentifiers,\n currentRegistry,\n );\n const resourceContext = frontendResourceUtils.createFrontendResourceOperationContextFromOperation({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resourceType: resourceType as any,\n operation: readOperation,\n contextResourceIdentifiers: contextIdentifiers,\n parentResourcesRequirements,\n });\n\n handleOpenChangeRef.current(false);\n navigateToResourceRef.current(\n resourceContext,\n NavigationUtils.createAppLevelInitiator(ApplicationLevelComponentType.COMMAND_MENU),\n );\n }, [buildOmniboxScopeIdentifiers]);\n\n // Stable key over the configured resource set — the fetch effect re-arms only\n // when the app changes which resources are searchable, not per render.\n const searchResourcesKey = useMemo(\n () => JSON.stringify(searchResources ?? []),\n [searchResources],\n );\n\n const shouldRunOmnibox = isOmnibox && !!searchResources && searchResources.length > 0;\n\n useEffect(() => {\n if (omniboxTimeoutRef.current) {\n clearTimeout(omniboxTimeoutRef.current);\n omniboxTimeoutRef.current = null;\n }\n\n // Below threshold, closed, or omnibox disabled → no query-driven results.\n if (!isOpen || !shouldRunOmnibox || searchQuery.trim().length < OMNIBOX_MIN_SEARCH_CHARS) {\n setSearchResultGroups([]);\n setIsSearching(false);\n return;\n }\n\n let cancelled = false;\n const query = searchQuery.trim();\n setIsSearching(true);\n\n const runSearch = async (): Promise<void> => {\n const currentRegistry = registryRef.current;\n const resources = searchResourcesRef.current ?? [];\n\n const groups = await Promise.all(resources.map(async (entry): Promise<CommandMenuSearchResultGroup | null> => {\n const resourceConfig = currentRegistry.resourceConfigurations[entry.resourceType];\n if (!resourceConfig) {\n omniboxLogger.warn('[CommandMenu] Omnibox searchResource not in registry — skipped', { resourceType: entry.resourceType });\n return null;\n }\n\n let operationPath: string;\n try {\n operationPath = FrontendResourceUtils.buildForeignKeySearchOperationPath(entry.resourceType, currentRegistry);\n } catch {\n omniboxLogger.warn('[CommandMenu] Omnibox resource has no searchable SEARCH/LIST operation — skipped', { resourceType: entry.resourceType });\n return null;\n }\n\n const searchParams = FrontendResourceUtils.buildForeignKeySearchParams(\n query,\n entry.maxResults ?? OMNIBOX_DEFAULT_MAX_RESULTS,\n );\n\n let result: unknown;\n try {\n result = await doOperationRef.current(operationPath, {\n contextualParameters: buildOmniboxScopeIdentifiers(resourceConfig.resourcePrimaryScope),\n queryParameters: searchParams.queryParameters,\n });\n } catch (err) {\n omniboxLogger.error('[CommandMenu] Omnibox search failed', { resourceType: entry.resourceType, ...extractErrorInfo(err), error: err });\n return null;\n }\n\n let items: Record<string, unknown>[] = [];\n if (Array.isArray(result)) {\n items = result as Record<string, unknown>[];\n } else if (result && typeof result === 'object') {\n const resultObj = result as { data?: Record<string, unknown>[]; items?: Record<string, unknown>[] };\n items = resultObj.data ?? resultObj.items ?? [];\n }\n if (items.length === 0) return null;\n\n const fieldIdentifier = FrontendResourceUtils.getResourceFieldIdentifierForType(entry.resourceType, currentRegistry);\n const category = entry.category ?? entry.resourceType;\n // Default to the richer SUMMARY view (the resource's summary card);\n // apps opt out to a one-line LABEL per resource. `ID` collapses to LABEL.\n const displayMode = entry.resultDisplay === ForeignKeyDisplayMode.LABEL\n || entry.resultDisplay === ForeignKeyDisplayMode.ID\n ? ForeignKeyDisplayMode.LABEL\n : ForeignKeyDisplayMode.SUMMARY;\n // The raw query is always carried as a keyword so cmdk's client-side\n // filter never drops a legitimate server hit (matches may be on a field\n // absent from the label, e.g. `description`). We also fold in the\n // LOCALIZED \"search\" verb synonyms so typing a translated synonym keeps\n // the group visible, plus any app-specific literal supplements.\n const baseKeywords = [\n query,\n ...resolveKeywordSynonyms(tComponentRef.current, 'keywordsSearch'),\n ...(entry.searchKeywords ?? []),\n ];\n\n const resultItems: CommandMenuSearchResultItem[] = items.flatMap((item) => {\n const id = FrontendResourceUtils.getResourceObjectId(item, fieldIdentifier);\n if (!id) return [];\n const label = FrontendResourceUtils.computeFrontendResourceLabel({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resourceType: entry.resourceType as any,\n registry: currentRegistry,\n currentObject: item,\n t: tRef.current,\n }) ?? id;\n return [{\n id: `omnibox:${entry.resourceType}:${id}`,\n resourceType: entry.resourceType,\n record: item,\n label,\n keywords: baseKeywords,\n onExecute: () => navigateToRecord(entry.resourceType, id),\n }];\n });\n\n if (resultItems.length === 0) return null;\n return {\n category,\n label: resolveCategoryLabel(tComponentRef.current, category),\n displayMode,\n items: resultItems,\n };\n }));\n\n if (cancelled) return;\n setSearchResultGroups(groups.filter((group): group is CommandMenuSearchResultGroup => group !== null));\n setIsSearching(false);\n };\n\n omniboxTimeoutRef.current = setTimeout(() => {\n void runSearch();\n }, OMNIBOX_SEARCH_DEBOUNCE_MS);\n\n return () => {\n cancelled = true;\n if (omniboxTimeoutRef.current) {\n clearTimeout(omniboxTimeoutRef.current);\n omniboxTimeoutRef.current = null;\n }\n };\n }, [isOpen, searchQuery, shouldRunOmnibox, searchResourcesKey, buildOmniboxScopeIdentifiers, navigateToRecord]);\n\n // ===================================================================\n // Unified, ordered palette group list (records + commands, one axis)\n // ===================================================================\n //\n // A single ordering model: every renderable group (live record group +\n // static command-category group) is assigned ONE numeric `order` weight and\n // the merged list is sorted by it. Record groups take the low band (default\n // above commands, so live matches surface first while searching); the app\n // overrides a record group's slot via `CommandMenuSearchResource.order`.\n // Command categories keep their pre-existing relative sequence\n // (`categoryOrder`) inside the high band. The recent group is pinned\n // separately and is not part of this list.\n const recordOrderByCategory = useMemo(() => {\n const map = new Map<string, number>();\n (searchResources ?? []).forEach((entry, index) => {\n const category = entry.category ?? entry.resourceType;\n map.set(category, entry.order ?? RECORD_GROUP_ORDER_BASE + index);\n });\n return map;\n }, [searchResources]);\n\n const orderedGroups = useMemo((): CommandMenuPaletteGroup[] => {\n const entries: CommandMenuPaletteGroup[] = [];\n searchResultGroups.forEach((group, index) => {\n entries.push({\n kind: CommandMenuPaletteGroupKind.RECORDS,\n order: recordOrderByCategory.get(group.category) ?? RECORD_GROUP_ORDER_BASE + index,\n group,\n });\n });\n groupedItems.forEach((group, index) => {\n entries.push({\n kind: CommandMenuPaletteGroupKind.COMMANDS,\n order: COMMAND_GROUP_ORDER_BASE + index,\n group,\n });\n });\n // Stable sort by the single order axis (index tiebreak preserves the\n // per-source sequence when two groups share a weight).\n return entries\n .map((entry, index) => ({ entry, index }))\n .sort((a, b) => a.entry.order - b.entry.order || a.index - b.index)\n .map(({ entry }) => entry);\n }, [searchResultGroups, groupedItems, recordOrderByCategory]);\n\n return {\n isOpen,\n handleOpenChange,\n searchQuery,\n setSearchQuery,\n commandItems,\n groupedItems,\n recentItems,\n searchResultGroups,\n orderedGroups,\n isSearching,\n isNavigationLoading: !resolutionCtx,\n showRecent,\n showShortcuts,\n openShortcut,\n dialogWidth,\n };\n}\n"]}
1
+ {"version":3,"file":"useCommandMenuBehavior.js","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/useCommandMenuBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { FrontendComponentType } from '@wildo-ai/presets-components-models';\nimport { CoreResourceOperation } from '@wildo-ai/saas-models';\nimport { ForeignKeyDisplayMode } from '@wildo-ai/zod-decorators';\n\nimport {\n ApplicationLevelComponentType,\n HotkeyGroup,\n HotkeyScope,\n} from '~wildo-frontend-lib/core/config/app-level-components.frontend.schemas';\nimport { CommandMenuDisplayPolicy } from '~wildo-frontend-lib/core/config/app-level-components.frontend.schemas';\nimport { CommandBarPolicy } from '~wildo-frontend-lib/core/config/app-configuration-frontend.schemas';\nimport type { CommandMenuCommand, CommandMenuSearchResource } from '~wildo-frontend-lib/core/config/launcher-items.frontend.schemas';\nimport { useResourceRegistry } from '~wildo-frontend-lib/core/resources/useResourceRegistry';\nimport { useAppScopeSafe } from '~wildo-frontend-lib/core/scope/useAppScope';\nimport { ScopeUtilsService } from '~wildo-frontend-lib/core/scope/scope.utils.frontend.service';\nimport { frontendResourceUtils, FrontendResourceUtils } from '~wildo-frontend-lib/core/resources/frontend-resource.utils';\nimport {\n pickPreferredOperationForCoreSemantic,\n resolveEffectiveCoreOperationFromOperation,\n type ResourceOperationSemanticsLike,\n} from '~wildo-frontend-lib/core/resources/operation-semantics.frontend.utils';\nimport { extractErrorInfo } from '~wildo-frontend-lib/core/errors/errors.frontend.schemas';\nimport { LoggerFrontendService } from '~wildo-frontend-lib/core/monitoring/logger.frontend.service';\nimport {\n FrontendEvents,\n type FrontendEvent_HotkeyCommandMenuOpen,\n} from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\nimport {\n filterCommandMenuCommandsByRuntimeAvailability,\n useLauncherRuntimeAvailabilityContext,\n} from '~wildo-frontend-lib/core/navigation/launcher-runtime-availability';\nimport { NavigationUtils } from '~wildo-frontend-lib/core/navigation/navigation.utils';\nimport { resolveCommandMenuCommands, type ResolvedCommandMenuItem } from '~wildo-frontend-lib/core/navigation/launcher-resolution';\nimport { useLauncherResolutionContext } from '~wildo-frontend-lib/core/navigation/useLauncherResolutionContext';\nimport { useNavigationController } from '~wildo-frontend-lib/core/navigation/useNavigationController';\nimport { useUI } from '~wildo-frontend-lib/core/ui/useUI';\nimport { useHotkeyRegistry } from '~wildo-frontend-lib/core/hotkey/useHotkey';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\n\nimport { envLoader } from '~wildo-frontend-lib/core/runtime/env-variable-loader.frontend.service';\nimport type {\n CommandMenuBehavior,\n CommandMenuItem,\n CommandMenuGroup,\n CommandMenuSearchResultItem,\n CommandMenuSearchResultGroup,\n CommandMenuPaletteGroup,\n} from '~wildo-frontend-lib/core/app-shell/app-shell.schemas';\nimport { CommandMenuPaletteGroupKind } from '~wildo-frontend-lib/core/app-shell/app-shell.schemas';\n\nconst DEFAULT_CATEGORY_ORDER: readonly string[] = ['navigation', 'actions'];\n\n/**\n * Order weights for the SINGLE palette ordering axis. Record groups occupy the\n * low band (0..), static command-category groups the high band (1000..), so\n * live record matches surface ABOVE static commands by default while searching.\n * An app overrides per record group via `CommandMenuSearchResource.order`.\n */\nconst RECORD_GROUP_ORDER_BASE = 0;\nconst COMMAND_GROUP_ORDER_BASE = 1000;\n\n/** Omnibox record-search tuning — mirrors `useResourceSearch` (FK picker). */\nconst OMNIBOX_SEARCH_DEBOUNCE_MS = 300;\nconst OMNIBOX_MIN_SEARCH_CHARS = 2;\nconst OMNIBOX_DEFAULT_MAX_RESULTS = 5;\n\nconst omniboxLogger: LoggerFrontendService = LoggerFrontendService.getLogger();\n\n/**\n * Maps a command's core operation semantic to the command-menu component label\n * key holding that operation's LOCALIZED search synonyms (a comma-separated\n * list). `_MANY` variants share their base action's synonyms. Operations\n * without a meaningful synonym set (COUNT) are omitted — they contribute no\n * extra keywords and the command's localized label still matches.\n */\nconst OPERATION_KEYWORD_LABEL_KEY: Partial<Record<CoreResourceOperation, string>> = {\n [CoreResourceOperation.CREATE]: 'keywordsCreate',\n [CoreResourceOperation.CREATE_MANY]: 'keywordsCreate',\n [CoreResourceOperation.LIST]: 'keywordsList',\n [CoreResourceOperation.SEARCH]: 'keywordsSearch',\n [CoreResourceOperation.READ]: 'keywordsRead',\n [CoreResourceOperation.UPDATE]: 'keywordsUpdate',\n [CoreResourceOperation.UPDATE_MANY]: 'keywordsUpdate',\n [CoreResourceOperation.DELETE]: 'keywordsDelete',\n [CoreResourceOperation.DELETE_MANY]: 'keywordsDelete',\n};\n\ntype TComponentFn = (component: FrontendComponentType, key: string, params?: Record<string, string | number>) => string;\n\n/**\n * Resolve a command-menu component keyword label into its list of localized\n * synonyms. The label is authored (and translated) as a comma-separated string;\n * we split it into individual match terms. Fails OPEN to `[]` when the key is\n * not yet generated (`tComponent` returns the raw key path) so a missing\n * translation never injects the literal key path as a bogus keyword.\n */\nfunction resolveKeywordSynonyms(tComponent: TComponentFn, key: string): string[] {\n const componentType = FrontendComponentType.APPLICATION_LEVEL_COMMAND_MENU;\n const base = `components.${componentType}.${key}`;\n const resolved = tComponent(componentType, key);\n if (!resolved || resolved === base) return [];\n return resolved.split(',').map(term => term.trim()).filter(Boolean);\n}\n\n/** Localized verb synonyms for a resource-operation command's core semantic. */\nfunction resolveOperationKeywords(\n tComponent: TComponentFn,\n operation: ResourceOperationSemanticsLike | undefined,\n): string[] {\n if (!operation) return [];\n const coreOperation = resolveEffectiveCoreOperationFromOperation(operation);\n const key = coreOperation ? OPERATION_KEYWORD_LABEL_KEY[coreOperation] : undefined;\n return key ? resolveKeywordSynonyms(tComponent, key) : [];\n}\n\n/**\n * The category heading a person reads, from the label tree and nowhere else.\n *\n * This was `resolved === baseKey ? humanizeCategory(category) : resolved` — the exact shape\n * `.claude/rules/display-text-comes-from-i18n.md` names as forbidden, and the reason it is forbidden\n * is visible here: the formatter ran ONLY when the label was missing, which is precisely the case\n * somebody needs to notice. The palette read as finished in every locale, so the keys were never\n * authored and a French user was shown English produced by code — invisible to a translator, because\n * it was never in the tree at all.\n *\n * `tComponent` already answers with the KEY when it cannot resolve one, so returning its answer\n * unchanged IS the missing-looks-missing behaviour. A category with no label now shows its key,\n * which is what makes somebody author it.\n */\nfunction resolveCategoryLabel(\n tComponent: (component: FrontendComponentType, key: string, params?: Record<string, string | number>) => string,\n category: string,\n): string {\n return tComponent(FrontendComponentType.APPLICATION_LEVEL_COMMAND_MENU, category);\n}\n\nfunction isCommandMenuConfigObject(\n config: unknown,\n): config is {\n policy?: CommandBarPolicy;\n showRecent?: boolean;\n maxRecentItems?: number;\n showShortcuts?: boolean;\n openShortcut?: string;\n defaultCategory?: string;\n categoryOrder?: string[];\n commands?: CommandMenuCommand[];\n searchResources?: CommandMenuSearchResource[];\n dialogWidth?: string;\n} {\n return typeof config === 'object' && config !== null && !Array.isArray(config);\n}\n\n/** Default desktop max-width class for the palette dialog (see `dialogWidth`). */\nconst DEFAULT_COMMAND_MENU_DIALOG_WIDTH = 'sm:max-w-2xl';\n\n/**\n * Behavior hook for CommandMenu — manages open state (controlled or\n * uncontrolled), search, recent commands, hotkey subscription, and\n * navigation items mapped to command menu entries.\n */\nexport function useCommandMenuBehavior(\n externalIsOpen?: boolean,\n onOpenChange?: (open: boolean) => void,\n options: { listenForHotkeys?: boolean } = {},\n): CommandMenuBehavior {\n const resolutionCtx = useLauncherResolutionContext();\n const { navigate, navigateToResource } = useNavigationController();\n const { registry, doOperation } = useResourceRegistry();\n const appScope = useAppScopeSafe();\n const { appComponentsConfiguration } = useUI();\n const { on, emit } = useEventBus();\n const { register } = useHotkeyRegistry();\n const { t, tComponent, formatDate, formatDateTime } = useI18n({\n component: FrontendComponentType.APPLICATION_LEVEL_COMMAND_MENU,\n });\n\n const commandMenuConfig = appComponentsConfiguration?.[ApplicationLevelComponentType.COMMAND_MENU];\n const commandMenuObj = isCommandMenuConfigObject(commandMenuConfig) ? commandMenuConfig : undefined;\n const openShortcut = commandMenuObj?.openShortcut;\n const showRecent = commandMenuObj?.showRecent !== false;\n const maxRecentItems = commandMenuObj?.maxRecentItems ?? 5;\n const showShortcuts = commandMenuObj?.showShortcuts !== false;\n const defaultCategory = commandMenuObj?.defaultCategory ?? 'navigation';\n const categoryOrder = commandMenuObj?.categoryOrder ?? DEFAULT_CATEGORY_ORDER;\n const isOmnibox = commandMenuObj?.policy === CommandBarPolicy.OMNIBOX;\n const searchResources = commandMenuObj?.searchResources;\n const dialogWidth = commandMenuObj?.dialogWidth ?? DEFAULT_COMMAND_MENU_DIALOG_WIDTH;\n const runtimeAvailabilityContext = useLauncherRuntimeAvailabilityContext();\n const configCommands = useMemo(() => (\n filterCommandMenuCommandsByRuntimeAvailability(\n commandMenuObj?.commands,\n runtimeAvailabilityContext,\n )\n ), [commandMenuObj?.commands, runtimeAvailabilityContext]);\n\n const [internalIsOpen, setInternalIsOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [recentCommandIds, setRecentCommandIds] = useState<string[]>([]);\n\n const isControlled = externalIsOpen !== undefined && onOpenChange !== undefined;\n const isOpen = isControlled ? externalIsOpen : internalIsOpen;\n const isOpenRef = useRef(isOpen);\n isOpenRef.current = isOpen;\n const listenForHotkeys = options.listenForHotkeys !== false;\n\n const handleOpenChange = useCallback((open: boolean) => {\n if (isControlled && onOpenChange) {\n onOpenChange(open);\n } else {\n setInternalIsOpen(open);\n }\n if (!open) {\n setSearchQuery('');\n }\n }, [isControlled, onOpenChange]);\n\n useEffect(() => {\n if (!listenForHotkeys) return;\n const unsubscribe = on(FrontendEvents.HOTKEY_COMMAND_MENU_OPEN, () => {\n handleOpenChange(!isOpenRef.current);\n });\n return unsubscribe;\n }, [on, handleOpenChange, listenForHotkeys]);\n\n useEffect(() => {\n if (!listenForHotkeys) return;\n if (!openShortcut || commandMenuConfig === false) return;\n return register({\n id: 'app-command-menu-open-shortcut',\n shortcut: openShortcut,\n description: t('engine.hotkeys.commandMenuOpen'),\n scope: HotkeyScope.GLOBAL,\n group: HotkeyGroup.NAVIGATION,\n launcher: ApplicationLevelComponentType.COMMAND_MENU,\n preventDefault: true,\n handler: () => {\n emit(FrontendEvents.HOTKEY_COMMAND_MENU_OPEN, {} as FrontendEvent_HotkeyCommandMenuOpen);\n },\n });\n }, [openShortcut, commandMenuConfig, register, emit, t, listenForHotkeys]);\n\n const resolvedCommands = useMemo((): ResolvedCommandMenuItem[] => {\n if (!configCommands || !resolutionCtx) return [];\n return resolveCommandMenuCommands(configCommands, resolutionCtx);\n }, [configCommands, resolutionCtx]);\n\n const commandItems = useMemo((): CommandMenuItem[] => {\n return resolvedCommands\n .filter(cmd => {\n const dp = cmd.displayPolicy;\n if (dp === undefined || dp === CommandMenuDisplayPolicy.ALWAYS) return true;\n if (dp === CommandMenuDisplayPolicy.NEVER) return false;\n if (dp === CommandMenuDisplayPolicy.RECENT) return true;\n if (dp === CommandMenuDisplayPolicy.CONTEXTUAL) {\n if (envLoader.isDevelopment()) {\n console.warn(`[CommandMenu] CONTEXTUAL displayPolicy requires a contextual source and is excluded from the global app-level menu for \"${cmd.id}\"`);\n }\n return false;\n }\n if (envLoader.isDevelopment()) {\n console.warn(`[CommandMenu] Unknown displayPolicy \"${dp}\" for command \"${cmd.id}\" — treating as ALWAYS`);\n }\n return true;\n })\n .map(cmd => ({\n id: cmd.id,\n label: cmd.label,\n shortcut: cmd.shortcut ?? '',\n icon: cmd.icon ?? null,\n category: cmd.category ?? defaultCategory,\n // Localized operation-verb synonyms (translated) + any app-specific\n // literal supplements. The command's localized `label` covers the noun.\n keywords: [\n ...resolveOperationKeywords(tComponent, cmd.operation),\n ...(cmd.searchKeywords ?? []),\n ],\n displayPolicy: cmd.displayPolicy,\n onExecute: () => {\n handleOpenChange(false);\n setRecentCommandIds(prev => {\n const next = [cmd.id, ...prev.filter(id => id !== cmd.id)];\n return next.slice(0, maxRecentItems);\n });\n if (cmd.urlPath) {\n NavigationUtils.dispatchNavigationForResolvedTarget(navigate, cmd, ApplicationLevelComponentType.COMMAND_MENU);\n }\n },\n }));\n }, [resolvedCommands, handleOpenChange, navigate, maxRecentItems, defaultCategory, tComponent]);\n\n const groupedItems = useMemo((): CommandMenuGroup[] => {\n const categoryMap = new Map<string, CommandMenuItem[]>();\n\n for (const item of commandItems) {\n if (item.displayPolicy === CommandMenuDisplayPolicy.RECENT) continue;\n const category = item.category;\n const existing = categoryMap.get(category) ?? [];\n existing.push(item);\n categoryMap.set(category, existing);\n }\n\n for (const items of categoryMap.values()) {\n items.sort((a, b) => a.label.localeCompare(b.label));\n }\n\n const ordered: CommandMenuGroup[] = [];\n for (const cat of categoryOrder) {\n const items = categoryMap.get(cat);\n if (items) {\n ordered.push({ category: cat, label: resolveCategoryLabel(tComponent, cat), items });\n categoryMap.delete(cat);\n }\n }\n for (const [cat, items] of categoryMap.entries()) {\n ordered.push({ category: cat, label: resolveCategoryLabel(tComponent, cat), items });\n }\n\n return ordered;\n }, [commandItems, categoryOrder, tComponent]);\n\n const recentItems = useMemo(() => {\n if (recentCommandIds.length === 0) return [];\n const itemById = new Map(commandItems.map(item => [item.id, item]));\n return recentCommandIds.map(id => itemById.get(id)).filter(Boolean) as CommandMenuItem[];\n }, [commandItems, recentCommandIds]);\n\n // ===================================================================\n // Omnibox record-search layer (policy: OMNIBOX)\n // ===================================================================\n //\n // A live, debounced query against each configured resource's addressable\n // SEARCH operation (falling back to LIST). This is the ONLY query-driven data\n // path in the command menu — static commands remain a synchronous, config-only\n // source. Scope + navigation reuse the proven `SidebarResourceBrowser`\n // precedent: the current org/user/app scope is projected into\n // `contextualParameters` (and `ScopedResourceRegistryProvider` additionally\n // injects the field-identifier-keyed org id onto every `doOperation`), and a\n // selection navigates to the record's addressable READ view.\n\n const [searchResultGroups, setSearchResultGroups] = useState<CommandMenuSearchResultGroup[]>([]);\n const [isSearching, setIsSearching] = useState(false);\n\n // Read mutable dependencies through refs so the debounced fetch effect only\n // re-fires on a genuine (isOpen, query, policy, resource-set) change — never\n // on incidental identity churn of the registry / scope / navigation handles\n // (see the react-effect-identity-churn discipline).\n const doOperationRef = useRef(doOperation);\n doOperationRef.current = doOperation;\n const registryRef = useRef(registry);\n registryRef.current = registry;\n const appScopeRef = useRef(appScope);\n appScopeRef.current = appScope;\n const navigateToResourceRef = useRef(navigateToResource);\n navigateToResourceRef.current = navigateToResource;\n const handleOpenChangeRef = useRef(handleOpenChange);\n handleOpenChangeRef.current = handleOpenChange;\n const tRef = useRef(t);\n tRef.current = t;\n const formatDateRef = useRef(formatDate);\n formatDateRef.current = formatDate;\n const formatDateTimeRef = useRef(formatDateTime);\n formatDateTimeRef.current = formatDateTime;\n const tComponentRef = useRef(tComponent);\n tComponentRef.current = tComponent;\n const searchResourcesRef = useRef(searchResources);\n searchResourcesRef.current = searchResources;\n const omniboxTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n /**\n * Project the current primary scope (user/org/app/anon) into the resource's\n * scope-filtered context identifiers — the same shape `SidebarResourceBrowser`\n * passes to `doOperation`. Keyed by resource type; the scoped provider maps\n * the org id to its field identifier (`organizationId`) on the wire.\n */\n const buildOmniboxScopeIdentifiers = useCallback((resourcePrimaryScope: unknown): Record<string, string> => {\n const scope = appScopeRef.current;\n const primaryScopeInitiatorIds = ScopeUtilsService.buildInitiatorIds({\n userId: scope?.currentUserId,\n organizationId: scope?.currentOrganizationId,\n applicationId: scope?.currentApplicationId,\n anonymousUserId: scope?.currentAnonymousUserId,\n });\n return {\n ...ScopeUtilsService.primaryScopeToContextIdentifiers(\n primaryScopeInitiatorIds,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resourcePrimaryScope as any,\n ),\n ...(scope?.buildContextResourceIdentifiers() ?? {}),\n };\n }, []);\n\n /** Navigate to a matched record's addressable READ view, then close the menu. */\n const navigateToRecord = useCallback((resourceType: string, recordId: string): void => {\n const currentRegistry = registryRef.current;\n const resourceConfig = currentRegistry.resourceConfigurations[resourceType];\n if (!resourceConfig) return;\n\n const readOperation = pickPreferredOperationForCoreSemantic(\n resourceConfig.operations ?? [],\n CoreResourceOperation.READ,\n );\n if (!readOperation) {\n omniboxLogger.warn('[CommandMenu] Omnibox result has no addressable READ operation', { resourceType, recordId });\n return;\n }\n\n const contextIdentifiers: Record<string, string> = {\n ...buildOmniboxScopeIdentifiers(resourceConfig.resourcePrimaryScope),\n [resourceType]: recordId,\n };\n const parentResourcesRequirements = frontendResourceUtils.buildParentResourcesRequirements(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resourceType as any,\n contextIdentifiers,\n currentRegistry,\n );\n const resourceContext = frontendResourceUtils.createFrontendResourceOperationContextFromOperation({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resourceType: resourceType as any,\n operation: readOperation,\n contextResourceIdentifiers: contextIdentifiers,\n parentResourcesRequirements,\n });\n\n handleOpenChangeRef.current(false);\n navigateToResourceRef.current(\n resourceContext,\n NavigationUtils.createAppLevelInitiator(ApplicationLevelComponentType.COMMAND_MENU),\n );\n }, [buildOmniboxScopeIdentifiers]);\n\n // Stable key over the configured resource set — the fetch effect re-arms only\n // when the app changes which resources are searchable, not per render.\n const searchResourcesKey = useMemo(\n () => JSON.stringify(searchResources ?? []),\n [searchResources],\n );\n\n const shouldRunOmnibox = isOmnibox && !!searchResources && searchResources.length > 0;\n\n useEffect(() => {\n if (omniboxTimeoutRef.current) {\n clearTimeout(omniboxTimeoutRef.current);\n omniboxTimeoutRef.current = null;\n }\n\n // Below threshold, closed, or omnibox disabled → no query-driven results.\n if (!isOpen || !shouldRunOmnibox || searchQuery.trim().length < OMNIBOX_MIN_SEARCH_CHARS) {\n setSearchResultGroups([]);\n setIsSearching(false);\n return;\n }\n\n let cancelled = false;\n const query = searchQuery.trim();\n setIsSearching(true);\n\n const runSearch = async (): Promise<void> => {\n const currentRegistry = registryRef.current;\n const resources = searchResourcesRef.current ?? [];\n\n const groups = await Promise.all(resources.map(async (entry): Promise<CommandMenuSearchResultGroup | null> => {\n const resourceConfig = currentRegistry.resourceConfigurations[entry.resourceType];\n if (!resourceConfig) {\n omniboxLogger.warn('[CommandMenu] Omnibox searchResource not in registry — skipped', { resourceType: entry.resourceType });\n return null;\n }\n\n let operationPath: string;\n try {\n operationPath = FrontendResourceUtils.buildForeignKeySearchOperationPath(entry.resourceType, currentRegistry);\n } catch {\n omniboxLogger.warn('[CommandMenu] Omnibox resource has no searchable SEARCH/LIST operation — skipped', { resourceType: entry.resourceType });\n return null;\n }\n\n const searchParams = FrontendResourceUtils.buildForeignKeySearchParams(\n query,\n entry.maxResults ?? OMNIBOX_DEFAULT_MAX_RESULTS,\n );\n\n let result: unknown;\n try {\n result = await doOperationRef.current(operationPath, {\n contextualParameters: buildOmniboxScopeIdentifiers(resourceConfig.resourcePrimaryScope),\n queryParameters: searchParams.queryParameters,\n });\n } catch (err) {\n omniboxLogger.error('[CommandMenu] Omnibox search failed', { resourceType: entry.resourceType, ...extractErrorInfo(err), error: err });\n return null;\n }\n\n let items: Record<string, unknown>[] = [];\n if (Array.isArray(result)) {\n items = result as Record<string, unknown>[];\n } else if (result && typeof result === 'object') {\n const resultObj = result as { data?: Record<string, unknown>[]; items?: Record<string, unknown>[] };\n items = resultObj.data ?? resultObj.items ?? [];\n }\n if (items.length === 0) return null;\n\n const fieldIdentifier = FrontendResourceUtils.getResourceFieldIdentifierForType(entry.resourceType, currentRegistry);\n const category = entry.category ?? entry.resourceType;\n // Default to the richer SUMMARY view (the resource's summary card);\n // apps opt out to a one-line LABEL per resource. `ID` collapses to LABEL.\n const displayMode = entry.resultDisplay === ForeignKeyDisplayMode.LABEL\n || entry.resultDisplay === ForeignKeyDisplayMode.ID\n ? ForeignKeyDisplayMode.LABEL\n : ForeignKeyDisplayMode.SUMMARY;\n // The raw query is always carried as a keyword so cmdk's client-side\n // filter never drops a legitimate server hit (matches may be on a field\n // absent from the label, e.g. `description`). We also fold in the\n // LOCALIZED \"search\" verb synonyms so typing a translated synonym keeps\n // the group visible, plus any app-specific literal supplements.\n const baseKeywords = [\n query,\n ...resolveKeywordSynonyms(tComponentRef.current, 'keywordsSearch'),\n ...(entry.searchKeywords ?? []),\n ];\n\n const resultItems: CommandMenuSearchResultItem[] = items.flatMap((item) => {\n const id = FrontendResourceUtils.getResourceObjectId(item, fieldIdentifier);\n if (!id) return [];\n const label = FrontendResourceUtils.computeFrontendResourceLabel({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resourceType: entry.resourceType as any,\n registry: currentRegistry,\n currentObject: item,\n t: tRef.current,\n formatDate: formatDateRef.current,\n formatDateTime: formatDateTimeRef.current,\n }) ?? id;\n return [{\n id: `omnibox:${entry.resourceType}:${id}`,\n resourceType: entry.resourceType,\n record: item,\n label,\n keywords: baseKeywords,\n onExecute: () => navigateToRecord(entry.resourceType, id),\n }];\n });\n\n if (resultItems.length === 0) return null;\n return {\n category,\n label: resolveCategoryLabel(tComponentRef.current, category),\n displayMode,\n items: resultItems,\n };\n }));\n\n if (cancelled) return;\n setSearchResultGroups(groups.filter((group): group is CommandMenuSearchResultGroup => group !== null));\n setIsSearching(false);\n };\n\n omniboxTimeoutRef.current = setTimeout(() => {\n void runSearch();\n }, OMNIBOX_SEARCH_DEBOUNCE_MS);\n\n return () => {\n cancelled = true;\n if (omniboxTimeoutRef.current) {\n clearTimeout(omniboxTimeoutRef.current);\n omniboxTimeoutRef.current = null;\n }\n };\n }, [isOpen, searchQuery, shouldRunOmnibox, searchResourcesKey, buildOmniboxScopeIdentifiers, navigateToRecord]);\n\n // ===================================================================\n // Unified, ordered palette group list (records + commands, one axis)\n // ===================================================================\n //\n // A single ordering model: every renderable group (live record group +\n // static command-category group) is assigned ONE numeric `order` weight and\n // the merged list is sorted by it. Record groups take the low band (default\n // above commands, so live matches surface first while searching); the app\n // overrides a record group's slot via `CommandMenuSearchResource.order`.\n // Command categories keep their pre-existing relative sequence\n // (`categoryOrder`) inside the high band. The recent group is pinned\n // separately and is not part of this list.\n const recordOrderByCategory = useMemo(() => {\n const map = new Map<string, number>();\n (searchResources ?? []).forEach((entry, index) => {\n const category = entry.category ?? entry.resourceType;\n map.set(category, entry.order ?? RECORD_GROUP_ORDER_BASE + index);\n });\n return map;\n }, [searchResources]);\n\n const orderedGroups = useMemo((): CommandMenuPaletteGroup[] => {\n const entries: CommandMenuPaletteGroup[] = [];\n searchResultGroups.forEach((group, index) => {\n entries.push({\n kind: CommandMenuPaletteGroupKind.RECORDS,\n order: recordOrderByCategory.get(group.category) ?? RECORD_GROUP_ORDER_BASE + index,\n group,\n });\n });\n groupedItems.forEach((group, index) => {\n entries.push({\n kind: CommandMenuPaletteGroupKind.COMMANDS,\n order: COMMAND_GROUP_ORDER_BASE + index,\n group,\n });\n });\n // Stable sort by the single order axis (index tiebreak preserves the\n // per-source sequence when two groups share a weight).\n return entries\n .map((entry, index) => ({ entry, index }))\n .sort((a, b) => a.entry.order - b.entry.order || a.index - b.index)\n .map(({ entry }) => entry);\n }, [searchResultGroups, groupedItems, recordOrderByCategory]);\n\n return {\n isOpen,\n handleOpenChange,\n searchQuery,\n setSearchQuery,\n commandItems,\n groupedItems,\n recentItems,\n searchResultGroups,\n orderedGroups,\n isSearching,\n isNavigationLoading: !resolutionCtx,\n showRecent,\n showShortcuts,\n openShortcut,\n dialogWidth,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"useMenuBarBehavior.d.ts","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/useMenuBarBehavior.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sDAAsD,CAAC;AAc5F,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,eAAe,CAqG3F"}
1
+ {"version":3,"file":"useMenuBarBehavior.d.ts","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/useMenuBarBehavior.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sDAAsD,CAAC;AAc5F,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,eAAe,CAwG3F"}
@@ -55,7 +55,9 @@ export function useMenuBarBehavior(options = {}) {
55
55
  if (!isMenubarConfigObject(config))
56
56
  return [];
57
57
  return resolveHostedComponents(ApplicationLevelComponentType.MENUBAR, config.hostedComponents, appComponentsConfiguration, currentBreakpoint, HorizontalPlacement.START, navigationLayout);
58
- }, [appComponentsConfiguration, config, currentBreakpoint]);
58
+ // `navigationLayout` decides whether the shell may draw the back control (`backAffordanceOwner`),
59
+ // so a layout change must re-resolve the hosted set. The sidebar's equivalent memo already lists it.
60
+ }, [appComponentsConfiguration, config, currentBreakpoint, navigationLayout]);
59
61
  const configItems = useMemo(() => (isMenubarConfigObject(config)
60
62
  ? filterMenubarItemsByRuntimeAvailability(config.items, runtimeAvailabilityContext)
61
63
  : undefined), [config, runtimeAvailabilityContext]);
@@ -82,6 +84,7 @@ export function useMenuBarBehavior(options = {}) {
82
84
  icon: item.icon,
83
85
  group: item.group,
84
86
  isActive: (activeUrlPath !== undefined && item.urlPath === activeUrlPath) || isHomeItem(item),
87
+ ...(item.notificationBadgeRef ? { notificationBadgeRef: item.notificationBadgeRef } : {}),
85
88
  onExecute: () => {
86
89
  NavigationUtils.dispatchNavigationForResolvedTarget(navigate, item, ApplicationLevelComponentType.MENUBAR);
87
90
  },
@@ -1 +1 @@
1
- {"version":3,"file":"useMenuBarBehavior.js","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/useMenuBarBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import { useMemo } from 'react';\n\nimport { ApplicationLevelComponentType } from '~wildo-frontend-lib/core/config/app-level-components.frontend.schemas';\nimport type {\n MenubarHostedComponent,\n MenubarLauncherItem,\n} from '~wildo-frontend-lib/core/config/launcher-items.frontend.schemas';\nimport { ViewportBreakpoint } from '@wildo-ai/zod-decorators';\nimport { HorizontalPlacement } from '@wildo-ai/presets-components-models';\nimport type { BrandAssetTheme } from '@wildo-ai/saas-models';\nimport { useBrandIdentity } from '~wildo-frontend-lib/core/branding/useBrandIdentity';\nimport {\n filterMenubarItemsByRuntimeAvailability,\n useLauncherRuntimeAvailabilityContext,\n} from '~wildo-frontend-lib/core/navigation/launcher-runtime-availability';\nimport { resolveMenubarContent } from '~wildo-frontend-lib/core/navigation/launcher-resolution';\nimport { NavigationUtils } from '~wildo-frontend-lib/core/navigation/navigation.utils';\nimport { useLauncherResolutionContext } from '~wildo-frontend-lib/core/navigation/useLauncherResolutionContext';\nimport { useNavigationController } from '~wildo-frontend-lib/core/navigation/useNavigationController';\nimport { useUI } from '~wildo-frontend-lib/core/ui/useUI';\nimport { useNavigationBehaviors } from './useNavigationBehaviors';\n\nimport { mapApplicationLevelToFrontendComponentType } from '~wildo-frontend-lib/core/app-shell/app-shell.utils';\nimport { resolveHostedComponents } from '~wildo-frontend-lib/core/app-shell/hosted-components.utils';\nimport type { MenuBarBehavior } from '~wildo-frontend-lib/core/app-shell/app-shell.schemas';\n\nfunction isMenubarConfigObject(\n config: unknown,\n): config is {\n displayPolicy?: string;\n hostedComponents?: MenubarHostedComponent[];\n items?: MenubarLauncherItem[];\n brandHeader?: boolean;\n brandMarkTheme?: BrandAssetTheme;\n} {\n return typeof config === 'object' && config !== null && !Array.isArray(config);\n}\n\nexport interface UseMenuBarBehaviorOptions {\n mode?: 'FIXED' | 'OVERLAY';\n}\n\n/**\n * Behavior hook for the MenuBar.\n *\n * Hosted components still follow the container inversion model via\n * `hostedComponents`, while declarative `items` are filtered by\n * `runtimeAvailability`, resolved through the launcher pipeline, then exposed\n * with executable callbacks for the preset layer to render.\n *\n * Each item also carries `isActive`, elected the way the sidebar elects its own\n * (`useNavigationBehaviors().isNavigationItemActive` narrowed by\n * `getMostSpecificActiveRoute`): the item whose route is the most specific match\n * of the current pathname, and no other. Until 2026-09-22 the resolved `urlPath`\n * was dropped here, so the preset had nothing to compare against the route and a\n * menubar could not say which destination was current — invisible while every\n * application declared `items: []`, and the first thing a menubar-only shell\n * (the application-creation workbench, #1454) needed.\n *\n * Dynamic component registry resolution remains in the preset layer.\n */\nexport function useMenuBarBehavior(options: UseMenuBarBehaviorOptions = {}): MenuBarBehavior {\n const { mode } = options;\n const { UIConfig, appComponentsConfiguration, navigationLayout, homeDefinition } = useUI();\n const resolutionCtx = useLauncherResolutionContext();\n const { navigate } = useNavigationController();\n const runtimeAvailabilityContext = useLauncherRuntimeAvailabilityContext();\n const { isNavigationItemActive: isItemActiveByRoute, isHomeActive, handleHomeClick } = useNavigationBehaviors();\n const homeCompositeViewRef = homeDefinition?.compositeViewReference;\n\n\n const config = appComponentsConfiguration?.[ApplicationLevelComponentType.MENUBAR];\n const currentBreakpoint = UIConfig?.currentBreakpoint;\n\n /*\n * Read unconditionally (rules of hooks), EXPOSED only when the config opted in — the sidebar's\n * own discipline, so a preset cannot render a mark on a surface that never asked for one.\n */\n const brandMarkTheme = isMenubarConfigObject(config) ? config.brandMarkTheme : undefined;\n const brandIdentity = useBrandIdentity({ theme: brandMarkTheme });\n const brandHeader = isMenubarConfigObject(config) && config.brandHeader === true ? brandIdentity : undefined;\n\n const containerComponents = useMemo(() => {\n if (!isMenubarConfigObject(config)) return [];\n return resolveHostedComponents(\n ApplicationLevelComponentType.MENUBAR,\n config.hostedComponents,\n appComponentsConfiguration as Record<string, unknown> | undefined,\n currentBreakpoint,\n HorizontalPlacement.START,\n navigationLayout,\n );\n }, [appComponentsConfiguration, config, currentBreakpoint]);\n\n const configItems = useMemo(() => (\n isMenubarConfigObject(config)\n ? filterMenubarItemsByRuntimeAvailability(config.items, runtimeAvailabilityContext)\n : undefined\n ), [config, runtimeAvailabilityContext]);\n\n const items = useMemo((): MenuBarBehavior['items'] => {\n if (!resolutionCtx || !configItems?.length) {\n return [];\n }\n\n const resolved = resolveMenubarContent(undefined, configItems, resolutionCtx);\n\n /*\n * ONE active item. `isActiveRoute` marks a parent route active on a child URL too, so a bar\n * listing both would highlight both; the most specific route wins, exactly as in the sidebar.\n */\n const activeUrlPath = NavigationUtils.getMostSpecificActiveRoute(\n resolved.items.map(item => item.urlPath),\n isItemActiveByRoute,\n );\n /*\n * HOME renders a composite IN PLACE at `/` when `homeDefinition.compositeViewReference` names\n * one, and the item pointing at that same composite carries `/composite/<ref>` — a different\n * path for the same surface. On the home route that item is the current destination, and no\n * route comparison can see it; the home definition can.\n */\n const isHomeItem = (item: { viewRef?: string }): boolean =>\n isHomeActive && homeCompositeViewRef !== undefined && item.viewRef === homeCompositeViewRef;\n\n return resolved.items.map(item => ({\n id: item.id,\n label: item.label,\n icon: item.icon,\n group: item.group,\n isActive: (activeUrlPath !== undefined && item.urlPath === activeUrlPath) || isHomeItem(item),\n onExecute: () => {\n NavigationUtils.dispatchNavigationForResolvedTarget(\n navigate,\n item,\n ApplicationLevelComponentType.MENUBAR,\n );\n },\n }));\n }, [configItems, resolutionCtx, navigate, isItemActiveByRoute, isHomeActive, homeCompositeViewRef]);\n\n const menubarConfig = useMemo(() => {\n const menubarMode = mode\n || (isMenubarConfigObject(config) ? config.displayPolicy ?? 'FIXED' : typeof config === 'string' ? config : 'FIXED');\n const isOverlay = menubarMode === 'OVERLAY';\n const isMobile = currentBreakpoint === ViewportBreakpoint.MOBILE;\n\n return {\n mode: menubarMode,\n isOverlay,\n showMobileLayout: isMobile && isOverlay,\n };\n }, [config, mode, currentBreakpoint]);\n\n return {\n containerComponents,\n brandHeader,\n isHomeActive,\n handleHomeClick,\n items,\n menubarConfig,\n mapToFrontendComponentType: mapApplicationLevelToFrontendComponentType,\n };\n}\n"]}
1
+ {"version":3,"file":"useMenuBarBehavior.js","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/useMenuBarBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import { useMemo } from 'react';\n\nimport { ApplicationLevelComponentType } from '~wildo-frontend-lib/core/config/app-level-components.frontend.schemas';\nimport type {\n MenubarHostedComponent,\n MenubarLauncherItem,\n} from '~wildo-frontend-lib/core/config/launcher-items.frontend.schemas';\nimport { ViewportBreakpoint } from '@wildo-ai/zod-decorators';\nimport { HorizontalPlacement } from '@wildo-ai/presets-components-models';\nimport type { BrandAssetTheme } from '@wildo-ai/saas-models';\nimport { useBrandIdentity } from '~wildo-frontend-lib/core/branding/useBrandIdentity';\nimport {\n filterMenubarItemsByRuntimeAvailability,\n useLauncherRuntimeAvailabilityContext,\n} from '~wildo-frontend-lib/core/navigation/launcher-runtime-availability';\nimport { resolveMenubarContent } from '~wildo-frontend-lib/core/navigation/launcher-resolution';\nimport { NavigationUtils } from '~wildo-frontend-lib/core/navigation/navigation.utils';\nimport { useLauncherResolutionContext } from '~wildo-frontend-lib/core/navigation/useLauncherResolutionContext';\nimport { useNavigationController } from '~wildo-frontend-lib/core/navigation/useNavigationController';\nimport { useUI } from '~wildo-frontend-lib/core/ui/useUI';\nimport { useNavigationBehaviors } from './useNavigationBehaviors';\n\nimport { mapApplicationLevelToFrontendComponentType } from '~wildo-frontend-lib/core/app-shell/app-shell.utils';\nimport { resolveHostedComponents } from '~wildo-frontend-lib/core/app-shell/hosted-components.utils';\nimport type { MenuBarBehavior } from '~wildo-frontend-lib/core/app-shell/app-shell.schemas';\n\nfunction isMenubarConfigObject(\n config: unknown,\n): config is {\n displayPolicy?: string;\n hostedComponents?: MenubarHostedComponent[];\n items?: MenubarLauncherItem[];\n brandHeader?: boolean;\n brandMarkTheme?: BrandAssetTheme;\n} {\n return typeof config === 'object' && config !== null && !Array.isArray(config);\n}\n\nexport interface UseMenuBarBehaviorOptions {\n mode?: 'FIXED' | 'OVERLAY';\n}\n\n/**\n * Behavior hook for the MenuBar.\n *\n * Hosted components still follow the container inversion model via\n * `hostedComponents`, while declarative `items` are filtered by\n * `runtimeAvailability`, resolved through the launcher pipeline, then exposed\n * with executable callbacks for the preset layer to render.\n *\n * Each item also carries `isActive`, elected the way the sidebar elects its own\n * (`useNavigationBehaviors().isNavigationItemActive` narrowed by\n * `getMostSpecificActiveRoute`): the item whose route is the most specific match\n * of the current pathname, and no other. Until 2026-09-22 the resolved `urlPath`\n * was dropped here, so the preset had nothing to compare against the route and a\n * menubar could not say which destination was current — invisible while every\n * application declared `items: []`, and the first thing a menubar-only shell\n * (the application-creation workbench, #1454) needed.\n *\n * Dynamic component registry resolution remains in the preset layer.\n */\nexport function useMenuBarBehavior(options: UseMenuBarBehaviorOptions = {}): MenuBarBehavior {\n const { mode } = options;\n const { UIConfig, appComponentsConfiguration, navigationLayout, homeDefinition } = useUI();\n const resolutionCtx = useLauncherResolutionContext();\n const { navigate } = useNavigationController();\n const runtimeAvailabilityContext = useLauncherRuntimeAvailabilityContext();\n const { isNavigationItemActive: isItemActiveByRoute, isHomeActive, handleHomeClick } = useNavigationBehaviors();\n const homeCompositeViewRef = homeDefinition?.compositeViewReference;\n\n\n const config = appComponentsConfiguration?.[ApplicationLevelComponentType.MENUBAR];\n const currentBreakpoint = UIConfig?.currentBreakpoint;\n\n /*\n * Read unconditionally (rules of hooks), EXPOSED only when the config opted in — the sidebar's\n * own discipline, so a preset cannot render a mark on a surface that never asked for one.\n */\n const brandMarkTheme = isMenubarConfigObject(config) ? config.brandMarkTheme : undefined;\n const brandIdentity = useBrandIdentity({ theme: brandMarkTheme });\n const brandHeader = isMenubarConfigObject(config) && config.brandHeader === true ? brandIdentity : undefined;\n\n const containerComponents = useMemo(() => {\n if (!isMenubarConfigObject(config)) return [];\n return resolveHostedComponents(\n ApplicationLevelComponentType.MENUBAR,\n config.hostedComponents,\n appComponentsConfiguration as Record<string, unknown> | undefined,\n currentBreakpoint,\n HorizontalPlacement.START,\n navigationLayout,\n );\n // `navigationLayout` decides whether the shell may draw the back control (`backAffordanceOwner`),\n // so a layout change must re-resolve the hosted set. The sidebar's equivalent memo already lists it.\n }, [appComponentsConfiguration, config, currentBreakpoint, navigationLayout]);\n\n const configItems = useMemo(() => (\n isMenubarConfigObject(config)\n ? filterMenubarItemsByRuntimeAvailability(config.items, runtimeAvailabilityContext)\n : undefined\n ), [config, runtimeAvailabilityContext]);\n\n const items = useMemo((): MenuBarBehavior['items'] => {\n if (!resolutionCtx || !configItems?.length) {\n return [];\n }\n\n const resolved = resolveMenubarContent(undefined, configItems, resolutionCtx);\n\n /*\n * ONE active item. `isActiveRoute` marks a parent route active on a child URL too, so a bar\n * listing both would highlight both; the most specific route wins, exactly as in the sidebar.\n */\n const activeUrlPath = NavigationUtils.getMostSpecificActiveRoute(\n resolved.items.map(item => item.urlPath),\n isItemActiveByRoute,\n );\n /*\n * HOME renders a composite IN PLACE at `/` when `homeDefinition.compositeViewReference` names\n * one, and the item pointing at that same composite carries `/composite/<ref>` — a different\n * path for the same surface. On the home route that item is the current destination, and no\n * route comparison can see it; the home definition can.\n */\n const isHomeItem = (item: { viewRef?: string }): boolean =>\n isHomeActive && homeCompositeViewRef !== undefined && item.viewRef === homeCompositeViewRef;\n\n return resolved.items.map(item => ({\n id: item.id,\n label: item.label,\n icon: item.icon,\n group: item.group,\n isActive: (activeUrlPath !== undefined && item.urlPath === activeUrlPath) || isHomeItem(item),\n ...(item.notificationBadgeRef ? { notificationBadgeRef: item.notificationBadgeRef } : {}),\n onExecute: () => {\n NavigationUtils.dispatchNavigationForResolvedTarget(\n navigate,\n item,\n ApplicationLevelComponentType.MENUBAR,\n );\n },\n }));\n }, [configItems, resolutionCtx, navigate, isItemActiveByRoute, isHomeActive, homeCompositeViewRef]);\n\n const menubarConfig = useMemo(() => {\n const menubarMode = mode\n || (isMenubarConfigObject(config) ? config.displayPolicy ?? 'FIXED' : typeof config === 'string' ? config : 'FIXED');\n const isOverlay = menubarMode === 'OVERLAY';\n const isMobile = currentBreakpoint === ViewportBreakpoint.MOBILE;\n\n return {\n mode: menubarMode,\n isOverlay,\n showMobileLayout: isMobile && isOverlay,\n };\n }, [config, mode, currentBreakpoint]);\n\n return {\n containerComponents,\n brandHeader,\n isHomeActive,\n handleHomeClick,\n items,\n menubarConfig,\n mapToFrontendComponentType: mapApplicationLevelToFrontendComponentType,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"useMenuUserOrgBehavior.d.ts","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/useMenuUserOrgBehavior.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,6BAA6B,EAAE,MAAM,uEAAuE,CAAC;AACtH,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAqB7F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sDAAsD,CAAC;AAsDhG;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,aAAa,CAAC,EAAE,6BAA6B,EAC7C,kBAAkB,CAAC,EAAE,mBAAmB,GAAG,iBAAiB,GAC3D,mBAAmB,CAqMrB"}
1
+ {"version":3,"file":"useMenuUserOrgBehavior.d.ts","sourceRoot":"","sources":["../../../../../../src/components/navigation/app-level/useMenuUserOrgBehavior.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,6BAA6B,EAAE,MAAM,uEAAuE,CAAC;AACtH,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAqB7F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sDAAsD,CAAC;AAsDhG;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,aAAa,CAAC,EAAE,6BAA6B,EAC7C,kBAAkB,CAAC,EAAE,mBAAmB,GAAG,iBAAiB,GAC3D,mBAAmB,CAmNrB"}
@@ -15,7 +15,7 @@ import { useResourceRegistry } from '../../../core/resources/useResourceRegistry
15
15
  import { FrontendResourceUtils } from '../../../core/resources/frontend-resource.utils.js';
16
16
  import { buildResourceFileServeBaseUrl, buildFileServeThumbnailUrl } from '../../../core/resources/file-serve-url.frontend.utils.js';
17
17
  import { useAuthedFileObjectUrl } from '../../../core/resources/useAuthedFileObjectUrl.frontend.hook.js';
18
- import { CoreResourceType } from '@wildo-ai/saas-models';
18
+ import { CoreResourceType, isServiceProviderMembership } from '@wildo-ai/saas-models';
19
19
  import { envLoader } from '../../../core/runtime/env-variable-loader.frontend.service.js';
20
20
  import { CommonRoutePaths } from '../../../core/runtime/routes.frontend.definitions.js';
21
21
  /**
@@ -186,6 +186,19 @@ export function useMenuUserOrgBehavior(containerType, containerPlacement) {
186
186
  }, [registry, user, userProfile, avatarFile?.fileId]);
187
187
  const avatarUrl = useAuthedFileObjectUrl(avatarServeUrl) ?? undefined;
188
188
  const email = user?.email ?? '';
189
+ // The client organizations this person works in through a service firm (#1597), keyed to the firm's name
190
+ // the membership recorded. Read from the memberships the user context already carries — no request.
191
+ const providerNameByOrganizationId = useMemo(() => {
192
+ const byOrganization = new Map();
193
+ for (const membership of user?.organizationMembers ?? []) {
194
+ if (!isServiceProviderMembership(membership))
195
+ continue;
196
+ const firmName = membership.providerOrganizationName;
197
+ if (typeof firmName === 'string' && firmName.length > 0)
198
+ byOrganization.set(String(membership.organizationId), firmName);
199
+ }
200
+ return byOrganization;
201
+ }, [user?.organizationMembers]);
189
202
  return {
190
203
  isOpen,
191
204
  setIsOpen,
@@ -195,7 +208,10 @@ export function useMenuUserOrgBehavior(containerType, containerPlacement) {
195
208
  email,
196
209
  avatarUrl,
197
210
  currentOrganization: currentOrganization ? { _id: currentOrganization._id, name: currentOrganization.name } : undefined,
198
- organizations: (organizations ?? []).map(org => ({ _id: org._id, name: org.name })),
211
+ organizations: (organizations ?? []).map(org => {
212
+ const viaProviderOrganizationName = providerNameByOrganizationId.get(String(org._id));
213
+ return { _id: org._id, name: org.name, ...(viaProviderOrganizationName ? { viaProviderOrganizationName } : {}) };
214
+ }),
199
215
  sections,
200
216
  avatarDisplay,
201
217
  showOrgSwitcher,