From 4c465d38bd9ce66cd02dc9131da85525fe855500 Mon Sep 17 00:00:00 2001
From: Justin Cleveland <clevelandj@wustl.edu>
Date: Wed, 18 May 2016 20:31:24 -0500
Subject: [PATCH] XNAT-4195 -- Add function to notifications API to manage
 existing notifications, fixes to make load and refresh functions work with
 Mark's changes

---
 .../xnat/spawner/site-admin-elements.yaml     | 281 ++++++------------
 1 file changed, 91 insertions(+), 190 deletions(-)

diff --git a/src/main/resources/META-INF/xnat/spawner/site-admin-elements.yaml b/src/main/resources/META-INF/xnat/spawner/site-admin-elements.yaml
index 38cb1033..abdf0f1e 100644
--- a/src/main/resources/META-INF/xnat/spawner/site-admin-elements.yaml
+++ b/src/main/resources/META-INF/xnat/spawner/site-admin-elements.yaml
@@ -83,7 +83,6 @@ adminEmail:
     id: adminEmail
     name: adminEmail
     label: Site Administrator Email Address
-    value: ?? XNAT.data.siteConfig.adminEmail
 
 fileSystemSettingsWarning:
     someInfo:
@@ -94,7 +93,6 @@ fileSystemSettingsWarning:
                 and are seldom, if ever, changed.
             style:
                 fontWeight: bold
-
 archivePath:
     kind: panel.input.text
     id: archivePath
@@ -102,8 +100,6 @@ archivePath:
     label: Archive Path
     validation: required path
     description: ""
-    value: ?? XNAT.data.siteConfig.archivePath
-
 cachePath:
     kind: panel.input.text
     id: cachePath
@@ -111,8 +107,6 @@ cachePath:
     label: Cache Path
     validation: required path
     description: ""
-    value: ?? XNAT.data.siteConfig.cachePath
-
 prearchivePath:
     kind: panel.input.text
     id: prearchivePath
@@ -120,8 +114,6 @@ prearchivePath:
     label: Prearchive Path
     validation: required path
     description: ""
-    value: ?? XNAT.data.siteConfig.prearchivePath
-
 ftpPath:
     kind: panel.input.text
     id: ftpPath
@@ -129,7 +121,6 @@ ftpPath:
     label: FTP Path
     validation: required path
     description: ""
-    value: ??XNAT.data.siteConfig.cachePath
 buildPath:
     kind: panel.input.text
     id: buildPath
@@ -137,7 +128,6 @@ buildPath:
     label: Build Path
     validation: required id onblur
     description: ""
-    value: ??XNAT.data.siteConfig.cachePath
 pipelinePath:
     kind: panel.input.text
     id: pipelinePath
@@ -145,14 +135,6 @@ pipelinePath:
     label: Pipeline Path
     validation: required id onblur
     description: ""
-    value: ??XNAT.data.siteConfig.cachePath
-dataFolders:
-    kind: panel.input.text
-    id: dataFolders
-    name: dataFolders
-    label: Data Folders
-    validation: required id onblur
-    description: ""
 zipExtensions:
     kind: panel.input.text
     id: zipExtensions
@@ -165,8 +147,7 @@ siteInfo:
     label: Site Information
     method: POST
     action: /xapi/siteConfig/batch
-    load:
-        lookup: XNAT.data.siteConfig
+    load: ?? XNAT.data.siteConfig
     contentType: json
     contents:
         ${siteId}
@@ -217,9 +198,8 @@ userLoginsSessionControls:
     label: User Logins / Session Controls
     method: POST
     action: /xapi/siteConfig/batch
-    load:
-        lookup: XNAT.data.siteConfig
-        refresh: /xapi/siteConfig
+    load: ?? XNAT.data.siteConfig
+    refresh: /xapi/siteConfig
     contentType: json
     contents:
         sessionTimeout:
@@ -227,14 +207,12 @@ userLoginsSessionControls:
             id: sessionTimeout
             name: sessionTimeout
             label: Session Timeout
