datastake-daf 0.6.746 → 0.6.748

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 (48) hide show
  1. package/dist/components/index.js +769 -461
  2. package/dist/hooks/index.js +2 -2
  3. package/dist/layouts/index.js +497 -440
  4. package/dist/pages/index.js +3414 -683
  5. package/dist/services/index.js +23 -1
  6. package/dist/utils/index.js +497 -440
  7. package/package.json +1 -1
  8. package/src/@daf/core/components/Dashboard/Widget/ActivityIndicators/ActivityIndicators.stories.js +252 -0
  9. package/src/@daf/core/components/Dashboard/Widget/ActivityIndicators/config.js +76 -0
  10. package/src/@daf/core/components/Dashboard/Widget/ActivityIndicators/index.jsx +184 -0
  11. package/src/@daf/core/components/Dashboard/Widget/ActivityIndicators/style.js +119 -0
  12. package/src/@daf/core/components/Icon/configs/Aid.js +10 -0
  13. package/src/@daf/core/components/Icon/configs/Bear.js +8 -0
  14. package/src/@daf/core/components/Icon/configs/Minus.js +10 -0
  15. package/src/@daf/core/components/Icon/configs/Security.js +12 -0
  16. package/src/@daf/core/components/Icon/configs/index.js +8 -0
  17. package/src/@daf/hooks/useSources.js +1 -1
  18. package/src/@daf/pages/Summary/Activities/Restoration/helper.js +86 -2
  19. package/src/@daf/pages/Summary/Activities/Restoration/index.jsx +20 -19
  20. package/src/@daf/pages/Summary/Minesite/components/LocationMap/index.js +61 -0
  21. package/src/@daf/pages/Summary/Minesite/components/MineSiteDetails/config.js +77 -0
  22. package/src/@daf/pages/Summary/Minesite/components/MineSiteDetails/index.js +47 -0
  23. package/src/@daf/pages/Summary/Minesite/components/StakeholderMapping/config.js +26 -0
  24. package/src/@daf/pages/Summary/Minesite/components/StakeholderMapping/helper.js +64 -0
  25. package/src/@daf/pages/Summary/Minesite/components/StakeholderMapping/index.js +56 -0
  26. package/src/@daf/pages/Summary/Minesite/index.jsx +162 -0
  27. package/src/@daf/pages/Summary/Operator/components/Governance/config.js +26 -0
  28. package/src/@daf/pages/Summary/Operator/components/Governance/helper.js +61 -0
  29. package/src/@daf/pages/Summary/Operator/components/Governance/index.js +55 -0
  30. package/src/@daf/pages/Summary/Operator/components/KeyInformation/config.js +84 -0
  31. package/src/@daf/pages/Summary/Operator/components/KeyInformation/index.js +46 -0
  32. package/src/@daf/pages/Summary/Operator/components/TradeRelationships/config.js +40 -0
  33. package/src/@daf/pages/Summary/Operator/components/TradeRelationships/helper.js +98 -0
  34. package/src/@daf/pages/Summary/Operator/components/TradeRelationships/hook.js +160 -0
  35. package/src/@daf/pages/Summary/Operator/components/TradeRelationships/index.js +83 -0
  36. package/src/@daf/pages/Summary/Operator/hook.js +176 -0
  37. package/src/@daf/pages/Summary/Operator/index.jsx +170 -0
  38. package/src/@daf/pages/Summary/components/InformationAvailability/components/Contributions/index.js +36 -0
  39. package/src/@daf/pages/Summary/components/InformationAvailability/components/InformationCompleteness/index.js +58 -0
  40. package/src/@daf/pages/Summary/components/InformationAvailability/index.js +42 -0
  41. package/src/@daf/pages/Summary/hook.js +188 -0
  42. package/src/@daf/services/OperatorService.js +16 -0
  43. package/src/@daf/services/SourceService.js +1 -1
  44. package/src/helpers/StringHelper.js +7 -0
  45. package/src/index.js +1 -0
  46. package/src/pages.js +2 -2
  47. package/src/@daf/pages/Summary/minesite/index.js +0 -0
  48. package/src/@daf/pages/Summary/operator/index.jsx +0 -76
@@ -218,6 +218,10 @@ import userIcon from "./userIcon";
218
218
  import partnerIcon from "./partnerIcon";
219
219
  import LifeCycle from "./LifeCycle";
