I have a sidebar with li
elements generated with JS but I want to avoid displaying the li
element that has some empty elements inside.
So far, I succesfully hid the country name and the link name from the sidebar for Ireland but I couldn't figure it out how to eliminate also the li containing the empty names.
My array of objects contain 2 countries but since Ireland doesn't contains elements, I want li
corresponding to Ireland to be removed.
The HTML of li generated looks like:
<li class="agency">
<a href="#" class="agency-link" id="IE">
<img src="https://via.placeholder.com/150" alt="Ireland">
<div class="agency-content">
<h4 class="country-name"></h4>
<span class="agencies-names"></span>
</div>
</a>
</li>
The condition I wrote for hidding the country name and link name for Ireland since they are empty in the object is:
if ((group.data[i][`linkName${codeLang}`] && group.data[i][`link${codeLang}`]) != "") {
agencyN.textContent = group.data[i][`linkName${codeLang}`];
countryN.textContent = group.data[i][`country${codeLang}`];
} else {
// remove the li that doesn't have displayed the country name or the link name
}
Could anyone please explain? Thanks!
am4core.ready(function () {
am4core.useTheme(am4themes_animated);
let chart = am4core.create("map", am4maps.MapChart);
chart.responsive.enabled = true;
chart.geodata = am4geodata_worldHigh;
chart.projection = new am4maps.projections.Miller();
chart.zoomControl = new am4maps.ZoomControl();
let homeButton = new am4core.Button();
homeButton.events.on("hit", function () {
chart.goHome();
});
homeButton.icon = new am4core.Sprite();
homeButton.padding(7, 5, 7, 5);
homeButton.width = 30;
homeButton.icon.path = "M16,8 L14,8 L14,16 L10,16 L10,10 L6,10 L6,16 L2,16 L2,8 L0,8 L8,0 L16,8 Z M16,8";
homeButton.marginBottom = 10;
homeButton.parent = chart.zoomControl;
homeButton.insertBefore(chart.zoomControl.plusButton);
chart.homeZoomLevel = 3.3;
chart.homeGeoPoint = { longitude: 14.5, latitude: 54 };
let colorSet = "#000";
let groupData = [
{
"data": [
{
"countryEN": "Austria",
"id": "AT",
"linkEN": ["http://www.example.com"],
"linkNameEN": ["Link Name 1"],
"capital": "Vienna",
"latitude": 48.2082,
"longitude": 16.3738,
"color": colorSet,
"img": "https://via.placeholder.com/150"
},
{
"countryEN": "Ireland",
"id": "IE",
"linkEN": [""],
"linkNameEN": [""],
"capital": "Dublin",
"latitude": 53.3498,
"longitude": -6.2603,
"color": colorSet,
"img": "https://via.placeholder.com/150"
}
]
}
];
let excludedCountries = ["AQ"];
const findUrl = "http://www.example.com/en/";
const regex = /\.com\/(\w{2})\//;
const match = regex.exec(findUrl);
const result = match && match[1];
let codeLang = result.toUpperCase();
groupData.forEach(function (group) {
let series = chart.series.push(new am4maps.MapPolygonSeries());
series.name = group.name;
series.useGeodata = true;
let includedCountries = [];
series.include = includedCountries;
series.fill = am4core.color(group.color);
series.setStateOnChildren = true;
series.calculateVisualCenter = true;
series.tooltip.label.interactionsEnabled = false;
series.tooltip.keepTargetHover = true;
series.tooltip.getFillFromObject = false;
series.tooltip.background.fill = am4core.color("#fff");
series.tooltip.background.stroke = am4core.color("#003399");
series.tooltip.background.strokeWidth = 1;
group.data.forEach(function (country) {
includedCountries.push(country.id);
excludedCountries.push(country.id);
});
let polygonTemplate = series.mapPolygons.template;
polygonTemplate.cursorOverStyle = am4core.MouseCursorStyle.pointer;
// Generating list of countries, agencies and flags on sidebar
let ul = document.getElementById('map-list');
for (let i = 0; i < group.data.length; i++) {
let li = document.createElement('li');
li.setAttribute('class', 'agency');
ul.appendChild(li);
let a = document.createElement('a');
a.href = '#';
a.setAttribute('class', 'agency-link');
a.setAttribute('id', group.data[i].id);
li.appendChild(a);
let img = document.createElement('img');
img.src = group.data[i].img;
img.alt = group.data[i][`country${codeLang}`];
a.appendChild(img);
let div = document.createElement('div');
div.setAttribute('class', 'agency-content');
a.appendChild(div);
let titleInDiv = document.createElement('h4');
titleInDiv.setAttribute('class', 'country-name');
div.appendChild(titleInDiv);
let span = document.createElement('span');
span.setAttribute('class', 'agencies-names');
div.appendChild(span);
let countryNames = document.getElementsByClassName("country-name");
let agenciesNames = document.getElementsByClassName("agencies-names");
let agencyN = agenciesNames[i];
let countryN = countryNames[i];
// Agencies and Countries Name on sidebar
if (group.data[i][`linkName${codeLang}`] && group.data[i][`link${codeLang}`]!= "") {
agencyN.textContent = group.data[i][`linkName${codeLang}`];
countryN.textContent = group.data[i][`country${codeLang}`];
} else {
// remove the li that doesn't display the Country Name or the Link Name
}
}
let mapPolygonTemplate = series.mapPolygons.template;
mapPolygonTemplate.fill = am4core.color("dodgerblue");
mapPolygonTemplate.fillOpacity = 0.8;
mapPolygonTemplate.nonScalingStroke = true;
mapPolygonTemplate.tooltipPosition = "fixed";
mapPolygonTemplate.events.on("over", function (event) {
series.mapPolygons.each(function (mapPolygon) {
mapPolygon.isHover = false;
});
event.target.isHover = false;
event.target.isHover = true;
});
mapPolygonTemplate.events.on("out", function (event) {
series.mapPolygons.each(function (mapPolygon) {
mapPolygon.isHover = false;
});
});
let hoverState = mapPolygonTemplate.states.create("hover");
hoverState.properties.fill = am4core.color("#FFCC00");
series.data = JSON.parse(JSON.stringify(group.data));
});
let worldSeries = chart.series.push(new am4maps.MapPolygonSeries());
let worldSeriesName = "world";
worldSeries.name = worldSeriesName;
worldSeries.useGeodata = true;
worldSeries.exclude = excludedCountries;
worldSeries.fillOpacity = 0.5;
worldSeries.hiddenInLegend = true;
worldSeries.mapPolygons.template.nonScalingStroke = true;
});
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica,
Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}
h3.countryName,
h3.countryNameTtp {
font-size: 1rem;
color: #003399;
}
a.countryLinks {
line-height: 1.5rem;
}
#map {
width: 100%;
height: 600px;
overflow: hidden;
}
#map a,
b {
cursor: pointer;
color: #003399;
text-align: center;
font-family: "Open Sans", sans-serif;
}
#map a:hover {
color: #023432;
}
#map-list {
padding: 0;
list-style: none;
}
#map-list ul {
border-color: #eee;
padding: 0;
margin: 0;
}
.agency a {
text-decoration: none;
border-bottom: 1px solid #f3f3f3;
}
.agency a:hover {
background-color: #f3f3f3;
}
.agency-link {
display: flex;
align-items: center;
padding: 1rem;
}
.agency-link img {
object-fit: contain;
width: 50px;
height: 50px;
}
.agency-content {
font-size: 0.8rem;
color: gray;
padding: 0.5rem 0 0.5rem 0.5rem;
word-break: break-word;
}
.agencies-names {
font-size: 1rem;
}
.agency-content h4 {
color: #000000;
font-size: 1rem;
}
.map-list li {
border: 1px solid #cccccc;
border-bottom: 0;
list-style-type: none;
padding: 0;
margin: 0;
}
.map-list li:last-of-type {
border: 1px solid #cccccc;
}
.map-sidebar {
height: 600px;
overflow-y: scroll;
position: relative;
}
@media screen and (max-width: 768px) {
.map-sidebar {
height: 150px;
overflow-y: scroll;
}
.map-search-form {
width: 100%;
position: sticky;
position: -webkit-sticky;
top: 0;
}
}
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-eOJMYsd53ii+scO/bJGFsiCZc+5NDVN2yr8+0RDqr0Ql0h+rP48ckxlpbzKgwra6" crossorigin="anonymous">
<script src="https://cdn.amcharts.com/lib/4/core.js"></script>
<script src="https://cdn.amcharts.com/lib/4/maps.js"></script>
<script src="https://cdn.amcharts.com/lib/4/geodata/worldHigh.js"></script>
<script src="https://cdn.amcharts.com/lib/4/themes/animated.js"></script>
<script src="js/custom.js"></script>
<div class="container">
<div class="row">
<div class="map-sidebar col-lg-3 col-md-12 col-sm-12 px-0">
<ul id="map-list"></ul>
</div>
<div class="col-lg-9 col-md-12 col-sm-12 px-0">
<div id="map"></div>
</div>
</div>
</div>
You'll want to "skip" the appending of the li
to your ul
.
In your for
loop you would have an if
statement to check if your data is not empty like so:
if(group.data[i] != "") {
ul.appendChild(li);
//run the rest of the logic you wish to run on non empty data
}