From 6f2b26c5dfa7429f521a8b988818c2108dd5efd4 Mon Sep 17 00:00:00 2001
From: "Mark M. Florida" <markflorida@wustl.edu>
Date: Fri, 22 Jul 2016 08:23:59 -0500
Subject: [PATCH] XNAT-4412, XNAT-4332, XNAT-4384: Fixes for DICOM SCP
 administration

---
 .../scripts/xnat/admin/dicomScpManager.js     | 126 +++++++++---------
 1 file changed, 64 insertions(+), 62 deletions(-)

diff --git a/src/main/webapp/scripts/xnat/admin/dicomScpManager.js b/src/main/webapp/scripts/xnat/admin/dicomScpManager.js
index e708a9cb..73c806f3 100644
--- a/src/main/webapp/scripts/xnat/admin/dicomScpManager.js
+++ b/src/main/webapp/scripts/xnat/admin/dicomScpManager.js
@@ -52,7 +52,12 @@ var XNAT = getObject(XNAT || {});
             }
         })
     }
-    
+
+    function scpUrl(appended){
+        appended = isDefined(appended) ? '/' + appended : '';
+        return rootUrl('/xapi/dicomscp' + appended);
+    }
+
     // keep track of used ports to help prevent port conflicts
     dicomScpManager.usedPorts = [];
 
