@plumile/backoffice-react 0.1.107 → 0.1.109

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 (196) hide show
  1. package/lib/esm/auth/TotpQrCode.js +1 -1
  2. package/lib/esm/auth/TotpQrCode.js.map +1 -1
  3. package/lib/esm/auth/login/EmailCapturePanel.js +27 -23
  4. package/lib/esm/auth/login/EmailCapturePanel.js.map +1 -1
  5. package/lib/esm/auth/login/MfaChallengeForm.js +38 -36
  6. package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -1
  7. package/lib/esm/auth/login/PasskeyLoginForm.js +40 -37
  8. package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -1
  9. package/lib/esm/auth/pages/AcceptInvitationScreen.js +63 -62
  10. package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
  11. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js +56 -55
  12. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
  13. package/lib/esm/auth/pages/PasswordResetRequestScreen.js +45 -45
  14. package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
  15. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +1 -0
  16. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
  17. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +44 -39
  18. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
  19. package/lib/esm/components/backoffice/detail/BackofficeCopyButton.js +15 -0
  20. package/lib/esm/components/backoffice/detail/BackofficeCopyButton.js.map +1 -0
  21. package/lib/esm/components/backoffice/detail/BackofficeDetailActionBar.js +11 -0
  22. package/lib/esm/components/backoffice/detail/BackofficeDetailActionBar.js.map +1 -0
  23. package/lib/esm/components/backoffice/detail/BackofficeDetailBlock.js +7 -0
  24. package/lib/esm/components/backoffice/detail/BackofficeDetailBlock.js.map +1 -0
  25. package/lib/esm/components/backoffice/detail/BackofficeDetailHeader.js +15 -0
  26. package/lib/esm/components/backoffice/detail/BackofficeDetailHeader.js.map +1 -0
  27. package/lib/esm/components/backoffice/detail/BackofficeDetailPage.js +19 -0
  28. package/lib/esm/components/backoffice/detail/BackofficeDetailPage.js.map +1 -0
  29. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js +47 -40
  30. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js.map +1 -1
  31. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js +83 -90
  32. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +1 -1
  33. package/lib/esm/components/backoffice/detail/BackofficeDetailTable.js +8 -0
  34. package/lib/esm/components/backoffice/detail/BackofficeDetailTable.js.map +1 -0
  35. package/lib/esm/components/backoffice/detail/BackofficeEmptyValue.js +7 -0
  36. package/lib/esm/components/backoffice/detail/BackofficeEmptyValue.js.map +1 -0
  37. package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js +8 -0
  38. package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js.map +1 -0
  39. package/lib/esm/components/backoffice/detail/BackofficeTechnicalFacts.js +2 -0
  40. package/lib/esm/components/backoffice/filters/EntityFilterValue.js +16 -8
  41. package/lib/esm/components/backoffice/filters/EntityFilterValue.js.map +1 -1
  42. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js +85 -53
  43. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js.map +1 -1
  44. package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js +2 -2
  45. package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js.map +1 -1
  46. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +53 -48
  47. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
  48. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js +2 -2
  49. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js.map +1 -1
  50. package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.js +15 -11
  51. package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.js.map +1 -1
  52. package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js +50 -23
  53. package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js.map +1 -1
  54. package/lib/esm/components/backoffice/layout/buildSidebarSections.js +69 -69
  55. package/lib/esm/components/backoffice/layout/sidebarUtils.js +16 -16
  56. package/lib/esm/components/backoffice/layout/sidebarUtils.js.map +1 -1
  57. package/lib/esm/components/backoffice/links/BackofficeInlineLink.js +29 -0
  58. package/lib/esm/components/backoffice/links/BackofficeInlineLink.js.map +1 -0
  59. package/lib/esm/components/backoffice/links/BackofficeLink.js +21 -0
  60. package/lib/esm/components/backoffice/links/BackofficeLink.js.map +1 -0
  61. package/lib/esm/components/backoffice/links/BackofficeLinkContent.js +26 -0
  62. package/lib/esm/components/backoffice/links/BackofficeLinkContent.js.map +1 -0
  63. package/lib/esm/components/backoffice/links/BackofficeLinkLabel.js +19 -0
  64. package/lib/esm/components/backoffice/links/BackofficeLinkLabel.js.map +1 -0
  65. package/lib/esm/components/backoffice/links/backofficeLink.css.js +7 -0
  66. package/lib/esm/components/backoffice/links/backofficeLink.css.js.map +1 -0
  67. package/lib/esm/components/backoffice/links/resolveBackofficeLink.js +81 -0
  68. package/lib/esm/components/backoffice/links/resolveBackofficeLink.js.map +1 -0
  69. package/lib/esm/components/backoffice/links/resolveBackofficeTargetIcon.js +50 -0
  70. package/lib/esm/components/backoffice/links/resolveBackofficeTargetIcon.js.map +1 -0
  71. package/lib/esm/components/backoffice/links/types.js +0 -0
  72. package/lib/esm/components/backoffice/links/useBackofficeLink.js +21 -0
  73. package/lib/esm/components/backoffice/links/useBackofficeLink.js.map +1 -0
  74. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +1 -0
  75. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
  76. package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js +2 -2
  77. package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js.map +1 -1
  78. package/lib/esm/components/backoffice/pickers/shared/EntityPickerList.js +27 -21
  79. package/lib/esm/components/backoffice/pickers/shared/EntityPickerList.js.map +1 -1
  80. package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js +27 -27
  81. package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js.map +1 -1
  82. package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js +24 -21
  83. package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js.map +1 -1
  84. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js +45 -44
  85. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -1
  86. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +277 -227
  87. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  88. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js +25 -30
  89. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js.map +1 -1
  90. package/lib/esm/i18n/locales/en/backofficeReact.js +8 -0
  91. package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
  92. package/lib/esm/i18n/locales/fr/backofficeReact.js +8 -0
  93. package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
  94. package/lib/esm/index.js +88 -73
  95. package/lib/esm/pages/BackofficeDashboardPage.js +1 -5
  96. package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
  97. package/lib/esm/pages/BackofficeEntityDetailPage.js +231 -222
  98. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  99. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +170 -54
  100. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
  101. package/lib/esm/pages/BackofficeEntityListPage.js +196 -207
  102. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
  103. package/lib/esm/pages/BackofficeHubPage.js +21 -21
  104. package/lib/esm/pages/BackofficeLayoutPage.js +7 -7
  105. package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
  106. package/lib/esm/router/createBackofficeRoutes.js +132 -126
  107. package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
  108. package/lib/esm/style.css +1 -1
  109. package/lib/types/auth/login/EmailCapturePanel.d.ts.map +1 -1
  110. package/lib/types/auth/login/MfaChallengeForm.d.ts.map +1 -1
  111. package/lib/types/auth/login/PasskeyLoginForm.d.ts.map +1 -1
  112. package/lib/types/auth/pages/AcceptInvitationScreen.d.ts.map +1 -1
  113. package/lib/types/auth/pages/PasswordResetCompleteScreen.d.ts.map +1 -1
  114. package/lib/types/auth/pages/PasswordResetRequestScreen.d.ts.map +1 -1
  115. package/lib/types/components/backoffice/actions/BackofficeEntityActionFormDialog.d.ts.map +1 -1
  116. package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts +0 -1
  117. package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts.map +1 -1
  118. package/lib/types/components/backoffice/detail/BackofficeCopyButton.d.ts +8 -0
  119. package/lib/types/components/backoffice/detail/BackofficeCopyButton.d.ts.map +1 -0
  120. package/lib/types/components/backoffice/detail/BackofficeDetailActionBar.d.ts +9 -0
  121. package/lib/types/components/backoffice/detail/BackofficeDetailActionBar.d.ts.map +1 -0
  122. package/lib/types/components/backoffice/detail/BackofficeDetailBlock.d.ts +7 -0
  123. package/lib/types/components/backoffice/detail/BackofficeDetailBlock.d.ts.map +1 -0
  124. package/lib/types/components/backoffice/detail/BackofficeDetailHeader.d.ts +12 -0
  125. package/lib/types/components/backoffice/detail/BackofficeDetailHeader.d.ts.map +1 -0
  126. package/lib/types/components/backoffice/detail/BackofficeDetailPage.d.ts +16 -0
  127. package/lib/types/components/backoffice/detail/BackofficeDetailPage.d.ts.map +1 -0
  128. package/lib/types/components/backoffice/detail/BackofficeDetailPage.stories.d.ts +11 -0
  129. package/lib/types/components/backoffice/detail/BackofficeDetailPage.stories.d.ts.map +1 -0
  130. package/lib/types/components/backoffice/detail/BackofficeDetailRelationLink.d.ts.map +1 -1
  131. package/lib/types/components/backoffice/detail/BackofficeDetailRelationListBlock.d.ts.map +1 -1
  132. package/lib/types/components/backoffice/detail/BackofficeDetailTable.d.ts +6 -0
  133. package/lib/types/components/backoffice/detail/BackofficeDetailTable.d.ts.map +1 -0
  134. package/lib/types/components/backoffice/detail/BackofficeEmptyValue.d.ts +7 -0
  135. package/lib/types/components/backoffice/detail/BackofficeEmptyValue.d.ts.map +1 -0
  136. package/lib/types/components/backoffice/detail/BackofficeStatusGroup.d.ts +8 -0
  137. package/lib/types/components/backoffice/detail/BackofficeStatusGroup.d.ts.map +1 -0
  138. package/lib/types/components/backoffice/detail/BackofficeTechnicalFacts.d.ts +2 -0
  139. package/lib/types/components/backoffice/detail/BackofficeTechnicalFacts.d.ts.map +1 -0
  140. package/lib/types/components/backoffice/filters/EntityFilterValue.d.ts +5 -1
  141. package/lib/types/components/backoffice/filters/EntityFilterValue.d.ts.map +1 -1
  142. package/lib/types/components/backoffice/filters/EntityIdFilterField.d.ts +1 -0
  143. package/lib/types/components/backoffice/filters/EntityIdFilterField.d.ts.map +1 -1
  144. package/lib/types/components/backoffice/filters/entityIdFilterField.css.d.ts +5 -2
  145. package/lib/types/components/backoffice/filters/entityIdFilterField.css.d.ts.map +1 -1
  146. package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.d.ts.map +1 -1
  147. package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.d.ts +1 -0
  148. package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.d.ts.map +1 -1
  149. package/lib/types/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.d.ts.map +1 -1
  150. package/lib/types/components/backoffice/layout/breadcrumb/buildBreadcrumbs.d.ts +10 -8
  151. package/lib/types/components/backoffice/layout/breadcrumb/buildBreadcrumbs.d.ts.map +1 -1
  152. package/lib/types/components/backoffice/layout/breadcrumb/types.d.ts +10 -5
  153. package/lib/types/components/backoffice/layout/breadcrumb/types.d.ts.map +1 -1
  154. package/lib/types/components/backoffice/layout/sidebarUtils.d.ts +6 -2
  155. package/lib/types/components/backoffice/layout/sidebarUtils.d.ts.map +1 -1
  156. package/lib/types/components/backoffice/links/BackofficeInlineLink.d.ts +18 -0
  157. package/lib/types/components/backoffice/links/BackofficeInlineLink.d.ts.map +1 -0
  158. package/lib/types/components/backoffice/links/BackofficeLink.d.ts +13 -0
  159. package/lib/types/components/backoffice/links/BackofficeLink.d.ts.map +1 -0
  160. package/lib/types/components/backoffice/links/BackofficeLinkContent.d.ts +10 -0
  161. package/lib/types/components/backoffice/links/BackofficeLinkContent.d.ts.map +1 -0
  162. package/lib/types/components/backoffice/links/BackofficeLinkLabel.d.ts +12 -0
  163. package/lib/types/components/backoffice/links/BackofficeLinkLabel.d.ts.map +1 -0
  164. package/lib/types/components/backoffice/links/backofficeLink.css.d.ts +4 -0
  165. package/lib/types/components/backoffice/links/backofficeLink.css.d.ts.map +1 -0
  166. package/lib/types/components/backoffice/links/resolveBackofficeLink.d.ts +15 -0
  167. package/lib/types/components/backoffice/links/resolveBackofficeLink.d.ts.map +1 -0
  168. package/lib/types/components/backoffice/links/resolveBackofficeTargetIcon.d.ts +8 -0
  169. package/lib/types/components/backoffice/links/resolveBackofficeTargetIcon.d.ts.map +1 -0
  170. package/lib/types/components/backoffice/links/types.d.ts +45 -0
  171. package/lib/types/components/backoffice/links/types.d.ts.map +1 -0
  172. package/lib/types/components/backoffice/links/useBackofficeLink.d.ts +7 -0
  173. package/lib/types/components/backoffice/links/useBackofficeLink.d.ts.map +1 -0
  174. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
  175. package/lib/types/components/backoffice/pickers/entityIdPickerDialog.css.d.ts +2 -0
  176. package/lib/types/components/backoffice/pickers/entityIdPickerDialog.css.d.ts.map +1 -1
  177. package/lib/types/components/backoffice/pickers/shared/EntityPickerList.d.ts.map +1 -1
  178. package/lib/types/components/backoffice/refs/BackofficeEntityLink.d.ts.map +1 -1
  179. package/lib/types/components/backoffice/refs/BackofficeRelatedCountLink.d.ts.map +1 -1
  180. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
  181. package/lib/types/components/backoffice/shared/BackofficeFilterableCell.d.ts +6 -3
  182. package/lib/types/components/backoffice/shared/BackofficeFilterableCell.d.ts.map +1 -1
  183. package/lib/types/i18n/resources.d.ts +16 -0
  184. package/lib/types/i18n/resources.d.ts.map +1 -1
  185. package/lib/types/index.d.ts +24 -1
  186. package/lib/types/index.d.ts.map +1 -1
  187. package/lib/types/pages/BackofficeDashboardPage.d.ts.map +1 -1
  188. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  189. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +49 -22
  190. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
  191. package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
  192. package/lib/types/provider/types.d.ts +26 -22
  193. package/lib/types/provider/types.d.ts.map +1 -1
  194. package/lib/types/router/createBackofficeRoutes.d.ts +36 -1
  195. package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
  196. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeDetailRelationLink.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationLink.tsx"],"sourcesContent":["import { useContext, type JSX, type MouseEvent } from 'react';\nimport { Link, RoutingContext } from '@plumile/router';\n\nimport {\n buildBackofficeFallbackListHref,\n buildBackofficeListHref,\n buildBackofficeListLink,\n} from '@plumile/backoffice-core/state/buildListHref.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport type { BackofficeRuntimeRelationFilterSpec } from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\n\nimport * as styles from './backofficeDetailRelationLink.css.js';\n\nexport type BackofficeDetailRelationLinkProps = {\n label: string;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string;\n count?: number;\n};\n\nexport const BackofficeDetailRelationLink = ({\n label,\n relation,\n value,\n count,\n}: BackofficeDetailRelationLinkProps): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n const { entities, entityRegistry } = useBackofficeConfig();\n const routing = useContext(RoutingContext);\n const { target, filterId, whereKey, path } = relation;\n const entityManifest = entities[target];\n if (entityManifest == null) {\n return null;\n }\n\n const where = setWhereValue<Record<string, unknown>>(\n null,\n whereKey,\n value,\n path,\n );\n\n const loadedEntity = entityRegistry.getLoadedListEntity(target);\n let filterKey = whereKey;\n if (path != null) {\n filterKey = `${whereKey}.${path.join('.')}`;\n }\n const resolvedFilterId = filterId ?? filterKey;\n\n let to: string | { pathname: string; search: string };\n if (loadedEntity == null) {\n to = buildBackofficeFallbackListHref(entityManifest.routes.list, where, [\n {\n id: resolvedFilterId,\n value,\n },\n ]);\n } else {\n to = buildBackofficeListHref(loadedEntity.config, { where });\n }\n\n const navigateToLazyList = async (\n history: NonNullable<typeof routing>['history'],\n ): Promise<void> => {\n const listEntity = await entityRegistry.loadListEntity(target);\n const next = buildBackofficeListLink(listEntity.config, { where });\n\n let search = '';\n if (next.search !== '') {\n search = `?${next.search}`;\n }\n\n history.push({\n pathname: next.pathname,\n search,\n hash: '',\n });\n };\n\n const handleClick = (event: MouseEvent<HTMLAnchorElement>) => {\n if (\n loadedEntity != null ||\n routing == null ||\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n\n event.preventDefault();\n navigateToLazyList(routing.history).catch(() => {\n /* noop */\n });\n };\n\n let labelText = label;\n if (count != null) {\n labelText = t('relations.labelWithCount', {\n label,\n count,\n });\n }\n\n return (\n <Link to={to} className={styles.link} onClick={handleClick}>\n <span className={styles.label}>{labelText}</span>\n <span className={styles.action}>\n <span className={styles.meta}>{t('relations.viewList')}</span>\n <span className={styles.chevron} aria-hidden=\"true\">\n &gt;\n </span>\n </span>\n </Link>\n );\n};\n\nexport default BackofficeDetailRelationLink;\n"],"mappings":";;;;;;;;;AAuBA,IAAa,KAAgC,EAC3C,OAAA,GACA,aACA,UACA,eAC2D;CAC3D,IAAM,EAAE,SAAM,GAA+B,EACvC,EAAE,aAAU,sBAAmB,GAAqB,EACpD,IAAU,EAAW,EAAe,EACpC,EAAE,WAAQ,aAAU,aAAU,YAAS,GACvC,IAAiB,EAAS;CAChC,IAAI,KAAkB,MACpB,OAAO;CAGT,IAAM,IAAQ,EACZ,MACA,GACA,GACA,EACD,EAEK,IAAe,EAAe,oBAAoB,EAAO,EAC3D,IAAY;CAChB,AAAI,KAAQ,SACV,IAAY,GAAG,EAAS,GAAG,EAAK,KAAK,IAAI;CAE3C,IAAM,IAAmB,KAAY,GAEjC;CACJ,AAQE,IARE,KAAgB,OACb,EAAgC,EAAe,OAAO,MAAM,GAAO,CACtE;EACE,IAAI;EACJ;EACD,CACF,CAAC,GAEG,EAAwB,EAAa,QAAQ,EAAE,UAAO,CAAC;CAG9D,IAAM,IAAqB,OACzB,MACkB;EAElB,IAAM,IAAO,GAAwB,MADZ,EAAe,eAAe,EAAO,EACd,QAAQ,EAAE,UAAO,CAAC,EAE9D,IAAS;EAKb,AAJI,EAAK,WAAW,OAClB,IAAS,IAAI,EAAK,WAGpB,EAAQ,KAAK;GACX,UAAU,EAAK;GACf;GACA,MAAM;GACP,CAAC;IAGE,KAAe,MAAyC;EAE1D,KAAgB,QAChB,KAAW,QACX,EAAM,oBACN,EAAM,WAAW,KACjB,EAAM,WACN,EAAM,UACN,EAAM,WACN,EAAM,aAKR,EAAM,gBAAgB,EACtB,EAAmB,EAAQ,QAAQ,CAAC,YAAY,GAE9C;IAGA,IAAY;CAQhB,OAPI,KAAS,SACX,IAAY,EAAE,4BAA4B;EACxC,OAAA;EACA;EACD,CAAC,GAIF,kBAAC,GAAD;EAAU;EAAI,WAAW;EAAa,SAAS;YAA/C,CACE,kBAAC,QAAD;GAAM,WAAW;aAAe;GAAiB,CAAA,EACjD,kBAAC,QAAD;GAAM,WAAW;aAAjB,CACE,kBAAC,QAAD;IAAM,WAAW;cAAc,EAAE,qBAAqB;IAAQ,CAAA,EAC9D,kBAAC,QAAD;IAAM,WAAW;IAAgB,eAAY;cAAO;IAE7C,CAAA,CACF;KACF"}
