v0.9.2
Bugs Fixed: - Fixed: sheet-view not cleared upon signout Added: - Added: Feature to sort the table contents (click on the column to sort) - Added: Button to view the groupBy popup - Added: Hovering on a log displays writer's floID and log time Others: - Hide sheet detail UI at startup
This commit is contained in:
parent
42f4e584cb
commit
3a24e78823
@ -514,13 +514,14 @@
|
|||||||
margin: 0.5rem;
|
margin: 0.5rem;
|
||||||
padding: 0 0.5rem;
|
padding: 0 0.5rem;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
height: 3rem;
|
height: 1.5rem;
|
||||||
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table-container {
|
.table-container {
|
||||||
margin: 0 1rem 1rem 1rem;
|
margin: 0 1rem 1rem 1rem;
|
||||||
overflow: scroll;
|
overflow: scroll;
|
||||||
max-height: 18rem;
|
max-height: 19rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
table {
|
table {
|
||||||
@ -657,6 +658,22 @@
|
|||||||
margin: 0.5rem;
|
margin: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#view-group-by {
|
||||||
|
float: right;
|
||||||
|
margin-right: 0.5rem;
|
||||||
|
height: 1.5rem;
|
||||||
|
width: 5rem;
|
||||||
|
background: var(--alt-light);
|
||||||
|
color: var(--alt-dark);
|
||||||
|
border: 0.1rem solid var(--alt-dark);
|
||||||
|
border-radius: 0.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
#view-group-by:hover {
|
||||||
|
background: var(--alt-dark);
|
||||||
|
color: var(--alt-light);
|
||||||
|
}
|
||||||
|
|
||||||
#group-by>div:first-child {
|
#group-by>div:first-child {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@ -744,8 +761,9 @@
|
|||||||
clearElement(document.getElementById("startup-load-msg"))
|
clearElement(document.getElementById("startup-load-msg"))
|
||||||
clearElement(document.getElementById('person-list'))
|
clearElement(document.getElementById('person-list'))
|
||||||
clearElement(document.getElementById('sheet-list'))
|
clearElement(document.getElementById('sheet-list'))
|
||||||
|
clearElement(document.getElementById('sheet-view'))
|
||||||
//set the custom Privkey input
|
//set the custom Privkey input
|
||||||
floDapps.setCustomPrivKeyInput( () => {
|
floDapps.setCustomPrivKeyInput(() => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
let signInBox = document.getElementById("sign-in-box")
|
let signInBox = document.getElementById("sign-in-box")
|
||||||
signInBox.classList.remove('hide')
|
signInBox.classList.remove('hide')
|
||||||
@ -773,7 +791,7 @@
|
|||||||
console.log(result)
|
console.log(result)
|
||||||
document.getElementById("greet-tag").textContent = `Hi, ${myFloID}`
|
document.getElementById("greet-tag").textContent = `Hi, ${myFloID}`
|
||||||
showMessage("SignIn Successful")
|
showMessage("SignIn Successful")
|
||||||
reactor.dispatchEvent("startUpSuccessLog",`Downloading objectData! Please Wait...`)
|
reactor.dispatchEvent("startUpSuccessLog", `Downloading objectData! Please Wait...`)
|
||||||
//request object data from Supernode
|
//request object data from Supernode
|
||||||
logSheet.init().then(result => {
|
logSheet.init().then(result => {
|
||||||
console.log(result)
|
console.log(result)
|
||||||
@ -783,15 +801,16 @@
|
|||||||
//hide loading screen
|
//hide loading screen
|
||||||
document.getElementById("loading-screen").classList.add("hide")
|
document.getElementById("loading-screen").classList.add("hide")
|
||||||
//display add buttons if subAdmin, else hide
|
//display add buttons if subAdmin, else hide
|
||||||
if(floGlobals.subAdmins.includes(myFloID)){
|
if (floGlobals.subAdmins.includes(myFloID)) {
|
||||||
document.getElementById("add-person").classList.remove('hide')
|
document.getElementById("add-person").classList.remove('hide')
|
||||||
document.getElementById("new-sheet").classList.remove('hide')
|
document.getElementById("new-sheet").classList.remove('hide')
|
||||||
}else{
|
} else {
|
||||||
document.getElementById("add-person").classList.add('hide')
|
document.getElementById("add-person").classList.add('hide')
|
||||||
document.getElementById("new-sheet").classList.add('hide')
|
document.getElementById("new-sheet").classList.add('hide')
|
||||||
}
|
}
|
||||||
|
document.getElementById("sheet-details").classList.add("hide")
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
reactor.dispatchEvent("startUpErrorLog",`Failed to download objectData`)
|
reactor.dispatchEvent("startUpErrorLog", `Failed to download objectData`)
|
||||||
showMessage(error, "error")
|
showMessage(error, "error")
|
||||||
})
|
})
|
||||||
}).catch(error => showMessage(error, "error"))
|
}).catch(error => showMessage(error, "error"))
|
||||||
@ -933,10 +952,11 @@
|
|||||||
<div id="sheet-list"></div>
|
<div id="sheet-list"></div>
|
||||||
</nav>
|
</nav>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div id="sheet-details">
|
<div id="sheet-details" class="hide">
|
||||||
<h4></h4>
|
<h4></h4>
|
||||||
<h6></h6>
|
<h6></h6>
|
||||||
<p></p>
|
<p></p>
|
||||||
|
<button id="view-group-by">Groupby</button>
|
||||||
</div>
|
</div>
|
||||||
<form class="table-container" id="sheet-view" onsubmit="enterLog(); return false;"></form>
|
<form class="table-container" id="sheet-view" onsubmit="enterLog(); return false;"></form>
|
||||||
<button type="submit" form="sheet-view" style="display: none;"></button>
|
<button type="submit" form="sheet-view" style="display: none;"></button>
|
||||||
@ -957,19 +977,19 @@
|
|||||||
else if (e.target.parentNode.parentNode.classList.contains("person-card"))
|
else if (e.target.parentNode.parentNode.classList.contains("person-card"))
|
||||||
copyToLogInput(e.target.parentNode.parentNode.children[1].children[0].textContent)
|
copyToLogInput(e.target.parentNode.parentNode.children[1].children[0].textContent)
|
||||||
else if (e.target.tagName === "TD" && e.target.parentElement.parentElement.tagName === "THEAD")
|
else if (e.target.tagName === "TD" && e.target.parentElement.parentElement.tagName === "THEAD")
|
||||||
document.getElementById("group-by").parentNode.classList.remove("hide")
|
sortTable(e.target.parentElement.parentElement.parentElement, e.target.cellIndex)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
//do nothing
|
//do nothing
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
document.getElementById("sign-out").addEventListener('click', function(e){
|
document.getElementById("sign-out").addEventListener('click', function (e) {
|
||||||
getConfirmation('Are you sure you want to Sign out?').then(result => {
|
getConfirmation('Are you sure you want to Sign out?').then(result => {
|
||||||
try{
|
try {
|
||||||
floDapps.clearCredentials();
|
floDapps.clearCredentials();
|
||||||
showMessage("Successfully Signed out")
|
showMessage("Successfully Signed out")
|
||||||
setTimeout(onLoadStartUp, 2000)
|
setTimeout(onLoadStartUp, 2000)
|
||||||
}catch(error){
|
} catch (error) {
|
||||||
showMessage(error, "error")
|
showMessage(error, "error")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -1012,6 +1032,10 @@
|
|||||||
document.getElementById("additional-fields").appendChild(field)
|
document.getElementById("additional-fields").appendChild(field)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
document.getElementById('view-group-by').addEventListener("click", function (e) {
|
||||||
|
document.getElementById("group-by").parentNode.classList.remove("hide")
|
||||||
|
})
|
||||||
|
|
||||||
document.getElementById('group-by-menu').children[0].addEventListener("change", function (e) {
|
document.getElementById('group-by-menu').children[0].addEventListener("change", function (e) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -1046,6 +1070,7 @@
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
function removeElement(element) {
|
function removeElement(element) {
|
||||||
element.parentNode.removeChild(element);
|
element.parentNode.removeChild(element);
|
||||||
}
|
}
|
||||||
@ -1055,13 +1080,13 @@
|
|||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getConfirmation(message){
|
function getConfirmation(message) {
|
||||||
let confirmation = document.getElementById("confirmation");
|
let confirmation = document.getElementById("confirmation");
|
||||||
confirmation.children[0].textContent = message;
|
confirmation.children[0].textContent = message;
|
||||||
confirmation.parentNode.classList.remove("hide")
|
confirmation.parentNode.classList.remove("hide")
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
let interval = setInterval(()=>{
|
let interval = setInterval(() => {
|
||||||
if(confirmation.parentNode.classList.contains("hide")){
|
if (confirmation.parentNode.classList.contains("hide")) {
|
||||||
confirmation.children[1].children[0].onclick = null;
|
confirmation.children[1].children[0].onclick = null;
|
||||||
confirmation.children[1].children[1].onclick = null;
|
confirmation.children[1].children[1].onclick = null;
|
||||||
clearInterval(interval);
|
clearInterval(interval);
|
||||||
@ -1140,7 +1165,6 @@
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
showMessage(error, "error")
|
showMessage(error, "error")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function createSheet() {
|
function createSheet() {
|
||||||
@ -1174,18 +1198,18 @@
|
|||||||
function enterLog() {
|
function enterLog() {
|
||||||
let title = document.getElementById("sheet-details").children[0].textContent;
|
let title = document.getElementById("sheet-details").children[0].textContent;
|
||||||
let form = document.forms['sheet-view']
|
let form = document.forms['sheet-view']
|
||||||
if (form[0].tagName === 'INPUT'){
|
if (form[0].tagName === 'INPUT') {
|
||||||
let floID = form[0].value;
|
let floID = form[0].value;
|
||||||
let log = []
|
let log = []
|
||||||
for(let i=1;i<form.length-1;i++)
|
for (let i = 1; i < form.length - 1; i++)
|
||||||
log.push(form[i].value)
|
log.push(form[i].value)
|
||||||
logSheet.enterLog(title, floID, log).then(result => {
|
logSheet.enterLog(title, floID, log).then(result => {
|
||||||
form.reset();
|
form.reset();
|
||||||
showMessage('Log Entry Successful')
|
showMessage('Log Entry Successful')
|
||||||
let row = document.getElementById("sheet-view").getElementsByTagName("tbody")[0].insertRow(1)
|
let row = document.getElementById("sheet-view").getElementsByTagName("tbody")[0].insertRow(1);
|
||||||
row.insertCell(0).textContent = floID
|
row.insertCell(0).textContent = floID
|
||||||
for(let k = 0; k < log.length; k++)
|
for (let k = 0; k < log.length; k++)
|
||||||
row.insertCell(k+1).textContent = log[k]
|
row.insertCell(k + 1).textContent = log[k]
|
||||||
}).catch(error => showMessage(error, "error"))
|
}).catch(error => showMessage(error, "error"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1237,8 +1261,16 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function renderSheetView(title, description, editors, attributes, sheet, isWriteable) {
|
function renderSheetView(title, description, editors, attributes, sheet, isWriteable) {
|
||||||
|
const parseVectorClock = (vc) => {
|
||||||
|
vc = vc.split('_')
|
||||||
|
console.log(vc)
|
||||||
|
let time = new Date(parseInt(vc[0])).toString().slice(4, 24);
|
||||||
|
let floID = vc[1]
|
||||||
|
return `by ${floID} (${time})`
|
||||||
|
}
|
||||||
//Add Sheet Details
|
//Add Sheet Details
|
||||||
let sheetDetails = document.getElementById("sheet-details")
|
let sheetDetails = document.getElementById("sheet-details")
|
||||||
|
sheetDetails.classList.remove("hide")
|
||||||
sheetDetails.children[0].textContent = title;
|
sheetDetails.children[0].textContent = title;
|
||||||
sheetDetails.children[1].textContent = editors;
|
sheetDetails.children[1].textContent = editors;
|
||||||
sheetDetails.children[2].textContent = description;
|
sheetDetails.children[2].textContent = description;
|
||||||
@ -1251,6 +1283,7 @@
|
|||||||
let tbody = document.createElement("tbody")
|
let tbody = document.createElement("tbody")
|
||||||
sheet.forEach(data => {
|
sheet.forEach(data => {
|
||||||
let row = tbody.insertRow(0);
|
let row = tbody.insertRow(0);
|
||||||
|
row.setAttribute("title", parseVectorClock(data.vc))
|
||||||
row.insertCell(0).textContent = data.floID
|
row.insertCell(0).textContent = data.floID
|
||||||
data.log.forEach(l => row.insertCell().textContent = l)
|
data.log.forEach(l => row.insertCell().textContent = l)
|
||||||
})
|
})
|
||||||
@ -1264,7 +1297,8 @@
|
|||||||
clearElement(document.getElementById("sheet-view")).appendChild(table);
|
clearElement(document.getElementById("sheet-view")).appendChild(table);
|
||||||
//Add options for groupBy
|
//Add options for groupBy
|
||||||
document.getElementById('group-by').children[0].textContent = `Group ${title} by`;
|
document.getElementById('group-by').children[0].textContent = `Group ${title} by`;
|
||||||
document.getElementById('group-by-view').innerHTML = `<table><thead><tr><td>FLO ID</td><td><i>null</i></td></tr></thead></table>`
|
document.getElementById('group-by-view').innerHTML =
|
||||||
|
`<table><thead><tr><td>FLO ID</td><td><i>null</i></td></tr></thead></table>`
|
||||||
let colSelect = clearElement(document.getElementById('group-by-menu').children[1]);
|
let colSelect = clearElement(document.getElementById('group-by-menu').children[1]);
|
||||||
attributes.forEach(a => {
|
attributes.forEach(a => {
|
||||||
let opt = document.createElement('option');
|
let opt = document.createElement('option');
|
||||||
@ -1288,6 +1322,40 @@
|
|||||||
table.appendChild(tbody);
|
table.appendChild(tbody);
|
||||||
clearElement(document.getElementById("group-by-view")).appendChild(table);
|
clearElement(document.getElementById("group-by-view")).appendChild(table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sortTable(table, n) {
|
||||||
|
console.log(table, n)
|
||||||
|
let dir = "DESC";
|
||||||
|
let flag = false;
|
||||||
|
let startRow = (table.getElementsByTagName("INPUT").length === 0) ? 1 : 2
|
||||||
|
while (true) {
|
||||||
|
let rows = table.rows;
|
||||||
|
let swapIndex = false;
|
||||||
|
console.log(rows)
|
||||||
|
for (let i = startRow; i < rows.length - 1; i++) {
|
||||||
|
let x = rows[i].getElementsByTagName("TD")[n].textContent;
|
||||||
|
let y = rows[i + 1].getElementsByTagName("TD")[n].textContent;
|
||||||
|
let x_ = parseFloat(x)
|
||||||
|
let y_ = parseFloat(y)
|
||||||
|
if (isNaN(x_) || isNaN(y_)) {
|
||||||
|
x_ = x.toLowerCase()
|
||||||
|
y_ = y.toLowerCase()
|
||||||
|
}
|
||||||
|
if ((dir == "DESC" && x_ < y_) || (dir == "ASC" && x_ > y_)) {
|
||||||
|
swapIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (swapIndex !== false) {
|
||||||
|
rows[swapIndex].parentNode.insertBefore(rows[swapIndex + 1], rows[swapIndex]);
|
||||||
|
flag = true;
|
||||||
|
} else if (!flag && dir == 'DESC')
|
||||||
|
dir = "ASC";
|
||||||
|
else
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script id="init_lib">
|
<script id="init_lib">
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user