LT-67 Implementing server's data retrieve and update

This commit is contained in:
Bruno Alves de Faria 2016-05-07 10:34:27 -03:00 committed by Erik Ziegler
parent e28f4b9a95
commit 3873ac6b3b
11 changed files with 288 additions and 50 deletions

View File

@ -0,0 +1,74 @@
<template name="serverInformationDicomWeb">
<div class="row">
{{>serverInformationDicomWebField name="wadoUriRoot" label="WADO URI root"}}
{{>serverInformationDicomWebField name="wadoUriRootNOTE" label="WADO URI root note"}}
{{>serverInformationDicomWebField name="wadoRoot" label="WADO root"}}
<div class="col-lg-6">
<div class="form-group">
<label class="wrapper">
<strong>Image rendering</strong>
<select name="imageRendering" class="form-control">
<option>Select</option>
<option value="wadouri">WADO URI</option>
<option value="orthanc">ORTHANC</option>
</select>
</label>
</div>
</div>
{{>serverInformationDicomWebField name="qidoRoot" label="QIDO root"}}
<div class="col-lg-6">
<strong>QIDO options</strong>
<div class="form-group">
<div class="form-control">
<div class="checkbox">
<label>
<input type="checkbox" name="qidoSupportsIncludeField">
<span>QIDO supports including fields</span>
</label>
</div>
</div>
</div>
</div>
</div>
<hr>
<h4>Request options</h4>
<div class="row">
{{>serverInformationDicomWebField name="requestOptions.auth" label="Authentication"}}
<div class="col-lg-6">
<strong>Logging options</strong>
<div class="form-group">
<div class="form-control clearfix">
<div class="checkbox pull-left">
<label>
<input type="checkbox" name="requestOptions.logRequests">
<span>Requests</span>
</label>
</div>
<div class="checkbox pull-left">
<label>
<input type="checkbox" name="requestOptions.logResponses">
<span>Responses</span>
</label>
</div>
<div class="checkbox pull-left">
<label>
<input type="checkbox" name="requestOptions.logTiming">
<span>Timing</span>
</label>
</div>
</div>
</div>
</div>
</div>
</template>
<template name="serverInformationDicomWebField">
<div class="col-lg-6">
<div class="form-group">
<label class="wrapper">
<span>{{this.label}}</span>
<input type="text" name="{{this.name}}" class="form-control">
</label>
</div>
</div>
</template>

View File

@ -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);
}
});
});

View File

@ -1,26 +1,39 @@
<template name="serverInformationForm">
<div class="row">
<div class="col-lg-6">
<div class="form-group">
<label for="serverName">Server Name</label>
<input type="text" class="form-control" id="serverName">
<form class="server-information-form">
<input type="hidden" name="_id">
<div class="row">
<div class="col-lg-6">
<div class="form-group">
<label class="wrapper">
<strong>Server Name</strong>
<input type="text" name="name" class="form-control">
</label>
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label class="wrapper">
<strong>Server Type</strong>
<select name="type" class="form-control js-server-type">
<option>Select</option>
<option value="dicomWeb">DICOM Web</option>
<option value="dimse">DIMSE</option>
</select>
</label>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label for="serverType">Server Type</label>
<select class="form-control js-server-type">
<option>Select</option>
<option value="dicomWeb">DICOM Web</option>
<option value="dimse">DIMSE</option>
</select>
<hr>
{{#if equals serverType.get "dicomWeb"}}
{{>serverInformationDicomWeb this}}
{{/if}}
{{#if equals serverType.get "dimse"}}
TODO: Print DIMSE form
{{/if}}
{{#if serverType.get}}
<div>
<input type="submit" class="btn btn-primary" value="Save">
</div>
</div>
</div>
{{#if equals serverType.get "dicomWeb"}}
TODO: Print DICOM Web form
{{/if}}
{{#if equals serverType.get "dimse"}}
TODO: Print DIMSE form
{{/if}}
{{/if}}
</form>
</template>

View File

@ -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');
});
}
});

View File

@ -8,10 +8,10 @@
</tr>
</thead>
<tbody>
{{#each server in servers}}
{{#each servers}}
<tr>
<td>{{server.name}}</td>
<td>{{server.type}}</td>
<td>{{this.name}}</td>
<td>{{this.type}}</td>
<td class="text-right">
<div class="btn-group" role="group" aria-label="Actions">
<button class="btn btn-sm btn-default editServer" {{tooltipTop "Edit"}}>

View File

@ -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');
}
});

View File

@ -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);
}
});

View File

@ -0,0 +1,5 @@
.server-information-form
label.wrapper
display: block
.checkbox
margin: 0 8px 0 0

View File

@ -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;

View File

@ -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');
});

View File

@ -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);
}
});