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.
Files changed (66) hide show
  1. package/core/components/extra-info/extra-info-details.js +2 -2
  2. package/core/components/index.js +2 -11
  3. package/core/components/landing-api/landing-api.js +91 -15
  4. package/core/components/landing-api/landing-api.scss +22 -0
  5. package/core/components/license-management/license-alert.js +97 -0
  6. package/core/lib/Store.js +3 -3
  7. package/core/lib/components/global-header/animations.js +78 -4
  8. package/core/lib/components/global-header/global-header.js +224 -255
  9. package/core/lib/components/global-header/global-header.scss +162 -24
  10. package/core/lib/components/sidemenu/animations.js +84 -2
  11. package/core/lib/components/sidemenu/sidemenu.js +191 -65
  12. package/core/lib/components/sidemenu/sidemenu.scss +221 -14
  13. package/core/lib/elements/basic/country-phone-input/country-phone-input.js +14 -8
  14. package/core/lib/elements/basic/dragabble-wrapper/draggable-wrapper.js +1 -1
  15. package/core/lib/elements/basic/menu-tree/menu-tree.js +26 -13
  16. package/core/lib/models/forms/components/form-creator/form-creator.scss +4 -3
  17. package/core/lib/models/menus/components/menu-list/menu-list.js +424 -467
  18. package/core/lib/models/process/components/process-dashboard/process-dashboard.js +469 -3
  19. package/core/lib/models/process/components/process-dashboard/process-dashboard.scss +4 -0
  20. package/core/lib/pages/change-password/change-password.js +17 -24
  21. package/core/lib/pages/change-password/change-password.scss +45 -48
  22. package/core/lib/pages/login/commnication-mode-selection.js +2 -2
  23. package/core/lib/pages/login/login.js +47 -62
  24. package/core/lib/pages/login/login.scss +9 -0
  25. package/core/lib/pages/login/reset-password.js +17 -17
  26. package/core/lib/pages/login/reset-password.scss +10 -1
  27. package/core/lib/pages/profile/themes.json +4 -4
  28. package/core/lib/utils/api/api.utils.js +30 -18
  29. package/core/lib/utils/common/common.utils.js +49 -35
  30. package/core/lib/utils/http/http.utils.js +2 -1
  31. package/core/lib/utils/index.js +4 -1
  32. package/core/models/base/base.js +7 -3
  33. package/core/models/core-scripts/core-scripts.js +134 -126
  34. package/core/models/doctor/components/doctor-add/doctor-add.js +9 -4
  35. package/core/models/menus/components/menu-add/menu-add.js +1 -1
  36. package/core/models/menus/components/menu-lists/menu-lists.js +53 -54
  37. package/core/models/menus/menus.js +27 -2
  38. package/core/models/roles/components/role-add/role-add.js +92 -59
  39. package/core/models/roles/components/role-list/role-list.js +1 -1
  40. package/core/models/staff/components/staff-add/staff-add.js +20 -32
  41. package/core/models/users/components/assign-role/assign-role.js +145 -50
  42. package/core/models/users/components/assign-role/assign-role.scss +209 -45
  43. package/core/models/users/components/assign-role/avatar-props.js +45 -0
  44. package/core/models/users/components/user-add/user-add.js +46 -55
  45. package/core/models/users/components/user-add/user-edit.js +25 -4
  46. package/core/models/users/users.js +9 -1
  47. package/core/modules/dashboard/components/dashboard-card/menu-dashboard-card.js +1 -1
  48. package/core/modules/reporting/components/reporting-dashboard/README.md +316 -0
  49. package/core/modules/reporting/components/reporting-dashboard/adavance-search/advance-search.js +147 -0
  50. package/core/modules/reporting/components/reporting-dashboard/adavance-search/advance-search.scss +76 -0
  51. package/core/modules/reporting/components/reporting-dashboard/display-columns/build-display-columns.js +90 -0
  52. package/core/modules/reporting/components/reporting-dashboard/display-columns/build-display-columns.test.js +74 -0
  53. package/core/modules/reporting/components/reporting-dashboard/display-columns/display-cell-renderer.js +252 -0
  54. package/core/modules/reporting/components/reporting-dashboard/display-columns/display-cell-renderer.test.js +126 -0
  55. package/core/modules/reporting/components/reporting-dashboard/reporting-dashboard.js +326 -436
  56. package/core/modules/reporting/components/reporting-dashboard/reporting-dashboard.scss +7 -0
  57. package/core/modules/steps/action-buttons.js +33 -15
  58. package/core/modules/steps/action-buttons.scss +55 -9
  59. package/core/modules/steps/chat-assistant.js +141 -0
  60. package/core/modules/steps/openai-realtime.js +275 -0
  61. package/core/modules/steps/readme.md +167 -0
  62. package/core/modules/steps/steps.js +1078 -57
  63. package/core/modules/steps/steps.scss +539 -90
  64. package/core/modules/steps/timeline.js +21 -19
  65. package/core/modules/steps/voice-navigation.js +709 -0
  66. package/package.json +2 -1