-            value: ?? XNAT.data.siteConfig.sessionTimeout || 15
             description: "Interval for timing out alias tokens"
         aliasTokenTimeout:
             kind: panel.input.text
             id: aliasTokenTimeout
             name: aliasTokenTimeout
             label: Alias Token Timeout
-            value: ?? XNAT.data.siteConfig.aliasTokenTimeout || 2 days
             description: >
                 Interval for timing out alias tokens. Uses
                 <a target="_blank" href="http://www.postgresql.org/docs/9.0/static/functions-datetime.html">PostgreSQL interval notation</a>
@@ -243,49 +221,42 @@ userLoginsSessionControls:
             id: sessionTimeoutMessage
             name: sessionTimeoutMessage
             label: Session Timeout Message
-            value: ?? XNAT.data.siteConfig.sessionTimeoutMessage || "Your session has timed out."
             description: Alert message provided to users after a session timeout and logout.
         allowResumeOnNextLogin:
             kind: panel.input.checkbox
             id: allow-resume-on-next-login
             name: allowResumeOnNextLogin
             label: Allow Resume On Next Login?
-            value: ?? XNAT.data.siteConfig.allowResumeOnNextLogin
             description: Allow user to resume where they left off, if logging back in after a session timeout?
         maximumConcurrentSessions:
             kind: panel.input.number
             id: maximumConcurrentSessions
             name: sessions.concurrent_max
             label: Maximum Concurrent Sessions
-            value: ?? XNAT.data.siteConfig.sessions.concurrent_max || 100
             description: The maximum number of permitted sessions a user can have open simultaneously
         loginFailureMessage:
             kind: panel.textarea
             id: loginFailureMessage
             name: UI.login_failure_message
             label: Login Failure Message
-            value: Login failed
             description: Text to show when a user fails to login
         maximumFailedLogins:
             kind: panel.input.number
             id: maximumFailedLogins
             name: maxFailedLogins
             label: Maximum Failed Logins
-            value: -1
             description: Number of failed login attempts before accounts are temporarily locked. (-1 disables feature)
         failedLoginLockoutDuration:
             kind: panel.input.number
             id: failedLoginLockoutDuration
             name: maxFailedLoginsLockoutDuration
             label: Failed Login Lockout Duration
-            value: 0
             description: Number of milliseconds to lock user accounts that have exceeded the max_failed_logins count. Select (3600000 for 1 hour, 86400000 for 24 hours)
         userInactivityLockout:
             kind: panel.input.number
             id: userInactivityLockout
             name: inactivityBeforeLockout
             label: User Inactivity Lockout
-            value: 31556926
             description: Number of seconds of inactivity before an account is disabled (31556926 for 1 year)
         inactivityBeforeLockoutSchedule:
             kind: panel.input.text
@@ -299,29 +270,26 @@ passwords:
     label: Passwords
     method: POST
     action: /xapi/siteConfig/batch
-    load:
-        lookup: XNAT.data.siteConfig
     contentType: json
+    load: ?? XNAT.data.siteConfig
+    refresh: /xapi/siteConfig
     contents:
         passwordComplexity:
             kind: panel.input.text
             id: passwordComplexity
             name: passwordComplexity
             label: Password Complexity
-            value: "^.*$"
             description: Must be a valid regular expression.
         passwordComplexityMessage:
-            kind: panel.input.text
+            kind: panel.textarea
             id: passwordComplexityMessage
             name: passwordComplexityMessage
             label: Password Complexity Message
-            value: "Your password must contain..."
         passwordHistoryDuration:
             kind: panel.input.number
             id: passwordHistoryDuration
             name: passwordHistoryDuration
             label: Password History (Duration)
-            value: -1
             description: "-1 to disable"
         passwordExpirationType:
             kind: panel.select.single
@@ -341,7 +309,6 @@ passwords:
             id: passwordExpirationInterval
             name: passwordExpirationInterval
             label: Password Expiration (Interval)
-            value: -1
             description: "-1 to disable"
         passwordExpirationDate:
             kind: panel.input.text
@@ -359,7 +326,6 @@ passwords:
             id: requireSaltedPasswords
             name: requireSaltedPasswords
             label: Require Passwords To Be Salted
-            value: false
 
 csrf:
     kind: panel.form
