ui-soxo-bootstrap-core 2.6.40-dev.17 → 2.6.40

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 (27) hide show
  1. package/DEVELOPER_GUIDE.md +9 -38
  2. package/core/components/index.js +11 -2
  3. package/core/components/landing-api/landing-api.js +5 -165
  4. package/core/lib/components/global-header/global-header.js +77 -20
  5. package/core/lib/components/index.js +2 -2
  6. package/core/lib/components/sidemenu/sidemenu.js +147 -66
  7. package/core/lib/elements/basic/dragabble-wrapper/draggable-wrapper.js +24 -91
  8. package/core/lib/models/menus/components/menu-add/menu-add.js +2 -2
  9. package/core/lib/modules/generic/generic-list/ExportReactCSV.js +8 -334
  10. package/core/lib/modules/generic/generic-list/generic-list.scss +0 -34
  11. package/core/models/core-scripts/core-scripts.js +1 -22
  12. package/core/models/menus/components/menu-add/menu-add.js +4 -31
  13. package/core/models/menus/components/menu-lists/menu-lists.js +12 -75
  14. package/core/models/menus/menus.js +1 -29
  15. package/core/models/roles/components/role-add/role-add.js +169 -54
  16. package/core/models/roles/components/role-list/role-list.js +0 -20
  17. package/core/models/roles/roles.js +0 -3
  18. package/core/models/users/components/assign-role/assign-role.js +8 -23
  19. package/core/modules/reporting/components/reporting-dashboard/display-columns/display-cell-renderer.js +5 -202
  20. package/core/modules/reporting/components/reporting-dashboard/display-columns/display-cell-renderer.test.js +0 -73
  21. package/core/modules/reporting/components/reporting-dashboard/reporting-dashboard.js +35 -56
  22. package/core/modules/reporting/components/reporting-dashboard/reporting-dashboard.scss +0 -1
  23. package/package.json +1 -1
  24. package/core/components/license-management/license-alert.js +0 -97
  25. package/core/models/roles/components/role-add/menu-label.js +0 -14
  26. package/core/models/roles/components/role-add/menu-tree.js +0 -127
  27. package/core/modules/reporting/components/reporting-dashboard/reporting-table.js +0 -519
@@ -17,7 +17,6 @@ Incorrect versioning or incorrect tags will break the publish pipeline — follo
17
17
  - Publishing via GitHub Release UI
18
18
  - How GitHub Action Detects Release Type
19
19
  - Summary Table
20
- - CI/CD Authentication (Trusted Publishing)
21
20
  - Common Mistakes & Fixes
22
21
 
23
22
  ---
@@ -256,14 +255,17 @@ npm publish --tag dev
256
255
 
257
256
  # ⚙️ How GitHub Action Detects Release Type
258
257
 
259
- The workflow reads the `version` field from `package.json` at publish time:
258
+ If version contains `dev`:
260
259
 
261
- | Condition | Command | Result |
262
- | ---------------------------- | ------------------------------------------------------- | ---------------------------------- |
263
- | Version contains `-dev` | `npm publish --provenance --access public --tag dev` | Publishes to the `dev` dist-tag |
264
- | Version has no `-dev` suffix | `npm publish --provenance --access public --tag latest` | Publishes to the `latest` dist-tag |
260
+ ```
261
+ npm publish --tag dev
262
+ ```
265
263
 
266
- The workflow also enforces that the GitHub release tag matches `v<version>` from `package.json` and fails the run immediately if they diverge — this prevents the most common publish failure described below.
264
+ Otherwise:
265
+
266
+ ```
267
+ npm publish
268
+ ```
267
269
 
268
270
  ---
269
271
 
@@ -281,37 +283,6 @@ The workflow also enforces that the GitHub release tag matches `v<version>` from
281
283
 
282
284
  ---
283
285
 
