$(function() { var App = { init : function() { if (sessionStorage.getItem('deviceId') !== null) { this.state.inputStream.constraints.deviceId = sessionStorage.getItem('deviceId'); } Quagga.init(this.state, function(err) { if (err) { console.log(err); return; } App.attachListeners(); App.checkCapabilities(); Quagga.start(); }); }, checkCapabilities: function() { var track = Quagga.CameraAccess.getActiveTrack(); var capabilities = {}; if (typeof track.getCapabilities === 'function') { capabilities = track.getCapabilities(); } this.applySettingsVisibility('zoom', capabilities.zoom); this.applySettingsVisibility('torch', capabilities.torch); }, updateOptionsForMediaRange: function(node, range) { console.log('updateOptionsForMediaRange', node, range); var NUM_STEPS = 6; var stepSize = (range.max - range.min) / NUM_STEPS; var option; var value; while (node.firstChild) { node.removeChild(node.firstChild); } for (var i = 0; i <= NUM_STEPS; i++) { value = range.min + (stepSize * i); option = document.createElement('option'); option.value = value; option.innerHTML = value; node.appendChild(option); } }, applySettingsVisibility: function(setting, capability) { // depending on type of capability if (typeof capability === 'boolean') { var node = document.querySelector('input[name="settings_' + setting + '"]'); if (node) { node.parentNode.style.display = capability ? 'block' : 'none'; } return; } if (window.MediaSettingsRange && capability instanceof window.MediaSettingsRange) { var node = document.querySelector('select[name="settings_' + setting + '"]'); if (node) { this.updateOptionsForMediaRange(node, capability); node.parentNode.style.display = 'block'; } return; } }, initCameraSelection: function(){ var streamLabel = Quagga.CameraAccess.getActiveStreamLabel(); return Quagga.CameraAccess.enumerateVideoDevices() .then(function(devices) { function pruneText(text) { return text.length > 30 ? text.substr(0, 30) : text; } var $deviceSelection = document.getElementById("deviceSelection"); while ($deviceSelection.firstChild) { $deviceSelection.removeChild($deviceSelection.firstChild); } devices.forEach(function(device) { var $option = document.createElement("option"); $option.value = device.deviceId || device.id; $option.appendChild(document.createTextNode(pruneText(device.label || device.deviceId || device.id))); $option.selected = streamLabel === device.label; $deviceSelection.appendChild($option); }); }); }, attachListeners: function() { var self = this; self.initCameraSelection(); $(".controls").on("click", "button.stop", function(e) { e.preventDefault(); Quagga.stop(); }); $(".controls .reader-config-group").on("change", "input, select", function(e) { e.preventDefault(); var $target = $(e.target), value = $target.attr("type") === "checkbox" ? $target.prop("checked") : $target.val(), name = $target.attr("name"), state = self._convertNameToState(name); sessionStorage.setItem('deviceId', value); console.log("Value of "+ state + " changed to " + value); self.setState(state, value); }); $("#snapshot").on("click", function(e) { e.preventDefault(); var code = $("#manual_code").val(); if (self.addCode(code)) { $("#manual_code").val(""); } }); $("#add_bag").on("click", function(e) { e.preventDefault(); var code = "123-456"; if (self.addCode(code)) { $("input[name='123-456']").val("1"); } }); $("#submit_button").on("click", function(e) { $(".price input").each(function() { if ($(this).val() <= 0 || $(this).val() == "") { e.preventDefault(); $(this).focus(); } }); }); }, _accessByPath: function(obj, path, val) { var parts = path.split('.'), depth = parts.length, setter = (typeof val !== "undefined") ? true : false; return parts.reduce(function(o, key, i) { if (setter && (i + 1) === depth) { if (typeof o[key] === "object" && typeof val === "object") { Object.assign(o[key], val); } else { o[key] = val; } } return key in o ? o[key] : {}; }, obj); }, _convertNameToState: function(name) { return name.replace("_", ".").split("-").reduce(function(result, value) { return result + value.charAt(0).toUpperCase() + value.substring(1); }); }, detachListeners: function() { $(".controls").off("click", "button.stop"); $(".controls .reader-config-group").off("change", "input, select"); }, applySetting: function(setting, value) { var track = Quagga.CameraAccess.getActiveTrack(); if (track && typeof track.getCapabilities === 'function') { switch (setting) { case 'zoom': return track.applyConstraints({advanced: [{zoom: parseFloat(value)}]}); case 'torch': return track.applyConstraints({advanced: [{torch: !!value}]}); } } }, setState: function(path, value) { var self = this; if (typeof self._accessByPath(self.inputMapper, path) === "function") { value = self._accessByPath(self.inputMapper, path)(value); } if (path.startsWith('settings.')) { var setting = path.substring(9); return self.applySetting(setting, value); } self._accessByPath(self.state, path, value); console.log(JSON.stringify(self.state)); App.detachListeners(); Quagga.stop(); App.init(); }, addCode: function(code) { if (code.match(/^\d\d\d\.\d\d\d$/)) { code = code.replace('.', '-'); } if (!App.results.includes(code) && code.match(/^\d\d\d\-\d\d\d$/)) { App.results.push(code); var $node = null, canvas = Quagga.canvas.dom.image; $node = $('