@servicetitan/navigation 10.6.1 → 11.0.0-canary.237.0ce6038.0
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/dist/components/header-navigation/header-navigation-extra.stories.d.ts.map +1 -1
- package/dist/components/header-navigation/header-navigation-extra.stories.js +5 -5
- package/dist/components/header-navigation/header-navigation-extra.stories.js.map +1 -1
- package/dist/components/header-navigation/header-navigation-links.d.ts.map +1 -1
- package/dist/components/header-navigation/header-navigation-links.js +2 -2
- package/dist/components/header-navigation/header-navigation-links.js.map +1 -1
- package/dist/components/header-navigation/header-navigation-stacked.stories.d.ts.map +1 -1
- package/dist/components/header-navigation/header-navigation-stacked.stories.js +1 -1
- package/dist/components/header-navigation/header-navigation-stacked.stories.js.map +1 -1
- package/dist/components/header-navigation/header-navigation.stories.d.ts.map +1 -1
- package/dist/components/header-navigation/header-navigation.stories.js +2 -2
- package/dist/components/header-navigation/header-navigation.stories.js.map +1 -1
- package/dist/components/header-navigation/with-tooltip.d.ts +1 -1
- package/dist/components/header-navigation/with-tooltip.d.ts.map +1 -1
- package/dist/components/left-navigation/header-navigation-tiny.stories.d.ts.map +1 -1
- package/dist/components/left-navigation/header-navigation-tiny.stories.js +2 -2
- package/dist/components/left-navigation/header-navigation-tiny.stories.js.map +1 -1
- package/dist/components/left-navigation/interface.d.ts +1 -1
- package/dist/components/left-navigation/interface.d.ts.map +1 -1
- package/dist/components/left-navigation/side-navigation-links-internal.d.ts +3 -1
- package/dist/components/left-navigation/side-navigation-links-internal.d.ts.map +1 -1
- package/dist/components/left-navigation/side-navigation-links-internal.js +3 -3
- package/dist/components/left-navigation/side-navigation-links-internal.js.map +1 -1
- package/dist/components/left-navigation/side-navigation.d.ts.map +1 -1
- package/dist/components/left-navigation/side-navigation.js +8 -7
- package/dist/components/left-navigation/side-navigation.js.map +1 -1
- package/dist/components/left-navigation/side-navigation.module.less +21 -19
- package/dist/components/links.d.ts.map +1 -1
- package/dist/components/links.js +7 -7
- package/dist/components/links.js.map +1 -1
- package/dist/components/logo/logo-company-title.d.ts +1 -0
- package/dist/components/logo/logo-company-title.d.ts.map +1 -1
- package/dist/components/logo/logo-company-title.js +2 -2
- package/dist/components/logo/logo-company-title.js.map +1 -1
- package/dist/components/profile-dropdown/profile-dropdown.d.ts +6 -3
- package/dist/components/profile-dropdown/profile-dropdown.d.ts.map +1 -1
- package/dist/components/profile-dropdown/profile-dropdown.js +7 -8
- package/dist/components/profile-dropdown/profile-dropdown.js.map +1 -1
- package/dist/components/profile-dropdown/profile-dropdown.module.less +4 -0
- package/dist/components/profile-dropdown/profile-dropdown.stories.js +2 -2
- package/dist/components/profile-dropdown/profile-dropdown.stories.js.map +1 -1
- package/dist/components/titan-layout/index.d.ts +6 -0
- package/dist/components/titan-layout/index.d.ts.map +1 -0
- package/dist/components/titan-layout/index.js +6 -0
- package/dist/components/titan-layout/index.js.map +1 -0
- package/dist/components/titan-layout/interface-internal.d.ts +6 -0
- package/dist/components/titan-layout/interface-internal.d.ts.map +1 -0
- package/dist/components/titan-layout/interface-internal.js +2 -0
- package/dist/components/titan-layout/interface-internal.js.map +1 -0
- package/dist/components/titan-layout/interface.d.ts +21 -0
- package/dist/components/titan-layout/interface.d.ts.map +1 -0
- package/dist/components/titan-layout/interface.js +2 -0
- package/dist/components/titan-layout/interface.js.map +1 -0
- package/dist/components/titan-layout/layout-context.d.ts +20 -0
- package/dist/components/titan-layout/layout-context.d.ts.map +1 -0
- package/dist/components/titan-layout/layout-context.js +12 -0
- package/dist/components/titan-layout/layout-context.js.map +1 -0
- package/dist/components/titan-layout/layout-header-links.d.ts +7 -0
- package/dist/components/titan-layout/layout-header-links.d.ts.map +1 -0
- package/dist/components/titan-layout/layout-header-links.js +32 -0
- package/dist/components/titan-layout/layout-header-links.js.map +1 -0
- package/dist/components/titan-layout/layout-header.d.ts +20 -0
- package/dist/components/titan-layout/layout-header.d.ts.map +1 -0
- package/dist/components/titan-layout/layout-header.js +11 -0
- package/dist/components/titan-layout/layout-header.js.map +1 -0
- package/dist/components/titan-layout/layout-header.module.less +154 -0
- package/dist/components/titan-layout/layout-logo.d.ts +12 -0
- package/dist/components/titan-layout/layout-logo.d.ts.map +1 -0
- package/dist/components/titan-layout/layout-logo.js +15 -0
- package/dist/components/titan-layout/layout-logo.js.map +1 -0
- package/dist/components/titan-layout/layout-logo.stories.d.ts +13 -0
- package/dist/components/titan-layout/layout-logo.stories.d.ts.map +1 -0
- package/dist/components/titan-layout/layout-logo.stories.js +17 -0
- package/dist/components/titan-layout/layout-logo.stories.js.map +1 -0
- package/dist/components/titan-layout/layout-profile.d.ts +9 -0
- package/dist/components/titan-layout/layout-profile.d.ts.map +1 -0
- package/dist/components/titan-layout/layout-profile.js +44 -0
- package/dist/components/titan-layout/layout-profile.js.map +1 -0
- package/dist/components/titan-layout/layout-profile.stories.d.ts +13 -0
- package/dist/components/titan-layout/layout-profile.stories.d.ts.map +1 -0
- package/dist/components/titan-layout/layout-profile.stories.js +13 -0
- package/dist/components/titan-layout/layout-profile.stories.js.map +1 -0
- package/dist/components/titan-layout/layout-sidebar-links-internal.d.ts +46 -0
- package/dist/components/titan-layout/layout-sidebar-links-internal.d.ts.map +1 -0
- package/dist/components/titan-layout/layout-sidebar-links-internal.js +61 -0
- package/dist/components/titan-layout/layout-sidebar-links-internal.js.map +1 -0
- package/dist/components/titan-layout/layout-sidebar-links.d.ts +6 -0
- package/dist/components/titan-layout/layout-sidebar-links.d.ts.map +1 -0
- package/dist/components/titan-layout/layout-sidebar-links.js +21 -0
- package/dist/components/titan-layout/layout-sidebar-links.js.map +1 -0
- package/dist/components/titan-layout/layout-sidebar.d.ts +17 -0
- package/dist/components/titan-layout/layout-sidebar.d.ts.map +1 -0
- package/dist/components/titan-layout/layout-sidebar.js +65 -0
- package/dist/components/titan-layout/layout-sidebar.js.map +1 -0
- package/dist/components/titan-layout/layout-sidebar.module.less +513 -0
- package/dist/components/titan-layout/titan-layout.d.ts +36 -0
- package/dist/components/titan-layout/titan-layout.d.ts.map +1 -0
- package/dist/components/titan-layout/titan-layout.js +109 -0
- package/dist/components/titan-layout/titan-layout.js.map +1 -0
- package/dist/components/titan-layout/titan-layout.module.less +76 -0
- package/dist/components/titan-layout/titan-layout.stories.d.ts +18 -0
- package/dist/components/titan-layout/titan-layout.stories.d.ts.map +1 -0
- package/dist/components/titan-layout/titan-layout.stories.js +62 -0
- package/dist/components/titan-layout/titan-layout.stories.js.map +1 -0
- package/dist/components/titan-layout/with-tooltip.d.ts +4 -0
- package/dist/components/titan-layout/with-tooltip.d.ts.map +1 -0
- package/dist/components/titan-layout/with-tooltip.js +4 -0
- package/dist/components/titan-layout/with-tooltip.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/test/data.d.ts.map +1 -1
- package/dist/test/data.js +3 -3
- package/dist/test/data.js.map +1 -1
- package/dist/utils/navigation-legacy.d.ts +3 -1
- package/dist/utils/navigation-legacy.d.ts.map +1 -1
- package/dist/utils/use-breakpoint.d.ts +7 -0
- package/dist/utils/use-breakpoint.d.ts.map +1 -0
- package/dist/utils/use-breakpoint.js +13 -0
- package/dist/utils/use-breakpoint.js.map +1 -0
- package/package.json +5 -6
- package/src/components/header-navigation/header-navigation-extra.stories.tsx +7 -0
- package/src/components/header-navigation/header-navigation-links.tsx +2 -0
- package/src/components/header-navigation/header-navigation-stacked.stories.tsx +4 -0
- package/src/components/header-navigation/header-navigation.stories.tsx +5 -0
- package/src/components/left-navigation/header-navigation-tiny.stories.tsx +6 -0
- package/src/components/left-navigation/interface.ts +2 -2
- package/src/components/left-navigation/side-navigation-links-internal.tsx +21 -6
- package/src/components/left-navigation/side-navigation-links.tsx +1 -1
- package/src/components/left-navigation/side-navigation.module.less +21 -19
- package/src/components/left-navigation/side-navigation.module.less.d.ts +2 -1
- package/src/components/left-navigation/side-navigation.tsx +15 -8
- package/src/components/links.tsx +33 -13
- package/src/components/logo/logo-company-title.tsx +8 -6
- package/src/components/profile-dropdown/profile-dropdown.module.less +4 -0
- package/src/components/profile-dropdown/profile-dropdown.stories.tsx +4 -4
- package/src/components/profile-dropdown/profile-dropdown.tsx +43 -46
- package/src/components/titan-layout/index.ts +5 -0
- package/src/components/titan-layout/interface-internal.ts +6 -0
- package/src/components/titan-layout/interface.ts +26 -0
- package/src/components/titan-layout/layout-context.tsx +30 -0
- package/src/components/titan-layout/layout-header-links.tsx +144 -0
- package/src/components/titan-layout/layout-header.module.less +154 -0
- package/src/components/titan-layout/layout-header.module.less.d.ts +16 -0
- package/src/components/titan-layout/layout-header.tsx +86 -0
- package/src/components/titan-layout/layout-logo.stories.tsx +31 -0
- package/src/components/titan-layout/layout-logo.tsx +57 -0
- package/src/components/titan-layout/layout-profile.stories.tsx +37 -0
- package/src/components/titan-layout/layout-profile.tsx +116 -0
- package/src/components/titan-layout/layout-sidebar-links-internal.tsx +265 -0
- package/src/components/titan-layout/layout-sidebar-links.tsx +56 -0
- package/src/components/titan-layout/layout-sidebar.module.less +513 -0
- package/src/components/titan-layout/layout-sidebar.module.less.d.ts +48 -0
- package/src/components/titan-layout/layout-sidebar.tsx +295 -0
- package/src/components/titan-layout/titan-layout.module.less +76 -0
- package/src/components/titan-layout/titan-layout.module.less.d.ts +13 -0
- package/src/components/titan-layout/titan-layout.stories.tsx +194 -0
- package/src/components/titan-layout/titan-layout.tsx +272 -0
- package/src/components/titan-layout/with-tooltip.tsx +16 -0
- package/src/index.ts +2 -1
- package/src/test/data.tsx +3 -2
- package/src/utils/navigation-legacy.ts +3 -1
- package/src/utils/use-breakpoint.ts +19 -0
|
@@ -3,7 +3,7 @@ import SvgGroupCollapse from '@servicetitan/anvil2/assets/icons/material/round/e
|
|
|
3
3
|
import SvgGroupExpand from '@servicetitan/anvil2/assets/icons/material/round/expand_more.svg';
|
|
4
4
|
|
|
5
5
|
import classNames from 'classnames';
|
|
6
|
-
import { FC, Fragment } from 'react';
|
|
6
|
+
import { FC, Fragment, MouseEvent } from 'react';
|
|
7
7
|
import { NavigationItemData } from '../../utils/navigation';
|
|
8
8
|
import { BadgeTag, BadgeTagProps } from '../badge-tag';
|
|
9
9
|
import { SideNavigationTriggerProps } from './interface';
|
|
@@ -14,6 +14,7 @@ export interface InternalSideNavigationItemContentProps
|
|
|
14
14
|
extends Omit<NavigationItemData, 'iconName' | 'to' | 'counter' | 'tag'> {
|
|
15
15
|
submenuExpanded: boolean | undefined;
|
|
16
16
|
tag: BadgeTagProps | undefined;
|
|
17
|
+
onExpandToggle?: (e: MouseEvent<never>) => void;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
export const InternalSideNavigationItemContent: FC<InternalSideNavigationItemContentProps> = ({
|
|
@@ -24,6 +25,7 @@ export const InternalSideNavigationItemContent: FC<InternalSideNavigationItemCon
|
|
|
24
25
|
tag,
|
|
25
26
|
title,
|
|
26
27
|
submenuExpanded,
|
|
28
|
+
onExpandToggle,
|
|
27
29
|
}) => (
|
|
28
30
|
<Fragment>
|
|
29
31
|
<div className={Styles.navigationItemIconWrapper}>
|
|
@@ -65,10 +67,17 @@ export const InternalSideNavigationItemContent: FC<InternalSideNavigationItemCon
|
|
|
65
67
|
/>
|
|
66
68
|
)}
|
|
67
69
|
{typeof submenuExpanded === 'boolean' && (
|
|
68
|
-
<
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
<div className={Styles.navigationItemGroupToggleWrapper}>
|
|
71
|
+
<Icon
|
|
72
|
+
svg={submenuExpanded ? SvgGroupCollapse : SvgGroupExpand}
|
|
73
|
+
className={Styles.navigationItemGroupToggle}
|
|
74
|
+
onClick={onExpandToggle}
|
|
75
|
+
/>
|
|
76
|
+
<div
|
|
77
|
+
className={Styles.navigationItemGroupToggleClick}
|
|
78
|
+
onClick={onExpandToggle}
|
|
79
|
+
/>
|
|
80
|
+
</div>
|
|
72
81
|
)}
|
|
73
82
|
</div>
|
|
74
83
|
|
|
@@ -89,6 +98,7 @@ export interface InternalSideNavigationLinkProps
|
|
|
89
98
|
submenuExpanded: boolean | undefined;
|
|
90
99
|
dataPrefix?: string;
|
|
91
100
|
tag: BadgeTagProps | undefined;
|
|
101
|
+
onExpandToggle?: (e: MouseEvent<never>) => void;
|
|
92
102
|
}
|
|
93
103
|
|
|
94
104
|
export const internalNavigationContentContainerProps = ({
|
|
@@ -116,6 +126,7 @@ export const InternalSideNavigationLink: FC<InternalSideNavigationLinkProps> = (
|
|
|
116
126
|
isActive,
|
|
117
127
|
navigationComponent: NavigationComponent,
|
|
118
128
|
submenuExpanded,
|
|
129
|
+
onExpandToggle,
|
|
119
130
|
...props
|
|
120
131
|
}) => {
|
|
121
132
|
return (
|
|
@@ -130,7 +141,11 @@ export const InternalSideNavigationLink: FC<InternalSideNavigationLinkProps> = (
|
|
|
130
141
|
isActive={typeof isActive === 'function' ? isActive : undefined}
|
|
131
142
|
activeClassName={Styles.navigationItemActive}
|
|
132
143
|
>
|
|
133
|
-
<InternalSideNavigationItemContent
|
|
144
|
+
<InternalSideNavigationItemContent
|
|
145
|
+
submenuExpanded={submenuExpanded}
|
|
146
|
+
onExpandToggle={onExpandToggle}
|
|
147
|
+
{...props}
|
|
148
|
+
/>
|
|
134
149
|
</NavigationComponent>
|
|
135
150
|
);
|
|
136
151
|
};
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
} from './side-navigation-links-internal';
|
|
12
12
|
|
|
13
13
|
const WrappedLink: FC<{
|
|
14
|
-
children: ReactElement
|
|
14
|
+
children: ReactElement<any>;
|
|
15
15
|
wrapper: NonNullable<SideNavigationLinkProps['wrapper']>;
|
|
16
16
|
}> = ({ children, wrapper: WrapperComponent }) => {
|
|
17
17
|
return (
|
|
@@ -246,9 +246,24 @@
|
|
|
246
246
|
min-height: 12px !important;
|
|
247
247
|
}
|
|
248
248
|
|
|
249
|
-
.navigation-item-group-toggle
|
|
250
|
-
|
|
251
|
-
|
|
249
|
+
.navigation-item-group-toggle-wrapper {
|
|
250
|
+
position: relative;
|
|
251
|
+
display: flex;
|
|
252
|
+
justify-content: center;
|
|
253
|
+
align-items: center;
|
|
254
|
+
|
|
255
|
+
.navigation-item-group-toggle[data-anv][data-anv] {
|
|
256
|
+
color: inherit;
|
|
257
|
+
font-weight: @font-weight-semibold;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.navigation-item-group-toggle-click {
|
|
261
|
+
position: absolute;
|
|
262
|
+
left: -@spacing-2;
|
|
263
|
+
right: -@spacing-half;
|
|
264
|
+
top: -@spacing-1;
|
|
265
|
+
bottom: -@spacing-1;
|
|
266
|
+
}
|
|
252
267
|
}
|
|
253
268
|
|
|
254
269
|
.navigation-icon[data-anv][data-anv] {
|
|
@@ -266,24 +281,11 @@
|
|
|
266
281
|
.navigation-group-wrapper {
|
|
267
282
|
.navigation-group-item {
|
|
268
283
|
position: relative;
|
|
269
|
-
|
|
270
|
-
.navigation-group-item-collapse {
|
|
271
|
-
display: none;
|
|
272
|
-
position: absolute;
|
|
273
|
-
inset: 0;
|
|
274
|
-
cursor: pointer;
|
|
275
|
-
}
|
|
276
284
|
}
|
|
277
285
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
.submenu-wrapper:not(.submenu-wrapper-collapsed) {
|
|
284
|
-
max-height: 2000px;
|
|
285
|
-
transition: max-height 0.7s ease-in-out;
|
|
286
|
-
}
|
|
286
|
+
.submenu-wrapper:not(.submenu-wrapper-collapsed) {
|
|
287
|
+
max-height: 2000px;
|
|
288
|
+
transition: max-height 0.7s ease-in-out;
|
|
287
289
|
}
|
|
288
290
|
}
|
|
289
291
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export const __esModule: true;
|
|
2
2
|
export const divider: string;
|
|
3
3
|
export const navigationGroupItem: string;
|
|
4
|
-
export const navigationGroupItemCollapse: string;
|
|
5
4
|
export const navigationGroupWrapper: string;
|
|
6
5
|
export const navigationIcon: string;
|
|
7
6
|
export const navigationIconActive: string;
|
|
@@ -11,6 +10,8 @@ export const navigationItemActive: string;
|
|
|
11
10
|
export const navigationItemCounter: string;
|
|
12
11
|
export const navigationItemCounterLong: string;
|
|
13
12
|
export const navigationItemGroupToggle: string;
|
|
13
|
+
export const navigationItemGroupToggleClick: string;
|
|
14
|
+
export const navigationItemGroupToggleWrapper: string;
|
|
14
15
|
export const navigationItemIconSwitch: string;
|
|
15
16
|
export const navigationItemIconWrapper: string;
|
|
16
17
|
export const navigationItemTextCollapsed: string;
|
|
@@ -371,13 +371,20 @@ const SideNavigationGroupItem: FC<
|
|
|
371
371
|
onExpandedChange: undefined | ((expanded: SideNavigationExpandedState) => void);
|
|
372
372
|
}
|
|
373
373
|
> = ({ onExpandedChange, isGroupActive, ...props }) => {
|
|
374
|
-
const isSubmenuExpanded = !!props.id &&
|
|
375
|
-
const
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
374
|
+
const isSubmenuExpanded = !!props.id && props.expanded?.expandedSubmenu === props.id;
|
|
375
|
+
const onExpandToggle = useCallback(
|
|
376
|
+
(e: MouseEvent<never>) => {
|
|
377
|
+
e.preventDefault();
|
|
378
|
+
e.stopPropagation();
|
|
379
|
+
|
|
380
|
+
onExpandedChange?.({
|
|
381
|
+
bar: true,
|
|
382
|
+
expandedSubmenu: isSubmenuExpanded ? undefined : props.id,
|
|
383
|
+
});
|
|
384
|
+
},
|
|
385
|
+
[props.id, isSubmenuExpanded, onExpandedChange]
|
|
386
|
+
);
|
|
387
|
+
|
|
381
388
|
const tag = getSubmenuGroupTag(props.submenu, getCounterTag(props.counter, props.tag));
|
|
382
389
|
const context = useContext(SideNavigationContext);
|
|
383
390
|
|
|
@@ -387,9 +394,9 @@ const SideNavigationGroupItem: FC<
|
|
|
387
394
|
<InternalSideNavigationLink
|
|
388
395
|
{...props}
|
|
389
396
|
submenuExpanded={isSubmenuExpanded}
|
|
397
|
+
onExpandToggle={onExpandToggle}
|
|
390
398
|
tag={tag}
|
|
391
399
|
/>
|
|
392
|
-
<div className={Styles.navigationGroupItemCollapse} onClick={triggerClick} />
|
|
393
400
|
</div>
|
|
394
401
|
<div
|
|
395
402
|
className={classNames(Styles.submenuWrapper, {
|
package/src/components/links.tsx
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { FC
|
|
2
|
-
import { NavigationLegacyContext } from '../utils/navigation-context';
|
|
1
|
+
import { FC } from 'react';
|
|
3
2
|
import {
|
|
4
3
|
HeaderNavigationLinkProps,
|
|
5
4
|
HeaderNavigationTriggerProps,
|
|
@@ -8,27 +7,48 @@ import {
|
|
|
8
7
|
HeaderNavigationLink as HeaderNavigationLinkLegacy,
|
|
9
8
|
HeaderNavigationTrigger as HeaderNavigationTriggerLegacy,
|
|
10
9
|
} from './header-navigation/header-navigation-links';
|
|
10
|
+
import { useTitanLayoutPlacementContext } from './titan-layout';
|
|
11
11
|
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
} from './
|
|
12
|
+
LayoutHeaderNavigationLink,
|
|
13
|
+
LayoutHeaderNavigationTrigger,
|
|
14
|
+
} from './titan-layout/layout-header-links';
|
|
15
|
+
import {
|
|
16
|
+
TitanLayoutSidebarLink,
|
|
17
|
+
TitanLayoutSidebarTrigger,
|
|
18
|
+
} from './titan-layout/layout-sidebar-links';
|
|
15
19
|
|
|
16
20
|
export const HeaderNavigationLink: FC<HeaderNavigationLinkProps> = props => {
|
|
17
|
-
const
|
|
21
|
+
const placement = useTitanLayoutPlacementContext();
|
|
18
22
|
|
|
19
|
-
return
|
|
20
|
-
<
|
|
23
|
+
return placement === 'top' ? (
|
|
24
|
+
<LayoutHeaderNavigationLink {...props} />
|
|
25
|
+
) : placement === 'side' ? (
|
|
26
|
+
<TitanLayoutSidebarLink
|
|
27
|
+
id={props.id}
|
|
28
|
+
icon={props.icon}
|
|
29
|
+
iconActive={props.iconActive}
|
|
30
|
+
to={props.to}
|
|
31
|
+
title={props.title}
|
|
32
|
+
counter={props.counter}
|
|
33
|
+
/>
|
|
21
34
|
) : (
|
|
22
|
-
<
|
|
35
|
+
<HeaderNavigationLinkLegacy {...props} />
|
|
23
36
|
);
|
|
24
37
|
};
|
|
25
38
|
|
|
26
39
|
export const HeaderNavigationTrigger: FC<HeaderNavigationTriggerProps> = props => {
|
|
27
|
-
const
|
|
40
|
+
const placement = useTitanLayoutPlacementContext();
|
|
28
41
|
|
|
29
|
-
return
|
|
30
|
-
<
|
|
42
|
+
return placement === 'top' ? (
|
|
43
|
+
<LayoutHeaderNavigationTrigger {...props} />
|
|
44
|
+
) : placement === 'side' ? (
|
|
45
|
+
<TitanLayoutSidebarTrigger
|
|
46
|
+
id={props.id}
|
|
47
|
+
title={props.title}
|
|
48
|
+
icon={props.icon}
|
|
49
|
+
iconActive={props.iconActive}
|
|
50
|
+
/>
|
|
31
51
|
) : (
|
|
32
|
-
<
|
|
52
|
+
<HeaderNavigationTriggerLegacy {...props} />
|
|
33
53
|
);
|
|
34
54
|
};
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { FC } from 'react';
|
|
2
2
|
|
|
3
3
|
/* tslint:disable: max-line-length */
|
|
4
|
-
export const LogoCompanyTitle: FC<{
|
|
5
|
-
className
|
|
6
|
-
fill
|
|
7
|
-
size
|
|
8
|
-
|
|
4
|
+
export const LogoCompanyTitle: FC<{
|
|
5
|
+
className?: string;
|
|
6
|
+
fill?: string;
|
|
7
|
+
size?: string;
|
|
8
|
+
height?: string | number;
|
|
9
|
+
}> = ({ className, fill = 'currentColor', size = '162', height }) => {
|
|
9
10
|
return (
|
|
10
11
|
<svg
|
|
11
12
|
className={className}
|
|
12
|
-
width={size}
|
|
13
|
+
width={height ? undefined : size}
|
|
14
|
+
height={height}
|
|
13
15
|
viewBox="0 0 322 80"
|
|
14
16
|
xmlns="http://www.w3.org/2000/svg"
|
|
15
17
|
>
|
|
@@ -21,9 +21,9 @@ export const ProfileDropdownDefault = () => (
|
|
|
21
21
|
<ProfileDropdown.Link id="first" to="https://google.com">
|
|
22
22
|
first link
|
|
23
23
|
</ProfileDropdown.Link>
|
|
24
|
-
<ProfileDropdown.
|
|
24
|
+
<ProfileDropdown.Section id="second" onClick={() => alert('second click')}>
|
|
25
25
|
second link
|
|
26
|
-
</ProfileDropdown.
|
|
26
|
+
</ProfileDropdown.Section>
|
|
27
27
|
<ProfileDropdown.Divider />
|
|
28
28
|
<ProfileDropdown.Section id="content">some content</ProfileDropdown.Section>
|
|
29
29
|
<ProfileDropdown.Divider />
|
|
@@ -45,9 +45,9 @@ export const ProfileDropdownWithLogo = () => (
|
|
|
45
45
|
<ProfileDropdown.Link id="first" to="https://google.com">
|
|
46
46
|
first link
|
|
47
47
|
</ProfileDropdown.Link>
|
|
48
|
-
<ProfileDropdown.
|
|
48
|
+
<ProfileDropdown.Section id="second" onClick={() => alert('second click')}>
|
|
49
49
|
second link
|
|
50
|
-
</ProfileDropdown.
|
|
50
|
+
</ProfileDropdown.Section>
|
|
51
51
|
</ProfileDropdown>
|
|
52
52
|
);
|
|
53
53
|
|
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
} from '../../utils/navigation-context';
|
|
26
26
|
import { getCounterTag } from '../../utils/side-nav';
|
|
27
27
|
import { CounterTag } from '../counter-tag';
|
|
28
|
+
import { withTooltip } from '../titan-layout/with-tooltip';
|
|
28
29
|
import * as Styles from './profile-dropdown.module.less';
|
|
29
30
|
import { ProfileLogo } from './profile-icon';
|
|
30
31
|
|
|
@@ -149,11 +150,12 @@ const ProfileDropdownTrigger: FC<ProfileDropdownTriggerProps> = ({
|
|
|
149
150
|
export interface ProfileDropdownSectionPropsStrict {
|
|
150
151
|
children: ReactNode;
|
|
151
152
|
id: string;
|
|
153
|
+
tooltip?: string;
|
|
152
154
|
className?: string;
|
|
153
155
|
onClick?(e: MouseEvent): void;
|
|
154
156
|
}
|
|
155
157
|
|
|
156
|
-
interface ProfileDropdownSectionProps extends ProfileDropdownSectionPropsStrict {
|
|
158
|
+
export interface ProfileDropdownSectionProps extends ProfileDropdownSectionPropsStrict {
|
|
157
159
|
[key: string]: any;
|
|
158
160
|
}
|
|
159
161
|
|
|
@@ -161,6 +163,7 @@ export const ProfileDropdownSection: FC<ProfileDropdownSectionProps> = ({
|
|
|
161
163
|
children,
|
|
162
164
|
className,
|
|
163
165
|
id,
|
|
166
|
+
tooltip,
|
|
164
167
|
onClick,
|
|
165
168
|
...rest
|
|
166
169
|
}) => {
|
|
@@ -172,16 +175,20 @@ export const ProfileDropdownSection: FC<ProfileDropdownSectionProps> = ({
|
|
|
172
175
|
}
|
|
173
176
|
};
|
|
174
177
|
|
|
175
|
-
return (
|
|
178
|
+
return withTooltip(
|
|
176
179
|
<div
|
|
177
|
-
className={classNames(Styles.dropdownSection, className
|
|
180
|
+
className={classNames(Styles.dropdownSection, className, {
|
|
181
|
+
'cursor-pointer': !!onClick,
|
|
182
|
+
})}
|
|
178
183
|
onClick={clickHandler}
|
|
179
184
|
data-cy={`profile-dropdown-section-${id}`}
|
|
180
185
|
data-pendo={`profile-dropdown-section-${id}`}
|
|
181
186
|
{...rest}
|
|
182
187
|
>
|
|
183
188
|
{children}
|
|
184
|
-
</div
|
|
189
|
+
</div>,
|
|
190
|
+
tooltip,
|
|
191
|
+
'left'
|
|
185
192
|
);
|
|
186
193
|
};
|
|
187
194
|
|
|
@@ -193,10 +200,10 @@ export interface ProfileDropdownLinkPropsStrict {
|
|
|
193
200
|
className?: string;
|
|
194
201
|
external?: boolean;
|
|
195
202
|
target?: HTMLAttributeAnchorTarget;
|
|
196
|
-
|
|
203
|
+
tooltip?: string;
|
|
204
|
+
to: string;
|
|
197
205
|
tag?: CounterTagData;
|
|
198
206
|
counter?: CounterTagValue;
|
|
199
|
-
onClick?: () => void;
|
|
200
207
|
}
|
|
201
208
|
|
|
202
209
|
export interface ProfileDropdownLinkProps extends ProfileDropdownLinkPropsStrict {
|
|
@@ -212,16 +219,12 @@ export const ProfileDropdownLink: FC<ProfileDropdownLinkProps> = ({
|
|
|
212
219
|
tag,
|
|
213
220
|
target,
|
|
214
221
|
to,
|
|
222
|
+
tooltip,
|
|
215
223
|
onClick,
|
|
216
224
|
...rest
|
|
217
225
|
}: ProfileDropdownLinkProps) => {
|
|
218
226
|
const NavigationComponent = useContext(NavigationComponentContext);
|
|
219
227
|
|
|
220
|
-
const clickHandler = (e: MouseEvent<any>) => {
|
|
221
|
-
e.preventDefault();
|
|
222
|
-
onClick?.();
|
|
223
|
-
};
|
|
224
|
-
|
|
225
228
|
const isExternalLink = external ?? to?.startsWith('http');
|
|
226
229
|
|
|
227
230
|
const tagElement = useMemo(
|
|
@@ -229,41 +232,34 @@ export const ProfileDropdownLink: FC<ProfileDropdownLinkProps> = ({
|
|
|
229
232
|
[counter, tag]
|
|
230
233
|
);
|
|
231
234
|
|
|
232
|
-
return
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
data-cy={`profile-dropdown-link-${id}`}
|
|
261
|
-
data-pendo={`profile-dropdown-link-${id}`}
|
|
262
|
-
{...rest}
|
|
263
|
-
>
|
|
264
|
-
{children}
|
|
265
|
-
{tagElement}
|
|
266
|
-
</a>
|
|
235
|
+
return withTooltip(
|
|
236
|
+
isExternalLink ? (
|
|
237
|
+
<a
|
|
238
|
+
className={classNames(Styles.dropdownSection, Styles.dropdownLink, className)}
|
|
239
|
+
href={to}
|
|
240
|
+
target={target}
|
|
241
|
+
data-cy={`profile-dropdown-link-${id}`}
|
|
242
|
+
data-pendo={`profile-dropdown-link-${id}`}
|
|
243
|
+
{...rest}
|
|
244
|
+
>
|
|
245
|
+
{children}
|
|
246
|
+
{tagElement}
|
|
247
|
+
</a>
|
|
248
|
+
) : (
|
|
249
|
+
<NavigationComponent
|
|
250
|
+
className={classNames(Styles.dropdownSection, Styles.dropdownLink, className)}
|
|
251
|
+
target={target}
|
|
252
|
+
to={to}
|
|
253
|
+
data-cy={`profile-dropdown-link-${id}`}
|
|
254
|
+
data-pendo={`profile-dropdown-link-${id}`}
|
|
255
|
+
{...rest}
|
|
256
|
+
>
|
|
257
|
+
{children}
|
|
258
|
+
{tagElement}
|
|
259
|
+
</NavigationComponent>
|
|
260
|
+
),
|
|
261
|
+
tooltip,
|
|
262
|
+
'left'
|
|
267
263
|
);
|
|
268
264
|
};
|
|
269
265
|
|
|
@@ -291,6 +287,7 @@ export interface ProfileDropdownProps extends ProfileDropdownPropsStrict {
|
|
|
291
287
|
export interface ProfileDropdownType extends FC<ProfileDropdownProps> {
|
|
292
288
|
Divider: typeof ProfileDropdownDivider;
|
|
293
289
|
Link: typeof ProfileDropdownLink;
|
|
290
|
+
Trigger: typeof ProfileDropdownTrigger;
|
|
294
291
|
Section: typeof ProfileDropdownSection;
|
|
295
292
|
}
|
|
296
293
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { FC, ReactElement } from 'react';
|
|
2
|
+
import { NavigationItemData } from '../../utils/navigation';
|
|
3
|
+
import { TitanLayoutSidebarContextType } from './layout-context';
|
|
4
|
+
|
|
5
|
+
export interface TitanLayoutSidebarLinkWrapperProps {
|
|
6
|
+
children:
|
|
7
|
+
| ReactElement<TitanLayoutSidebarLinkProps>
|
|
8
|
+
| ReactElement<TitanLayoutSidebarTriggerProps>;
|
|
9
|
+
context: TitanLayoutSidebarContextType;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface TitanLayoutSidebarLinkProps extends Omit<NavigationItemData, 'submenu'> {
|
|
13
|
+
wrapper?: FC<TitanLayoutSidebarLinkWrapperProps>;
|
|
14
|
+
}
|
|
15
|
+
export interface TitanLayoutSidebarTriggerProps
|
|
16
|
+
extends Omit<TitanLayoutSidebarLinkProps, 'to' | 'isActive'> {
|
|
17
|
+
isActive?: boolean;
|
|
18
|
+
wrapper?: FC<TitanLayoutSidebarLinkWrapperProps>;
|
|
19
|
+
onClick?: () => void;
|
|
20
|
+
onMobileClick?: () => void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface TitanLayoutState {
|
|
24
|
+
navCollapsed: boolean;
|
|
25
|
+
submenuExpanded?: string;
|
|
26
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { CSSProperties, FC, createContext, useContext } from 'react';
|
|
2
|
+
import { DefaultNavLinkComponent, NavLinkComponentProps } from '../../utils/navigation-context';
|
|
3
|
+
import { TitanBreakpoint } from '../../utils/use-breakpoint';
|
|
4
|
+
|
|
5
|
+
export interface TitanLayoutSidebarContextType {
|
|
6
|
+
styles: {
|
|
7
|
+
popoverContent: CSSProperties;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export type TitanLayoutPlacement = 'top' | 'side' | 'unset';
|
|
12
|
+
|
|
13
|
+
export interface TitanLayoutContextType {
|
|
14
|
+
NavigationComponent: FC<NavLinkComponentProps>;
|
|
15
|
+
breakpoint: TitanBreakpoint;
|
|
16
|
+
isTitanLayout: boolean;
|
|
17
|
+
sidebar: TitanLayoutSidebarContextType;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const LayoutContext = createContext<TitanLayoutContextType>({
|
|
21
|
+
NavigationComponent: DefaultNavLinkComponent,
|
|
22
|
+
breakpoint: { name: 'lg', isMobile: false },
|
|
23
|
+
isTitanLayout: false,
|
|
24
|
+
sidebar: { styles: { popoverContent: {} } },
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
export const useTitanLayoutContext = () => useContext(LayoutContext);
|
|
28
|
+
|
|
29
|
+
export const LayoutPlacementContext = createContext<TitanLayoutPlacement | undefined>(undefined);
|
|
30
|
+
export const useTitanLayoutPlacementContext = () => useContext(LayoutPlacementContext);
|