1
+ {"version":3,"file":"BackofficeDetailRelationLink.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationLink.tsx"],"sourcesContent":["import { useContext, type JSX, type MouseEvent } from 'react';\nimport { RoutingContext } from '@plumile/router';\n\nimport { buildBackofficeListLink } from '@plumile/backoffice-core/state/buildListHref.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport type { BackofficeRuntimeRelationFilterSpec } from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\nimport { BackofficeInlineLink } from '../links/BackofficeInlineLink.js';\nimport type { BackofficeLinkTarget } from '../links/types.js';\n\nimport * as styles from './backofficeDetailRelationLink.css.js';\n\nexport type BackofficeDetailRelationLinkProps = {\n label: string;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string;\n count?: number;\n};\n\nexport const BackofficeDetailRelationLink = ({\n label,\n relation,\n value,\n count,\n}: BackofficeDetailRelationLinkProps): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n const { entities, entityRegistry } = useBackofficeConfig();\n const routing = useContext(RoutingContext);\n const { target, filterId, whereKey, path } = relation;\n const targetManifest = entities[target];\n if (targetManifest == null) {\n return null;\n }\n\n const where = setWhereValue<Record<string, unknown>>(\n null,\n whereKey,\n value,\n path,\n );\n\n const loadedEntity = entityRegistry.getLoadedListEntity(target);\n let filterKey = whereKey;\n if (path != null) {\n filterKey = `${whereKey}.${path.join('.')}`;\n }\n const resolvedFilterId = filterId ?? filterKey;\n\n const linkTarget = {\n kind: 'entity-list',\n entityId: target,\n state: {\n where,\n filters: [\n {\n id: resolvedFilterId,\n value,\n },\n ],\n },\n } as BackofficeLinkTarget;\n\n const navigateToLazyList = async (\n history: NonNullable<typeof routing>['history'],\n ): Promise<void> => {\n const listEntity = await entityRegistry.loadListEntity(target);\n const next = buildBackofficeListLink(listEntity.config, { where });\n\n let search = '';\n if (next.search !== '') {\n search = `?${next.search}`;\n }\n\n history.push({\n pathname: next.pathname,\n search,\n hash: '',\n });\n };\n\n const handleClick = (event: MouseEvent<HTMLAnchorElement>) => {\n if (\n loadedEntity != null ||\n routing == null ||\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n\n event.preventDefault();\n navigateToLazyList(routing.history).catch(() => {\n /* noop */\n });\n };\n\n let labelText = label;\n if (count != null) {\n labelText = t('relations.labelWithCount', {\n label,\n count,\n });\n }\n\n return (\n <BackofficeInlineLink\n target={linkTarget}\n className={styles.link}\n onClick={handleClick}\n endAdornment={\n <span className={styles.action}>\n <span className={styles.meta}>{t('relations.viewList')}</span>\n <span className={styles.chevron} aria-hidden=\"true\">\n &gt;\n </span>\n </span>\n }\n >\n <span className={styles.label}>{labelText}</span>\n </BackofficeInlineLink>\n );\n};\n\nexport default BackofficeDetailRelationLink;\n"],"mappings":";;;;;;;;;;AAqBA,IAAa,KAAgC,EAC3C,OAAA,GACA,aACA,UACA,eAC2D;CAC3D,IAAM,EAAE,SAAM,GAA+B,EACvC,EAAE,aAAU,sBAAmB,GAAqB,EACpD,IAAU,EAAW,EAAe,EACpC,EAAE,WAAQ,aAAU,aAAU,YAAS;CAE7C,IADuB,EAAS,MACV,MACpB,OAAO;CAGT,IAAM,IAAQ,EACZ,MACA,GACA,GACA,EACD,EAEK,IAAe,EAAe,oBAAoB,EAAO,EAC3D,IAAY;CAChB,AAAI,KAAQ,SACV,IAAY,GAAG,EAAS,GAAG,EAAK,KAAK,IAAI;CAI3C,IAAM,IAAa;EACjB,MAAM;EACN,UAAU;EACV,OAAO;GACL;GACA,SAAS,CACP;IACE,IATiB,KAAY;IAU7B;IACD,CACF;GACF;EACF,EAEK,IAAqB,OACzB,MACkB;EAElB,IAAM,IAAO,GAAwB,MADZ,EAAe,eAAe,EAAO,EACd,QAAQ,EAAE,UAAO,CAAC,EAE9D,IAAS;EAKb,AAJI,EAAK,WAAW,OAClB,IAAS,IAAI,EAAK,WAGpB,EAAQ,KAAK;GACX,UAAU,EAAK;GACf;GACA,MAAM;GACP,CAAC;IAGE,KAAe,MAAyC;EAE1D,KAAgB,QAChB,KAAW,QACX,EAAM,oBACN,EAAM,WAAW,KACjB,EAAM,WACN,EAAM,UACN,EAAM,WACN,EAAM,aAKR,EAAM,gBAAgB,EACtB,EAAmB,EAAQ,QAAQ,CAAC,YAAY,GAE9C;IAGA,IAAY;CAQhB,OAPI,KAAS,SACX,IAAY,EAAE,4BAA4B;EACxC,OAAA;EACA;EACD,CAAC,GAIF,kBAAC,GAAD;EACE,QAAQ;EACR,WAAW;EACX,SAAS;EACT,cACE,kBAAC,QAAD;GAAM,WAAW;aAAjB,CACE,kBAAC,QAAD;IAAM,WAAW;cAAc,EAAE,qBAAqB;IAAQ,CAAA,EAC9D,kBAAC,QAAD;IAAM,WAAW;IAAgB,eAAY;cAAO;IAE7C,CAAA,CACF;;YAGT,kBAAC,QAAD;GAAM,WAAW;aAAe;GAAiB,CAAA;EAC5B,CAAA"}
@@ -1,123 +1,116 @@
1
1
  import { useBackofficeReactTranslation as e } from "../../../i18n/useBackofficeReactTranslation.js";
