189 lines
5.3 KiB
JavaScript
189 lines
5.3 KiB
JavaScript
/*
|
|
* API class which communicates with the Pummeluff REST API.
|
|
*/
|
|
|
|
class API {
|
|
|
|
/*
|
|
* Send AJAX request to REST API endpoint.
|
|
*/
|
|
|
|
request = (endpoint, data, callback) => {
|
|
let init = {}
|
|
if(data)
|
|
init = { method: 'POST', body: data }
|
|
|
|
fetch(endpoint, init)
|
|
.then((response) => {
|
|
return response.json()
|
|
})
|
|
.then(callback)
|
|
|
|
}
|
|
|
|
/*
|
|
* Refresh the registry.
|
|
*/
|
|
|
|
refreshRegistry = () => {
|
|
let callback = (response) => {
|
|
let tagsContainer = document.getElementById('tags')
|
|
while(tagsContainer.firstChild) {
|
|
tagsContainer.removeChild(tagsContainer.firstChild)
|
|
}
|
|
|
|
for(let tag of response.tags) {
|
|
let tagElement = document.createElement('div')
|
|
tagElement.setAttribute('class', 'tag')
|
|
|
|
let args = new Array('alias', 'uid', 'action_class', 'parameter')
|
|
for(let arg of args) {
|
|
let spanElement = document.createElement('span')
|
|
let value = tag[arg] ? tag[arg] : '-'
|
|
spanElement.setAttribute('class', arg.replace('_', '-'))
|
|
spanElement.innerHTML = value
|
|
tagElement.appendChild(spanElement)
|
|
}
|
|
|
|
tagsContainer.appendChild(tagElement)
|
|
}
|
|
}
|
|
|
|
this.request('/pummeluff/registry/', false, callback)
|
|
}
|
|
|
|
/*
|
|
* Refresh the tags.
|
|
*/
|
|
|
|
refreshActionClasses = () => {
|
|
let callback = (response) => {
|
|
let select = document.getElementById('action-class');
|
|
while(select.firstChild)
|
|
select.removeChild(select.firstChild)
|
|
|
|
for(let action_class in response.action_classes) {
|
|
let option = document.createElement('option')
|
|
option.setAttribute('value', action_class)
|
|
option.innerHTML = action_class + ' (' + response.action_classes[action_class] + ')'
|
|
select.appendChild(option)
|
|
}
|
|
}
|
|
|
|
this.request('/pummeluff/action-classes/', false, callback)
|
|
}
|
|
|
|
/*
|
|
* Reset the form.
|
|
*/
|
|
|
|
formCallback = (response) => {
|
|
if(response.success) {
|
|
this.refreshRegistry()
|
|
document.getElementById('uid').value = ''
|
|
document.getElementById('alias').value = ''
|
|
document.getElementById('parameter').value = ''
|
|
document.getElementById('action-class').selectIndex = 0
|
|
} else {
|
|
window.alert(response.message)
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Register a new tag.
|
|
*/
|
|
|
|
register = () => {
|
|
let form = document.getElementById('register-form')
|
|
let data = new FormData(form)
|
|
this.request('/pummeluff/register/', data, this.formCallback)
|
|
}
|
|
|
|
/*
|
|
* Unregister an existing tag.
|
|
*/
|
|
|
|
unregister = () => {
|
|
let form = document.getElementById('register-form')
|
|
let data = new FormData(form)
|
|
this.request('/pummeluff/unregister/', data, this.formCallback)
|
|
}
|
|
|
|
/*
|
|
* Get latest scanned tag.
|
|
*/
|
|
|
|
getLatestTag = () => {
|
|
let latest_tag = undefined
|
|
|
|
let uid_field = document.getElementById('uid')
|
|
let alias_field = document.getElementById('alias')
|
|
let parameter_field = document.getElementById('parameter')
|
|
let action_class_select = document.getElementById('action-class')
|
|
|
|
uid_field.value = ''
|
|
alias_field.value = ''
|
|
parameter_field.value = ''
|
|
action_class_select.selectIndex = 0
|
|
|
|
let link = document.getElementById('read-rfid-tag')
|
|
link.classList.add('reading')
|
|
|
|
let do_request = () => {
|
|
let callback = (response) => {
|
|
if(latest_tag && response.success && JSON.stringify(response) != JSON.stringify(latest_tag)) {
|
|
uid_field.value = response.uid
|
|
|
|
if(response.alias)
|
|
alias_field.value = response.alias
|
|
|
|
if(response.parameter)
|
|
parameter_field.value = response.parameter
|
|
|
|
if(response.action_class)
|
|
action_class_select.value = response.action_class
|
|
|
|
link.classList.remove('reading')
|
|
} else {
|
|
setTimeout(() => do_request(), 1000)
|
|
}
|
|
|
|
latest_tag = response
|
|
}
|
|
|
|
api.request('/pummeluff/latest/', false, callback)
|
|
}
|
|
|
|
do_request()
|
|
}
|
|
|
|
}
|
|
|
|
api = new API()
|
|
|
|
api.refreshRegistry()
|
|
api.refreshActionClasses()
|
|
|
|
document.addEventListener('click', (event) => {
|
|
let target = event.target
|
|
let div = target.closest('div')
|
|
|
|
if(div && div.classList.contains('tag')) {
|
|
for(let child of div.children) {
|
|
document.getElementById(child.className).value = child.innerHTML.replace(/^-$/, '')
|
|
}
|
|
}
|
|
})
|
|
|
|
document.getElementById('register-form').onsubmit = () => {
|
|
api.register()
|
|
return false;
|
|
}
|
|
|
|
document.getElementById('unregister-button').onclick = () => {
|
|
api.unregister()
|
|
return false
|
|
}
|
|
|
|
document.getElementById('read-rfid-tag').onclick = () => api.getLatestTag()
|