|
let requirements; |
|
|
|
function downloadTDocs() { |
|
const data = tableToGenBody({ |
|
"TDoc": "doc" |
|
}); |
|
const dataSet = [...new Set(data.map(item => item.doc))]; |
|
console.log(dataSet); |
|
let body = { |
|
"documents": dataSet, |
|
"meeting": document.getElementById('meetingSelect').value |
|
}; |
|
if (document.getElementById('agendaItem').value != "" | document.getElementById('agendaItem').value != |
|
"Tous") { |
|
body['agenda_item'] = document.getElementById('agendaItem').value; |
|
} |
|
fetch('/download_tdocs', { |
|
method: "POST", |
|
headers: { |
|
"Content-Type": "application/json" |
|
}, |
|
body: JSON.stringify(body) |
|
}) |
|
.then(resp => resp.blob()) |
|
.then(blob => { |
|
const url = window.URL.createObjectURL(blob); |
|
const a = document.createElement("a"); |
|
a.href = url; |
|
let dl_name = `${document.getElementById('meetingSelect').value}`; |
|
if (document.getElementById('agendaItem').value != "" | document.getElementById('agendaItem') |
|
.value != "Tous") { |
|
dl_name = dl_name + `_${document.getElementById('agendaItem').value}` |
|
}; |
|
if (document.getElementById('docStatus').value != "" | document.getElementById('docStatus') |
|
.value != "Tous") { |
|
dl_name = dl_name + `_${document.getElementById('docStatus').value}` |
|
}; |
|
if (document.getElementById('docType').value != "" | document.getElementById('docType').value != |
|
"Tous") { |
|
dl_name = `${document.getElementById('docType').value}_${dl_name}` |
|
}; |
|
if (document.getElementById('queryReqForm').classList.contains('hidden')) { |
|
dl_name = `requirements_${dl_name}_${url.split('/').pop()}` |
|
} |
|
dl_name = dl_name + ".zip"; |
|
a.download = dl_name; |
|
document.body.appendChild(a); |
|
a.click(); |
|
a.remove(); |
|
window.URL.revokeObjectURL(url); |
|
}) |
|
} |
|
|
|
function getDataFrame() { |
|
document.getElementById("loadingBar").classList.remove("hidden"); |
|
const wg = document.getElementById('workingGroupSelect').value; |
|
const meeting = document.getElementById('meetingSelect').value; |
|
document.getElementById('docType').innerHTML = ` |
|
<option disabled selected value="">Type</option> |
|
<option>Tous</option> |
|
` |
|
|
|
document.getElementById('docStatus').innerHTML = ` |
|
<option disabled selected value="">Status</option> |
|
<option>Tous</option> |
|
` |
|
|
|
document.getElementById('agendaItem').innerHTML = ` |
|
<option disabled selected value="">Agenda Item</option> |
|
<option>Tous</option> |
|
` |
|
const dataFrame = document.getElementById("dataFrame"); |
|
document.getElementById("progressText").classList.remove('hidden') |
|
document.getElementById("progressText").innerHTML = "Loading ..."; |
|
document.getElementById("loadingBar").classList.remove("hidden") |
|
fetch("/get_dataframe", { |
|
method: "POST", |
|
headers: { |
|
"Content-Type": "application/json" |
|
}, |
|
body: JSON.stringify({ |
|
"working_group": wg, |
|
"meeting": meeting |
|
}) |
|
}) |
|
.then(resp => resp.json()) |
|
.then(data => { |
|
document.getElementById("filters").classList.remove("hidden"); |
|
document.getElementById("loadingBar").classList.add("hidden"); |
|
document.getElementById("downloadZip").classList.remove("hidden"); |
|
document.getElementById("getReqs").classList.remove("hidden"); |
|
const dataframeBody = dataFrame.querySelector("tbody"); |
|
dataframeBody.innerHTML = ""; |
|
const setType = new Set(); |
|
const setAgenda = new Set(); |
|
const setStatus = new Set(); |
|
data.data.forEach(row => { |
|
const tr = document.createElement("tr"); |
|
tr.setAttribute("data-type", row['Type']); |
|
tr.setAttribute("data-status", row["TDoc Status"]); |
|
tr.setAttribute("data-agenda", row["Agenda item description"]); |
|
tr.innerHTML = ` |
|
<td>${row["TDoc"]}</td> |
|
<td>${row["Title"]}</td> |
|
<td>${row["Type"]}</td> |
|
<td>${row["TDoc Status"]}</td> |
|
<td>${row["Agenda item description"]}</td> |
|
<td> |
|
<a href="${row["URL"]}" class="link">${row["URL"]}</a> |
|
</td> |
|
`; |
|
dataframeBody.appendChild(tr); |
|
setType.add(row["Type"]); |
|
setAgenda.add(row["Agenda item description"]); |
|
setStatus.add(row["TDoc Status"]); |
|
}) |
|
|
|
setType.forEach(tdoctype => { |
|
const option = document.createElement("option"); |
|
option.textContent = tdoctype; |
|
option.value = tdoctype; |
|
document.getElementById('docType').appendChild(option); |
|
}) |
|
|
|
setAgenda.forEach(agenda => { |
|
const option = document.createElement("option"); |
|
option.textContent = agenda; |
|
option.value = agenda; |
|
document.getElementById('agendaItem').appendChild(option); |
|
}) |
|
|
|
setStatus.forEach(status => { |
|
const option = document.createElement("option"); |
|
option.textContent = status; |
|
option.value = status; |
|
document.getElementById('docStatus').appendChild(option); |
|
}) |
|
}) |
|
|
|
document.getElementById("progressText").classList.add('hidden') |
|
document.getElementById("loadingBar").classList.add("hidden") |
|
} |
|
|
|
function filterTable() { |
|
const type = document.getElementById('docType').value |
|
const status = document.getElementById('docStatus').value |
|
const agenda = document.getElementById('agendaItem').value |
|
|
|
document.querySelectorAll('#dataFrame tbody tr').forEach(row => { |
|
const showRow = |
|
(type === 'Tous' || row.dataset.type === type || type === "") && |
|
(status === 'Tous' || row.dataset.status === status || status === "") && |
|
(agenda === 'Tous' || row.dataset.agenda === agenda || agenda === "") |
|
|
|
row.style.display = showRow ? '' : 'none' |
|
}) |
|
} |
|
|
|
function getMeetings() { |
|
const workingGroup = document.getElementById("workingGroupSelect").value; |
|
document.getElementById("meetingSelect").setAttribute('disabled', 'true') |
|
document.getElementById("meetingSelect").innerHTML = "<option>Loading...</option>" |
|
document.getElementById("getTDocs").setAttribute('disabled', 'true') |
|
fetch("/get_meetings", { |
|
method: "POST", |
|
headers: { |
|
"Content-Type": "application/json" |
|
}, |
|
body: JSON.stringify({ |
|
"working_group": workingGroup |
|
}) |
|
}) |
|
.then(resp => resp.json()) |
|
.then(data => { |
|
document.getElementById("meetingSelect").innerHTML = ""; |
|
document.getElementById("meetingSelect").removeAttribute("disabled"); |
|
document.getElementById("getTDocs").removeAttribute("disabled") |
|
for (const [key, value] of Object.entries(data.meetings)) { |
|
const option = document.createElement("option"); |
|
option.textContent = key; |
|
option.value = value; |
|
document.getElementById('meetingSelect').appendChild(option); |
|
} |
|
}) |
|
} |
|
|
|
function generateRequirements() { |
|
const bodyreq = tableToGenBody({ |
|
"TDoc": "document", |
|
"URL": "url" |
|
}); |
|
document.getElementById("progressText").classList.remove('hidden'); |
|
document.getElementById("progressText").innerHTML = |
|
"Generating requirements, please wait, it may take a while ..."; |
|
document.getElementById("loadingBar").classList.remove("hidden"); |
|
|
|
fetch("/generate_requirements", { |
|
method: "POST", |
|
headers: { |
|
"Content-Type": "application/json" |
|
}, |
|
body: JSON.stringify({ |
|
"documents": bodyreq |
|
}) |
|
}) |
|
.then(resp => resp.json()) |
|
.then(data => { |
|
document.getElementById("loadingBar").classList.add("hidden"); |
|
document.getElementById("progressText").classList.add("hidden"); |
|
document.getElementById("reqStatus").classList.remove("hidden"); |
|
document.getElementById("getReqs").classList.add("hidden"); |
|
document.getElementById("searchReq").classList.remove("hidden"); |
|
document.getElementById("categorizeReq").classList.remove("hidden"); |
|
requirements = []; |
|
data.requirements.forEach(obj => { |
|
obj.requirements.forEach(req => { |
|
requirements.push({ |
|
"document": obj.document, |
|
"context": obj.context, |
|
"requirement": req |
|
}) |
|
}) |
|
}) |
|
}) |
|
} |
|
|
|
function queryRequirements() { |
|
fetch("/get_reqs_from_query", { |
|
method: "POST", |
|
headers: { |
|
"Content-Type": "application/json" |
|
}, |
|
body: JSON.stringify({ |
|
query: document.getElementById("problemDescription").value, |
|
requirements |
|
}) |
|
}) |
|
.then(resp => resp.json()) |
|
.then(data => { |
|
const dataFrame = document.getElementById("dataFrameDiv"); |
|
const dataFrameHead = dataFrame.querySelector("thead"); |
|
const dataFrameBody = dataFrame.querySelector("tbody"); |
|
document.getElementById("buttons").classList.remove("hidden"); |
|
document.getElementById("searchReq").classList.add("hidden"); |
|
document.getElementById("categorizeReq").classList.add("hidden"); |
|
document.getElementById("getReqs").classList.add("hidden"); |
|
document.getElementById("reqStatus").classList.add("hidden"); |
|
document.getElementById("downloadZip").classList.remove("hidden"); |
|
|
|
dataFrame.classList.remove("hidden"); |
|
|
|
dataFrameHead.innerHTML = ` |
|
<th>TDoc</th> |
|
<th>Context</th> |
|
<th>Requirement</th> |
|
`; |
|
|
|
dataFrameBody.innerHTML = ""; |
|
|
|
data.requirements.forEach(req => { |
|
const tr = document.createElement("tr"); |
|
tr.innerHTML = ` |
|
<td>${req["document"]}</td> |
|
<td>${req["context"]}</td> |
|
<td>${req["requirement"]}</td> |
|
`; |
|
dataFrameBody.appendChild(tr); |
|
}) |
|
}) |
|
} |
|
|
|
function tableToGenBody(columnsMap) { |
|
|
|
const dataFrame = document.getElementById("dataFrame"); |
|
const headers = Array.from(dataFrame.querySelectorAll('thead th')).map(th => th.innerText.trim()); |
|
|
|
|
|
const selectedIndices = headers |
|
.map((header, idx) => columnsMap[header] ? idx : -1) |
|
.filter(idx => idx !== -1); |
|
|
|
return Array.from(dataFrame.querySelectorAll('tbody tr')) |
|
.filter(row => getComputedStyle(row).display !== 'none') |
|
.map(row => { |
|
const cells = Array.from(row.querySelectorAll('td')); |
|
const obj = {}; |
|
selectedIndices.forEach(idx => { |
|
const originalHeader = headers[idx]; |
|
const newKey = columnsMap[originalHeader]; |
|
obj[newKey] = cells[idx].innerText.trim(); |
|
}); |
|
return obj; |
|
}); |
|
} |
|
|
|
function createCard(cardTitle, cardSub, cardText) { |
|
return ` |
|
<div class="flex-none w-80 bg-white rounded-lg shadow-md p-6 mr-4 border border-gray-200 hover:shadow-lg transition-shadow duration-300"> |
|
<h3 class="text-lg font-semibold text-gray-800 mb-2">${cardTitle}</h3> |
|
<p class="text-sm text-gray-600 mb-3 font-medium">${cardSub}</p> |
|
<p class="text-gray-700 text-sm leading-relaxed">${cardText}</p> |
|
</div> |
|
`; |
|
} |
|
|
|
function createCarousel(carouselTitle, cards) { |
|
let cardsHTML = cards.join("\n"); |
|
return ` |
|
<div class="mb-8"> |
|
<h2 class="text-xl font-bold text-gray-800 mb-4">${carouselTitle}</h2> |
|
<div class="overflow-x-auto scrollbar-thin scrollbar-thumb-gray-400 scrollbar-track-gray-200"> |
|
<div class="flex pb-4"> |
|
${cardsHTML} |
|
</div> |
|
</div> |
|
</div> |
|
`; |
|
} |
|
|
|
function categorizeRequirements() { |
|
fetch("https://game4all-reqroup.hf.space/categorize_requirements", { |
|
method: "POST", |
|
headers: { |
|
"Content-Type": "application/json" |
|
}, |
|
body: JSON.stringify({ |
|
requirements |
|
}) |
|
}) |
|
.then(resp => resp.json()) |
|
.then(data => { |
|
document.getElementById('dataFrameForm').classList.add('hidden'); |
|
document.getElementById('filters').classList.add('hidden'); |
|
document.getElementById('carousels').classList.remove('hidden'); |
|
document.getElementById('dataFrameDiv').classList.add('hidden'); |
|
document.getElementById('buttons').classList.add('hidden'); |
|
data.categories.forEach(cat => { |
|
let reqCards = []; |
|
cat.requirements.forEach(reqContent => { |
|
reqCards.push(createCard(reqContent.document, reqContent.context, reqContent.requirement)) |
|
}); |
|
document.getElementById('carousels').innerHTML += createCarousel(cat.title, reqCards); |
|
}) |
|
}) |
|
} |
|
|
|
|
|
|
|
document.getElementById('docType').addEventListener('change', filterTable) |
|
document.getElementById('docStatus').addEventListener('change', filterTable) |
|
document.getElementById('agendaItem').addEventListener('change', filterTable) |
|
document.getElementById("workingGroupSelect").addEventListener('change', getMeetings) |
|
document.getElementById('getTDocs').addEventListener('click', getDataFrame) |
|
document.getElementById("getReqs").addEventListener("click", generateRequirements); |
|
document.getElementById('categorizeReq').addEventListener('click', categorizeRequirements); |
|
document.getElementById("downloadZip").addEventListener('click', downloadTDocs) |
|
document.getElementById("queryReq").addEventListener("click", queryRequirements) |
|
document.getElementById('searchReq').addEventListener('click', () => { |
|
document.getElementById('dataFrameForm').classList.add('hidden'); |
|
document.getElementById('filters').classList.add('hidden'); |
|
document.getElementById('queryReqForm').classList.remove('hidden'); |
|
document.getElementById('dataFrameDiv').classList.add('hidden'); |
|
document.getElementById('buttons').classList.add('hidden'); |
|
}) |