|
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 = '<label style="display:none;"><input type="checkbox" checked value="ALL">Index all meetings</label>'; |
|
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'); |
|
|
|
|
|
initCheckboxListeners(); |
|
|
|
updateDropbtnLabel(); |
|
} else { |
|
dropdownContent.innerHTML = '<label style="display:none;"><input type="checkbox" checked value="ALL">Index all meetings</label>'; |
|
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; |
|
} |
|
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(); |
|
} |
|
|
|
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"); |
|
buffer = events.pop(); |
|
|
|
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(); |
|
}); |
|
|
|
|
|
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"); |
|
buffer = events.pop(); |
|
|
|
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(); |
|
}); |
|
|
|
|
|
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"); |
|
buffer = events.pop(); |
|
|
|
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(); |
|
}); |
|
|
|
|
|
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() |
|
}); |