datastake-daf 0.6.501 → 0.6.503
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/layouts/index.css +1 -0
- package/dist/layouts/index.js +7137 -0
- package/dist/utils/index.js +287 -0
- package/package.json +1 -1
- package/rollup.config.js +25 -0
- package/src/@daf/hooks/usePermissions.js +20 -0
- package/src/@daf/layouts/AppLayout/AppLayout.stories.js +532 -0
- package/src/@daf/layouts/AppLayout/components/LoginPopup/index.js +116 -0
- package/src/@daf/layouts/AppLayout/components/LoginPopup/style.js +26 -0
- package/src/@daf/layouts/AppLayout/components/MobileDrawer/index.js +208 -0
- package/src/@daf/layouts/AppLayout/components/MobileDrawer/style.js +87 -0
- package/src/@daf/layouts/AppLayout/components/Notifications/Notification/index.js +31 -0
- package/src/@daf/layouts/AppLayout/components/Notifications/NotificationHistory/index.js +22 -0
- package/src/@daf/layouts/AppLayout/components/Notifications/context/index.js +79 -0
- package/src/@daf/layouts/AppLayout/components/Notifications/index.js +106 -0
- package/src/@daf/layouts/AppLayout/components/Notifications/style.js +61 -0
- package/src/@daf/layouts/AppLayout/components/Notifications/useNotifications.js +105 -0
- package/src/@daf/layouts/AppLayout/components/Sidenav/index.js +296 -0
- package/src/@daf/layouts/AppLayout/components/UserDropdown/UserIcon.js +96 -0
- package/src/@daf/layouts/AppLayout/components/UserDropdown/index.js +112 -0
- package/src/@daf/layouts/AppLayout/index.jsx +384 -0
- package/src/@daf/layouts/AppLayout/index.scss +5 -0
- package/src/@daf/layouts/AppLayout/styles/header.scss +257 -0
- package/src/@daf/layouts/AppLayout/styles/layout.scss +76 -0
- package/src/@daf/layouts/AppLayout/styles/responsive.scss +52 -0
- package/src/@daf/layouts/AppLayout/styles/sidebar.scss +79 -0
- package/src/@daf/layouts/AppLayout/styles/variables.scss +22 -0
- package/src/helpers/theme.js +304 -0
- package/src/helpers/user.js +4 -0
- package/src/layouts.js +1 -0
- package/src/utils.js +4 -2
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/* eslint-disable react/prop-types */
|
|
2
|
+
import React, { useState, useEffect, useMemo, useRef } from "react";
|
|
3
|
+
import { formatClassname } from '../../../../../helpers/ClassesHelper.js';
|
|
4
|
+
import DAFSidenav, { useMenu } from "../../../../core/components/Sidenav/index.jsx";
|
|
5
|
+
import SidenavMenu from "../../../../core/components/Sidenav/Menu.jsx";
|
|
6
|
+
|
|
7
|
+
const open = false;
|
|
8
|
+
const menuMode = 'inline';
|
|
9
|
+
const DEFAULT_WIDTH = 200;
|
|
10
|
+
|
|
11
|
+
const PageInterface = ({ isCollapsed, onClick, title, children }) => {
|
|
12
|
+
return (
|
|
13
|
+
<div className={formatClassname(['mod-name', isCollapsed ? 'is-collapsed' : 'not-collapsed'])}>
|
|
14
|
+
<div className="icon cursor-pointer" onClick={onClick}>
|
|
15
|
+
<div className="icon">
|
|
16
|
+
{children}
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
{isCollapsed ? null : <h1>{title}</h1>}
|
|
20
|
+
</div>
|
|
21
|
+
);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const renderModule = ({
|
|
25
|
+
isCollapsed,
|
|
26
|
+
onClick,
|
|
27
|
+
user,
|
|
28
|
+
userHelpers = {}
|
|
29
|
+
}) => {
|
|
30
|
+
const { userIsAdmin, userIsSbgImplementor, userIsSbgPartner } = userHelpers;
|
|
31
|
+
|
|
32
|
+
const isAdmin = userIsAdmin?.(user);
|
|
33
|
+
const hasStandardInterface = userIsSbgImplementor?.(user);
|
|
34
|
+
const hasPartnerInterface = userIsSbgPartner?.(user);
|
|
35
|
+
|
|
36
|
+
if (isAdmin) {
|
|
37
|
+
return (
|
|
38
|
+
<PageInterface
|
|
39
|
+
isCollapsed={isCollapsed}
|
|
40
|
+
onClick={onClick}
|
|
41
|
+
title="ADMIN"
|
|
42
|
+
>
|
|
43
|
+
<svg viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" width="14" height="14">
|
|
44
|
+
<path d="M9.03367 5H2.66667C1.74619 5 1 4.25381 1 3.33333C1 2.41286 1.74619 1.66667 2.66667 1.66667H9.03367M4.96633 12.3333H11.3333C12.2538 12.3333 13 11.5871 13 10.6667C13 9.74619 12.2538 9 11.3333 9H4.96633M1 10.6667C1 11.9553 2.04467 13 3.33333 13C4.622 13 5.66667 11.9553 5.66667 10.6667C5.66667 9.378 4.622 8.33333 3.33333 8.33333C2.04467 8.33333 1 9.378 1 10.6667ZM13 3.33333C13 4.622 11.9553 5.66667 10.6667 5.66667C9.378 5.66667 8.33333 4.622 8.33333 3.33333C8.33333 2.04467 9.378 1 10.6667 1C11.9553 1 13 2.04467 13 3.33333Z" stroke="#B9C0D4" strokeWidth="1.2" strokeLinecap="round" strokeLinejoin="round"></path>
|
|
45
|
+
</svg>
|
|
46
|
+
</PageInterface>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (hasStandardInterface) {
|
|
51
|
+
return (
|
|
52
|
+
<PageInterface
|
|
53
|
+
isCollapsed={isCollapsed}
|
|
54
|
+
onClick={onClick}
|
|
55
|
+
title="Implementer"
|
|
56
|
+
>
|
|
57
|
+
<img src="/assets/images/SVG/implementer.svg" alt="implementer" />
|
|
58
|
+
</PageInterface>
|
|
59
|
+
);
|
|
60
|
+
} else if (hasPartnerInterface) {
|
|
61
|
+
return (
|
|
62
|
+
<PageInterface
|
|
63
|
+
isCollapsed={isCollapsed}
|
|
64
|
+
onClick={onClick}
|
|
65
|
+
title="Partner"
|
|
66
|
+
>
|
|
67
|
+
<img src="/assets/images/SVG/partner-building.svg" alt="partner" />
|
|
68
|
+
</PageInterface>
|
|
69
|
+
);
|
|
70
|
+
} else if (!hasStandardInterface) {
|
|
71
|
+
return (
|
|
72
|
+
<PageInterface
|
|
73
|
+
isCollapsed={isCollapsed}
|
|
74
|
+
onClick={onClick}
|
|
75
|
+
title="Coordinator"
|
|
76
|
+
>
|
|
77
|
+
<img src="/assets/images/SVG/coordinator.svg" alt="coordinator" />
|
|
78
|
+
</PageInterface>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const Sidenav = ({
|
|
84
|
+
user,
|
|
85
|
+
module,
|
|
86
|
+
isCollapsed = false,
|
|
87
|
+
showMenu = true,
|
|
88
|
+
sidenavConfig = {},
|
|
89
|
+
navigate,
|
|
90
|
+
location,
|
|
91
|
+
matchPath,
|
|
92
|
+
t,
|
|
93
|
+
changeNotificationState,
|
|
94
|
+
userHelpers = {},
|
|
95
|
+
isDev = false,
|
|
96
|
+
appName = 'app',
|
|
97
|
+
}) => {
|
|
98
|
+
const hoverDiv = useRef();
|
|
99
|
+
const hoverDivSecond = useRef();
|
|
100
|
+
const items = useMemo(() => sidenavConfig[module] || [], [sidenavConfig, module]);
|
|
101
|
+
const [selectedKeys, setSelectedKeys] = useState([]);
|
|
102
|
+
const [topHover, setTopHover] = useState(-100);
|
|
103
|
+
const [topHoverSecond, setTopHoverSecond] = useState(-100);
|
|
104
|
+
const [widthHoverSecond, setWidthHoverSecond] = useState(DEFAULT_WIDTH);
|
|
105
|
+
const [hoverOpen, setHoverOpen] = useState(false);
|
|
106
|
+
const [hoverItem, setHoverItem] = useState(null);
|
|
107
|
+
const [hoverItemSecond, setHoverItemSecond] = useState(null);
|
|
108
|
+
const { pathname } = location || {};
|
|
109
|
+
|
|
110
|
+
const mod = useMemo(() => module, [module, user]);
|
|
111
|
+
|
|
112
|
+
const getRedirectLink = (link) => {
|
|
113
|
+
// Simple redirect link logic - can be customized
|
|
114
|
+
if (window.location.pathname.includes(`/${appName}`)) {
|
|
115
|
+
return `/${appName}${link}`;
|
|
116
|
+
}
|
|
117
|
+
return link;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
const checkPath = (i) => {
|
|
121
|
+
if (!matchPath || !pathname) return false;
|
|
122
|
+
|
|
123
|
+
return (matchPath({
|
|
124
|
+
path: getRedirectLink(i.path),
|
|
125
|
+
exact: true,
|
|
126
|
+
}, pathname) || (i.subPath && i.subPath.filter(s => matchPath({
|
|
127
|
+
path: getRedirectLink(s),
|
|
128
|
+
exact: true,
|
|
129
|
+
}, pathname)).length)) ? true : false;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
useEffect(() => {
|
|
133
|
+
setHoverItem(null);
|
|
134
|
+
setHoverOpen(false);
|
|
135
|
+
setHoverItemSecond(null);
|
|
136
|
+
setTopHover(-100);
|
|
137
|
+
setTopHoverSecond(-100);
|
|
138
|
+
setWidthHoverSecond(DEFAULT_WIDTH);
|
|
139
|
+
}, [isCollapsed]);
|
|
140
|
+
|
|
141
|
+
function notApprovedModal() { }
|
|
142
|
+
|
|
143
|
+
const onMouseMove = (event) => {
|
|
144
|
+
let insideMain = false;
|
|
145
|
+
|
|
146
|
+
if (hoverDiv.current) {
|
|
147
|
+
const divRect = hoverDiv.current.getBoundingClientRect();
|
|
148
|
+
const isInside = event.clientX >= divRect.left && event.clientX <= divRect.right &&
|
|
149
|
+
event.clientY >= divRect.top && event.clientY <= divRect.bottom;
|
|
150
|
+
insideMain = isInside;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (!insideMain && hoverDivSecond.current) {
|
|
154
|
+
const divRect = hoverDivSecond.current.getBoundingClientRect();
|
|
155
|
+
const isInside = event.clientX >= divRect.left && event.clientX <= divRect.right &&
|
|
156
|
+
event.clientY >= divRect.top && event.clientY <= divRect.bottom;
|
|
157
|
+
if (!isInside) {
|
|
158
|
+
setHoverItemSecond(null);
|
|
159
|
+
document.removeEventListener('mousemove', onMouseMove);
|
|
160
|
+
setHoverItem(null);
|
|
161
|
+
setHoverOpen(false);
|
|
162
|
+
setTopHover(-100);
|
|
163
|
+
setTopHoverSecond(-100);
|
|
164
|
+
setWidthHoverSecond(DEFAULT_WIDTH);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
const checkOnClick = ({ event }) => {
|
|
170
|
+
changeNotificationState({ onYes: event });
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const { hoverContent, hoverContentSecond } = useMenu({
|
|
174
|
+
checkOnClick,
|
|
175
|
+
hoverItem,
|
|
176
|
+
t,
|
|
177
|
+
user,
|
|
178
|
+
pathname,
|
|
179
|
+
setHoverItem,
|
|
180
|
+
setHoverItemSecond,
|
|
181
|
+
setTopHover,
|
|
182
|
+
setTopHoverSecond,
|
|
183
|
+
setWidthHoverSecond,
|
|
184
|
+
onMouseMove,
|
|
185
|
+
setHoverOpen,
|
|
186
|
+
module,
|
|
187
|
+
notApprovedModal,
|
|
188
|
+
goTo: navigate,
|
|
189
|
+
hoverItemSecond,
|
|
190
|
+
isDev,
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
const filteredItems = useMemo(() => {
|
|
194
|
+
const mapItems = (item) => {
|
|
195
|
+
const isDisabled = typeof item.isDisabled === 'function' ?
|
|
196
|
+
item.isDisabled(user)
|
|
197
|
+
: item.isDisabled || false;
|
|
198
|
+
|
|
199
|
+
if (item.items) {
|
|
200
|
+
return {
|
|
201
|
+
...item,
|
|
202
|
+
isDisabled,
|
|
203
|
+
items: item.items.filter((item) => {
|
|
204
|
+
const res = typeof item.visible === 'function' ? item.visible(user) : true;
|
|
205
|
+
return res;
|
|
206
|
+
}).map(mapItems)
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return { ...item, isDisabled };
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
return items
|
|
214
|
+
.filter(item => {
|
|
215
|
+
const res = typeof item.visible === 'function' ? item.visible(user) : true;
|
|
216
|
+
return res;
|
|
217
|
+
})
|
|
218
|
+
.map(mapItems);
|
|
219
|
+
}, [items, user, pathname]);
|
|
220
|
+
|
|
221
|
+
useEffect(() => {
|
|
222
|
+
const selectedItem = filteredItems
|
|
223
|
+
.filter((d) => !d.isDisabled)
|
|
224
|
+
.find(i => i.items ? i.items.filter(ii => !ii.isDisabled && checkPath(ii)).length > 0 : checkPath(i));
|
|
225
|
+
|
|
226
|
+
if (selectedItem) {
|
|
227
|
+
if (selectedItem.items) {
|
|
228
|
+
const subItem = selectedItem.items.find(ii => checkPath(ii));
|
|
229
|
+
if (subItem) {
|
|
230
|
+
setSelectedKeys([subItem.path]);
|
|
231
|
+
}
|
|
232
|
+
} else {
|
|
233
|
+
setSelectedKeys([selectedItem.path]);
|
|
234
|
+
}
|
|
235
|
+
} else if (pathname) {
|
|
236
|
+
setSelectedKeys([pathname]);
|
|
237
|
+
}
|
|
238
|
+
}, [pathname]);
|
|
239
|
+
|
|
240
|
+
const userModule = useMemo(() => module, [user, module]);
|
|
241
|
+
|
|
242
|
+
return (
|
|
243
|
+
<React.Fragment>
|
|
244
|
+
{renderModule({
|
|
245
|
+
module: userModule,
|
|
246
|
+
isCollapsed,
|
|
247
|
+
onClick: () => checkOnClick({
|
|
248
|
+
event: () => {
|
|
249
|
+
navigate?.(getRedirectLink(`/app`));
|
|
250
|
+
}
|
|
251
|
+
}),
|
|
252
|
+
mod,
|
|
253
|
+
user,
|
|
254
|
+
userHelpers
|
|
255
|
+
})}
|
|
256
|
+
<DAFSidenav
|
|
257
|
+
module={module}
|
|
258
|
+
isCollapsed={isCollapsed}
|
|
259
|
+
hoverDiv={hoverDiv}
|
|
260
|
+
topHover={topHover}
|
|
261
|
+
hoverOpen={hoverOpen}
|
|
262
|
+
hoverContent={hoverContent}
|
|
263
|
+
hoverDivSecond={hoverDivSecond}
|
|
264
|
+
topHoverSecond={topHoverSecond}
|
|
265
|
+
hoverItemSecond={hoverItemSecond}
|
|
266
|
+
widthHoverSecond={widthHoverSecond}
|
|
267
|
+
hoverContentSecond={hoverContentSecond}
|
|
268
|
+
t={t}
|
|
269
|
+
>
|
|
270
|
+
{showMenu ? (
|
|
271
|
+
<SidenavMenu
|
|
272
|
+
matchPath={matchPath}
|
|
273
|
+
module={module}
|
|
274
|
+
menuMode={menuMode}
|
|
275
|
+
open={open}
|
|
276
|
+
selectedKeys={selectedKeys}
|
|
277
|
+
filteredItems={filteredItems}
|
|
278
|
+
isCollapsed={isCollapsed}
|
|
279
|
+
setHoverItem={setHoverItem}
|
|
280
|
+
setTopHover={setTopHover}
|
|
281
|
+
setHoverOpen={setHoverOpen}
|
|
282
|
+
onMouseMove={onMouseMove}
|
|
283
|
+
user={user}
|
|
284
|
+
goTo={navigate}
|
|
285
|
+
notApprovedModal={notApprovedModal}
|
|
286
|
+
isDev={isDev}
|
|
287
|
+
t={t}
|
|
288
|
+
checkOnClick={checkOnClick}
|
|
289
|
+
/>
|
|
290
|
+
) : null}
|
|
291
|
+
</DAFSidenav>
|
|
292
|
+
</React.Fragment>
|
|
293
|
+
);
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
export default Sidenav;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/* eslint-disable react/prop-types */
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { DownOutlined, BankOutlined } from "@ant-design/icons";
|
|
4
|
+
import styled from "styled-components";
|
|
5
|
+
import { MOBILE_WIDTH } from "../../../../../constants/Style.js";
|
|
6
|
+
|
|
7
|
+
const Style = styled.div`
|
|
8
|
+
display: flex;
|
|
9
|
+
cursor: pointer;
|
|
10
|
+
|
|
11
|
+
.desktop {
|
|
12
|
+
display: flex;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.mobile {
|
|
16
|
+
display: none;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.icon-c {
|
|
20
|
+
width: 40px;
|
|
21
|
+
height: 40px;
|
|
22
|
+
background: #FFFFFF;
|
|
23
|
+
border-radius: 100%;
|
|
24
|
+
background-position: center !important;
|
|
25
|
+
background-size: cover !important;
|
|
26
|
+
|
|
27
|
+
.anticon {
|
|
28
|
+
line-height: 0px !important;
|
|
29
|
+
padding-left: 0px !important;
|
|
30
|
+
font-size: 18px;
|
|
31
|
+
svg {
|
|
32
|
+
color: #D2D6DB;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
svg {
|
|
37
|
+
margin: auto;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
svg {
|
|
41
|
+
color: black;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.cont {
|
|
46
|
+
display: flex;
|
|
47
|
+
flex-direction: column;
|
|
48
|
+
justify-content: center;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@media (${MOBILE_WIDTH}) {
|
|
52
|
+
.desktop {
|
|
53
|
+
display: none;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.mobile {
|
|
57
|
+
display: flex;
|
|
58
|
+
cursor: pointer;
|
|
59
|
+
|
|
60
|
+
.anticon-menu {
|
|
61
|
+
padding-left: 0px !important;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
`;
|
|
66
|
+
|
|
67
|
+
export default function UserIcon({ companyLogo }) {
|
|
68
|
+
if (companyLogo) {
|
|
69
|
+
return (
|
|
70
|
+
<Style>
|
|
71
|
+
<div className="flex">
|
|
72
|
+
<div className="cont">
|
|
73
|
+
<div className="icon-c cont" style={{ background: `url('${companyLogo}')` }} />
|
|
74
|
+
</div>
|
|
75
|
+
<div className="cont">
|
|
76
|
+
<DownOutlined />
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</Style>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
return (
|
|
83
|
+
<Style>
|
|
84
|
+
<div className="flex">
|
|
85
|
+
<div className="cont">
|
|
86
|
+
<div className="icon-c cont">
|
|
87
|
+
<BankOutlined />
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
<div className="cont">
|
|
91
|
+
<DownOutlined />
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
</Style>
|
|
95
|
+
);
|
|
96
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/* eslint-disable react/prop-types */
|
|
2
|
+
import { Dropdown } from 'antd';
|
|
3
|
+
import UserIcon from './UserIcon';
|
|
4
|
+
import React, { useMemo } from 'react';
|
|
5
|
+
import { formatClassname } from '../../../../../helpers/ClassesHelper.js';
|
|
6
|
+
import { useResizeContext } from '../../../../core/context/Resize/index.js';
|
|
7
|
+
import { MOBILE_W } from '../../../../../constants/Style.js';
|
|
8
|
+
import MobileDrawer from '../MobileDrawer/index.js';
|
|
9
|
+
|
|
10
|
+
export const UserDropdownMenu = ({
|
|
11
|
+
user,
|
|
12
|
+
toggleSettingsDrawer = () => { },
|
|
13
|
+
settingsDrawerOpened,
|
|
14
|
+
navigate,
|
|
15
|
+
changeNotificationState,
|
|
16
|
+
t = (s) => s,
|
|
17
|
+
isAppNavigation,
|
|
18
|
+
logOut,
|
|
19
|
+
module,
|
|
20
|
+
checkPermission = () => false,
|
|
21
|
+
appName = 'app',
|
|
22
|
+
userHelpers = {},
|
|
23
|
+
}) => {
|
|
24
|
+
const { windowWidth } = useResizeContext();
|
|
25
|
+
const { userIsAdmin } = userHelpers;
|
|
26
|
+
const isAdmin = useMemo(() => userIsAdmin?.(user), [user, userIsAdmin]);
|
|
27
|
+
const isMobile = useMemo(() => windowWidth <= MOBILE_W, [windowWidth]);
|
|
28
|
+
const canViewUsers = checkPermission({
|
|
29
|
+
permission: 'users.canView',
|
|
30
|
+
permissions: user?.role?.permissions
|
|
31
|
+
});
|
|
32
|
+
const canViewSettings = checkPermission({
|
|
33
|
+
permission: 'settings.canView',
|
|
34
|
+
permissions: user?.role?.permissions
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const companyLogo = useMemo(() => {
|
|
38
|
+
const _arr = Array.isArray(user?.company?.logo) ? user?.company?.logo : (
|
|
39
|
+
user?.company?.logo?.fileList && Array.isArray(user?.company?.logo?.fileList) ?
|
|
40
|
+
user?.company?.logo?.fileList.map(v => v.response ? v.response : v) : []);
|
|
41
|
+
return Array.isArray(_arr) && _arr[0] ? _arr[0].url : null;
|
|
42
|
+
}, [user]);
|
|
43
|
+
|
|
44
|
+
const isDemoEnv = process.env.REACT_APP_ENV === 'demo';
|
|
45
|
+
|
|
46
|
+
return isMobile ? (
|
|
47
|
+
<div className="d-flex flex-column justify-content-center" onClick={toggleSettingsDrawer}>
|
|
48
|
+
<UserIcon companyLogo={companyLogo} />
|
|
49
|
+
<MobileDrawer
|
|
50
|
+
mod={module}
|
|
51
|
+
isUserDropdown
|
|
52
|
+
toggle={toggleSettingsDrawer}
|
|
53
|
+
drawerOpened={settingsDrawerOpened}
|
|
54
|
+
user={user}
|
|
55
|
+
navigate={navigate}
|
|
56
|
+
t={t}
|
|
57
|
+
checkPermission={checkPermission}
|
|
58
|
+
logOut={logOut}
|
|
59
|
+
changeNotificationState={changeNotificationState}
|
|
60
|
+
appName={appName}
|
|
61
|
+
/>
|
|
62
|
+
</div>
|
|
63
|
+
) : (
|
|
64
|
+
<Dropdown
|
|
65
|
+
trigger="click"
|
|
66
|
+
placement="bottomLeft"
|
|
67
|
+
rootClassName={formatClassname(['user-dropdown-layout', appName])}
|
|
68
|
+
menu={{
|
|
69
|
+
items: [
|
|
70
|
+
{
|
|
71
|
+
label: (
|
|
72
|
+
<>
|
|
73
|
+
<div className="drop-header">
|
|
74
|
+
<h4>{user?.company?.name || ''}</h4>
|
|
75
|
+
<p>{user?.firstName || ''} {user?.lastName || ''}</p>
|
|
76
|
+
</div>
|
|
77
|
+
<div className='list'>
|
|
78
|
+
{user.company && !isDemoEnv && canViewUsers && !isAdmin ?
|
|
79
|
+
<div className='list-item' onClick={() => {
|
|
80
|
+
changeNotificationState({ onYes: () => navigate?.(`/app/users`) });
|
|
81
|
+
}}>
|
|
82
|
+
{t('Users')}
|
|
83
|
+
</div>
|
|
84
|
+
: null}
|
|
85
|
+
|
|
86
|
+
{canViewSettings && !isAppNavigation && !isAdmin ? (
|
|
87
|
+
<div className='list-item' onClick={() => {
|
|
88
|
+
changeNotificationState({ onYes: () => navigate?.(`/app/view/settings`) });
|
|
89
|
+
}}>
|
|
90
|
+
{t('Settings')}
|
|
91
|
+
</div>
|
|
92
|
+
) : null}
|
|
93
|
+
|
|
94
|
+
<div className='list-item' onClick={() => {
|
|
95
|
+
changeNotificationState({ onYes: () => logOut() });
|
|
96
|
+
}}>
|
|
97
|
+
{t('Log out')}
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
</>
|
|
101
|
+
),
|
|
102
|
+
key: 'userMenu'
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
}}
|
|
106
|
+
>
|
|
107
|
+
<div className="d-flex flex-column justify-content-center">
|
|
108
|
+
<UserIcon companyLogo={companyLogo} />
|
|
109
|
+
</div>
|
|
110
|
+
</Dropdown>
|
|
111
|
+
);
|
|
112
|
+
};
|