diff --git a/Packages/lesiontracker/client/components/serverInformationModal/serverInformationDicomWeb.html b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationDicomWeb.html new file mode 100644 index 000000000..75d7d897a --- /dev/null +++ b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationDicomWeb.html @@ -0,0 +1,74 @@ + + + {{>serverInformationDicomWebField name="wadoUriRoot" label="WADO URI root"}} + {{>serverInformationDicomWebField name="wadoUriRootNOTE" label="WADO URI root note"}} + {{>serverInformationDicomWebField name="wadoRoot" label="WADO root"}} + + + + Image rendering + + Select + WADO URI + ORTHANC + + + + + {{>serverInformationDicomWebField name="qidoRoot" label="QIDO root"}} + + QIDO options + + + + + + QIDO supports including fields + + + + + + + + Request options + + {{>serverInformationDicomWebField name="requestOptions.auth" label="Authentication"}} + + Logging options + + + + + + Requests + + + + + + Responses + + + + + + Timing + + + + + + + + + + + + + {{this.label}} + + + + + diff --git a/Packages/lesiontracker/client/components/serverInformationModal/serverInformationDicomWeb.js b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationDicomWeb.js new file mode 100644 index 000000000..d067f8f0f --- /dev/null +++ b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationDicomWeb.js @@ -0,0 +1,10 @@ +Template.serverInformationDicomWeb.onRendered(function() { + var instance = Template.instance(); + instance.autorun(function() { + var mode = instance.data.mode.get(); + if (mode === 'edit') { + var data = instance.data.currentItem.get(); + FormUtils.setFormData(instance.data.$form, data); + } + }); +}); diff --git a/Packages/lesiontracker/client/components/serverInformationModal/serverInformationForm.html b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationForm.html index 44ebdb5c3..457d1d923 100644 --- a/Packages/lesiontracker/client/components/serverInformationModal/serverInformationForm.html +++ b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationForm.html @@ -1,26 +1,39 @@ - - - - Server Name - + + + + + + + Server Name + + + + + + + + Server Type + + Select + DICOM Web + DIMSE + + + - - - Server Type - - Select - DICOM Web - DIMSE - + + {{#if equals serverType.get "dicomWeb"}} + {{>serverInformationDicomWeb this}} + {{/if}} + {{#if equals serverType.get "dimse"}} + TODO: Print DIMSE form + {{/if}} + {{#if serverType.get}} + + - - - {{#if equals serverType.get "dicomWeb"}} - TODO: Print DICOM Web form - {{/if}} - {{#if equals serverType.get "dimse"}} - TODO: Print DIMSE form - {{/if}} + {{/if}} + diff --git a/Packages/lesiontracker/client/components/serverInformationModal/serverInformationForm.js b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationForm.js index 44bb3945a..b72789ff5 100644 --- a/Packages/lesiontracker/client/components/serverInformationModal/serverInformationForm.js +++ b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationForm.js @@ -1,7 +1,31 @@ +Template.serverInformationForm.onRendered(function() { + var instance = Template.instance(); + + instance.data.$form = instance.$('form'); + instance.autorun(function() { + var mode = instance.data.mode.get(); + if (mode === 'edit') { + var data = instance.data.currentItem.get(); + FormUtils.setFormData(instance.data.$form, data); + } + }); +}); + Template.serverInformationForm.events({ 'change .js-server-type': function(event, instance) { - console.debug(instance); var value = $(event.currentTarget).val(); instance.data.serverType.set(value); + }, + submit: function(event, instance) { + event.preventDefault(); + var formData = FormUtils.getFormData(instance.data.$form); + Meteor.call('saveServer', formData, function(error) { + if (error) { + // TODO: check for errors: not-authorized, data-write + console.log('>>>>ERROR', error); + } + + instance.data.mode.set('list'); + }); } }); diff --git a/Packages/lesiontracker/client/components/serverInformationModal/serverInformationList.html b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationList.html index a52f62309..df8413b47 100644 --- a/Packages/lesiontracker/client/components/serverInformationModal/serverInformationList.html +++ b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationList.html @@ -8,10 +8,10 @@ - {{#each server in servers}} + {{#each servers}} - {{server.name}} - {{server.type}} + {{this.name}} + {{this.type}} diff --git a/Packages/lesiontracker/client/components/serverInformationModal/serverInformationList.js b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationList.js index aaef9f455..deaf109d8 100644 --- a/Packages/lesiontracker/client/components/serverInformationModal/serverInformationList.js +++ b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationList.js @@ -28,6 +28,7 @@ Template.serverInformationList.events({ instance.data.mode.set('create'); }, 'click .editServer': function(event, instance) { + instance.data.currentItem.set(this); instance.data.mode.set('edit'); } }); diff --git a/Packages/lesiontracker/client/components/serverInformationModal/serverInformationModal.js b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationModal.js index 716e8b58f..5dc47dc17 100644 --- a/Packages/lesiontracker/client/components/serverInformationModal/serverInformationModal.js +++ b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationModal.js @@ -2,14 +2,16 @@ Template.serverInformationModal.onCreated(function() { var instance = Template.instance(); instance.container = { mode: new ReactiveVar('list'), - serverType: new ReactiveVar(null) + serverType: new ReactiveVar(null), + currentItem: new ReactiveVar(null), + $form: null }; }); Template.serverInformationModal.events({ - 'click .js-back' (event, instance) { - var container = instance.container; - container.mode.set('list'); - container.serverType.set(null); - } + 'click .js-back': function(event, instance) { + var container = instance.container; + container.mode.set('list'); + container.serverType.set(null); + } }); diff --git a/Packages/lesiontracker/client/components/serverInformationModal/serverInformationModal.styl b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationModal.styl new file mode 100644 index 000000000..a23a4a1ae --- /dev/null +++ b/Packages/lesiontracker/client/components/serverInformationModal/serverInformationModal.styl @@ -0,0 +1,5 @@ +.server-information-form + label.wrapper + display: block + .checkbox + margin: 0 8px 0 0 diff --git a/Packages/lesiontracker/client/utils/form.js b/Packages/lesiontracker/client/utils/form.js new file mode 100644 index 000000000..959c6a059 --- /dev/null +++ b/Packages/lesiontracker/client/utils/form.js @@ -0,0 +1,101 @@ +class Form { + + // Identify the element's type and get its value + static getElementValue($element) { + var type = $element.attr('type'); + var value; + switch (type) { + case 'checkbox': + value = $element.is(':checked'); + break; + default: + value = $element.val(); + } + return value; + }; + + // Identify the element's type and get its value + static setElementValue($element, value) { + if (!$element.length) { + return; + } + + var type = $element.attr('type'); + switch (type) { + case 'checkbox': + $element.prop('checked', !!value); + break; + default: + $element.val(value); + } + $element.trigger('change'); + }; + + // Transforms a shallow object with keys separated by "." into a nested object + static getNestedObject(shallowObject) { + var nestedObject = {}; + for (var key in shallowObject) { + var value = shallowObject[key]; + var propertyArray = key.split('.'); + var currentObject = nestedObject; + while (propertyArray.length) { + var currentProperty = propertyArray.shift(); + if (!propertyArray.length) { + currentObject[currentProperty] = value; + } else { + if (!currentObject[currentProperty]) { + currentObject[currentProperty] = {}; + } + + currentObject = currentObject[currentProperty]; + } + } + } + + return nestedObject; + }; + + // Transforms a nested object into a shallowObject merging its keys with "." character + static getShallowObject(nestedObject) { + var shallowObject = {}; + var putValues = function(baseKey, nestedObject, resultObject) { + for (var key in nestedObject) { + var currentKey = baseKey ? baseKey + '.' + key : key; + var currentValue = nestedObject[key]; + if (typeof currentValue === 'object') { + putValues(currentKey, currentValue, resultObject); + } else { + resultObject[currentKey] = currentValue; + } + } + }; + + putValues('', nestedObject, shallowObject); + return shallowObject; + } + + // Gets the nested data for the given form + static getFormData($form) { + var data = {}; + $form.find(':input[name]').each((index, element) => { + var $element = $(element); + var value = this.getElementValue($element); + var name = $element.attr('name'); + data[name] = value; + }); + return this.getNestedObject(data); + } + + // Sets the nested data in the given form + static setFormData($form, data) { + var shallowData = this.getShallowObject(data); + for (var key in shallowData) { + var value = shallowData[key]; + var $element = $form.find(':input[name="' + key + '"]'); + this.setElementValue($element, value); + } + } + +} + +FormUtils = Form; diff --git a/Packages/lesiontracker/package.js b/Packages/lesiontracker/package.js index 274163c21..59222cd93 100644 --- a/Packages/lesiontracker/package.js +++ b/Packages/lesiontracker/package.js @@ -62,6 +62,9 @@ Package.onUse(function(api) { api.addFiles('client/helpers/blaze.js', 'client'); api.addFiles('client/helpers/logical.js', 'client'); + // Utility classes + api.addFiles('client/utils/form.js', 'client'); + // UI Components api.addFiles('client/components/viewer/viewer.html', 'client'); api.addFiles('client/components/viewer/viewer.styl', 'client'); @@ -186,11 +189,14 @@ Package.onUse(function(api) { api.addFiles('client/components/lesionTrackerViewportOverlay/lesionTrackerViewportOverlay.html', 'client'); api.addFiles('client/components/lesionTrackerViewportOverlay/lesionTrackerViewportOverlay.js', 'client'); + api.addFiles('client/components/serverInformationModal/serverInformationDicomWeb.html', 'client'); + api.addFiles('client/components/serverInformationModal/serverInformationDicomWeb.js', 'client'); api.addFiles('client/components/serverInformationModal/serverInformationForm.html', 'client'); api.addFiles('client/components/serverInformationModal/serverInformationForm.js', 'client'); api.addFiles('client/components/serverInformationModal/serverInformationList.html', 'client'); api.addFiles('client/components/serverInformationModal/serverInformationList.js', 'client'); api.addFiles('client/components/serverInformationModal/serverInformationModal.html', 'client'); + api.addFiles('client/components/serverInformationModal/serverInformationModal.styl', 'client'); api.addFiles('client/components/serverInformationModal/serverInformationModal.js', 'client'); api.addFiles('client/components/userAccountMenu/userAccountMenu.html', 'client'); @@ -282,14 +288,14 @@ Package.onUse(function(api) { api.export('TrialCriteriaTypes', 'client'); // Export collections spanning both client and server -<<<<<<< 624d2aeaf5db4d1ac2b6ade6411fa55f4788ceac api.export('AdditionalFindings', [ 'client', 'server' ]); -======= api.export('Servers', [ 'client', 'server' ]); ->>>>>>> Refactoring servers configuration structure api.export('ImageMeasurements', [ 'client', 'server' ]); api.export('Measurements', [ 'client', 'server' ]); api.export('Studies', [ 'client', 'server' ]); api.export('Timepoints', [ 'client', 'server' ]); api.export('Reviewers', [ 'client', 'server' ]); + + // Export utility classes + api.export('FormUtils', 'client'); }); diff --git a/Packages/lesiontracker/server/servers.js b/Packages/lesiontracker/server/servers.js index dc532e686..ccb01a145 100644 --- a/Packages/lesiontracker/server/servers.js +++ b/Packages/lesiontracker/server/servers.js @@ -3,7 +3,7 @@ Meteor.startup(function() { _.each(Meteor.settings.servers, function(endpoints, serverType) { _.each(endpoints, function(endpoint) { var server = _.clone(endpoint); - server.origin = "json"; + server.origin = 'json'; server.type = serverType; Servers.insert(server); }); @@ -12,23 +12,25 @@ Meteor.startup(function() { }); Meteor.methods({ - addServer: function(serverSettings) { - console.log("CHECKING PERMISSIONS"); + saveServer: function(serverSettings) { if (!Meteor.userId()) { throw new Meteor.Error('not-authorized'); } - console.log("WRITTING ON COLLECTION"); - Servers.update( - { type: serverSettings.type, name: serverSettings.name }, - serverSettings, - { upsert: true }, - function(error, affected) { - console.log("CHECKING FOR ERRORS"); - if(error) throw new Meteor.Error('data-write', error); - console.log("NO ERRORS, " + affected + " DOCUMENTS AFFECTED"); - console.log(Servers.findOne()); - } - ); - } + var criteria = { + _id: serverSettings._id + }; + var options = { + upsert: true + }; + var callback = function(error, affected) { + if (error) { + throw new Meteor.Error('data-write', error); + } + + console.log(Servers.findOne()); + }; + + Servers.update(criteria, serverSettings, options, callback); + } });