@@ -367,64 +333,32 @@ csrf:
     label: CSRF
     method: POST
     action: /xapi/siteConfig/batch
-    load:
-        lookup: XNAT.data.siteConfig
     contentType: json
+    load: ?? XNAT.data.siteConfig
+    refresh: /xapi/siteConfig
     contents:
         enableCsrfToken:
             kind: panel.input.checkbox
             id: enableCsrfToken
             name: enableCsrfToken
             label: Require CSRF Token?
-            value: true
             description: Should this site require the use of a token to prevent CSRF attacks on POST, PUT, and DELETEs?
         csrfEmailAlert:
             kind: panel.input.checkbox
             id: csrfEmailAlert
             name: enable_csrf_email_alert
             label: CSRF Email Alert
-            value: "Should this site send an email to the site admin whenever a CSRF attack is attempted?"
-
-auditTrail:
-    kind: panel.form
-    name: auditTrail
-    label: Audit Trail Configuration
-    method: POST
-    action: /xapi/siteConfig/batch
-    load:
-        lookup: XNAT.data.siteConfig
-    contentType: json
-    contents:
-        enableAuditTrail:
-            kind: panel.input.checkbox
-            id: enableAuditTrail
-            name: enableAuditTrail
-            label: Enable Audit Trail?
-            value: true
-        allowUserJustificationForChanges:
-            kind: panel.input.checkbox
-            id: allowUserJustificationForChanges
-            name: allowUserJustificationForChanges
-            label: Allow User Justification For Changes
-            value: true
-            description: "Allow users to enter change justifications when modifying data"
-        requireUserJustificationForChanges:
-            kind: panel.input.checkbox
-            id: requireUserJustificationForChanges
-            name: requireUserJustificationForChanges
-            label: Require User Justification For Changes
-            value: false
-            description: "Force users to enter change justifications when modifying data"
+            description: "Should this site send an email to the site admin whenever a CSRF attack is attempted?"
 
 securityServices:
     kind: panel.form
     name: securityServices
     label: Security Services
-    method: POST
     action: /xapi/siteConfig/batch
-    load:
-        lookup: XNAT.data.siteConfig
+    method: POST
     contentType: json
+    load: ?? XNAT.data.siteConfig
+    refresh: /xapi/siteConfig
     contents:
         securityServicesFeatureDefault:
             kind: panel.input.text
@@ -450,12 +384,10 @@ securityServices:
 emailServerSettings:
     kind: panel.form
     method: POST
-    action: /xapi/siteConfig
-    load: # load data
-        url: /xapi/siteConfig
-        prop: smtpServer # which root property? gets the root object if not set
-#        lookup: XNAT.data.siteConfig.smtpServer
+    action: /xapi/siteConfig/smtpServer
     contentType: json
+    load: ?? XNAT.data.siteConfig.smtpServer
+    refresh: /xapi/siteConfig/smtpServer
     name: emailServerSettings
     label: Mail Server Settings
     contents:
@@ -464,18 +396,15 @@ emailServerSettings:
             id: smtpEnabled
             name: smtp.enabled
             label: "Enable SMTP?"
-            #value: true
-            checked: true
         hostname:
             kind: panel.input.text
             name: host
             label: Host
-            value: localhost
+            placeholder: localhost
         port:
             kind: panel.input.number
             name: port
             label: Port
-            value: ""
             element:
                 placeholder: 587
         username:
@@ -483,19 +412,17 @@ emailServerSettings:
             name: username
             label: Username
             url: /xapi/notifications/username
-            value: ''
             element:
                 placeholder: name@host.org
         password:
             kind: panel.input.password
             name: password
             label: Password
-            value: ''
         protocol:
             kind: panel.input.text
             name: protocol
             label: Protocol
-            value: ''
+            placeholder: smtp
             #data:
                 #get: GET|/xapi/siteConfig|smtpServer.protocol
                 #set: POST|/xapi/notifications/protocol
@@ -508,111 +435,101 @@ emailServerSettings:
             kind: panel.input.checkbox
             name: mail.smtp.auth
             label: SMTP Auth?
