LT-67 Implementing server's data retrieve and update
This commit is contained in:
parent
e28f4b9a95
commit
3873ac6b3b
@ -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>
|
||||
@ -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);
|
||||
}
|
||||
});
|
||||
});
|
||||
@ -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>
|
||||
|
||||
@ -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');
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@ -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"}}>
|
||||
|
||||
@ -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');
|
||||
}
|
||||
});
|
||||
|
||||
@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
@ -0,0 +1,5 @@
|
||||
.server-information-form
|
||||
label.wrapper
|
||||
display: block
|
||||
.checkbox
|
||||
margin: 0 8px 0 0
|
||||
101
Packages/lesiontracker/client/utils/form.js
Normal file
101
Packages/lesiontracker/client/utils/form.js
Normal 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;
|
||||
@ -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');
|
||||
});
|
||||
|
||||
@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
Loading…
Reference in New Issue
Block a user