let selectedMeetings = [];
let currentURL = null;
function toggleDropdown() {
const dropdown = document.getElementById("dropdownContent");
dropdown.style.display = (dropdown.style.display === "none") ? "block" : "none";
}
document.getElementById('dropbtn').addEventListener('click', () => {
toggleDropdown()
})
document.addEventListener('mousedown', (e) => {
if (document.getElementById("dropdownContent").style.display == "block" && e.target.className != "dropdown-content" && e.target.tagName != "INPUT" && e.target.tagName != "LABEL") {
document.getElementById("dropdownContent").style.display = "none";
}
})
document.getElementById('tdocs-wg-option').addEventListener('change', async (e) => {
let wg = e.target.value;
const dropdownContent = document.getElementById('dropdownContent');
const dropbtn = document.getElementById('dropbtn');
if (wg != "ALL") {
dropdownContent.innerHTML = '';
const response = await fetch(`/get_meetings/${wg}`, {
method: "GET"
});
const responseJson = await response.json();
const meetings = responseJson.meetings;
currentURL = responseJson.url;
for (const meet of meetings) {
const label = document.createElement('label');
const checkbox = document.createElement('input');
checkbox.type = "checkbox";
checkbox.value = meet;
label.appendChild(checkbox);
label.appendChild(document.createTextNode(meet));
dropdownContent.appendChild(label);
dropdownContent.appendChild(document.createElement('br'));
}
dropbtn.removeAttribute('disabled');
// après création, ajoute les listeners de gestion sur chaque checkbox
initCheckboxListeners();
// Initialise l'état initial
updateDropbtnLabel();
} else {
dropdownContent.innerHTML = '';
dropbtn.setAttribute('disabled', 'true');
dropbtn.textContent = "Index all meetings";
}
});
function disableButtons() {
document.getElementById("spec-3gpp-btn").setAttribute('disabled', 'disabled')
document.getElementById("spec-etsi-btn").setAttribute('disabled', 'disabled')
document.getElementById("tdocs-btn").setAttribute('disabled', 'disabled')
}
function enableButtons() {
document.getElementById("spec-3gpp-btn").removeAttribute('disabled')
document.getElementById("spec-etsi-btn").removeAttribute('disabled')
document.getElementById("tdocs-btn").removeAttribute('disabled')
}
function initCheckboxListeners() {
const dropdownContent = document.getElementById('dropdownContent');
const dropbtn = document.getElementById('dropbtn');
function updateState() {
const checkboxes = dropdownContent.querySelectorAll('input[type="checkbox"]');
const allCheckbox = dropdownContent.querySelector('input[value="ALL"]');
const checkedBoxes = Array.from(checkboxes).filter(cb => cb.checked && cb !== allCheckbox);
if (checkedBoxes.length === 0) {
allCheckbox.checked = true;
dropbtn.textContent = "Index all meetings";
selectedMeetings = ["ALL"];
} else {
if (allCheckbox.checked) {
allCheckbox.checked = false; // décocher ALL si autre(s) cochée(s)
}
if (checkedBoxes.length === 1) {
dropbtn.textContent = checkedBoxes[0].value;
} else {
dropbtn.textContent = `${checkedBoxes.length} meetings sélectionnés`;
}
selectedMeetings = checkedBoxes.map(cb => cb.value);
}
console.log(selectedMeetings);
console.log(currentURL);
}
const checkboxes = dropdownContent.querySelectorAll('input[type="checkbox"]');
checkboxes.forEach(cb => cb.addEventListener('change', updateState));
updateState(); // mise à jour initiale
}
function updateDropbtnLabel() {
const dropdownContent = document.getElementById('dropdownContent');
const checkboxes = dropdownContent.querySelectorAll('input[type="checkbox"]');
const allCheckbox = dropdownContent.querySelector('input[value="ALL"]');
const dropbtn = document.getElementById('dropbtn');
const checkedBoxes = Array.from(checkboxes).filter(cb => cb.checked && cb !== allCheckbox);
if (checkedBoxes.length === 0) {
allCheckbox.checked = true;
dropbtn.textContent = "Index all meetings";
} else if (checkedBoxes.length === 1) {
allCheckbox.checked = false;
dropbtn.textContent = checkedBoxes[0].value;
} else {
allCheckbox.checked = false;
dropbtn.textContent = `${checkedBoxes.length} meetings sélectionnés`;
}
}
const progress = document.getElementById('indexProgression')
document.getElementById('tdocs-btn').addEventListener('click', async () => {
disableButtons()
let response = null;
if (currentURL) {
if (!selectedMeetings.includes("ALL")) {
response = await fetch("/index_tdocs/meeting", {
method: "POST",
body: JSON.stringify({
wg: document.getElementById("tdocs-wg-option").value,
meetings: selectedMeetings
}),
headers: {
"Content-Type": "application/json",
"Accept": "text/event-stream",
},
});
} else {
response = await fetch("/index_tdocs/working_group", {
method: "POST",
body: JSON.stringify({
wg: document.getElementById("tdocs-wg-option").value
}),
headers: {
"Content-Type": "application/json",
"Accept": "text/event-stream",
},
});
}
} else {
response = await fetch("/index_tdocs/all", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Accept": "text/event-stream",
},
});
}
const reader = response.body.getReader();
const decoder = new TextDecoder("utf-8");
let buffer = "";
while (true) {
const {
done,
value
} = await reader.read();
if (done) break;
buffer += decoder.decode(value, {
stream: true
});
let events = buffer.split("\n\n"); // séparer les événements
buffer = events.pop(); // garder le reste pour le prochain chunk
for (const rawEvent of events) {
const event = {};
rawEvent.split("\n").forEach((line) => {
const [key, ...rest] = line.split(":");
if (key) event[key.trim()] = rest.join(":").trim();
});
// dispatch selon event.event ou par défaut message
switch (event.event) {
case "progress":
console.log("[progress]", event.data);
progress.value = event.data;
break;
case "get-maximum":
console.log("[new-max]", event.data);
progress.max = event.data
break;
case "info":
console.log("[info]", event.data);
document.getElementById('infoText').textContent = event.data
break;
case "end":
console.log("[end]", event.data);
document.getElementById('infoText').textContent = event.data;
break;
default:
if (event.data) {
console.log("[message]", event.data);
};
}
}
}
enableButtons()
});
document.getElementById('spec-3gpp-btn').addEventListener('click', async () => {
disableButtons()
const response = await fetch("/index_specs/3gpp", {method: "POST", headers: {
"Content-Type": "application/json",
"Accept": "text/event-stream",
}});
const reader = response.body.getReader();
const decoder = new TextDecoder("utf-8");
let buffer = "";
while (true) {
const {
done,
value
} = await reader.read();
if (done) break;
buffer += decoder.decode(value, {
stream: true
});
let events = buffer.split("\n\n"); // séparer les événements
buffer = events.pop(); // garder le reste pour le prochain chunk
for (const rawEvent of events) {
const event = {};
rawEvent.split("\n").forEach((line) => {
const [key, ...rest] = line.split(":");
if (key) event[key.trim()] = rest.join(":").trim();
});
// dispatch selon event.event ou par défaut message
switch (event.event) {
case "progress":
console.log("[progress]", event.data);
progress.value = event.data;
break;
case "get-maximum":
console.log("[new-max]", event.data);
progress.max = event.data
break;
case "info":
console.log("[info]", event.data);
document.getElementById('infoText').textContent = event.data
break;
case "end":
console.log("[end]", event.data);
document.getElementById('infoText').textContent = event.data;
break;
default:
if (event.data) {
console.log("[message]", event.data);
};
}
}
}
enableButtons()
});
document.getElementById('spec-etsi-btn').addEventListener('click', async () => {
disableButtons()
const response = await fetch("/index_specs/etsi", {method: "POST", headers: {
"Content-Type": "application/json",
"Accept": "text/event-stream",
}});
const reader = response.body.getReader();
const decoder = new TextDecoder("utf-8");
let buffer = "";
while (true) {
const {
done,
value
} = await reader.read();
if (done) break;
buffer += decoder.decode(value, {
stream: true
});
let events = buffer.split("\n\n"); // séparer les événements
buffer = events.pop(); // garder le reste pour le prochain chunk
for (const rawEvent of events) {
const event = {};
rawEvent.split("\n").forEach((line) => {
const [key, ...rest] = line.split(":");
if (key) event[key.trim()] = rest.join(":").trim();
});
// dispatch selon event.event ou par défaut message
switch (event.event) {
case "progress":
console.log("[progress]", event.data);
progress.value = event.data;
break;
case "get-maximum":
console.log("[new-max]", event.data);
progress.max = event.data
break;
case "info":
console.log("[info]", event.data);
document.getElementById('infoText').textContent = event.data
break;
case "end":
console.log("[end]", event.data);
document.getElementById('infoText').textContent = event.data;
break;
default:
if (event.data) {
console.log("[message]", event.data);
};
}
}
}
enableButtons()
});