-            #value: true
-            checked: true
         smtpStartTls:
             kind: panel.input.checkbox
             name: mail.smtp.starttls.enable
             label: Smart TLS?
-            #value: true
-            checked: true
         smtpSSLTrust:
             kind: panel.input.text
             name: mail.smtp.ssl.trust
             label: SSL Trust
-            value: ''
             element:
                 placeholder: localhost
         emailPrefix:
             kind: panel.input.text
             name: emailPrefix
             label: Email Prefix
-            element:
-                placeholder: XNAT
+            placeholder: XNAT
 
 notifications:
     kind: panel.form
     name: notifications
     label: Notifications
+    action: /xapi/siteConfig/batch
     method: POST
-    action: /xapi/notifications/batch
-    load:
-        lookup: XNAT.data.notifications
     contentType: json
+    load: ?? XNAT.data.siteConfig
+    refresh: /xapi/siteConfig
     contents:
         helpContactInfo:
             kind: panel.input.email
             id: helpContactInfo
-            name: helpContactInfo
+            name: notifications.helpContactInfo
             label: "Help Contact Info"
         emailMessageUserRegistration:
             kind: panel.textarea
             id: emailMessageUserRegistration
-            name: emailMessageUserRegistration
+            name: notifications.emailMessageUserRegistration
             label: "Email Message: User Registration"
             description: "Text of message emailed to users upon registration. Link for email validation is auto-populated."
         emailMessageForgotUsernameRequest:
             kind: panel.textarea
             id: emailMessageForgotUsernameRequest
-            name: emailMessageForgotUsernameRequest
+            name: notifications.emailMessageForgotUsernameRequest
             label: "Email Message: Forgot Username Request"
             description: "Text of message emailed to users upon lost username request."
         emailMessageForgotPasswordReset:
             kind: panel.textarea
             id: emailMessageForgotPasswordReset
-            name: emailMessageForgotPasswordReset
+            name: notifications.emailMessageForgotPasswordReset
             label: "Email Message: Password Reset"
             description: "Text of message emailed to users upon lost password reset. Link for password reset is auto-populated"
         notifyAdminUserRegistration:
             kind: panel.input.checkbox
             id: notifyAdminUserRegistration
-            name: notifyAdminUserRegistration
+            name: notifications.notifyAdminUserRegistration
             label: "Notify Admin on User Registration"
-            value: ?? XNAT.data.siteConfig.notifyAdminUserRegistration
             description: "Whether to cc admin user on new user emails. Requires valid admin email address."
         notifyAdminPipelineEmails:
             kind: panel.input.checkbox
             id: notifyAdminPipelineEmails
-            name: notifyAdminPipelineEmails
+            name: notifications.notifyAdminPipelineEmails
             label: "Notify Admin on Pipeline Emails"
-            value: false
             description: "Whether to cc admin user on pipeline processing submit. Requires valid admin email address."
         notifyAdminProjectAccessRequest:
             kind: panel.input.checkbox
             id: notifyAdminProjectAccessRequest
-            name: notifyAdminProjectAccessRequest
+            name: notifications.notifyAdminProjectAccessRequest
             label: "Notify Admin on Project Access Request"
-            value: false
             description: "Whether to cc admin user on user project access request. Requires valid admin email address."
         notifyAdminSessionTransfer:
             kind: panel.input.checkbox
             id: notifyAdminSessionTransfer
-            name: notifyAdminSessionTransfer
+            name: notifications.notifyAdminProjectOnSessionTransfer
             label: "Notify Admin on Session Transfer"
-            value: false
             description: "Whether to cc admin user on session transfer by user. Requires valid admin email address."
         emailRecipientErrorMessages:
             kind: panel.input.email
             id: emailRecipientErrorMessages
-            name: emailRecipientErrorMessages
+            name: notifications.emailRecipientErrorMessages
             label: "Email Recipient: Error Messages"
             description: "What email address should receive error emails"
         emailRecipientIssueReports:
             kind: panel.input.email
             id: emailRecipientIssueReports
