Skip to content

Commit f9705a2

Browse files
viodragon2mergify[bot]
authored andcommitted
feat(left-sidebar): LeftSidebar supports custom navLinkRenderer (#1510)
* feat(leftsidebar): LeftSidebar supports custom navLinkRenderer * feat(leftsidebar): LeftSidebar supports custom navLinkRenderer * feat(left-sidebar): LeftSidebar supports custom navLinkRenderer
1 parent 8eb68b3 commit f9705a2

File tree

8 files changed

+153
-97
lines changed

8 files changed

+153
-97
lines changed

src/features/left-sidebar/LeftSidebar.js

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ import CopyrightFooter from './CopyrightFooter';
1313
import InstantLogin from './InstantLogin';
1414
import LeftSidebarDropWrapper from './LeftSidebarDropWrapper';
1515
import LeftSidebarIconWrapper from './LeftSidebarIconWrapper';
16-
import LeftSidebarLink from './LeftSidebarLink';
1716
import NewItemsIndicator from './NewItemsIndicator';
17+
import defaultNavLinkRenderer from './defaultNavLinkRenderer';
1818

19+
import type { Props as LeftSidebarLinkProps } from './LeftSidebarLink';
1920
import type { Callout } from './Callout';
2021

2122
import './styles/LeftSidebar.scss';
@@ -39,6 +40,8 @@ type SubMenuItem = {
3940
id: string,
4041
/** Localized text string to use for individual menu items */
4142
message: string,
43+
/** Optional left side bar link renderer. Defaults to defaultNavLinkRenderer */
44+
navLinkRenderer?: (props: LeftSidebarLinkProps) => React.Node,
4245
/** Whether we should show a badge marking new item content */
4346
newItemBadge?: boolean,
4447
/** Optional remove link click handler */
@@ -78,6 +81,8 @@ type MenuItem = {
7881
menuItems?: Array<SubMenuItem>,
7982
/** Localized text string to use for individual menu items */
8083
message: string,
84+
/** Optional left side bar link renderer. Defaults to defaultNavLinkRenderer */
85+
navLinkRenderer?: (props: LeftSidebarLinkProps) => React.Node,
8186
/** Whether we should show a badge marking new item content */
8287
newItemBadge?: boolean,
8388
/** Optional remove link click handler */
@@ -282,6 +287,7 @@ class LeftSidebar extends React.Component<Props, State> {
282287
iconElement,
283288
id,
284289
message,
290+
navLinkRenderer,
285291
newItemBadge,
286292
onClickRemove,
287293
removeButtonHtmlAttributes,
@@ -296,26 +302,24 @@ class LeftSidebar extends React.Component<Props, State> {
296302
'is-selected': selected,
297303
});
298304

299-
const builtLink = (
300-
<LeftSidebarLink
301-
callout={callout}
302-
canReceiveDrop={canReceiveDrop}
303-
className={linkClassNames}
304-
customTheme={leftSidebarProps.customTheme}
305-
onClickRemove={onClickRemove}
306-
htmlAttributes={htmlAttributes}
307-
icon={this.getIcon(iconElement, iconComponent, leftSidebarProps.customTheme, selected, scaleIcon)}
308-
isScrolling={this.state.isScrolling}
309-
key={`link-${id}`}
310-
message={message}
311-
newItemBadge={this.getNewItemBadge(newItemBadge, leftSidebarProps.customTheme)}
312-
removeButtonHtmlAttributes={removeButtonHtmlAttributes}
313-
routerLink={routerLink}
314-
routerProps={routerProps}
315-
selected={selected}
316-
showTooltip={showTooltip}
317-
/>
318-
);
305+
const linkProps = {
306+
callout,
307+
className: linkClassNames,
308+
customTheme: leftSidebarProps.customTheme,
309+
onClickRemove,
310+
htmlAttributes,
311+
icon: this.getIcon(iconElement, iconComponent, leftSidebarProps.customTheme, selected, scaleIcon),
312+
isScrolling: this.state.isScrolling,
313+
message,
314+
newItemBadge: this.getNewItemBadge(newItemBadge, leftSidebarProps.customTheme),
315+
removeButtonHtmlAttributes,
316+
routerLink,
317+
routerProps,
318+
selected,
319+
showTooltip,
320+
};
321+
322+
const builtLink = navLinkRenderer ? navLinkRenderer(linkProps) : defaultNavLinkRenderer(linkProps);
319323

320324
// Check for menu items on links so we don't double-highlight groups
321325
return canReceiveDrop && !props.menuItems ? (
@@ -327,7 +331,7 @@ class LeftSidebar extends React.Component<Props, State> {
327331
{builtLink}
328332
</LeftSidebarDropWrapper>
329333
) : (
330-
builtLink
334+
<React.Fragment key={`link-${id}`}>{builtLink}</React.Fragment>
331335
);
332336
}
333337

src/features/left-sidebar/LeftSidebarLink.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import type { Callout } from './Callout';
1111

1212
import './styles/LeftSidebarLink.scss';
1313

14-
type Props = {
14+
export type Props = {
1515
callout?: Callout,
1616
className?: string,
1717
customTheme?: Object,

src/features/left-sidebar/__tests__/LeftSidebar-test.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,26 @@ describe('feature/left-sidebar/LeftSidebar', () => {
285285
expect(wrapper).toMatchSnapshot();
286286
});
287287

288+
test('should use custom render for menu item if provided', () => {
289+
const oneMenuItem = [
290+
{
291+
navLinkRenderer: () => <h1>Custom Link</h1>,
292+
id: 'all-files',
293+
message: 'All Files',
294+
htmlAttributes: {
295+
href: '/folder/0',
296+
},
297+
routerLink: undefined,
298+
routerProps: undefined,
299+
showTooltip: true,
300+
},
301+
];
302+
303+
const wrapper = shallow(<LeftSidebar menuItems={oneMenuItem} />);
304+
305+
expect(wrapper.exists('h1')).toBeTruthy();
306+
});
307+
288308
describe('checkAndChangeScrollShadows()', () => {
289309
[
290310
// isn't scrollable

0 commit comments

Comments
 (0)