@vtex/faststore-plugin-buyer-portal 1.1.13 → 1.1.15
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/.github/PULL_REQUEST_TEMPLATE.md +50 -0
- package/package.json +1 -1
- package/public/buyer-portal-icons.svg +14 -0
- package/src/features/org-units/components/OrgUnitBreadcrumb/OrgUnitBreadcrumb.tsx +28 -0
- package/src/features/org-units/components/OrgUnitBreadcrumb/OrgUnitBreadcrumbDropdown.tsx +30 -0
- package/src/features/org-units/components/OrgUnitBreadcrumb/OrgUnitBreadcrumbLink.tsx +52 -0
- package/src/features/org-units/components/OrgUnitBreadcrumb/OrgUnitBreadcrumbPath.tsx +27 -0
- package/src/features/org-units/components/OrgUnitBreadcrumb/org-unit-breadcrumb.scss +50 -0
- package/src/features/org-units/components/index.ts +1 -0
- package/src/features/org-units/layouts/OrgUnitDetailsLayout/OrgUnitDetailsLayout.tsx +103 -94
- package/src/features/org-units/layouts/OrgUnitDetailsLayout/org-units-details.scss +10 -5
- package/src/features/org-units/types/OrgUnitBreadcrumbTypes.ts +20 -0
- package/src/features/org-units/types/index.ts +6 -0
- package/src/features/shared/components/HeaderInside/HeaderInside.tsx +2 -2
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
[]()
|
|
2
|
+
|
|
3
|
+
## 📌 What does this PR do?
|
|
4
|
+
|
|
5
|
+
<!-- Provide a clear and concise description of the changes -->
|
|
6
|
+
|
|
7
|
+
-
|
|
8
|
+
|
|
9
|
+
## 🛠️ What problem does this solve?
|
|
10
|
+
|
|
11
|
+
<!-- Explain the issue or need addressed by this PR -->
|
|
12
|
+
|
|
13
|
+
-
|
|
14
|
+
|
|
15
|
+
## 📝 Summary of changes
|
|
16
|
+
|
|
17
|
+
<!-- List key changes in this PR -->
|
|
18
|
+
|
|
19
|
+
-
|
|
20
|
+
-
|
|
21
|
+
-
|
|
22
|
+
|
|
23
|
+
## ✅ How to test this PR?
|
|
24
|
+
|
|
25
|
+
<!-- Provide instructions so reviewers can test or validate the changes (e.g., include a preview link if available) -->
|
|
26
|
+
|
|
27
|
+
-
|
|
28
|
+
-
|
|
29
|
+
|
|
30
|
+
## 🔍 Screenshots / GIFs (if applicable)
|
|
31
|
+
|
|
32
|
+
<!-- Add images or GIFs to help visualize the change -->
|
|
33
|
+
|
|
34
|
+
| Before | After |
|
|
35
|
+
| ------ | ----- |
|
|
36
|
+
| | |
|
|
37
|
+
|
|
38
|
+
## 🚩 Checklist
|
|
39
|
+
|
|
40
|
+
- [ ] I have updated the CHANGELOG (if applicable)
|
|
41
|
+
- [ ] I have checked if my PR requires new documentation, and included it if necessary
|
|
42
|
+
- [ ] I have tested my changes locally
|
|
43
|
+
- [ ] I have added tests that prove my fix is effective or my feature works
|
|
44
|
+
- [ ] I have added or updated documentation (if needed)
|
|
45
|
+
- [ ] I have linted and formatted my code
|
|
46
|
+
- [ ] I have added the 'run-tests' label when the PR is ready for review
|
|
47
|
+
|
|
48
|
+
## 📎 Related issues
|
|
49
|
+
|
|
50
|
+
<!-- Link related issues, e.g., Fixes #123, Closes #456 -->
|
package/package.json
CHANGED
|
@@ -206,6 +206,17 @@
|
|
|
206
206
|
d="M480-160q-33 0-56.5-23.5T400-240q0-33 23.5-56.5T480-320q33 0 56.5 23.5T560-240q0 33-23.5 56.5T480-160Zm0-240q-33 0-56.5-23.5T400-480q0-33 23.5-56.5T480-560q33 0 56.5 23.5T560-480q0 33-23.5 56.5T480-400Zm0-240q-33 0-56.5-23.5T400-720q0-33 23.5-56.5T480-800q33 0 56.5 23.5T560-720q0 33-23.5 56.5T480-640Z" />
|
|
207
207
|
</symbol>
|
|
208
208
|
|
|
209
|
+
|
|
210
|
+
<symbol
|
|
211
|
+
id="MoreHorz"
|
|
212
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
213
|
+
viewBox="0 0 24 24"
|
|
214
|
+
fill="currentColor"
|
|
215
|
+
>
|
|
216
|
+
<path d="M4 12C4 11.45 4.19583 10.9792 4.5875 10.5875C4.97917 10.1958 5.45 10 6 10C6.55 10 7.02083 10.1958 7.4125 10.5875C7.80417 10.9792 8 11.45 8 12C8 12.55 7.80417 13.0208 7.4125 13.4125C7.02083 13.8042 6.55 14 6 14C5.45 14 4.97917 13.8042 4.5875 13.4125C4.19583 13.0208 4 12.55 4 12ZM10 12C10 11.45 10.1958 10.9792 10.5875 10.5875C10.9792 10.1958 11.45 10 12 10C12.55 10 13.0208 10.1958 13.4125 10.5875C13.8042 10.9792 14 11.45 14 12C14 12.55 13.8042 13.0208 13.4125 13.4125C13.0208 13.8042 12.55 14 12 14C11.45 14 10.9792 13.8042 10.5875 13.4125C10.1958 13.0208 10 12.55 10 12ZM16 12C16 11.45 16.1958 10.9792 16.5875 10.5875C16.9792 10.1958 17.45 10 18 10C18.55 10 19.0208 10.1958 19.4125 10.5875C19.8042 10.9792 20 11.45 20 12C20 12.55 19.8042 13.0208 19.4125 13.4125C19.0208 13.8042 18.55 14 18 14C17.45 14 16.9792 13.8042 16.5875 13.4125C16.1958 13.0208 16 12.55 16 12Z" />
|
|
217
|
+
</symbol>
|
|
218
|
+
|
|
219
|
+
|
|
209
220
|
<symbol
|
|
210
221
|
id="Close"
|
|
211
222
|
xmlns="http://www.w3.org/2000/svg"
|
|
@@ -377,4 +388,7 @@
|
|
|
377
388
|
fill="currentColor" />
|
|
378
389
|
</symbol>
|
|
379
390
|
|
|
391
|
+
<symbol id="ChevronRight" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
392
|
+
<path d="M12.6 12L8 7.4L9.4 6L15.4 12L9.4 18L8 16.6L12.6 12Z" fill="currentColor"/>
|
|
393
|
+
</symbol>
|
|
380
394
|
</svg>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Icon } from "../../../shared/components";
|
|
2
|
+
import { OrgUnitBreadcrumbProps } from "../../types";
|
|
3
|
+
|
|
4
|
+
import { OrgUnitBreadcrumbDropdown } from "./OrgUnitBreadcrumbDropdown";
|
|
5
|
+
import { OrgUnitBreadcrumbPath } from "./OrgUnitBreadcrumbPath";
|
|
6
|
+
|
|
7
|
+
export const OrgUnitBreadcrumb = ({ items }: OrgUnitBreadcrumbProps) => {
|
|
8
|
+
const sortedByPosition = [...items].sort((a, b) => a.position - b.position);
|
|
9
|
+
const divider = (
|
|
10
|
+
<Icon
|
|
11
|
+
data-fs-bp-breadcrumb-divider
|
|
12
|
+
name="ChevronRight"
|
|
13
|
+
width={24}
|
|
14
|
+
height={24}
|
|
15
|
+
/>
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<nav data-fs-bp-breadcrumb-nav>
|
|
20
|
+
<OrgUnitBreadcrumbDropdown items={sortedByPosition.slice(0, -2)} />
|
|
21
|
+
{items.length > 2 && divider}
|
|
22
|
+
<OrgUnitBreadcrumbPath
|
|
23
|
+
items={sortedByPosition.slice(-2)}
|
|
24
|
+
divider={divider}
|
|
25
|
+
/>
|
|
26
|
+
</nav>
|
|
27
|
+
);
|
|
28
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { useRouter } from "next/router";
|
|
2
|
+
|
|
3
|
+
import { Dropdown, DropdownItem } from "@faststore/ui";
|
|
4
|
+
|
|
5
|
+
import { BasicDropdownMenu, Icon } from "../../../shared/components";
|
|
6
|
+
import { OrgUnitBreadcrumbProps } from "../../types";
|
|
7
|
+
|
|
8
|
+
export const OrgUnitBreadcrumbDropdown = ({
|
|
9
|
+
items,
|
|
10
|
+
}: OrgUnitBreadcrumbProps) => {
|
|
11
|
+
const { push } = useRouter();
|
|
12
|
+
|
|
13
|
+
const dropdownItems = items.map((item) => (
|
|
14
|
+
<DropdownItem onClick={() => push(item.item)} key={item.item}>
|
|
15
|
+
<Icon name="Folder" width={20} height={20} />
|
|
16
|
+
{item.name}
|
|
17
|
+
</DropdownItem>
|
|
18
|
+
));
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
items.length > 0 && (
|
|
22
|
+
<>
|
|
23
|
+
<Dropdown>
|
|
24
|
+
<BasicDropdownMenu.Trigger iconName="MoreHorz" />
|
|
25
|
+
<BasicDropdownMenu align="left">{dropdownItems}</BasicDropdownMenu>
|
|
26
|
+
</Dropdown>
|
|
27
|
+
</>
|
|
28
|
+
)
|
|
29
|
+
);
|
|
30
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from "react";
|
|
2
|
+
|
|
3
|
+
import Link from "next/link";
|
|
4
|
+
|
|
5
|
+
import { Tooltip } from "@faststore/ui";
|
|
6
|
+
|
|
7
|
+
import { OrgUnitBreadcrumbItemProps } from "../../types";
|
|
8
|
+
|
|
9
|
+
export const OrgUnitBreadcrumbLink = ({
|
|
10
|
+
name,
|
|
11
|
+
item,
|
|
12
|
+
isLast,
|
|
13
|
+
}: OrgUnitBreadcrumbItemProps) => {
|
|
14
|
+
const [truncate, setTruncate] = useState(false);
|
|
15
|
+
const linkRef = useRef<HTMLParagraphElement | HTMLAnchorElement>(null);
|
|
16
|
+
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
setTruncate(
|
|
19
|
+
linkRef.current
|
|
20
|
+
? linkRef.current.scrollWidth > linkRef.current?.clientWidth
|
|
21
|
+
: false
|
|
22
|
+
);
|
|
23
|
+
}, []);
|
|
24
|
+
|
|
25
|
+
const linkContent = (
|
|
26
|
+
<div data-fs-bp-breadcrumb-link>
|
|
27
|
+
{isLast ? (
|
|
28
|
+
<p
|
|
29
|
+
ref={linkRef as React.RefObject<HTMLParagraphElement>}
|
|
30
|
+
data-fs-bp-breadcrumb-text
|
|
31
|
+
data-fs-bp-breadcrumb-current
|
|
32
|
+
>
|
|
33
|
+
{name}
|
|
34
|
+
</p>
|
|
35
|
+
) : (
|
|
36
|
+
<Link
|
|
37
|
+
ref={linkRef as React.RefObject<HTMLAnchorElement>}
|
|
38
|
+
data-fs-bp-breadcrumb-text
|
|
39
|
+
href={item}
|
|
40
|
+
>
|
|
41
|
+
{name}
|
|
42
|
+
</Link>
|
|
43
|
+
)}
|
|
44
|
+
</div>
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
return truncate ? (
|
|
48
|
+
<Tooltip content={name}>{linkContent}</Tooltip>
|
|
49
|
+
) : (
|
|
50
|
+
linkContent
|
|
51
|
+
);
|
|
52
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Fragment } from "react";
|
|
2
|
+
|
|
3
|
+
import { OrgUnitBreadcrumbPathProps } from "../../types";
|
|
4
|
+
|
|
5
|
+
import { OrgUnitBreadcrumbLink } from "./OrgUnitBreadcrumbLink";
|
|
6
|
+
|
|
7
|
+
export const OrgUnitBreadcrumbPath = ({
|
|
8
|
+
items,
|
|
9
|
+
divider,
|
|
10
|
+
}: OrgUnitBreadcrumbPathProps) =>
|
|
11
|
+
items.flatMap((item, index) => {
|
|
12
|
+
const isLast = index === items.length - 1;
|
|
13
|
+
const link = [
|
|
14
|
+
<OrgUnitBreadcrumbLink
|
|
15
|
+
key={item.item}
|
|
16
|
+
item={item.item}
|
|
17
|
+
name={item.name}
|
|
18
|
+
isLast={isLast}
|
|
19
|
+
/>,
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
if (!isLast && divider) {
|
|
23
|
+
link.push(<Fragment key={index}>{divider}</Fragment>);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return link;
|
|
27
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
@import '@faststore/ui/src/components/molecules/Dropdown/styles.scss';
|
|
2
|
+
@import '@faststore/ui/src/components/molecules/Tooltip/styles.scss';
|
|
3
|
+
|
|
4
|
+
[data-fs-bp-breadcrumb-nav] {
|
|
5
|
+
flex: 1;
|
|
6
|
+
display: flex;
|
|
7
|
+
align-items: center;
|
|
8
|
+
flex-wrap: wrap;
|
|
9
|
+
gap: var(--fs-spacing-1);
|
|
10
|
+
|
|
11
|
+
[data-fs-tooltip] {
|
|
12
|
+
--fs-tooltip-background: #1F1F1F;
|
|
13
|
+
--fs-tooltip-border-radius: .25rem;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
[data-fs-bp-breadcrumb-link] {
|
|
18
|
+
flex: 0 0 max-content;
|
|
19
|
+
max-width: 28.125rem; // 450px
|
|
20
|
+
|
|
21
|
+
p, a {
|
|
22
|
+
font-size: var(--fs-text-size-4);
|
|
23
|
+
line-height: var(--fs-text-size-6);
|
|
24
|
+
font-weight: var(--fs-text-weight-semibold);
|
|
25
|
+
color: #5C5C5C;
|
|
26
|
+
text-decoration: none;
|
|
27
|
+
cursor: pointer;
|
|
28
|
+
transition: all 0.2s;
|
|
29
|
+
letter-spacing: -0.04em;
|
|
30
|
+
display: block;
|
|
31
|
+
|
|
32
|
+
white-space: nowrap;
|
|
33
|
+
overflow: hidden;
|
|
34
|
+
text-overflow: ellipsis;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
[data-fs-bp-breadcrumb-current] {
|
|
38
|
+
color: #000;
|
|
39
|
+
cursor: inherit;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
a:hover {
|
|
43
|
+
color: #565656;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
[data-fs-bp-breadcrumb-divider] {
|
|
48
|
+
color: #858585;
|
|
49
|
+
flex: 0 0 auto;
|
|
50
|
+
}
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
OrgUnitsDropdownMenu,
|
|
20
20
|
AddAllToOrgUnitDropdown,
|
|
21
21
|
OrgUnitDetailsNavbar,
|
|
22
|
+
OrgUnitBreadcrumb,
|
|
22
23
|
} from "../../components";
|
|
23
24
|
|
|
24
25
|
import type { ContractData } from "../../../contracts/types";
|
|
@@ -37,6 +38,15 @@ export const OrgUnitsDetailsLayout = ({
|
|
|
37
38
|
data: { orgUnit, contracts, user },
|
|
38
39
|
}: OrgUnitsDetailsLayoutProps) => {
|
|
39
40
|
const isSingleContract = contracts.length === 1;
|
|
41
|
+
const breadcrumbList = orgUnit.path.ids
|
|
42
|
+
.split("/")
|
|
43
|
+
.slice(1)
|
|
44
|
+
.map((orgUnitId, index) => ({
|
|
45
|
+
item: buyerPortalRoutes.orgUnitDetails({ orgUnitId }),
|
|
46
|
+
name: orgUnit.path.names.split("/")[index],
|
|
47
|
+
position: index + 1,
|
|
48
|
+
}));
|
|
49
|
+
|
|
40
50
|
return (
|
|
41
51
|
<GlobalLayout>
|
|
42
52
|
{/* TODO: Add person here */}
|
|
@@ -45,7 +55,8 @@ export const OrgUnitsDetailsLayout = ({
|
|
|
45
55
|
person={{ name: user?.name ?? "", role: user?.roles?.[0] }}
|
|
46
56
|
/>
|
|
47
57
|
<section data-fs-org-units-details-section>
|
|
48
|
-
<HeaderInside
|
|
58
|
+
<HeaderInside>
|
|
59
|
+
<OrgUnitBreadcrumb items={breadcrumbList} />
|
|
49
60
|
<Dropdown>
|
|
50
61
|
<BasicDropdownMenu.Trigger />
|
|
51
62
|
<OrgUnitsDropdownMenu
|
|
@@ -54,113 +65,111 @@ export const OrgUnitsDetailsLayout = ({
|
|
|
54
65
|
name={orgUnit.name}
|
|
55
66
|
/>
|
|
56
67
|
</Dropdown>
|
|
57
|
-
|
|
58
|
-
<
|
|
59
|
-
<
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
68
|
+
{contracts.length > 0 && (
|
|
69
|
+
<Dropdown>
|
|
70
|
+
<DropdownButton asChild>
|
|
71
|
+
<HeaderInside.Button />
|
|
72
|
+
</DropdownButton>
|
|
73
|
+
<AddAllToOrgUnitDropdown
|
|
74
|
+
isSingleContract={isSingleContract}
|
|
75
|
+
contractId={contracts[0].id}
|
|
76
|
+
unitId={orgUnit.id}
|
|
77
|
+
/>
|
|
78
|
+
</Dropdown>
|
|
79
|
+
)}
|
|
67
80
|
</HeaderInside>
|
|
68
81
|
<div data-fs-org-units-details-grid>
|
|
69
|
-
|
|
70
|
-
{isSingleContract ? (
|
|
71
|
-
<BasicCard
|
|
72
|
-
data-fs-bp-contracts-settings-card
|
|
73
|
-
footerMessage="Manage contract settings"
|
|
74
|
-
footerLink={buyerPortalRoutes.profileDetails({
|
|
75
|
-
orgUnitId: orgUnit.id,
|
|
76
|
-
contractId: contracts[0]?.id ?? "",
|
|
77
|
-
})}
|
|
78
|
-
enableFooter
|
|
79
|
-
>
|
|
80
|
-
<LetterHighlight letter={orgUnit.name[0]} />
|
|
81
|
-
<VerticalNav.Menu title={orgUnit.name}>
|
|
82
|
-
{getContractSettingsLinks({
|
|
83
|
-
orgUnitId: orgUnit.id,
|
|
84
|
-
contractId: contracts[0]?.id ?? "",
|
|
85
|
-
}).map(({ name, link }) => (
|
|
86
|
-
<VerticalNav.Link key={name} link={link}>
|
|
87
|
-
{name}
|
|
88
|
-
</VerticalNav.Link>
|
|
89
|
-
))}
|
|
90
|
-
</VerticalNav.Menu>
|
|
91
|
-
</BasicCard>
|
|
92
|
-
) : (
|
|
93
|
-
<BasicCard
|
|
94
|
-
enableHeader
|
|
95
|
-
title="Contracts"
|
|
96
|
-
subTitle={contracts.length}
|
|
97
|
-
data-fs-bp-contracts-list-card
|
|
98
|
-
>
|
|
99
|
-
{contracts.map((contract) => (
|
|
100
|
-
<BasicCard.Line
|
|
101
|
-
key={contract.id}
|
|
102
|
-
title={contract.name ?? ""}
|
|
103
|
-
icon={
|
|
104
|
-
<LetterHighlight
|
|
105
|
-
size="small"
|
|
106
|
-
letter={contract.name ?? ""}
|
|
107
|
-
/>
|
|
108
|
-
}
|
|
109
|
-
href={buyerPortalRoutes.profileDetails({
|
|
110
|
-
orgUnitId: orgUnit.id,
|
|
111
|
-
contractId: contract.id,
|
|
112
|
-
})}
|
|
113
|
-
menu={
|
|
114
|
-
<BasicDropdownMenu>
|
|
115
|
-
<DropdownItem>
|
|
116
|
-
<Icon name="Edit" width={20} height={20} />
|
|
117
|
-
Edit
|
|
118
|
-
</DropdownItem>
|
|
119
|
-
</BasicDropdownMenu>
|
|
120
|
-
}
|
|
121
|
-
/>
|
|
122
|
-
))}
|
|
123
|
-
</BasicCard>
|
|
124
|
-
)}
|
|
125
|
-
</div>
|
|
126
|
-
<div data-fs-org-units-details-grid-column>
|
|
82
|
+
{isSingleContract ? (
|
|
127
83
|
<BasicCard
|
|
128
|
-
data-fs-bp-
|
|
129
|
-
footerMessage="Manage
|
|
130
|
-
footerLink={buyerPortalRoutes.
|
|
84
|
+
data-fs-bp-contracts-settings-card
|
|
85
|
+
footerMessage="Manage contract settings"
|
|
86
|
+
footerLink={buyerPortalRoutes.profileDetails({
|
|
131
87
|
orgUnitId: orgUnit.id,
|
|
88
|
+
contractId: contracts[0]?.id ?? "",
|
|
132
89
|
})}
|
|
133
90
|
enableFooter
|
|
134
91
|
>
|
|
135
|
-
<
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
92
|
+
<LetterHighlight letter={orgUnit.name[0]} />
|
|
93
|
+
<VerticalNav.Menu title={orgUnit.name}>
|
|
94
|
+
{getContractSettingsLinks({
|
|
95
|
+
orgUnitId: orgUnit.id,
|
|
96
|
+
contractId: contracts[0]?.id ?? "",
|
|
97
|
+
}).map(({ name, link }) => (
|
|
98
|
+
<VerticalNav.Link key={name} link={link}>
|
|
99
|
+
{name}
|
|
139
100
|
</VerticalNav.Link>
|
|
140
101
|
))}
|
|
141
102
|
</VerticalNav.Menu>
|
|
142
103
|
</BasicCard>
|
|
104
|
+
) : (
|
|
143
105
|
<BasicCard
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
contractId: contracts[0]?.id,
|
|
149
|
-
})}
|
|
150
|
-
enableFooter
|
|
106
|
+
enableHeader
|
|
107
|
+
title="Contracts"
|
|
108
|
+
subTitle={contracts.length}
|
|
109
|
+
data-fs-bp-contracts-list-card
|
|
151
110
|
>
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
111
|
+
{contracts.map((contract) => (
|
|
112
|
+
<BasicCard.Line
|
|
113
|
+
key={contract.id}
|
|
114
|
+
title={contract.name ?? ""}
|
|
115
|
+
icon={
|
|
116
|
+
<LetterHighlight
|
|
117
|
+
size="small"
|
|
118
|
+
letter={contract.name ?? ""}
|
|
119
|
+
/>
|
|
120
|
+
}
|
|
121
|
+
href={buyerPortalRoutes.profileDetails({
|
|
122
|
+
orgUnitId: orgUnit.id,
|
|
123
|
+
contractId: contract.id,
|
|
124
|
+
})}
|
|
125
|
+
menu={
|
|
126
|
+
<BasicDropdownMenu>
|
|
127
|
+
<DropdownItem>
|
|
128
|
+
<Icon name="Edit" width={20} height={20} />
|
|
129
|
+
Edit
|
|
130
|
+
</DropdownItem>
|
|
131
|
+
</BasicDropdownMenu>
|
|
132
|
+
}
|
|
133
|
+
/>
|
|
134
|
+
))}
|
|
162
135
|
</BasicCard>
|
|
163
|
-
|
|
136
|
+
)}
|
|
137
|
+
<BasicCard
|
|
138
|
+
data-fs-bp-organizations-settings-card
|
|
139
|
+
footerMessage="Manage organization settings"
|
|
140
|
+
footerLink={buyerPortalRoutes.users({
|
|
141
|
+
orgUnitId: orgUnit.id,
|
|
142
|
+
})}
|
|
143
|
+
enableFooter
|
|
144
|
+
>
|
|
145
|
+
<VerticalNav.Menu title="Organization">
|
|
146
|
+
{getOrganizationSettingsLinks(orgUnit.id).map((option) => (
|
|
147
|
+
<VerticalNav.Link key={option.name} link={option.link}>
|
|
148
|
+
{option.name}
|
|
149
|
+
</VerticalNav.Link>
|
|
150
|
+
))}
|
|
151
|
+
</VerticalNav.Menu>
|
|
152
|
+
</BasicCard>
|
|
153
|
+
<BasicCard
|
|
154
|
+
data-fs-bp-compliance-settings-card
|
|
155
|
+
footerMessage="Manage finance and compliance settings"
|
|
156
|
+
footerLink={buyerPortalRoutes.buyingPolicies({
|
|
157
|
+
orgUnitId: orgUnit.id,
|
|
158
|
+
contractId: contracts[0]?.id,
|
|
159
|
+
})}
|
|
160
|
+
enableFooter
|
|
161
|
+
>
|
|
162
|
+
<VerticalNav.Menu title="Finance and Compliance">
|
|
163
|
+
{getFinanceSettingsLinks({
|
|
164
|
+
orgUnitId: orgUnit.id,
|
|
165
|
+
contractId: contracts[0]?.id ?? "",
|
|
166
|
+
}).map((option) => (
|
|
167
|
+
<VerticalNav.Link key={option.name} link={option.link}>
|
|
168
|
+
{option.name}
|
|
169
|
+
</VerticalNav.Link>
|
|
170
|
+
))}
|
|
171
|
+
</VerticalNav.Menu>
|
|
172
|
+
</BasicCard>
|
|
164
173
|
</div>
|
|
165
174
|
</section>
|
|
166
175
|
</GlobalLayout>
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
@import "@faststore/ui/src/components/molecules/Dropdown/styles.scss";
|
|
2
|
+
@import '@faststore/ui/src/components/molecules/Breadcrumb/styles.scss';
|
|
2
3
|
@import "../../../shared/components/BasicDropdownMenu/basic-dropdown-menu.scss";
|
|
3
4
|
@import "../../components/OrgUnitDetailsNavbar/org-unit-details-navbar.scss";
|
|
4
5
|
@import "../../../credit-cards/components/CreateCreditCardDrawer/create-credit-card-drawer.scss";
|
|
6
|
+
@import "../../components/OrgUnitBreadcrumb/org-unit-breadcrumb.scss";
|
|
5
7
|
|
|
6
8
|
[data-fs-org-units-details-section] {
|
|
7
9
|
@import "../../../shared/components/BasicCard/basic-card.scss";
|
|
@@ -17,9 +19,11 @@
|
|
|
17
19
|
flex-direction: column;
|
|
18
20
|
|
|
19
21
|
[data-fs-org-units-details-grid] {
|
|
20
|
-
display:
|
|
22
|
+
display: grid;
|
|
21
23
|
flex: 1;
|
|
22
24
|
gap: var(--fs-spacing-3);
|
|
25
|
+
grid-template-columns: repeat(2, 1fr);
|
|
26
|
+
grid-auto-rows: 1fr;
|
|
23
27
|
}
|
|
24
28
|
|
|
25
29
|
[data-fs-card-row-dropdown-button] {
|
|
@@ -35,10 +39,6 @@
|
|
|
35
39
|
}
|
|
36
40
|
|
|
37
41
|
[data-fs-org-units-details-grid] {
|
|
38
|
-
display: flex;
|
|
39
|
-
min-height: 100%;
|
|
40
|
-
flex-wrap: wrap;
|
|
41
|
-
|
|
42
42
|
[data-fs-org-units-details-grid-column] {
|
|
43
43
|
flex: 1;
|
|
44
44
|
display: flex;
|
|
@@ -99,6 +99,11 @@
|
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
+
[data-fs-bp-contracts-settings-card],[data-fs-bp-contracts-list-card] {
|
|
103
|
+
flex: 1;
|
|
104
|
+
grid-row: 1 / span 2;
|
|
105
|
+
}
|
|
106
|
+
|
|
102
107
|
[data-fs-bp-contracts-list-card] {
|
|
103
108
|
[data-fs-card-body] {
|
|
104
109
|
max-height: 60vh;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
export type OrgUnitBreadcrumbItem = {
|
|
4
|
+
item: string;
|
|
5
|
+
name: string;
|
|
6
|
+
position: number;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export type OrgUnitBreadcrumbProps = {
|
|
10
|
+
items: OrgUnitBreadcrumbItem[];
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export interface OrgUnitBreadcrumbItemProps
|
|
14
|
+
extends Omit<OrgUnitBreadcrumbItem, "position"> {
|
|
15
|
+
isLast?: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface OrgUnitBreadcrumbPathProps extends OrgUnitBreadcrumbProps {
|
|
19
|
+
divider: ReactNode;
|
|
20
|
+
}
|
|
@@ -4,3 +4,9 @@ export type {
|
|
|
4
4
|
} from "./OrgUnitSummaryData";
|
|
5
5
|
export type { OrgUnitData, OrgUnitHierarchyData } from "./OrgUnitsData";
|
|
6
6
|
export type { OrganizationData } from "./OrganizationData";
|
|
7
|
+
export type {
|
|
8
|
+
OrgUnitBreadcrumbItem,
|
|
9
|
+
OrgUnitBreadcrumbProps,
|
|
10
|
+
OrgUnitBreadcrumbItemProps,
|
|
11
|
+
OrgUnitBreadcrumbPathProps,
|
|
12
|
+
} from "./OrgUnitBreadcrumbTypes";
|
|
@@ -7,7 +7,7 @@ import { Icon } from "../Icon";
|
|
|
7
7
|
import { HeaderInsideButton } from "./HeaderInsideButton";
|
|
8
8
|
|
|
9
9
|
export type HeaderInsideProps = {
|
|
10
|
-
title
|
|
10
|
+
title?: string;
|
|
11
11
|
backLink?: string;
|
|
12
12
|
children?: ReactNode;
|
|
13
13
|
};
|
|
@@ -25,7 +25,7 @@ export const HeaderInside = ({
|
|
|
25
25
|
<Icon name="Back" />
|
|
26
26
|
</Link>
|
|
27
27
|
)}
|
|
28
|
-
<h1 data-fs-bp-header-inside-title>{title}</h1>
|
|
28
|
+
{title && <h1 data-fs-bp-header-inside-title>{title}</h1>}
|
|
29
29
|
{children}
|
|
30
30
|
</header>
|
|
31
31
|
);
|