-            name: emailRecipientIssueReports
+            name: notifications.emailRecipientIssueReports
             label: "Email Recipient: Issue Reports"
             description: "What email address should receive issue reports"
         emailRecipientNewUserAlert:
             kind: panel.input.email
             id: emailRecipientNewUserAlert
-            name: emailRecipientNewUserAlert
+            name: notifications.emailRecipientNewUserAlert
             label: "Email Recipient: New User Alert"
             description: "What email address should receive New User Registration emails"
         emailRecipientUpdate:
             kind: panel.input.email
             id: emailRecipientUpdate
-            name: emailRecipientUpdate
+            name: notifications.emailRecipientUpdate
             label: "Email Recipient: Updates"
             description: "What email address should receive update emails"
         emailAllowNonuserSubscribers:
@@ -620,7 +537,6 @@ notifications:
             id: emailAllowNonuserSubscribers
             name: emailAllowNonuserSubscribers
             label: "Allow Nonuser Subscribers"
-            value: ?? XNAT.data.siteConfig.emailAllowNonuserSubscribers
 
 themeManagement:
     kind: panel.form
@@ -673,32 +589,34 @@ authenticationMethods:
     label: User Authentication Methods
     method: POST
     action: /xapi/siteConfig/batch
-    load:
-        lookup: XNAT.data.siteConfig
     contentType: json
+    load: ?? XNAT.data.siteConfig
+    refresh: /xapi/siteConfig
     contents:
         xnatInternal:
             kind: panel.input.checkbox
             id: xnatInternal
             name: provider.providers.xnatInternal
             label: XNAT (Internal)
-            value: true
         ldapProvider:
             kind: panel.input.checkbox
             id: ldapProvider
             name: provider.providers.ldap
             label: LDAP
-            value: false
 #        oauthProvider:
 #            kind: panel.input.checkbox
 #            id: oauthProvider
 #            name: provider.providers.oauth
 #            label: OAuth
-#            value: false
 genericAuthenticationProvider:
     kind: panel.form
     name: genericAuthenticationProvider
     label: Generic Authentication Provider
+    method: POST
+    action: /xapi/siteConfig/batch
+    contentType: json
+    load: ?? XNAT.data.siteConfig
+    refresh: /xapi/siteConfig
     contents:
         providerDbName:
             kind: panel.input.text
@@ -719,6 +637,11 @@ ldapAuthentication:
     kind: panel.form
     name: ldapAuthenticationProvider
     label: LDAP Authentication Provider
+    method: POST
+    action: /xapi/siteConfig/batch
+    contentType: json
+    load: ?? XNAT.data.siteConfig
+    refresh: /xapi/siteConfig
     contents:
         ldapName:
             kind: panel.input.text
@@ -780,8 +703,7 @@ registrationOptions:
     label: Registration Options
     method: POST
     action: /xapi/siteConfig/batch
-    load:
-        lookup: XNAT.data.siteConfig
+    load: ?? XNAT.data.siteConfig
     contentType: json
     contents:
         requireLogin:
@@ -789,20 +711,17 @@ registrationOptions:
             id: requireLogin
             name: requireLogin
             label: "Require User?"
-            value: true
             disabled: true
         requireEmailVerificationToRegister:
             kind: panel.input.checkbox
             id: requireEmailVerificationToRegister
             name: emailVerification
             label: "Require Email Verification To Register?"
-            value: true
         emailVerificationMessage:
             kind: panel.textarea
             id: emailVerificationMessage
             name: emailVerificationMessage
             label: "Email Verification Message"
-            value: ""
         emailVerificationExpiration:
             kind: panel.input.number
             id: emailVerificationExpiration
@@ -813,71 +732,53 @@ registrationOptions:
             id: autoEnableUserRegistration
             name: userRegistration
             label: "Auto-enable User Registration?"
-            value: false
         allowUserCommentsOnRegistration:
             kind: panel.input.checkbox
             id: allowUserCommentsOnRegistration
             name: allowUserCommentsOnRegistration
             label: "Allow User Comments on Registration?"
-            value: true
         restrictUserListAccessToAdmins:
             kind: panel.input.checkbox
             id: restrictUserListAccessToAdmins
             name: restrictUserListAccessToAdmins
             label: "Restrict User List Access To Admins?"
