comparison OrthancExplorer/query-retrieve.js @ 1371:f528849ee9f7 query-retrieve

DICOM Query/Retrieve available from Orthanc Explorer
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 27 May 2015 17:33:13 +0200
parents
children 21a2929e541d
comparison
equal deleted inserted replaced
1370:7b6f5115607f 1371:f528849ee9f7
1 function JavascriptDateToDicom(date)
2 {
3 var s = date.toISOString();
4 return s.substring(0, 4) + s.substring(5, 7) + s.substring(8, 10);
5 }
6
7 function GenerateDicomDate(days)
8 {
9 var today = new Date();
10 var other = new Date(today);
11 other.setDate(today.getDate() + days);
12 return JavascriptDateToDicom(other);
13 }
14
15
16 $('#query-retrieve').live('pagebeforeshow', function() {
17 $.ajax({
18 url: '../modalities',
19 dataType: 'json',
20 async: false,
21 cache: false,
22 success: function(modalities) {
23 var target = $('#qr-server');
24 $('option', target).remove();
25
26 for (var i = 0; i < modalities.length; i++) {
27 var option = $('<option>').text(modalities[i]);
28 target.append(option);
29 }
30
31 target.selectmenu('refresh');
32 }
33 });
34
35 var target = $('#qr-date');
36 $('option', target).remove();
37 target.append($('<option>').attr('value', '*').text('Any date'));
38 target.append($('<option>').attr('value', GenerateDicomDate(0)).text('Today'));
39 target.append($('<option>').attr('value', GenerateDicomDate(-1)).text('Yesterday'));
40 target.append($('<option>').attr('value', GenerateDicomDate(-7) + '-').text('Last 7 days'));
41 target.append($('<option>').attr('value', GenerateDicomDate(-31) + '-').text('Last 31 days'));
42 target.append($('<option>').attr('value', GenerateDicomDate(-31 * 3) + '-').text('Last 3 months'));
43 target.append($('<option>').attr('value', GenerateDicomDate(-365) + '-').text('Last year'));
44 target.selectmenu('refresh');
45 });
46
47
48 $('#qr-submit').live('click', function() {
49 var query = {
50 'Level' : 'Study',
51 'Query' : {
52 'AccessionNumber' : '*',
53 'PatientBirthDate' : '*',
54 'PatientID' : '*',
55 'PatientName' : '*',
56 'PatientSex' : '*',
57 'SpecificCharacterSet' : 'ISO_IR 192', // UTF-8
58 'StudyDate' : $('#qr-date').val(),
59 'StudyDescription' : '*'
60 }
61 };
62
63 var field = $('#qr-fields input:checked').val();
64 query['Query'][field] = $('#qr-value').val().toUpperCase();
65
66 var modalities = '';
67 $('#qr-modalities input:checked').each(function() {
68 var s = $(this).attr('name');
69 if (modalities == '*')
70 modalities = s;
71 else
72 modalities += '\\' + s;
73 });
74
75 if (modalities.length > 0) {
76 query['Query']['ModalitiesInStudy'] = modalities;
77 }
78
79
80 var server = $('#qr-server').val();
81 $.ajax({
82 url: '../modalities/' + server + '/query',
83 type: 'POST',
84 data: JSON.stringify(query),
85 dataType: 'json',
86 async: false,
87 error: function() {
88 alert('Error during query (C-Find)');
89 },
90 success: function(result) {
91 window.location.assign('explorer.html#query-retrieve-2?server=' + server + '&uuid=' + result['ID']);
92 }
93 });
94
95 return false;
96 });
97
98
99
100 function Retrieve(url)
101 {
102 $.ajax({
103 url: '../system',
104 dataType: 'json',
105 async: false,
106 success: function(system) {
107 $('<div>').simpledialog2({
108 mode: 'button',
109 headerText: 'Retrieve destination',
110 headerClose: true,
111 buttonPrompt: 'Enter Application Entity Title (AET):',
112 buttonInput: true,
113 buttonInputDefault: system['DicomAet'],
114 buttons : {
115 'OK': {
116 click: function () {
117 var aet = $.mobile.sdLastInput;
118 if (aet.length == 0)
119 aet = system['DicomAet'];
120
121 $.ajax({
122 url: url,
123 type: 'POST',
124 async: true, // Necessary to block UI
125 dataType: 'text',
126 data: aet,
127 beforeSend: function() {
128 $.blockUI({ message: $('#info-retrieve') });
129 },
130 complete: function(s) {
131 $.unblockUI();
132 },
133 error: function() {
134 alert('Error during retrieve');
135 }
136 });
137 }
138 }
139 }
140 });
141 }
142 });
143 }
144
145
146
147
148 $('#query-retrieve-2').live('pagebeforeshow', function() {
149 if ($.mobile.pageData) {
150 var uri = '../queries/' + $.mobile.pageData.uuid + '/answers';
151
152 $.ajax({
153 url: uri,
154 dataType: 'json',
155 async: false,
156 success: function(answers) {
157 var target = $('#query-retrieve-2 ul');
158 $('li', target).remove();
159
160 for (var i = 0; i < answers.length; i++) {
161 $.ajax({
162 url: uri + '/' + answers[i] + '/content?simplify',
163 dataType: 'json',
164 async: false,
165 success: function(study) {
166 var series = '#query-retrieve-3?server=' + $.mobile.pageData.server + '&uuid=' + study['StudyInstanceUID'];
167 var info = $('<a>').attr('href', series).html(
168 ('<h3>{0} - {1}</h3>' +
169 '<p>Accession number: <b>{2}</b></p>' +
170 '<p>Birth date: <b>{3}</b></p>' +
171 '<p>Patient sex: <b>{4}</b></p>' +
172 '<p>Study description: <b>{5}</b></p>' +
173 '<p>Study date: <b>{6}</b></p>').format(
174 study['PatientID'],
175 study['PatientName'],
176 study['AccessionNumber'],
177 FormatDicomDate(study['PatientBirthDate']),
178 study['PatientSex'],
179 study['StudyDescription'],
180 FormatDicomDate(study['StudyDate'])));
181
182 var studyUri = uri + '/' + answers[i] + '/retrieve';
183 var retrieve = $('<a>').text('Retrieve').click(function() {
184 Retrieve(studyUri);
185 });
186
187 target.append($('<li>').append(info).append(retrieve));
188 }
189 });
190 }
191
192 target.listview('refresh');
193 }
194 });
195 }
196 });
197
198
199 $('#query-retrieve-3').live('pagebeforeshow', function() {
200 if ($.mobile.pageData) {
201 var query = {
202 'Level' : 'Series',
203 'Query' : {
204 'Modality' : '*',
205 'ProtocolName' : '*',
206 'SeriesDescription' : '*',
207 'SeriesInstanceUID' : '*',
208 'StudyInstanceUID' : $.mobile.pageData.uuid
209 }
210 };
211
212 $.ajax({
213 url: '../modalities/' + $.mobile.pageData.server + '/query',
214 type: 'POST',
215 data: JSON.stringify(query),
216 dataType: 'json',
217 async: false,
218 error: function() {
219 alert('Error during query (C-Find)');
220 },
221 success: function(answer) {
222 var uri = '../queries/' + answer['ID'] + '/answers';
223
224 $.ajax({
225 url: uri,
226 dataType: 'json',
227 async: false,
228 success: function(answers) {
229
230 var target = $('#query-retrieve-3 ul');
231 $('li', target).remove();
232
233 for (var i = 0; i < answers.length; i++) {
234 $.ajax({
235 url: uri + '/' + answers[i] + '/content?simplify',
236 dataType: 'json',
237 async: false,
238 success: function(series) {
239 var info = $('<a>').html(
240 ('<h3>{0}</h3>' +
241 '<p>Modality: <b>{1}</b></p>' +
242 '<p>Protocol name: <b>{2}</b></p>'
243 ).format(
244 series['SeriesDescription'],
245 series['Modality'],
246 series['ProtocolName']
247 ));
248
249 var seriesUri = uri + '/' + answers[i] + '/retrieve';
250 var retrieve = $('<a>').text('Retrieve').click(function() {
251 Retrieve(seriesUri);
252 });
253
254 target.append($('<li>').append(info).append(retrieve));
255 }
256 });
257 }
258
259 target.listview('refresh');
260 }
261 });
262 }
263 });
264 }
265 });