284
- # 🔐 CI/CD Authentication (Trusted Publishing)
285
-
286
- As of npm's 2025 policy changes, classic automation tokens (`NPM_TOKEN`) are deprecated. This repo now authenticates to npm via **OIDC Trusted Publishing** — GitHub Actions exchanges a short-lived OIDC token for a publish token at run time, so **no secret is stored in the repository**.
287
-
288
- ## What this means for developers
289
-
290
- Nothing. You still follow the same flow: `npm version` → push tag → create GitHub Release. The auth happens transparently in CI.
291
-
292
- ## What this means for maintainers
293
-
294
- The first-time setup on npmjs.com must be done once per package:
295
-
296
- 1. Log in to [npmjs.com](https://www.npmjs.com) → open the package (`ui-soxo-bootstrap-core`) → **Settings**.
297
- 2. Under **Trusted Publisher**, click **Add trusted publisher** and fill in:
298
- - Publisher: **GitHub Actions**
299
- - Organization or user: `soxo-tech`
300
- - Repository: `bootstrap-core`
301
- - Workflow filename: `npm-publish.yml`
302
- - Environment name: *(leave blank)*
303
- 3. Save. Any old `NPM_TOKEN` repository secret can be removed.
304
-
305
- ## Runtime requirements
306
-
307
- The workflow runs on Node 20 and upgrades npm to the latest CLI (`npm install -g npm@latest`) because OIDC trusted publishing requires **npm ≥ 11.5.1**. The `--provenance` flag attaches a verifiable build attestation to every published version, visible on the npmjs.com package page.
308
-
309
- ## If publish fails with `403 Forbidden` or `ENEEDAUTH`
310
-
311
- The trusted publisher config on npmjs.com no longer matches the workflow. Check that org, repo, and workflow filename match exactly — including case.
312
-
313
- ---
314
-
315
286
  # ⚠️ Common Mistakes & Fixes
316
287
 
317
288
  | Mistake | Issue | Fix |
@@ -1,3 +1,7 @@
1
+
2
+
3
+
4
+
1
5
  import LandingAPI from './landing-api/landing-api';
2
6
 
3
7
  import ExtraInfoDetail from './extra-info/extra-info-details';
@@ -7,6 +11,11 @@ import RootApplicationAPI from './root-application-api/root-application-api';
7
11
  import { HomePageAPI } from '../modules';
8
12
 
9
13
  import { ExternalWindow } from './external-window/external-window';
10
- import LicenseAlert from './license-management/license-alert';
11
14
 
12
- export { LandingAPI, RootApplicationAPI, ExtraInfoDetail, HomePageAPI, ExternalWindow, LicenseAlert };
15
+ export {
16
+ LandingAPI,
17
+ RootApplicationAPI,
18
+ ExtraInfoDetail,
19
+ HomePageAPI,
20
+ ExternalWindow
21
+ }
@@ -2,20 +2,9 @@ import { useContext, useEffect, useRef, useState } from 'react';
2
2
 
3
3
  import { Route, Switch } from 'react-router-dom';
4
4
 
5
- import { Skeleton, message, Modal } from 'antd';
6
-
7
- import {
8
- GlobalHeader,
9
- ChangePassword,
10
- useTranslation,
11
- GlobalContext,
12
- ModuleRoutes,
13
- SpotlightSearch,
14
- SettingsUtil,
15
- Profile,
16
- Card,
17
- safeJSON,
18
- } from '../../lib';
5
+ import { Skeleton } from 'antd';
6
+
7
+ import { Card, ChangePassword, GlobalContext, GlobalHeader, ModuleRoutes, Profile, SettingsUtil, SpotlightSearch, useTranslation } from '../../lib';
19
8
 
20
9
  import './landing-api.scss';
21
10
 
@@ -57,6 +46,7 @@ function getRandomMessage(previousMessage = '') {
57
46
  */
58
47
  export default function LandingApi({ history, CustomComponents, CustomModels, appSettings, transitionPending = false, onHomeReady, ...props }) {
59
48
  const [loader, setLoader] = useState(false);
49
+
60
50
  // const [modules, setModules] = useState([]);
61
51
 
62
52
  const [connected] = useState();
@@ -69,31 +59,11 @@ export default function LandingApi({ history, CustomComponents, CustomModels, ap
69
59
 
70
60
  const [meta, setMeta] = useState({});
71
61
  const [loadingMessage, setLoadingMessage] = useState('');
72
- const [licenseData, setLicenseData] = useState(null);
73
-
74
- const [licAlert, setLicAlert] = useState(false);
75
- // License data state
76
62
 
77
63
  // const [reports, setReports] = useState([]);
78
64
 
79
65
  var config = {};
80
66
 
81
- //fetch license summary
82
- // const fetchSummary = async () => {
83
- // try {
84
- // const res = await MenusAPI.getSummary();
85
- // if (res?.data) {
86
- // setLicenseData(res?.data);
87
- // setLicAlert(true);
88
- // } else {
89
- // setLicenseData(null);
90
- // setLicAlert(false);
91
- // }
92
- // } catch (err) {
93
- // console.error(err);
94
- // }
95
- // };
96
-
97
67
  // Variable decides the control of homepage
98
68
  // #TODO This is a temporary fix - Homemage
99
69
 
@@ -103,70 +73,6 @@ export default function LandingApi({ history, CustomComponents, CustomModels, ap
103
73
  disableHomepage = JSON.parse(process.env.REACT_APP_DISABLEHOMEPAGE);
104
74
  }
105
75
 
106
- /**
107
- * Normalizes the user's branch access list from `organization_details`.
108
- *
109
- * The API can return `organization_details` as a JSON string, so we always
110
- * parse it through `safeJSON` before reading the branch collection.
111
- *
112
- * @returns {Array} List of branches the current user can access.
113
- */
114
- const getAccessibleBranches = () => {
115
- const orgDetails = safeJSON(user?.organization_details);
116
- return Array.isArray(orgDetails?.branch) ? orgDetails.branch : [];
117
- };
118
-
119
- /**
120
- * Resolves the currently selected branch record using the persisted db pointer.
121
- *
122
- * @param {Array} branches
123
- * @returns {Object|null}
124
- */
125
- const getCurrentBranchRecord = (branches) => {
126
- const currentDbPtr = localStorage.getItem('db_ptr');
127
- return branches.find((branch) => String(branch.dbPtr) === String(currentDbPtr)) || null;
128
- };
129
-
130
- /**
131
- * Resolves the target branch from the URL `index` query parameter.
132
- *
133
- * @param {Array} branches
134
- * @param {string|null} branchId
135
- * @returns {Object|null}
136
- */
137
- const getBranchRecordById = (branches, branchId) => {
138
- return branches.find((branch) => String(branch.branch_id) === String(branchId)) || null;
139
- };
140
-
141
- /**
142
- * Persists branch-specific auth data after a successful switch.
143
- *
144
- * @param {Object} tokenBundle
145
- * @param {string} dbPtr
146
- */
147
- const persistBranchSession = (tokenBundle, dbPtr) => {
148
- const accessToken = tokenBundle?.access_token;
149
- const refreshToken = tokenBundle?.refresh_token;
150
-
151
- if (accessToken) localStorage.setItem('access_token', accessToken);
152
- if (refreshToken) localStorage.setItem('refresh_token', refreshToken);
153
- if (dbPtr) localStorage.setItem('db_ptr', dbPtr);
154
- };
155
-
156
- const fetchSummary = async () => {
157
- try {
158
- const res = await MenusAPI.getSummary();
159
- if (res?.data) {
160
- setLicenseData(res?.data);
161
- setLicAlert(true);
162
- } else {
163
- setLicenseData(null);
164
- setLicAlert(false);
165
- }
166
- } catch (err) {
167
- console.error(err);
168
- }
169
- };
170
76
  // useEffect(() => {
171
77
 
172
78
  // // Initialize the menus for the logged in user
@@ -182,67 +88,6 @@ export default function LandingApi({ history, CustomComponents, CustomModels, ap
182
88
  // }
183
89
  // }, [loader]);
184
90
 
185
- /**
186
- * Synchronizes the active branch with the `index` query parameter.
187
- *
188
- * Flow:
189
- * 1. Read the target branch id from the URL.
190
- * 2. Compare it against the branch represented by the current `db_ptr`.
191
- * 3. Switch branch only when the user has access and the branch actually differs.
192
- * 4. Refresh auth/profile state and reload menus for the new branch context.
193
- */
194
- useEffect(() => {
195
- const handleUrlBranchSwitch = async () => {
196
- const searchParams = new URLSearchParams(history.location.search);
197
- const urlDbPtr = searchParams.get('index');
198
- if (!urlDbPtr) return;
199
-
200
- const accessibleBranches = getAccessibleBranches();
201
- const currentBranch = getCurrentBranchRecord(accessibleBranches);
202
- const targetBranch = getBranchRecordById(accessibleBranches, urlDbPtr);
203
-
204
- if (!targetBranch || String(currentBranch?.branch_id) === String(urlDbPtr)) return;
205
-
206
- setLoader(true);
207
-
208
- try {
209
- const switchResult = await MenusAPI.switchBranch(
210
- {
211
- firm_id: targetBranch.firm_ptr,
212
- branch_id: targetBranch.branch_id,
213
- },
214
- targetBranch.dbPtr
215
- );
216
-
217
- if (!switchResult?.success) {
218
- Modal.error({
219
- title: 'Branch Switch Failed',
220
- content: switchResult?.message || 'An error occurred while attempting to switch branches.',
221
- });
222
- return;
223
- }
224
-
225
- persistBranchSession(switchResult?.token, targetBranch.dbPtr);
226
- window.dispatchEvent(new CustomEvent('branchChanged', { detail: targetBranch.dbPtr }));
227
-
228
- const accessToken = switchResult?.token?.access_token;
229
- const profileResult = await MenusAPI.getProfile(accessToken);
230
- const updatedUser = { ...profileResult, loggedCheckDone: true };
231
-
232
- dispatch({ type: 'user', payload: updatedUser });
233
- localStorage.setItem('userInfo', JSON.stringify(updatedUser));
234
-
235
- await initializeUserMenus();
236
- } catch (error) {
237
- console.error('Auto branch switch failed:', error);
238
- } finally {
239
- setLoader(false);
240
- }
241
- };
242
-
243
- if (user?.id && history?.location) handleUrlBranchSwitch();
244
- }, [history?.location?.search, user?.id]);
245
-
246
91
  useEffect(() => {
247
92
  // Initialize the menus for the logged in user
248
93
  initializeUserMenus();
@@ -293,12 +138,9 @@ export default function LandingApi({ history, CustomComponents, CustomModels, ap
293
138
  */
294
139
  async function initializeUserMenus() {
295
140
  // need to find what implement, with a login who has the respective value ("wug_custreportids")
296
-
297
141
  const report = await loadScripts(user);
298
142
 
299
143
  await loadMenus(report);
300
- // fetch license summary
301
- fetchSummary();
302
144
  }
303
145
 
304
146
  // const keyMap = {
@@ -320,7 +162,7 @@ export default function LandingApi({ history, CustomComponents, CustomModels, ap
320
162
  setLoader(true);
321
163
 
322
164
  // setReports(report)
323
- fetchSummary();
165
+
324
166
  const result = await MenusAPI.getMenus(user);
325
167
 
326
168
  // console.log(result);
@@ -450,8 +292,6 @@ export default function LandingApi({ history, CustomComponents, CustomModels, ap
450
292
  modules={allModules}
451
293
  user={user}
452
294
  history={history}
453
- licenseData={licenseData}
454
- licAlert={licAlert}
455
295
  >
456
296
  {loader ? (
457
297
  <Card className="skeleton-card">
@@ -2,92 +2,136 @@
2
2
  *
3
3
  * Global header component
4
4
  */
5
+
5
6
  import { useContext, useEffect, useRef, useState } from 'react';
7
+
6
8
  import { motion, useAnimation } from 'framer-motion';
9
+
7
10
  import { boxVariants } from './animations';
11
+
8
12
  import { GlobalContext, GlobalProvider } from './../../Store';
13
+
9
14
  import { Link, useLocation } from 'react-router-dom';
15
+
10
16
  import { Avatar, Input, Tooltip, Typography } from 'antd';
17
+
11
18
  import ProgressBar from '../progress-bar/progress-bar'; // Adjust the path as needed
19
+
12
20
  import { Button } from '../../elements';
21
+
13
22
  import GenericHeader from '../header/generic-header';
23
+
24
+
14
25
  import { CustomerServiceOutlined, MenuOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons';
26
+
15
27
  import { Drawer } from 'antd';
28
+
16
29
  import { ReloadOutlined, SearchOutlined } from '@ant-design/icons';
30
+
17
31
  import SideMenu from './../sidemenu/sidemenu';
32
+
18
33
  import './global-header.scss';
34
+
19
35
  import LanguageSwitcher from '../language-switcher/language-switcher';
36
+
20
37
  import { useTranslation } from 'react-i18next';
38
+
21
39
  import SettingsUtil from '../../../utils/settings.utils';
22
40
  import SpotlightSearch from '../spotlight-search/spotlight-search.component';
23
- import { LicenseAlert } from '../../../components';
41
+
24
42
  const { Title } = Typography;
25
- function GlobalHeaderContent({ loading, appSettings, children, isConnected, history, modules = [], sidemenu = [], reload, meta = {}, licAlert,
26
- licenseData ,...props }) {
43
+
44
+ function GlobalHeaderContent({ loading, appSettings, children, isConnected, history, modules = [], sidemenu = [], reload, meta = {}, ...props }) {
27
45
  let location = useLocation();
28
46
  // let location = {};
47
+
29
48
  const { isMobile, user = { locations: [] }, kiosk, state, settings } = useContext(GlobalContext);
49
+
30
50
  const [visible, setVisible] = useState(false);
31
51
  const helpDeskSetting = settings?.HELPATR || {};
52
+
32
53
  // Variable to handle toggling of menu
33
54
  const [collapsed, setCollapsed] = useState(false);
34
55
  // varibale handle branch switcher
56
+
35
57
  // const [searchModalVisible, setSearchModalVisible] = useState(false);
58
+
36
59
  const { globalCustomerHeader = () => {} } = appSettings;
60
+
37
61
  const { t, i18n } = useTranslation();
62
+
38
63
  const spotlightRef = useRef();
64
+
39
65
  useEffect(() => {
40
66
  setTimeout(() => {
41
67
  i18n.changeLanguage(localStorage.selectedLanguage);
42
68
  }, 0);
43
69
  }, []);
70
+
44
71
  /**
45
72
  * Function to handle toggling of menu
46
73
  */
74
+
47
75
  const toggleCollapsed = () => {
48
76
  setVisible(true);
77
+
49
78
  collapsed === true ? setCollapsed(false) : setCollapsed(true);
50
79
  };
80
+
51
81
  const openSearchModal = () => {
52
82
  // input to avoid typing
53
83
  SettingsUtil.openSpotlightModal();
54
84
  };
85
+
55
86
  /**
56
87
  * Function to remove toggling on mobile view
57
88
  */
58
89
  const hideToggle = () => {
59
90
  setVisible(true);
91
+
60
92
  setCollapsed(false);
61
93
  };
94
+
62
95
  /**
63
96
  * onClose Function
64
97
  */
98
+
65
99
  const onClose = () => {
66
100
  setVisible(false);
67
101
  };
102
+
68
103
  // const { model = {} } = menu;
104
+
69
105
  const { model: BaseModel = {}, menu = {} } = meta;
106
+
70
107
  const { model = {} } = menu;
108
+
71
109
  //Animations//
72
110
  const boxControls = useAnimation();
111
+
73
112
  async function animate() {
74
113
  await boxControls.start('entered');
114
+
75
115
  //await boxControls.start("show");
76
116
  }
117
+
77
118
  useEffect(() => {
78
119
  animate();
79
120
  }, []);
121
+
80
122
  useEffect(() => {}, [state.theme]);
123
+
81
124
  return (
82
- <>
83
125
  <div
84
126
  className={`global-header ${process.env.REACT_APP_THEME} ${isConnected && !kiosk ? 'connected' : ''}`}
85
127
  style={{
86
128
  // background: state.theme.colors.bodyBackground,
87
- height: 'auto',
129
+
130
+ height: 10,
88
131
  }}
89
132
  >
90
133
  {/* <MenuOutlined style={{left:'1%',top:'1%', fontSize:18, position:'absolute', zIndex:999}} onClick={showSidebar}/> */}
134
+
91
135
  <div className="layout-content">
92
136
  <div
93
137
  //whileHover="hover"
@@ -130,6 +174,7 @@ function GlobalHeaderContent({ loading, appSettings, children, isConnected, hist
130
174
  </Drawer>
131
175
  )}
132
176
  </div>
177
+
133
178
  {/* Right Section of the Component Loader */}
134
179
  <div
135
180
  className={`right-section ${!collapsed ? 'open' : 'close'} ${kiosk ? 'kioskon' : ''}`}
@@ -144,9 +189,11 @@ function GlobalHeaderContent({ loading, appSettings, children, isConnected, hist
144
189
  {/* */}
145
190
  <div className="page-header-name">
146
191
  <ProgressBar isLoading={loading} />
192
+
147
193
  <span type onClick={!isMobile ? toggleCollapsed : hideToggle} className="toggle-box toggle-menu">
148
194
  <MenuOutlined />
149
195
  </span>
196
+
150
197
  {/* Back Button */}
151
198
  {location.pathname !== '/' ? (
152
199
  <span
@@ -159,30 +206,39 @@ function GlobalHeaderContent({ loading, appSettings, children, isConnected, hist
159
206
  </span>
160
207
  ) : null}
161
208
  {/* Back Button Ends */}
209
+
162
210
  {location.pathname !== '/' ? (
163
211
  <h4 className="menu-caption header-caption" style={{ color: state.theme.colors.headerColor }}>
164
212
  {menu.caption}
165
213
  </h4>
166
214
  ) : null}
167
215
  </div>
216
+
168
217
  {/* Page Menu Actions */}
218
+
169
219
  {user.role || user.id ? (
170
220
  <div className="page-menu">
171
221
  {/* Search Input in header start */}
172
222
  {!isMobile && (
173
223
  <div>
174
224
  <Input placeholder="Search (Shift + F)" prefix={<SearchOutlined />} onClick={openSearchModal} readOnly style={{ width: 250 }} />
225
+
175
226
  <SpotlightSearch ref={(elem) => SettingsUtil.registerModal(elem)} props={props} />
176
227
  </div>
177
228
  )}
178
229
  {/* Search Input in header start */}
230
+
179
231
  {/** branchswitcher Option */}
180
232
  {/* branch switcher controlled with env for matria and nura */}
181
233
  {!process.env.REACT_APP_SHOW_BRANCH_SWITCHER ? <div className="branch-switcher">{globalCustomerHeader()}</div> : null}
182
234
  {/* <div className="branch-switcher">{globalCustomerHeader()}</div> */}
235
+
183
236
  {/* Search Option */}
237
+
184
238
  {/* <ModalSearch /> */}
239
+
185
240
  {/* Search Option Ends */}
241
+
186
242
  {/* Configurator Actions */}
187
243
  {user.isAdmin ? (
188
244
  <>
@@ -196,9 +252,13 @@ function GlobalHeaderContent({ loading, appSettings, children, isConnected, hist
196
252
  </>
197
253
  ) : null}
198
254
  {/* Configurator Actions Ends */}
255
+
199
256
  {/* Reload Button */}
257
+
200
258
  <Button onClick={reload} icon={<ReloadOutlined />} type="default" size={'small'}></Button>
259
+
201
260
  {/* Reload Button Ends */}
261
+
202
262
  {/* Help-desk-btn */}
203
263
  {helpDeskSetting?.showSupportBtn
204
264
  ? (() => {
@@ -217,9 +277,11 @@ function GlobalHeaderContent({ loading, appSettings, children, isConnected, hist
217
277
  );
218
278
  })()
219
279
  : null}
280
+
220
281
  {/** Switch Languages starts */}
221
282
  {process.env.REACT_APP_ENABLE_LANGUAGE_SWITCHER ? <LanguageSwitcher /> : null}
222
283
  {/** Switch Languages ends */}
284
+
223
285
  {/* User Profile */}
224
286
  <div style={{ padding: '10px' }}>
225
287
  <ProfileAvatar />
@@ -228,9 +290,11 @@ function GlobalHeaderContent({ loading, appSettings, children, isConnected, hist
228
290
  {/* User Profile Ends */}
229
291
  </div>
230
292
  ) : null}
293
+
231
294
  {/* Page Menu Actions Ends */}
232
295
  </div>
233
296
  ) : null}
297
+
234
298
  {/* The children is rendered */}
235
299
  {children}
236
300
  {/* The children is rendered */}
@@ -238,40 +302,32 @@ function GlobalHeaderContent({ loading, appSettings, children, isConnected, hist
238
302
  {/* Right Section of the Component Loader Ends */}
239
303
  </div>
240
304
  </div>
241
- {licAlert && licenseData && (
242
- <div
243
- style={{
244
- top: 0,
245
- marginTop: '3rem',
246
- right: '2%',
247
- position: 'absolute',
248
- zIndex: 1008,
249
- }}
250
- >
251
- <LicenseAlert data={licenseData} />
252
- </div>
253
- )}
254
- </>
255
305
  );
256
306
  }
307
+
257
308
  export default function GlobalHeader(props) {
258
309
  const context = useContext(GlobalContext);
310
+
259
311
  if (context.dispatch) {
260
312
  return <GlobalHeaderContent {...props} />;
261
313
  }
314
+
262
315
  return (
263
316
  <GlobalProvider {...props} appSettings={props.appSettings}>
264
317
  <GlobalHeaderContent {...props} />
265
318
  </GlobalProvider>
266
319
  );
267
320
  }
321
+
268
322
  /**
269
323
  *
270
324
  * @returns
271
325
  */
272
326
  function ProfileAvatar() {
273
327
  const { user = { locations: [] } } = useContext(GlobalContext);
328
+
274
329
  useEffect(() => {}, []);
330
+
275
331
  return (
276
332
  <Link className="profile-avatar" to="/profile">
277
333
  {user.photograph ? (
@@ -281,7 +337,8 @@ function ProfileAvatar() {
281
337
  ) : (
282
338
  <Avatar shape="square" size="small" icon={<UserOutlined />} />
283
339
  )}
340
+
284
341
  {/* {user.name} */}
285
342
  </Link>
286
343
  );
287
- }
344
+ }
@@ -109,7 +109,7 @@ import ConsentComponent from './consent/consent'
109
109
  import TaskOverviewLegacy from './../models/process/components/task-overview-legacy/task-overview-legacy'
110
110
 
111
111
  import ReportingDashboard from '../../modules/reporting/components/reporting-dashboard/reporting-dashboard';
112
- import ReportingTable from '../../modules/reporting/components/reporting-dashboard/reporting-table'
112
+
113
113
  import ProcessStepsPage from '../../modules/steps/steps'
114
114
  export {
115
115
 
@@ -198,7 +198,7 @@ export {
198
198
  TaskOverviewLegacy,
199
199
  // WebCamera,
200
200
  ConsentComponent,
201
- ReportingTable,
201
+
202
202
  ReportingDashboard,
203
203
  ProcessStepsPage
204
204