-            value: true
-
-#dataReporting:
-#    kind: panel.form
-#    name: dataReporting
-#    label: Data Reporting
-#    contents:
-#        enableAdvancedSearch:
-#            kind: panel.input.checkbox
-#            id: enableAdvancedSearch
-#            name: enableAdvancedSearch
-#            label: "Enable Advanced Search"
-#            value: true
 
 manageDataTypes:
     kind: panel.form
     name: manageDataTypes
     label: Manage Data Types
     method: POST
-    action: /xapi/siteConfig/batch
-    load:
-        lookup: XNAT.data.siteConfig
     contentType: json
+    action: /xapi/siteConfig/batch
+    load: ?? XNAT.data.siteConfig
+    refresh: /xapi/siteConfig
     contents:
         displayNameForGenericImageSessionSingular:
             kind: panel.input.text
             id: displayNameForGenericImageSessionSingular
             name: displayNameForGenericImageSession.singular
             label: "Singular Display Name For Generic Image Session Singular"
-            value: "Session"
         displayNameForGenericImageSessionPlural:
             kind: panel.input.text
             id: displayNameForGenericImageSessionPlural
             name: displayNameForGenericImageSession.plural
             label: "Plural Display Name For Generic Image Session Singular"
-            value: "Sessions"
 
 anonymization:
     kind: panel.form
     name: Anonymization
     label: "Anonymization Script (Site Wide)"
     method: POST
-    action: /xapi/siteConfig/batch
-    load:
-        lookup: XNAT.data.siteConfig
     contentType: json
+    action: /xapi/siteConfig/batch
+    load: ?? XNAT.data.siteConfig
+    refresh: /xapi/siteConfig
     contents:
         enableSitewideAnonymizationScript:
             kind: panel.input.checkbox
             id: enableSitewideAnonymizationScript
             name: enableSitewideAnonymizationScript
             label: "Enable Site-wide Anonymization Script"
-            value: true
         editAnonymzationScript:
             kind: panel.textarea
             id: editAnonymzationScript
@@ -889,23 +790,21 @@ seriesImportFilter:
     name: seriesImportFilter
     label: "Series Import Filter"
     method: POST
-    action: /xapi/siteConfig/batch
-    load:
-        lookup: XNAT.data.siteConfig
     contentType: json
+    action: /xapi/siteConfig/batch
+    load: ?? XNAT.data.siteConfig
+    refresh: /xapi/siteConfig
     contents:
         enableSitewideSeriesImportFilter:
             kind: panel.input.checkbox
             id: enableSitewideSeriesImportFilter
             name: enableSitewideSeriesImportFilter
             label: "Enable Site-wide Series Import Filter"
-            value: false
         filterMode:
             kind: panel.input.checkbox
             id: filterMode
             name: filterMode
             label: Filter Mode
-            value: false
         seriesImportFilter:
             kind: panel.textarea
             id: seriesImportFilter
@@ -917,10 +816,10 @@ sessionUploadMethod:
     name: sessionUploadMethod
     label: "Session Upload Method"
     method: POST
-    action: /xapi/siteConfig/batch
-    load:
-        lookup: XNAT.data.siteConfig
     contentType: json
+    action: /xapi/siteConfig/batch
+    load: ?? XNAT.data.siteConfig
+    refresh: /xapi/siteConfig
     contents:
         selectUploadMethod:
             kind: panel.select.single
@@ -929,23 +828,21 @@ sessionUploadMethod:
             label: "Session Upload Method"
 #            options:                             # don't know where to populate this from
 #                http:
-#                    label: http
-#                    value: http
+#                    label: 
+#                    value: 
 #                https:
-#                    label: https
-#                    value: https
+#                    label: 
+#                    value: 
         showApplet:
             kind: panel.input.checkbox
             id: showApplet
             name: showApplet
             label: Show Applet
-            value: false
         enableProjectAppletScript:
             kind: panel.input.checkbox
             id: enableProjectAppletScript
             name: enableProjectAppletScript
             label: Enable Project Applet Script
-            value: false
         appletScript:
             kind: panel.textarea
             id: appletScript
