@plumile/backoffice-react 0.1.106 → 0.1.108
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/esm/auth/TotpQrCode.js +1 -1
- package/lib/esm/auth/TotpQrCode.js.map +1 -1
- package/lib/esm/auth/login/EmailCapturePanel.js +27 -23
- package/lib/esm/auth/login/EmailCapturePanel.js.map +1 -1
- package/lib/esm/auth/login/MfaChallengeForm.js +38 -36
- package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -1
- package/lib/esm/auth/login/PasskeyLoginForm.js +40 -37
- package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -1
- package/lib/esm/auth/pages/AcceptInvitationScreen.js +63 -62
- package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetCompleteScreen.js +56 -55
- package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetRequestScreen.js +45 -45
- package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
- package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +1 -0
- package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
- package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +44 -39
- package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeCopyButton.js +15 -0
- package/lib/esm/components/backoffice/detail/BackofficeCopyButton.js.map +1 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailActionBar.js +11 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailActionBar.js.map +1 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailBlock.js +7 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailBlock.js.map +1 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailHeader.js +15 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailHeader.js.map +1 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailPage.js +19 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailPage.js.map +1 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js +47 -40
- package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js +83 -90
- package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailTable.js +8 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailTable.js.map +1 -0
- package/lib/esm/components/backoffice/detail/BackofficeEmptyValue.js +7 -0
- package/lib/esm/components/backoffice/detail/BackofficeEmptyValue.js.map +1 -0
- package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js +8 -0
- package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js.map +1 -0
- package/lib/esm/components/backoffice/detail/BackofficeTechnicalFacts.js +2 -0
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +53 -48
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js +2 -2
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.js +15 -11
- package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js +50 -23
- package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js.map +1 -1
- package/lib/esm/components/backoffice/layout/buildSidebarSections.js +69 -69
- package/lib/esm/components/backoffice/layout/sidebarUtils.js +16 -16
- package/lib/esm/components/backoffice/layout/sidebarUtils.js.map +1 -1
- package/lib/esm/components/backoffice/links/BackofficeInlineLink.js +29 -0
- package/lib/esm/components/backoffice/links/BackofficeInlineLink.js.map +1 -0
- package/lib/esm/components/backoffice/links/BackofficeLink.js +21 -0
- package/lib/esm/components/backoffice/links/BackofficeLink.js.map +1 -0
- package/lib/esm/components/backoffice/links/BackofficeLinkContent.js +26 -0
- package/lib/esm/components/backoffice/links/BackofficeLinkContent.js.map +1 -0
- package/lib/esm/components/backoffice/links/BackofficeLinkLabel.js +19 -0
- package/lib/esm/components/backoffice/links/BackofficeLinkLabel.js.map +1 -0
- package/lib/esm/components/backoffice/links/backofficeLink.css.js +7 -0
- package/lib/esm/components/backoffice/links/backofficeLink.css.js.map +1 -0
- package/lib/esm/components/backoffice/links/resolveBackofficeLink.js +81 -0
- package/lib/esm/components/backoffice/links/resolveBackofficeLink.js.map +1 -0
- package/lib/esm/components/backoffice/links/resolveBackofficeTargetIcon.js +50 -0
- package/lib/esm/components/backoffice/links/resolveBackofficeTargetIcon.js.map +1 -0
- package/lib/esm/components/backoffice/links/types.js +0 -0
- package/lib/esm/components/backoffice/links/useBackofficeLink.js +21 -0
- package/lib/esm/components/backoffice/links/useBackofficeLink.js.map +1 -0
- package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +1 -0
- package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js +27 -27
- package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js +24 -21
- package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js +45 -44
- package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +269 -223
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js +25 -30
- package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js.map +1 -1
- package/lib/esm/i18n/locales/en/backofficeReact.js +8 -0
- package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
- package/lib/esm/i18n/locales/fr/backofficeReact.js +8 -0
- package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
- package/lib/esm/index.js +88 -73
- package/lib/esm/pages/BackofficeDashboardPage.js +1 -5
- package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.js +231 -222
- package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +170 -54
- package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListPage.js +196 -207
- package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
- package/lib/esm/pages/BackofficeHubPage.js +21 -21
- package/lib/esm/pages/BackofficeLayoutPage.js +7 -7
- package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
- package/lib/esm/router/createBackofficeRoutes.js +132 -126
- package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
- package/lib/esm/style.css +1 -1
- package/lib/types/auth/login/EmailCapturePanel.d.ts.map +1 -1
- package/lib/types/auth/login/MfaChallengeForm.d.ts.map +1 -1
- package/lib/types/auth/login/PasskeyLoginForm.d.ts.map +1 -1
- package/lib/types/auth/pages/AcceptInvitationScreen.d.ts.map +1 -1
- package/lib/types/auth/pages/PasswordResetCompleteScreen.d.ts.map +1 -1
- package/lib/types/auth/pages/PasswordResetRequestScreen.d.ts.map +1 -1
- package/lib/types/components/backoffice/actions/BackofficeEntityActionFormDialog.d.ts.map +1 -1
- package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts +0 -1
- package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeCopyButton.d.ts +8 -0
- package/lib/types/components/backoffice/detail/BackofficeCopyButton.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailActionBar.d.ts +9 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailActionBar.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailBlock.d.ts +7 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailBlock.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailHeader.d.ts +12 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailHeader.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailPage.d.ts +16 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailPage.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailPage.stories.d.ts +11 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailPage.stories.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailRelationLink.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeDetailRelationListBlock.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeDetailTable.d.ts +6 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailTable.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeEmptyValue.d.ts +7 -0
- package/lib/types/components/backoffice/detail/BackofficeEmptyValue.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeStatusGroup.d.ts +8 -0
- package/lib/types/components/backoffice/detail/BackofficeStatusGroup.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeTechnicalFacts.d.ts +2 -0
- package/lib/types/components/backoffice/detail/BackofficeTechnicalFacts.d.ts.map +1 -0
- package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.d.ts +1 -0
- package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/breadcrumb/buildBreadcrumbs.d.ts +10 -8
- package/lib/types/components/backoffice/layout/breadcrumb/buildBreadcrumbs.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/breadcrumb/types.d.ts +10 -5
- package/lib/types/components/backoffice/layout/breadcrumb/types.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/sidebarUtils.d.ts +6 -2
- package/lib/types/components/backoffice/layout/sidebarUtils.d.ts.map +1 -1
- package/lib/types/components/backoffice/links/BackofficeInlineLink.d.ts +18 -0
- package/lib/types/components/backoffice/links/BackofficeInlineLink.d.ts.map +1 -0
- package/lib/types/components/backoffice/links/BackofficeLink.d.ts +13 -0
- package/lib/types/components/backoffice/links/BackofficeLink.d.ts.map +1 -0
- package/lib/types/components/backoffice/links/BackofficeLinkContent.d.ts +10 -0
- package/lib/types/components/backoffice/links/BackofficeLinkContent.d.ts.map +1 -0
- package/lib/types/components/backoffice/links/BackofficeLinkLabel.d.ts +12 -0
- package/lib/types/components/backoffice/links/BackofficeLinkLabel.d.ts.map +1 -0
- package/lib/types/components/backoffice/links/backofficeLink.css.d.ts +4 -0
- package/lib/types/components/backoffice/links/backofficeLink.css.d.ts.map +1 -0
- package/lib/types/components/backoffice/links/resolveBackofficeLink.d.ts +15 -0
- package/lib/types/components/backoffice/links/resolveBackofficeLink.d.ts.map +1 -0
- package/lib/types/components/backoffice/links/resolveBackofficeTargetIcon.d.ts +8 -0
- package/lib/types/components/backoffice/links/resolveBackofficeTargetIcon.d.ts.map +1 -0
- package/lib/types/components/backoffice/links/types.d.ts +45 -0
- package/lib/types/components/backoffice/links/types.d.ts.map +1 -0
- package/lib/types/components/backoffice/links/useBackofficeLink.d.ts +7 -0
- package/lib/types/components/backoffice/links/useBackofficeLink.d.ts.map +1 -0
- package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
- package/lib/types/components/backoffice/refs/BackofficeEntityLink.d.ts.map +1 -1
- package/lib/types/components/backoffice/refs/BackofficeRelatedCountLink.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
- package/lib/types/components/backoffice/shared/BackofficeFilterableCell.d.ts +6 -3
- package/lib/types/components/backoffice/shared/BackofficeFilterableCell.d.ts.map +1 -1
- package/lib/types/i18n/resources.d.ts +16 -0
- package/lib/types/i18n/resources.d.ts.map +1 -1
- package/lib/types/index.d.ts +24 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/pages/BackofficeDashboardPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +49 -22
- package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
- package/lib/types/provider/types.d.ts +26 -22
- package/lib/types/provider/types.d.ts.map +1 -1
- package/lib/types/router/createBackofficeRoutes.d.ts +36 -1
- package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { content as e, label as t } from "./backofficeLink.css.js";
|
|
2
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
3
|
+
//#region src/components/backoffice/links/BackofficeLinkContent.tsx
|
|
4
|
+
var i = ({ icon: i, label: a, showIcon: o = !0, endAdornment: s }) => /* @__PURE__ */ r("span", {
|
|
5
|
+
className: e,
|
|
6
|
+
children: [
|
|
7
|
+
o && i != null && /* @__PURE__ */ n("span", {
|
|
8
|
+
className: "_1ev5hus0 txvbqb9jg txvbqbcp txvbqbdoy txvbqbv69",
|
|
9
|
+
"aria-hidden": "true",
|
|
10
|
+
children: /* @__PURE__ */ n(i, {
|
|
11
|
+
width: 14,
|
|
12
|
+
height: 14,
|
|
13
|
+
"aria-hidden": "true"
|
|
14
|
+
})
|
|
15
|
+
}),
|
|
16
|
+
/* @__PURE__ */ n("span", {
|
|
17
|
+
className: t,
|
|
18
|
+
children: a
|
|
19
|
+
}),
|
|
20
|
+
s
|
|
21
|
+
]
|
|
22
|
+
});
|
|
23
|
+
//#endregion
|
|
24
|
+
export { i as BackofficeLinkContent };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=BackofficeLinkContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackofficeLinkContent.js","names":[],"sources":["../../../../../src/components/backoffice/links/BackofficeLinkContent.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport type { BackofficeIconComponent } from '../../../provider/types.js';\nimport * as styles from './backofficeLink.css.js';\n\nexport type BackofficeLinkContentProps = {\n icon?: BackofficeIconComponent;\n label: ReactNode;\n showIcon?: boolean;\n endAdornment?: ReactNode;\n};\n\nexport const BackofficeLinkContent = ({\n icon: Icon,\n label,\n showIcon = true,\n endAdornment,\n}: BackofficeLinkContentProps): JSX.Element => {\n return (\n <span className={styles.content}>\n {showIcon && Icon != null && (\n <span className={styles.icon} aria-hidden=\"true\">\n <Icon width={14} height={14} aria-hidden=\"true\" />\n </span>\n )}\n <span className={styles.label}>{label}</span>\n {endAdornment}\n </span>\n );\n};\n"],"mappings":";;;AAYA,IAAa,KAAyB,EACpC,MAAM,GACN,OAAA,GACA,cAAW,IACX,sBAGE,kBAAC,QAAD;CAAM,WAAW;WAAjB;EACG,KAAY,KAAQ,QACnB,kBAAC,QAAD;GAAM,WAAW;GAAa,eAAY;aACxC,kBAAC,GAAD;IAAM,OAAO;IAAI,QAAQ;IAAI,eAAY;IAAS,CAAA;GAC7C,CAAA;EAET,kBAAC,QAAD;GAAM,WAAW;aAAe;GAAa,CAAA;EAC5C;EACI"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BackofficeLinkContent as e } from "./BackofficeLinkContent.js";
|
|
2
|
+
import { useBackofficeLink as t } from "./useBackofficeLink.js";
|
|
3
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
4
|
+
//#region src/components/backoffice/links/BackofficeLinkLabel.tsx
|
|
5
|
+
var r = ({ target: r, label: i, className: a, icon: o = "auto" }) => {
|
|
6
|
+
let s = t(r, { label: i });
|
|
7
|
+
return /* @__PURE__ */ n("span", {
|
|
8
|
+
className: a,
|
|
9
|
+
children: /* @__PURE__ */ n(e, {
|
|
10
|
+
icon: s.icon,
|
|
11
|
+
label: s.label,
|
|
12
|
+
showIcon: o === "auto"
|
|
13
|
+
})
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
//#endregion
|
|
17
|
+
export { r as BackofficeLinkLabel, r as default };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=BackofficeLinkLabel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackofficeLinkLabel.js","names":[],"sources":["../../../../../src/components/backoffice/links/BackofficeLinkLabel.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeLinkContent } from './BackofficeLinkContent.js';\nimport type { BackofficeLinkTarget } from './types.js';\nimport { useBackofficeLink } from './useBackofficeLink.js';\n\nexport type BackofficeLinkLabelProps<\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n> = {\n target: BackofficeLinkTarget<TManifest>;\n label?: ReactNode;\n className?: string;\n icon?: 'auto' | 'none';\n};\n\nexport const BackofficeLinkLabel = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>({\n target,\n label,\n className,\n icon = 'auto',\n}: BackofficeLinkLabelProps<TManifest>): JSX.Element => {\n const link = useBackofficeLink(target, { label });\n\n return (\n <span className={className}>\n <BackofficeLinkContent\n icon={link.icon}\n label={link.label}\n showIcon={icon === 'auto'}\n />\n </span>\n );\n};\n\nexport default BackofficeLinkLabel;\n"],"mappings":";;;;AAiBA,IAAa,KAEX,EACA,WACA,UACA,cACA,UAAO,aAC+C;CACtD,IAAM,IAAO,EAAkB,GAAQ,EAAE,UAAO,CAAC;CAEjD,OACE,kBAAC,QAAD;EAAiB;YACf,kBAAC,GAAD;GACE,MAAM,EAAK;GACX,OAAO,EAAK;GACZ,UAAU,MAAS;GACnB,CAAA;EACG,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/* empty css */
|
|
2
|
+
//#region src/components/backoffice/links/backofficeLink.css.ts
|
|
3
|
+
var e = "txvbqb9jg txvbqbcp txvbqbany", t = "_1ev5hus0 txvbqb9jg txvbqbcp txvbqbdoy txvbqbv69", n = "_1ev5hus1";
|
|
4
|
+
//#endregion
|
|
5
|
+
export { e as content, t as icon, n as label };
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=backofficeLink.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backofficeLink.css.js","names":[],"sources":["../../../../../src/components/backoffice/links/backofficeLink.css.ts"],"sourcesContent":["import { sprinkles } from '@plumile/ui';\nimport { style } from '@vanilla-extract/css';\n\nconst INLINE_FLEX = 'inline-flex' as const;\n\nexport const content = sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n gap: 1,\n});\n\nexport const icon = style([\n sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n justifyContent: 'center',\n color: 'current',\n }),\n {\n flex: '0 0 auto',\n width: '14px',\n height: '14px',\n },\n]);\n\nexport const label = style({\n minWidth: 0,\n});\n"],"mappings":""}
|
|
@@ -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"}
|
|
@@ -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,35 +1,35 @@
|
|
|
1
1
|
import { useBackofficeReactTranslation as e } from "../../../i18n/useBackofficeReactTranslation.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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
|
|
8
|
-
let {
|
|
9
|
-
if (typeof
|
|
10
|
-
let
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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:
|
|
29
|
+
children: p
|
|
30
30
|
});
|
|
31
31
|
};
|
|
32
32
|
//#endregion
|
|
33
|
-
export {
|
|
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 {
|
|
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 {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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
|
|
8
|
-
let { t:
|
|
9
|
-
if (typeof
|
|
10
|
-
let
|
|
11
|
-
|
|
12
|
-
whereKey:
|
|
13
|
-
value:
|
|
14
|
-
path:
|
|
15
|
-
label:
|
|
16
|
-
listConfig:
|
|
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
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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:
|
|
27
|
+
children: g
|
|
25
28
|
});
|
|
26
29
|
};
|
|
27
30
|
//#endregion
|
|
28
|
-
export {
|
|
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';\
|
|
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"}
|
|
@@ -1,65 +1,66 @@
|
|
|
1
1
|
import { useBackofficeReactTranslation as e } from "../../../i18n/useBackofficeReactTranslation.js";
|
|
2
2
|
import { useBackofficeConfig as t } from "../../../provider/BackofficeConfigContext.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
3
|
+
import { resolveBackofficeLink as n } from "../links/resolveBackofficeLink.js";
|
|
4
|
+
import { BackofficeInlineLink as r } from "../links/BackofficeInlineLink.js";
|
|
5
|
+
import { count as i, icon as a, link as o } from "./backofficeRelatedCountLink.css.js";
|
|
6
|
+
import { useContext as s } from "react";
|
|
7
|
+
import { jsx as c } from "react/jsx-runtime";
|
|
8
|
+
import { useTranslation as l } from "react-i18next";
|
|
9
|
+
import { RoutingContext as u } from "@plumile/router";
|
|
10
|
+
import { buildBackofficeListLink as d } from "@plumile/backoffice-core/state/buildListHref.js";
|
|
9
11
|
//#region src/components/backoffice/refs/BackofficeRelatedCountLink.tsx
|
|
10
|
-
var
|
|
11
|
-
let { t:
|
|
12
|
-
typeof
|
|
13
|
-
let
|
|
14
|
-
if (
|
|
15
|
-
let
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
var f = ({ count: f, entity: p, where: m }) => {
|
|
13
|
+
let { t: h } = l(), { t: g } = e(), { entities: _, entityManifest: v, entityRegistry: y, sidebar: b } = t(), x = s(u), S = 0;
|
|
14
|
+
typeof f == "number" && Number.isFinite(f) && (S = f);
|
|
15
|
+
let C = _[p];
|
|
16
|
+
if (C == null) return /* @__PURE__ */ c("span", { children: S });
|
|
17
|
+
let w = g("relations.openFilteredList", { label: C.label(h) }), T = y.getLoadedListEntity(p), E = {
|
|
18
|
+
kind: "entity-list",
|
|
19
|
+
entityId: p,
|
|
20
|
+
state: { where: m }
|
|
21
|
+
}, D = async (e) => {
|
|
22
|
+
let t = d((await y.loadListEntity(p)).config, { where: m }), n = "";
|
|
19
23
|
t.search !== "" && (n = `?${t.search}`), e.push({
|
|
20
24
|
pathname: t.pathname,
|
|
21
25
|
search: n,
|
|
22
26
|
hash: ""
|
|
23
27
|
});
|
|
24
28
|
};
|
|
25
|
-
return /* @__PURE__ */
|
|
26
|
-
|
|
27
|
-
className:
|
|
28
|
-
title:
|
|
29
|
-
|
|
29
|
+
return /* @__PURE__ */ c(r, {
|
|
30
|
+
target: E,
|
|
31
|
+
className: o,
|
|
32
|
+
title: w,
|
|
33
|
+
ariaLabel: w,
|
|
30
34
|
onClick: (e) => {
|
|
31
|
-
if (
|
|
35
|
+
if (T != null || x == null || e.defaultPrevented || e.button !== 0 || e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) return;
|
|
32
36
|
e.preventDefault();
|
|
33
|
-
let { history: t } =
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
T.search !== "" && (e = `?${T.search}`), t.push({
|
|
46
|
-
pathname: T.pathname,
|
|
47
|
-
search: e,
|
|
48
|
-
hash: ""
|
|
37
|
+
let { history: t } = x;
|
|
38
|
+
D(t).catch(() => {
|
|
39
|
+
let e = n({
|
|
40
|
+
target: E,
|
|
41
|
+
manifest: v,
|
|
42
|
+
sidebar: b,
|
|
43
|
+
tApp: h
|
|
44
|
+
}), r = new URL(e.href, window.location.origin);
|
|
45
|
+
t.push({
|
|
46
|
+
pathname: r.pathname,
|
|
47
|
+
search: r.search,
|
|
48
|
+
hash: r.hash
|
|
49
49
|
});
|
|
50
50
|
});
|
|
51
51
|
},
|
|
52
|
-
|
|
53
|
-
className:
|
|
54
|
-
children: x
|
|
55
|
-
}), /* @__PURE__ */ o("span", {
|
|
56
|
-
className: r,
|
|
52
|
+
endAdornment: /* @__PURE__ */ c("span", {
|
|
53
|
+
className: a,
|
|
57
54
|
"aria-hidden": "true",
|
|
58
55
|
children: "›"
|
|
59
|
-
})
|
|
56
|
+
}),
|
|
57
|
+
children: /* @__PURE__ */ c("span", {
|
|
58
|
+
className: i,
|
|
59
|
+
children: S
|
|
60
|
+
})
|
|
60
61
|
});
|
|
61
62
|
};
|
|
62
63
|
//#endregion
|
|
63
|
-
export {
|
|
64
|
+
export { f as BackofficeRelatedCountLink, f as default };
|
|
64
65
|
|
|
65
66
|
//# sourceMappingURL=BackofficeRelatedCountLink.js.map
|