From 1a96480aa7771da3b4e301b972ed5462d0265789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Mon, 9 Mar 2015 13:11:43 +0100 Subject: [PATCH] Allow to define additional bindings for existing view models Adding a line such as OCTOPRINT_ADDITIONAL_BINDINGS.push(["gcodeFilesViewModel", "#tab_plugin_my_other_file_plugin"]); to a plugin JS now allows the plugin to configure existing view models to bind to additional elements, not just the ones configured by the view model itself. This allows binding view models of standard components to other component types and thus "moving" components, e.g. the files dialog from the sidebar to the tab section. --- src/octoprint/static/js/app/main.js | 28 +++++++++++++++++++++-- src/octoprint/templates/initscript.jinja2 | 1 + 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/octoprint/static/js/app/main.js b/src/octoprint/static/js/app/main.js index f1c79de6..ed33b1c9 100644 --- a/src/octoprint/static/js/app/main.js +++ b/src/octoprint/static/js/app/main.js @@ -88,6 +88,22 @@ $(function() { return new viewModelClass(constructorParameters); }; + // map any additional view model bindings we might need to make + var additionalBindings = {}; + _.each(OCTOPRINT_ADDITIONAL_BINDINGS, function(bindings) { + var viewModelId = bindings[0]; + var viewModelBindTargets = bindings[1]; + if (!_.isArray(viewModelBindTargets)) { + viewModelBindTargets = [viewModelBindTargets]; + } + + if (!additionalBindings.hasOwnProperty(viewModelId)) { + additionalBindings[viewModelId] = viewModelBindTargets; + } else { + additionalBindings[viewModelId] = additionalBindings[viewModelId].concat(viewModelBindTargets); + } + }); + // helper for translating the name of a view model class into an identifier for the view model map var _getViewModelId = function(viewModel){ var name = viewModel[0].name; @@ -129,8 +145,16 @@ $(function() { } // we could resolve the depdendencies and the view model is not defined yet => add it, it's now fully processed - var viewModelBindTarget = viewModel[2]; - allViewModelData.push([viewModelInstance, viewModelBindTarget]); + var viewModelBindTargets = viewModel[2]; + if (!_.isArray(viewModelBindTargets)) { + viewModelBindTargets = [viewModelBindTargets]; + } + + if (additionalBindings.hasOwnProperty(viewModelId)) { + viewModelBindTargets = viewModelBindTargets.concat(additionalBindings[viewModelId]); + } + + allViewModelData.push([viewModelInstance, viewModelBindTargets]); allViewModels.push(viewModelInstance); viewModelMap[viewModelId] = viewModelInstance; } diff --git a/src/octoprint/templates/initscript.jinja2 b/src/octoprint/templates/initscript.jinja2 index 81a393a5..3fb3c0a9 100644 --- a/src/octoprint/templates/initscript.jinja2 +++ b/src/octoprint/templates/initscript.jinja2 @@ -28,4 +28,5 @@ var OCTOPRINT_VIEWMODELS = []; var ADDITIONAL_VIEWMODELS = []; + var OCTOPRINT_ADDITIONAL_BINDINGS = [];