@@ -962,24 +859,20 @@ sessionUploadMethod:
             name: sessionXmlRebuilderInterval
             label: Session Xml Rebuilder Interval
 
-
 dicomScpReceivers:
     kind: panel.form
     name: dicomScpReceivers
     label: DICOM SCP Receivers
     method: POST
     action: /xapi/dicomscp
-    load:
-        url: /xapi/dicomscp
-#        prop: # Not set, so should get the root object
     contentType: json
+    load: $? /xapi/dicomscp
     contents:
         enableDicomReceiver:
             kind: panel.input.checkbox
             id: enableDicomReceiver
             name: enableDicomReceiver
             label: DICOM Receiver Enabled?
-            value: true
             description: "Should the DICOM receiver listen for connections?"
         someInfo:
             tag: div.message
@@ -992,7 +885,6 @@ dicomScpReceivers:
             id: enableDicomReceiverPropertyChangedListener
             name: enableDicomReceiverPropertyChangedListener      #  Should this be "enableDicomReceiver.property.changed.listener"
             label: "Enable Dicom Receiver Property Changed Listener"
-            value: "org.nrg.dcm.DicomSCPSiteConfigurationListener"
         dicomHost:
             kind: panel.input.text
             id: dicomHost
@@ -1022,7 +914,6 @@ dicomScpReceivers:
             id: receivedFileUser
             name: receivedFileUser
             label: "Default DICOM Receiver: User"
-            value: admin
             description: "User account for default DICOM receiver"
             
 fileSystem:
@@ -1030,10 +921,9 @@ fileSystem:
     name: fileSystem
     label: File System
     method: POST
-    action: /xapi/siteConfig/batch
-    load:
-        lookup: XNAT.data.siteConfig
     contentType: json
+    action: /xapi/siteConfig/batch
+    load: ?? XNAT.data.siteConfig
     contents:
         ${archivePath}
         ${cachePath}
@@ -1048,30 +938,49 @@ misc:
     name: misc
     label: Miscellaneous
     method: POST
-    action: /xapi/siteConfig/batch
-    load:
-        lookup: XNAT.data.siteConfig
     contentType: json
+    action: /xapi/siteConfig/batch
+    load: ?? XNAT.data.siteConfig
+    refresh: /xapi/siteConfig
     contents:
         checksums:
             kind: panel.input.checkbox
             id: checksums
             name: checksums
             label: Checksums?
-            value: true
         checksumsPropertyChangedListener:
             kind: panel.input.text
             id: checksumsPropertyChangedListener
             name: checksums.property.changed.listener
             label: Checksums Property Changed Listener?
-            value: org.nrg.xnat.utils.ChecksumsSiteConfigurationListener
         scanTypeMapping:
             kind: panel.input.checkbox
             id: scanTypeMapping
             name: scanTypeMapping
             label: Scan Type Mapping?
-            value: true
-
+        development:
+            kind: panel.subhead
+            label: Development Utilities
+        spawner:
+            kind: panel.element
+            description: Manage spawner elements.
+            contents:
+                link:
+                    tag: a.link
+                    element:
+                        href: ./page/admin/spawner/
+                        target: _blank
+                        html: Manage The Spawner
+        swagger:
+            kind: panel.element
+            description: View the Swagger page.
+            contents:
+                link:
+                    tag: a.link
+                    element:
+                        href: ./xapi/swagger-ui.html/
+                        target: _blank
+                        html: Swagger
 development:
     kind: panel
     name: development
@@ -1172,13 +1081,6 @@ adminPage:
             group: manageAccess
             contents:
                 ${registrationOptions}
-#        dataReporting:
-#            kind: tab
-#            name: dataReporting
-#            label: Data Reporting
-#            group: manageData
-#            contents:
-#                ${dataReporting}
         manageDataTypes:
             kind: tab
             name: manageDataTypes
@@ -1240,7 +1142,6 @@ sitePaths:
 #        ${ftpPath}
 #        ${buildPath}
 #        ${pipelinePath}
-        ${dataFolders}
 initialSetup:
     kind: panel
     name: initialSetup
-- 
GitLab