diff --git a/.gitignore b/.gitignore index c75412598..3dedcdd1e 100644 --- a/.gitignore +++ b/.gitignore @@ -74,3 +74,8 @@ spec/addons # RVM/rbenv ruby version for local development .ruby-version + +#ignore marvinJs + +public/marvinjs +public/marvin4js-license.cxl diff --git a/app/assets/javascripts/application.js.erb b/app/assets/javascripts/application.js.erb index 744de9698..2c06bead4 100644 --- a/app/assets/javascripts/application.js.erb +++ b/app/assets/javascripts/application.js.erb @@ -41,6 +41,7 @@ //= require select2_customization //= require shared/inline_editing //= require turbolinks +//= require marvinjslauncher // Initialize links for submitting forms. This is useful for submitting diff --git a/app/assets/javascripts/my_modules/protocols.js.erb b/app/assets/javascripts/my_modules/protocols.js.erb index 6c39ea11a..1f4e7e591 100644 --- a/app/assets/javascripts/my_modules/protocols.js.erb +++ b/app/assets/javascripts/my_modules/protocols.js.erb @@ -18,6 +18,7 @@ function init() { initRefreshStatusBar(); initImport(); setupAssetsLoading(); + MarvinJsEditor().initNewButton('.new-marvinjs-upload-button'); } function initEditMyModuleDescription() { diff --git a/app/assets/javascripts/sitewide/marvinjs_editor.js b/app/assets/javascripts/sitewide/marvinjs_editor.js index 9a5a203b6..dcd03bd1b 100644 --- a/app/assets/javascripts/sitewide/marvinjs_editor.js +++ b/app/assets/javascripts/sitewide/marvinjs_editor.js @@ -4,14 +4,51 @@ var MarvinJsEditor = (function() { var marvinJsContainer = $('#marvinjs-editor'); var marvinJsObject = $('#marvinjs-sketch'); + var loadEditor = () => { + return MarvinJSUtil.getEditor('#marvinjs-sketch') + } + return Object.freeze({ - open: function() { + open: function(config) { + MarvinJsEditor().reset() $(marvinJsModal).modal('show'); $(marvinJsObject) .css('width', marvinJsContainer.width() + 'px') .css('height', marvinJsContainer.height() + 'px') + marvinJsContainer[0].dataset.objectId = config.objectId; + marvinJsContainer[0].dataset.objectType = config.objectType; + marvinJsContainer[0].dataset.mode = config.mode; + marvinJsModal.find('.file-save-link').off('click').on('click', () => { + MarvinJsEditor().save() + }) + + }, + + initNewButton: function(selector) { + $(selector).off('click').on('click', function(){ + var objectId = this.dataset.objectId; + var objectType = this.dataset.objectType; + MarvinJsEditor().open({ + mode: 'new', + objectId: objectId, + objectType: objectType + }) + }) + }, + + save: function(){ + loadEditor().then(function(sketcherInstance) { + sketcherInstance.exportStructure("mrv").then(function(source) { + console.log(source); + }); + }) + }, + + reset: function(){ + marvinJsContainer[0].dataset.objectId = ''; + marvinJsContainer[0].dataset.objectType = ''; + marvinJsContainer[0].dataset.mode = ''; } }); }); -MarvinJsEditor(); diff --git a/app/views/assets/marvinjs/_create_marvin_sketch_button.html.erb b/app/views/assets/marvinjs/_create_marvin_sketch_button.html.erb index f630c4883..a1d409ad7 100644 --- a/app/views/assets/marvinjs/_create_marvin_sketch_button.html.erb +++ b/app/views/assets/marvinjs/_create_marvin_sketch_button.html.erb @@ -1,4 +1,8 @@ - + New chemical drawing \ No newline at end of file diff --git a/app/views/shared/_marvinjs_modal.html.erb b/app/views/shared/_marvinjs_modal.html.erb index bb3bf2234..62146a53c 100644 --- a/app/views/shared/_marvinjs_modal.html.erb +++ b/app/views/shared/_marvinjs_modal.html.erb @@ -10,13 +10,11 @@ diff --git a/app/views/steps/attachments/_list.html.erb b/app/views/steps/attachments/_list.html.erb index 440408163..0aa27ae70 100644 --- a/app/views/steps/attachments/_list.html.erb +++ b/app/views/steps/attachments/_list.html.erb @@ -8,7 +8,7 @@
-
+
<%= render partial: '/assets/marvinjs/create_marvin_sketch_button.html.erb', locals: { element_id: step.id, element_type: 'Step' } %> diff --git a/vendor/assets/javascripts/marvinjslauncher.js b/vendor/assets/javascripts/marvinjslauncher.js new file mode 100644 index 000000000..31338b12e --- /dev/null +++ b/vendor/assets/javascripts/marvinjslauncher.js @@ -0,0 +1,120 @@ +(function (win) { + + function _getWrapperElement (id) { + var re = new RegExp(/^#.*/); + if (typeof id !== "string") { + return null; + } + // remove hash mark if present + return document.getElementById( (re.test(id)) ? id.substr(1) : id ); + } + + function _getPackage (wrapperElement) { + if (typeof wrapperElement.contentWindow.marvin != "undefined") { + return wrapperElement.contentWindow.marvin; + } + return null; + } + + function _createPackage(elementId, resolve, reject) { + if(elementId == null){ + reject("Element id can not be null."); + return; + } + + var wrapperElement = _getWrapperElement(elementId); + + if (wrapperElement == null) { + reject("Unable to get element with id: " + elementId); + return; + } + + var marvinPackage = _getPackage(wrapperElement); + if (marvinPackage) { + marvinPackage.onReady(function() { + resolve(marvinPackage); + }); + } else { // use listener + wrapperElement.addEventListener("load", function handleSketchLoad (e) { + var marvin = _getPackage(wrapperElement); + if (marvin) { + marvin.onReady(function() { + resolve(marvin); + }); + } else { + reject("Unable to find marvin package"); + } + + }); + } + } + + function _createEditor(elementId, resolve, reject) { + if(elementId == null){ + reject("Element id can not be null."); + return; + } + + var wrapperElement = _getWrapperElement(elementId); + + if (wrapperElement == null) { + reject("Unable to get element with id: " + elementId); + return; + } + + var marvinPackage = _getPackage(wrapperElement); + if (marvinPackage) { + marvinPackage.onReady(function() { + if (typeof marvinPackage.sketcherInstance != "undefined") { + resolve(_getPackage(wrapperElement).sketcherInstance); + return; + } else { + reject("Unable to find sketcherInstance in element with id: " + elementId); + return; + } + }); + } else { // use listener + wrapperElement.addEventListener("load", function handleSketchLoad (e) { + var marvin = _getPackage(wrapperElement); + if (marvin) { + marvin.onReady(function() { + if (typeof marvin.sketcherInstance != 'undefined') { + resolve(marvin.sketcherInstance); + } else { + reject("Unable to find sketcherInstance in iframe with id: " + elementId); + } + }); + } else { + reject("Unable to find marvin package, cannot retrieve sketcher instance"); + } + + }); + } + } + + if (!("Promise" in win) && ("ES6Promise" in win) && ("polyfill" in win.ES6Promise)) { + win.ES6Promise.polyfill(); + } + + win.MarvinJSUtil = { + "getEditor": function getEditor (elementId) { + + function createEditor (resolve, reject) { + _createEditor(elementId, resolve, reject); + }; + + return new Promise(createEditor); + } + ,"getPackage": function getPackage (elementId) { + + function createPackage (resolve, reject) { + _createPackage(elementId, resolve, reject); + }; + + return new Promise(createPackage); + } + };; + + +}(window)); + \ No newline at end of file