1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| map.on('idle', () => {
// If these two layers were not added to the map, abort
if (!map.getLayer('land_ly') || !map.getLayer('cpa_ly')) {
return;
}
const layers = document.getElementById('menu');
// Enumerate ids of the layers.
const toggleableLayerIds = ['land_ly', 'cpa_ly'];
// Set up the corresponding toggle button for each layer.
var line = document.createElement('ul');
line.classList.add('sortable-list');
line.classList.add('mapbox-ctrl');
layers.appendChild(line);
for (const id of toggleableLayerIds) {
// Skip layers that already have a button set up.
if (document.getElementById(id)) {
continue;
}
var list = document.createElement('li');
list.classList.add('item');
list.setAttribute('draggable', true);
line.appendChild(list);
const symbol = document.createElement('i');
symbol.classList.add('fa-solid');
symbol.classList.add('fa-grip-vertical');
symbol.classList.add('symbol-item');
list.appendChild(symbol);
var input = document.createElement('input');
input.type='checkbox';
input.id = id;
input.checked = true;
list.appendChild(input);
const label = document.createElement('label');
label.setAttribute('for', id);
label.textContent = id;
list.appendChild(label);
// Show or hide layer when the toggle is clicked.
input.addEventListener('change', (e) => {
e.preventDefault();
e.stopPropagation();
console.log(this);
map.setLayoutProperty(
id, 'visibility', e.target.checked ? 'visible' : 'none'
);
})
}
// Moves between layers
const items = document.querySelectorAll(".item");
const sortableList = document.querySelector(".sortable-list");
items.forEach(item => {
item.addEventListener('dragstart', () => {
setTimeout(() => item.classList.add("dragging"),0);
});
item.addEventListener("dragend", () => item.classList.remove("dragging"));
});
const initSortableList = (e) => {
e.preventDefault();
const draggingItem = document.querySelector(".dragging");
// Getting all items except currently dragging and making array of them
let siblings = [...sortableList.querySelectorAll(".item:not(.dragging)")];
// Finding the sibling after which the dragging item should be placed
let nextSibling = siblings.find(sibling => {
return e.clientY <= sibling.offsetTop + sibling.offsetHeight / 2;
});
// Inserting the dragging item before the found sibling
sortableList.insertBefore(draggingItem, nextSibling);
}
sortableList.addEventListener("dragover", initSortableList);
sortableList.addEventListener("dragenter", e => e.preventDefault());
}); |
Partager