Web: API response (esp. request response)
This commit is contained in:
parent
db6b1eef77
commit
e6f4a8dd24
|
@ -66,7 +66,7 @@ def post_arrival():
|
||||||
db.insert({
|
db.insert({
|
||||||
'name': name,
|
'name': name,
|
||||||
'room': data['room'],
|
'room': data['room'],
|
||||||
'arrival': now.isoformat(),
|
'arrival': data.get('arrival') or now.isoformat(),
|
||||||
'departure': None
|
'departure': None
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ def post_departure():
|
||||||
|
|
||||||
now = datetime.utcnow()
|
now = datetime.utcnow()
|
||||||
db.update(
|
db.update(
|
||||||
operations.set('departure', now.isoformat()),
|
operations.set('departure', data.get('departure') or now.isoformat()),
|
||||||
(Entry.name == name) & (Entry.departure == None)
|
(Entry.name == name) & (Entry.departure == None)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
173
web/index.html
173
web/index.html
|
@ -42,6 +42,7 @@
|
||||||
input {
|
input {
|
||||||
border: none;
|
border: none;
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
|
margin: 4px 0;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
input[type=text] {
|
input[type=text] {
|
||||||
|
@ -62,6 +63,21 @@
|
||||||
width: 32px;
|
width: 32px;
|
||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
}
|
}
|
||||||
|
.request {
|
||||||
|
display: block;
|
||||||
|
position: fixed;
|
||||||
|
background: #ddd;
|
||||||
|
top: 16px;
|
||||||
|
left: 16px;
|
||||||
|
width: calc(100% - 32px);
|
||||||
|
box-shadow: 0 1px 4px 0;
|
||||||
|
}
|
||||||
|
input[type=datetime-local] {
|
||||||
|
width: calc(100% - 24px);
|
||||||
|
padding: 12px;
|
||||||
|
font-size: 12px;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
<script>
|
<script>
|
||||||
// 1st script, prepares values needed for writing document
|
// 1st script, prepares values needed for writing document
|
||||||
|
@ -93,7 +109,7 @@
|
||||||
<h1><script>
|
<h1><script>
|
||||||
document.write(qp.action + "<br>Room " + qp.room)
|
document.write(qp.action + "<br>Room " + qp.room)
|
||||||
</script></h1>
|
</script></h1>
|
||||||
<form>
|
<form id="mainform">
|
||||||
<label>
|
<label>
|
||||||
Full Name:<br>
|
Full Name:<br>
|
||||||
<input type="text" name="name" id="name" placeholder="John Doe" required>
|
<input type="text" name="name" id="name" placeholder="John Doe" required>
|
||||||
|
@ -111,13 +127,20 @@
|
||||||
document.getElementById('name').value = savedName
|
document.getElementById('name').value = savedName
|
||||||
|
|
||||||
// 2nd script, server API communication
|
// 2nd script, server API communication
|
||||||
form = document.querySelector('form')
|
var name, agreed
|
||||||
form.onsubmit= function(e) {
|
var mform = document.getElementById('mainform')
|
||||||
e.preventDefault()
|
mform.onsubmit = function(e) {
|
||||||
console.log(e)
|
|
||||||
|
|
||||||
var name = e.srcElement[0].value
|
e.preventDefault()
|
||||||
var agreed = e.srcElement[1].checked
|
|
||||||
|
name = e.srcElement[0].value
|
||||||
|
agreed = e.srcElement[1].checked
|
||||||
|
|
||||||
|
sendMainData()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendMainData() {
|
||||||
|
|
||||||
// POST JSON. See docs/API.md
|
// POST JSON. See docs/API.md
|
||||||
var payload = (qp.action == 'arrival') ?
|
var payload = (qp.action == 'arrival') ?
|
||||||
|
@ -131,39 +154,119 @@
|
||||||
'cleanedworkspace': agreed
|
'cleanedworkspace': agreed
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(payload)
|
post("/" + qp.action, payload)
|
||||||
|
|
||||||
fetch("/" + qp.action, {
|
}
|
||||||
|
|
||||||
|
function post(url, payload) {
|
||||||
|
|
||||||
|
console.log("Sending payload:", payload)
|
||||||
|
|
||||||
|
return fetch(url, {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: JSON.stringify(payload)
|
body: JSON.stringify(payload)
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
|
handleResponse(res)
|
||||||
console.log("Request complete! response:", res)
|
|
||||||
|
|
||||||
if (Math.floor(res.status / 100) == 2) {
|
|
||||||
|
|
||||||
// Success
|
|
||||||
form.innerHTML = "<h2>Done. Thanks!</h2>"
|
|
||||||
localStorage.setItem('name', name)
|
|
||||||
|
|
||||||
} else if (res.status == 409) {
|
|
||||||
|
|
||||||
// Conflict, more data requested
|
|
||||||
res.json().then(function (json) {
|
|
||||||
|
|
||||||
// TODO: Ask user for data and resend both
|
|
||||||
alert(json.message)
|
|
||||||
})
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
// Any other generic error
|
|
||||||
res.text().then(function (text) {
|
|
||||||
alert(text)
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleResponse(res) {
|
||||||
|
|
||||||
|
console.log("Request complete! response:", res)
|
||||||
|
|
||||||
|
if (Math.floor(res.status / 100) == 2) {
|
||||||
|
|
||||||
|
// Success
|
||||||
|
mform = document.getElementById('mainform')
|
||||||
|
mform.innerHTML = "<h2>Done. Thanks!</h2>"
|
||||||
|
localStorage.setItem('name', name)
|
||||||
|
|
||||||
|
} else if (res.status == 409) {
|
||||||
|
|
||||||
|
// Conflict, more data requested
|
||||||
|
handleRequest(res)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Any other generic error
|
||||||
|
res.text().then(function (text) {
|
||||||
|
alert(text)
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleRequestSubmit(e, json) {
|
||||||
|
|
||||||
|
e.preventDefault()
|
||||||
|
|
||||||
|
var input = e.srcElement[0].value
|
||||||
|
var iso = new Date(input).toISOString()
|
||||||
|
|
||||||
|
// POST JSON. See docs/API.md
|
||||||
|
var payload = (json.request == 'arrival') ?
|
||||||
|
{
|
||||||
|
'room': qp.room,
|
||||||
|
'name': name,
|
||||||
|
'arrival': iso,
|
||||||
|
'agreetoguidelines': agreed
|
||||||
|
} :
|
||||||
|
{
|
||||||
|
'name': name,
|
||||||
|
'departure': iso,
|
||||||
|
'cleanedworkspace': agreed
|
||||||
|
}
|
||||||
|
|
||||||
|
return post("/" + json.request, payload)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleRequest(res) {
|
||||||
|
|
||||||
|
var reqt = {
|
||||||
|
'arrival': 'You probably forgot to sign in when you arrived. Please enter your arrival time now:',
|
||||||
|
'departure': 'You probably forgot to sign out when you left. Please enter your departure time now:'
|
||||||
|
}
|
||||||
|
|
||||||
|
mform.innerHTML = "<h2>Processing Request...</h2>"
|
||||||
|
|
||||||
|
res.json().then(function (json) {
|
||||||
|
|
||||||
|
var aInfo = ''
|
||||||
|
var minD = ''
|
||||||
|
if (json.request == 'departure') {
|
||||||
|
var d = new Date(json.arrival.time)
|
||||||
|
var dInfo = d.toString('en-GB').split(' ').slice(0,5).join(' ')
|
||||||
|
aInfo = `Your last arrival was on <b>${dInfo}</b> in room <b>${json.arrival.room}</b>.`
|
||||||
|
minD = `min="${json.arrival.time.split(':').slice(0,2).join(':')}"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var now = new Date().toISOString().split(':').slice(0,2).join(':')
|
||||||
|
|
||||||
|
document.body.innerHTML +=
|
||||||
|
`<div class="request">
|
||||||
|
<h1>${json.request} missing!</h1>
|
||||||
|
<form id="reqform">
|
||||||
|
<label>
|
||||||
|
${reqt[json.request]}
|
||||||
|
<input type="datetime-local" id="datetime" ${minD} max="${now}" required>
|
||||||
|
${aInfo}
|
||||||
|
</label>
|
||||||
|
<input type="submit">
|
||||||
|
</form>
|
||||||
|
</div>`
|
||||||
|
|
||||||
|
rform = document.getElementById('reqform')
|
||||||
|
rform.onsubmit = async function(e) {
|
||||||
|
await handleRequestSubmit(e, json)
|
||||||
|
document.querySelector('.request').remove()
|
||||||
|
setTimeout(sendMainData, 200)
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
Loading…
Reference in New Issue