Skip to content

Commit 1766e72

Browse files
✨ Add support & openapi links (#438)
Signed-off-by: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com>
1 parent 3266cfe commit 1766e72

6 files changed

Lines changed: 107 additions & 22 deletions

File tree

branding/strings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"height": "40px"
1717
},
1818
"leftTitle": null,
19-
"rightBrand": null
19+
"rightBrand": null,
20+
"supportUrl": "https://github.com/trustification/trustify/issues"
2021
}
2122
}

client/src/app/layout/header.tsx

Lines changed: 74 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@ import { useNavigate } from "react-router-dom";
66
import {
77
Avatar,
88
Brand,
9-
Button,
10-
ButtonVariant,
119
Divider,
1210
Dropdown,
1311
DropdownItem,
1412
DropdownList,
13+
Icon,
1514
Masthead,
1615
MastheadBrand,
1716
MastheadContent,
@@ -30,6 +29,7 @@ import {
3029
import EllipsisVIcon from "@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon";
3130
import HelpIcon from "@patternfly/react-icons/dist/esm/icons/help-icon";
3231
import BarsIcon from "@patternfly/react-icons/dist/js/icons/bars-icon";
32+
import ExternalLinkAltIcon from "@patternfly/react-icons/dist/js/icons/external-link-alt-icon";
3333

3434
import { isAuthRequired } from "@app/Constants";
3535
import useBranding from "@app/hooks/useBranding";
@@ -39,22 +39,26 @@ import { AboutApp } from "./about";
3939

4040
export const HeaderApp: React.FC = () => {
4141
const {
42-
masthead: { leftBrand, leftTitle, rightBrand },
42+
masthead: { leftBrand, leftTitle, rightBrand, supportUrl },
4343
} = useBranding();
4444

4545
const auth = (isAuthRequired && useAuth()) || undefined;
4646

4747
const navigate = useNavigate();
4848

49-
const [isAboutOpen, toggleIsAboutOpen] = useReducer((state) => !state, false);
49+
const [isAboutModalOpen, toggleIsAboutModalOpen] = useReducer(
50+
(state) => !state,
51+
false,
52+
);
53+
const [isHelpDropdownOpen, setIsHelpDropdownOpen] = useState(false);
5054
const [isKebabDropdownOpen, setIsKebabDropdownOpen] = useState(false);
5155
const [isUserDropdownOpen, setIsUserDropdownOpen] = useState(false);
5256

53-
const onKebabDropdownToggle = () => {
54-
setIsKebabDropdownOpen(!isKebabDropdownOpen);
57+
const onHelpDropdownToggle = () => {
58+
setIsHelpDropdownOpen(!isHelpDropdownOpen);
5559
};
5660

57-
const onKebabDropdownSelect = () => {
61+
const onKebabDropdownToggle = () => {
5862
setIsKebabDropdownOpen(!isKebabDropdownOpen);
5963
};
6064

@@ -70,7 +74,7 @@ export const HeaderApp: React.FC = () => {
7074

7175
return (
7276
<>
73-
<AboutApp isOpen={isAboutOpen} onClose={toggleIsAboutOpen} />
77+
<AboutApp isOpen={isAboutModalOpen} onClose={toggleIsAboutModalOpen} />
7478

7579
<Masthead>
7680
<MastheadToggle>
@@ -122,14 +126,48 @@ export const HeaderApp: React.FC = () => {
122126
}}
123127
>
124128
<ToolbarItem>
125-
<Button
126-
id="about-button"
127-
aria-label="about button"
128-
variant={ButtonVariant.plain}
129-
onClick={toggleIsAboutOpen}
129+
<Dropdown
130+
isOpen={isHelpDropdownOpen}
131+
onSelect={onHelpDropdownToggle}
132+
onOpenChange={(isOpen: boolean) =>
133+
setIsHelpDropdownOpen(isOpen)
134+
}
135+
popperProps={{ position: "right" }}
136+
toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
137+
<MenuToggle
138+
ref={toggleRef}
139+
onClick={onHelpDropdownToggle}
140+
isExpanded={isHelpDropdownOpen}
141+
variant="plain"
142+
aria-label="About"
143+
>
144+
<HelpIcon />
145+
</MenuToggle>
146+
)}
130147
>
131-
<HelpIcon />
132-
</Button>
148+
<DropdownList>
149+
{supportUrl && (
150+
<DropdownItem
151+
key="support"
152+
component="a"
153+
to={supportUrl}
154+
target="_blank"
155+
rel="noopener noreferrer"
156+
>
157+
Support{" "}
158+
<Icon isInline iconSize="sm">
159+
<ExternalLinkAltIcon />
160+
</Icon>
161+
</DropdownItem>
162+
)}
163+
<DropdownItem
164+
key="about"
165+
onClick={toggleIsAboutModalOpen}
166+
>
167+
About
168+
</DropdownItem>
169+
</DropdownList>
170+
</Dropdown>
133171
</ToolbarItem>
134172
</ToolbarGroup>
135173

@@ -143,7 +181,7 @@ export const HeaderApp: React.FC = () => {
143181
<ToolbarItem>
144182
<Dropdown
145183
isOpen={isKebabDropdownOpen}
146-
onSelect={onKebabDropdownSelect}
184+
onSelect={onKebabDropdownToggle}
147185
onOpenChange={(isOpen: boolean) =>
148186
setIsKebabDropdownOpen(isOpen)
149187
}
@@ -156,7 +194,7 @@ export const HeaderApp: React.FC = () => {
156194
variant="plain"
157195
aria-label="About"
158196
>
159-
<EllipsisVIcon aria-hidden="true" />
197+
<EllipsisVIcon />
160198
</MenuToggle>
161199
)}
162200
>
@@ -167,8 +205,25 @@ export const HeaderApp: React.FC = () => {
167205
</DropdownItem>
168206
)}
169207
<Divider key="separator" component="li" />
170-
<DropdownItem key="about" onClick={toggleIsAboutOpen}>
171-
<HelpIcon /> About
208+
{supportUrl && (
209+
<DropdownItem
210+
key="support"
211+
component="a"
212+
to={supportUrl}
213+
target="_blank"
214+
rel="noopener noreferrer"
215+
>
216+
Support{" "}
217+
<Icon isInline iconSize="sm">
218+
<ExternalLinkAltIcon />
219+
</Icon>
220+
</DropdownItem>
221+
)}
222+
<DropdownItem
223+
key="about"
224+
onClick={toggleIsAboutModalOpen}
225+
>
226+
About
172227
</DropdownItem>
173228
</DropdownList>
174229
</Dropdown>

client/src/app/layout/sidebar.tsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
import type React from "react";
22
import { NavLink } from "react-router-dom";
33

4-
import { Nav, NavList, PageSidebar } from "@patternfly/react-core";
4+
import {
5+
Icon,
6+
Nav,
7+
NavItem,
8+
NavList,
9+
PageSidebar,
10+
} from "@patternfly/react-core";
11+
import ExternalLinkAltIcon from "@patternfly/react-icons/dist/esm/icons/external-link-alt-icon";
512
import { css } from "@patternfly/react-styles";
613

714
import { LayoutTheme } from "./layout-constants";
@@ -94,6 +101,16 @@ export const SidebarApp: React.FC = () => {
94101
Upload
95102
</NavLink>
96103
</li>
104+
<NavItem
105+
to={`${window.location.origin}/openapi`}
106+
target="_blank"
107+
rel="noopener noreferrer"
108+
>
109+
API&nbsp;
110+
<Icon isInline>
111+
<ExternalLinkAltIcon />
112+
</Icon>
113+
</NavItem>
97114
</NavList>
98115
</Nav>
99116
);

common/src/branding-strings-stub.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"height": ""
1717
},
1818
"leftTitle": null,
19-
"rightBrand": null
19+
"rightBrand": null,
20+
"supportUrl": null
2021
}
2122
}

common/src/branding.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export interface BrandingStrings {
2727
leftBrand?: MastheadBrand;
2828
leftTitle?: MastheadTitle;
2929
rightBrand?: MastheadBrand;
30+
supportUrl?: string;
3031
};
3132
}
3233

common/src/proxies.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,14 @@ export const proxyMap: Record<string, Options> = {
5454
}
5555
},
5656
},
57+
"/openapi": {
58+
target: TRUSTIFICATION_ENV.TRUSTIFY_API_URL || "http://localhost:8080",
59+
logLevel: process.env.DEBUG ? "debug" : "info",
60+
changeOrigin: true,
61+
},
62+
"/openapi.json": {
63+
target: TRUSTIFICATION_ENV.TRUSTIFY_API_URL || "http://localhost:8080",
64+
logLevel: process.env.DEBUG ? "debug" : "info",
65+
changeOrigin: true,
66+
},
5767
};

0 commit comments

Comments
 (0)