From ef9034e3800c043b34cec4e62c31598a3840f9f3 Mon Sep 17 00:00:00 2001 From: Marc Date: Wed, 22 Apr 2015 10:20:15 +0200 Subject: [PATCH] Fixed linendings and encoding --- .../static/js/app/viewmodels/control.js | 1040 ++++++++--------- .../static/js/app/viewmodels/settings.js | 742 ++++++------ 2 files changed, 891 insertions(+), 891 deletions(-) diff --git a/src/octoprint/static/js/app/viewmodels/control.js b/src/octoprint/static/js/app/viewmodels/control.js index 9d441f71..f7b014c9 100644 --- a/src/octoprint/static/js/app/viewmodels/control.js +++ b/src/octoprint/static/js/app/viewmodels/control.js @@ -1,520 +1,520 @@ -$(function() { - function ControlViewModel(parameters) { - var self = this; - - self.loginState = parameters[0]; - self.settings = parameters[1]; - - self._createToolEntry = function () { - return { - name: ko.observable(), - key: ko.observable() - } - }; - - self.isErrorOrClosed = ko.observable(undefined); - self.isOperational = ko.observable(undefined); - self.isPrinting = ko.observable(undefined); - self.isPaused = ko.observable(undefined); - self.isError = ko.observable(undefined); - self.isReady = ko.observable(undefined); - self.isLoading = ko.observable(undefined); - - self.extrusionAmount = ko.observable(undefined); - self.controls = ko.observableArray([]); - self.staticID = 0; - - self.tools = ko.observableArray([]); - - self.feedRate = ko.observable(100); - self.flowRate = ko.observable(100); - - self.feedbackControlLookup = {}; - - self.controlsFromServer = []; - self.additionalControls = []; - - self.webcamDisableTimeout = undefined; - - self.keycontrolActive = ko.observable(false); - self.keycontrolHelpActive = ko.observable(false); - self.keycontrolPossible = ko.computed(function () { - return self.isOperational() && !self.isPrinting() && self.loginState.isUser() && !$.browser.mobile; - }); - self.showKeycontrols = ko.computed(function () { - return self.keycontrolActive() && self.keycontrolPossible(); - }); - - self.settings.printerProfiles.currentProfileData.subscribe(function () { - self._updateExtruderCount(); - self.settings.printerProfiles.currentProfileData().extruder.count.subscribe(self._updateExtruderCount); - }); - self._updateExtruderCount = function () { - var tools = []; - - var numExtruders = self.settings.printerProfiles.currentProfileData().extruder.count(); - if (numExtruders > 1) { - // multiple extruders - for (var extruder = 0; extruder < numExtruders; extruder++) { - tools[extruder] = self._createToolEntry(); - tools[extruder]["name"](gettext("Tool") + " " + extruder); - tools[extruder]["key"]("tool" + extruder); - } - } else { - // only one extruder, no need to add numbers - tools[0] = self._createToolEntry(); - tools[0]["name"](gettext("Hotend")); - tools[0]["key"]("tool0"); - } - - self.tools(tools); - }; - - self.fromCurrentData = function (data) { - self._processStateData(data.state); - }; - - self.fromHistoryData = function (data) { - self._processStateData(data.state); - }; - - self._processStateData = function (data) { - self.isErrorOrClosed(data.flags.closedOrError); - self.isOperational(data.flags.operational); - self.isPaused(data.flags.paused); - self.isPrinting(data.flags.printing); - self.isError(data.flags.error); - self.isReady(data.flags.ready); - self.isLoading(data.flags.loading); - }; - - self.onEventSettingsUpdated = function (payload) { - self.requestData(); - }; - - self.onEventRegisteredMessageReceived = function(payload) { - if (payload.key in self.feedbackControlLookup) { - var outputs = self.feedbackControlLookup[payload.key]; - _.each(payload.outputs, function(value, key) { - if (outputs.hasOwnProperty(key)) { - outputs[key](value); - } - }); - } - }; - - self.rerenderControls = function () { - var allControls = self.controlsFromServer.concat(self.additionalControls); - self.controls(self._processControls(allControls)) - }; - - self.requestData = function () { - $.ajax({ - url: API_BASEURL + "printer/command/custom", - method: "GET", - dataType: "json", - success: function (response) { - self._fromResponse(response); - } - }); - }; - - self._fromResponse = function (response) { - self.controlsFromServer = response.controls; - self.rerenderControls(); - }; - - self._processControls = function (controls) { - for (var i = 0; i < controls.length; i++) { - controls[i] = self._processControl(controls[i]); - } - return controls; - }; - - self._processControl = function (control) { - control.id = ko.observable("settingsCustomControl_id" + self.staticID++); - - if (control.hasOwnProperty("processed") && control.processed) { - return control; - } - - if (control.hasOwnProperty("template") && control.hasOwnProperty("key") && control.hasOwnProperty("defaultValue") && control.hasOwnProperty("template_key") && !control.hasOwnProperty("output")) { - control.output = ko.observable(control.defaultValue); - if (!self.feedbackControlLookup.hasOwnProperty(control.key)) { - self.feedbackControlLookup[control.key] = {}; - } - self.feedbackControlLookup[control.key][control.template_key] = control.output; - } - - if (control.hasOwnProperty("children")) { - control.children = ko.observableArray(self._processControls(control.children)); - if (!control.hasOwnProperty("layout") || !(control.layout == "vertical" || control.layout == "horizontal" || control.layout == "horizontal_grid")) { - control.layout = "vertical"; - } - - if (!control.hasOwnProperty("collapsable")) - control.collapsable = false; - } - - if (control.hasOwnProperty("input")) { - for (var i = 0; i < control.input.length; i++) { - control.input[i].value = ko.observable(control.input[i].defaultValue); - if (!control.input[i].hasOwnProperty("slider")) { - control.input[i].slider = false; - } - } - } - - var js; - if (control.hasOwnProperty("javascript")) { - js = control.javascript; - - // if js is a function everything's fine already, but if it's a string we need to eval that first - if (!_.isFunction(js)) { - control.javascript = function (data) { - eval(js); - }; - } - } - - if (control.hasOwnProperty("enabled")) { - js = control.enabled; - - // if js is a function everything's fine already, but if it's a string we need to eval that first - if (!_.isFunction(js)) { - control.enabled = function (data) { - return eval(js); - } - } - } - - control.processed = true; - return control; - }; - - self.isCustomEnabled = function (data) { - if (data.hasOwnProperty("enabled")) { - return data.enabled(data); - } else { - return self.isOperational() && self.loginState.isUser(); - } - }; - - self.clickCustom = function (data) { - var callback; - if (data.hasOwnProperty("javascript")) { - callback = data.javascript; - } else { - callback = self.sendCustomCommand; - } - - if (data.confirm) { - showConfirmationDialog(data.confirm, function (e) { - callback(data); - }); - } else { - callback(data); - } - }; - - self.sendJogCommand = function (axis, multiplier, distance) { - if (typeof distance === "undefined") - distance = $('#jog_distance button.active').data('distance'); - if (self.settings.printerProfiles.currentProfileData() && self.settings.printerProfiles.currentProfileData()["axes"] && self.settings.printerProfiles.currentProfileData()["axes"][axis] && self.settings.printerProfiles.currentProfileData()["axes"][axis]["inverted"]()) { - multiplier *= -1; - } - - var data = { - "command": "jog" - }; - data[axis] = distance * multiplier; - - self.sendPrintHeadCommand(data); - }; - - self.sendHomeCommand = function (axis) { - self.sendPrintHeadCommand({ - "command": "home", - "axes": axis - }); - }; - - self.sendFeedRateCommand = function () { - self.sendPrintHeadCommand({ - "command": "feedrate", - "factor": self.feedRate() - }); - }; - - self.sendExtrudeCommand = function () { - self._sendECommand(1); - }; - - self.sendRetractCommand = function () { - self._sendECommand(-1); - }; - - self.sendFlowRateCommand = function () { - self.sendToolCommand({ - "command": "flowrate", - "factor": self.flowRate() - }); - }; - - self._sendECommand = function (dir) { - var length = self.extrusionAmount(); - if (!length) length = self.settings.printer_defaultExtrusionLength(); - - self.sendToolCommand({ - command: "extrude", - amount: length * dir - }); - }; - - self.sendSelectToolCommand = function (data) { - if (!data || !data.key()) return; - - self.sendToolCommand({ - command: "select", - tool: data.key() - }); - }; - - self.sendPrintHeadCommand = function (data) { - $.ajax({ - url: API_BASEURL + "printer/printhead", - type: "POST", - dataType: "json", - contentType: "application/json; charset=UTF-8", - data: JSON.stringify(data) - }); - }; - - self.sendToolCommand = function (data) { - $.ajax({ - url: API_BASEURL + "printer/tool", - type: "POST", - dataType: "json", - contentType: "application/json; charset=UTF-8", - data: JSON.stringify(data) - }); - }; - - self.sendCustomCommand = function (command) { - if (!command) - return; - - var data = undefined; - if (command.hasOwnProperty("command")) { - // single command - data = {"command": command.command}; - } else if (command.hasOwnProperty("commands")) { - // multi command - data = {"commands": command.commands}; - } else if (command.hasOwnProperty("script")) { - data = {"script": command.script}; - if (command.hasOwnProperty("context")) { - data["context"] = command.context; - } - } else { - return; - } - - if (command.hasOwnProperty("input")) { - // parametric command(s) - data["parameters"] = {}; - _.each(command.input, function(input) { - if (!input.hasOwnProperty("parameter") || !input.hasOwnProperty("value")) { - return; - } - - data["parameters"][input.parameter] = input.value(); - }); - } - - $.ajax({ - url: API_BASEURL + "printer/command", - type: "POST", - dataType: "json", - contentType: "application/json; charset=UTF-8", - data: JSON.stringify(data) - }) - }; - - self.displayMode = function (customControl) { - if (customControl.hasOwnProperty("children")) { - return (customControl.hasOwnProperty("name") && customControl.name != "") ? "customControls_containerTemplate_accordion" : "customControls_containerTemplate"; - } else { - return "customControls_controlTemplate"; - } - }; - - self.rowCss = function (customControl) { - var span = "span2"; - var offset = ""; - if (customControl.hasOwnProperty("width")) { - span = "span" + customControl.width; - } - if (customControl.hasOwnProperty("offset")) { - offset = "offset" + customControl.offset; - } - return span + " " + offset; - }; - - self.onStartup = function () { - self.requestData(); - }; - - self.onTabChange = function (current, previous) { - if (current == "#control") { - if (self.webcamDisableTimeout != undefined) { - clearTimeout(self.webcamDisableTimeout); - } - var webcamImage = $("#webcam_image"); - var currentSrc = webcamImage.attr("src"); - if (currentSrc === undefined || currentSrc.trim() == "") { - var newSrc = CONFIG_WEBCAM_STREAM; - if (CONFIG_WEBCAM_STREAM.lastIndexOf("?") > -1) { - newSrc += "&"; - } else { - newSrc += "?"; - } - newSrc += new Date().getTime(); - - webcamImage.attr("src", newSrc); - } - } else if (previous == "#control") { - // only disable webcam stream if tab is out of focus for more than 5s, otherwise we might cause - // more load by the constant connection creation than by the actual webcam stream - self.webcamDisableTimeout = setTimeout(function () { - $("#webcam_image").attr("src", ""); - }, 5000); - } - }; - - self.onAllBound = function (allViewModels) { - var additionalControls = []; - _.each(allViewModels, function (viewModel) { - if (viewModel.hasOwnProperty("getAdditionalControls")) { - additionalControls = additionalControls.concat(viewModel.getAdditionalControls()); - } - }); - if (additionalControls.length > 0) { - self.additionalControls = additionalControls; - self.rerenderControls(); - } - }; - - self.onFocus = function (data, event) { - if (!self.settings.feature_keyboardControl()) return; - self.keycontrolActive(true); - }; - - self.onMouseOver = function (data, event) { - if (!self.settings.feature_keyboardControl()) return; - $("#webcam_container").focus(); - self.keycontrolActive(true); - }; - - self.onMouseOut = function (data, event) { - if (!self.settings.feature_keyboardControl()) return; - $("#webcam_container").blur(); - self.keycontrolActive(false); - }; - - self.toggleKeycontrolHelp = function () { - self.keycontrolHelpActive(!self.keycontrolHelpActive()); - }; - - self.onKeyDown = function (data, event) { - if (!self.settings.feature_keyboardControl()) return; - - var button = undefined; - var visualizeClick = true; - - switch (event.which) { - case 37: // left arrow key - // X- - button = $("#control-xdec"); - break; - case 38: // up arrow key - // Y+ - button = $("#control-yinc"); - break; - case 39: // right arrow key - // X+ - button = $("#control-xinc"); - break; - case 40: // down arrow key - // Y- - button = $("#control-ydec"); - break; - case 49: // number 1 - case 97: // numpad 1 - // Distance 0.1 - button = $("#control-distance01"); - visualizeClick = false; - break; - case 50: // number 2 - case 98: // numpad 2 - // Distance 1 - button = $("#control-distance1"); - visualizeClick = false; - break; - case 51: // number 3 - case 99: // numpad 3 - // Distance 10 - button = $("#control-distance10"); - visualizeClick = false; - break; - case 52: // number 4 - case 100: // numpad 4 - // Distance 100 - button = $("#control-distance100"); - visualizeClick = false; - break; - case 33: // page up key - case 87: // w key - // z lift up - button = $("#control-zinc"); - break; - case 34: // page down key - case 83: // s key - // z lift down - button = $("#control-zdec"); - break; - case 36: // home key - // xy home - button = $("#control-xyhome"); - break; - case 35: // end key - // z home - button = $("#control-zhome"); - break; - default: - event.preventDefault(); - return false; - } - - if (button === undefined) { - return false; - } else { - event.preventDefault(); - if (visualizeClick) { - button.addClass("active"); - setTimeout(function () { - button.removeClass("active"); - }, 150); - } - button.click(); - } - }; - - } - - OCTOPRINT_VIEWMODELS.push([ - ControlViewModel, - ["loginStateViewModel", "settingsViewModel"], - "#control" - ]); -}); +$(function() { + function ControlViewModel(parameters) { + var self = this; + + self.loginState = parameters[0]; + self.settings = parameters[1]; + + self._createToolEntry = function () { + return { + name: ko.observable(), + key: ko.observable() + } + }; + + self.isErrorOrClosed = ko.observable(undefined); + self.isOperational = ko.observable(undefined); + self.isPrinting = ko.observable(undefined); + self.isPaused = ko.observable(undefined); + self.isError = ko.observable(undefined); + self.isReady = ko.observable(undefined); + self.isLoading = ko.observable(undefined); + + self.extrusionAmount = ko.observable(undefined); + self.controls = ko.observableArray([]); + self.staticID = 0; + + self.tools = ko.observableArray([]); + + self.feedRate = ko.observable(100); + self.flowRate = ko.observable(100); + + self.feedbackControlLookup = {}; + + self.controlsFromServer = []; + self.additionalControls = []; + + self.webcamDisableTimeout = undefined; + + self.keycontrolActive = ko.observable(false); + self.keycontrolHelpActive = ko.observable(false); + self.keycontrolPossible = ko.computed(function () { + return self.isOperational() && !self.isPrinting() && self.loginState.isUser() && !$.browser.mobile; + }); + self.showKeycontrols = ko.computed(function () { + return self.keycontrolActive() && self.keycontrolPossible(); + }); + + self.settings.printerProfiles.currentProfileData.subscribe(function () { + self._updateExtruderCount(); + self.settings.printerProfiles.currentProfileData().extruder.count.subscribe(self._updateExtruderCount); + }); + self._updateExtruderCount = function () { + var tools = []; + + var numExtruders = self.settings.printerProfiles.currentProfileData().extruder.count(); + if (numExtruders > 1) { + // multiple extruders + for (var extruder = 0; extruder < numExtruders; extruder++) { + tools[extruder] = self._createToolEntry(); + tools[extruder]["name"](gettext("Tool") + " " + extruder); + tools[extruder]["key"]("tool" + extruder); + } + } else { + // only one extruder, no need to add numbers + tools[0] = self._createToolEntry(); + tools[0]["name"](gettext("Hotend")); + tools[0]["key"]("tool0"); + } + + self.tools(tools); + }; + + self.fromCurrentData = function (data) { + self._processStateData(data.state); + }; + + self.fromHistoryData = function (data) { + self._processStateData(data.state); + }; + + self._processStateData = function (data) { + self.isErrorOrClosed(data.flags.closedOrError); + self.isOperational(data.flags.operational); + self.isPaused(data.flags.paused); + self.isPrinting(data.flags.printing); + self.isError(data.flags.error); + self.isReady(data.flags.ready); + self.isLoading(data.flags.loading); + }; + + self.onEventSettingsUpdated = function (payload) { + self.requestData(); + }; + + self.onEventRegisteredMessageReceived = function(payload) { + if (payload.key in self.feedbackControlLookup) { + var outputs = self.feedbackControlLookup[payload.key]; + _.each(payload.outputs, function(value, key) { + if (outputs.hasOwnProperty(key)) { + outputs[key](value); + } + }); + } + }; + + self.rerenderControls = function () { + var allControls = self.controlsFromServer.concat(self.additionalControls); + self.controls(self._processControls(allControls)) + }; + + self.requestData = function () { + $.ajax({ + url: API_BASEURL + "printer/command/custom", + method: "GET", + dataType: "json", + success: function (response) { + self._fromResponse(response); + } + }); + }; + + self._fromResponse = function (response) { + self.controlsFromServer = response.controls; + self.rerenderControls(); + }; + + self._processControls = function (controls) { + for (var i = 0; i < controls.length; i++) { + controls[i] = self._processControl(controls[i]); + } + return controls; + }; + + self._processControl = function (control) { + control.id = ko.observable("settingsCustomControl_id" + self.staticID++); + + if (control.hasOwnProperty("processed") && control.processed) { + return control; + } + + if (control.hasOwnProperty("template") && control.hasOwnProperty("key") && control.hasOwnProperty("defaultValue") && control.hasOwnProperty("template_key") && !control.hasOwnProperty("output")) { + control.output = ko.observable(control.defaultValue); + if (!self.feedbackControlLookup.hasOwnProperty(control.key)) { + self.feedbackControlLookup[control.key] = {}; + } + self.feedbackControlLookup[control.key][control.template_key] = control.output; + } + + if (control.hasOwnProperty("children")) { + control.children = ko.observableArray(self._processControls(control.children)); + if (!control.hasOwnProperty("layout") || !(control.layout == "vertical" || control.layout == "horizontal" || control.layout == "horizontal_grid")) { + control.layout = "vertical"; + } + + if (!control.hasOwnProperty("collapsable")) + control.collapsable = false; + } + + if (control.hasOwnProperty("input")) { + for (var i = 0; i < control.input.length; i++) { + control.input[i].value = ko.observable(control.input[i].defaultValue); + if (!control.input[i].hasOwnProperty("slider")) { + control.input[i].slider = false; + } + } + } + + var js; + if (control.hasOwnProperty("javascript")) { + js = control.javascript; + + // if js is a function everything's fine already, but if it's a string we need to eval that first + if (!_.isFunction(js)) { + control.javascript = function (data) { + eval(js); + }; + } + } + + if (control.hasOwnProperty("enabled")) { + js = control.enabled; + + // if js is a function everything's fine already, but if it's a string we need to eval that first + if (!_.isFunction(js)) { + control.enabled = function (data) { + return eval(js); + } + } + } + + control.processed = true; + return control; + }; + + self.isCustomEnabled = function (data) { + if (data.hasOwnProperty("enabled")) { + return data.enabled(data); + } else { + return self.isOperational() && self.loginState.isUser(); + } + }; + + self.clickCustom = function (data) { + var callback; + if (data.hasOwnProperty("javascript")) { + callback = data.javascript; + } else { + callback = self.sendCustomCommand; + } + + if (data.confirm) { + showConfirmationDialog(data.confirm, function (e) { + callback(data); + }); + } else { + callback(data); + } + }; + + self.sendJogCommand = function (axis, multiplier, distance) { + if (typeof distance === "undefined") + distance = $('#jog_distance button.active').data('distance'); + if (self.settings.printerProfiles.currentProfileData() && self.settings.printerProfiles.currentProfileData()["axes"] && self.settings.printerProfiles.currentProfileData()["axes"][axis] && self.settings.printerProfiles.currentProfileData()["axes"][axis]["inverted"]()) { + multiplier *= -1; + } + + var data = { + "command": "jog" + }; + data[axis] = distance * multiplier; + + self.sendPrintHeadCommand(data); + }; + + self.sendHomeCommand = function (axis) { + self.sendPrintHeadCommand({ + "command": "home", + "axes": axis + }); + }; + + self.sendFeedRateCommand = function () { + self.sendPrintHeadCommand({ + "command": "feedrate", + "factor": self.feedRate() + }); + }; + + self.sendExtrudeCommand = function () { + self._sendECommand(1); + }; + + self.sendRetractCommand = function () { + self._sendECommand(-1); + }; + + self.sendFlowRateCommand = function () { + self.sendToolCommand({ + "command": "flowrate", + "factor": self.flowRate() + }); + }; + + self._sendECommand = function (dir) { + var length = self.extrusionAmount(); + if (!length) length = self.settings.printer_defaultExtrusionLength(); + + self.sendToolCommand({ + command: "extrude", + amount: length * dir + }); + }; + + self.sendSelectToolCommand = function (data) { + if (!data || !data.key()) return; + + self.sendToolCommand({ + command: "select", + tool: data.key() + }); + }; + + self.sendPrintHeadCommand = function (data) { + $.ajax({ + url: API_BASEURL + "printer/printhead", + type: "POST", + dataType: "json", + contentType: "application/json; charset=UTF-8", + data: JSON.stringify(data) + }); + }; + + self.sendToolCommand = function (data) { + $.ajax({ + url: API_BASEURL + "printer/tool", + type: "POST", + dataType: "json", + contentType: "application/json; charset=UTF-8", + data: JSON.stringify(data) + }); + }; + + self.sendCustomCommand = function (command) { + if (!command) + return; + + var data = undefined; + if (command.hasOwnProperty("command")) { + // single command + data = {"command": command.command}; + } else if (command.hasOwnProperty("commands")) { + // multi command + data = {"commands": command.commands}; + } else if (command.hasOwnProperty("script")) { + data = {"script": command.script}; + if (command.hasOwnProperty("context")) { + data["context"] = command.context; + } + } else { + return; + } + + if (command.hasOwnProperty("input")) { + // parametric command(s) + data["parameters"] = {}; + _.each(command.input, function(input) { + if (!input.hasOwnProperty("parameter") || !input.hasOwnProperty("value")) { + return; + } + + data["parameters"][input.parameter] = input.value(); + }); + } + + $.ajax({ + url: API_BASEURL + "printer/command", + type: "POST", + dataType: "json", + contentType: "application/json; charset=UTF-8", + data: JSON.stringify(data) + }) + }; + + self.displayMode = function (customControl) { + if (customControl.hasOwnProperty("children")) { + return (customControl.hasOwnProperty("name") && customControl.name != "") ? "customControls_containerTemplate_accordion" : "customControls_containerTemplate"; + } else { + return "customControls_controlTemplate"; + } + }; + + self.rowCss = function (customControl) { + var span = "span2"; + var offset = ""; + if (customControl.hasOwnProperty("width")) { + span = "span" + customControl.width; + } + if (customControl.hasOwnProperty("offset")) { + offset = "offset" + customControl.offset; + } + return span + " " + offset; + }; + + self.onStartup = function () { + self.requestData(); + }; + + self.onTabChange = function (current, previous) { + if (current == "#control") { + if (self.webcamDisableTimeout != undefined) { + clearTimeout(self.webcamDisableTimeout); + } + var webcamImage = $("#webcam_image"); + var currentSrc = webcamImage.attr("src"); + if (currentSrc === undefined || currentSrc.trim() == "") { + var newSrc = CONFIG_WEBCAM_STREAM; + if (CONFIG_WEBCAM_STREAM.lastIndexOf("?") > -1) { + newSrc += "&"; + } else { + newSrc += "?"; + } + newSrc += new Date().getTime(); + + webcamImage.attr("src", newSrc); + } + } else if (previous == "#control") { + // only disable webcam stream if tab is out of focus for more than 5s, otherwise we might cause + // more load by the constant connection creation than by the actual webcam stream + self.webcamDisableTimeout = setTimeout(function () { + $("#webcam_image").attr("src", ""); + }, 5000); + } + }; + + self.onAllBound = function (allViewModels) { + var additionalControls = []; + _.each(allViewModels, function (viewModel) { + if (viewModel.hasOwnProperty("getAdditionalControls")) { + additionalControls = additionalControls.concat(viewModel.getAdditionalControls()); + } + }); + if (additionalControls.length > 0) { + self.additionalControls = additionalControls; + self.rerenderControls(); + } + }; + + self.onFocus = function (data, event) { + if (!self.settings.feature_keyboardControl()) return; + self.keycontrolActive(true); + }; + + self.onMouseOver = function (data, event) { + if (!self.settings.feature_keyboardControl()) return; + $("#webcam_container").focus(); + self.keycontrolActive(true); + }; + + self.onMouseOut = function (data, event) { + if (!self.settings.feature_keyboardControl()) return; + $("#webcam_container").blur(); + self.keycontrolActive(false); + }; + + self.toggleKeycontrolHelp = function () { + self.keycontrolHelpActive(!self.keycontrolHelpActive()); + }; + + self.onKeyDown = function (data, event) { + if (!self.settings.feature_keyboardControl()) return; + + var button = undefined; + var visualizeClick = true; + + switch (event.which) { + case 37: // left arrow key + // X- + button = $("#control-xdec"); + break; + case 38: // up arrow key + // Y+ + button = $("#control-yinc"); + break; + case 39: // right arrow key + // X+ + button = $("#control-xinc"); + break; + case 40: // down arrow key + // Y- + button = $("#control-ydec"); + break; + case 49: // number 1 + case 97: // numpad 1 + // Distance 0.1 + button = $("#control-distance01"); + visualizeClick = false; + break; + case 50: // number 2 + case 98: // numpad 2 + // Distance 1 + button = $("#control-distance1"); + visualizeClick = false; + break; + case 51: // number 3 + case 99: // numpad 3 + // Distance 10 + button = $("#control-distance10"); + visualizeClick = false; + break; + case 52: // number 4 + case 100: // numpad 4 + // Distance 100 + button = $("#control-distance100"); + visualizeClick = false; + break; + case 33: // page up key + case 87: // w key + // z lift up + button = $("#control-zinc"); + break; + case 34: // page down key + case 83: // s key + // z lift down + button = $("#control-zdec"); + break; + case 36: // home key + // xy home + button = $("#control-xyhome"); + break; + case 35: // end key + // z home + button = $("#control-zhome"); + break; + default: + event.preventDefault(); + return false; + } + + if (button === undefined) { + return false; + } else { + event.preventDefault(); + if (visualizeClick) { + button.addClass("active"); + setTimeout(function () { + button.removeClass("active"); + }, 150); + } + button.click(); + } + }; + + } + + OCTOPRINT_VIEWMODELS.push([ + ControlViewModel, + ["loginStateViewModel", "settingsViewModel"], + "#control" + ]); +}); diff --git a/src/octoprint/static/js/app/viewmodels/settings.js b/src/octoprint/static/js/app/viewmodels/settings.js index 33025072..ef62f8f7 100644 --- a/src/octoprint/static/js/app/viewmodels/settings.js +++ b/src/octoprint/static/js/app/viewmodels/settings.js @@ -1,371 +1,371 @@ -$(function() { - function SettingsViewModel(parameters) { - var self = this; - - self.loginState = parameters[0]; - self.users = parameters[1]; - self.printerProfiles = parameters[2]; - - self.api_enabled = ko.observable(undefined); - self.api_key = ko.observable(undefined); - self.api_allowCrossOrigin = ko.observable(undefined); - - self.appearance_name = ko.observable(undefined); - self.appearance_color = ko.observable(undefined); - self.appearance_colorTransparent = ko.observable(); - self.appearance_defaultLanguage = ko.observable(); - - self.settingsDialog = undefined; - - self.appearance_available_colors = ko.observable([ - {key: "default", name: gettext("default")}, - {key: "red", name: gettext("red")}, - {key: "orange", name: gettext("orange")}, - {key: "yellow", name: gettext("yellow")}, - {key: "green", name: gettext("green")}, - {key: "blue", name: gettext("blue")}, - {key: "violet", name: gettext("violet")}, - {key: "black", name: gettext("black")}, - {key: "white", name: gettext("white")}, - ]); - - self.appearance_colorName = function(color) { - switch (color) { - case "red": - return gettext("red"); - case "orange": - return gettext("orange"); - case "yellow": - return gettext("yellow"); - case "green": - return gettext("green"); - case "blue": - return gettext("blue"); - case "violet": - return gettext("violet"); - case "black": - return gettext("black"); - case "white": - return gettext("white"); - case "default": - return gettext("default"); - default: - return color; - } - }; - - var auto_locale = {language: "_default", display: gettext("Autodetect from browser"), english: undefined}; - self.locales = ko.observableArray([auto_locale].concat(_.sortBy(_.values(AVAILABLE_LOCALES), function(n) { - return n.display; - }))); - self.locale_languages = _.keys(AVAILABLE_LOCALES); - - self.printer_defaultExtrusionLength = ko.observable(undefined); - - self.webcam_streamUrl = ko.observable(undefined); - self.webcam_snapshotUrl = ko.observable(undefined); - self.webcam_ffmpegPath = ko.observable(undefined); - self.webcam_bitrate = ko.observable(undefined); - self.webcam_ffmpegThreads = ko.observable(undefined); - self.webcam_watermark = ko.observable(undefined); - self.webcam_flipH = ko.observable(undefined); - self.webcam_flipV = ko.observable(undefined); - - self.feature_gcodeViewer = ko.observable(undefined); - self.feature_temperatureGraph = ko.observable(undefined); - self.feature_waitForStart = ko.observable(undefined); - self.feature_alwaysSendChecksum = ko.observable(undefined); - self.feature_sdSupport = ko.observable(undefined); - self.feature_sdAlwaysAvailable = ko.observable(undefined); - self.feature_swallowOkAfterResend = ko.observable(undefined); - self.feature_repetierTargetTemp = ko.observable(undefined); - self.feature_keyboardControl = ko.observable(undefined); - - self.serial_port = ko.observable(); - self.serial_baudrate = ko.observable(); - self.serial_portOptions = ko.observableArray([]); - self.serial_baudrateOptions = ko.observableArray([]); - self.serial_autoconnect = ko.observable(undefined); - self.serial_timeoutConnection = ko.observable(undefined); - self.serial_timeoutDetection = ko.observable(undefined); - self.serial_timeoutCommunication = ko.observable(undefined); - self.serial_timeoutTemperature = ko.observable(undefined); - self.serial_timeoutSdStatus = ko.observable(undefined); - self.serial_log = ko.observable(undefined); - self.serial_additionalPorts = ko.observable(undefined); - - self.folder_uploads = ko.observable(undefined); - self.folder_timelapse = ko.observable(undefined); - self.folder_timelapseTmp = ko.observable(undefined); - self.folder_logs = ko.observable(undefined); - self.folder_watched = ko.observable(undefined); - - self.scripts_gcode_beforePrintStarted = ko.observable(undefined); - self.scripts_gcode_afterPrintDone = ko.observable(undefined); - self.scripts_gcode_afterPrintCancelled = ko.observable(undefined); - self.scripts_gcode_afterPrintPaused = ko.observable(undefined); - self.scripts_gcode_beforePrintResumed = ko.observable(undefined); - self.scripts_gcode_afterPrinterConnected = ko.observable(undefined); - - self.temperature_profiles = ko.observableArray(undefined); - - self.temperature_profiles = ko.observableArray(undefined); - - self.system_actions = ko.observableArray([]); - - self.terminalFilters = ko.observableArray([]); - - self.settings = undefined; - - self.addTemperatureProfile = function() { - self.temperature_profiles.push({name: "New", extruder:0, bed:0}); - }; - - self.removeTemperatureProfile = function(profile) { - self.temperature_profiles.remove(profile); - }; - - self.addTerminalFilter = function() { - self.terminalFilters.push({name: "New", regex: "(Send: M105)|(Recv: ok T:)"}) - }; - - self.removeTerminalFilter = function(filter) { - self.terminalFilters.remove(filter); - }; - - self.onSettingsShown = function() { - self.requestData(); - }; - - self.onStartup = function() { - self.settingsDialog = $('#settings_dialog'); - }; - - self.onAllBound = function(allViewModels) { - self.settingsDialog.on('show', function() { - _.each(allViewModels, function(viewModel) { - if (viewModel.hasOwnProperty("onSettingsShown")) { - viewModel.onSettingsShown(); - } - }); - }); - self.settingsDialog.on('hidden', function() { - _.each(allViewModels, function(viewModel) { - if (viewModel.hasOwnProperty("onSettingsHidden")) { - viewModel.onSettingsHidden(); - } - }); - }); - self.settingsDialog.on('beforeSave', function () { - _.each(allViewModels, function (viewModel) { - if (viewModel.hasOwnProperty("onSettingsBeforeSave")) { - viewModel.onSettingsBeforeSave(); - } - }); - }); - }; - - self.show = function() { - // show settings, ensure centered position - self.settingsDialog.modal({ - minHeight: function() { return Math.max($.fn.modal.defaults.maxHeight() - 80, 250); } - }).css({ - width: 'auto', - 'margin-left': function() { return -($(this).width() /2); } - }); - - return false; - }; - - self.requestData = function(callback) { - $.ajax({ - url: API_BASEURL + "settings", - type: "GET", - dataType: "json", - success: function(response) { - self.fromResponse(response); - if (callback) callback(); - } - }); - }; - - self.fromResponse = function(response) { - if (self.settings === undefined) { - self.settings = ko.mapping.fromJS(response); - } else { - ko.mapping.fromJS(response, self.settings); - } - - self.api_enabled(response.api.enabled); - self.api_key(response.api.key); - self.api_allowCrossOrigin(response.api.allowCrossOrigin); - - self.appearance_name(response.appearance.name); - self.appearance_color(response.appearance.color); - self.appearance_colorTransparent(response.appearance.colorTransparent); - self.appearance_defaultLanguage("_default"); - if (_.includes(self.locale_languages, response.appearance.defaultLanguage)) { - self.appearance_defaultLanguage(response.appearance.defaultLanguage); - } - - self.printer_defaultExtrusionLength(response.printer.defaultExtrusionLength); - - self.webcam_streamUrl(response.webcam.streamUrl); - self.webcam_snapshotUrl(response.webcam.snapshotUrl); - self.webcam_ffmpegPath(response.webcam.ffmpegPath); - self.webcam_bitrate(response.webcam.bitrate); - self.webcam_ffmpegThreads(response.webcam.ffmpegThreads); - self.webcam_watermark(response.webcam.watermark); - self.webcam_flipH(response.webcam.flipH); - self.webcam_flipV(response.webcam.flipV); - - self.feature_gcodeViewer(response.feature.gcodeViewer); - self.feature_temperatureGraph(response.feature.temperatureGraph); - self.feature_waitForStart(response.feature.waitForStart); - self.feature_alwaysSendChecksum(response.feature.alwaysSendChecksum); - self.feature_sdSupport(response.feature.sdSupport); - self.feature_sdAlwaysAvailable(response.feature.sdAlwaysAvailable); - self.feature_swallowOkAfterResend(response.feature.swallowOkAfterResend); - self.feature_repetierTargetTemp(response.feature.repetierTargetTemp); - self.feature_keyboardControl(response.feature.keyboardControl); - - self.serial_port(response.serial.port); - self.serial_baudrate(response.serial.baudrate); - self.serial_portOptions(response.serial.portOptions); - self.serial_baudrateOptions(response.serial.baudrateOptions); - self.serial_autoconnect(response.serial.autoconnect); - self.serial_timeoutConnection(response.serial.timeoutConnection); - self.serial_timeoutDetection(response.serial.timeoutDetection); - self.serial_timeoutCommunication(response.serial.timeoutCommunication); - self.serial_timeoutTemperature(response.serial.timeoutTemperature); - self.serial_timeoutSdStatus(response.serial.timeoutSdStatus); - self.serial_log(response.serial.log); - self.serial_additionalPorts(response.serial.additionalPorts.join("\n")); - - self.folder_uploads(response.folder.uploads); - self.folder_timelapse(response.folder.timelapse); - self.folder_timelapseTmp(response.folder.timelapseTmp); - self.folder_logs(response.folder.logs); - self.folder_watched(response.folder.watched); - - self.temperature_profiles(response.temperature.profiles); - - self.scripts_gcode_beforePrintStarted(response.scripts.gcode.beforePrintStarted); - self.scripts_gcode_afterPrintDone(response.scripts.gcode.afterPrintDone); - self.scripts_gcode_afterPrintCancelled(response.scripts.gcode.afterPrintCancelled); - self.scripts_gcode_afterPrintPaused(response.scripts.gcode.afterPrintPaused); - self.scripts_gcode_beforePrintResumed(response.scripts.gcode.beforePrintResumed); - self.scripts_gcode_afterPrinterConnected(response.scripts.gcode.afterPrinterConnected); - - self.temperature_profiles(response.temperature.profiles); - - self.system_actions(response.system.actions); - - self.terminalFilters(response.terminalFilters); - }; - - self.saveData = function () { - self.settingsDialog.trigger("beforeSave"); - - var data = ko.mapping.toJS(self.settings); - - data = _.extend(data, { - "api" : { - "enabled": self.api_enabled(), - "key": self.api_key(), - "allowCrossOrigin": self.api_allowCrossOrigin() - }, - "appearance" : { - "name": self.appearance_name(), - "color": self.appearance_color(), - "colorTransparent": self.appearance_colorTransparent(), - "defaultLanguage": self.appearance_defaultLanguage() - }, - "printer": { - "defaultExtrusionLength": self.printer_defaultExtrusionLength() - }, - "webcam": { - "streamUrl": self.webcam_streamUrl(), - "snapshotUrl": self.webcam_snapshotUrl(), - "ffmpegPath": self.webcam_ffmpegPath(), - "bitrate": self.webcam_bitrate(), - "ffmpegThreads": self.webcam_ffmpegThreads(), - "watermark": self.webcam_watermark(), - "flipH": self.webcam_flipH(), - "flipV": self.webcam_flipV() - }, - "feature": { - "gcodeViewer": self.feature_gcodeViewer(), - "temperatureGraph": self.feature_temperatureGraph(), - "waitForStart": self.feature_waitForStart(), - "alwaysSendChecksum": self.feature_alwaysSendChecksum(), - "sdSupport": self.feature_sdSupport(), - "sdAlwaysAvailable": self.feature_sdAlwaysAvailable(), - "swallowOkAfterResend": self.feature_swallowOkAfterResend(), - "repetierTargetTemp": self.feature_repetierTargetTemp(), - "keyboardControl": self.feature_keyboardControl() - }, - "serial": { - "port": self.serial_port(), - "baudrate": self.serial_baudrate(), - "autoconnect": self.serial_autoconnect(), - "timeoutConnection": self.serial_timeoutConnection(), - "timeoutDetection": self.serial_timeoutDetection(), - "timeoutCommunication": self.serial_timeoutCommunication(), - "timeoutTemperature": self.serial_timeoutTemperature(), - "timeoutSdStatus": self.serial_timeoutSdStatus(), - "log": self.serial_log(), - "additionalPorts": _.filter( - _.map( - self.serial_additionalPorts().split("\n"), - function(item) { return (item) ? item.trim() : ""; } - ), - function(item) { return item && !_.startsWith(item, "#"); } - ) - }, - "folder": { - "uploads": self.folder_uploads(), - "timelapse": self.folder_timelapse(), - "timelapseTmp": self.folder_timelapseTmp(), - "logs": self.folder_logs(), - "watched": self.folder_watched() - }, - "temperature": { - "profiles": self.temperature_profiles() - }, - "system": { - "actions": self.system_actions() - }, - "terminalFilters": self.terminalFilters(), - "scripts": { - "gcode": { - "beforePrintStarted": self.scripts_gcode_beforePrintStarted(), - "afterPrintDone": self.scripts_gcode_afterPrintDone(), - "afterPrintCancelled": self.scripts_gcode_afterPrintCancelled(), - "afterPrintPaused": self.scripts_gcode_afterPrintPaused(), - "beforePrintResumed": self.scripts_gcode_beforePrintResumed(), - "afterPrinterConnected": self.scripts_gcode_afterPrinterConnected() - } - } - }); - - $.ajax({ - url: API_BASEURL + "settings", - type: "POST", - dataType: "json", - contentType: "application/json; charset=UTF-8", - data: JSON.stringify(data), - success: function(response) { - self.fromResponse(response); - self.settingsDialog.modal("hide"); - } - }); - }; - } - - OCTOPRINT_VIEWMODELS.push([ - SettingsViewModel, - ["loginStateViewModel", "usersViewModel", "printerProfilesViewModel"], - ["#settings_dialog", "#navbar_settings"] - ]); -}); +$(function() { + function SettingsViewModel(parameters) { + var self = this; + + self.loginState = parameters[0]; + self.users = parameters[1]; + self.printerProfiles = parameters[2]; + + self.api_enabled = ko.observable(undefined); + self.api_key = ko.observable(undefined); + self.api_allowCrossOrigin = ko.observable(undefined); + + self.appearance_name = ko.observable(undefined); + self.appearance_color = ko.observable(undefined); + self.appearance_colorTransparent = ko.observable(); + self.appearance_defaultLanguage = ko.observable(); + + self.settingsDialog = undefined; + + self.appearance_available_colors = ko.observable([ + {key: "default", name: gettext("default")}, + {key: "red", name: gettext("red")}, + {key: "orange", name: gettext("orange")}, + {key: "yellow", name: gettext("yellow")}, + {key: "green", name: gettext("green")}, + {key: "blue", name: gettext("blue")}, + {key: "violet", name: gettext("violet")}, + {key: "black", name: gettext("black")}, + {key: "white", name: gettext("white")}, + ]); + + self.appearance_colorName = function(color) { + switch (color) { + case "red": + return gettext("red"); + case "orange": + return gettext("orange"); + case "yellow": + return gettext("yellow"); + case "green": + return gettext("green"); + case "blue": + return gettext("blue"); + case "violet": + return gettext("violet"); + case "black": + return gettext("black"); + case "white": + return gettext("white"); + case "default": + return gettext("default"); + default: + return color; + } + }; + + var auto_locale = {language: "_default", display: gettext("Autodetect from browser"), english: undefined}; + self.locales = ko.observableArray([auto_locale].concat(_.sortBy(_.values(AVAILABLE_LOCALES), function(n) { + return n.display; + }))); + self.locale_languages = _.keys(AVAILABLE_LOCALES); + + self.printer_defaultExtrusionLength = ko.observable(undefined); + + self.webcam_streamUrl = ko.observable(undefined); + self.webcam_snapshotUrl = ko.observable(undefined); + self.webcam_ffmpegPath = ko.observable(undefined); + self.webcam_bitrate = ko.observable(undefined); + self.webcam_ffmpegThreads = ko.observable(undefined); + self.webcam_watermark = ko.observable(undefined); + self.webcam_flipH = ko.observable(undefined); + self.webcam_flipV = ko.observable(undefined); + + self.feature_gcodeViewer = ko.observable(undefined); + self.feature_temperatureGraph = ko.observable(undefined); + self.feature_waitForStart = ko.observable(undefined); + self.feature_alwaysSendChecksum = ko.observable(undefined); + self.feature_sdSupport = ko.observable(undefined); + self.feature_sdAlwaysAvailable = ko.observable(undefined); + self.feature_swallowOkAfterResend = ko.observable(undefined); + self.feature_repetierTargetTemp = ko.observable(undefined); + self.feature_keyboardControl = ko.observable(undefined); + + self.serial_port = ko.observable(); + self.serial_baudrate = ko.observable(); + self.serial_portOptions = ko.observableArray([]); + self.serial_baudrateOptions = ko.observableArray([]); + self.serial_autoconnect = ko.observable(undefined); + self.serial_timeoutConnection = ko.observable(undefined); + self.serial_timeoutDetection = ko.observable(undefined); + self.serial_timeoutCommunication = ko.observable(undefined); + self.serial_timeoutTemperature = ko.observable(undefined); + self.serial_timeoutSdStatus = ko.observable(undefined); + self.serial_log = ko.observable(undefined); + self.serial_additionalPorts = ko.observable(undefined); + + self.folder_uploads = ko.observable(undefined); + self.folder_timelapse = ko.observable(undefined); + self.folder_timelapseTmp = ko.observable(undefined); + self.folder_logs = ko.observable(undefined); + self.folder_watched = ko.observable(undefined); + + self.scripts_gcode_beforePrintStarted = ko.observable(undefined); + self.scripts_gcode_afterPrintDone = ko.observable(undefined); + self.scripts_gcode_afterPrintCancelled = ko.observable(undefined); + self.scripts_gcode_afterPrintPaused = ko.observable(undefined); + self.scripts_gcode_beforePrintResumed = ko.observable(undefined); + self.scripts_gcode_afterPrinterConnected = ko.observable(undefined); + + self.temperature_profiles = ko.observableArray(undefined); + + self.temperature_profiles = ko.observableArray(undefined); + + self.system_actions = ko.observableArray([]); + + self.terminalFilters = ko.observableArray([]); + + self.settings = undefined; + + self.addTemperatureProfile = function() { + self.temperature_profiles.push({name: "New", extruder:0, bed:0}); + }; + + self.removeTemperatureProfile = function(profile) { + self.temperature_profiles.remove(profile); + }; + + self.addTerminalFilter = function() { + self.terminalFilters.push({name: "New", regex: "(Send: M105)|(Recv: ok T:)"}) + }; + + self.removeTerminalFilter = function(filter) { + self.terminalFilters.remove(filter); + }; + + self.onSettingsShown = function() { + self.requestData(); + }; + + self.onStartup = function() { + self.settingsDialog = $('#settings_dialog'); + }; + + self.onAllBound = function(allViewModels) { + self.settingsDialog.on('show', function() { + _.each(allViewModels, function(viewModel) { + if (viewModel.hasOwnProperty("onSettingsShown")) { + viewModel.onSettingsShown(); + } + }); + }); + self.settingsDialog.on('hidden', function() { + _.each(allViewModels, function(viewModel) { + if (viewModel.hasOwnProperty("onSettingsHidden")) { + viewModel.onSettingsHidden(); + } + }); + }); + self.settingsDialog.on('beforeSave', function () { + _.each(allViewModels, function (viewModel) { + if (viewModel.hasOwnProperty("onSettingsBeforeSave")) { + viewModel.onSettingsBeforeSave(); + } + }); + }); + }; + + self.show = function() { + // show settings, ensure centered position + self.settingsDialog.modal({ + minHeight: function() { return Math.max($.fn.modal.defaults.maxHeight() - 80, 250); } + }).css({ + width: 'auto', + 'margin-left': function() { return -($(this).width() /2); } + }); + + return false; + }; + + self.requestData = function(callback) { + $.ajax({ + url: API_BASEURL + "settings", + type: "GET", + dataType: "json", + success: function(response) { + self.fromResponse(response); + if (callback) callback(); + } + }); + }; + + self.fromResponse = function(response) { + if (self.settings === undefined) { + self.settings = ko.mapping.fromJS(response); + } else { + ko.mapping.fromJS(response, self.settings); + } + + self.api_enabled(response.api.enabled); + self.api_key(response.api.key); + self.api_allowCrossOrigin(response.api.allowCrossOrigin); + + self.appearance_name(response.appearance.name); + self.appearance_color(response.appearance.color); + self.appearance_colorTransparent(response.appearance.colorTransparent); + self.appearance_defaultLanguage("_default"); + if (_.includes(self.locale_languages, response.appearance.defaultLanguage)) { + self.appearance_defaultLanguage(response.appearance.defaultLanguage); + } + + self.printer_defaultExtrusionLength(response.printer.defaultExtrusionLength); + + self.webcam_streamUrl(response.webcam.streamUrl); + self.webcam_snapshotUrl(response.webcam.snapshotUrl); + self.webcam_ffmpegPath(response.webcam.ffmpegPath); + self.webcam_bitrate(response.webcam.bitrate); + self.webcam_ffmpegThreads(response.webcam.ffmpegThreads); + self.webcam_watermark(response.webcam.watermark); + self.webcam_flipH(response.webcam.flipH); + self.webcam_flipV(response.webcam.flipV); + + self.feature_gcodeViewer(response.feature.gcodeViewer); + self.feature_temperatureGraph(response.feature.temperatureGraph); + self.feature_waitForStart(response.feature.waitForStart); + self.feature_alwaysSendChecksum(response.feature.alwaysSendChecksum); + self.feature_sdSupport(response.feature.sdSupport); + self.feature_sdAlwaysAvailable(response.feature.sdAlwaysAvailable); + self.feature_swallowOkAfterResend(response.feature.swallowOkAfterResend); + self.feature_repetierTargetTemp(response.feature.repetierTargetTemp); + self.feature_keyboardControl(response.feature.keyboardControl); + + self.serial_port(response.serial.port); + self.serial_baudrate(response.serial.baudrate); + self.serial_portOptions(response.serial.portOptions); + self.serial_baudrateOptions(response.serial.baudrateOptions); + self.serial_autoconnect(response.serial.autoconnect); + self.serial_timeoutConnection(response.serial.timeoutConnection); + self.serial_timeoutDetection(response.serial.timeoutDetection); + self.serial_timeoutCommunication(response.serial.timeoutCommunication); + self.serial_timeoutTemperature(response.serial.timeoutTemperature); + self.serial_timeoutSdStatus(response.serial.timeoutSdStatus); + self.serial_log(response.serial.log); + self.serial_additionalPorts(response.serial.additionalPorts.join("\n")); + + self.folder_uploads(response.folder.uploads); + self.folder_timelapse(response.folder.timelapse); + self.folder_timelapseTmp(response.folder.timelapseTmp); + self.folder_logs(response.folder.logs); + self.folder_watched(response.folder.watched); + + self.temperature_profiles(response.temperature.profiles); + + self.scripts_gcode_beforePrintStarted(response.scripts.gcode.beforePrintStarted); + self.scripts_gcode_afterPrintDone(response.scripts.gcode.afterPrintDone); + self.scripts_gcode_afterPrintCancelled(response.scripts.gcode.afterPrintCancelled); + self.scripts_gcode_afterPrintPaused(response.scripts.gcode.afterPrintPaused); + self.scripts_gcode_beforePrintResumed(response.scripts.gcode.beforePrintResumed); + self.scripts_gcode_afterPrinterConnected(response.scripts.gcode.afterPrinterConnected); + + self.temperature_profiles(response.temperature.profiles); + + self.system_actions(response.system.actions); + + self.terminalFilters(response.terminalFilters); + }; + + self.saveData = function () { + self.settingsDialog.trigger("beforeSave"); + + var data = ko.mapping.toJS(self.settings); + + data = _.extend(data, { + "api" : { + "enabled": self.api_enabled(), + "key": self.api_key(), + "allowCrossOrigin": self.api_allowCrossOrigin() + }, + "appearance" : { + "name": self.appearance_name(), + "color": self.appearance_color(), + "colorTransparent": self.appearance_colorTransparent(), + "defaultLanguage": self.appearance_defaultLanguage() + }, + "printer": { + "defaultExtrusionLength": self.printer_defaultExtrusionLength() + }, + "webcam": { + "streamUrl": self.webcam_streamUrl(), + "snapshotUrl": self.webcam_snapshotUrl(), + "ffmpegPath": self.webcam_ffmpegPath(), + "bitrate": self.webcam_bitrate(), + "ffmpegThreads": self.webcam_ffmpegThreads(), + "watermark": self.webcam_watermark(), + "flipH": self.webcam_flipH(), + "flipV": self.webcam_flipV() + }, + "feature": { + "gcodeViewer": self.feature_gcodeViewer(), + "temperatureGraph": self.feature_temperatureGraph(), + "waitForStart": self.feature_waitForStart(), + "alwaysSendChecksum": self.feature_alwaysSendChecksum(), + "sdSupport": self.feature_sdSupport(), + "sdAlwaysAvailable": self.feature_sdAlwaysAvailable(), + "swallowOkAfterResend": self.feature_swallowOkAfterResend(), + "repetierTargetTemp": self.feature_repetierTargetTemp(), + "keyboardControl": self.feature_keyboardControl() + }, + "serial": { + "port": self.serial_port(), + "baudrate": self.serial_baudrate(), + "autoconnect": self.serial_autoconnect(), + "timeoutConnection": self.serial_timeoutConnection(), + "timeoutDetection": self.serial_timeoutDetection(), + "timeoutCommunication": self.serial_timeoutCommunication(), + "timeoutTemperature": self.serial_timeoutTemperature(), + "timeoutSdStatus": self.serial_timeoutSdStatus(), + "log": self.serial_log(), + "additionalPorts": _.filter( + _.map( + self.serial_additionalPorts().split("\n"), + function(item) { return (item) ? item.trim() : ""; } + ), + function(item) { return item && !_.startsWith(item, "#"); } + ) + }, + "folder": { + "uploads": self.folder_uploads(), + "timelapse": self.folder_timelapse(), + "timelapseTmp": self.folder_timelapseTmp(), + "logs": self.folder_logs(), + "watched": self.folder_watched() + }, + "temperature": { + "profiles": self.temperature_profiles() + }, + "system": { + "actions": self.system_actions() + }, + "terminalFilters": self.terminalFilters(), + "scripts": { + "gcode": { + "beforePrintStarted": self.scripts_gcode_beforePrintStarted(), + "afterPrintDone": self.scripts_gcode_afterPrintDone(), + "afterPrintCancelled": self.scripts_gcode_afterPrintCancelled(), + "afterPrintPaused": self.scripts_gcode_afterPrintPaused(), + "beforePrintResumed": self.scripts_gcode_beforePrintResumed(), + "afterPrinterConnected": self.scripts_gcode_afterPrinterConnected() + } + } + }); + + $.ajax({ + url: API_BASEURL + "settings", + type: "POST", + dataType: "json", + contentType: "application/json; charset=UTF-8", + data: JSON.stringify(data), + success: function(response) { + self.fromResponse(response); + self.settingsDialog.modal("hide"); + } + }); + }; + } + + OCTOPRINT_VIEWMODELS.push([ + SettingsViewModel, + ["loginStateViewModel", "usersViewModel", "printerProfilesViewModel"], + ["#settings_dialog", "#navbar_settings"] + ]); +});