220
220
  import EventCalendar from "./EventCalendar";
221
+ import Aid from "./Aid";
222
+ import Bear from "./Bear";
223
+ import Security from "./Security";
224
+ import Minus from "./Minus";
221
225
 
222
226
  const config = {
223
227
  AppAdmin,
@@ -440,6 +444,10 @@ const config = {
440
444
  partnerIcon,
441
445
  LifeCycle,
442
446
  EventCalendar,
447
+ Aid,
448
+ Bear,
449
+ Security,
450
+ Minus,
443
451
  };
444
452
 
445
453
  export default config;
@@ -82,7 +82,7 @@ export default function useSource({ user = {}, t = () => {}, getData = () => {},
82
82
 
83
83
  export const useSources = ({type, id, user, t = () => {}}) => {
84
84
  function getData(params) {
85
- if(id) {
85
+ if(id !== undefined && id !== null) {
86
86
  return SourceService.getSources({type, id});
87
87
  } else {
88
88
  return SourceService.get(null, params);
@@ -2,6 +2,11 @@
2
2
  // REGION: Photo/Image Extraction
3
3
  // ============================================================================
4
4
 
5
+ /**
6
+ * Normalize URL by removing trailing colon if present
7
+ */
8
+ const normalizeUrl = (url) => url?.endsWith(':') ? url.slice(0, -1) : url;
9
+
5
10
  /**
6
11
  * Extract images from a photo document
7
12
  * Handles both documents with pictures arrays and direct image objects
@@ -16,9 +21,27 @@ export const extractFromPhotoDoc = (photoDoc, label, docIndex) => {
16
21
  };
17
22
 
18
23
  /**
19
- * Normalize URL by removing trailing colon if present
24
+ * Extract and process images from activity data
25
+ * Processes group photos and activity photos (start, during, end) into a flat array
26
+ *
27
+ * @param {Object} activityData - Activity data object containing photo arrays
28
+ * @returns {Array} - Flat array of image objects with src and alt properties
20
29
  */
21
- const normalizeUrl = (url) => url?.endsWith(':') ? url.slice(0, -1) : url;
30
+ export const getActivityImages = (activityData) => {
31
+ const photoArrays = [
32
+ { data: activityData?.groupPhotos, label: 'Group Photo' },
33
+ { data: activityData?.photosStartActivity, label: 'Start of Activity' },
34
+ { data: activityData?.photosDuringActivity, label: 'During Activity' },
35
+ { data: activityData?.photosEndActivity, label: 'End of Activity' }
36
+ ];
37
+
38
+ return photoArrays
39
+ .flatMap(({ data, label }) =>
40
+ Array.isArray(data)
41
+ ? data.flatMap((photoDoc, index) => extractFromPhotoDoc(photoDoc, label, index))
42
+ : []
43
+ );
44
+ };
22
45
 
23
46
  // ============================================================================
24
47
  // REGION: Gender Distribution
@@ -95,4 +118,65 @@ export const getGenderTooltipChildren = (item, isEmpty, genderDistributionData,
95
118
  },
96
119
  ],
97
120
  });
121
+ };
122
+
123
+ // ============================================================================
124
+ // REGION: Activity Indicators
125
+ // ============================================================================
126
+
127
+ /**
128
+ * Maps activityData value to indicator type
129
+ * "yes" or true → "compliant"
130
+ * "no" or false → "notCompliant"
131
+ * null or undefined → "empty"
132
+ */
133
+ export const getIndicatorType = (value) => {
134
+ if (value === "yes" || value === true) return "compliant";
135
+ if (value === "no" || value === false) return "notCompliant";
136
+ if (value === null || value === undefined) return "empty";
137
+ return "empty"; // default fallback
138
+ };
139
+
140
+ /**
141
+ * Special case: Children presence indicator configuration
142
+ * Children presence is compliant if answered 'no', not compliant if answered 'yes'
143
+ * Custom icons: "no" (compliant) → X icon with green badge, "yes" (notCompliant) → Check icon with red badge
144
+ *
145
+ * @param {string|boolean|null} value - The presenceOfChildren value from activityData
146
+ * @returns {Object} - Configuration object with type and optional statusIcon
147
+ */
148
+ export const getChildrenPresenceConfig = (value) => {
149
+ if (value === "no" || value === false) {
150
+ return { type: "compliant", statusIcon: "Close" }; // X icon with green badge
151
+ }
152
+ if (value === "yes" || value === true) {
153
+ return { type: "notCompliant", statusIcon: "Check" }; // Check icon with red badge
154
+ }
155
+ return { type: "empty" }; // empty state
156
+ };
157
+
158
+ /**
159
+ * Get activity indicators configuration from activityData
160
+ * Maps activityData fields to indicator config objects with icon, label, type, and optional statusIcon
161
+ *
162
+ * @param {Object} activityData - Activity data object
163
+ * @param {Function} t - Translation function
164
+ * @returns {Array} - Array of indicator config objects
165
+ */
166
+ export const getActivityIndicatorsConfig = (activityData, t) => {
167
+ const childrenPresenceConfig = getChildrenPresenceConfig(activityData?.presenceOfChildren);
168
+
169
+ return [
170
+ { icon: "Aid", label: t("Aid kit availability"), type: getIndicatorType(activityData?.aidKitAccessible) },
171
+ { icon: "MineOperators", label: t("H&S training delivery"), type: getIndicatorType(activityData?.hsTrainingConfirmation) },
172
+ { icon: "Users", label: t("Workers safe pairing"), type: getIndicatorType(activityData?.duosFormed) },
173
+ {
174
+ icon: "Bear",
175
+ label: t("Children presence"),
176
+ type: childrenPresenceConfig.type,
177
+ ...(childrenPresenceConfig.statusIcon && { statusIcon: childrenPresenceConfig.statusIcon })
178
+ },
179
+ { icon: "Security", label: t("Security presence"), type: getIndicatorType(activityData?.focalPointPresent) },
180
+ { icon: "UserCircle", label: t("Relay presence"), type: getIndicatorType(activityData?.relayPresent) },
181
+ ];
98
182
  };
@@ -1,29 +1,14 @@
1
1
  import { useMemo, useCallback } from 'react';
2
- import { DashboardLayout, Header, ImageCarousel, KeyIndicators, MineSiteMap, Widget, PieChart } from '../../../../../../src/index.js'
2
+ import { DashboardLayout, Header, ImageCarousel, KeyIndicators, MineSiteMap, Widget, PieChart, ActivityIndicators } from '../../../../../../src/index.js'
3
3
  import { getKeyIndicatorsRowConfig } from './config';
4
- import { extractFromPhotoDoc, getGenderDistributionData, isGenderDistributionEmpty, calculateGenderPieData, getGenderTooltipChildren } from './helper';
4
+ import { getActivityImages, getGenderDistributionData, isGenderDistributionEmpty, calculateGenderPieData, getGenderTooltipChildren, getActivityIndicatorsConfig } from './helper';
5
5
  import { renderTooltipJsx } from '../../../../../../src/utils';
6
6
  import { useResizeContext } from '../../../../../../src/context';
7
7
 
8
8
  const RestorationActivitySummary = ({ activityData, supportText, onDownload, downloadDisabled, actionButtons, breadcrumbs, goBackTo, loading, t = () => { } }) => {
9
9
  const { isCollapsed, isNestedSidebarCollapsed } = useResizeContext();
10
10
  const keyIndicatorsConfig = useMemo(() => getKeyIndicatorsRowConfig({ t, data: activityData }), [t, activityData]);
11
- const images = useMemo(() => {
12
-
13
- const photoArrays = [
14
- { data: activityData?.groupPhotos, label: 'Group Photo' },
15
- { data: activityData?.photosStartActivity, label: 'Start of Activity' },
16
- { data: activityData?.photosDuringActivity, label: 'During Activity' },
17
- { data: activityData?.photosEndActivity, label: 'End of Activity' }
18
- ];
19
-
20
- return photoArrays
21
- .flatMap(({ data, label }) =>
22
- Array.isArray(data)
23
- ? data.flatMap((photoDoc, index) => extractFromPhotoDoc(photoDoc, label, index))
24
- : []
25
- );
26
- }, [activityData]);
11
+ const images = useMemo(() => getActivityImages(activityData), [activityData]);
27
12
  const genderDistributionData = useMemo(() => getGenderDistributionData(activityData), [activityData]);
28
13
  const isEmpty = useMemo(() => isGenderDistributionEmpty(genderDistributionData), [genderDistributionData]);
29
14
  const pieData = useMemo(() => calculateGenderPieData(genderDistributionData), [genderDistributionData]);
@@ -32,6 +17,13 @@ const RestorationActivitySummary = ({ activityData, supportText, onDownload, dow
32
17
  (item) => getGenderTooltipChildren(item, isEmpty, genderDistributionData, t, renderTooltipJsx),
33
18
  [t, isEmpty, genderDistributionData],
34
19
  );
20
+
21
+ // Activity Indicators Config - mapped from activityData
22
+ const activityIndicatorsConfig = useMemo(() =>
23
+ getActivityIndicatorsConfig(activityData, t),
24
+ [activityData, t]
25
+ );
26
+
35
27
  return (
36
28
  <DashboardLayout
37
29
  header={
@@ -54,7 +46,7 @@ const RestorationActivitySummary = ({ activityData, supportText, onDownload, dow
54
46
  <section>
55
47
  <Widget
56
48
  title={t("Activity Location")}
57
- className="no-px no-pb-body"
49
+ className="no-px no-pt-body no-p-body no-pb-body"
58
50
  style={{ height: '100%', display: 'flex', flexDirection: 'column' }}
59
51
  >
60
52
  <div style={{ flex: 1, minHeight: 0 }}>
@@ -135,6 +127,15 @@ const RestorationActivitySummary = ({ activityData, supportText, onDownload, dow
135
127
  </Widget>
136
128
  </section>
137
129
 
130
+ <section>
131
+ <ActivityIndicators
132
+ config={activityIndicatorsConfig}
133
+ loading={loading}
134
+ title={t("Activity Indicators")}
135
+ className="small-content"
136
+ />
137
+ </section>
138
+
138
139
  <section>
139
140
  <div style={{ maxWidth: "70%", width: "calc(100% - 405px)" }}>
140
141
  <ImageCarousel
@@ -0,0 +1,61 @@
1
+ import React, { useMemo } from 'react'
2
+ import Widget from '../../../../../core/components/Dashboard/Widget/index.jsx'
3
+ import Map from '../../../../../core/components/Dashboard/Map/index.jsx'
4
+ import { getLinkValue } from '../../../../../../helpers/StringHelper.js'
5
+
6
+ const LocationMap = ({
7
+ selectedPartners = {},
8
+ t = () => {},
9
+ params,
10
+ locationData = {},
11
+ loading = false,
12
+ }) => {
13
+ const data = useMemo(() => {
14
+ return {
15
+ gps: locationData?.gps || {},
16
+ name: locationData?.name || "",
17
+ admin_level_01:
18
+ locationData?.linking?.SCL?.[locationData?.administrativeLevel1]?.name || "",
19
+ admin_level_02:
20
+ locationData?.linking?.SCL?.[locationData?.administrativeLevel2]?.name || "",
21
+ country: locationData?.country,
22
+ };
23
+ }, [locationData]);
24
+
25
+
26
+ return (
27
+ <Widget
28
+ title={t("Location")}
29
+ className="no-px no-pb-body overflow-hidden"
30
+ loading={loading}
31
+ >
32
+ <Map
33
+ showSider={false}
34
+ primaryLink={true}
35
+ mapConfig={{
36
+ maxZoom: 10,
37
+ }}
38
+ type={"location"}
39
+ data={[data]}
40
+ renderTooltip={() => {
41
+ const country = data?.country;
42
+ const adminLevel1Label = t("Province")
43
+ const adminLevel2Label = t("Territory");
44
+
45
+ return [
46
+ {
47
+ label: t(adminLevel1Label),
48
+ value: data?.admin_level_01 || "--",
49
+ },
50
+ {
51
+ label: t(adminLevel2Label),
52
+ value: data?.admin_level_02 || "--",
53
+ },
54
+ ];
55
+ }}
56
+ />
57
+ </Widget>
58
+ )
59
+ }
60
+
61
+ export default LocationMap
@@ -0,0 +1,77 @@
1
+ import React from "react";
2
+ import { Tag } from "antd";
3
+ import { getTagColor } from "../../../../../utils/productTag.js";
4
+
5
+ export function getKeyIndicatorsConfig({ t, data }) {
6
+ return [
7
+ {
8
+ label: t("Extraction Methods"),
9
+ render: () => {
10
+ if (!data?.extractionPoints?.length) {
11
+ return "-";
12
+ }
13
+ return (
14
+ <div
15
+ style={{
16
+ display: "flex",
17
+ flexWrap: "wrap",
18
+ }}
19
+ >
20
+ {data?.extractionPoints?.map((method) => {
21
+ return (
22
+ <Tag
23
+ key={method}
24
+ style={{
25
+ marginBottom: 8,
26
+ }}
27
+ >
28
+ {method}
29
+ </Tag>
30
+ );
31
+ })}
32
+ </div>
33
+ );
34
+ },
35
+ },
36
+ {
37
+ label: t("Products"),
38
+ render: () => {
39
+ if (data?.productsOfLocation?.length === 0) {
40
+ return "-";
41
+ }
42
+
43
+ return (
44
+ <div
45
+ style={{
46
+ display: "flex",
47
+ flexWrap: "wrap",
48
+ }}
49
+ >
50
+ {data?.productsOfLocation?.map((product) => {
51
+ return (
52
+ <Tag
53
+ key={product}
54
+ style={{
55
+ marginBottom: 8,
56
+ }}
57
+ color={getTagColor(product)}
58
+ >
59
+ {product}
60
+ </Tag>
61
+ );
62
+ })}
63
+ </div>
64
+ );
65
+ },
66
+ },
67
+ {
68
+ label: t("Number of Workers on Site"),
69
+ render: () => {
70
+ if (!data.workers) {
71
+ return "-";
72
+ }
73
+ return data.workers;
74
+ },
75
+ },
76
+ ];
77
+ }
@@ -0,0 +1,47 @@
1
+ import React, { useMemo } from 'react'
2
+ import { getKeyIndicatorsConfig } from './config.js'
3
+ import KeyIndicatorsWidget from '../../../../../core/components/Dashboard/Widget/KeyIndicators/index.jsx'
4
+
5
+ const MineSiteDetails = ({
6
+ locationData = {},
7
+ loading = false,
8
+ t = () => {},
9
+ options = {}
10
+ }) => {
11
+
12
+ const data = useMemo(() => {
13
+ return {
14
+ extractionPoints: (locationData?.extractionMethod || []).map((method) => {
15
+ const _method = options?.extractionMethodsOptions?.find(
16
+ (option) => option.value === method,
17
+ )?.label;
18
+
19
+ return _method;
20
+ }),
21
+ products: (
22
+ (locationData?.products || []).map((product) => product.typeOfProduct) || []
23
+ ).map((product) => {
24
+ const _product = options?.minerals?.find(
25
+ (option) => option.value === product,
26
+ )?.label;
27
+
28
+ return _product;
29
+ }),
30
+ workers: locationData?.totalNumberOfWorkers || 0,
31
+ };
32
+ }, [locationData, options]);
33
+
34
+ const config = useMemo(() => getKeyIndicatorsConfig({ t, data }), [t, data]);
35
+
36
+ return (
37
+ <KeyIndicatorsWidget
38
+ title={t("Mine Site Details")}
39
+ className="value-center small-content row-content-col"
40
+ config={config}
41
+ loading={loading}
42
+ widgetClassName="custom-width-b"
43
+ />
44
+ )
45
+ }
46
+
47
+ export default MineSiteDetails
@@ -0,0 +1,26 @@
1
+ export const IconNodesConfig = {
2
+ operators: {
3
+ name: "nashiriki::Operators",
4
+ icon: "Worker",
5
+ order: 1,
6
+ emptyName: "no-operators",
7
+ },
8
+ traders: {
9
+ name: "nashiriki::Traders",
10
+ icon: "Handshake",
11
+ order: 2,
12
+ emptyName: "no-traders",
13
+ },
14
+ government: {
15
+ name: "nashiriki::Government",
16
+ icon: "KYC",
17
+ order: 3,
18
+ emptyName: "no-government",
19
+ },
20
+ other: {
21
+ name: "nashiriki::Other",
22
+ icon: "CivilSociety",
23
+ order: 4,
24
+ emptyName: "no-other",
25
+ },
26
+ };
@@ -0,0 +1,64 @@
1
+ import { IconNodesConfig } from './config.js';
2
+
3
+ export const getStakeholderMappingData = ({data, locationData, id, options, t, goTo, selectedPartners}) => {
4
+ const _data = data;
5
+
6
+ return {
7
+ id: id,
8
+ name: locationData?.name || "",
9
+ country: {
10
+ label:
11
+ options?.countries?.find((country) => country.value === locationData?.country)
12
+ ?.label || "",
13
+ value: (locationData?.country || "").toLowerCase() || "",
14
+ },
15
+ onClick: () => goTo(`/app/view/production-sites/${id}`),
16
+ totalSources: selectedPartners?.partners?.length || 0,
17
+ backgroundColor: "#FFD6E7",
18
+ iconColor: "#C41D7F",
19
+
20
+ icon: "DashboardLocations",
21
+ children: Object.keys(_data)?.map((key, index) => {
22
+ return {
23
+ id: key,
24
+ name: t(IconNodesConfig[key]?.name),
25
+ icon: IconNodesConfig[key]?.icon,
26
+ order: IconNodesConfig[key]?.order || index + 1,
27
+ activeColour: "#b6f5ec",
28
+ iconHoverColor: "#fff",
29
+ hoverColor: "#36cfca",
30
+ content: _data[key].length,
31
+ emptyName: IconNodesConfig[key]?.emptyName
32
+ ? t(`nashiriki::${IconNodesConfig[key]?.emptyName}`)
33
+ : undefined,
34
+ children: (_data[key] || [])?.map((child) => {
35
+ return {
36
+ id: child?.datastakeId || "",
37
+ name: child?.name || "",
38
+ country: {
39
+ label:
40
+ options?.countries?.find(
41
+ (country) => country.value === child?.country,
42
+ )?.label || "",
43
+ value: child?.country ? child?.country?.toLowerCase() : "",
44
+ },
45
+
46
+ icon: "DashboardStakeholder",
47
+ onClick: () => {
48
+ if (child?.type === "operator") {
49
+ goTo(`/app/summary/operators/${child.datastakeId}`);
50
+ return;
51
+ }
52
+
53
+ goTo(`/app/view/stakeholders/${child.datastakeId}`);
54
+ },
55
+ totalSources: child?.sources || 0,
56
+ tooltipHeader: t("nashiriki::link-details"),
57
+ tooltipLabel: t("nashiriki::sources-reporting"),
58
+ value: child?.sources || 0,
59
+ };
60
+ }),
61
+ };
62
+ }),
63
+ };
64
+ }
@@ -0,0 +1,56 @@
1
+ import React, { useMemo } from 'react'
2
+ import { useWidgetFetch } from '../../../../../hooks/useWidgetFetch.js';
3
+ import { getStakeholderMappingData } from './helper.js';
4
+ import Widget from '../../../../../core/components/Dashboard/Widget/index.jsx';
5
+ import StakeholderMappings from '../../../../../core/components/Graphs/StakeholderMappings/index.jsx';
6
+
7
+ const StakeholderMapping = ({
8
+ t = () => {},
9
+ id,
10
+ options = {},
11
+ goTo = () => {},
12
+ selectedPartners = {},
13
+ locationData = {},
14
+ }) => {
15
+
16
+ const defaultFilter = useMemo(() => {
17
+ return {
18
+ basepath: "analytics",
19
+ url: "/widgets/information-map-graph",
20
+ defaultData: [],
21
+ stop: selectedPartners?.loading,
22
+ filters: {
23
+ datastakeId: id,
24
+ sources: selectedPartners?.partners || [],
25
+ coreSubject: "location",
26
+ filterBySources: false,
27
+ metrics: {
28
+ operator: ['operator'],
29
+ government: ['custom', 'governance'],
30
+ trader: ['trade'],
31
+ other: ['civilSociety', 'international'],
32
+ }
33
+ },
34
+ };
35
+ }, [selectedPartners, id]);
36
+
37
+ const { data, loading } = useWidgetFetch({config: defaultFilter});
38
+
39
+ const graphData = useMemo(() => {
40
+ return getStakeholderMappingData({data, locationData, id, options, t, goTo, selectedPartners});
41
+ }, [data, locationData, id, options, t, goTo, selectedPartners]);
42
+
43
+ return (
44
+ <Widget
45
+ loading={loading}
46
+ title={t("Stakeholder Mapping")}
47
+ className={"with-border-header no-px no-p-body"}
48
+ >
49
+ <div style={{ height: 600 }}>
50
+ <StakeholderMappings data={graphData} t={t} />
51
+ </div>
52
+ </Widget>
53
+ )
54
+ }
55
+
56
+ export default StakeholderMapping