Skip to content

Commit f8420a9

Browse files
committed
Better custom pins
1 parent d1ed0c6 commit f8420a9

File tree

2 files changed

+64
-23
lines changed

2 files changed

+64
-23
lines changed

src/components/WorldMap.css

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
background-color: var(--darker);
2222
color: var(--text-color);
2323
box-shadow: var(--box-shadow);
24-
padding: 20px;
24+
padding: 1em;
2525
overflow-y: auto;
2626
transition: transform 0.3s ease-in-out;
2727
border-left: 1px solid var(--border-color);
@@ -93,7 +93,11 @@
9393
}
9494

9595
.accordion-item-details {
96-
padding: 15px;
96+
overflow: hidden;
97+
text-overflow: ellipsis; /* Adds ellipsis for truncated content */
98+
white-space: nowrap; /* Prevents wrapping */
99+
margin-top: 0.2em;
100+
padding: 0;
97101
background-color: var(--darker);
98102
color: var(--text-color);
99103
border-top: 1px solid var(--border-color);
@@ -125,10 +129,15 @@
125129
transition: transform 0.2s ease;
126130
cursor: pointer;
127131
border-radius: 50%;
128-
border: 3px solid var(--lightest);
132+
border: 6px solid var(--darkest);
129133
text-align: center;
130-
color: white;
134+
color: var(--darkest);
131135
font-size: 12px;
136+
flex: 1;
137+
display: flex;
138+
justify-content: center;
139+
align-items: center;
140+
text-align: center;
132141
}
133142

134143
.custom-pin:hover {
@@ -140,12 +149,18 @@
140149
transition: transform 0.2s ease;
141150
cursor: pointer;
142151
background-color: var(--blue);
143-
width: 36px;
144-
height: 36px;
152+
width: 48px;
153+
height: 48px;
145154
border-radius: 50%;
146-
border: 3px solid var(--grey);
155+
border: 6px solid var(--darkest);
156+
display: flex;
157+
justify-content: center;
158+
align-items: center;
159+
text-align: center;
160+
color: var(--darkest);
147161
}
148162

149163
.probe-pin:hover {
150164
transform: scale(1.1);
151165
}
166+

src/components/WorldMap.js

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ import "react-leaflet-markercluster/dist/styles.min.css";
66
import L from "leaflet";
77
import "./WorldMap.css";
88
import TimeAgo from 'react-timeago';
9+
import { FaBroadcastTower, FaServer } from 'react-icons/fa';
10+
import ReactDOMServer from 'react-dom/server';
11+
const broadcastTowerIconHTML = ReactDOMServer.renderToString(<FaBroadcastTower />);
12+
const serverIconHTML = ReactDOMServer.renderToString(<FaServer />);
913

1014
// Hardcoded probe region pins
1115
const probeRegions = [
@@ -31,7 +35,7 @@ const AccordionItem = ({ instanceScore, orchObj, instanceObj, startExpanded }) =
3135
{isExpanded && (
3236
<div className="accordion-item-details">
3337
<strong>{orchObj.id}</strong>
34-
<div><strong>KPI score:</strong> {instanceScore.toFixed(4) * 100}%</div>
38+
<div><strong>KPI score:</strong> {(instanceScore * 100).toFixed(1)}%</div>
3539
<hr />
3640
<strong>Global Stats:</strong>
3741
<p>Discovery Time: {orchObj.avgDiscoveryTime.toPrecision(3)} ms</p>
@@ -59,25 +63,49 @@ const AccordionItem = ({ instanceScore, orchObj, instanceObj, startExpanded }) =
5963
);
6064
};
6165

66+
// Helper function to group instances by instance.id
67+
const groupInstancesById = (markers) => {
68+
return markers.reduce((acc, marker) => {
69+
const instanceId = marker.options.options.instanceObj.id;
70+
71+
if (!acc[instanceId]) {
72+
acc[instanceId] = [];
73+
}
74+
acc[instanceId].push(marker);
75+
76+
return acc;
77+
}, {});
78+
};
79+
6280
// Side panel to show selected cluster or marker details
6381
const SidePanel = ({ selectedData, onClose }) => {
6482
if (!selectedData) return null;
6583

84+
// Group the markers by instance ID if a cluster is selected
85+
const groupedData = Array.isArray(selectedData) ? groupInstancesById(selectedData) : null;
86+
6687
return (
6788
<div className="side-panel">
6889
<button onClick={onClose} className="close-button">
6990
Close
7091
</button>
7192
{Array.isArray(selectedData) ? (
72-
// Cluster is selected
93+
// Cluster is selected, group by instance ID
7394
<div className="accordion">
74-
{selectedData.map((marker, index) => (
75-
<AccordionItem
76-
key={index}
77-
instanceScore={marker.options.options.instanceScore}
78-
orchObj={marker.options.options.orchObj}
79-
instanceObj={marker.options.options.instanceObj}
80-
/>
95+
{Object.keys(groupedData).map((instanceId) => (
96+
<div key={instanceId} className="accordion-item-wrapper">
97+
<strong>{instanceId}</strong>
98+
<div className="accordion-item-details">
99+
{groupedData[instanceId].map((marker, index) => (
100+
<AccordionItem
101+
key={index}
102+
instanceScore={marker.options.options.instanceScore}
103+
orchObj={marker.options.options.orchObj}
104+
instanceObj={marker.options.options.instanceObj}
105+
/>
106+
))}
107+
</div>
108+
</div>
81109
))}
82110
</div>
83111
) : (
@@ -129,7 +157,7 @@ const WorldMap = ({ orchestrators, selectedKPI }) => {
129157
.reduce((sum, score) => sum + score, 0) / childCount
130158
).toFixed(2);
131159

132-
let size = Math.min(20 + childCount * 2, 80);
160+
let size = Math.min(36 + childCount * 2, 96);
133161
const color = getPinColor(avgScore);
134162

135163
return L.divIcon({
@@ -210,11 +238,9 @@ const WorldMap = ({ orchestrators, selectedKPI }) => {
210238
className: "dummy",
211239
html: `<div class="custom-pin" style="background-color: ${selectedData?.instanceObj?.id === instance.id ? "var(--magenta)" :
212240
getPinColor(instance[selectedKPI])
213-
}; width: ${selectedData?.instanceObj?.id === instance.id ? "36px" :
214-
"24px"
215-
}; height: ${selectedData?.instanceObj?.id === instance.id ? "36px" :
216-
"24px"
217-
}; border-radius: 50%;"></div>`,
241+
}; width: ${selectedData?.instanceObj?.id === instance.id ? "48px" : "36px"
242+
}; height: ${selectedData?.instanceObj?.id === instance.id ? "48px" : "36px"
243+
}; border-radius: 50%;">${serverIconHTML}</div>`,
218244
})}
219245
eventHandlers={{
220246
click: () => {
@@ -247,7 +273,7 @@ const WorldMap = ({ orchestrators, selectedKPI }) => {
247273
position={[region.latitude, region.longitude]}
248274
icon={L.divIcon({
249275
className: 'dummy',
250-
html: `<div class="probe-pin""></div>`,
276+
html: `<div class="probe-pin">${broadcastTowerIconHTML}</div>`,
251277
})}
252278
>
253279
<Tooltip>

0 commit comments

Comments
 (0)