@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
@@ -0,0 +1,81 @@
1
+ import { resolveSidebarHub as e } from "../layout/sidebarUtils.js";
2
+ import { resolveBackofficeTargetIcon as t } from "./resolveBackofficeTargetIcon.js";
3
+ import { buildBackofficeFallbackListHref as n } from "@plumile/backoffice-core/state/buildListHref.js";
4
+ //#region src/components/backoffice/links/resolveBackofficeLink.ts
5
+ var r = (e, t) => {
6
+ let n = e[t];
7
+ if (n == null) throw Error(`Unknown backoffice entity: ${t}`);
8
+ return n;
9
+ }, i = (t, n) => {
10
+ let r = t?.hubs?.[n];
11
+ if (r != null) return r.href;
12
+ for (let r of Object.values(t?.groups ?? {})) for (let i of r.items ?? []) if (i.kind === "hub" && i.id === n) return e(i, t).href;
13
+ throw Error(`Unknown backoffice hub: ${n}`);
14
+ }, a = (t, n, r) => {
15
+ let i = t?.hubs?.[n];
16
+ if (i != null) return i.title(r);
17
+ for (let i of Object.values(t?.groups ?? {})) for (let a of i.items ?? []) if (a.kind === "hub" && a.id === n) return e(a, t).title(r);
18
+ return n;
19
+ }, o = (e) => {
20
+ let o = e.manifest, s = e.sidebar, c = e.target, l = t({
21
+ target: e.target,
22
+ sidebar: e.sidebar
23
+ });
24
+ if (c.kind === "dashboard") return {
25
+ id: "dashboard",
26
+ href: e.dashboardHref ?? "/",
27
+ label: e.label ?? e.dashboardLabel ?? "Dashboard",
28
+ icon: l
29
+ };
30
+ if (c.kind === "entity-list") {
31
+ let t = r(o, c.entityId), { state: i } = c, a = t.routes.list;
32
+ return i != null && (a = n(t.routes.list, i.where ?? null, i.filters)), {
33
+ id: `${c.entityId}-list`,
34
+ href: a,
35
+ label: e.label ?? t.label(e.tApp),
36
+ icon: l
37
+ };
38
+ }
39
+ if (c.kind === "entity-detail") {
40
+ let t = r(o, c.entityId);
41
+ return {
42
+ id: `${c.entityId}-entity-${c.id}`,
43
+ href: t.routes.detail(c.id),
44
+ label: e.label ?? c.id,
45
+ icon: l
46
+ };
47
+ }
48
+ if (c.kind === "entity-detail-page") {
49
+ let t = r(o, c.entityId);
50
+ return {
51
+ id: `${c.entityId}-page-${c.id}-${c.pageId}`,
52
+ href: t.routes.detailPage(c.id, c.pageId),
53
+ label: e.label ?? c.pageId,
54
+ icon: l
55
+ };
56
+ }
57
+ if (c.kind === "tool") {
58
+ let t = r(o, c.toolId);
59
+ return {
60
+ id: `tool-${c.toolId}`,
61
+ href: t.routes.list,
62
+ label: e.label ?? t.label(e.tApp),
63
+ icon: l
64
+ };
65
+ }
66
+ return c.kind === "hub" ? {
67
+ id: `hub-${c.hubId}`,
68
+ href: i(s, c.hubId),
69
+ label: e.label ?? a(s, c.hubId, e.tApp),
70
+ icon: l
71
+ } : {
72
+ id: `href-${c.href}`,
73
+ href: c.href,
74
+ label: e.label ?? c.href,
75
+ icon: l
76
+ };
77
+ };
78
+ //#endregion
79
+ export { o as resolveBackofficeLink };
80
+
81
+ //# sourceMappingURL=resolveBackofficeLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveBackofficeLink.js","names":[],"sources":["../../../../../src/components/backoffice/links/resolveBackofficeLink.ts"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { TFunction } from 'i18next';\nimport { buildBackofficeFallbackListHref } from '@plumile/backoffice-core/state/buildListHref.js';\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\n\nimport type { BackofficeSidebarConfig } from '../../../provider/types.js';\nimport { resolveSidebarHub } from '../layout/sidebarUtils.js';\nimport { resolveBackofficeTargetIcon } from './resolveBackofficeTargetIcon.js';\nimport type { BackofficeLinkTarget, BackofficeResolvedLink } from './types.js';\n\nconst requireEntity = (\n manifest: BackofficeEntityManifestMap,\n entityId: string,\n) => {\n const entity = manifest[entityId];\n if (entity == null) {\n throw new Error(`Unknown backoffice entity: ${entityId}`);\n }\n return entity;\n};\n\nconst resolveHubHref = (\n sidebar: BackofficeSidebarConfig | undefined,\n hubId: string,\n): string => {\n const registeredHub = sidebar?.hubs?.[hubId];\n if (registeredHub != null) {\n return registeredHub.href;\n }\n\n for (const group of Object.values(sidebar?.groups ?? {})) {\n for (const item of group.items ?? []) {\n if (item.kind === 'hub' && item.id === hubId) {\n return resolveSidebarHub(item, sidebar).href;\n }\n }\n }\n\n throw new Error(`Unknown backoffice hub: ${hubId}`);\n};\n\nconst resolveHubLabel = (\n sidebar: BackofficeSidebarConfig | undefined,\n hubId: string,\n tApp: TFunction,\n): string => {\n const registeredHub = sidebar?.hubs?.[hubId];\n if (registeredHub != null) {\n return registeredHub.title(tApp);\n }\n\n for (const group of Object.values(sidebar?.groups ?? {})) {\n for (const item of group.items ?? []) {\n if (item.kind === 'hub' && item.id === hubId) {\n return resolveSidebarHub(item, sidebar).title(tApp);\n }\n }\n }\n\n return hubId;\n};\n\nexport const resolveBackofficeLink = <\n TManifest extends BackofficeEntityManifestMap,\n>(input: {\n target: BackofficeLinkTarget<TManifest>;\n label?: ReactNode;\n manifest: TManifest;\n sidebar?: BackofficeSidebarConfig<TManifest>;\n tApp: TFunction;\n dashboardHref?: string;\n dashboardLabel?: string;\n}): BackofficeResolvedLink => {\n const manifest = input.manifest as BackofficeEntityManifestMap;\n const sidebar = input.sidebar as BackofficeSidebarConfig | undefined;\n const target = input.target as BackofficeLinkTarget;\n const icon = resolveBackofficeTargetIcon({\n target: input.target,\n sidebar: input.sidebar,\n });\n\n if (target.kind === 'dashboard') {\n const href = input.dashboardHref ?? '/';\n return {\n id: 'dashboard',\n href,\n label: input.label ?? input.dashboardLabel ?? 'Dashboard',\n icon,\n };\n }\n\n if (target.kind === 'entity-list') {\n const entity = requireEntity(manifest, target.entityId);\n const { state } = target;\n let href = entity.routes.list;\n if (state != null) {\n href = buildBackofficeFallbackListHref(\n entity.routes.list,\n state.where ?? null,\n state.filters,\n );\n }\n return {\n id: `${target.entityId}-list`,\n href,\n label: input.label ?? entity.label(input.tApp),\n icon,\n };\n }\n\n if (target.kind === 'entity-detail') {\n const entity = requireEntity(manifest, target.entityId);\n return {\n id: `${target.entityId}-entity-${target.id}`,\n href: entity.routes.detail(target.id),\n label: input.label ?? target.id,\n icon,\n };\n }\n\n if (target.kind === 'entity-detail-page') {\n const entity = requireEntity(manifest, target.entityId);\n return {\n id: `${target.entityId}-page-${target.id}-${target.pageId}`,\n href: entity.routes.detailPage(target.id, target.pageId),\n label: input.label ?? target.pageId,\n icon,\n };\n }\n\n if (target.kind === 'tool') {\n const entity = requireEntity(manifest, target.toolId);\n return {\n id: `tool-${target.toolId}`,\n href: entity.routes.list,\n label: input.label ?? entity.label(input.tApp),\n icon,\n };\n }\n\n if (target.kind === 'hub') {\n return {\n id: `hub-${target.hubId}`,\n href: resolveHubHref(sidebar, target.hubId),\n label: input.label ?? resolveHubLabel(sidebar, target.hubId, input.tApp),\n icon,\n };\n }\n\n return {\n id: `href-${target.href}`,\n href: target.href,\n label: input.label ?? target.href,\n icon,\n };\n};\n"],"mappings":";;;;AAUA,IAAM,KACJ,GACA,MACG;CACH,IAAM,IAAS,EAAS;CACxB,IAAI,KAAU,MACZ,MAAU,MAAM,8BAA8B,IAAW;CAE3D,OAAO;GAGH,KACJ,GACA,MACW;CACX,IAAM,IAAgB,GAAS,OAAO;CACtC,IAAI,KAAiB,MACnB,OAAO,EAAc;CAGvB,KAAK,IAAM,KAAS,OAAO,OAAO,GAAS,UAAU,EAAE,CAAC,EACtD,KAAK,IAAM,KAAQ,EAAM,SAAS,EAAE,EAClC,IAAI,EAAK,SAAS,SAAS,EAAK,OAAO,GACrC,OAAO,EAAkB,GAAM,EAAQ,CAAC;CAK9C,MAAU,MAAM,2BAA2B,IAAQ;GAG/C,KACJ,GACA,GACA,MACW;CACX,IAAM,IAAgB,GAAS,OAAO;CACtC,IAAI,KAAiB,MACnB,OAAO,EAAc,MAAM,EAAK;CAGlC,KAAK,IAAM,KAAS,OAAO,OAAO,GAAS,UAAU,EAAE,CAAC,EACtD,KAAK,IAAM,KAAQ,EAAM,SAAS,EAAE,EAClC,IAAI,EAAK,SAAS,SAAS,EAAK,OAAO,GACrC,OAAO,EAAkB,GAAM,EAAQ,CAAC,MAAM,EAAK;CAKzD,OAAO;GAGI,KAEX,MAQ4B;CAC5B,IAAM,IAAW,EAAM,UACjB,IAAU,EAAM,SAChB,IAAS,EAAM,QACf,IAAO,EAA4B;EACvC,QAAQ,EAAM;EACd,SAAS,EAAM;EAChB,CAAC;CAEF,IAAI,EAAO,SAAS,aAElB,OAAO;EACL,IAAI;EACJ,MAHW,EAAM,iBAAiB;EAIlC,OAAO,EAAM,SAAS,EAAM,kBAAkB;EAC9C;EACD;CAGH,IAAI,EAAO,SAAS,eAAe;EACjC,IAAM,IAAS,EAAc,GAAU,EAAO,SAAS,EACjD,EAAE,aAAU,GACd,IAAO,EAAO,OAAO;EAQzB,OAPI,KAAS,SACX,IAAO,EACL,EAAO,OAAO,MACd,EAAM,SAAS,MACf,EAAM,QACP,GAEI;GACL,IAAI,GAAG,EAAO,SAAS;GACvB;GACA,OAAO,EAAM,SAAS,EAAO,MAAM,EAAM,KAAK;GAC9C;GACD;;CAGH,IAAI,EAAO,SAAS,iBAAiB;EACnC,IAAM,IAAS,EAAc,GAAU,EAAO,SAAS;EACvD,OAAO;GACL,IAAI,GAAG,EAAO,SAAS,UAAU,EAAO;GACxC,MAAM,EAAO,OAAO,OAAO,EAAO,GAAG;GACrC,OAAO,EAAM,SAAS,EAAO;GAC7B;GACD;;CAGH,IAAI,EAAO,SAAS,sBAAsB;EACxC,IAAM,IAAS,EAAc,GAAU,EAAO,SAAS;EACvD,OAAO;GACL,IAAI,GAAG,EAAO,SAAS,QAAQ,EAAO,GAAG,GAAG,EAAO;GACnD,MAAM,EAAO,OAAO,WAAW,EAAO,IAAI,EAAO,OAAO;GACxD,OAAO,EAAM,SAAS,EAAO;GAC7B;GACD;;CAGH,IAAI,EAAO,SAAS,QAAQ;EAC1B,IAAM,IAAS,EAAc,GAAU,EAAO,OAAO;EACrD,OAAO;GACL,IAAI,QAAQ,EAAO;GACnB,MAAM,EAAO,OAAO;GACpB,OAAO,EAAM,SAAS,EAAO,MAAM,EAAM,KAAK;GAC9C;GACD;;CAYH,OATI,EAAO,SAAS,QACX;EACL,IAAI,OAAO,EAAO;EAClB,MAAM,EAAe,GAAS,EAAO,MAAM;EAC3C,OAAO,EAAM,SAAS,EAAgB,GAAS,EAAO,OAAO,EAAM,KAAK;EACxE;EACD,GAGI;EACL,IAAI,QAAQ,EAAO;EACnB,MAAM,EAAO;EACb,OAAO,EAAM,SAAS,EAAO;EAC7B;EACD"}
@@ -0,0 +1,50 @@
1
+ import { resolveGroupItems as e, resolveSidebarHubFor as t } from "../layout/sidebarUtils.js";
2
+ //#region src/components/backoffice/links/resolveBackofficeTargetIcon.ts
3
+ var n = (e) => e.kind === "dashboard" ? {
4
+ kind: "dashboard",
5
+ id: "dashboard"
6
+ } : e.kind === "entity-list" || e.kind === "entity-detail" || e.kind === "entity-detail-page" ? {
7
+ kind: "entity",
8
+ id: e.entityId
9
+ } : e.kind === "tool" ? {
10
+ kind: "tool",
11
+ id: e.toolId
12
+ } : e.kind === "hub" ? {
13
+ kind: "hub",
14
+ id: e.hubId
15
+ } : {
16
+ kind: "href",
17
+ id: e.href
18
+ }, r = (e, n, r, i) => {
19
+ if (n.kind === "dashboard") return e.kind === "dashboard" && (e.id ?? "dashboard") === n.id ? e.icon ?? r.icon : void 0;
20
+ if (n.kind === "hub") {
21
+ if (e.kind === "hub" && e.id === n.id) {
22
+ let n = t(e, i);
23
+ return e.icon ?? n.icon ?? r.icon;
24
+ }
25
+ return;
26
+ }
27
+ if (n.kind === "entity" || n.kind === "tool") {
28
+ if (e.kind === n.kind && e.id === n.id) return e.icon ?? r.icon;
29
+ if (e.kind === "hub") {
30
+ let a = t(e, i);
31
+ for (let t of a.groups) {
32
+ let i = t.items.find((e) => e.kind === n.kind && e.id === n.id);
33
+ if (i != null) return i.icon ?? t.icon ?? e.icon ?? a.icon ?? r.icon;
34
+ }
35
+ }
36
+ }
37
+ }, i = (t) => {
38
+ let i = n(t.target);
39
+ if (i.kind !== "href") {
40
+ for (let n of Object.values(t.sidebar?.groups ?? {})) for (let a of e(n)) {
41
+ let e = r(a, i, n, t.sidebar);
42
+ if (e != null) return e;
43
+ }
44
+ if (i.kind === "hub") return t.sidebar?.hubs?.[i.id]?.icon;
45
+ }
46
+ };
47
+ //#endregion
48
+ export { i as resolveBackofficeTargetIcon };
49
+
50
+ //# sourceMappingURL=resolveBackofficeTargetIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveBackofficeTargetIcon.js","names":[],"sources":["../../../../../src/components/backoffice/links/resolveBackofficeTargetIcon.ts"],"sourcesContent":["import type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\n\nimport type {\n BackofficeIconComponent,\n BackofficeSidebarConfig,\n BackofficeSidebarGroupConfig,\n BackofficeSidebarItemConfig,\n} from '../../../provider/types.js';\nimport {\n resolveGroupItems,\n resolveSidebarHubFor,\n} from '../layout/sidebarUtils.js';\nimport type { BackofficeLinkTarget } from './types.js';\n\nconst getTargetId = (\n target: BackofficeLinkTarget,\n): { kind: 'dashboard' | 'entity' | 'tool' | 'hub' | 'href'; id: string } => {\n if (target.kind === 'dashboard') {\n return { kind: 'dashboard', id: 'dashboard' };\n }\n if (target.kind === 'entity-list') {\n return { kind: 'entity', id: target.entityId };\n }\n if (target.kind === 'entity-detail') {\n return { kind: 'entity', id: target.entityId };\n }\n if (target.kind === 'entity-detail-page') {\n return { kind: 'entity', id: target.entityId };\n }\n if (target.kind === 'tool') {\n return { kind: 'tool', id: target.toolId };\n }\n if (target.kind === 'hub') {\n return { kind: 'hub', id: target.hubId };\n }\n return { kind: 'href', id: target.href };\n};\n\nconst resolveItemIcon = <TManifest extends BackofficeEntityManifestMap>(\n item: BackofficeSidebarItemConfig<TManifest>,\n target: ReturnType<typeof getTargetId>,\n group: BackofficeSidebarGroupConfig<TManifest>,\n sidebar: BackofficeSidebarConfig<TManifest> | undefined,\n): BackofficeIconComponent | undefined => {\n if (target.kind === 'dashboard') {\n if (item.kind === 'dashboard' && (item.id ?? 'dashboard') === target.id) {\n return item.icon ?? group.icon;\n }\n return undefined;\n }\n\n if (target.kind === 'hub') {\n if (item.kind === 'hub' && item.id === target.id) {\n const hub = resolveSidebarHubFor(item, sidebar);\n return item.icon ?? hub.icon ?? group.icon;\n }\n return undefined;\n }\n\n if (target.kind === 'entity' || target.kind === 'tool') {\n if (item.kind === target.kind && item.id === target.id) {\n return item.icon ?? group.icon;\n }\n\n if (item.kind === 'hub') {\n const hub = resolveSidebarHubFor(item, sidebar);\n for (const hubGroup of hub.groups) {\n const hubItem = hubGroup.items.find((candidate) => {\n return candidate.kind === target.kind && candidate.id === target.id;\n });\n if (hubItem != null) {\n return (\n hubItem.icon ?? hubGroup.icon ?? item.icon ?? hub.icon ?? group.icon\n );\n }\n }\n }\n }\n\n return undefined;\n};\n\nexport const resolveBackofficeTargetIcon = <\n TManifest extends BackofficeEntityManifestMap,\n>(input: {\n target: BackofficeLinkTarget<TManifest>;\n sidebar?: BackofficeSidebarConfig<TManifest>;\n}): BackofficeIconComponent | undefined => {\n const target = getTargetId(input.target);\n if (target.kind === 'href') {\n return undefined;\n }\n\n for (const group of Object.values(input.sidebar?.groups ?? {})) {\n for (const item of resolveGroupItems(group)) {\n const icon = resolveItemIcon(item, target, group, input.sidebar);\n if (icon != null) {\n return icon;\n }\n }\n }\n\n if (target.kind === 'hub') {\n return input.sidebar?.hubs?.[target.id]?.icon;\n }\n\n return undefined;\n};\n"],"mappings":";;AAcA,IAAM,KACJ,MAEI,EAAO,SAAS,cACX;CAAE,MAAM;CAAa,IAAI;CAAa,GAE3C,EAAO,SAAS,iBAGhB,EAAO,SAAS,mBAGhB,EAAO,SAAS,uBACX;CAAE,MAAM;CAAU,IAAI,EAAO;CAAU,GAE5C,EAAO,SAAS,SACX;CAAE,MAAM;CAAQ,IAAI,EAAO;CAAQ,GAExC,EAAO,SAAS,QACX;CAAE,MAAM;CAAO,IAAI,EAAO;CAAO,GAEnC;CAAE,MAAM;CAAQ,IAAI,EAAO;CAAM,EAGpC,KACJ,GACA,GACA,GACA,MACwC;CACxC,IAAI,EAAO,SAAS,aAIlB,OAHI,EAAK,SAAS,gBAAgB,EAAK,MAAM,iBAAiB,EAAO,KAC5D,EAAK,QAAQ,EAAM,OAE5B;CAGF,IAAI,EAAO,SAAS,OAAO;EACzB,IAAI,EAAK,SAAS,SAAS,EAAK,OAAO,EAAO,IAAI;GAChD,IAAM,IAAM,EAAqB,GAAM,EAAQ;GAC/C,OAAO,EAAK,QAAQ,EAAI,QAAQ,EAAM;;EAExC;;CAGF,IAAI,EAAO,SAAS,YAAY,EAAO,SAAS,QAAQ;EACtD,IAAI,EAAK,SAAS,EAAO,QAAQ,EAAK,OAAO,EAAO,IAClD,OAAO,EAAK,QAAQ,EAAM;EAG5B,IAAI,EAAK,SAAS,OAAO;GACvB,IAAM,IAAM,EAAqB,GAAM,EAAQ;GAC/C,KAAK,IAAM,KAAY,EAAI,QAAQ;IACjC,IAAM,IAAU,EAAS,MAAM,MAAM,MAC5B,EAAU,SAAS,EAAO,QAAQ,EAAU,OAAO,EAAO,GACjE;IACF,IAAI,KAAW,MACb,OACE,EAAQ,QAAQ,EAAS,QAAQ,EAAK,QAAQ,EAAI,QAAQ,EAAM;;;;GAU/D,KAEX,MAGyC;CACzC,IAAM,IAAS,EAAY,EAAM,OAAO;CACpC,MAAO,SAAS,QAIpB;OAAK,IAAM,KAAS,OAAO,OAAO,EAAM,SAAS,UAAU,EAAE,CAAC,EAC5D,KAAK,IAAM,KAAQ,EAAkB,EAAM,EAAE;GAC3C,IAAM,IAAO,EAAgB,GAAM,GAAQ,GAAO,EAAM,QAAQ;GAChE,IAAI,KAAQ,MACV,OAAO;;EAKb,IAAI,EAAO,SAAS,OAClB,OAAO,EAAM,SAAS,OAAO,EAAO,KAAK"}
File without changes
@@ -0,0 +1,21 @@
1
+ import { useBackofficeConfig as e } from "../../../provider/BackofficeConfigContext.js";
2
+ import { useOptionalBackofficeTopbarPortalContext as t } from "../layout/breadcrumb/BackofficeTopbarPortalContext.js";
3
+ import { resolveBackofficeLink as n } from "./resolveBackofficeLink.js";
4
+ import { useTranslation as r } from "react-i18next";
5
+ //#region src/components/backoffice/links/useBackofficeLink.ts
6
+ var i = (i, a) => {
7
+ let { entityManifest: o, sidebar: s } = e(), c = t(), { t: l } = r();
8
+ return n({
9
+ target: i,
10
+ label: a?.label,
11
+ manifest: o,
12
+ sidebar: s,
13
+ tApp: l,
14
+ dashboardHref: c?.dashboardHref,
15
+ dashboardLabel: c?.dashboardLabel
16
+ });
17
+ };
18
+ //#endregion
19
+ export { i as useBackofficeLink };
20
+
21
+ //# sourceMappingURL=useBackofficeLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBackofficeLink.js","names":[],"sources":["../../../../../src/components/backoffice/links/useBackofficeLink.ts"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\nimport { useOptionalBackofficeTopbarPortalContext } from '../layout/breadcrumb/BackofficeTopbarPortalContext.js';\nimport { resolveBackofficeLink } from './resolveBackofficeLink.js';\nimport type { BackofficeLinkTarget, BackofficeResolvedLink } from './types.js';\n\nexport const useBackofficeLink = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(\n target: BackofficeLinkTarget<TManifest>,\n options?: {\n label?: ReactNode;\n },\n): BackofficeResolvedLink => {\n const { entityManifest, sidebar } = useBackofficeConfig();\n const topbar = useOptionalBackofficeTopbarPortalContext();\n const { t: tApp } = useTranslation();\n\n return resolveBackofficeLink({\n target,\n label: options?.label,\n manifest: entityManifest,\n sidebar,\n tApp,\n dashboardHref: topbar?.dashboardHref,\n dashboardLabel: topbar?.dashboardLabel,\n });\n};\n"],"mappings":";;;;;AAUA,IAAa,KAGX,GACA,MAG2B;CAC3B,IAAM,EAAE,mBAAgB,eAAY,GAAqB,EACnD,IAAS,GAA0C,EACnD,EAAE,GAAG,MAAS,GAAgB;CAEpC,OAAO,EAAsB;EAC3B;EACA,OAAO,GAAS;EAChB,UAAU;EACV;EACA;EACA,eAAe,GAAQ;EACvB,gBAAgB,GAAQ;EACzB,CAAC"}
@@ -81,6 +81,7 @@ var { useFragment: S, useLazyLoadQuery: C } = x, w = "store-and-network", T = (e
81
81
  onClose: _,
82
82
  title: o,
83
83
  footer: P,
84
+ initialFocus: "first-form-control",
84
85
  children: /* @__PURE__ */ v(a, {
85
86
  search: C,
86
87
  onSearchChange: F,
@@ -1 +1 @@
1
- {"version":3,"file":"EntityIdPickerDialog.js","names":[],"sources":["../../../../../src/components/backoffice/pickers/EntityIdPickerDialog.tsx"],"sourcesContent":["import {\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useState,\n type JSX,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\n\nimport {\n BackofficeEmptyState,\n Button,\n InlineBanner,\n Modal,\n Spinner,\n} from '@plumile/ui';\nimport type {\n BackofficePickerScope,\n BackofficeRuntimeEntityPickerConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficePickerEntityLoader } from '../../../provider/useBackofficeEntityLoader.js';\n\nimport { EntityPickerShell } from './shared/EntityPickerShell.js';\nimport { EntityPickerList } from './shared/EntityPickerList.js';\nimport type { EntityPickerRowViewModel } from './types.js';\nimport * as styles from './entityIdPickerDialog.css.js';\n\nconst { useFragment, useLazyLoadQuery } = ReactRelay;\n\nexport type EntityIdPickerDialogProps = {\n isOpen: boolean;\n entity: string;\n title: string;\n scope?: BackofficePickerScope<Record<string, unknown>>;\n onClose: () => void;\n onSelectId: (id: string) => void;\n};\n\nconst PICKER_FETCH_POLICY = 'store-and-network' as const;\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\ntype PickerBodyProps = {\n config: BackofficeRuntimeEntityPickerConfig;\n search: string;\n scope?: BackofficePickerScope<Record<string, unknown>>;\n fetchKey: number;\n onSelectId: (id: string) => void;\n};\n\ntype RuntimePickerRow = {\n title: string;\n subtitle?: string | null | undefined;\n};\n\nconst PickerBody = ({\n config,\n search,\n scope,\n fetchKey,\n onSelectId,\n}: PickerBodyProps): JSX.Element => {\n const variables = useMemo(() => {\n const trimmed = search.trim();\n return config.buildQueryVariables({ search: trimmed, scope });\n }, [config, scope, search]);\n\n const queryData = useLazyLoadQuery(config.query, variables, {\n fetchPolicy: PICKER_FETCH_POLICY,\n fetchKey,\n });\n\n const fragmentData = useFragment(\n config.fragment,\n queryData as never,\n ) as unknown;\n\n const connection = config.getConnection(fragmentData);\n\n const items = useMemo<readonly EntityPickerRowViewModel[]>(() => {\n return connection.edges.map((edge) => {\n const row = config.toRow(edge.node) as RuntimePickerRow;\n const id = config.getRowId(row);\n return {\n id,\n title: row.title,\n subtitle: row.subtitle,\n };\n });\n }, [config, connection.edges]);\n\n return <EntityPickerList items={items} onSelectId={onSelectId} />;\n};\n\nconst buildFooter = (onClose: () => void, closeLabel: string): JSX.Element => {\n return (\n <>\n <Button type=\"button\" variant=\"secondary\" onClick={onClose}>\n {closeLabel}\n </Button>\n </>\n );\n};\n\nconst PickerUnavailable = ({ message }: { message: string }) => {\n return (\n <InlineBanner tone=\"warning\" title={message}>\n {null}\n </InlineBanner>\n );\n};\n\nconst PickerLoading = ({ label }: { label: string }): JSX.Element => {\n return (\n <div className={styles.loadingState} role=\"status\" aria-live=\"polite\">\n <Spinner size={18} ariaLabel={label} />\n <span className={styles.loadingLabel}>{label}</span>\n </div>\n );\n};\n\nexport const EntityIdPickerDialog = ({\n isOpen,\n entity,\n title,\n scope,\n onClose,\n onSelectId,\n}: EntityIdPickerDialogProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [search, setSearch] = useState('');\n const [fetchKey, setFetchKey] = useState(0);\n const entityState = useBackofficePickerEntityLoader(entity, {\n enabled: isOpen,\n });\n\n let pickerConfig: BackofficeRuntimeEntityPickerConfig | undefined;\n if (entityState.status === 'loaded') {\n pickerConfig = entityState.module.config.picker as\n | BackofficeRuntimeEntityPickerConfig\n | undefined;\n }\n\n useEffect(() => {\n if (isOpen) {\n setSearch('');\n setFetchKey((value) => {\n return value + 1;\n });\n }\n }, [isOpen]);\n\n const footer = useMemo(() => {\n return buildFooter(onClose, t('common.actions.close'));\n }, [onClose, t]);\n\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next);\n setFetchKey((value) => {\n return value + 1;\n });\n }, []);\n\n const handleSelectId = useCallback(\n (id: string) => {\n onSelectId(id);\n onClose();\n },\n [onClose, onSelectId],\n );\n\n if (!isOpen) {\n return null;\n }\n\n let resolvedSearchPlaceholder: string | undefined;\n if (pickerConfig?.searchPlaceholder != null) {\n resolvedSearchPlaceholder = resolveLabel(\n pickerConfig.searchPlaceholder,\n tApp,\n );\n }\n\n const trimmedSearch = search.trim();\n const isSearchRequired = pickerConfig?.searchRequired === true;\n\n let pickerNode: JSX.Element;\n if (entityState.status === 'loading') {\n pickerNode = <PickerLoading label={t('common.loading')} />;\n } else if (pickerConfig != null) {\n if (isSearchRequired && trimmedSearch === '') {\n pickerNode = <BackofficeEmptyState title={t('picker.searchRequired')} />;\n } else {\n pickerNode = (\n <PickerBody\n config={pickerConfig}\n search={search}\n scope={scope}\n fetchKey={fetchKey}\n onSelectId={handleSelectId}\n />\n );\n }\n } else {\n pickerNode = (\n <PickerUnavailable message={t('picker.unavailable', { entity })} />\n );\n }\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} title={title} footer={footer}>\n <EntityPickerShell\n search={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={resolvedSearchPlaceholder}\n searchEnabled={pickerConfig?.searchEnabled ?? true}\n >\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n return (\n <InlineBanner\n tone=\"danger\"\n title={t('picker.errors.loadFailed')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n reset();\n setFetchKey((value) => {\n return value + 1;\n });\n }}\n >\n {t('common.actions.retry')}\n </Button>\n }\n >\n {null}\n </InlineBanner>\n );\n }}\n >\n <Suspense fallback={<PickerLoading label={t('common.loading')} />}>\n {pickerNode}\n </Suspense>\n </BackofficeErrorBoundary>\n </EntityPickerShell>\n </Modal>\n );\n};\n\nexport type { BackofficePickerScope } from '@plumile/backoffice-core/types.js';\n\nexport default EntityIdPickerDialog;\n"],"mappings":"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"}
1
+ {"version":3,"file":"EntityIdPickerDialog.js","names":[],"sources":["../../../../../src/components/backoffice/pickers/EntityIdPickerDialog.tsx"],"sourcesContent":["import {\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useState,\n type JSX,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\n\nimport {\n BackofficeEmptyState,\n Button,\n InlineBanner,\n Modal,\n Spinner,\n} from '@plumile/ui';\nimport type {\n BackofficePickerScope,\n BackofficeRuntimeEntityPickerConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficePickerEntityLoader } from '../../../provider/useBackofficeEntityLoader.js';\n\nimport { EntityPickerShell } from './shared/EntityPickerShell.js';\nimport { EntityPickerList } from './shared/EntityPickerList.js';\nimport type { EntityPickerRowViewModel } from './types.js';\nimport * as styles from './entityIdPickerDialog.css.js';\n\nconst { useFragment, useLazyLoadQuery } = ReactRelay;\n\nexport type EntityIdPickerDialogProps = {\n isOpen: boolean;\n entity: string;\n title: string;\n scope?: BackofficePickerScope<Record<string, unknown>>;\n onClose: () => void;\n onSelectId: (id: string) => void;\n};\n\nconst PICKER_FETCH_POLICY = 'store-and-network' as const;\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\ntype PickerBodyProps = {\n config: BackofficeRuntimeEntityPickerConfig;\n search: string;\n scope?: BackofficePickerScope<Record<string, unknown>>;\n fetchKey: number;\n onSelectId: (id: string) => void;\n};\n\ntype RuntimePickerRow = {\n title: string;\n subtitle?: string | null | undefined;\n};\n\nconst PickerBody = ({\n config,\n search,\n scope,\n fetchKey,\n onSelectId,\n}: PickerBodyProps): JSX.Element => {\n const variables = useMemo(() => {\n const trimmed = search.trim();\n return config.buildQueryVariables({ search: trimmed, scope });\n }, [config, scope, search]);\n\n const queryData = useLazyLoadQuery(config.query, variables, {\n fetchPolicy: PICKER_FETCH_POLICY,\n fetchKey,\n });\n\n const fragmentData = useFragment(\n config.fragment,\n queryData as never,\n ) as unknown;\n\n const connection = config.getConnection(fragmentData);\n\n const items = useMemo<readonly EntityPickerRowViewModel[]>(() => {\n return connection.edges.map((edge) => {\n const row = config.toRow(edge.node) as RuntimePickerRow;\n const id = config.getRowId(row);\n return {\n id,\n title: row.title,\n subtitle: row.subtitle,\n };\n });\n }, [config, connection.edges]);\n\n return <EntityPickerList items={items} onSelectId={onSelectId} />;\n};\n\nconst buildFooter = (onClose: () => void, closeLabel: string): JSX.Element => {\n return (\n <>\n <Button type=\"button\" variant=\"secondary\" onClick={onClose}>\n {closeLabel}\n </Button>\n </>\n );\n};\n\nconst PickerUnavailable = ({ message }: { message: string }) => {\n return (\n <InlineBanner tone=\"warning\" title={message}>\n {null}\n </InlineBanner>\n );\n};\n\nconst PickerLoading = ({ label }: { label: string }): JSX.Element => {\n return (\n <div className={styles.loadingState} role=\"status\" aria-live=\"polite\">\n <Spinner size={18} ariaLabel={label} />\n <span className={styles.loadingLabel}>{label}</span>\n </div>\n );\n};\n\nexport const EntityIdPickerDialog = ({\n isOpen,\n entity,\n title,\n scope,\n onClose,\n onSelectId,\n}: EntityIdPickerDialogProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [search, setSearch] = useState('');\n const [fetchKey, setFetchKey] = useState(0);\n const entityState = useBackofficePickerEntityLoader(entity, {\n enabled: isOpen,\n });\n\n let pickerConfig: BackofficeRuntimeEntityPickerConfig | undefined;\n if (entityState.status === 'loaded') {\n pickerConfig = entityState.module.config.picker as\n | BackofficeRuntimeEntityPickerConfig\n | undefined;\n }\n\n useEffect(() => {\n if (isOpen) {\n setSearch('');\n setFetchKey((value) => {\n return value + 1;\n });\n }\n }, [isOpen]);\n\n const footer = useMemo(() => {\n return buildFooter(onClose, t('common.actions.close'));\n }, [onClose, t]);\n\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next);\n setFetchKey((value) => {\n return value + 1;\n });\n }, []);\n\n const handleSelectId = useCallback(\n (id: string) => {\n onSelectId(id);\n onClose();\n },\n [onClose, onSelectId],\n );\n\n if (!isOpen) {\n return null;\n }\n\n let resolvedSearchPlaceholder: string | undefined;\n if (pickerConfig?.searchPlaceholder != null) {\n resolvedSearchPlaceholder = resolveLabel(\n pickerConfig.searchPlaceholder,\n tApp,\n );\n }\n\n const trimmedSearch = search.trim();\n const isSearchRequired = pickerConfig?.searchRequired === true;\n\n let pickerNode: JSX.Element;\n if (entityState.status === 'loading') {\n pickerNode = <PickerLoading label={t('common.loading')} />;\n } else if (pickerConfig != null) {\n if (isSearchRequired && trimmedSearch === '') {\n pickerNode = <BackofficeEmptyState title={t('picker.searchRequired')} />;\n } else {\n pickerNode = (\n <PickerBody\n config={pickerConfig}\n search={search}\n scope={scope}\n fetchKey={fetchKey}\n onSelectId={handleSelectId}\n />\n );\n }\n } else {\n pickerNode = (\n <PickerUnavailable message={t('picker.unavailable', { entity })} />\n );\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n footer={footer}\n initialFocus=\"first-form-control\"\n >\n <EntityPickerShell\n search={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={resolvedSearchPlaceholder}\n searchEnabled={pickerConfig?.searchEnabled ?? true}\n >\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n return (\n <InlineBanner\n tone=\"danger\"\n title={t('picker.errors.loadFailed')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n reset();\n setFetchKey((value) => {\n return value + 1;\n });\n }}\n >\n {t('common.actions.retry')}\n </Button>\n }\n >\n {null}\n </InlineBanner>\n );\n }}\n >\n <Suspense fallback={<PickerLoading label={t('common.loading')} />}>\n {pickerNode}\n </Suspense>\n </BackofficeErrorBoundary>\n </EntityPickerShell>\n </Modal>\n );\n};\n\nexport type { BackofficePickerScope } from '@plumile/backoffice-core/types.js';\n\nexport default EntityIdPickerDialog;\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /* empty css */
2
2
  //#region src/components/backoffice/pickers/entityIdPickerDialog.css.ts
3
- var e = "txvbqb9ip txvbqbai7 txvbqbaog", t = "txvbqbnvg txvbqboip txvbqbp6p txvbqblyg txvbqbva1 txvbqb8y txvbqbt6y", n = "txvbqbnw7 txvbqbojg txvbqbp6y txvbqblyp txvbqb9ip txvbqbcp txvbqbdoy txvbqbao7 txvbqbva1", r = "txvbqb8y txvbqbva1", i = "txvbqb9ip txvbqbao7 txvbqbcp", a = "txvbqb9my txvbqbk5y txvbqb9ip txvbqbai7 txvbqbt6p", o = "txvbqbv9z txvbqbamg txvbqb97 txvbqbf4y", s = "txvbqbva1 txvbqb8y txvbqbf4y", c = "txvbqbva3 txvbqb8p txvbqbf4y txvbqbuxg";
3
+ var e = "txvbqb9ip txvbqbai7 txvbqbaog", t = "txvbqbnvg txvbqboip txvbqbp6p txvbqblyg txvbqbva1 txvbqb8y txvbqbt6y", n = "txvbqbnw7 txvbqbojg txvbqbp6y txvbqblyp txvbqb9ip txvbqbcp txvbqbdoy txvbqbao7 txvbqbva1", r = "txvbqb8y txvbqbva1", i = "_10f5c550 txvbqb9ip txvbqbai7 txvbqbl7g txvbqb1rp txvbqb1cp txvbqb1qg txvbqbwp txvbqbv41", a = "_10f5c551 txvbqbnw7 txvbqbojg txvbqbps7 txvbqbmjy txvbqb6 txvbqb9i7 txvbqbu7g txvbqb12g txvbqbv41 txvbqbv9z txvbqbv txvbqbt6p txvbqb78 txvbqb6w txvbqb7k", o = "txvbqb9ip txvbqbao7 txvbqbcp txvbqbk5y", s = "txvbqb9my txvbqbk5y txvbqb9ip txvbqbai7 txvbqbt6p", c = "txvbqbv9z txvbqbamg txvbqb97 txvbqbf4y txvbqbl7g txvbqbt7g txvbqbuxg", l = "txvbqbva1 txvbqb8y txvbqbf4y txvbqbl7g txvbqbt7g txvbqbuxg", u = "txvbqbva3 txvbqb8p txvbqbf4y txvbqbuxg";
4
4
  //#endregion
5
- export { e as layout, r as loadingLabel, n as loadingState, i as row, c as rowMeta, s as rowSubtitle, a as rowText, o as rowTitle, t as searchRequiredMessage };
5
+ export { e as layout, i as list, a as listItem, r as loadingLabel, n as loadingState, o as row, u as rowMeta, l as rowSubtitle, s as rowText, c as rowTitle, t as searchRequiredMessage };
6
6
 
7
7
  //# sourceMappingURL=entityIdPickerDialog.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entityIdPickerDialog.css.js","names":[],"sources":["../../../../../src/components/backoffice/pickers/entityIdPickerDialog.css.ts"],"sourcesContent":["import { sprinkles } from '@plumile/ui';\n\nexport const layout = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const searchRequiredMessage = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n textAlign: 'center',\n paddingY: 3,\n paddingX: 0,\n});\n\nexport const loadingState = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 2,\n paddingY: 4,\n paddingX: 3,\n color: 'textSecondary',\n});\n\nexport const loadingLabel = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const row = sprinkles({\n display: 'flex',\n gap: 2,\n alignItems: 'center',\n});\n\nexport const rowText = sprinkles({\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n textAlign: 'left',\n});\n\nexport const rowTitle = sprinkles({\n color: 'text',\n fontWeight: 'medium',\n fontSize: 'base',\n lineHeight: 1.2,\n});\n\nexport const rowSubtitle = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n lineHeight: 1.2,\n});\n\nexport const rowMeta = sprinkles({\n color: 'textMuted',\n fontSize: 'xs',\n lineHeight: 1.2,\n whiteSpace: 'nowrap',\n});\n"],"mappings":""}
1
+ {"version":3,"file":"entityIdPickerDialog.css.js","names":[],"sources":["../../../../../src/components/backoffice/pickers/entityIdPickerDialog.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, vars } from '@plumile/ui';\n\nexport const layout = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const searchRequiredMessage = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n textAlign: 'center',\n paddingY: 3,\n paddingX: 0,\n});\n\nexport const loadingState = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 2,\n paddingY: 4,\n paddingX: 3,\n color: 'textSecondary',\n});\n\nexport const loadingLabel = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const list = style([\n sprinkles({\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n borderRadius: 'lg',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surface',\n }),\n {\n selectors: {\n '&:empty': {\n display: 'none',\n },\n },\n },\n]);\n\nexport const listItem = style([\n sprinkles({\n appearance: 'none',\n display: 'block',\n width: 'full',\n paddingX: 3,\n paddingY: 2.5,\n borderWidth: 0,\n backgroundColor: 'surface',\n color: 'text',\n cursor: 'pointer',\n textAlign: 'left',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n }),\n {\n minHeight: '3.25rem',\n selectors: {\n '& + &': {\n borderTop: `1px solid ${vars.colors.borderSubtle}`,\n },\n '&:hover': {\n backgroundColor: vars.colors.surfaceMuted,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '-2px',\n },\n },\n },\n]);\n\nexport const row = sprinkles({\n display: 'flex',\n gap: 2,\n alignItems: 'center',\n minWidth: 0,\n});\n\nexport const rowText = sprinkles({\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n textAlign: 'left',\n});\n\nexport const rowTitle = sprinkles({\n color: 'text',\n fontWeight: 'medium',\n fontSize: 'base',\n lineHeight: 1.2,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const rowSubtitle = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n lineHeight: 1.2,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const rowMeta = sprinkles({\n color: 'textMuted',\n fontSize: 'xs',\n lineHeight: 1.2,\n whiteSpace: 'nowrap',\n});\n"],"mappings":""}
@@ -1,27 +1,33 @@
1
1
  import { useBackofficeReactTranslation as e } from "../../../../i18n/useBackofficeReactTranslation.js";
2
- import { EntityPickerRowBase as t } from "./EntityPickerRowBase.js";
3
- import { BackofficeEmptyState as n, Button as r } from "@plumile/ui";
4
- import { jsx as i } from "react/jsx-runtime";
2
+ import { list as t, listItem as n } from "../entityIdPickerDialog.css.js";
3
+ import { EntityPickerRowBase as r } from "./EntityPickerRowBase.js";
4
+ import { BackofficeEmptyState as i } from "@plumile/ui";
5
+ import { jsx as a } from "react/jsx-runtime";
5
6
  //#region src/components/backoffice/pickers/shared/EntityPickerList.tsx
6
- var a = ({ items: a, onSelectId: o, emptyState: s }) => {
7
- let { t: c } = e();
8
- return a.length === 0 ? s ?? /* @__PURE__ */ i(n, {
9
- title: c("picker.empty.title"),
10
- description: c("picker.empty.description")
11
- }) : /* @__PURE__ */ i("div", { children: a.map((e) => /* @__PURE__ */ i(r, {
12
- type: "button",
13
- variant: "text",
14
- onClick: () => {
15
- o(e.id);
16
- },
17
- width: "full",
18
- children: /* @__PURE__ */ i(t, {
19
- title: e.title,
20
- subtitle: e.subtitle
21
- })
22
- }, e.id)) });
7
+ var o = ({ items: o, onSelectId: s, emptyState: c }) => {
8
+ let { t: l } = e();
9
+ return o.length === 0 ? c ?? /* @__PURE__ */ a(i, {
10
+ title: l("picker.empty.title"),
11
+ description: l("picker.empty.description")
12
+ }) : /* @__PURE__ */ a("div", {
13
+ className: t,
14
+ role: "listbox",
15
+ children: o.map((e) => /* @__PURE__ */ a("button", {
16
+ type: "button",
17
+ className: n,
18
+ role: "option",
19
+ "aria-selected": "false",
20
+ onClick: () => {
21
+ s(e.id);
22
+ },
23
+ children: /* @__PURE__ */ a(r, {
24
+ title: e.title,
25
+ subtitle: e.subtitle
26
+ })
27
+ }, e.id))
28
+ });
23
29
  };
24
30
  //#endregion
25
- export { a as EntityPickerList, a as default };
31
+ export { o as EntityPickerList, o as default };
26
32
 
27
33
  //# sourceMappingURL=EntityPickerList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EntityPickerList.js","names":[],"sources":["../../../../../../src/components/backoffice/pickers/shared/EntityPickerList.tsx"],"sourcesContent":["import { type JSX } from 'react';\n\nimport { BackofficeEmptyState, Button } from '@plumile/ui';\n\nimport { useBackofficeReactTranslation } from '../../../../i18n/useBackofficeReactTranslation.js';\nimport { EntityPickerRowBase } from './EntityPickerRowBase.js';\nimport type { EntityPickerRowViewModel } from '../types.js';\n\nexport type EntityPickerListProps = {\n items: readonly EntityPickerRowViewModel[];\n onSelectId: (id: string) => void;\n emptyState?: JSX.Element;\n};\n\nexport const EntityPickerList = ({\n items,\n onSelectId,\n emptyState,\n}: EntityPickerListProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n if (items.length === 0) {\n return (\n emptyState ?? (\n <BackofficeEmptyState\n title={t('picker.empty.title')}\n description={t('picker.empty.description')}\n />\n )\n );\n }\n\n return (\n <div>\n {items.map((item) => {\n return (\n <Button\n key={item.id}\n type=\"button\"\n variant=\"text\"\n onClick={() => {\n onSelectId(item.id);\n }}\n width=\"full\"\n >\n <EntityPickerRowBase title={item.title} subtitle={item.subtitle} />\n </Button>\n );\n })}\n </div>\n );\n};\n\nexport default EntityPickerList;\n"],"mappings":";;;;;AAcA,IAAa,KAAoB,EAC/B,UACA,eACA,oBACwC;CACxC,IAAM,EAAE,SAAM,GAA+B;CAa7C,OAXI,EAAM,WAAW,IAEjB,KACE,kBAAC,GAAD;EACE,OAAO,EAAE,qBAAqB;EAC9B,aAAa,EAAE,2BAA2B;EAC1C,CAAA,GAMN,kBAAC,OAAD,EAAA,UACG,EAAM,KAAK,MAER,kBAAC,GAAD;EAEE,MAAK;EACL,SAAQ;EACR,eAAe;GACb,EAAW,EAAK,GAAG;;EAErB,OAAM;YAEN,kBAAC,GAAD;GAAqB,OAAO,EAAK;GAAO,UAAU,EAAK;GAAY,CAAA;EAC5D,EATF,EAAK,GASH,CAEX,EACE,CAAA"}
1
+ {"version":3,"file":"EntityPickerList.js","names":[],"sources":["../../../../../../src/components/backoffice/pickers/shared/EntityPickerList.tsx"],"sourcesContent":["import { type JSX } from 'react';\n\nimport { BackofficeEmptyState } from '@plumile/ui';\n\nimport { useBackofficeReactTranslation } from '../../../../i18n/useBackofficeReactTranslation.js';\nimport { EntityPickerRowBase } from './EntityPickerRowBase.js';\nimport type { EntityPickerRowViewModel } from '../types.js';\nimport * as styles from '../entityIdPickerDialog.css.js';\n\nexport type EntityPickerListProps = {\n items: readonly EntityPickerRowViewModel[];\n onSelectId: (id: string) => void;\n emptyState?: JSX.Element;\n};\n\nexport const EntityPickerList = ({\n items,\n onSelectId,\n emptyState,\n}: EntityPickerListProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n if (items.length === 0) {\n return (\n emptyState ?? (\n <BackofficeEmptyState\n title={t('picker.empty.title')}\n description={t('picker.empty.description')}\n />\n )\n );\n }\n\n return (\n <div className={styles.list} role=\"listbox\">\n {items.map((item) => {\n return (\n <button\n key={item.id}\n type=\"button\"\n className={styles.listItem}\n role=\"option\"\n aria-selected=\"false\"\n onClick={() => {\n onSelectId(item.id);\n }}\n >\n <EntityPickerRowBase title={item.title} subtitle={item.subtitle} />\n </button>\n );\n })}\n </div>\n );\n};\n\nexport default EntityPickerList;\n"],"mappings":";;;;;;AAeA,IAAa,KAAoB,EAC/B,UACA,eACA,oBACwC;CACxC,IAAM,EAAE,SAAM,GAA+B;CAa7C,OAXI,EAAM,WAAW,IAEjB,KACE,kBAAC,GAAD;EACE,OAAO,EAAE,qBAAqB;EAC9B,aAAa,EAAE,2BAA2B;EAC1C,CAAA,GAMN,kBAAC,OAAD;EAAK,WAAW;EAAa,MAAK;YAC/B,EAAM,KAAK,MAER,kBAAC,UAAD;GAEE,MAAK;GACL,WAAW;GACX,MAAK;GACL,iBAAc;GACd,eAAe;IACb,EAAW,EAAK,GAAG;;aAGrB,kBAAC,GAAD;IAAqB,OAAO,EAAK;IAAO,UAAU,EAAK;IAAY,CAAA;GAC5D,EAVF,EAAK,GAUH,CAEX;EACE,CAAA"}
@@ -1,35 +1,35 @@
1
1
  import { useBackofficeReactTranslation as e } from "../../../i18n/useBackofficeReactTranslation.js";
2
- import { useBackofficeConfig as t } from "../../../provider/BackofficeConfigContext.js";
3
- import { BackofficeFilterAction as n } from "../filters/BackofficeFilterAction.js";
4
- import { BackofficeFilterableCell as r } from "../shared/BackofficeFilterableCell.js";
5
- import { jsx as i } from "react/jsx-runtime";
2
+ import { BackofficeFilterAction as t } from "../filters/BackofficeFilterAction.js";
3
+ import { BackofficeFilterableCell as n } from "../shared/BackofficeFilterableCell.js";
4
+ import { jsx as r } from "react/jsx-runtime";
6
5
  //#region src/components/backoffice/refs/BackofficeEntityIdRef.tsx
7
- var a = ({ id: a, entity: o, filterWhereKey: s, filterPath: c, filterLabel: l, listConfig: u }) => {
8
- let { entities: d } = t(), { t: f } = e(), p = "";
9
- if (typeof a == "string" && (p = a.trim()), p === "") return /* @__PURE__ */ i("span", { children: "-" });
10
- let m = null;
11
- if (o != null) {
12
- let e = d[o];
13
- e != null && (m = e.routes.detail(p));
14
- }
15
- let h = f("filters.placeholders.unresolved"), g;
16
- m != null && (g = h);
17
- let _ = null;
18
- return s != null && (_ = /* @__PURE__ */ i(n, {
19
- whereKey: s,
20
- value: p,
21
- path: c,
22
- label: l,
23
- listConfig: u
24
- })), /* @__PURE__ */ i(r, {
25
- filterAction: _,
26
- href: m,
27
- title: g,
6
+ var i = ({ id: i, entity: a, filterWhereKey: o, filterPath: s, filterLabel: c, listConfig: l }) => {
7
+ let { t: u } = e(), d = "";
8
+ if (typeof i == "string" && (d = i.trim()), d === "") return /* @__PURE__ */ r("span", { children: "-" });
9
+ let f;
10
+ a != null && (f = {
11
+ kind: "entity-detail",
12
+ entityId: a,
13
+ id: d
14
+ });
15
+ let p = u("filters.placeholders.unresolved"), m;
16
+ f != null && (m = p);
17
+ let h = null;
18
+ return o != null && (h = /* @__PURE__ */ r(t, {
19
+ whereKey: o,
20
+ value: d,
21
+ path: s,
22
+ label: c,
23
+ listConfig: l
24
+ })), /* @__PURE__ */ r(n, {
25
+ filterAction: h,
26
+ target: f,
27
+ title: m,
28
28
  openInNewTab: !0,
29
- children: h
29
+ children: p
30
30
  });
31
31
  };
32
32
  //#endregion
33
- export { a as BackofficeEntityIdRef, a as default };
33
+ export { i as BackofficeEntityIdRef, i as default };
34
34
 
35
35
  //# sourceMappingURL=BackofficeEntityIdRef.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeEntityIdRef.js","names":[],"sources":["../../../../../src/components/backoffice/refs/BackofficeEntityIdRef.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport type { BackofficeRuntimeResolvedListFacetConfig } from '@plumile/backoffice-core/types.js';\nimport { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\nimport { BackofficeFilterAction } from '../filters/BackofficeFilterAction.js';\nimport { BackofficeFilterableCell } from '../shared/BackofficeFilterableCell.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nexport type BackofficeEntityIdRefProps = {\n id: string | null | undefined;\n entity?: string;\n filterWhereKey?: string;\n filterPath?: readonly string[];\n filterLabel?: string;\n listConfig?: BackofficeRuntimeResolvedListFacetConfig;\n};\n\nexport const BackofficeEntityIdRef = ({\n id,\n entity,\n filterWhereKey,\n filterPath,\n filterLabel,\n listConfig,\n}: BackofficeEntityIdRefProps): JSX.Element => {\n const { entities } = useBackofficeConfig();\n const { t } = useBackofficeReactTranslation();\n let resolvedId = '';\n if (typeof id === 'string') {\n resolvedId = id.trim();\n }\n if (resolvedId === '') {\n return <span>-</span>;\n }\n\n let detailTo: string | null = null;\n if (entity != null) {\n const config = entities[entity];\n if (config != null) {\n detailTo = config.routes.detail(resolvedId);\n }\n }\n\n const unresolvedLabel = t('filters.placeholders.unresolved');\n let title: string | undefined;\n if (detailTo != null) {\n title = unresolvedLabel;\n }\n let filterAction: JSX.Element | null = null;\n if (filterWhereKey != null) {\n filterAction = (\n <BackofficeFilterAction\n whereKey={filterWhereKey}\n value={resolvedId}\n path={filterPath}\n label={filterLabel}\n listConfig={listConfig}\n />\n );\n }\n\n return (\n <BackofficeFilterableCell\n filterAction={filterAction}\n href={detailTo}\n title={title}\n openInNewTab\n >\n {unresolvedLabel}\n </BackofficeFilterableCell>\n );\n};\n\nexport default BackofficeEntityIdRef;\n"],"mappings":";;;;;;AAgBA,IAAa,KAAyB,EACpC,OACA,WACA,mBACA,eACA,gBACA,oBAC6C;CAC7C,IAAM,EAAE,gBAAa,GAAqB,EACpC,EAAE,SAAM,GAA+B,EACzC,IAAa;CAIjB,IAHI,OAAO,KAAO,aAChB,IAAa,EAAG,MAAM,GAEpB,MAAe,IACjB,OAAO,kBAAC,QAAD,EAAA,UAAM,KAAQ,CAAA;CAGvB,IAAI,IAA0B;CAC9B,IAAI,KAAU,MAAM;EAClB,IAAM,IAAS,EAAS;EACxB,AAAI,KAAU,SACZ,IAAW,EAAO,OAAO,OAAO,EAAW;;CAI/C,IAAM,IAAkB,EAAE,kCAAkC,EACxD;CACJ,AAAI,KAAY,SACd,IAAQ;CAEV,IAAI,IAAmC;CAavC,OAZI,KAAkB,SACpB,IACE,kBAAC,GAAD;EACE,UAAU;EACV,OAAO;EACP,MAAM;EACN,OAAO;EACK;EACZ,CAAA,GAKJ,kBAAC,GAAD;EACgB;EACd,MAAM;EACC;EACP,cAAA;YAEC;EACwB,CAAA"}
1
+ {"version":3,"file":"BackofficeEntityIdRef.js","names":[],"sources":["../../../../../src/components/backoffice/refs/BackofficeEntityIdRef.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport type { BackofficeRuntimeResolvedListFacetConfig } from '@plumile/backoffice-core/types.js';\nimport { BackofficeFilterAction } from '../filters/BackofficeFilterAction.js';\nimport { BackofficeFilterableCell } from '../shared/BackofficeFilterableCell.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport type { BackofficeLinkTarget } from '../links/types.js';\n\nexport type BackofficeEntityIdRefProps = {\n id: string | null | undefined;\n entity?: string;\n filterWhereKey?: string;\n filterPath?: readonly string[];\n filterLabel?: string;\n listConfig?: BackofficeRuntimeResolvedListFacetConfig;\n};\n\nexport const BackofficeEntityIdRef = ({\n id,\n entity,\n filterWhereKey,\n filterPath,\n filterLabel,\n listConfig,\n}: BackofficeEntityIdRefProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n let resolvedId = '';\n if (typeof id === 'string') {\n resolvedId = id.trim();\n }\n if (resolvedId === '') {\n return <span>-</span>;\n }\n\n let target: BackofficeLinkTarget | undefined;\n if (entity != null) {\n target = {\n kind: 'entity-detail',\n entityId: entity,\n id: resolvedId,\n };\n }\n\n const unresolvedLabel = t('filters.placeholders.unresolved');\n let title: string | undefined;\n if (target != null) {\n title = unresolvedLabel;\n }\n let filterAction: JSX.Element | null = null;\n if (filterWhereKey != null) {\n filterAction = (\n <BackofficeFilterAction\n whereKey={filterWhereKey}\n value={resolvedId}\n path={filterPath}\n label={filterLabel}\n listConfig={listConfig}\n />\n );\n }\n\n return (\n <BackofficeFilterableCell\n filterAction={filterAction}\n target={target}\n title={title}\n openInNewTab\n >\n {unresolvedLabel}\n </BackofficeFilterableCell>\n );\n};\n\nexport default BackofficeEntityIdRef;\n"],"mappings":";;;;;AAgBA,IAAa,KAAyB,EACpC,OACA,WACA,mBACA,eACA,gBACA,oBAC6C;CAC7C,IAAM,EAAE,SAAM,GAA+B,EACzC,IAAa;CAIjB,IAHI,OAAO,KAAO,aAChB,IAAa,EAAG,MAAM,GAEpB,MAAe,IACjB,OAAO,kBAAC,QAAD,EAAA,UAAM,KAAQ,CAAA;CAGvB,IAAI;CACJ,AAAI,KAAU,SACZ,IAAS;EACP,MAAM;EACN,UAAU;EACV,IAAI;EACL;CAGH,IAAM,IAAkB,EAAE,kCAAkC,EACxD;CACJ,AAAI,KAAU,SACZ,IAAQ;CAEV,IAAI,IAAmC;CAavC,OAZI,KAAkB,SACpB,IACE,kBAAC,GAAD;EACE,UAAU;EACV,OAAO;EACP,MAAM;EACN,OAAO;EACK;EACZ,CAAA,GAKJ,kBAAC,GAAD;EACgB;EACN;EACD;EACP,cAAA;YAEC;EACwB,CAAA"}
@@ -1,30 +1,33 @@
1
1
  import { useBackofficeReactTranslation as e } from "../../../i18n/useBackofficeReactTranslation.js";
2
- import { useBackofficeConfig as t } from "../../../provider/BackofficeConfigContext.js";
3
- import { BackofficeFilterAction as n } from "../filters/BackofficeFilterAction.js";
4
- import { BackofficeFilterableCell as r } from "../shared/BackofficeFilterableCell.js";
5
- import { jsx as i } from "react/jsx-runtime";
2
+ import { BackofficeFilterAction as t } from "../filters/BackofficeFilterAction.js";
3
+ import { BackofficeFilterableCell as n } from "../shared/BackofficeFilterableCell.js";
4
+ import { jsx as r } from "react/jsx-runtime";
6
5
  //#region src/components/backoffice/refs/BackofficeEntityLink.tsx
7
- var a = ({ id: a, label: o, entity: s, filterWhereKey: c, filterValue: l, filterPath: u, filterLabel: d, listConfig: f }) => {
8
- let { t: p } = e(), { entities: m } = t(), h = "";
9
- if (typeof a == "string" && (h = a.trim()), h === "") return /* @__PURE__ */ i("span", { children: p("common.notAvailable") });
10
- let g = null;
11
- c != null && (g = /* @__PURE__ */ i(n, {
12
- whereKey: c,
13
- value: l ?? h,
14
- path: u,
15
- label: d,
16
- listConfig: f
6
+ var i = ({ id: i, label: a, entity: o, filterWhereKey: s, filterValue: c, filterPath: l, filterLabel: u, listConfig: d }) => {
7
+ let { t: f } = e(), p = "";
8
+ if (typeof i == "string" && (p = i.trim()), p === "") return /* @__PURE__ */ r("span", { children: f("common.notAvailable") });
9
+ let m = null;
10
+ s != null && (m = /* @__PURE__ */ r(t, {
11
+ whereKey: s,
12
+ value: c ?? p,
13
+ path: l,
14
+ label: u,
15
+ listConfig: d
17
16
  }));
18
- let _ = m[s]?.routes.detail(h) ?? null, v = o ?? "";
19
- return v.trim() === "" && (v = p(_ == null ? "common.notAvailable" : "actions.view")), /* @__PURE__ */ i(r, {
20
- filterAction: g,
21
- href: _,
22
- title: v,
17
+ let h = {
18
+ kind: "entity-detail",
19
+ entityId: o,
20
+ id: p
21
+ }, g = a ?? "";
22
+ return g.trim() === "" && (g = f("actions.view")), /* @__PURE__ */ r(n, {
23
+ filterAction: m,
24
+ target: h,
25
+ title: g,
23
26
  openInNewTab: !0,
24
- children: v
27
+ children: g
25
28
  });
26
29
  };
27
30
  //#endregion
28
- export { a as BackofficeEntityLink, a as default };
31
+ export { i as BackofficeEntityLink, i as default };
29
32
 
30
33
  //# sourceMappingURL=BackofficeEntityLink.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeEntityLink.js","names":[],"sources":["../../../../../src/components/backoffice/refs/BackofficeEntityLink.tsx"],"sourcesContent":["import { type JSX } from 'react';\n\nimport type { BackofficeRuntimeResolvedListFacetConfig } from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { BackofficeFilterAction } from '../filters/BackofficeFilterAction.js';\nimport { BackofficeFilterableCell } from '../shared/BackofficeFilterableCell.js';\n\nexport type BackofficeEntityLinkProps = {\n id: string | null | undefined;\n label?: string | null | undefined;\n entity: string;\n filterWhereKey?: string;\n filterValue?: string;\n filterPath?: readonly string[];\n filterLabel?: string;\n listConfig?: BackofficeRuntimeResolvedListFacetConfig;\n};\n\nexport const BackofficeEntityLink = ({\n id,\n label,\n entity,\n filterWhereKey,\n filterValue,\n filterPath,\n filterLabel,\n listConfig,\n}: BackofficeEntityLinkProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n let resolvedId = '';\n if (typeof id === 'string') {\n resolvedId = id.trim();\n }\n if (resolvedId === '') {\n return <span>{t('common.notAvailable')}</span>;\n }\n\n let filterAction: JSX.Element | null = null;\n if (filterWhereKey != null) {\n const resolvedFilterValue = filterValue ?? resolvedId;\n filterAction = (\n <BackofficeFilterAction\n whereKey={filterWhereKey}\n value={resolvedFilterValue}\n path={filterPath}\n label={filterLabel}\n listConfig={listConfig}\n />\n );\n }\n\n const config = entities[entity];\n const detailTo = config?.routes.detail(resolvedId) ?? null;\n let resolvedLabel = label ?? '';\n if (resolvedLabel.trim() === '') {\n if (detailTo != null) {\n resolvedLabel = t('actions.view');\n } else {\n resolvedLabel = t('common.notAvailable');\n }\n }\n\n return (\n <BackofficeFilterableCell\n filterAction={filterAction}\n href={detailTo}\n title={resolvedLabel}\n openInNewTab\n >\n {resolvedLabel}\n </BackofficeFilterableCell>\n );\n};\n\nexport default BackofficeEntityLink;\n"],"mappings":";;;;;;AAoBA,IAAa,KAAwB,EACnC,OACA,UACA,WACA,mBACA,gBACA,eACA,gBACA,oBAC4C;CAC5C,IAAM,EAAE,SAAM,GAA+B,EACvC,EAAE,gBAAa,GAAqB,EACtC,IAAa;CAIjB,IAHI,OAAO,KAAO,aAChB,IAAa,EAAG,MAAM,GAEpB,MAAe,IACjB,OAAO,kBAAC,QAAD,EAAA,UAAO,EAAE,sBAAsB,EAAQ,CAAA;CAGhD,IAAI,IAAmC;CACvC,AAAI,KAAkB,SAEpB,IACE,kBAAC,GAAD;EACE,UAAU;EACV,OAJwB,KAAe;EAKvC,MAAM;EACN,OAAO;EACK;EACZ,CAAA;CAKN,IAAM,IADS,EAAS,IACC,OAAO,OAAO,EAAW,IAAI,MAClD,IAAgB,KAAS;CAS7B,OARI,EAAc,MAAM,KAAK,OAC3B,AACE,IAEgB,EAHd,KAAY,OAGI,wBAFA,eAEsB,GAK1C,kBAAC,GAAD;EACgB;EACd,MAAM;EACN,OAAO;EACP,cAAA;YAEC;EACwB,CAAA"}
1
+ {"version":3,"file":"BackofficeEntityLink.js","names":[],"sources":["../../../../../src/components/backoffice/refs/BackofficeEntityLink.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport type { BackofficeRuntimeResolvedListFacetConfig } from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport type { BackofficeLinkTarget } from '../links/types.js';\nimport { BackofficeFilterAction } from '../filters/BackofficeFilterAction.js';\nimport { BackofficeFilterableCell } from '../shared/BackofficeFilterableCell.js';\n\nexport type BackofficeEntityLinkProps = {\n id: string | null | undefined;\n label?: string | null | undefined;\n entity: string;\n filterWhereKey?: string;\n filterValue?: string;\n filterPath?: readonly string[];\n filterLabel?: string;\n listConfig?: BackofficeRuntimeResolvedListFacetConfig;\n};\n\nexport const BackofficeEntityLink = ({\n id,\n label,\n entity,\n filterWhereKey,\n filterValue,\n filterPath,\n filterLabel,\n listConfig,\n}: BackofficeEntityLinkProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n let resolvedId = '';\n if (typeof id === 'string') {\n resolvedId = id.trim();\n }\n if (resolvedId === '') {\n return <span>{t('common.notAvailable')}</span>;\n }\n\n let filterAction: JSX.Element | null = null;\n if (filterWhereKey != null) {\n const resolvedFilterValue = filterValue ?? resolvedId;\n filterAction = (\n <BackofficeFilterAction\n whereKey={filterWhereKey}\n value={resolvedFilterValue}\n path={filterPath}\n label={filterLabel}\n listConfig={listConfig}\n />\n );\n }\n\n const target = {\n kind: 'entity-detail',\n entityId: entity,\n id: resolvedId,\n } as BackofficeLinkTarget;\n let resolvedLabel = label ?? '';\n if (resolvedLabel.trim() === '') {\n resolvedLabel = t('actions.view');\n }\n\n return (\n <BackofficeFilterableCell\n filterAction={filterAction}\n target={target}\n title={resolvedLabel}\n openInNewTab\n >\n {resolvedLabel}\n </BackofficeFilterableCell>\n );\n};\n\nexport default BackofficeEntityLink;\n"],"mappings":";;;;;AAmBA,IAAa,KAAwB,EACnC,OACA,UACA,WACA,mBACA,gBACA,eACA,gBACA,oBAC4C;CAC5C,IAAM,EAAE,SAAM,GAA+B,EACzC,IAAa;CAIjB,IAHI,OAAO,KAAO,aAChB,IAAa,EAAG,MAAM,GAEpB,MAAe,IACjB,OAAO,kBAAC,QAAD,EAAA,UAAO,EAAE,sBAAsB,EAAQ,CAAA;CAGhD,IAAI,IAAmC;CACvC,AAAI,KAAkB,SAEpB,IACE,kBAAC,GAAD;EACE,UAAU;EACV,OAJwB,KAAe;EAKvC,MAAM;EACN,OAAO;EACK;EACZ,CAAA;CAIN,IAAM,IAAS;EACb,MAAM;EACN,UAAU;EACV,IAAI;EACL,EACG,IAAgB,KAAS;CAK7B,OAJI,EAAc,MAAM,KAAK,OAC3B,IAAgB,EAAE,eAAe,GAIjC,kBAAC,GAAD;EACgB;EACN;EACR,OAAO;EACP,cAAA;YAEC;EACwB,CAAA"}