@@ -65,14 +70,14 @@ var XNAT = getObject(XNAT || {});
         dicomScpManager.usedPorts = [];
         dicomScpManager.ids = [];
         return XNAT.xhr.get({
-            url: rootUrl('/xapi/dicomscp'),
+            url: scpUrl(),
             dataType: 'json',
             success: function(data){
                 dicomScpManager.receivers = data;
                 // refresh the 'usedPorts' array every time this function is called
                 data.forEach(function(item){
                     dicomScpManager.usedPorts.push(item.port);
-                    dicomScpManager.ids.push(item.scpId);
+                    dicomScpManager.ids.push(item.id);
                 });
                 callback.apply(this, arguments);
             }
@@ -83,7 +88,7 @@ var XNAT = getObject(XNAT || {});
         if (!id) return null;
         callback = isFunction(callback) ? callback : function(){};
         return XNAT.xhr.get({
-            url: rootUrl('/xapi/dicomscp/' + id),
+            url: scpUrl(id),
             dataType: 'json',
             success: callback
         });
@@ -97,52 +102,44 @@ var XNAT = getObject(XNAT || {});
     };
 
     // dialog to create/edit receivers
-    dicomScpManager.dialog = function(item, opts){
+    dicomScpManager.dialog = function(item, isNew){
         var tmpl = $('#dicom-scp-editor-template');
         var doWhat = !item ? 'New' : 'Edit';
-        var isNew = doWhat === 'New';
+        isNew = firstDefined(isNew, doWhat === 'New');
+        console.log(isNew);
         item = item || {};
         xmodal.open({
             title: doWhat + ' DICOM SCP Receiver',
             template: tmpl.clone(),
-            height: 400,
+            width: 350,
+            height: 300,
+            scroll: false,
             padding: '0',
             beforeShow: function(obj){
                 var $form = obj.$modal.find('#dicom-scp-editor-panel');
-                if (item && item.scpId) {
-                    // check the 'enabled' checkbox for new items
+                if (item && isDefined(item.id)) {
                     $form.setValues(item);
-                    // forOwn(item, function(prop, val){
-                    //     $form.find('[name="'+prop+'"]').val(val);
-                    // });
                 }
-                //if (isNew) {
-                //    $form.find('#scp-enabled').prop('checked', true);
-                //    // $$('?enabled')[0].checked = true;
-                //}
             },
             okClose: false,
             okLabel: 'Save',
             okAction: function(obj){
                 // the form panel is 'dicomScpEditorTemplate' in site-admin-element.yaml
                 var $form = obj.$modal.find('#dicom-scp-editor-panel');
-                var id = $form.find('#scp-id').val();
-                if (!id) {
-                    xmodal.message('SCP ID is required');
-                    return false;
-                }
+                var $title = $form.find('#scp-title');
+                var $port = $form.find('#scp-port');
+                console.log(item.id);
                 $form.submitJSON({
-                    method: 'PUT',
-                    url: '/xapi/dicomscp/' + id,
+                    method: isNew ? 'POST' : 'PUT',
+                    url: isNew ? scpUrl() : scpUrl(item.id),
                     validate: function(){
+
                         $form.find(':input').removeClass('invalid');
-                        var $id = $form.find('#scp-id');
-                        var $port = $form.find('#scp-port');
-                        var $title = $form.find('#scp-title');
+
                         var errors = 0;
                         var errorMsg = 'Errors were found with the following fields: <ul>';
 
-                        [$id, $port, $title].forEach(function($el){
+                        [$port, $title].forEach(function($el){
                             var el = $el[0];
                             if (!el.value) {
                                 errors++;
@@ -151,23 +148,25 @@ var XNAT = getObject(XNAT || {});
                             }
                         });
 
-                        if (isNew) {
-                            if (dicomScpManager.ids.indexOf($id.val()) > -1) {
-                                errors++;
-                                errorMsg += '<li><b>SCP ID</b> already exists. Please use a different ID value.</li>';
-                                $id.addClass('invalid');
-                            }
-                            if (dicomScpManager.usedPorts.indexOf($port.val()) > -1) {
-                                errors++;
-                                errorMsg += '<li><b>Port</b> is already in use. Please use another port number.</li>';
-                                $port.addClass('invalid');
-                            }
+                        var portNumber = $port.val();
+
+                        console.log(portNumber);
+
+                        if (isNew){
+                            dicomScpManager.usedPorts.forEach(function(port){
+                                if (port+'' === portNumber+''){
+                                    errors++;
+                                    errorMsg += '<li>Port <b>' + portNumber + '</b> is already in use. Please use another port number.</li>';
+                                    $port.addClass('invalid');
+                                return false;
+                                }
+                            });
                         }
 
                         errorMsg += '</ul>';
 
                         if (errors > 0) {
-                            xmodal.message('Errors Found', errorMsg);
+                            xmodal.message('Errors Found', errorMsg, { height: 300 });
                         }
 
                         return errors === 0;
@@ -199,10 +198,8 @@ var XNAT = getObject(XNAT || {});
         // add table header row
         scpTable.tr()
                 .th({ addClass: 'left', html: '<b>AE Title</b>' })
-                .th({ addClass: 'left', html: '<b>SCP ID</b>' })
                 .th('<b>Port</b>')
                 .th('<b>Enabled</b>')
-                //.th('<b>Default?</b>')  // if this is enabled, enable the radio button(s) too (below)
                 .th('<b>Actions</b>');
 
         // TODO: move event listeners to parent elements - events will bubble up
@@ -216,9 +213,11 @@ var XNAT = getObject(XNAT || {});
                         // save the status when clicked
                         var enabled = this.checked;
                         XNAT.xhr.put({
-                            url: rootUrl('/xapi/dicomscp/' + item.scpId + '/enabled/' + enabled),
+                            url: scpUrl(item.id + '/enabled/' + enabled),
                             success: function(){
-                                console.log(item.scpId + (enabled ? ' enabled' : ' disabled'))
+                                var status = (enabled ? ' enabled' : ' disabled');
+                                XNAT.ui.banner.top(1000, '<b>' + item.aeTitle + '</b> ' + status, 'success');
+                                console.log(item.id + (enabled ? ' enabled' : ' disabled'))
                             }
                         });
                     }
@@ -235,19 +234,31 @@ var XNAT = getObject(XNAT || {});
             }, [['b', text]]);
         }
 
+        function editButton(item) {
+            return spawn('button.btn.sm.edit', {
+                onclick: function(e){
+                    e.preventDefault();
+                    dicomScpManager.dialog(item);
+                }
+            }, 'Edit');
+        }
+
         function deleteButton(item){
             return spawn('button.btn.sm.delete', {
                 onclick: function(){
                     xmodal.confirm({
+                        height: 220,
+                        scroll: false,
                         content: "" +
-                        "<p>Are you sure you'd like to delete the '" + item.aeTitle + "' DICOM Receiver?</p>" +
+                        "<p>Are you sure you'd like to delete the '<b>" + item.aeTitle + "</b>' DICOM Receiver?</p>" +
                         "<p><b>This action cannot be undone.</b></p>",
                         okAction: function(){
+                            console.log('delete id ' + item.id);
                             XNAT.xhr.delete({
-                                url: rootUrl('/xapi/dicomscp/' + item.scpId),
+                                url: scpUrl(item.id),
                                 success: function(){
-                                    console.log('"'+ item.scpId + '" deleted');
-                                    XNAT.ui.banner.top(2000, '<b>"'+ item.scpId + '"</b> deleted.', 'success');
+                                    console.log('"'+ item.aeTitle + '" deleted');
+                                    XNAT.ui.banner.top(2000, '<b>"'+ item.aeTitle + '"</b> deleted.', 'success');
                                     refreshTable();
                                 }
                             });
@@ -259,19 +270,11 @@ var XNAT = getObject(XNAT || {});
         
         dicomScpManager.getAll().done(function(data){
             data.forEach(function(item){
-                scpTable.tr({title:item.scpId})
+                scpTable.tr({ title: item.aeTitle, data: { id: item.id, port: item.port }})
                         .td([editLink(item, item.aeTitle)])
-                        .td(item.scpId)
                         .td([['div.mono.center', item.port]])
                         .td([enabledCheckbox(item)])
-                        .td([['div.center', [deleteButton(item)]]]);
-                // scpTable.row([
-                //     item.aeTitle,
-                //     [['div.mono.center', item.port]],
-                //     [enabledCheckbox(item)],
-                //     //[['div.center', [['input|type=radio;name=defaultReceiver']] ]], // how do we know which one is 'default'
-                //     [['div.center', [editButton(item), spacer(10), deleteButton(item)]]]
-                // ]);
+                        .td([['div.center', [editButton(item), spacer(10), deleteButton(item)]]]);
             });
 
             if (container){
@@ -287,7 +290,6 @@ var XNAT = getObject(XNAT || {});
         dicomScpManager.$table = $(scpTable.table);
         
         return scpTable.table;
-
     };
 
     dicomScpManager.init = function(container){
@@ -302,7 +304,7 @@ var XNAT = getObject(XNAT || {});
         var newReceiver = spawn('button.new-dicomscp-receiver.btn.btn-sm.submit', {
             html: 'New DICOM SCP Receiver',
             onclick: function(){
-                dicomScpManager.dialog();
+                dicomScpManager.dialog(null, true);
             }
         });
 
@@ -310,7 +312,7 @@ var XNAT = getObject(XNAT || {});
             html: 'Start All',
             onclick: function(){
                 XNAT.xhr.put({
-                    url: XNAT.url.rootUrl('/xapi/dicomscp/start'),
+                    url: scpUrl('start'),
                     success: function(){
                         console.log('DICOM SCP Receivers started')
                     }
@@ -322,7 +324,7 @@ var XNAT = getObject(XNAT || {});
             html: 'Stop All',
             onclick: function(){
                 XNAT.xhr.put({
-                    url: XNAT.url.rootUrl('/xapi/dicomscp/stop'),
+                    url: scpUrl('stop'),
                     success: function(){
                         console.log('DICOM SCP Receivers stopped')
                     }
@@ -354,8 +356,8 @@ var XNAT = getObject(XNAT || {});
             dicomScpManager.$container.prepend(table);
         });
     }
-    dicomScpManager.refresh = refreshTable;
 
+    dicomScpManager.refresh = refreshTable;
 
     dicomScpManager.init();
 
-- 
GitLab