ui-soxo-bootstrap-core 2.6.1-dev.2 → 2.6.1-dev.20
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/core/components/extra-info/extra-info-details.js +2 -2
- package/core/components/index.js +2 -11
- package/core/components/landing-api/landing-api.js +91 -15
- package/core/components/landing-api/landing-api.scss +22 -0
- package/core/components/license-management/license-alert.js +97 -0
- package/core/lib/Store.js +3 -3
- package/core/lib/components/global-header/animations.js +78 -4
- package/core/lib/components/global-header/global-header.js +224 -255
- package/core/lib/components/global-header/global-header.scss +162 -24
- package/core/lib/components/sidemenu/animations.js +84 -2
- package/core/lib/components/sidemenu/sidemenu.js +191 -65
- package/core/lib/components/sidemenu/sidemenu.scss +221 -14
- package/core/lib/elements/basic/country-phone-input/country-phone-input.js +14 -8
- package/core/lib/elements/basic/dragabble-wrapper/draggable-wrapper.js +1 -1
- package/core/lib/elements/basic/menu-tree/menu-tree.js +26 -13
- package/core/lib/models/forms/components/form-creator/form-creator.scss +4 -3
- package/core/lib/models/menus/components/menu-list/menu-list.js +424 -467
- package/core/lib/models/process/components/process-dashboard/process-dashboard.js +469 -3
- package/core/lib/models/process/components/process-dashboard/process-dashboard.scss +4 -0
- package/core/lib/pages/change-password/change-password.js +17 -24
- package/core/lib/pages/change-password/change-password.scss +45 -48
- package/core/lib/pages/login/commnication-mode-selection.js +2 -2
- package/core/lib/pages/login/login.js +47 -62
- package/core/lib/pages/login/login.scss +9 -0
- package/core/lib/pages/login/reset-password.js +17 -17
- package/core/lib/pages/login/reset-password.scss +10 -1
- package/core/lib/pages/profile/themes.json +4 -4
- package/core/lib/utils/api/api.utils.js +30 -18
- package/core/lib/utils/common/common.utils.js +49 -35
- package/core/lib/utils/http/http.utils.js +2 -1
- package/core/lib/utils/index.js +4 -1
- package/core/models/base/base.js +7 -3
- package/core/models/core-scripts/core-scripts.js +134 -126
- package/core/models/doctor/components/doctor-add/doctor-add.js +9 -4
- package/core/models/menus/components/menu-add/menu-add.js +1 -1
- package/core/models/menus/components/menu-lists/menu-lists.js +53 -54
- package/core/models/menus/menus.js +27 -2
- package/core/models/roles/components/role-add/role-add.js +92 -59
- package/core/models/roles/components/role-list/role-list.js +1 -1
- package/core/models/staff/components/staff-add/staff-add.js +20 -32
- package/core/models/users/components/assign-role/assign-role.js +145 -50
- package/core/models/users/components/assign-role/assign-role.scss +209 -45
- package/core/models/users/components/assign-role/avatar-props.js +45 -0
- package/core/models/users/components/user-add/user-add.js +46 -55
- package/core/models/users/components/user-add/user-edit.js +25 -4
- package/core/models/users/users.js +9 -1
- package/core/modules/dashboard/components/dashboard-card/menu-dashboard-card.js +1 -1
- package/core/modules/reporting/components/reporting-dashboard/README.md +316 -0
- package/core/modules/reporting/components/reporting-dashboard/adavance-search/advance-search.js +147 -0
- package/core/modules/reporting/components/reporting-dashboard/adavance-search/advance-search.scss +76 -0
- package/core/modules/reporting/components/reporting-dashboard/display-columns/build-display-columns.js +90 -0
- package/core/modules/reporting/components/reporting-dashboard/display-columns/build-display-columns.test.js +74 -0
- package/core/modules/reporting/components/reporting-dashboard/display-columns/display-cell-renderer.js +252 -0
- package/core/modules/reporting/components/reporting-dashboard/display-columns/display-cell-renderer.test.js +126 -0
- package/core/modules/reporting/components/reporting-dashboard/reporting-dashboard.js +326 -436
- package/core/modules/reporting/components/reporting-dashboard/reporting-dashboard.scss +7 -0
- package/core/modules/steps/action-buttons.js +33 -15
- package/core/modules/steps/action-buttons.scss +55 -9
- package/core/modules/steps/chat-assistant.js +141 -0
- package/core/modules/steps/openai-realtime.js +275 -0
- package/core/modules/steps/readme.md +167 -0
- package/core/modules/steps/steps.js +1078 -57
- package/core/modules/steps/steps.scss +539 -90
- package/core/modules/steps/timeline.js +21 -19
- package/core/modules/steps/voice-navigation.js +709 -0
- package/package.json +2 -1
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
|
|
11
11
|
import React, { useState, useEffect, useContext } from 'react';
|
|
12
12
|
|
|
13
|
-
import {
|
|
13
|
+
import { motion, useReducedMotion } from 'framer-motion';
|
|
14
14
|
|
|
15
15
|
import { GlobalContext } from './../../Store';
|
|
16
16
|
|
|
17
|
-
import { Menu, message,
|
|
17
|
+
import { Menu, message, Popover } from 'antd';
|
|
18
18
|
|
|
19
19
|
import FirebaseUtils from './../../utils/firebase.utils';
|
|
20
20
|
|
|
@@ -24,6 +24,15 @@ import { useTranslation, Trans } from 'react-i18next';
|
|
|
24
24
|
|
|
25
25
|
import { Menus } from '../../models';
|
|
26
26
|
|
|
27
|
+
import {
|
|
28
|
+
sidebarGroupVariants,
|
|
29
|
+
sidebarIntroVariants,
|
|
30
|
+
sidebarItemRevealVariants,
|
|
31
|
+
sidebarLoaderContainerVariants,
|
|
32
|
+
sidebarLoaderRowVariants,
|
|
33
|
+
sidebarMenuSurfaceVariants,
|
|
34
|
+
} from './animations';
|
|
35
|
+
|
|
27
36
|
import './sidemenu.scss';
|
|
28
37
|
|
|
29
38
|
const { SubMenu } = Menu;
|
|
@@ -40,53 +49,131 @@ function CollapsedIconMenu({ menu, collapsed, icon, caption }) {
|
|
|
40
49
|
const { t, i18n } = useTranslation();
|
|
41
50
|
const { state } = useContext(GlobalContext);
|
|
42
51
|
const [isMobile, setIsMobile] = useState(false);
|
|
52
|
+
const [iconImageFailed, setIconImageFailed] = useState(false);
|
|
53
|
+
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
const handleResize = () => {
|
|
56
|
+
setIsMobile(window.innerWidth < 768); // Common breakpoint for mobile
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
handleResize(); // Set initial value
|
|
60
|
+
window.addEventListener('resize', handleResize);
|
|
61
|
+
|
|
62
|
+
return () => window.removeEventListener('resize', handleResize);
|
|
63
|
+
}, []);
|
|
43
64
|
|
|
44
65
|
useEffect(() => {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
66
|
+
setIconImageFailed(false);
|
|
67
|
+
}, [menu?.image_path]);
|
|
68
|
+
|
|
69
|
+
const normalizeIconClass = (iconValue) => {
|
|
70
|
+
const raw = (iconValue || 'fa-user').trim();
|
|
71
|
+
const tokens = (raw || 'fa-user').split(/\s+/).filter(Boolean);
|
|
72
|
+
const tokenSet = new Set(tokens);
|
|
73
|
+
|
|
74
|
+
const modernToLegacyStyleMap = {
|
|
75
|
+
'fa-solid': 'fas',
|
|
76
|
+
'fa-regular': 'far',
|
|
77
|
+
'fa-light': 'fal',
|
|
78
|
+
'fa-brands': 'fab',
|
|
79
|
+
};
|
|
80
|
+
const fa6ToFa5IconMap = {
|
|
81
|
+
'fa-house': 'fa-home',
|
|
82
|
+
'fa-house-user': 'fa-home',
|
|
83
|
+
'fa-gauge': 'fa-tachometer-alt',
|
|
84
|
+
'fa-location-dot': 'fa-map-marker-alt',
|
|
85
|
+
};
|
|
86
|
+
const styleTokens = ['fa', 'fas', 'far', 'fal', 'fab', 'fa-solid', 'fa-regular', 'fa-light', 'fa-brands'];
|
|
87
|
+
|
|
88
|
+
const iconTokens = tokens.filter((token) => token.startsWith('fa-') && !styleTokens.includes(token));
|
|
89
|
+
const hasAnyStyleToken = tokens.some((token) => styleTokens.includes(token));
|
|
90
|
+
|
|
91
|
+
tokenSet.add('fa');
|
|
92
|
+
|
|
93
|
+
tokens.forEach((token) => {
|
|
94
|
+
if (modernToLegacyStyleMap[token]) {
|
|
95
|
+
tokenSet.add(modernToLegacyStyleMap[token]);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
if (!hasAnyStyleToken) {
|
|
100
|
+
tokenSet.add('fas');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (!iconTokens.length) {
|
|
104
|
+
const normalizedName = raw && !raw.includes(' ') ? (raw.startsWith('fa-') ? raw : `fa-${raw}`) : 'fa-user';
|
|
105
|
+
tokenSet.add(fa6ToFa5IconMap[normalizedName] || normalizedName);
|
|
106
|
+
} else {
|
|
107
|
+
iconTokens.forEach((token) => {
|
|
108
|
+
const mapped = fa6ToFa5IconMap[token];
|
|
109
|
+
if (mapped) {
|
|
110
|
+
tokenSet.add(mapped);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
48
114
|
|
|
49
|
-
|
|
50
|
-
|
|
115
|
+
return Array.from(tokenSet).join(' ');
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const renderMenuGlyph = () => {
|
|
119
|
+
if (menu && menu.image_path && !iconImageFailed) {
|
|
120
|
+
return (
|
|
121
|
+
<img
|
|
122
|
+
className="menu-image-icon"
|
|
123
|
+
src={menu.image_path}
|
|
124
|
+
alt={menu?.caption || caption || 'menu-icon'}
|
|
125
|
+
onError={() => setIconImageFailed(true)}
|
|
126
|
+
loading="lazy"
|
|
127
|
+
/>
|
|
128
|
+
);
|
|
129
|
+
}
|
|
51
130
|
|
|
52
|
-
|
|
53
|
-
|
|
131
|
+
return <i className={normalizeIconClass(icon)} aria-hidden="true" />;
|
|
132
|
+
};
|
|
54
133
|
|
|
55
134
|
const menuText = t(caption);
|
|
56
135
|
const menuContent = (
|
|
57
|
-
|
|
136
|
+
<motion.div variants={sidebarItemRevealVariants} className="menu-collapsed">
|
|
58
137
|
{/* If value of collapsed is false show caption & icon else hiding caption and showing only icon*/}
|
|
59
138
|
{!collapsed ? (
|
|
60
|
-
|
|
61
|
-
<div>
|
|
62
|
-
{
|
|
139
|
+
<>
|
|
140
|
+
<div className="menu-icon-wrap">
|
|
141
|
+
{renderMenuGlyph()}
|
|
63
142
|
</div>
|
|
64
143
|
|
|
65
|
-
<div style={{ color: state.theme.colors.leftSectionColor }}>
|
|
66
|
-
<span className="caption">
|
|
144
|
+
<div className="menu-label-wrap" style={{ color: state.theme.colors.leftSectionColor }} title={menuText}>
|
|
145
|
+
<span className="caption" title={menuText}>
|
|
67
146
|
{/* {caption} */}
|
|
68
147
|
{/* <Trans i18nKey="Appointments"></Trans> */}
|
|
69
148
|
{t(`${caption}`)}
|
|
70
149
|
</span>
|
|
71
150
|
</div>
|
|
72
|
-
|
|
151
|
+
</>
|
|
73
152
|
) : (
|
|
74
|
-
|
|
75
|
-
<span className="anticon">
|
|
76
|
-
{
|
|
153
|
+
<>
|
|
154
|
+
<span className="anticon menu-icon-wrap">
|
|
155
|
+
{renderMenuGlyph()}
|
|
77
156
|
</span>
|
|
78
157
|
|
|
79
|
-
<span style={{ color: state.theme.colors.colorPrimaryText, paddingLeft: '6px' }}>
|
|
158
|
+
<span className="menu-label-wrap" style={{ color: state.theme.colors.colorPrimaryText, paddingLeft: '6px' }} title={menuText}>
|
|
80
159
|
{/* <>{caption}</> */}
|
|
81
160
|
{t(`${caption}`)}
|
|
82
161
|
</span>
|
|
83
|
-
|
|
162
|
+
</>
|
|
84
163
|
)}
|
|
85
|
-
|
|
164
|
+
</motion.div>
|
|
86
165
|
);
|
|
87
166
|
|
|
88
|
-
//
|
|
89
|
-
return isMobile || collapsed ? menuContent : <Popover content={menuText} placement="right">{menuContent}</Popover>;
|
|
167
|
+
// Show tooltip labels on desktop collapsed mode, hide on mobile / expanded mode.
|
|
168
|
+
// return isMobile || !collapsed ? menuContent : <Popover content={menuText} placement="right">{menuContent}</Popover>;
|
|
169
|
+
// On mobile, or when the menu is collapsed (based on original logic), don't show the popover tooltip.
|
|
170
|
+
return isMobile || collapsed ? (
|
|
171
|
+
menuContent
|
|
172
|
+
) : (
|
|
173
|
+
<Popover content={menuText} placement="right">
|
|
174
|
+
{menuContent}
|
|
175
|
+
</Popover>
|
|
176
|
+
);
|
|
90
177
|
}
|
|
91
178
|
|
|
92
179
|
export default function SideMenu({ loading, modules = [], callback, appSettings, collapsed }) {
|
|
@@ -123,7 +210,7 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
123
210
|
* Logout Function
|
|
124
211
|
*/
|
|
125
212
|
async function handleLogout() {
|
|
126
|
-
let dbPtrValue = appSettings.headers.db_ptr;
|
|
213
|
+
// let dbPtrValue = appSettings.headers.db_ptr;
|
|
127
214
|
const isEnvThemeTrue = process.env.REACT_APP_THEME === 'true';
|
|
128
215
|
|
|
129
216
|
// Only clear localStorage if theme is not 'true'
|
|
@@ -137,7 +224,7 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
137
224
|
// const result = Users.logout()
|
|
138
225
|
localStorage.clear();
|
|
139
226
|
|
|
140
|
-
localStorage.setItem('db_ptr', dbPtrValue);
|
|
227
|
+
// localStorage.setItem('db_ptr', dbPtrValue);
|
|
141
228
|
|
|
142
229
|
let userInfo = {
|
|
143
230
|
dms: {},
|
|
@@ -261,17 +348,31 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
261
348
|
}, [state.theme]);
|
|
262
349
|
|
|
263
350
|
const rootSubmenuKeys = Menus.screenMenus(modules, 'order').map((m) => m.id || m.path || m.caption);
|
|
351
|
+
const prefersReducedMotion = useReducedMotion();
|
|
352
|
+
const shouldAnimate = !prefersReducedMotion;
|
|
353
|
+
const loaderRows = collapsed ? 5 : 7;
|
|
264
354
|
|
|
265
355
|
return (
|
|
266
356
|
<div className="sidemenu">
|
|
267
357
|
{loading ? (
|
|
268
|
-
<
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
{
|
|
272
|
-
|
|
358
|
+
<motion.div
|
|
359
|
+
className="side-loader-shell"
|
|
360
|
+
variants={sidebarLoaderContainerVariants}
|
|
361
|
+
initial={shouldAnimate ? 'hidden' : false}
|
|
362
|
+
animate={shouldAnimate ? 'visible' : false}
|
|
363
|
+
>
|
|
364
|
+
{[...Array(4)].map((_, index) => (
|
|
365
|
+
<motion.div key={`intro-loader-${index}`} className="side-loader-chip" variants={sidebarLoaderRowVariants}>
|
|
366
|
+
<span className="side-loader-dot" />
|
|
367
|
+
<span className="side-loader-line" />
|
|
368
|
+
</motion.div>
|
|
369
|
+
))}
|
|
370
|
+
</motion.div>
|
|
273
371
|
) : (
|
|
274
|
-
<div
|
|
372
|
+
<motion.div
|
|
373
|
+
variants={sidebarIntroVariants}
|
|
374
|
+
initial={shouldAnimate ? 'hidden' : false}
|
|
375
|
+
animate={shouldAnimate ? 'visible' : false}
|
|
275
376
|
className="intro"
|
|
276
377
|
style={{ backgroundColor: state.theme.colors.leftSectionBackground, borderBottom: `2px solid ${state.theme.colors.borderColor}` }}
|
|
277
378
|
>
|
|
@@ -306,7 +407,7 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
306
407
|
{/* If value of collapsed is true render header else not rendering */}
|
|
307
408
|
|
|
308
409
|
{!collapsed ? renderCustomHeader() : ''}
|
|
309
|
-
</div>
|
|
410
|
+
</motion.div>
|
|
310
411
|
)}
|
|
311
412
|
|
|
312
413
|
{/* Intro Component */}
|
|
@@ -323,25 +424,49 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
323
424
|
|
|
324
425
|
{/* Search for Queries Ends */}
|
|
325
426
|
|
|
326
|
-
<div
|
|
427
|
+
<motion.div
|
|
428
|
+
className={`menu-item ${!collapsed ? 'open' : 'close'}`}
|
|
429
|
+
style={{ backgroundColor: state.theme.colors.leftSectionBackground }}
|
|
430
|
+
variants={sidebarMenuSurfaceVariants}
|
|
431
|
+
initial={shouldAnimate ? 'hidden' : false}
|
|
432
|
+
animate={shouldAnimate ? 'visible' : false}
|
|
433
|
+
>
|
|
327
434
|
{loading ? (
|
|
328
|
-
|
|
435
|
+
<motion.div
|
|
436
|
+
className="side-loader-list"
|
|
437
|
+
variants={sidebarLoaderContainerVariants}
|
|
438
|
+
initial={shouldAnimate ? 'hidden' : false}
|
|
439
|
+
animate={shouldAnimate ? 'visible' : false}
|
|
440
|
+
>
|
|
441
|
+
{[...Array(loaderRows)].map((_, rowIndex) => (
|
|
442
|
+
<motion.div key={`menu-loader-${rowIndex}`} className="side-loader-row" variants={sidebarLoaderRowVariants}>
|
|
443
|
+
<span className="side-loader-dot" />
|
|
444
|
+
<span className="side-loader-line" />
|
|
445
|
+
</motion.div>
|
|
446
|
+
))}
|
|
447
|
+
</motion.div>
|
|
329
448
|
) : (
|
|
330
|
-
<
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
inlineCollapsed={collapsed}
|
|
336
|
-
mode="inline"
|
|
337
|
-
theme={process.env.REACT_APP_THEME}
|
|
338
|
-
selectedKeys={selectedKeys}
|
|
339
|
-
openKeys={openKeys}
|
|
340
|
-
onOpenChange={onOpenChange}
|
|
341
|
-
style={{ backgroundColor: state.theme.colors.leftSectionBackground, color: state.theme.colors.leftSectionColor }}
|
|
342
|
-
// theme={''}
|
|
449
|
+
<motion.div
|
|
450
|
+
className="menu-motion-shell"
|
|
451
|
+
variants={sidebarGroupVariants}
|
|
452
|
+
initial={shouldAnimate ? 'hidden' : false}
|
|
453
|
+
animate={shouldAnimate ? 'visible' : false}
|
|
343
454
|
>
|
|
344
|
-
|
|
455
|
+
<Menu
|
|
456
|
+
// selectedKeys={[selected]}
|
|
457
|
+
// style={{ width: 256 }}
|
|
458
|
+
// defaultSelectedKeys={selected}
|
|
459
|
+
// defaultOpenKeys={['']}
|
|
460
|
+
inlineCollapsed={collapsed}
|
|
461
|
+
mode="inline"
|
|
462
|
+
theme={process.env.REACT_APP_THEME}
|
|
463
|
+
selectedKeys={selectedKeys}
|
|
464
|
+
openKeys={openKeys}
|
|
465
|
+
onOpenChange={onOpenChange}
|
|
466
|
+
style={{ backgroundColor: state.theme.colors.leftSectionBackground, color: state.theme.colors.leftSectionColor }}
|
|
467
|
+
// theme={''}
|
|
468
|
+
>
|
|
469
|
+
{/* <Menu.Item
|
|
345
470
|
onClick={() => {
|
|
346
471
|
setSelected([1]);
|
|
347
472
|
history.push("/");
|
|
@@ -406,7 +531,7 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
406
531
|
<CollapsedIconMenu
|
|
407
532
|
menu={menu}
|
|
408
533
|
caption={menu.caption}
|
|
409
|
-
icon={menu.icon_name || 'fa-
|
|
534
|
+
icon={menu.icon_name || 'fa-user'}
|
|
410
535
|
collapsed={collapsed}
|
|
411
536
|
/>
|
|
412
537
|
</>
|
|
@@ -427,9 +552,9 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
427
552
|
title={
|
|
428
553
|
<span>
|
|
429
554
|
<CollapsedIconMenu
|
|
430
|
-
menu={
|
|
555
|
+
menu={submenu}
|
|
431
556
|
caption={submenu.caption}
|
|
432
|
-
icon={submenu.icon_name || 'fa-
|
|
557
|
+
icon={submenu.icon_name || 'fa-user'}
|
|
433
558
|
collapsed={collapsed}
|
|
434
559
|
/>
|
|
435
560
|
</span>
|
|
@@ -453,7 +578,7 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
453
578
|
<CollapsedIconMenu
|
|
454
579
|
menu={menu}
|
|
455
580
|
caption={menu.caption}
|
|
456
|
-
icon={menu.icon_name || 'fa-
|
|
581
|
+
icon={menu.icon_name || 'fa-user'}
|
|
457
582
|
collapsed={collapsed}
|
|
458
583
|
/>
|
|
459
584
|
</Menu.Item>
|
|
@@ -476,9 +601,9 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
476
601
|
key={submenu.path || submenu.caption}
|
|
477
602
|
>
|
|
478
603
|
<CollapsedIconMenu
|
|
479
|
-
menu={
|
|
604
|
+
menu={submenu}
|
|
480
605
|
caption={submenu.caption}
|
|
481
|
-
icon={submenu.icon_name || 'fa-
|
|
606
|
+
icon={submenu.icon_name || 'fa-user'}
|
|
482
607
|
collapsed={collapsed}
|
|
483
608
|
/>
|
|
484
609
|
</Menu.Item>
|
|
@@ -502,26 +627,27 @@ export default function SideMenu({ loading, modules = [], callback, appSettings,
|
|
|
502
627
|
// key={`${menu.id}-${randomIndex}`}
|
|
503
628
|
key={menu.path || menu.caption}
|
|
504
629
|
>
|
|
505
|
-
<CollapsedIconMenu menu={menu} caption={menu.caption} icon={menu.icon_name || 'fa-
|
|
630
|
+
<CollapsedIconMenu menu={menu} caption={menu.caption} icon={menu.icon_name || 'fa-user'} collapsed={collapsed} />
|
|
506
631
|
</Menu.Item>
|
|
507
632
|
);
|
|
508
633
|
}
|
|
509
634
|
})}
|
|
510
635
|
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
636
|
+
{loading ? (
|
|
637
|
+
<div className="skeleton-wrapper"></div>
|
|
638
|
+
) : (
|
|
639
|
+
<Menu.Item onClick={handleLogout} key="logout-button">
|
|
640
|
+
<CollapsedIconMenu caption="Logout" icon="fa-user" collapsed={collapsed} />
|
|
641
|
+
</Menu.Item>
|
|
642
|
+
)}
|
|
643
|
+
</Menu>
|
|
644
|
+
</motion.div>
|
|
519
645
|
)}
|
|
520
646
|
|
|
521
647
|
{/* Footer Logo */}
|
|
522
648
|
{/* {renderFooter(footerLogo)} */}
|
|
523
649
|
{/* Footer Logo Ends */}
|
|
524
|
-
</div>
|
|
650
|
+
</motion.div>
|
|
525
651
|
</div>
|
|
526
652
|
);
|
|
527
653
|
}
|