@@ -10,11 +10,11 @@
10
10
 
11
11
  import React, { useState, useEffect, useContext } from 'react';
12
12
 
13
- import { animationControls, motion, useAnimation } from 'framer-motion';
13
+ import { motion, useReducedMotion } from 'framer-motion';
14
14
 
15
15
  import { GlobalContext } from './../../Store';
16
16
 
17
- import { Menu, message, Skeleton, Space, Popover } from 'antd';
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
- const handleResize = () => {
46
- setIsMobile(window.innerWidth < 768); // Common breakpoint for mobile
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
- handleResize(); // Set initial value
50
- window.addEventListener('resize', handleResize);
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
- return () => window.removeEventListener('resize', handleResize);
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
- <div className="menu-collapsed">
61
- <div>
62
- {menu && menu.image_path ? <img style={{ width: '25px' }} src={menu.image_path}></img> : <i className={`fa-solid fas ${icon}`} />}
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
- </div>
151
+ </>
73
152
  ) : (
74
- <div className="menu-collapsed">
75
- <span className="anticon">
76
- {menu && menu.image_path ? <img style={{ width: '25px' }} src={menu.image_path}></img> : <i className={`fa-solid fas ${icon}`} />}
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
- </div>
162
+ </>
84
163
  )}
85
- </>
164
+ </motion.div>
86
165
  );
87
166
 
88
- // On mobile, or when the menu is collapsed (based on original logic), don't show the popover tooltip.
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
- <Space className="side-loader">
269
- <Skeleton.Avatar />
270
- <Skeleton.Button />
271
- {/* <Skeleton.Input /> */}
272
- </Space>
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 className={`menu-item ${!collapsed ? 'open' : 'close'}`} style={{ backgroundColor: state.theme.colors.leftSectionBackground }}>
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
- <Menu
331
- // selectedKeys={[selected]}
332
- // style={{ width: 256 }}
333
- // defaultSelectedKeys={selected}
334
- // defaultOpenKeys={['']}
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
- {/* <Menu.Item
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-solid fas fa-user'}
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={menu}
555
+ menu={submenu}
431
556
  caption={submenu.caption}
432
- icon={submenu.icon_name || 'fa-solid fas fa-user'}
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-solid fas fa-user'}
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={menu}
604
+ menu={submenu}
480
605
  caption={submenu.caption}
481
- icon={submenu.icon_name || 'fa-solid fas fa-user'}
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-solid fas fa-user'} collapsed={collapsed} />
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
- {loading ? (
512
- <div class="skeleton-wrapper"></div>
513
- ) : (
514
- <Menu.Item onClick={handleLogout} key="logout-button">
515
- <CollapsedIconMenu caption="Logout" icon="fa-solid fas fa-user" collapsed={collapsed} />
516
- </Menu.Item>
517
- )}
518
- </Menu>
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
  }