@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
|
@@ -7,17 +7,23 @@ var e = (e, t) => e(t), t = (t) => {
|
|
|
7
7
|
let i = t.layoutView.id;
|
|
8
8
|
return typeof i == "string" && i.trim() !== "" ? i : "";
|
|
9
9
|
}, n = (e) => [{
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
kind: "current",
|
|
11
|
+
target: { kind: "dashboard" },
|
|
12
|
+
label: e("sidebar.items.dashboard")
|
|
13
13
|
}], r = (e) => [{
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
kind: "current",
|
|
15
|
+
target: {
|
|
16
|
+
kind: "hub",
|
|
17
|
+
hubId: e.id
|
|
18
|
+
},
|
|
19
|
+
label: e.title
|
|
17
20
|
}], i = (t, n) => [{
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
kind: "current",
|
|
22
|
+
target: {
|
|
23
|
+
kind: "entity-list",
|
|
24
|
+
entityId: t.id
|
|
25
|
+
},
|
|
26
|
+
label: e(t.label, n)
|
|
21
27
|
}], a = (n) => {
|
|
22
28
|
let r = e(n.config.label, n.tApp), i = t({
|
|
23
29
|
layoutView: n.layoutView,
|
|
@@ -26,26 +32,47 @@ var e = (e, t) => e(t), t = (t) => {
|
|
|
26
32
|
});
|
|
27
33
|
return [
|
|
28
34
|
{
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
35
|
+
kind: "link",
|
|
36
|
+
target: {
|
|
37
|
+
kind: "entity-list",
|
|
38
|
+
entityId: n.config.id
|
|
39
|
+
},
|
|
40
|
+
label: r
|
|
32
41
|
},
|
|
33
42
|
{
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
43
|
+
kind: "link",
|
|
44
|
+
target: {
|
|
45
|
+
kind: "entity-detail",
|
|
46
|
+
entityId: n.config.id,
|
|
47
|
+
id: n.entityId
|
|
48
|
+
},
|
|
49
|
+
label: i
|
|
37
50
|
},
|
|
38
51
|
{
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
52
|
+
kind: "current",
|
|
53
|
+
target: {
|
|
54
|
+
kind: "entity-detail-page",
|
|
55
|
+
entityId: n.config.id,
|
|
56
|
+
id: n.entityId,
|
|
57
|
+
pageId: n.pageId ?? n.pageLabel
|
|
58
|
+
},
|
|
59
|
+
label: n.pageLabel
|
|
42
60
|
}
|
|
43
61
|
];
|
|
44
|
-
}, o = (e) =>
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
62
|
+
}, o = (e) => {
|
|
63
|
+
let t = {
|
|
64
|
+
kind: "href",
|
|
65
|
+
href: `/tools/${e.title}`
|
|
66
|
+
};
|
|
67
|
+
return e.id != null && (t = {
|
|
68
|
+
kind: "tool",
|
|
69
|
+
toolId: e.id
|
|
70
|
+
}), [{
|
|
71
|
+
kind: "current",
|
|
72
|
+
target: t,
|
|
73
|
+
label: e.title
|
|
74
|
+
}];
|
|
75
|
+
};
|
|
49
76
|
//#endregion
|
|
50
77
|
export { n as buildDashboardBreadcrumb, a as buildEntityDetailBreadcrumb, i as buildEntityListBreadcrumb, r as buildHubBreadcrumb, o as buildToolBreadcrumb, t as resolveEntityTitleFromDetailHeader };
|
|
51
78
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildBreadcrumbs.js","names":[],"sources":["../../../../../../src/components/backoffice/layout/breadcrumb/buildBreadcrumbs.ts"],"sourcesContent":["import type { TFunction } from 'i18next';\n\nimport type {\n BackofficeResolvedDetailLayoutFacetConfig,\n BackofficeResolvedDetailPageFacetConfig,\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport type { BackofficeTopbarBreadcrumbItem } from './types.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const resolveEntityTitleFromDetailHeader = <\n LayoutView extends object,\n>(input: {\n layoutView: LayoutView;\n detailHeader: BackofficeResolvedDetailLayoutFacetConfig['header'];\n tApp: TFunction;\n}): string => {\n const titleValue = input.detailHeader.titleValue?.(\n input.layoutView,\n input.tApp,\n );\n if (typeof titleValue === 'string' && titleValue.trim() !== '') {\n return titleValue;\n }\n\n const title = resolveLabel(input.detailHeader.title, input.tApp);\n if (title.trim() !== '') {\n return title;\n }\n\n const maybeId = (input.layoutView as { id?: unknown }).id;\n if (typeof maybeId === 'string' && maybeId.trim() !== '') {\n return maybeId;\n }\n\n return '';\n};\n\nexport const buildDashboardBreadcrumb = (\n t: TFunction,\n): readonly BackofficeTopbarBreadcrumbItem[] => {\n return [\n {\n
|
|
1
|
+
{"version":3,"file":"buildBreadcrumbs.js","names":[],"sources":["../../../../../../src/components/backoffice/layout/breadcrumb/buildBreadcrumbs.ts"],"sourcesContent":["import type { TFunction } from 'i18next';\n\nimport type {\n BackofficeEntityManifestMap,\n BackofficeManifestDetailEntityId,\n BackofficeManifestListEntityId,\n BackofficeManifestToolId,\n BackofficeResolvedDetailLayoutFacetConfig,\n BackofficeResolvedDetailPageFacetConfig,\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport type { BackofficeTopbarBreadcrumbItem } from './types.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const resolveEntityTitleFromDetailHeader = <\n LayoutView extends object,\n>(input: {\n layoutView: LayoutView;\n detailHeader: BackofficeResolvedDetailLayoutFacetConfig['header'];\n tApp: TFunction;\n}): string => {\n const titleValue = input.detailHeader.titleValue?.(\n input.layoutView,\n input.tApp,\n );\n if (typeof titleValue === 'string' && titleValue.trim() !== '') {\n return titleValue;\n }\n\n const title = resolveLabel(input.detailHeader.title, input.tApp);\n if (title.trim() !== '') {\n return title;\n }\n\n const maybeId = (input.layoutView as { id?: unknown }).id;\n if (typeof maybeId === 'string' && maybeId.trim() !== '') {\n return maybeId;\n }\n\n return '';\n};\n\nexport const buildDashboardBreadcrumb = (\n t: TFunction,\n): readonly BackofficeTopbarBreadcrumbItem[] => {\n return [\n {\n kind: 'current',\n target: { kind: 'dashboard' },\n label: t('sidebar.items.dashboard'),\n },\n ];\n};\n\nexport const buildHubBreadcrumb = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(input: {\n id: string;\n title: string;\n}): readonly BackofficeTopbarBreadcrumbItem<TManifest>[] => {\n return [\n {\n kind: 'current',\n target: { kind: 'hub', hubId: input.id },\n label: input.title,\n },\n ];\n};\n\nexport const buildEntityListBreadcrumb = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(\n config: BackofficeRuntimeResolvedListFacetConfig,\n tApp: TFunction,\n): readonly BackofficeTopbarBreadcrumbItem<TManifest>[] => {\n return [\n {\n kind: 'current',\n target: {\n kind: 'entity-list',\n entityId: config.id as BackofficeManifestListEntityId<TManifest>,\n },\n label: resolveLabel(config.label, tApp),\n },\n ];\n};\n\nexport const buildEntityDetailBreadcrumb = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(input: {\n config:\n | BackofficeResolvedDetailLayoutFacetConfig\n | BackofficeResolvedDetailPageFacetConfig;\n tApp: TFunction;\n entityId: string;\n layoutView: unknown;\n pageLabel: string;\n pageId?: string;\n}): readonly BackofficeTopbarBreadcrumbItem<TManifest>[] => {\n const listLabel = resolveLabel(input.config.label, input.tApp);\n const entityTitle = resolveEntityTitleFromDetailHeader({\n layoutView: input.layoutView as object,\n detailHeader: input.config.header,\n tApp: input.tApp,\n });\n\n return [\n {\n kind: 'link',\n target: {\n kind: 'entity-list',\n entityId: input.config.id as BackofficeManifestListEntityId<TManifest>,\n },\n label: listLabel,\n },\n {\n kind: 'link',\n target: {\n kind: 'entity-detail',\n entityId: input.config\n .id as BackofficeManifestDetailEntityId<TManifest>,\n id: input.entityId,\n },\n label: entityTitle,\n },\n {\n kind: 'current',\n target: {\n kind: 'entity-detail-page',\n entityId: input.config\n .id as BackofficeManifestDetailEntityId<TManifest>,\n id: input.entityId,\n pageId: input.pageId ?? input.pageLabel,\n } as never,\n label: input.pageLabel,\n },\n ];\n};\n\nexport const buildToolBreadcrumb = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(input: {\n id?: BackofficeManifestToolId<TManifest> | string;\n title: string;\n}): readonly BackofficeTopbarBreadcrumbItem<TManifest>[] => {\n let target: BackofficeTopbarBreadcrumbItem<TManifest>['target'] = {\n kind: 'href',\n href: `/tools/${input.title}`,\n };\n if (input.id != null) {\n target = {\n kind: 'tool',\n toolId: input.id as BackofficeManifestToolId<TManifest>,\n };\n }\n return [\n {\n kind: 'current',\n target,\n label: input.title,\n },\n ];\n};\n"],"mappings":";AAeA,IAAM,KAAgB,GAAkB,MAC/B,EAAM,EAAK,EAGP,KAEX,MAIY;CACZ,IAAM,IAAa,EAAM,aAAa,aACpC,EAAM,YACN,EAAM,KACP;CACD,IAAI,OAAO,KAAe,YAAY,EAAW,MAAM,KAAK,IAC1D,OAAO;CAGT,IAAM,IAAQ,EAAa,EAAM,aAAa,OAAO,EAAM,KAAK;CAChE,IAAI,EAAM,MAAM,KAAK,IACnB,OAAO;CAGT,IAAM,IAAW,EAAM,WAAgC;CAKvD,OAJI,OAAO,KAAY,YAAY,EAAQ,MAAM,KAAK,KAC7C,IAGF;GAGI,KACX,MAEO,CACL;CACE,MAAM;CACN,QAAQ,EAAE,MAAM,aAAa;CAC7B,OAAO,EAAE,0BAA0B;CACpC,CACF,EAGU,KAEX,MAIO,CACL;CACE,MAAM;CACN,QAAQ;EAAE,MAAM;EAAO,OAAO,EAAM;EAAI;CACxC,OAAO,EAAM;CACd,CACF,EAGU,KAGX,GACA,MAEO,CACL;CACE,MAAM;CACN,QAAQ;EACN,MAAM;EACN,UAAU,EAAO;EAClB;CACD,OAAO,EAAa,EAAO,OAAO,EAAK;CACxC,CACF,EAGU,KAEX,MAS0D;CAC1D,IAAM,IAAY,EAAa,EAAM,OAAO,OAAO,EAAM,KAAK,EACxD,IAAc,EAAmC;EACrD,YAAY,EAAM;EAClB,cAAc,EAAM,OAAO;EAC3B,MAAM,EAAM;EACb,CAAC;CAEF,OAAO;EACL;GACE,MAAM;GACN,QAAQ;IACN,MAAM;IACN,UAAU,EAAM,OAAO;IACxB;GACD,OAAO;GACR;EACD;GACE,MAAM;GACN,QAAQ;IACN,MAAM;IACN,UAAU,EAAM,OACb;IACH,IAAI,EAAM;IACX;GACD,OAAO;GACR;EACD;GACE,MAAM;GACN,QAAQ;IACN,MAAM;IACN,UAAU,EAAM,OACb;IACH,IAAI,EAAM;IACV,QAAQ,EAAM,UAAU,EAAM;IAC/B;GACD,OAAO,EAAM;GACd;EACF;GAGU,KAEX,MAG0D;CAC1D,IAAI,IAA8D;EAChE,MAAM;EACN,MAAM,UAAU,EAAM;EACvB;CAOD,OANI,EAAM,MAAM,SACd,IAAS;EACP,MAAM;EACN,QAAQ,EAAM;EACf,GAEI,CACL;EACE,MAAM;EACN;EACA,OAAO,EAAM;EACd,CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { buildEntityGroupLookup as e, isActivePath as t, resolveGroupItems as n, resolveHubEntityIds as r, resolveLabel as i, resolveSidebarGroups as a, resolveSidebarHub as o } from "./sidebarUtils.js";
|
|
2
|
+
import { actionButton as s } from "./backofficeSidebarActions.css.js";
|
|
3
3
|
import { BackofficeSidebarHistorySvg as c, GripDotsSvg as l, PinFilledSvg as u, PinSvg as d, SidebarHomeSvg as f, SidebarTasksSvg as p } from "@plumile/ui";
|
|
4
4
|
import { jsx as m } from "react/jsx-runtime";
|
|
5
5
|
//#region src/components/backoffice/layout/buildSidebarSections.tsx
|
|
@@ -9,19 +9,19 @@ var h = (e, t, n = 18) => e == null ? t ?? null : /* @__PURE__ */ m(e, {
|
|
|
9
9
|
"aria-hidden": "true"
|
|
10
10
|
});
|
|
11
11
|
function g(g) {
|
|
12
|
-
let { basePath: _, pathname: v, entities: y, sidebar: b, permissions: x, searchQuery: S, tApp: C, t: w, pinnedEntityIds: T = [], recentItems: E = [], onTogglePin: D, onReorderPin: O, collapsedByGroupId: k, onGroupCollapsedChange: A, sidebarCollapsed: j = !1 } = g, M =
|
|
12
|
+
let { basePath: _, pathname: v, entities: y, sidebar: b, permissions: x, searchQuery: S, tApp: C, t: w, pinnedEntityIds: T = [], recentItems: E = [], onTogglePin: D, onReorderPin: O, collapsedByGroupId: k, onGroupCollapsedChange: A, sidebarCollapsed: j = !1 } = g, M = a(y, b), N = Object.entries(M), P = new Set(T), F = w("sidebar.actions.pin"), I = w("sidebar.actions.unpin"), L = w("sidebar.actions.reorder"), R = e(M, b), z = S?.trim().toLowerCase() ?? "", B = (e) => z === "" || e.toLowerCase().includes(z), V = (e) => {
|
|
13
13
|
if (D == null) return null;
|
|
14
|
-
let
|
|
15
|
-
return
|
|
14
|
+
let t = P.has(e), n = F, r = d;
|
|
15
|
+
return t && (n = I, r = u), /* @__PURE__ */ m("button", {
|
|
16
16
|
type: "button",
|
|
17
|
-
className:
|
|
18
|
-
"aria-pressed":
|
|
19
|
-
"aria-label":
|
|
20
|
-
title:
|
|
21
|
-
onClick: (
|
|
22
|
-
|
|
17
|
+
className: s,
|
|
18
|
+
"aria-pressed": t,
|
|
19
|
+
"aria-label": n,
|
|
20
|
+
title: n,
|
|
21
|
+
onClick: (t) => {
|
|
22
|
+
t.preventDefault(), t.stopPropagation(), D(e);
|
|
23
23
|
},
|
|
24
|
-
children: /* @__PURE__ */ m(
|
|
24
|
+
children: /* @__PURE__ */ m(r, {
|
|
25
25
|
width: 14,
|
|
26
26
|
height: 14,
|
|
27
27
|
"aria-hidden": "true"
|
|
@@ -32,58 +32,58 @@ function g(g) {
|
|
|
32
32
|
kind: "dashboard",
|
|
33
33
|
id: "dashboard"
|
|
34
34
|
}, x) === !1) return null;
|
|
35
|
-
let
|
|
36
|
-
return B(
|
|
35
|
+
let n = w("sidebar.items.dashboard");
|
|
36
|
+
return B(n) ? {
|
|
37
37
|
id: "dashboard",
|
|
38
38
|
data: {
|
|
39
39
|
kind: "dashboard",
|
|
40
40
|
id: "dashboard",
|
|
41
41
|
groupId: e
|
|
42
42
|
},
|
|
43
|
-
label:
|
|
43
|
+
label: n,
|
|
44
44
|
href: _,
|
|
45
45
|
icon: h(void 0, /* @__PURE__ */ m(f, {
|
|
46
46
|
width: 18,
|
|
47
47
|
height: 18,
|
|
48
48
|
"aria-hidden": "true"
|
|
49
49
|
})),
|
|
50
|
-
isActive:
|
|
51
|
-
ariaLabel:
|
|
50
|
+
isActive: t(v, _),
|
|
51
|
+
ariaLabel: n
|
|
52
52
|
} : null;
|
|
53
53
|
}, U = (e) => {
|
|
54
|
-
let { entityId:
|
|
54
|
+
let { entityId: n, groupId: r, groupIcon: a, itemIcon: o, itemLabel: s, enableReorder: c } = e, u = y[n];
|
|
55
55
|
if (u == null) return null;
|
|
56
56
|
let d = {
|
|
57
57
|
kind: "entity",
|
|
58
|
-
id:
|
|
58
|
+
id: n
|
|
59
59
|
};
|
|
60
60
|
if (u.kind === "tool" && (d = {
|
|
61
61
|
kind: "tool",
|
|
62
|
-
id:
|
|
62
|
+
id: n
|
|
63
63
|
}), b?.isItemVisible?.(d, x) === !1) return null;
|
|
64
64
|
if (u.kind === "tool") {
|
|
65
|
-
let e = s ??
|
|
65
|
+
let e = s ?? i(u.label, C);
|
|
66
66
|
return z !== "" && !e.toLowerCase().includes(z) ? null : {
|
|
67
|
-
id: `tool-${
|
|
67
|
+
id: `tool-${n}`,
|
|
68
68
|
data: {
|
|
69
69
|
kind: "tool",
|
|
70
|
-
id:
|
|
70
|
+
id: n,
|
|
71
71
|
groupId: r
|
|
72
72
|
},
|
|
73
73
|
label: e,
|
|
74
74
|
href: u.routes.list,
|
|
75
|
-
icon: h(o ??
|
|
75
|
+
icon: h(o ?? a, /* @__PURE__ */ m(p, {
|
|
76
76
|
width: 18,
|
|
77
77
|
height: 18,
|
|
78
78
|
"aria-hidden": "true"
|
|
79
79
|
})),
|
|
80
|
-
isActive:
|
|
80
|
+
isActive: t(v, u.routes.list),
|
|
81
81
|
ariaLabel: e,
|
|
82
|
-
actionSlot: V(
|
|
82
|
+
actionSlot: V(n)
|
|
83
83
|
};
|
|
84
84
|
}
|
|
85
85
|
if (!u.hasList) return null;
|
|
86
|
-
let f = s ??
|
|
86
|
+
let f = s ?? i(u.label, C);
|
|
87
87
|
if (z !== "" && !f.toLowerCase().includes(z)) return null;
|
|
88
88
|
let g, _, S, w, T = !1;
|
|
89
89
|
c === !0 && O != null && (T = !0, g = /* @__PURE__ */ m(l, {
|
|
@@ -91,35 +91,35 @@ function g(g) {
|
|
|
91
91
|
height: 14,
|
|
92
92
|
"aria-hidden": "true"
|
|
93
93
|
}), _ = (e) => {
|
|
94
|
-
let { dataTransfer:
|
|
95
|
-
|
|
94
|
+
let { dataTransfer: t } = e;
|
|
95
|
+
t.effectAllowed = "move", t.setData("text/plain", n);
|
|
96
96
|
}, S = (e) => {
|
|
97
97
|
e.preventDefault();
|
|
98
98
|
let { dataTransfer: t } = e;
|
|
99
99
|
t.dropEffect = "move";
|
|
100
100
|
}, w = (e) => {
|
|
101
101
|
e.preventDefault();
|
|
102
|
-
let
|
|
103
|
-
|
|
102
|
+
let t = e.dataTransfer.getData("text/plain");
|
|
103
|
+
t === "" || t === n || O(t, n);
|
|
104
104
|
});
|
|
105
105
|
let E;
|
|
106
106
|
return g != null && (E = L), {
|
|
107
|
-
id:
|
|
107
|
+
id: n,
|
|
108
108
|
data: {
|
|
109
109
|
kind: "entity",
|
|
110
|
-
id:
|
|
110
|
+
id: n,
|
|
111
111
|
groupId: r
|
|
112
112
|
},
|
|
113
113
|
label: f,
|
|
114
114
|
href: u.routes.list,
|
|
115
|
-
icon: h(o ??
|
|
115
|
+
icon: h(o ?? a, /* @__PURE__ */ m(p, {
|
|
116
116
|
width: 18,
|
|
117
117
|
height: 18,
|
|
118
118
|
"aria-hidden": "true"
|
|
119
119
|
})),
|
|
120
|
-
isActive:
|
|
120
|
+
isActive: t(v, u.routes.list),
|
|
121
121
|
ariaLabel: f,
|
|
122
|
-
actionSlot: V(
|
|
122
|
+
actionSlot: V(n),
|
|
123
123
|
dragHandleSlot: g,
|
|
124
124
|
dragHandleLabel: E,
|
|
125
125
|
draggable: T,
|
|
@@ -128,12 +128,12 @@ function g(g) {
|
|
|
128
128
|
onDrop: w
|
|
129
129
|
};
|
|
130
130
|
}, W = (e) => {
|
|
131
|
-
let { hub:
|
|
131
|
+
let { hub: n, groupId: a, icon: o } = e, s = {
|
|
132
132
|
kind: "hub",
|
|
133
|
-
id:
|
|
133
|
+
id: n.id
|
|
134
134
|
};
|
|
135
135
|
if (b?.isItemVisible?.(s, x) === !1) return null;
|
|
136
|
-
let c =
|
|
136
|
+
let c = r(n), l = c.map((e) => y[e] ?? null).filter((e) => {
|
|
137
137
|
if (e == null) return !1;
|
|
138
138
|
let t = "entity";
|
|
139
139
|
e.kind === "tool" && (t = "tool");
|
|
@@ -144,18 +144,18 @@ function g(g) {
|
|
|
144
144
|
return !(b?.isItemVisible?.(n, x) === !1 || e.kind !== "tool" && !e.hasList);
|
|
145
145
|
});
|
|
146
146
|
if (c.length > 0 && l.length === 0) return null;
|
|
147
|
-
let u =
|
|
147
|
+
let u = i(n.title, C), d = B(u), f = l.some((e) => B(i(e.label, C)));
|
|
148
148
|
if (!d && !f) return null;
|
|
149
|
-
let g =
|
|
149
|
+
let g = t(v, n.href) || l.some((e) => t(v, e.routes.list));
|
|
150
150
|
return {
|
|
151
|
-
id: `hub-${
|
|
151
|
+
id: `hub-${n.id}`,
|
|
152
152
|
data: {
|
|
153
153
|
kind: "hub",
|
|
154
|
-
id:
|
|
155
|
-
groupId:
|
|
154
|
+
id: n.id,
|
|
155
|
+
groupId: a
|
|
156
156
|
},
|
|
157
157
|
label: u,
|
|
158
|
-
href:
|
|
158
|
+
href: n.href,
|
|
159
159
|
icon: h(o, /* @__PURE__ */ m(p, {
|
|
160
160
|
width: 18,
|
|
161
161
|
height: 18,
|
|
@@ -169,11 +169,11 @@ function g(g) {
|
|
|
169
169
|
let e = K.map((e) => {
|
|
170
170
|
if (e.kind === "dashboard") return H();
|
|
171
171
|
if (e.kind === "hub") return W({
|
|
172
|
-
hub:
|
|
172
|
+
hub: o(e, b),
|
|
173
173
|
icon: e.icon
|
|
174
174
|
});
|
|
175
175
|
let t;
|
|
176
|
-
return e.label != null && (t =
|
|
176
|
+
return e.label != null && (t = i(e.label, C)), U({
|
|
177
177
|
entityId: e.id,
|
|
178
178
|
itemIcon: e.icon,
|
|
179
179
|
itemLabel: t
|
|
@@ -211,11 +211,11 @@ function g(g) {
|
|
|
211
211
|
if (E.length > 0) {
|
|
212
212
|
let e = E.map((e) => {
|
|
213
213
|
if (y[e.id] == null) return null;
|
|
214
|
-
let
|
|
214
|
+
let n = {
|
|
215
215
|
kind: e.kind,
|
|
216
216
|
id: e.id
|
|
217
217
|
};
|
|
218
|
-
if (b?.isItemVisible?.(
|
|
218
|
+
if (b?.isItemVisible?.(n, x) === !1 || z !== "" && !e.label.toLowerCase().includes(z)) return null;
|
|
219
219
|
let r = R.get(e.id);
|
|
220
220
|
return {
|
|
221
221
|
id: `recent-${e.kind}-${e.id}`,
|
|
@@ -231,7 +231,7 @@ function g(g) {
|
|
|
231
231
|
height: 18,
|
|
232
232
|
"aria-hidden": "true"
|
|
233
233
|
})),
|
|
234
|
-
isActive:
|
|
234
|
+
isActive: t(v, e.href),
|
|
235
235
|
ariaLabel: e.label
|
|
236
236
|
};
|
|
237
237
|
}).filter((e) => e != null);
|
|
@@ -249,37 +249,37 @@ function g(g) {
|
|
|
249
249
|
}
|
|
250
250
|
return N.forEach(([e, t]) => {
|
|
251
251
|
if (t.isVisible != null && !t.isVisible(x)) return;
|
|
252
|
-
let
|
|
253
|
-
|
|
254
|
-
if (
|
|
252
|
+
let r = [], a = n(t);
|
|
253
|
+
a.length > 0 && a.forEach((n) => {
|
|
254
|
+
if (n.kind === "dashboard") {
|
|
255
255
|
let t = H(e);
|
|
256
|
-
t != null &&
|
|
256
|
+
t != null && r.push(t);
|
|
257
257
|
return;
|
|
258
258
|
}
|
|
259
|
-
if (
|
|
259
|
+
if (n.kind === "hub") {
|
|
260
260
|
let i = W({
|
|
261
|
-
hub:
|
|
261
|
+
hub: o(n, b),
|
|
262
262
|
groupId: e,
|
|
263
|
-
icon:
|
|
263
|
+
icon: n.icon ?? t.icon
|
|
264
264
|
});
|
|
265
|
-
i != null &&
|
|
265
|
+
i != null && r.push(i);
|
|
266
266
|
return;
|
|
267
267
|
}
|
|
268
|
-
let
|
|
269
|
-
|
|
270
|
-
let
|
|
271
|
-
entityId:
|
|
268
|
+
let a;
|
|
269
|
+
n.label != null && (a = i(n.label, C));
|
|
270
|
+
let s = U({
|
|
271
|
+
entityId: n.id,
|
|
272
272
|
groupId: e,
|
|
273
273
|
groupIcon: t.icon,
|
|
274
|
-
itemIcon:
|
|
275
|
-
itemLabel:
|
|
274
|
+
itemIcon: n.icon,
|
|
275
|
+
itemLabel: a
|
|
276
276
|
});
|
|
277
|
-
|
|
277
|
+
s != null && r.push(s);
|
|
278
278
|
});
|
|
279
|
-
let
|
|
280
|
-
if (j && t.behavior?.showInCollapsedRail !== !0 && (
|
|
279
|
+
let s = r;
|
|
280
|
+
if (j && t.behavior?.showInCollapsedRail !== !0 && (s = r.filter((e) => e.id === "dashboard" || e.isActive === !0)), s.length === 0) return;
|
|
281
281
|
let c;
|
|
282
|
-
t.title != null && (c =
|
|
282
|
+
t.title != null && (c = i(t.title, C));
|
|
283
283
|
let l = k?.[e], u;
|
|
284
284
|
A != null && (u = (t) => {
|
|
285
285
|
A(e, t);
|
|
@@ -287,7 +287,7 @@ function g(g) {
|
|
|
287
287
|
id: e,
|
|
288
288
|
title: c,
|
|
289
289
|
icon: h(t.icon, void 0, 16),
|
|
290
|
-
items:
|
|
290
|
+
items: s,
|
|
291
291
|
collapsible: t.behavior?.collapsible ?? !0,
|
|
292
292
|
defaultCollapsed: t.behavior?.defaultCollapsed ?? !0,
|
|
293
293
|
isCollapsed: l,
|
|
@@ -15,38 +15,38 @@ var e = (e, t) => e(t), t = (e, t) => !!(e === t || t !== "/" && e.startsWith(`$
|
|
|
15
15
|
...e,
|
|
16
16
|
groups: e.groups ?? n?.groups ?? []
|
|
17
17
|
};
|
|
18
|
-
}, s = (e) => {
|
|
18
|
+
}, s = (e, t) => o(e, t), c = (e) => {
|
|
19
19
|
let t = [], n = /* @__PURE__ */ new Set();
|
|
20
20
|
return e.groups.forEach((e) => {
|
|
21
21
|
e.items.forEach((e) => {
|
|
22
22
|
n.has(e.id) || (n.add(e.id), t.push(e.id));
|
|
23
23
|
});
|
|
24
24
|
}), t;
|
|
25
|
-
},
|
|
25
|
+
}, l = (e, t) => {
|
|
26
26
|
let n = [], r = /* @__PURE__ */ new Set();
|
|
27
27
|
return Object.entries(e).forEach(([e, i]) => {
|
|
28
28
|
a(i).forEach((a) => {
|
|
29
29
|
a.kind !== "hub" || r.has(a.id) || (r.add(a.id), n.push({
|
|
30
30
|
groupId: e,
|
|
31
|
-
hub:
|
|
31
|
+
hub: s(a, t),
|
|
32
32
|
icon: a.icon ?? i.icon
|
|
33
33
|
}));
|
|
34
34
|
});
|
|
35
35
|
}), Object.values(t?.hubs ?? {}).forEach((e) => {
|
|
36
36
|
r.has(e.id) || (r.add(e.id), n.push({
|
|
37
37
|
groupId: null,
|
|
38
|
-
hub:
|
|
38
|
+
hub: s(e, t),
|
|
39
39
|
icon: e.icon
|
|
40
40
|
}));
|
|
41
41
|
}), n;
|
|
42
|
-
},
|
|
42
|
+
}, u = (e, t) => a(e).flatMap((e) => e.kind === "entity" || e.kind === "tool" ? [e.id] : e.kind === "hub" ? c(s(e, t)) : []), d = (e, t) => {
|
|
43
43
|
let n = /* @__PURE__ */ new Map();
|
|
44
44
|
return Object.entries(e).forEach(([e, r]) => {
|
|
45
45
|
a(r).forEach((i) => {
|
|
46
46
|
if (i.kind !== "dashboard") {
|
|
47
47
|
if (i.kind === "hub") {
|
|
48
|
-
let a =
|
|
49
|
-
|
|
48
|
+
let a = s(i, t);
|
|
49
|
+
c(a).forEach((t) => {
|
|
50
50
|
n.has(t) || n.set(t, {
|
|
51
51
|
groupId: e,
|
|
52
52
|
groupIcon: r.icon,
|
|
@@ -63,7 +63,7 @@ var e = (e, t) => e(t), t = (e, t) => !!(e === t || t !== "/" && e.startsWith(`$
|
|
|
63
63
|
}
|
|
64
64
|
});
|
|
65
65
|
}), n;
|
|
66
|
-
},
|
|
66
|
+
}, f = (e, t, n, r) => {
|
|
67
67
|
let i = t[e];
|
|
68
68
|
if (i == null) return !1;
|
|
69
69
|
let a = {
|
|
@@ -74,25 +74,25 @@ var e = (e, t) => e(t), t = (e, t) => !!(e === t || t !== "/" && e.startsWith(`$
|
|
|
74
74
|
kind: "tool",
|
|
75
75
|
id: e
|
|
76
76
|
}), n?.isItemVisible == null ? i.kind === "tool" ? !0 : i.hasList : n.isItemVisible(a, r);
|
|
77
|
-
},
|
|
77
|
+
}, p = (e, t, n, r) => {
|
|
78
78
|
let i = [], a = /* @__PURE__ */ new Set();
|
|
79
79
|
return Object.entries(e).forEach(([, e]) => {
|
|
80
|
-
e.isVisible != null && !e.isVisible(r) ||
|
|
81
|
-
a.has(e) ||
|
|
80
|
+
e.isVisible != null && !e.isVisible(r) || u(e, n).forEach((e) => {
|
|
81
|
+
a.has(e) || f(e, t, n, r) && (a.add(e), i.push(e));
|
|
82
82
|
});
|
|
83
83
|
}), i;
|
|
84
|
-
},
|
|
84
|
+
}, m = (e, n) => {
|
|
85
85
|
let r = Object.entries(n);
|
|
86
86
|
for (let [n, i] of r) if (i.kind === "tool") {
|
|
87
87
|
if (t(e, i.routes.list)) return n;
|
|
88
88
|
} else if (i.hasList && t(e, i.routes.list)) return n;
|
|
89
89
|
return null;
|
|
90
|
-
},
|
|
91
|
-
if (t == null || !
|
|
92
|
-
for (let [n, a] of Object.entries(e)) if ((a.isVisible == null || a.isVisible(i)) &&
|
|
90
|
+
}, h = (e, t, n, r, i) => {
|
|
91
|
+
if (t == null || !f(t, n, r, i)) return null;
|
|
92
|
+
for (let [n, a] of Object.entries(e)) if ((a.isVisible == null || a.isVisible(i)) && u(a, r).includes(t)) return n;
|
|
93
93
|
return null;
|
|
94
94
|
};
|
|
95
95
|
//#endregion
|
|
96
|
-
export { n as buildDefaultGroups,
|
|
96
|
+
export { n as buildDefaultGroups, d as buildEntityGroupLookup, t as isActivePath, m as resolveActiveEntityId, h as resolveActiveGroupId, u as resolveGroupEntityIds, a as resolveGroupItems, c as resolveHubEntityIds, i as resolveItemDescriptor, e as resolveLabel, r as resolveSidebarGroups, s as resolveSidebarHub, l as resolveSidebarHubEntries, o as resolveSidebarHubFor, p as resolveVisibleEntityIds };
|
|
97
97
|
|
|
98
98
|
//# sourceMappingURL=sidebarUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidebarUtils.js","names":[],"sources":["../../../../../src/components/backoffice/layout/sidebarUtils.ts"],"sourcesContent":["import type { TFunction } from 'i18next';\n\nimport type {\n BackofficeEntityManifestMap,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type {\n BackofficeSidebarConfig,\n BackofficeIconComponent,\n BackofficeSidebarGroupConfig,\n BackofficeSidebarItemDescriptor,\n BackofficeSidebarItemConfig,\n BackofficeSidebarHubConfig,\n BackofficeResolvedSidebarHubConfig,\n} from '../../../provider/types.js';\n\nexport const resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const isActivePath = (pathname: string, href: string): boolean => {\n if (pathname === href) {\n return true;\n }\n if (href !== '/' && pathname.startsWith(`${href}/`)) {\n return true;\n }\n return false;\n};\n\nexport const buildDefaultGroups = (\n entities: BackofficeEntityManifestMap,\n): Record<string, BackofficeSidebarGroupConfig> => {\n const entityIds = Object.keys(entities);\n\n return {\n main: {\n entities: entityIds,\n },\n };\n};\n\nexport const resolveSidebarGroups = (\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n): Record<string, BackofficeSidebarGroupConfig> => {\n return sidebar?.groups ?? buildDefaultGroups(entities);\n};\n\nexport type EntityGroupLookup = Map<\n string,\n {\n groupId: string;\n groupIcon?: BackofficeIconComponent;\n itemIcon?: BackofficeIconComponent;\n }\n>;\n\nexport const resolveItemDescriptor = (\n item: BackofficeSidebarItemConfig,\n): BackofficeSidebarItemDescriptor => {\n if (item.kind === 'dashboard') {\n return { kind: 'dashboard', id: item.id ?? 'dashboard' };\n }\n return { kind: item.kind, id: item.id };\n};\n\nexport const resolveGroupItems = (\n group: BackofficeSidebarGroupConfig,\n): readonly BackofficeSidebarItemConfig[] => {\n if (group.items != null) {\n return group.items;\n }\n return (\n group.entities?.map((entityId) => {\n return { kind: 'entity', id: entityId } as const;\n }) ?? []\n );\n};\n\nexport const resolveSidebarHub = (\n item: BackofficeSidebarHubConfig,\n sidebar: BackofficeSidebarConfig | undefined,\n): BackofficeResolvedSidebarHubConfig => {\n const registeredHub = sidebar?.hubs?.[item.id];\n return {\n ...registeredHub,\n ...item,\n groups: item.groups ?? registeredHub?.groups ?? [],\n };\n};\n\nexport const resolveHubEntityIds = (\n hub: BackofficeResolvedSidebarHubConfig,\n): readonly string[] => {\n const output: string[] = [];\n const seen = new Set<string>();\n hub.groups.forEach((group) => {\n group.items.forEach((item) => {\n if (seen.has(item.id)) {\n return;\n }\n seen.add(item.id);\n output.push(item.id);\n });\n });\n return output;\n};\n\nexport type ResolvedSidebarHubEntry = {\n groupId: string | null;\n hub: BackofficeResolvedSidebarHubConfig;\n icon?: BackofficeIconComponent;\n};\n\nexport const resolveSidebarHubEntries = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n sidebar: BackofficeSidebarConfig | undefined,\n): readonly ResolvedSidebarHubEntry[] => {\n const output: ResolvedSidebarHubEntry[] = [];\n const seen = new Set<string>();\n\n Object.entries(groups).forEach(([groupId, group]) => {\n resolveGroupItems(group).forEach((item) => {\n if (item.kind !== 'hub' || seen.has(item.id)) {\n return;\n }\n seen.add(item.id);\n output.push({\n groupId,\n hub: resolveSidebarHub(item, sidebar),\n icon: item.icon ?? group.icon,\n });\n });\n });\n\n Object.values(sidebar?.hubs ?? {}).forEach((hub) => {\n if (seen.has(hub.id)) {\n return;\n }\n seen.add(hub.id);\n output.push({\n groupId: null,\n hub: resolveSidebarHub(hub, sidebar),\n icon: hub.icon,\n });\n });\n\n return output;\n};\n\nexport const resolveGroupEntityIds = (\n group: BackofficeSidebarGroupConfig,\n sidebar?: BackofficeSidebarConfig,\n): readonly string[] => {\n return resolveGroupItems(group).flatMap((item) => {\n if (item.kind === 'entity' || item.kind === 'tool') {\n return [item.id];\n }\n if (item.kind === 'hub') {\n return resolveHubEntityIds(resolveSidebarHub(item, sidebar));\n }\n return [];\n });\n};\n\nexport const buildEntityGroupLookup = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n sidebar?: BackofficeSidebarConfig,\n): EntityGroupLookup => {\n const lookup: EntityGroupLookup = new Map();\n\n Object.entries(groups).forEach(([groupId, group]) => {\n resolveGroupItems(group).forEach((item) => {\n if (item.kind === 'dashboard') {\n return;\n }\n\n if (item.kind === 'hub') {\n const hub = resolveSidebarHub(item, sidebar);\n resolveHubEntityIds(hub).forEach((entityId) => {\n if (!lookup.has(entityId)) {\n lookup.set(entityId, {\n groupId,\n groupIcon: group.icon,\n itemIcon: item.icon ?? hub.icon,\n });\n }\n });\n return;\n }\n\n if (!lookup.has(item.id)) {\n lookup.set(item.id, {\n groupId,\n groupIcon: group.icon,\n itemIcon: item.icon,\n });\n }\n });\n });\n\n return lookup;\n};\n\nconst isEntityVisible = (\n entityId: string,\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n permissions: unknown,\n): boolean => {\n const config = entities[entityId];\n if (config == null) {\n return false;\n }\n\n let descriptor: BackofficeSidebarItemDescriptor = {\n kind: 'entity',\n id: entityId,\n };\n if (config.kind === 'tool') {\n descriptor = { kind: 'tool', id: entityId };\n }\n\n if (sidebar?.isItemVisible != null) {\n return sidebar.isItemVisible(descriptor, permissions);\n }\n\n if (config.kind === 'tool') {\n return true;\n }\n return config.hasList;\n};\n\nexport const resolveVisibleEntityIds = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n permissions: unknown,\n): string[] => {\n const output: string[] = [];\n const seen = new Set<string>();\n\n Object.entries(groups).forEach(([, group]) => {\n if (group.isVisible != null && !group.isVisible(permissions)) {\n return;\n }\n resolveGroupEntityIds(group, sidebar).forEach((entityId) => {\n if (seen.has(entityId)) {\n return;\n }\n if (!isEntityVisible(entityId, entities, sidebar, permissions)) {\n return;\n }\n seen.add(entityId);\n output.push(entityId);\n });\n });\n\n return output;\n};\n\nexport const resolveActiveEntityId = (\n pathname: string,\n entities: BackofficeEntityManifestMap,\n): string | null => {\n const entries = Object.entries(entities);\n for (const [entityId, config] of entries) {\n if (config.kind === 'tool') {\n if (isActivePath(pathname, config.routes.list)) {\n return entityId;\n }\n } else if (config.hasList && isActivePath(pathname, config.routes.list)) {\n return entityId;\n }\n }\n return null;\n};\n\nexport const resolveActiveGroupId = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n activeEntityId: string | null,\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n permissions: unknown,\n): string | null => {\n if (activeEntityId == null) {\n return null;\n }\n\n if (!isEntityVisible(activeEntityId, entities, sidebar, permissions)) {\n return null;\n }\n\n for (const [groupId, group] of Object.entries(groups)) {\n const isVisible = group.isVisible == null || group.isVisible(permissions);\n if (\n isVisible &&\n resolveGroupEntityIds(group, sidebar).includes(activeEntityId)\n ) {\n return groupId;\n }\n }\n\n return null;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sidebarUtils.js","names":[],"sources":["../../../../../src/components/backoffice/layout/sidebarUtils.ts"],"sourcesContent":["import type { TFunction } from 'i18next';\n\nimport type {\n BackofficeEntityManifestMap,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type {\n BackofficeSidebarConfig,\n BackofficeIconComponent,\n BackofficeSidebarGroupConfig,\n BackofficeSidebarItemDescriptor,\n BackofficeSidebarItemConfig,\n BackofficeSidebarHubConfig,\n BackofficeSidebarHubGroupConfig,\n BackofficeResolvedSidebarHubConfig,\n} from '../../../provider/types.js';\n\nexport const resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const isActivePath = (pathname: string, href: string): boolean => {\n if (pathname === href) {\n return true;\n }\n if (href !== '/' && pathname.startsWith(`${href}/`)) {\n return true;\n }\n return false;\n};\n\nexport const buildDefaultGroups = (\n entities: BackofficeEntityManifestMap,\n): Record<string, BackofficeSidebarGroupConfig> => {\n const entityIds = Object.keys(entities);\n\n return {\n main: {\n entities: entityIds,\n },\n };\n};\n\nexport const resolveSidebarGroups = (\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n): Record<string, BackofficeSidebarGroupConfig> => {\n return sidebar?.groups ?? buildDefaultGroups(entities);\n};\n\nexport type EntityGroupLookup = Map<\n string,\n {\n groupId: string;\n groupIcon?: BackofficeIconComponent;\n itemIcon?: BackofficeIconComponent;\n }\n>;\n\nexport const resolveItemDescriptor = (\n item: BackofficeSidebarItemConfig,\n): BackofficeSidebarItemDescriptor => {\n if (item.kind === 'dashboard') {\n return { kind: 'dashboard', id: item.id ?? 'dashboard' };\n }\n return { kind: item.kind, id: item.id };\n};\n\nexport const resolveGroupItems = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(\n group: BackofficeSidebarGroupConfig<TManifest>,\n): readonly BackofficeSidebarItemConfig<TManifest>[] => {\n if (group.items != null) {\n return group.items;\n }\n return (group.entities?.map((entityId) => {\n return { kind: 'entity', id: entityId } as const;\n }) ?? []) as unknown as readonly BackofficeSidebarItemConfig<TManifest>[];\n};\n\nexport type BackofficeResolvedSidebarHubConfigFor<\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n> = BackofficeSidebarHubConfig<TManifest> & {\n groups: readonly BackofficeSidebarHubGroupConfig<TManifest>[];\n};\n\nexport const resolveSidebarHubFor = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>(\n item: BackofficeSidebarHubConfig<TManifest>,\n sidebar: BackofficeSidebarConfig<TManifest> | undefined,\n): BackofficeResolvedSidebarHubConfigFor<TManifest> => {\n const registeredHub = sidebar?.hubs?.[item.id];\n return {\n ...registeredHub,\n ...item,\n groups: item.groups ?? registeredHub?.groups ?? [],\n };\n};\n\nexport const resolveSidebarHub = (\n item: BackofficeSidebarHubConfig,\n sidebar: BackofficeSidebarConfig | undefined,\n): BackofficeResolvedSidebarHubConfig => {\n return resolveSidebarHubFor(item, sidebar);\n};\n\nexport const resolveHubEntityIds = (\n hub: BackofficeResolvedSidebarHubConfig,\n): readonly string[] => {\n const output: string[] = [];\n const seen = new Set<string>();\n hub.groups.forEach((group) => {\n group.items.forEach((item) => {\n if (seen.has(item.id)) {\n return;\n }\n seen.add(item.id);\n output.push(item.id);\n });\n });\n return output;\n};\n\nexport type ResolvedSidebarHubEntry = {\n groupId: string | null;\n hub: BackofficeResolvedSidebarHubConfig;\n icon?: BackofficeIconComponent;\n};\n\nexport const resolveSidebarHubEntries = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n sidebar: BackofficeSidebarConfig | undefined,\n): readonly ResolvedSidebarHubEntry[] => {\n const output: ResolvedSidebarHubEntry[] = [];\n const seen = new Set<string>();\n\n Object.entries(groups).forEach(([groupId, group]) => {\n resolveGroupItems(group).forEach((item) => {\n if (item.kind !== 'hub' || seen.has(item.id)) {\n return;\n }\n seen.add(item.id);\n output.push({\n groupId,\n hub: resolveSidebarHub(item, sidebar),\n icon: item.icon ?? group.icon,\n });\n });\n });\n\n Object.values(sidebar?.hubs ?? {}).forEach((hub) => {\n if (seen.has(hub.id)) {\n return;\n }\n seen.add(hub.id);\n output.push({\n groupId: null,\n hub: resolveSidebarHub(hub, sidebar),\n icon: hub.icon,\n });\n });\n\n return output;\n};\n\nexport const resolveGroupEntityIds = (\n group: BackofficeSidebarGroupConfig,\n sidebar?: BackofficeSidebarConfig,\n): readonly string[] => {\n return resolveGroupItems(group).flatMap((item) => {\n if (item.kind === 'entity' || item.kind === 'tool') {\n return [item.id];\n }\n if (item.kind === 'hub') {\n return resolveHubEntityIds(resolveSidebarHub(item, sidebar));\n }\n return [];\n });\n};\n\nexport const buildEntityGroupLookup = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n sidebar?: BackofficeSidebarConfig,\n): EntityGroupLookup => {\n const lookup: EntityGroupLookup = new Map();\n\n Object.entries(groups).forEach(([groupId, group]) => {\n resolveGroupItems(group).forEach((item) => {\n if (item.kind === 'dashboard') {\n return;\n }\n\n if (item.kind === 'hub') {\n const hub = resolveSidebarHub(item, sidebar);\n resolveHubEntityIds(hub).forEach((entityId) => {\n if (!lookup.has(entityId)) {\n lookup.set(entityId, {\n groupId,\n groupIcon: group.icon,\n itemIcon: item.icon ?? hub.icon,\n });\n }\n });\n return;\n }\n\n if (!lookup.has(item.id)) {\n lookup.set(item.id, {\n groupId,\n groupIcon: group.icon,\n itemIcon: item.icon,\n });\n }\n });\n });\n\n return lookup;\n};\n\nconst isEntityVisible = (\n entityId: string,\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n permissions: unknown,\n): boolean => {\n const config = entities[entityId];\n if (config == null) {\n return false;\n }\n\n let descriptor: BackofficeSidebarItemDescriptor = {\n kind: 'entity',\n id: entityId,\n };\n if (config.kind === 'tool') {\n descriptor = { kind: 'tool', id: entityId };\n }\n\n if (sidebar?.isItemVisible != null) {\n return sidebar.isItemVisible(descriptor, permissions);\n }\n\n if (config.kind === 'tool') {\n return true;\n }\n return config.hasList;\n};\n\nexport const resolveVisibleEntityIds = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n permissions: unknown,\n): string[] => {\n const output: string[] = [];\n const seen = new Set<string>();\n\n Object.entries(groups).forEach(([, group]) => {\n if (group.isVisible != null && !group.isVisible(permissions)) {\n return;\n }\n resolveGroupEntityIds(group, sidebar).forEach((entityId) => {\n if (seen.has(entityId)) {\n return;\n }\n if (!isEntityVisible(entityId, entities, sidebar, permissions)) {\n return;\n }\n seen.add(entityId);\n output.push(entityId);\n });\n });\n\n return output;\n};\n\nexport const resolveActiveEntityId = (\n pathname: string,\n entities: BackofficeEntityManifestMap,\n): string | null => {\n const entries = Object.entries(entities);\n for (const [entityId, config] of entries) {\n if (config.kind === 'tool') {\n if (isActivePath(pathname, config.routes.list)) {\n return entityId;\n }\n } else if (config.hasList && isActivePath(pathname, config.routes.list)) {\n return entityId;\n }\n }\n return null;\n};\n\nexport const resolveActiveGroupId = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n activeEntityId: string | null,\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n permissions: unknown,\n): string | null => {\n if (activeEntityId == null) {\n return null;\n }\n\n if (!isEntityVisible(activeEntityId, entities, sidebar, permissions)) {\n return null;\n }\n\n for (const [groupId, group] of Object.entries(groups)) {\n const isVisible = group.isVisible == null || group.isVisible(permissions);\n if (\n isVisible &&\n resolveGroupEntityIds(group, sidebar).includes(activeEntityId)\n ) {\n return groupId;\n }\n }\n\n return null;\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
import { Link as r } from "@plumile/router";
|
|
5
|
+
//#region src/components/backoffice/links/BackofficeInlineLink.tsx
|
|
6
|
+
var i = ({ target: i, label: a, className: o, title: s, ariaLabel: c, icon: l = "auto", openInNewTab: u = !1, endAdornment: d, onClick: f, children: p }) => {
|
|
7
|
+
let m = t(i, { label: p ?? a }), h = {};
|
|
8
|
+
return u && (h = {
|
|
9
|
+
target: "_blank",
|
|
10
|
+
rel: "noreferrer"
|
|
11
|
+
}), /* @__PURE__ */ n(r, {
|
|
12
|
+
to: m.href,
|
|
13
|
+
className: o,
|
|
14
|
+
title: s,
|
|
15
|
+
"aria-label": c,
|
|
16
|
+
onClick: f,
|
|
17
|
+
...h,
|
|
18
|
+
children: /* @__PURE__ */ n(e, {
|
|
19
|
+
icon: m.icon,
|
|
20
|
+
label: m.label,
|
|
21
|
+
showIcon: l === "auto",
|
|
22
|
+
endAdornment: d
|
|
23
|
+
})
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
//#endregion
|
|
27
|
+
export { i as BackofficeInlineLink, i as default };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=BackofficeInlineLink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackofficeInlineLink.js","names":[],"sources":["../../../../../src/components/backoffice/links/BackofficeInlineLink.tsx"],"sourcesContent":["import { type JSX, type MouseEventHandler, type ReactNode } from 'react';\nimport { Link } from '@plumile/router';\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 BackofficeInlineLinkProps<\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n> = {\n target: BackofficeLinkTarget<TManifest>;\n label?: ReactNode;\n className?: string;\n title?: string;\n ariaLabel?: string;\n icon?: 'auto' | 'none';\n openInNewTab?: boolean;\n endAdornment?: ReactNode;\n onClick?: MouseEventHandler<HTMLAnchorElement>;\n children?: ReactNode;\n};\n\nexport const BackofficeInlineLink = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>({\n target,\n label,\n className,\n title,\n ariaLabel,\n icon = 'auto',\n openInNewTab = false,\n endAdornment,\n onClick,\n children,\n}: BackofficeInlineLinkProps<TManifest>): JSX.Element => {\n const link = useBackofficeLink(target, {\n label: children ?? label,\n });\n\n let linkProps: { target?: '_blank'; rel?: 'noreferrer' } = {};\n if (openInNewTab) {\n linkProps = { target: '_blank', rel: 'noreferrer' };\n }\n\n return (\n <Link\n to={link.href}\n className={className}\n title={title}\n aria-label={ariaLabel}\n onClick={onClick}\n {...linkProps}\n >\n <BackofficeLinkContent\n icon={link.icon}\n label={link.label}\n showIcon={icon === 'auto'}\n endAdornment={endAdornment}\n />\n </Link>\n );\n};\n\nexport default BackofficeInlineLink;\n"],"mappings":";;;;;AAwBA,IAAa,KAEX,EACA,WACA,UACA,cACA,UACA,cACA,UAAO,QACP,kBAAe,IACf,iBACA,YACA,kBACuD;CACvD,IAAM,IAAO,EAAkB,GAAQ,EACrC,OAAO,KAAY,GACpB,CAAC,EAEE,IAAuD,EAAE;CAK7D,OAJI,MACF,IAAY;EAAE,QAAQ;EAAU,KAAK;EAAc,GAInD,kBAAC,GAAD;EACE,IAAI,EAAK;EACE;EACJ;EACP,cAAY;EACH;EACT,GAAI;YAEJ,kBAAC,GAAD;GACE,MAAM,EAAK;GACX,OAAO,EAAK;GACZ,UAAU,MAAS;GACL;GACd,CAAA;EACG,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
import { Link as r } from "@plumile/router";
|
|
5
|
+
//#region src/components/backoffice/links/BackofficeLink.tsx
|
|
6
|
+
var i = ({ target: i, label: a, className: o, icon: s = "auto", children: c }) => {
|
|
7
|
+
let l = t(i, { label: c ?? a });
|
|
8
|
+
return /* @__PURE__ */ n(r, {
|
|
9
|
+
to: l.href,
|
|
10
|
+
className: o,
|
|
11
|
+
children: /* @__PURE__ */ n(e, {
|
|
12
|
+
icon: l.icon,
|
|
13
|
+
label: l.label,
|
|
14
|
+
showIcon: s === "auto"
|
|
15
|
+
})
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
//#endregion
|
|
19
|
+
export { i as BackofficeLink, i as default };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=BackofficeLink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackofficeLink.js","names":[],"sources":["../../../../../src/components/backoffice/links/BackofficeLink.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { Link } from '@plumile/router';\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 BackofficeLinkProps<\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n> = {\n target: BackofficeLinkTarget<TManifest>;\n label?: ReactNode;\n className?: string;\n icon?: 'auto' | 'none';\n children?: ReactNode;\n};\n\nexport const BackofficeLink = <\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n>({\n target,\n label,\n className,\n icon = 'auto',\n children,\n}: BackofficeLinkProps<TManifest>): JSX.Element => {\n const link = useBackofficeLink(target, {\n label: children ?? label,\n });\n\n return (\n <Link to={link.href} className={className}>\n <BackofficeLinkContent\n icon={link.icon}\n label={link.label}\n showIcon={icon === 'auto'}\n />\n </Link>\n );\n};\n\nexport default BackofficeLink;\n"],"mappings":";;;;;AAmBA,IAAa,KAEX,EACA,WACA,UACA,cACA,UAAO,QACP,kBACiD;CACjD,IAAM,IAAO,EAAkB,GAAQ,EACrC,OAAO,KAAY,GACpB,CAAC;CAEF,OACE,kBAAC,GAAD;EAAM,IAAI,EAAK;EAAiB;YAC9B,kBAAC,GAAD;GACE,MAAM,EAAK;GACX,OAAO,EAAK;GACZ,UAAU,MAAS;GACnB,CAAA;EACG,CAAA"}
|