93 lines
2.5 KiB
JavaScript
93 lines
2.5 KiB
JavaScript
class Scanner
|
|
{
|
|
static api;
|
|
static settings;
|
|
static scanned;
|
|
|
|
constructor(parent) {
|
|
Scanner.api = parent;
|
|
this.qr = null;
|
|
this.cameras = [];
|
|
}
|
|
|
|
Start(id, subroute, parser) {
|
|
Scanner.settings = {
|
|
subroute: subroute,
|
|
parser: parser,
|
|
id: id
|
|
};
|
|
Scanner.scanned = {primary: {}, secondary: {}};
|
|
for (let i in parser) {
|
|
if (i!=subroute) {
|
|
Scanner.scanned.secondary[parser[i]] = null;
|
|
} }
|
|
|
|
// Find already parsed IDs
|
|
const subData = Scanner.api.activeRoute.resourcesIndex[id].data.SUB[parser[subroute]];
|
|
for (let i in subData) {
|
|
Scanner.scanned.primary[subData[i].ID] = true;
|
|
}
|
|
|
|
this.qr = new QrScanner(
|
|
document.getElementById("qrscanner_video"),
|
|
Scanner.parse,
|
|
{returnDetailedScanResult: true, highlightScanRegion: true, highlightCodeOutline: true}
|
|
);
|
|
if (QrScanner.hasCamera()) {
|
|
let _this = this;
|
|
QrScanner.listCameras(true)
|
|
.then(result => _this.cameras = result)
|
|
.catch(error => alert(error || 'Camera detection failed.'));
|
|
}
|
|
this.cameraIndex = 0;
|
|
document.getElementById("qrscanner_text").innerHTML = "";
|
|
|
|
this.qr.start();
|
|
}
|
|
Stop() {
|
|
this.qr.stop();
|
|
this.qr.destroy();
|
|
this.qr = null;
|
|
}
|
|
SwitchCamera() {
|
|
if (this.qr!==null && QrScanner.hasCamera()) {
|
|
++this.cameraIndex;
|
|
if (this.cameraIndex>=this.cameras.length) {
|
|
this.cameraIndex = 0;
|
|
}
|
|
this.qr.setCamera(this.cameras[this.cameraIndex].id);
|
|
}
|
|
}
|
|
static parse(result) {
|
|
let scan = result.data.split("/");
|
|
if (scan.length==3) {
|
|
let route = scan[1];
|
|
let subid = scan[2];
|
|
|
|
// Is it a route we should parse?
|
|
if (typeof(Scanner.settings.parser[route])!="undefined") {
|
|
const marker = Scanner.settings.parser[route];
|
|
|
|
// Is it the primary route and if yes, has this ID been parsed before?
|
|
if (route==Scanner.settings.subroute && typeof(Scanner.scanned.primary[subid])=="undefined") {
|
|
Scanner.scanned.primary[subid] = true;
|
|
|
|
let index = -1;
|
|
|
|
const options = Scanner.api.activeRoute.options[marker];
|
|
for (let i in options) {
|
|
if (options[i].ID==subid) {
|
|
index = i;
|
|
break;
|
|
} }
|
|
// Has the ID been found?
|
|
if (index>=0) {
|
|
document.getElementById("qrscanner_text").innerHTML += options[index].NAME + "<br />";
|
|
Scanner.api.Request("POST", Scanner.scanned.secondary, Scanner.settings.id, Scanner.settings.subroute, subid);
|
|
}
|
|
} else if(route!=Scanner.settings.subroute) { // Is it a secondary field?
|
|
Scanner.scanned.secondary[marker] = subid;
|
|
} } } }
|
|
}
|
|
|