2
- import { useBackofficeConfig as t } from "../../../provider/BackofficeConfigContext.js";
3
- import { BackofficeErrorBoundary as n } from "../errors/BackofficeErrorBoundary.js";
4
- import { useBackofficeListEntitiesLoader as r } from "../../../provider/useBackofficeEntityLoader.js";
5
- import { buildDataTableColumns as i } from "../columns/buildDataTableColumns.js";
6
- import { useBackofficeLoadMore as a } from "../../../hooks/useBackofficeLoadMore.js";
7
- import { useBackofficeListRefetch as o } from "../../../hooks/useBackofficeListRefetch.js";
8
- import { BackofficeEntityListScaffold as s } from "../scaffolds/BackofficeEntityListScaffold.js";
9
- import { Suspense as c, useCallback as l, useMemo as u, useState as d } from "react";
10
- import { BackofficeTableSkeleton as f, InlineBanner as p } from "@plumile/ui";
11
- import { jsx as m } from "react/jsx-runtime";
12
- import { useTranslation as h } from "react-i18next";
13
- import * as g from "react-relay";
14
- import { BACKOFFICE_LIST_REFETCH_POLICY as _, BACKOFFICE_RELATED_TAB_PAGE_SIZE as v } from "@plumile/backoffice-core/constants.js";
15
- import { setWhereValue as y } from "@plumile/backoffice-core/filters/where.js";
2
+ import { BackofficeErrorBoundary as t } from "../errors/BackofficeErrorBoundary.js";
3
+ import { useBackofficeListEntitiesLoader as n } from "../../../provider/useBackofficeEntityLoader.js";
4
+ import { buildDataTableColumns as r } from "../columns/buildDataTableColumns.js";
5
+ import { useBackofficeLoadMore as i } from "../../../hooks/useBackofficeLoadMore.js";
6
+ import { useBackofficeListRefetch as a } from "../../../hooks/useBackofficeListRefetch.js";
7
+ import { BackofficeEntityListScaffold as o } from "../scaffolds/BackofficeEntityListScaffold.js";
8
+ import { Suspense as s, useCallback as c, useMemo as l, useState as u } from "react";
9
+ import { BackofficeTableSkeleton as d, InlineBanner as f } from "@plumile/ui";
10
+ import { jsx as p } from "react/jsx-runtime";
11
+ import { useTranslation as m } from "react-i18next";
12
+ import * as h from "react-relay";
13
+ import { BACKOFFICE_LIST_REFETCH_POLICY as g, BACKOFFICE_RELATED_TAB_PAGE_SIZE as _ } from "@plumile/backoffice-core/constants.js";
14
+ import { setWhereValue as v } from "@plumile/backoffice-core/filters/where.js";
16
15
  //#region src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx
17
- var { useLazyLoadQuery: b, usePaginationFragment: x } = g, S = () => {
16
+ var { useLazyLoadQuery: y, usePaginationFragment: b } = h, x = () => {
18
17
  let { t } = e();
19
- return /* @__PURE__ */ m(f, {
18
+ return /* @__PURE__ */ p(d, {
20
19
  rows: 6,
21
20
  ariaLabel: t("common.loading")
22
21
  });
23
- }, C = ({ title: t, config: n, entities: r, relation: c, value: f }) => {
24
- let { t: p } = h(), { t: g } = e(), S = n.list, C = n.listDefaults ?? S.defaultState ?? {
22
+ }, S = ({ title: t, config: n, relation: s, value: d }) => {
23
+ let { t: f } = m(), { t: h } = e(), x = n.list, S = n.listDefaults ?? x.defaultState ?? {
25
24
  where: null,
26
25
  sort: null
27
- }, [w, T] = d({
28
- where: C.where,
29
- sort: C.sort ?? null
30
- }), E = u(() => f == null || f.trim() === "" ? null : y(w.where, c.whereKey, f, c.path), [
31
- c.path,
32
- c.whereKey,
33
- w.where,
34
- f
35
- ]), D = E ?? w.where, O = w.sort ?? C.sort, k = u(() => ({
36
- where: D,
37
- sort: O,
38
- count: v,
26
+ }, [C, w] = u({
27
+ where: S.where,
28
+ sort: S.sort ?? null
29
+ }), T = l(() => d == null || d.trim() === "" ? null : v(C.where, s.whereKey, d, s.path), [
30
+ s.path,
31
+ s.whereKey,
32
+ C.where,
33
+ d
34
+ ]), E = T ?? C.where, D = C.sort ?? S.sort, O = l(() => ({
35
+ where: E,
36
+ sort: D,
37
+ count: _,
39
38
  cursor: null
40
- }), [D, O]), A = u(() => S.buildQueryVariables(k), [S, k]), j = b(S.query, A, { fetchPolicy: "store-or-network" }), { data: M, loadNext: N, hasNext: P, isLoadingNext: F, refetch: I } = x(S.fragment, j), L = S.getConnection(M), R = u(() => L.edges.map((e) => S.toRow(e.node)), [L.edges, S]), z = u(() => i(S.columns, {
41
- tApp: p,
42
- t: g,
43
- resolveEntityHref: (e, t) => {
44
- let n = r[e];
45
- return n == null ? null : n.routes.detail(t);
46
- }
39
+ }), [E, D]), k = l(() => x.buildQueryVariables(O), [x, O]), A = y(x.query, k, { fetchPolicy: "store-or-network" }), { data: j, loadNext: M, hasNext: N, isLoadingNext: P, refetch: F } = b(x.fragment, A), I = x.getConnection(j), L = l(() => I.edges.map((e) => x.toRow(e.node)), [I.edges, x]), R = l(() => r(x.columns, {
40
+ tApp: f,
41
+ t: h
47
42
  }), [
48
- r,
49
- S.columns,
50
- g,
51
- p
52
- ]), B = l((e) => S.getRowId(e), [S]), { onRefresh: V } = o({
53
- refetch: I,
54
- variables: k,
55
- defaults: u(() => ({
56
- where: E ?? C.where,
57
- sort: C.sort,
58
- count: v,
43
+ x.columns,
44
+ h,
45
+ f
46
+ ]), z = c((e) => x.getRowId(e), [x]), { onRefresh: B } = a({
47
+ refetch: F,
48
+ variables: O,
49
+ defaults: l(() => ({
50
+ where: T ?? S.where,
51
+ sort: S.sort,
52
+ count: _,
59
53
  cursor: null
60
54
  }), [
61
- C.sort,
62
- C.where,
63
- E
55
+ S.sort,
56
+ S.where,
57
+ T
64
58
  ]),
65
- fetchPolicy: _,
66
- buildQueryVariables: S.buildQueryVariables
67
- }), H = a({
68
- hasNext: P,
69
- isLoadingNext: F,
70
- loadNext: N,
71
- count: v
59
+ fetchPolicy: g,
60
+ buildQueryVariables: x.buildQueryVariables
61
+ }), V = i({
62
+ hasNext: N,
63
+ isLoadingNext: P,
64
+ loadNext: M,
65
+ count: _
72
66
  });
73
- return /* @__PURE__ */ m(s, {
67
+ return /* @__PURE__ */ p(o, {
74
68
  config: n,
75
- state: w,
69
+ state: C,
76
70
  pushState: (e) => {
77
- T(e);
71
+ w(e);
78
72
  },
79
73
  header: { title: t },
80
- rows: R,
81
- columns: z,
82
- getRowId: B,
83
- hasNextPage: P,
84
- isLoadingMore: F,
85
- onLoadMore: H,
86
- onRefresh: V,
87
- totalCount: L.totalCount ?? null,
74
+ rows: L,
75
+ columns: R,
76
+ getRowId: z,
77
+ hasNextPage: N,
78
+ isLoadingMore: P,
79
+ onLoadMore: V,
80
+ onRefresh: B,
81
+ totalCount: I.totalCount ?? null,
88
82
  variant: "embedded"
89
83
  });
90
- }, w = ({ title: n, relation: i, value: a }) => {
91
- let { t: o } = e(), { entities: s } = t(), c = r(u(() => [i.target], [i.target]));
92
- if (c.status === "loading") return /* @__PURE__ */ m(f, {
84
+ }, C = ({ title: t, relation: r, value: i }) => {
85
+ let { t: a } = e(), o = n(l(() => [r.target], [r.target]));
86
+ if (o.status === "loading") return /* @__PURE__ */ p(d, {
93
87
  rows: 6,
94
- ariaLabel: o("common.loading")
88
+ ariaLabel: a("common.loading")
95
89
  });
96
- if (c.status === "error") return /* @__PURE__ */ m(p, {
90
+ if (o.status === "error") return /* @__PURE__ */ p(f, {
97
91
  tone: "warning",
98
- title: o("relations.unavailable.title"),
99
- children: o("relations.unavailable.description")
92
+ title: a("relations.unavailable.title"),
93
+ children: a("relations.unavailable.description")
100
94
  });
101
- let l = c.modules[i.target]?.config;
102
- return l == null || l.list.kind === "records" ? null : /* @__PURE__ */ m(C, {
103
- title: n,
104
- config: l,
105
- entities: s,
106
- relation: i,
107
- value: a
95
+ let s = o.modules[r.target]?.config;
96
+ return s == null || s.list.kind === "records" ? null : /* @__PURE__ */ p(S, {
97
+ title: t,
98
+ config: s,
99
+ relation: r,
100
+ value: i
108
101
  });
109
- }, T = ({ title: e, relation: t, value: r }) => /* @__PURE__ */ m(n, {
110
- fallback: () => /* @__PURE__ */ m(S, {}),
111
- children: /* @__PURE__ */ m(c, {
112
- fallback: /* @__PURE__ */ m(S, {}),
113
- children: /* @__PURE__ */ m(w, {
102
+ }, w = ({ title: e, relation: n, value: r }) => /* @__PURE__ */ p(t, {
103
+ fallback: () => /* @__PURE__ */ p(x, {}),
104
+ children: /* @__PURE__ */ p(s, {
105
+ fallback: /* @__PURE__ */ p(x, {}),
106
+ children: /* @__PURE__ */ p(C, {
114
107
  title: e,
115
- relation: t,
108
+ relation: n,
116
109
  value: r
117
110
  })
118
111
  })
119
112
  });
120
113
  //#endregion
121
- export { T as BackofficeDetailRelationListBlock, T as default };
114
+ export { w as BackofficeDetailRelationListBlock, w as default };
122
115
 
123
116
  //# sourceMappingURL=BackofficeDetailRelationListBlock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeDetailRelationListBlock.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx"],"sourcesContent":["import { Suspense, useCallback, useMemo, useState, type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport {\n BACKOFFICE_LIST_REFETCH_POLICY,\n BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n} from '@plumile/backoffice-core/constants.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport type {\n BackofficeListState,\n BackofficeRuntimeRelationFilterSpec,\n BackofficeRuntimeResolvedListFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { BackofficeTableSkeleton, InlineBanner } from '@plumile/ui';\n\nimport { buildDataTableColumns } from '../columns/buildDataTableColumns.js';\nimport { useBackofficeLoadMore } from '../../../hooks/useBackofficeLoadMore.js';\nimport { useBackofficeListRefetch } from '../../../hooks/useBackofficeListRefetch.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\nimport { useBackofficeListEntitiesLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { BackofficeEntityListScaffold } from '../scaffolds/BackofficeEntityListScaffold.js';\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\n\nconst { useLazyLoadQuery, usePaginationFragment } = ReactRelay;\n\nexport type BackofficeDetailRelationListBlockProps = {\n title: string;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\ntype RelationListContentProps = {\n title: string;\n config: BackofficeRuntimeResolvedListFacetConfig & {\n list: Exclude<\n BackofficeRuntimeResolvedListFacetConfig['list'],\n { kind: 'records' }\n >;\n };\n entities: ReturnType<typeof useBackofficeConfig>['entities'];\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\ntype RelationListBlockBodyProps = {\n title: string;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\nconst RelationListSkeleton = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeTableSkeleton rows={6} ariaLabel={t('common.loading')} />;\n};\n\nconst RelationListContent = ({\n title,\n config,\n entities,\n relation,\n value,\n}: RelationListContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const listConfig = config.list;\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n\n const [state, setState] = useState<BackofficeListState<unknown, string>>({\n where: listDefaults.where as never,\n sort: listDefaults.sort ?? null,\n });\n\n const relationWhere = useMemo(() => {\n if (value == null || value.trim() === '') {\n return null;\n }\n return setWhereValue(\n state.where as Record<string, unknown> | null,\n relation.whereKey as never,\n value,\n relation.path,\n );\n }, [relation.path, relation.whereKey, state.where, value]);\n\n const effectiveWhere = relationWhere ?? (state.where as never);\n const resolvedSort = state.sort ?? listDefaults.sort;\n const variablesBase = useMemo(() => {\n return {\n where: effectiveWhere as never,\n sort: resolvedSort as never,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n cursor: null,\n };\n }, [effectiveWhere, resolvedSort]);\n\n const variables = useMemo(() => {\n return listConfig.buildQueryVariables(variablesBase);\n }, [listConfig, variablesBase]);\n\n const queryData = useLazyLoadQuery<OperationType>(\n listConfig.query,\n variables,\n { fetchPolicy: 'store-or-network' },\n );\n\n const {\n data: fragmentData,\n loadNext,\n hasNext,\n isLoadingNext,\n refetch,\n } = usePaginationFragment(listConfig.fragment, queryData as never);\n\n const connection = listConfig.getConnection(fragmentData);\n const rows = useMemo(() => {\n return connection.edges.map((edge) => {\n return listConfig.toRow(edge.node);\n });\n }, [connection.edges, listConfig]);\n\n const columns = useMemo(() => {\n return buildDataTableColumns(listConfig.columns, {\n tApp,\n t,\n resolveEntityHref: (entityId, refId) => {\n const entityManifest = entities[entityId];\n if (entityManifest == null) {\n return null;\n }\n return entityManifest.routes.detail(refId);\n },\n });\n }, [entities, listConfig.columns, t, tApp]);\n\n const getRowId = useCallback(\n (row: unknown) => {\n return listConfig.getRowId(row);\n },\n [listConfig],\n );\n\n const defaults = useMemo(() => {\n const baseWhere = relationWhere ?? listDefaults.where;\n return {\n where: baseWhere,\n sort: listDefaults.sort,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n cursor: null,\n };\n }, [listDefaults.sort, listDefaults.where, relationWhere]);\n\n const { onRefresh } = useBackofficeListRefetch({\n refetch,\n variables: variablesBase,\n defaults,\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildQueryVariables: listConfig.buildQueryVariables,\n });\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n });\n\n return (\n <BackofficeEntityListScaffold\n config={config as never}\n state={state as never}\n pushState={(next) => {\n setState(next);\n }}\n header={{ title }}\n rows={rows}\n columns={columns as never}\n getRowId={getRowId}\n hasNextPage={hasNext}\n isLoadingMore={isLoadingNext}\n onLoadMore={handleLoadMore}\n onRefresh={onRefresh}\n totalCount={connection.totalCount ?? null}\n variant=\"embedded\"\n />\n );\n};\n\nconst RelationListBlockBody = ({\n title,\n relation,\n value,\n}: RelationListBlockBodyProps): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const relatedEntityIds = useMemo(() => {\n return [relation.target];\n }, [relation.target]);\n const relatedEntitiesState =\n useBackofficeListEntitiesLoader(relatedEntityIds);\n\n if (relatedEntitiesState.status === 'loading') {\n return <BackofficeTableSkeleton rows={6} ariaLabel={t('common.loading')} />;\n }\n\n if (relatedEntitiesState.status === 'error') {\n return (\n <InlineBanner tone=\"warning\" title={t('relations.unavailable.title')}>\n {t('relations.unavailable.description')}\n </InlineBanner>\n );\n }\n\n const config = relatedEntitiesState.modules[relation.target]?.config;\n if (config == null) {\n return null;\n }\n if (config.list.kind === 'records') {\n return null;\n }\n const connectionConfig = config as RelationListContentProps['config'];\n\n return (\n <RelationListContent\n title={title}\n config={connectionConfig}\n entities={entities}\n relation={relation}\n value={value}\n />\n );\n};\n\nexport const BackofficeDetailRelationListBlock = ({\n title,\n relation,\n value,\n}: BackofficeDetailRelationListBlockProps): JSX.Element => {\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return <RelationListSkeleton />;\n }}\n >\n <Suspense fallback={<RelationListSkeleton />}>\n <RelationListBlockBody\n title={title}\n relation={relation}\n value={value}\n />\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport default BackofficeDetailRelationListBlock;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BackofficeDetailRelationListBlock.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx"],"sourcesContent":["import { Suspense, useCallback, useMemo, useState, type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport {\n BACKOFFICE_LIST_REFETCH_POLICY,\n BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n} from '@plumile/backoffice-core/constants.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport type {\n BackofficeListState,\n BackofficeRuntimeRelationFilterSpec,\n BackofficeRuntimeResolvedListFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { BackofficeTableSkeleton, InlineBanner } from '@plumile/ui';\n\nimport { buildDataTableColumns } from '../columns/buildDataTableColumns.js';\nimport { useBackofficeLoadMore } from '../../../hooks/useBackofficeLoadMore.js';\nimport { useBackofficeListRefetch } from '../../../hooks/useBackofficeListRefetch.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeListEntitiesLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { BackofficeEntityListScaffold } from '../scaffolds/BackofficeEntityListScaffold.js';\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\n\nconst { useLazyLoadQuery, usePaginationFragment } = ReactRelay;\n\nexport type BackofficeDetailRelationListBlockProps = {\n title: string;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\ntype RelationListContentProps = {\n title: string;\n config: BackofficeRuntimeResolvedListFacetConfig & {\n list: Exclude<\n BackofficeRuntimeResolvedListFacetConfig['list'],\n { kind: 'records' }\n >;\n };\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\ntype RelationListBlockBodyProps = {\n title: string;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\nconst RelationListSkeleton = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeTableSkeleton rows={6} ariaLabel={t('common.loading')} />;\n};\n\nconst RelationListContent = ({\n title,\n config,\n relation,\n value,\n}: RelationListContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const listConfig = config.list;\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n\n const [state, setState] = useState<BackofficeListState<unknown, string>>({\n where: listDefaults.where as never,\n sort: listDefaults.sort ?? null,\n });\n\n const relationWhere = useMemo(() => {\n if (value == null || value.trim() === '') {\n return null;\n }\n return setWhereValue(\n state.where as Record<string, unknown> | null,\n relation.whereKey as never,\n value,\n relation.path,\n );\n }, [relation.path, relation.whereKey, state.where, value]);\n\n const effectiveWhere = relationWhere ?? (state.where as never);\n const resolvedSort = state.sort ?? listDefaults.sort;\n const variablesBase = useMemo(() => {\n return {\n where: effectiveWhere as never,\n sort: resolvedSort as never,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n cursor: null,\n };\n }, [effectiveWhere, resolvedSort]);\n\n const variables = useMemo(() => {\n return listConfig.buildQueryVariables(variablesBase);\n }, [listConfig, variablesBase]);\n\n const queryData = useLazyLoadQuery<OperationType>(\n listConfig.query,\n variables,\n { fetchPolicy: 'store-or-network' },\n );\n\n const {\n data: fragmentData,\n loadNext,\n hasNext,\n isLoadingNext,\n refetch,\n } = usePaginationFragment(listConfig.fragment, queryData as never);\n\n const connection = listConfig.getConnection(fragmentData);\n const rows = useMemo(() => {\n return connection.edges.map((edge) => {\n return listConfig.toRow(edge.node);\n });\n }, [connection.edges, listConfig]);\n\n const columns = useMemo(() => {\n return buildDataTableColumns(listConfig.columns, {\n tApp,\n t,\n });\n }, [listConfig.columns, t, tApp]);\n\n const getRowId = useCallback(\n (row: unknown) => {\n return listConfig.getRowId(row);\n },\n [listConfig],\n );\n\n const defaults = useMemo(() => {\n const baseWhere = relationWhere ?? listDefaults.where;\n return {\n where: baseWhere,\n sort: listDefaults.sort,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n cursor: null,\n };\n }, [listDefaults.sort, listDefaults.where, relationWhere]);\n\n const { onRefresh } = useBackofficeListRefetch({\n refetch,\n variables: variablesBase,\n defaults,\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildQueryVariables: listConfig.buildQueryVariables,\n });\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n });\n\n return (\n <BackofficeEntityListScaffold\n config={config as never}\n state={state as never}\n pushState={(next) => {\n setState(next);\n }}\n header={{ title }}\n rows={rows}\n columns={columns as never}\n getRowId={getRowId}\n hasNextPage={hasNext}\n isLoadingMore={isLoadingNext}\n onLoadMore={handleLoadMore}\n onRefresh={onRefresh}\n totalCount={connection.totalCount ?? null}\n variant=\"embedded\"\n />\n );\n};\n\nconst RelationListBlockBody = ({\n title,\n relation,\n value,\n}: RelationListBlockBodyProps): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n const relatedEntityIds = useMemo(() => {\n return [relation.target];\n }, [relation.target]);\n const relatedEntitiesState =\n useBackofficeListEntitiesLoader(relatedEntityIds);\n\n if (relatedEntitiesState.status === 'loading') {\n return <BackofficeTableSkeleton rows={6} ariaLabel={t('common.loading')} />;\n }\n\n if (relatedEntitiesState.status === 'error') {\n return (\n <InlineBanner tone=\"warning\" title={t('relations.unavailable.title')}>\n {t('relations.unavailable.description')}\n </InlineBanner>\n );\n }\n\n const config = relatedEntitiesState.modules[relation.target]?.config;\n if (config == null) {\n return null;\n }\n if (config.list.kind === 'records') {\n return null;\n }\n const connectionConfig = config as RelationListContentProps['config'];\n\n return (\n <RelationListContent\n title={title}\n config={connectionConfig}\n relation={relation}\n value={value}\n />\n );\n};\n\nexport const BackofficeDetailRelationListBlock = ({\n title,\n relation,\n value,\n}: BackofficeDetailRelationListBlockProps): JSX.Element => {\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return <RelationListSkeleton />;\n }}\n >\n <Suspense fallback={<RelationListSkeleton />}>\n <RelationListBlockBody\n title={title}\n relation={relation}\n value={value}\n />\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport default BackofficeDetailRelationListBlock;\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { DataTable as e } from "@plumile/ui";
2
+ import { jsx as t } from "react/jsx-runtime";
3
+ //#region src/components/backoffice/detail/BackofficeDetailTable.tsx
4
+ var n = (n) => /* @__PURE__ */ t(e, { ...n });
5
+ //#endregion
6
+ export { n as BackofficeDetailTable, n as default };
7
+
8
+ //# sourceMappingURL=BackofficeDetailTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackofficeDetailTable.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailTable.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { DataTable, type DataTableProps } from '@plumile/ui';\n\nexport type BackofficeDetailTableProps<Row> = DataTableProps<Row>;\n\nexport const BackofficeDetailTable = <Row,>(\n props: BackofficeDetailTableProps<Row>,\n): JSX.Element => {\n return <DataTable {...props} />;\n};\n\nexport default BackofficeDetailTable;\n"],"mappings":";;;AAKA,IAAa,KACX,MAEO,kBAAC,GAAD,EAAW,GAAI,GAAS,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ //#region src/components/backoffice/detail/BackofficeEmptyValue.tsx
3
+ var t = ({ label: t }) => /* @__PURE__ */ e("span", { children: t });
4
+ //#endregion
5
+ export { t as BackofficeEmptyValue, t as default };
6
+
7
+ //# sourceMappingURL=BackofficeEmptyValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackofficeEmptyValue.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeEmptyValue.tsx"],"sourcesContent":["import { type JSX } from 'react';\n\nexport type BackofficeEmptyValueProps = {\n readonly label: string;\n};\n\nexport const BackofficeEmptyValue = ({\n label,\n}: BackofficeEmptyValueProps): JSX.Element => {\n return <span>{label}</span>;\n};\n\nexport default BackofficeEmptyValue;\n"],"mappings":";;AAMA,IAAa,KAAwB,EACnC,eAEO,kBAAC,QAAD,EAAA,UAAO,GAAa,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { BackofficeStatusMetaBadge as e } from "./BackofficeStatusMetaBadge.js";
2
+ import { Fragment as t, jsx as n } from "react/jsx-runtime";
3
+ //#region src/components/backoffice/detail/BackofficeStatusGroup.tsx
4
+ var r = ({ statuses: r }) => /* @__PURE__ */ n(t, { children: r.map((t) => /* @__PURE__ */ n(e, { status: t }, t.label)) });
5
+ //#endregion
6
+ export { r as BackofficeStatusGroup, r as default };
7
+
8
+ //# sourceMappingURL=BackofficeStatusGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackofficeStatusGroup.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeStatusGroup.tsx"],"sourcesContent":["import { type JSX } from 'react';\n\nimport {\n BackofficeStatusMetaBadge,\n type BackofficeStatusMeta,\n} from './BackofficeStatusMetaBadge.js';\n\nexport type BackofficeStatusGroupProps = {\n readonly statuses: readonly BackofficeStatusMeta[];\n};\n\nexport const BackofficeStatusGroup = ({\n statuses,\n}: BackofficeStatusGroupProps): JSX.Element => {\n return (\n <>\n {statuses.map((status) => {\n return <BackofficeStatusMetaBadge key={status.label} status={status} />;\n })}\n </>\n );\n};\n\nexport default BackofficeStatusGroup;\n"],"mappings":";;;AAWA,IAAa,KAAyB,EACpC,kBAGE,kBAAA,GAAA,EAAA,UACG,EAAS,KAAK,MACN,kBAAC,GAAD,EAAsD,WAAU,EAAhC,EAAO,MAAyB,CACvE,EACD,CAAA"}
@@ -0,0 +1,2 @@
1
+ import { BackofficeDetailSection as e } from "./BackofficeDetailSection.js";
2
+ export { e as BackofficeTechnicalFacts };
@@ -13,17 +13,25 @@ var { useLazyLoadQuery: o } = a, s = (e) => {
13
13
  return n === "" ? null : n;
14
14
  }, c = ({ valueConfig: e, id: t, children: n }) => {
15
15
  let r = o(e.query, { id: t }), i = e.resolveRow(r), a = null;
16
- return i != null && (a = e.toRow(i)), n(s(a));
16
+ i != null && (a = e.toRow(i));
17
+ let c = s(a), l = "resolved";
18
+ return c ?? (l = "unresolved"), n(c, { status: l });
17
19
  }, l = ({ entityId: e, id: a, children: o }) => {
18
- let s = n(e, { enabled: a.trim() !== "" }), l = null;
19
- s.status === "loaded" && (l = s.module.config.picker.value ?? null);
20
- let u = o(null);
21
- return l == null ? u : /* @__PURE__ */ i(t, {
22
- fallback: () => u,
20
+ let s = a.trim(), l = n(e, { enabled: s !== "" });
21
+ if (s === "") return o(null, { status: "unavailable" });
22
+ let u = null;
23
+ l.status === "loaded" && (u = l.module.config.picker.value ?? null);
24
+ let d = o(null, { status: "loading" });
25
+ if (l.status === "loading") return d;
26
+ let f = "unavailable";
27
+ l.status === "error" && (f = "error");
28
+ let p = o(null, { status: f });
29
+ return u == null ? p : /* @__PURE__ */ i(t, {
30
+ fallback: () => o(null, { status: "error" }),
23
31
  children: /* @__PURE__ */ i(r, {
24
- fallback: u,
32
+ fallback: d,
25
33
  children: /* @__PURE__ */ i(c, {
26
- valueConfig: l,
34
+ valueConfig: u,
27
35
  id: a,
28
36
  children: o
29
37
  })
@@ -1 +1 @@
1
- {"version":3,"file":"EntityFilterValue.js","names":[],"sources":["../../../../../src/components/backoffice/filters/EntityFilterValue.tsx"],"sourcesContent":["import { Suspense, type JSX } from 'react';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport type { BackofficePickerValueConfig } from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficePickerEntityLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\ntype EntityFilterValueContentProps<RowRef, RowView> = {\n valueConfig: BackofficePickerValueConfig<RowRef, RowView>;\n id: string;\n children: (label: string | null) => JSX.Element;\n};\n\nconst resolveTitle = (value: unknown): string | null => {\n if (value == null || typeof value !== 'object') {\n return null;\n }\n const { title } = value as { title?: unknown };\n if (typeof title !== 'string') {\n return null;\n }\n const trimmed = title.trim();\n if (trimmed === '') {\n return null;\n }\n return trimmed;\n};\n\nconst EntityFilterValueContent = <RowRef, RowView>({\n valueConfig,\n id,\n children,\n}: EntityFilterValueContentProps<RowRef, RowView>): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(valueConfig.query, { id });\n const rowRef = valueConfig.resolveRow(data);\n let row: RowView | null = null;\n if (rowRef != null) {\n row = valueConfig.toRow(rowRef);\n }\n const title = resolveTitle(row);\n\n return children(title);\n};\n\nexport type EntityFilterValueTextProps = {\n entityId: string;\n id: string;\n children: (label: string | null) => JSX.Element;\n};\n\nexport const EntityFilterValueText = ({\n entityId,\n id,\n children,\n}: EntityFilterValueTextProps): JSX.Element => {\n const resolvedId = id.trim();\n const pickerEntityState = useBackofficePickerEntityLoader(entityId, {\n enabled: resolvedId !== '',\n });\n let valueConfig: BackofficePickerValueConfig<unknown, unknown> | null = null;\n if (pickerEntityState.status === 'loaded') {\n valueConfig = pickerEntityState.module.config.picker.value ?? null;\n }\n\n const fallback = children(null);\n if (valueConfig == null) {\n return fallback;\n }\n\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return fallback;\n }}\n >\n <Suspense fallback={fallback}>\n <EntityFilterValueContent valueConfig={valueConfig} id={id}>\n {children}\n </EntityFilterValueContent>\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport type EntityFilterValueProps = {\n entityId: string;\n id: string;\n};\n\nexport const EntityFilterValue = ({\n entityId,\n id,\n}: EntityFilterValueProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const resolvedId = id.trim();\n\n return (\n <EntityFilterValueText entityId={entityId} id={id}>\n {(label) => {\n let fallbackLabel = resolvedId;\n if (resolvedId === '') {\n fallbackLabel = t('filters.placeholders.unresolved');\n }\n return <span>{label ?? fallbackLabel}</span>;\n }}\n </EntityFilterValueText>\n );\n};\n\nexport default EntityFilterValue;\n"],"mappings":";;;;;;;AAUA,IAAM,EAAE,kBAAA,MAAqB,GAQvB,KAAgB,MAAkC;CACtD,IAAqB,OAAO,KAAU,aAAlC,GACF,OAAO;CAET,IAAM,EAAE,aAAU;CAClB,IAAI,OAAO,KAAU,UACnB,OAAO;CAET,IAAM,IAAU,EAAM,MAAM;CAI5B,OAHI,MAAY,KACP,OAEF;GAGH,KAA6C,EACjD,gBACA,OACA,kBACiE;CACjE,IAAM,IAAO,EAAgC,EAAY,OAAO,EAAE,OAAI,CAAC,EACjE,IAAS,EAAY,WAAW,EAAK,EACvC,IAAsB;CAM1B,OALI,KAAU,SACZ,IAAM,EAAY,MAAM,EAAO,GAI1B,EAFO,EAAa,EAEX,CAAM;GASX,KAAyB,EACpC,aACA,OACA,kBAC6C;CAE7C,IAAM,IAAoB,EAAgC,GAAU,EAClE,SAFiB,EAAG,MAEX,KAAe,IACzB,CAAC,EACE,IAAoE;CACxE,AAAI,EAAkB,WAAW,aAC/B,IAAc,EAAkB,OAAO,OAAO,OAAO,SAAS;CAGhE,IAAM,IAAW,EAAS,KAAK;CAK/B,OAJI,KAAe,OACV,IAIP,kBAAC,GAAD;EACE,gBACS;YAGT,kBAAC,GAAD;GAAoB;aAClB,kBAAC,GAAD;IAAuC;IAAiB;IACrD;IACwB,CAAA;GAClB,CAAA;EACa,CAAA;GASjB,KAAqB,EAChC,aACA,YACyC;CACzC,IAAM,EAAE,SAAM,GAA+B,EACvC,IAAa,EAAG,MAAM;CAE5B,OACE,kBAAC,GAAD;EAAiC;EAAc;aAC3C,MAAU;GACV,IAAI,IAAgB;GAIpB,OAHI,MAAe,OACjB,IAAgB,EAAE,kCAAkC,GAE/C,kBAAC,QAAD,EAAA,UAAO,KAAS,GAAqB,CAAA;;EAExB,CAAA"}
1
+ {"version":3,"file":"EntityFilterValue.js","names":[],"sources":["../../../../../src/components/backoffice/filters/EntityFilterValue.tsx"],"sourcesContent":["import { Suspense, type JSX } from 'react';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport type { BackofficePickerValueConfig } from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficePickerEntityLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\ntype EntityFilterValueContentProps<RowRef, RowView> = {\n valueConfig: BackofficePickerValueConfig<RowRef, RowView>;\n id: string;\n children: EntityFilterValueTextChildren;\n};\n\nconst resolveTitle = (value: unknown): string | null => {\n if (value == null || typeof value !== 'object') {\n return null;\n }\n const { title } = value as { title?: unknown };\n if (typeof title !== 'string') {\n return null;\n }\n const trimmed = title.trim();\n if (trimmed === '') {\n return null;\n }\n return trimmed;\n};\n\nconst EntityFilterValueContent = <RowRef, RowView>({\n valueConfig,\n id,\n children,\n}: EntityFilterValueContentProps<RowRef, RowView>): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(valueConfig.query, { id });\n const rowRef = valueConfig.resolveRow(data);\n let row: RowView | null = null;\n if (rowRef != null) {\n row = valueConfig.toRow(rowRef);\n }\n const title = resolveTitle(row);\n let status: EntityFilterValueTextState['status'] = 'resolved';\n if (title == null) {\n status = 'unresolved';\n }\n\n return children(title, { status });\n};\n\nexport type EntityFilterValueTextState = {\n status: 'loading' | 'resolved' | 'unresolved' | 'unavailable' | 'error';\n};\n\nexport type EntityFilterValueTextChildren = (\n label: string | null,\n state?: EntityFilterValueTextState,\n) => JSX.Element;\n\nexport type EntityFilterValueTextProps = {\n entityId: string;\n id: string;\n children: EntityFilterValueTextChildren;\n};\n\nexport const EntityFilterValueText = ({\n entityId,\n id,\n children,\n}: EntityFilterValueTextProps): JSX.Element => {\n const resolvedId = id.trim();\n const pickerEntityState = useBackofficePickerEntityLoader(entityId, {\n enabled: resolvedId !== '',\n });\n\n if (resolvedId === '') {\n return children(null, { status: 'unavailable' });\n }\n\n let valueConfig: BackofficePickerValueConfig<unknown, unknown> | null = null;\n if (pickerEntityState.status === 'loaded') {\n valueConfig = pickerEntityState.module.config.picker.value ?? null;\n }\n\n const loadingFallback = children(null, { status: 'loading' });\n if (pickerEntityState.status === 'loading') {\n return loadingFallback;\n }\n\n let unavailableStatus: EntityFilterValueTextState['status'] = 'unavailable';\n if (pickerEntityState.status === 'error') {\n unavailableStatus = 'error';\n }\n const unavailableFallback = children(null, {\n status: unavailableStatus,\n });\n if (valueConfig == null) {\n return unavailableFallback;\n }\n\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return children(null, { status: 'error' });\n }}\n >\n <Suspense fallback={loadingFallback}>\n <EntityFilterValueContent valueConfig={valueConfig} id={id}>\n {children}\n </EntityFilterValueContent>\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport type EntityFilterValueProps = {\n entityId: string;\n id: string;\n};\n\nexport const EntityFilterValue = ({\n entityId,\n id,\n}: EntityFilterValueProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const resolvedId = id.trim();\n\n return (\n <EntityFilterValueText entityId={entityId} id={id}>\n {(label) => {\n let fallbackLabel = resolvedId;\n if (resolvedId === '') {\n fallbackLabel = t('filters.placeholders.unresolved');\n }\n return <span>{label ?? fallbackLabel}</span>;\n }}\n </EntityFilterValueText>\n );\n};\n\nexport default EntityFilterValue;\n"],"mappings":";;;;;;;AAUA,IAAM,EAAE,kBAAA,MAAqB,GAQvB,KAAgB,MAAkC;CACtD,IAAqB,OAAO,KAAU,aAAlC,GACF,OAAO;CAET,IAAM,EAAE,aAAU;CAClB,IAAI,OAAO,KAAU,UACnB,OAAO;CAET,IAAM,IAAU,EAAM,MAAM;CAI5B,OAHI,MAAY,KACP,OAEF;GAGH,KAA6C,EACjD,gBACA,OACA,kBACiE;CACjE,IAAM,IAAO,EAAgC,EAAY,OAAO,EAAE,OAAI,CAAC,EACjE,IAAS,EAAY,WAAW,EAAK,EACvC,IAAsB;CAC1B,AAAI,KAAU,SACZ,IAAM,EAAY,MAAM,EAAO;CAEjC,IAAM,IAAQ,EAAa,EAAI,EAC3B,IAA+C;CAKnD,OAJI,MACF,IAAS,eAGJ,EAAS,GAAO,EAAE,WAAQ,CAAC;GAkBvB,KAAyB,EACpC,aACA,OACA,kBAC6C;CAC7C,IAAM,IAAa,EAAG,MAAM,EACtB,IAAoB,EAAgC,GAAU,EAClE,SAAS,MAAe,IACzB,CAAC;CAEF,IAAI,MAAe,IACjB,OAAO,EAAS,MAAM,EAAE,QAAQ,eAAe,CAAC;CAGlD,IAAI,IAAoE;CACxE,AAAI,EAAkB,WAAW,aAC/B,IAAc,EAAkB,OAAO,OAAO,OAAO,SAAS;CAGhE,IAAM,IAAkB,EAAS,MAAM,EAAE,QAAQ,WAAW,CAAC;CAC7D,IAAI,EAAkB,WAAW,WAC/B,OAAO;CAGT,IAAI,IAA0D;CAC9D,AAAI,EAAkB,WAAW,YAC/B,IAAoB;CAEtB,IAAM,IAAsB,EAAS,MAAM,EACzC,QAAQ,GACT,CAAC;CAKF,OAJI,KAAe,OACV,IAIP,kBAAC,GAAD;EACE,gBACS,EAAS,MAAM,EAAE,QAAQ,SAAS,CAAC;YAG5C,kBAAC,GAAD;GAAU,UAAU;aAClB,kBAAC,GAAD;IAAuC;IAAiB;IACrD;IACwB,CAAA;GAClB,CAAA;EACa,CAAA;GASjB,KAAqB,EAChC,aACA,YACyC;CACzC,IAAM,EAAE,SAAM,GAA+B,EACvC,IAAa,EAAG,MAAM;CAE5B,OACE,kBAAC,GAAD;EAAiC;EAAc;aAC3C,MAAU;GACV,IAAI,IAAgB;GAIpB,OAHI,MAAe,OACjB,IAAgB,EAAE,kCAAkC,GAE/C,kBAAC,QAAD,EAAA,UAAO,KAAS,GAAqB,CAAA;;EAExB,CAAA"}
@@ -1,65 +1,97 @@
1
1
  import { useBackofficeReactTranslation as e } from "../../../i18n/useBackofficeReactTranslation.js";
2
- import { actions as t, container as n, labelText as r, pickText as i, pickerButton as a, placeholder as o, valueText as s } from "./entityIdFilterField.css.js";
3
- import { Button as c } from "@plumile/ui";
4
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
2
+ import { actionIcon as t, clearButton as n, container as r, content as i, labelText as a, pickActionButton as o, pickerButton as s, pickerControl as c, placeholder as l, valueText as u } from "./entityIdFilterField.css.js";
3
+ import { BackofficeSidebarPenToolSvg as d, BackofficeSidebarSearchSvg as f } from "@plumile/ui";
4
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
5
5
  //#region src/components/backoffice/filters/EntityIdFilterField.tsx
6
- var d = (d) => {
7
- let { disabled: f = !1, id: p, label: m, value: h, displayValue: g, placeholder: _, ariaDescribedBy: v, ariaInvalid: y, onPick: b, onClear: x } = d, { t: S } = e(), C = h?.trim() ?? "", w = g?.trim() ?? "", T = C !== "", E = w !== "", D = _ ?? S("filters.placeholders.anyEntity", { label: m }), O = S("filters.placeholders.unresolved"), k;
8
- k = E ? /* @__PURE__ */ l("span", {
9
- className: s,
10
- children: w
11
- }) : T ? /* @__PURE__ */ l("span", {
12
- className: o,
13
- children: O
14
- }) : /* @__PURE__ */ l("span", {
15
- className: o,
16
- children: D
17
- });
18
- let A = S("common.actions.pick");
19
- T && (A = S("common.actions.change"));
20
- let j = `${A} ${m}`, M = S("common.actions.clear"), N = `${M} ${m}`, P = null;
21
- T && x != null && (P = /* @__PURE__ */ l(c, {
22
- type: "button",
23
- variant: "text",
24
- size: "small",
25
- "aria-label": N,
26
- disabled: f,
27
- onClick: x,
6
+ var h = (h) => {
7
+ let { disabled: g = !1, id: _, label: v, value: y, displayValue: b, placeholder: x, ariaDescribedBy: S, ariaInvalid: C, isResolving: w = !1, onPick: T, onClear: E } = h, { t: D } = e(), O = y?.trim() ?? "", k = b?.trim() ?? "", A = O !== "", j = k !== "", M = x ?? D("filters.placeholders.anyEntity", { label: v }), N = D("filters.placeholders.unresolved"), P;
8
+ P = j ? /* @__PURE__ */ p("span", {
9
+ className: u,
10
+ children: k
11
+ }) : A ? /* @__PURE__ */ p("span", {
12
+ className: l,
13
+ children: N
14
+ }) : /* @__PURE__ */ p("span", {
15
+ className: l,
28
16
  children: M
29
- }));
30
- let F = null;
31
- return b != null && (F = /* @__PURE__ */ u("button", {
32
- id: p,
17
+ });
18
+ let F = D("common.actions.pick");
19
+ A && (F = D("common.actions.change"));
20
+ let I = `${F} ${v}`, L = `${D("common.actions.clear")} ${v}`, R = null;
21
+ A && E != null && (R = /* @__PURE__ */ p("button", {
33
22
  type: "button",
34
- className: a,
35
- "aria-label": j,
36
- "aria-describedby": v,
37
- "aria-invalid": y,
38
- disabled: f,
39
- onClick: b,
40
- children: [
41
- /* @__PURE__ */ l("span", {
42
- className: r,
43
- children: m
44
- }),
45
- k,
46
- /* @__PURE__ */ l("span", {
47
- className: i,
48
- children: A
49
- })
50
- ]
51
- })), /* @__PURE__ */ u("div", {
52
23
  className: n,
53
- children: [F ?? /* @__PURE__ */ l("div", {
54
- className: "txvbqb9my txvbqbk5y txvbqb9ip txvbqbcp txvbqbl7g",
55
- children: k
56
- }), /* @__PURE__ */ l("div", {
24
+ "aria-label": L,
25
+ disabled: g,
26
+ onClick: (e) => {
27
+ e.stopPropagation(), E();
28
+ },
29
+ children: /* @__PURE__ */ p("svg", {
30
+ width: "12",
31
+ height: "12",
32
+ viewBox: "0 0 12 12",
33
+ fill: "none",
34
+ "aria-hidden": "true",
35
+ children: /* @__PURE__ */ p("path", {
36
+ d: "M3 3L9 9M9 3L3 9",
37
+ stroke: "currentColor",
38
+ strokeWidth: "1.6",
39
+ strokeLinecap: "round"
40
+ })
41
+ })
42
+ }));
43
+ let z = null;
44
+ if (T != null) {
45
+ let e = /* @__PURE__ */ p(f, {
57
46
  className: t,
47
+ "aria-hidden": "true"
48
+ });
49
+ A && (e = /* @__PURE__ */ p(d, {
50
+ className: t,
51
+ "aria-hidden": "true"
52
+ })), z = /* @__PURE__ */ m("div", {
53
+ className: c,
54
+ children: [
55
+ /* @__PURE__ */ p("button", {
56
+ id: _,
57
+ type: "button",
58
+ className: s,
59
+ "aria-label": I,
60
+ "aria-describedby": S,
61
+ "aria-invalid": C,
62
+ "aria-busy": w || void 0,
63
+ disabled: g,
64
+ onClick: T,
65
+ children: /* @__PURE__ */ m("span", {
66
+ className: i,
67
+ children: [/* @__PURE__ */ p("span", {
68
+ className: a,
69
+ children: v
70
+ }), P]
71
+ })
72
+ }),
73
+ /* @__PURE__ */ p("button", {
74
+ type: "button",
75
+ className: o,
76
+ "aria-label": I,
77
+ title: I,
78
+ disabled: g,
79
+ onClick: T,
80
+ children: e
81
+ }),
82
+ R
83
+ ]
84
+ });
85
+ }
86
+ return /* @__PURE__ */ p("div", {
87
+ className: r,
88
+ children: z ?? /* @__PURE__ */ p("div", {
89
+ className: "txvbqb9my txvbqbk5y txvbqb9ip txvbqbcp txvbqbl7g",
58
90
  children: P
59
- })]
91
+ })
60
92
  });
61
93
  };
62
94
  //#endregion
63
- export { d as EntityIdFilterField, d as default };
95
+ export { h as EntityIdFilterField, h as default };
64
96
 
65
97
  //# sourceMappingURL=EntityIdFilterField.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EntityIdFilterField.js","names":[],"sources":["../../../../../src/components/backoffice/filters/EntityIdFilterField.tsx"],"sourcesContent":["import { type JSX } from 'react';\n\nimport { Button } from '@plumile/ui';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './entityIdFilterField.css.js';\n\nexport type EntityIdFilterFieldProps = {\n id?: string;\n label: string;\n value: string | null;\n displayValue?: string | null;\n placeholder?: string;\n ariaDescribedBy?: string;\n ariaInvalid?: boolean;\n onPick?: () => void;\n onClear?: () => void;\n disabled?: boolean;\n};\n\nexport const EntityIdFilterField = (\n props: EntityIdFilterFieldProps,\n): JSX.Element => {\n const {\n disabled = false,\n id,\n label,\n value,\n displayValue,\n placeholder,\n ariaDescribedBy,\n ariaInvalid,\n onPick,\n onClear,\n } = props;\n const { t } = useBackofficeReactTranslation();\n const normalizedValue = value?.trim() ?? '';\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n const hasValue = normalizedValue !== '';\n const hasDisplayValue = normalizedDisplayValue !== '';\n\n const resolvedPlaceholder =\n placeholder ?? t('filters.placeholders.anyEntity', { label });\n const unresolvedPlaceholder = t('filters.placeholders.unresolved');\n\n let displayNode: JSX.Element;\n if (hasDisplayValue) {\n displayNode = (\n <span className={styles.valueText}>{normalizedDisplayValue}</span>\n );\n } else if (hasValue) {\n displayNode = (\n <span className={styles.placeholder}>{unresolvedPlaceholder}</span>\n );\n } else {\n displayNode = (\n <span className={styles.placeholder}>{resolvedPlaceholder}</span>\n );\n }\n\n let pickLabel = t('common.actions.pick');\n if (hasValue) {\n pickLabel = t('common.actions.change');\n }\n const pickAriaLabel = `${pickLabel} ${label}`;\n const clearLabel = t('common.actions.clear');\n const clearAriaLabel = `${clearLabel} ${label}`;\n\n let clearNode: JSX.Element | null = null;\n if (hasValue && onClear != null) {\n clearNode = (\n <Button\n type=\"button\"\n variant=\"text\"\n size=\"small\"\n aria-label={clearAriaLabel}\n disabled={disabled}\n onClick={onClear}\n >\n {clearLabel}\n </Button>\n );\n }\n\n let pickerNode: JSX.Element | null = null;\n if (onPick != null) {\n pickerNode = (\n <button\n id={id}\n type=\"button\"\n className={styles.pickerButton}\n aria-label={pickAriaLabel}\n aria-describedby={ariaDescribedBy}\n aria-invalid={ariaInvalid}\n disabled={disabled}\n onClick={onPick}\n >\n <span className={styles.labelText}>{label}</span>\n {displayNode}\n <span className={styles.pickText}>{pickLabel}</span>\n </button>\n );\n }\n\n return (\n <div className={styles.container}>\n {pickerNode ?? <div className={styles.valueBox}>{displayNode}</div>}\n <div className={styles.actions}>{clearNode}</div>\n </div>\n );\n};\n\nexport default EntityIdFilterField;\n"],"mappings":";;;;;AAqBA,IAAa,KACX,MACgB;CAChB,IAAM,EACJ,cAAW,IACX,OACA,UACA,UACA,iBACA,aAAA,GACA,oBACA,gBACA,WACA,eACE,GACE,EAAE,SAAM,GAA+B,EACvC,IAAkB,GAAO,MAAM,IAAI,IACnC,IAAyB,GAAc,MAAM,IAAI,IACjD,IAAW,MAAoB,IAC/B,IAAkB,MAA2B,IAE7C,IACJ,KAAe,EAAE,kCAAkC,EAAE,UAAO,CAAC,EACzD,IAAwB,EAAE,kCAAkC,EAE9D;CACJ,AASE,IATE,IAEA,kBAAC,QAAD;EAAM,WAAW;YAAmB;EAA8B,CAAA,GAE3D,IAEP,kBAAC,QAAD;EAAM,WAAW;YAAqB;EAA6B,CAAA,GAInE,kBAAC,QAAD;EAAM,WAAW;YAAqB;EAA2B,CAAA;CAIrE,IAAI,IAAY,EAAE,sBAAsB;CACxC,AAAI,MACF,IAAY,EAAE,wBAAwB;CAExC,IAAM,IAAgB,GAAG,EAAU,GAAG,KAChC,IAAa,EAAE,uBAAuB,EACtC,IAAiB,GAAG,EAAW,GAAG,KAEpC,IAAgC;CACpC,AAAI,KAAY,KAAW,SACzB,IACE,kBAAC,GAAD;EACE,MAAK;EACL,SAAQ;EACR,MAAK;EACL,cAAY;EACF;EACV,SAAS;YAER;EACM,CAAA;CAIb,IAAI,IAAiC;CAoBrC,OAnBI,KAAU,SACZ,IACE,kBAAC,UAAD;EACM;EACJ,MAAK;EACL,WAAW;EACX,cAAY;EACZ,oBAAkB;EAClB,gBAAc;EACJ;EACV,SAAS;YARX;GAUE,kBAAC,QAAD;IAAM,WAAW;cAAmB;IAAa,CAAA;GAChD;GACD,kBAAC,QAAD;IAAM,WAAW;cAAkB;IAAiB,CAAA;GAC7C;MAKX,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACG,KAAc,kBAAC,OAAD;GAAK,WAAW;aAAkB;GAAkB,CAAA,EACnE,kBAAC,OAAD;GAAK,WAAW;aAAiB;GAAgB,CAAA,CAC7C"}
1
+ {"version":3,"file":"EntityIdFilterField.js","names":[],"sources":["../../../../../src/components/backoffice/filters/EntityIdFilterField.tsx"],"sourcesContent":["import { type JSX } from 'react';\n\nimport {\n BackofficeSidebarPenToolSvg,\n BackofficeSidebarSearchSvg,\n} from '@plumile/ui';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './entityIdFilterField.css.js';\n\nexport type EntityIdFilterFieldProps = {\n id?: string;\n label: string;\n value: string | null;\n displayValue?: string | null;\n placeholder?: string;\n ariaDescribedBy?: string;\n ariaInvalid?: boolean;\n isResolving?: boolean;\n onPick?: () => void;\n onClear?: () => void;\n disabled?: boolean;\n};\n\nexport const EntityIdFilterField = (\n props: EntityIdFilterFieldProps,\n): JSX.Element => {\n const {\n disabled = false,\n id,\n label,\n value,\n displayValue,\n placeholder,\n ariaDescribedBy,\n ariaInvalid,\n isResolving = false,\n onPick,\n onClear,\n } = props;\n const { t } = useBackofficeReactTranslation();\n const normalizedValue = value?.trim() ?? '';\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n const hasValue = normalizedValue !== '';\n const hasDisplayValue = normalizedDisplayValue !== '';\n\n const resolvedPlaceholder =\n placeholder ?? t('filters.placeholders.anyEntity', { label });\n const unresolvedPlaceholder = t('filters.placeholders.unresolved');\n\n let displayNode: JSX.Element;\n if (hasDisplayValue) {\n displayNode = (\n <span className={styles.valueText}>{normalizedDisplayValue}</span>\n );\n } else if (hasValue) {\n displayNode = (\n <span className={styles.placeholder}>{unresolvedPlaceholder}</span>\n );\n } else {\n displayNode = (\n <span className={styles.placeholder}>{resolvedPlaceholder}</span>\n );\n }\n\n let pickLabel = t('common.actions.pick');\n if (hasValue) {\n pickLabel = t('common.actions.change');\n }\n const pickAriaLabel = `${pickLabel} ${label}`;\n const clearLabel = t('common.actions.clear');\n const clearAriaLabel = `${clearLabel} ${label}`;\n\n let clearNode: JSX.Element | null = null;\n if (hasValue && onClear != null) {\n clearNode = (\n <button\n type=\"button\"\n className={styles.clearButton}\n aria-label={clearAriaLabel}\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n onClear();\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 3L9 9M9 3L3 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n );\n }\n\n let pickerNode: JSX.Element | null = null;\n if (onPick != null) {\n let actionIcon = (\n <BackofficeSidebarSearchSvg\n className={styles.actionIcon}\n aria-hidden=\"true\"\n />\n );\n if (hasValue) {\n actionIcon = (\n <BackofficeSidebarPenToolSvg\n className={styles.actionIcon}\n aria-hidden=\"true\"\n />\n );\n }\n\n pickerNode = (\n <div className={styles.pickerControl}>\n <button\n id={id}\n type=\"button\"\n className={styles.pickerButton}\n aria-label={pickAriaLabel}\n aria-describedby={ariaDescribedBy}\n aria-invalid={ariaInvalid}\n aria-busy={isResolving || undefined}\n disabled={disabled}\n onClick={onPick}\n >\n <span className={styles.content}>\n <span className={styles.labelText}>{label}</span>\n {displayNode}\n </span>\n </button>\n <button\n type=\"button\"\n className={styles.pickActionButton}\n aria-label={pickAriaLabel}\n title={pickAriaLabel}\n disabled={disabled}\n onClick={onPick}\n >\n {actionIcon}\n </button>\n {clearNode}\n </div>\n );\n }\n\n return (\n <div className={styles.container}>\n {pickerNode ?? <div className={styles.valueBox}>{displayNode}</div>}\n </div>\n );\n};\n\nexport default EntityIdFilterField;\n"],"mappings":";;;;;AAwBA,IAAa,KACX,MACgB;CAChB,IAAM,EACJ,cAAW,IACX,OACA,UACA,UACA,iBACA,aAAA,GACA,oBACA,gBACA,iBAAc,IACd,WACA,eACE,GACE,EAAE,SAAM,GAA+B,EACvC,IAAkB,GAAO,MAAM,IAAI,IACnC,IAAyB,GAAc,MAAM,IAAI,IACjD,IAAW,MAAoB,IAC/B,IAAkB,MAA2B,IAE7C,IACJ,KAAe,EAAE,kCAAkC,EAAE,UAAO,CAAC,EACzD,IAAwB,EAAE,kCAAkC,EAE9D;CACJ,AASE,IATE,IAEA,kBAAC,QAAD;EAAM,WAAW;YAAmB;EAA8B,CAAA,GAE3D,IAEP,kBAAC,QAAD;EAAM,WAAW;YAAqB;EAA6B,CAAA,GAInE,kBAAC,QAAD;EAAM,WAAW;YAAqB;EAA2B,CAAA;CAIrE,IAAI,IAAY,EAAE,sBAAsB;CACxC,AAAI,MACF,IAAY,EAAE,wBAAwB;CAExC,IAAM,IAAgB,GAAG,EAAU,GAAG,KAEhC,IAAiB,GADJ,EAAE,uBACK,CAAW,GAAG,KAEpC,IAAgC;CACpC,AAAI,KAAY,KAAW,SACzB,IACE,kBAAC,UAAD;EACE,MAAK;EACL,WAAW;EACX,cAAY;EACF;EACV,UAAU,MAAU;GAElB,AADA,EAAM,iBAAiB,EACvB,GAAS;;YAGX,kBAAC,OAAD;GACE,OAAM;GACN,QAAO;GACP,SAAQ;GACR,MAAK;GACL,eAAY;aAEZ,kBAAC,QAAD;IACE,GAAE;IACF,QAAO;IACP,aAAY;IACZ,eAAc;IACd,CAAA;GACE,CAAA;EACC,CAAA;CAIb,IAAI,IAAiC;CACrC,IAAI,KAAU,MAAM;EAClB,IAAI,IACF,kBAAC,GAAD;GACE,WAAW;GACX,eAAY;GACZ,CAAA;EAWJ,AATI,MACF,IACE,kBAAC,GAAD;GACE,WAAW;GACX,eAAY;GACZ,CAAA,GAIN,IACE,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACE,kBAAC,UAAD;KACM;KACJ,MAAK;KACL,WAAW;KACX,cAAY;KACZ,oBAAkB;KAClB,gBAAc;KACd,aAAW,KAAe,KAAA;KAChB;KACV,SAAS;eAET,kBAAC,QAAD;MAAM,WAAW;gBAAjB,CACE,kBAAC,QAAD;OAAM,WAAW;iBAAmB;OAAa,CAAA,EAChD,EACI;;KACA,CAAA;IACT,kBAAC,UAAD;KACE,MAAK;KACL,WAAW;KACX,cAAY;KACZ,OAAO;KACG;KACV,SAAS;eAER;KACM,CAAA;IACR;IACG;;;CAIV,OACE,kBAAC,OAAD;EAAK,WAAW;YACb,KAAc,kBAAC,OAAD;GAAK,WAAW;aAAkB;GAAkB,CAAA;EAC/D,CAAA"}
@@ -1,7 +1,7 @@
1
1
  /* empty css */
2
2
  //#region src/components/backoffice/filters/entityIdFilterField.css.ts
3
- var e = "txvbqb9ip txvbqbcp txvbqbany txvbqbu4g txvbqbjep", t = "oa1uye0 txvbqbnw7 txvbqbojg txvbqbpry txvbqbmjp txvbqb6 txvbqb9iy txvbqbcp txvbqbb9g txvbqb9my txvbqbk5y txvbqbt6p txvbqbv txvbqb1ry txvbqb1cp txvbqb1qg txvbqbwg txvbqbv41 txvbqbv9z txvbqb77 txvbqb6x txvbqb7k", n = "txvbqb9my txvbqbk5y txvbqb9ip txvbqbcp txvbqbl7g", r = "oa1uye1 txvbqb9i7 txvbqbva3 txvbqb8p txvbqbamg txvbqbl7g txvbqbt7g txvbqbuxg", i = "txvbqb9i7 txvbqbk5y txvbqbl7g txvbqbt7g txvbqbuxg txvbqb8y txvbqbamp", a = "txvbqbva3 txvbqb8y", o = "txvbqbvb7 txvbqb8p txvbqbamp", s = "txvbqb9ip txvbqbcp txvbqbany";
3
+ var e = "txvbqb9ip txvbqbcp txvbqbu4g txvbqbjep txvbqbk5y", t = "oa1uye0 txvbqbnw7 txvbqbojg txvbqbpry txvbqbmjp txvbqb9iy txvbqbcp txvbqb9my txvbqbk5y txvbqb1ry txvbqb1cp txvbqb1qg txvbqbwg txvbqbv41 txvbqbv9z txvbqb77 txvbqb6x txvbqb7k", n = "oa1uye1 txvbqb6 txvbqb9ip txvbqbai7 txvbqbdoy txvbqbk5y txvbqbu7g txvbqbt6p txvbqbv txvbqb12g txvbqbv0t txvbqbv9z txvbqblag", r = "oa1uye2 txvbqb9ip txvbqbai7 txvbqbdoy txvbqbb9g txvbqbk5y txvbqbu7g", i = "txvbqb9my txvbqbk5y txvbqb9ip txvbqbcp txvbqbl7g", a = "oa1uye3 txvbqb9i7 txvbqbva3 txvbqb8p txvbqbamg txvbqbl7g txvbqbt7g txvbqbuxg", o = "txvbqb9i7 txvbqbk5y txvbqbl7g txvbqbt7g txvbqbuxg txvbqb8y txvbqbamp", s = "txvbqb9i7 txvbqbk5y txvbqbl7g txvbqbt7g txvbqbuxg txvbqbva3 txvbqb8y", c = "oa1uye5 oa1uye4 txvbqb6 txvbqb9jg txvbqbcp txvbqbdoy txvbqbtxy txvbqbc6y txvbqblag txvbqb1rp txvbqb1cp txvbqb1qg txvbqbwp txvbqbv41 txvbqbva3 txvbqbv txvbqb78 txvbqb6w txvbqb7k", l = "oa1uye6 oa1uye4 txvbqb6 txvbqb9jg txvbqbcp txvbqbdoy txvbqbtxy txvbqbc6y txvbqblag txvbqb1rp txvbqb1cp txvbqb1qg txvbqbwp txvbqbv41 txvbqbva3 txvbqbv txvbqb78 txvbqb6w txvbqb7k txvbqb1t7 txvbqbv45", u = "oa1uye7";
4
4
  //#endregion
5
- export { s as actions, e as container, r as labelText, o as pickText, t as pickerButton, a as placeholder, n as valueBox, i as valueText };
5
+ export { u as actionIcon, l as clearButton, e as container, r as content, a as labelText, c as pickActionButton, n as pickerButton, t as pickerControl, s as placeholder, i as valueBox, o as valueText };
6
6
 
7
7
  //# sourceMappingURL=entityIdFilterField.css.js.map