diff --git a/src/main/java/org/nrg/xnat/initialization/RootConfig.java b/src/main/java/org/nrg/xnat/initialization/RootConfig.java index 5f3a9fffdb9f9dc297503c2b4c79ca4e2b6ccede..3a539cafb3ea77258db674618b10c66535386799 100644 --- a/src/main/java/org/nrg/xnat/initialization/RootConfig.java +++ b/src/main/java/org/nrg/xnat/initialization/RootConfig.java @@ -5,21 +5,22 @@ import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.PrettyPrinter; import com.fasterxml.jackson.core.util.DefaultIndenter; import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module; import org.nrg.framework.datacache.SerializerRegistry; import org.nrg.framework.exceptions.NrgServiceException; import org.nrg.framework.services.ContextService; import org.nrg.framework.services.SerializerService; -import org.nrg.framework.services.YamlObjectMapper; import org.nrg.prefs.beans.PreferenceBeanMixIn; import org.nrg.xdat.preferences.InitializerSiteConfiguration; import org.nrg.xdat.preferences.SiteConfigPreferences; import org.nrg.xnat.helpers.prearchive.PrearcConfig; -import org.springframework.context.annotation.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.ImportResource; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.xml.MarshallingHttpMessageConverter; import org.springframework.oxm.jaxb.Jaxb2Marshaller; @@ -65,6 +66,11 @@ public class RootConfig { }}; } + @Bean + public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(final Jackson2ObjectMapperBuilder builder) { + return new MappingJackson2HttpMessageConverter(builder.build()); + } + @Bean public Jackson2ObjectMapperBuilder objectMapperBuilder() { return new Jackson2ObjectMapperBuilder() @@ -83,11 +89,6 @@ public class RootConfig { return mixIns; } - @Bean - public YamlObjectMapper yamlObjectMapper() { - return new YamlObjectMapper(); - } - @Bean public MarshallingHttpMessageConverter marshallingMessageConverter() { return new MarshallingHttpMessageConverter( diff --git a/src/main/java/org/nrg/xnat/restlet/resources/PARList.java b/src/main/java/org/nrg/xnat/restlet/resources/PARList.java index 87a479efd62bc5d64519e37a7dfdd651f5ae1f38..75c27470940d3e10a86c953be5117486a66eeeff 100644 --- a/src/main/java/org/nrg/xnat/restlet/resources/PARList.java +++ b/src/main/java/org/nrg/xnat/restlet/resources/PARList.java @@ -10,15 +10,15 @@ */ package org.nrg.xnat.restlet.resources; -import org.nrg.xdat.security.helpers.Roles; import org.nrg.xft.XFTTable; import org.restlet.Context; -import org.restlet.data.MediaType; import org.restlet.data.Request; import org.restlet.data.Response; import org.restlet.data.Status; import org.restlet.resource.Representation; import org.restlet.resource.Variant; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.Hashtable; @@ -30,31 +30,27 @@ public class PARList extends SecureResource { public PARList(Context context, Request request, Response response) { super(context, request, response); getVariants().addAll(STANDARD_VARIANTS); - if (!Roles.isSiteAdmin(user)) { - response.setStatus(Status.CLIENT_ERROR_FORBIDDEN, "Only administrators can access the list of project access requests."); - } } @Override public Representation represent(Variant variant) { - XFTTable table = new XFTTable(); - Hashtable<String, Object> params = new Hashtable<String, Object>(); + Hashtable<String, Object> params = new Hashtable<>(); try { - table = XFTTable - .Execute( - "SELECT par.par_id,par.proj_id,par.level,par.create_date,u.login, u.firstname, u.lastname,p.secondary_id,p.name,p.id,SUBSTRING(p.description,0,300) as description,pi.firstname || ' ' || pi.lastname FROM xs_par_table par LEFT JOIN xnat_projectData p ON par.proj_id=p.id LEFT JOIN xnat_investigatordata pi ON p.pi_xnat_investigatordata_id=pi.xnat_investigatordata_id LEFT JOIN xdat_user u ON par.approver_id=u.xdat_user_id WHERE LOWER(par.email)='" - + user.getEmail().toLowerCase() - + "' AND approval_date IS NULL", user - .getDBName(), user.getLogin()); + final XFTTable table = XFTTable.Execute(String.format(PAR_QUERY, user.getEmail().toLowerCase()), user.getDBName(), user.getLogin()); + + if (table != null) { + params.put("totalRecords", table.size()); + } + + return representTable(table, overrideVariant(variant), params); } catch (Exception e) { - e.printStackTrace(); + getResponse().setStatus(Status.SERVER_ERROR_INTERNAL, "An error occurred attempting to access the project invitations."); + _log.error("An error occurred attempting to access the project invitations for user " + user.getLogin(), e); } - MediaType mt = overrideVariant(variant); - - if (table != null) - params.put("totalRecords", table.size()); - return representTable(table, mt, params); + return null; } -} + private static final Logger _log = LoggerFactory.getLogger(PARList.class); + private static final String PAR_QUERY = "SELECT par.par_id,par.proj_id,par.level,par.create_date,u.login, u.firstname, u.lastname,p.secondary_id,p.name,p.id,SUBSTRING(p.description,0,300) as description,pi.firstname || ' ' || pi.lastname FROM xs_par_table par LEFT JOIN xnat_projectData p ON par.proj_id=p.id LEFT JOIN xnat_investigatordata pi ON p.pi_xnat_investigatordata_id=pi.xnat_investigatordata_id LEFT JOIN xdat_user u ON par.approver_id=u.xdat_user_id WHERE LOWER(par.email)='%s' AND approval_date IS NULL"; +} \ No newline at end of file diff --git a/src/main/java/org/nrg/xnat/restlet/services/SettingsRestlet.java b/src/main/java/org/nrg/xnat/restlet/services/SettingsRestlet.java index 8b3470945c12998dbe9b4745022e937643a282fd..75477a76ee1e473a1b9e55537474b645637d44d9 100644 --- a/src/main/java/org/nrg/xnat/restlet/services/SettingsRestlet.java +++ b/src/main/java/org/nrg/xnat/restlet/services/SettingsRestlet.java @@ -12,6 +12,7 @@ package org.nrg.xnat.restlet.services; import org.apache.commons.lang3.StringUtils; import org.hibernate.PropertyNotFoundException; +import org.json.JSONObject; import org.nrg.config.entities.Configuration; import org.nrg.config.exceptions.ConfigServiceException; import org.nrg.dicomtools.filters.*; @@ -108,7 +109,7 @@ public class SettingsRestlet extends SecureResource { if (StringUtils.isBlank(_property)) { return mediaType == MediaType.TEXT_XML ? new ItemXMLRepresentation(_arcSpec.getItem(), mediaType) : - new StringRepresentation("{\"ResultSet\":{\"Result\":" + toJson(getArcSpecAsMap()) + ", \"title\": \"Settings\"}}"); + new StringRepresentation("{\"ResultSet\":{\"Result\":" + new JSONObject(getArcSpecAsMap()) + ", \"title\": \"Settings\"}}"); } else { if (!getArcSpecAsMap().containsKey(_property)) { throw new PropertyNotFoundException(String.format("Setting '%s' was not found in the system.", _property)); diff --git a/src/main/java/org/nrg/xnat/security/provider/XnatDatabaseAuthenticationProvider.java b/src/main/java/org/nrg/xnat/security/provider/XnatDatabaseAuthenticationProvider.java index ed43dced4e736e214850a880b8cf955ab34e94e4..085bd95ec7b211d353d970e14718a4bc54c5f811 100644 --- a/src/main/java/org/nrg/xnat/security/provider/XnatDatabaseAuthenticationProvider.java +++ b/src/main/java/org/nrg/xnat/security/provider/XnatDatabaseAuthenticationProvider.java @@ -10,6 +10,7 @@ */ package org.nrg.xnat.security.provider; +import org.nrg.xdat.XDAT; import org.nrg.xdat.services.XdatUserAuthService; import org.nrg.xft.db.PoolDBUtils; import org.nrg.xft.security.UserI; @@ -79,7 +80,7 @@ public class XnatDatabaseAuthenticationProvider extends DaoAuthenticationProvide throw new AuthenticationServiceException("User details class is not of a type I know how to handle: " + userDetails.getClass()); } final UserI xdatUserDetails = (UserI) userDetails; - if ((_requireEmailVerification && !xdatUserDetails.isVerified() && xdatUserDetails.isEnabled()) || !xdatUserDetails.isAccountNonLocked()) { + if ((XDAT.verificationOn() && !xdatUserDetails.isVerified() && xdatUserDetails.isEnabled()) || !xdatUserDetails.isAccountNonLocked()) { throw new CredentialsExpiredException("Attempted login to unverified or locked account: " + xdatUserDetails.getUsername()); } super.additionalAuthenticationChecks(userDetails, authentication); 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 3c139c300c4fd78d085bc1c31813713cebde1648..d9ae46d056acf18288a3bdd9b9ce3e46c41fd8d0 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 @@ -52,6 +52,7 @@ siteUrl: description: "" adminEmail: kind: panel.input.email + id: adminEmail name: adminEmail label: Site Administrator Email Address url: /xapi/siteConfig/adminEmail @@ -121,7 +122,8 @@ siteInfo: method: POST action: /xapi/siteConfig/batch load: - data: XNAT.data.siteConfig + lookup: XNAT.data.siteConfig + contentType: json contents: ${siteId} ${siteUrl} @@ -232,37 +234,49 @@ passwords: kind: panel.form name: passwords label: Passwords + method: POST + action: /xapi/siteConfig/batch + load: + lookup: XNAT.data.siteConfig + contentType: json contents: passwordComplexity: kind: panel.input.text id: passwordComplexity - name: security.password_complexity + name: passwordComplexity label: Password Complexity value: "^.*$" description: Must be a valid regular expression. passwordComplexityMessage: kind: panel.input.text id: passwordComplexityMessage - name: security.password_complexity_message + 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" passwordExpirationInterval: kind: panel.input.number id: passwordExpirationInterval - name: security.password_expiration_interval + name: passwordExpirationInterval label: Password Expiration (Interval) value: -1 description: "-1 to disable" passwordExpirationDate: kind: panel.input.text id: passwordExpirationDate - name: security.password_expiration_date + name: passwordExpirationDate label: Password Expiration (Date) description: Dates must be formatted MM/DD/YYYY passwordReuseRestriction: kind: panel.select.single id: passwordReuseRestriction - name: security.password_history + name: passwordReuseRestriction label: Password Reuse Restriction requireSaltedPasswords: kind: panel.input.checkbox @@ -325,7 +339,8 @@ emailServerSettings: url: /xapi/siteConfig # method: GET # defaults to GET if not set prop: smtpServer # which root property? gets the root object if not set -# data: XNAT.data.siteConfig.smtpServer +# lookup: XNAT.data.siteConfig.smtpServer + contentType: json name: emailServerSettings label: Mail Server Settings contents: @@ -465,7 +480,7 @@ notifications: kind: panel.input.email id: emailRecipientUpdate name: "Notifications:Update" - label: "Email Recipient: Update" + label: "Email Recipient: Updates" description: "What email address should receive update emails" notifyAdminSessionTransfer: kind: panel.input.checkbox @@ -730,6 +745,11 @@ fileSystem: kind: panel.form name: fileSystem label: File System + method: POST + action: /xapi/siteConfig/batch + load: + lookup: XNAT.data.siteConfig + contentType: json contents: ${archiveRootPath} ${cachePath} @@ -844,21 +864,22 @@ siteAdmin: group: advanced contents: ${fileSystem} + ${siteIdMain} ########################################### #### Initial Site Setup Admin Panels #### ########################################### siteIdMain: - kind: panel + kind: panel.form name: siteIdMain label: Site Identification contents: -# ${siteId} -# ${siteUrl} + ${siteId} + ${siteUrl} ${adminEmail} sitePaths: - kind: panel + kind: panel.form name: sitePaths label: Site Paths contents: diff --git a/src/main/webapp/scripts/xmodal-v1/xmodal.css b/src/main/webapp/scripts/xmodal-v1/xmodal.css index 32057f9b94e74485b849234e367127c0b756b8ec..9ad44b973e18834927d72bf9e1f824832e3208fa 100644 --- a/src/main/webapp/scripts/xmodal-v1/xmodal.css +++ b/src/main/webapp/scripts/xmodal-v1/xmodal.css @@ -4,55 +4,54 @@ /*html.noscroll { position: relative ; overflow-y: scroll ; width: 100% ; }*/ -body.xmodal-v1 { display: block !important ; overflow-y: scroll ; } /* the body will not disappear! */ +body.xmodal-v1, body.xmodal { display: block !important ; overflow-y: scroll ; } /* the body will not disappear! */ /*body.xmodal-v1.open { position: fixed !important ; overflow: hidden ; } *//* hold the page still while the xModal is open */ -div.xmodal-mask.v1 { display: none ; margin: auto ; position: fixed ; left: 0 ; top: 0 ; width: 100% ; height: 100% ; background: rgba(0,0,0,0.3) ; } -div.xmodal-mask.v1 { background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABhJREFUeNpiZGBg8GVAAkwMaICwAECAAQAUlABVw7mtDgAAAABJRU5ErkJggg==); } -/*div.xmodal-mask.v1.open { display: block ; z-index: 100 ; }*/ +div.xmodal-mask { display: none ; margin: auto ; position: fixed ; left: 0 ; top: 0 ; width: 100% ; height: 100% ; background: rgba(0,0,0,0.3) ; } +div.xmodal-mask { background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABhJREFUeNpiZGBg8GVAAkwMaICwAECAAQAUlABVw7mtDgAAAABJRU5ErkJggg==); } +/*div.xmodal-mask.open { display: block ; z-index: 100 ; }*/ -div.xmodal.v1 { +div.xmodal { display: none ; min-width: 200px ; min-height: 128px ; max-width: 98% ; max-height: 98% ; position: fixed ; top: 0 ; right: 0 ; bottom: 0 ; left: 0 ; margin: auto ; overflow: hidden ; background: #fff ; border: 1px solid #a0a0a0 ; box-shadow: 0 10px 30px rgba(0,0,0,0.5) ; font-family: Arial, Helvetica, sans-serif ; } -div.xmodal.v1.open { display: block; } +div.xmodal.open { display: block; } -div.xmodal.v1:focus { outline: 1px solid #808080; } +div.xmodal:focus { outline: 1px solid #808080; } -div.xmodal.v1.dialog { width: 600px ; height: 400px ; } +div.xmodal.dialog { width: 600px ; height: 400px ; } -div.xmodal.v1.loading { min-height: 80px; } +div.xmodal.loading { min-height: 80px; } -div.xmodal.v1.maxxed { +div.xmodal.maxxed { width: 98% !important; height: 98% !important; max-width: 98% !important; max-height: 98% !important; top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important; } -div.xmodal.v1 .button:hover, -div.xmodal.v1 .close:hover { cursor: pointer ; } +div.xmodal .button:hover, +div.xmodal .close:hover { cursor: pointer ; } -div.xmodal.v1 .buttons :focus { box-shadow: 0 0 5px rgba(0, 100, 200, 0.8); } +div.xmodal .buttons :focus { box-shadow: 0 0 5px rgba(0, 100, 200, 0.8); } -div.xmodal.v1 .title { - height: 25px ; padding: 0 ; overflow: hidden ; line-height: inherit ; - color: #303030 ; background: #f0f0f0 center center repeat-x ; border-bottom: 1px solid #c0c0c0 ; } -div.xmodal.v1 .title { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAkCAIAAAAhPwwfAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADBJREFUeNpi/PPnDwMMMDEgAYo5LP///yeZ8+/fP2JkyFFGDodiF5ARBhQHPECAAQDfTksARZ3oFgAAAABJRU5ErkJggg==); } -div.xmodal.v1 .title .inner { +div.xmodal .title { + height: 40px; padding: 0 ; overflow: hidden ; + color: #303030 ; background: #f0f0f0 ; border-bottom: 1px solid #e0e0e0 ; } +div.xmodal .title .inner { display: inline-block; padding-left: 10px ; overflow: hidden; white-space: nowrap; - font-size: 12px ; font-weight: bold ; line-height: 28px ; vertical-align: middle ; } -div.xmodal.v1 .title .inner > i { color: #505050; font-weight: normal; font-style: normal; } -div.xmodal.v1 .title .close, -div.xmodal.v1 .title .maximize { + font-size: 15px ; font-weight: normal ; line-height: 42px ; vertical-align: middle ; } +div.xmodal .title .inner > i { color: #505050; font-weight: normal; font-style: normal; } +div.xmodal .title .close, +div.xmodal .title .maximize { width: 24px; height: 16px; margin: 0; padding: 0; position: absolute ; top: 4px ; right: 4px ; font-size: 16px ; font-weight: bold ; text-align: center; line-height: 17px; color: #606060 ; background: #f8f8f8 ; border: 1px solid #b0b0b0 ; border-radius: 2px; } -div.xmodal.v1 .title .maximize { right: 34px; line-height: 10px; } -div.xmodal.v1 .title .maximize:hover { cursor: pointer; } +div.xmodal .title .maximize { right: 34px; line-height: 10px; } +div.xmodal .title .maximize:hover { cursor: pointer; } /* base64 close-yui.gif */ /*div.xmodal .title .close {*/ @@ -60,49 +59,47 @@ div.xmodal.v1 .title .maximize:hover { cursor: pointer; } /*background-image: url(data:image/gif;base64,R0lGODlhGQAPALMJALGxsZ2dnezs7HNzc21tbYWFhfX19cHBwf///////wAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAkALAAAAAAZAA8AAAROMJ1Jq71Tos27/9sEjqMIAgZnAOVxEkVqFAT7md4MC3QM4jnaAJb6uUaC4UBAAnZ0Q58RpCvwiNNPAKsLZHOBIsIQ/pLOCCf6J8G4MYkIADs=);*/ /*}*/ -div.xmodal.v1 .body { width: 100% ; height: 100% ; position: absolute ; overflow: hidden ; } -div.xmodal.v1 .body.scroll { overflow-y: auto ; } -div.xmodal.v1 .body .inner { display: none ; padding: 20px ; font-size: 13px ; line-height: 17px ; } -div.xmodal.v1.nopad .body .inner { padding: 0 ; } -div.xmodal.v1.open .body .inner { display: block ; } -div.xmodal.v1 .body h1, -div.xmodal.v1 .body h2, -div.xmodal.v1 .body h3, -div.xmodal.v1 .body h4 { margin-bottom: 1em !important; } -div.xmodal.v1 .body p { margin: 0 0 1em ; } - -div.xmodal.v1 .footer { - display: block ; width: 100% ; /*height: 52px ;*/ margin-top: -1px ; padding: 0 ; +div.xmodal .body { width: 100% ; height: 100% ; position: absolute ; overflow: hidden ; } +div.xmodal .body.scroll { overflow-y: auto ; } +div.xmodal .body .inner { display: none ; padding: 20px ; font-size: 13px ; line-height: 17px ; } +div.xmodal.nopad .body .inner { padding: 0 ; } +div.xmodal.open .body .inner { display: block ; } +div.xmodal .body h1, +div.xmodal .body h2, +div.xmodal .body h3, +div.xmodal .body h4 { margin-bottom: 1em !important; } +div.xmodal .body p { margin: 0 0 1em ; } + +div.xmodal .footer { + display: block ; width: 100% ; height: 60px ; margin-top: -1px ; padding: 0 ; position: absolute ; bottom: 0 ; background: #f0f0f0; border-top: 1px solid #e0e0e0 ; overflow: hidden ; } -div.xmodal.v1 .footer.white { background: #fff ; border-top-color: #fff ; } -div.xmodal.v1 .footer .inner { display: table ; width: 100% ; height: 100% ; position: relative ; } -div.xmodal.v1 .footer .content { display: table-cell ; padding-left: 15px ; vertical-align: middle ; text-align: left ; } -div.xmodal.v1 .footer .buttons { display: table-cell ; padding-right: 15px ; vertical-align: middle ; text-align: right ; } -div.xmodal.v1 .footer .buttons .link { display: inline-block; padding: 10px; font-size: 13px; text-decoration: underline; } -div.xmodal.v1 .footer .button { +div.xmodal .footer.white { background: #fff ; border-top-color: #fff ; } +div.xmodal .footer .inner { display: table ; width: 100% ; height: 100% ; position: relative ; } +div.xmodal .footer .content { display: table-cell ; padding-left: 15px ; vertical-align: middle ; text-align: left ; } +div.xmodal .footer .buttons { display: table-cell ; padding-right: 15px ; vertical-align: middle ; text-align: right ; } +div.xmodal .footer .buttons .link { display: inline-block; padding: 10px; font-size: 13px; text-decoration: underline; } +div.xmodal .footer .button { display: inline-block ; margin-left: 10px ; padding: 1px 15px !important ; float: right ; line-height: 23px ; vertical-align: middle ; font-size: 13px ; font-weight: bold ; text-decoration: none !important ; } -div.xmodal.v1 .footer a.button { height: 24px ; line-height: 24px; } /* set height only for <a> buttons */ -div.xmodal.v1 .footer .button, -div.xmodal.v1 .footer .button.cancel.default { - color: #303030 ; background: #e0e0e0 center center repeat-x ; border: 1px solid #a0a0a0 ; border-radius: 3px ; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAeCAIAAACE3ijUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADlJREFUeNpi/P//PwMMMDEgAYo5LP/+/SOG8+fPHxwyf//+xcFB0YNbGW49uO3B7VAUZVQNN4AAAwDARzjNaWlUCgAAAABJRU5ErkJggg==); } -div.xmodal.v1 .footer .button:active, -div.xmodal.v1 .footer .button.cancel.default:active { color: inherit ; background: #d0d0d0 } -div.xmodal.v1 .footer .button.default { font-weight: bold ; color: #fff ; background: #07428d center top repeat-x ; border-color: #293d66 ; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAeCAIAAACE3ijUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFJJREFUeNqMzsENwDAIA0BH6nrdKbt1rGLTfiqcRyr4nWwB45wXvjmUKND0QoWgJeG14Lb2kxjuXm3ZtvxG7r6WaPAFqXCwA2QTdgdITwqPAAMAHoRQTInXYu8AAAAASUVORK5CYII=); } -div.xmodal.v1 .footer .button.default:active { background: #084FAB ; border-color: #243356 ; } -div.xmodal.v1 .footer .button.hidden, -div.xmodal.v1 .footer .button.disabled { /*display: inline-block ;*/ color: #f0f0f0 ; background: #d0d0d0 ; border-color: #c0c0c0 ; } -div.xmodal.v1 .footer .button.hidden:hover, -div.xmodal.v1 .footer .button.disabled:hover { cursor: not-allowed !important ; background: #d0d0d0 ; } - -div.xmodal.v1.loading .title .close { display: none ; } -div.xmodal.v1.loading .body .inner { text-align: center ; } - -.ie8 body div.xmodal.v1 .footer .button { /* margin: 10px ; */ padding: 3px 6px ; } -.ie9 body div.xmodal.v1 .footer .button { /* margin: 12px ; */ padding: 4px 6px 3px ; } +div.xmodal .footer a.button { height: 24px ; line-height: 24px; } /* set height only for <a> buttons */ +div.xmodal .footer .button, +div.xmodal .footer .button.cancel.default { + color: #303030 ; background: #e0e0e0 center center repeat-x ; border: 1px solid #a0a0a0 ; border-radius: 3px ; } +div.xmodal .footer .button:active, +div.xmodal .footer .button.cancel.default:active { color: inherit ; background: #d0d0d0 } +div.xmodal .footer .button.default { font-weight: bold ; color: #fff ; background: #07428d center top repeat-x ; border-color: #293d66 ; } +div.xmodal .footer .button.default:active { background: #084FAB ; border-color: #243356 ; } +div.xmodal .footer .button.hidden, +div.xmodal .footer .button.disabled { /*display: inline-block ;*/ color: #f0f0f0 ; background: #d0d0d0 ; border-color: #c0c0c0 ; } +div.xmodal .footer .button.hidden:hover, +div.xmodal .footer .button.disabled:hover { cursor: not-allowed !important ; background: #d0d0d0 ; } + +div.xmodal.loading .title .close { display: none ; } +div.xmodal.loading .body .inner { text-align: center ; } + +.ie8 body div.xmodal .footer .button { /* margin: 10px ; */ padding: 3px 6px ; } +.ie9 body div.xmodal .footer .button { /* margin: 12px ; */ padding: 4px 6px 3px ; } .modal_content, .modal_template { display: none ; } @@ -115,4 +112,4 @@ for db.humanconnectome.org /* custom form styles from HCP didn't work for core XNAT */ -div.xmodal.v1.embedded { top: 0; left: 0; border: none; box-shadow: none; display: block; z-index: auto; } +div.xmodal.embedded { top: 0; left: 0; border: none; box-shadow: none; display: block; z-index: auto; } diff --git a/src/main/webapp/scripts/xnat/ui/panel.js b/src/main/webapp/scripts/xnat/ui/panel.js index 4f5a6b92d164f9aee5c3a825615f583247adce97..561bb6e5ac91bb333f43cc60c1c75151bbc37828 100644 --- a/src/main/webapp/scripts/xnat/ui/panel.js +++ b/src/main/webapp/scripts/xnat/ui/panel.js @@ -91,7 +91,7 @@ var XNAT = getObject(XNAT || {}); _formPanel = spawn('form.xnat-form-panel.panel.panel-default', { method: opts.method || 'POST', - action: opts.action || '#' + action: XNAT.url.rootUrl(opts.action || '') || '#' }, [ ['div.panel-heading', [ ['h3.panel-title', opts.title || opts.label] diff --git a/src/main/webapp/scripts/xnat/url.js b/src/main/webapp/scripts/xnat/url.js index 091237f86566542e1305404e4e58cc21d14c3d9f..54bb44f7946e964915fdd76bd376551df800e0c1 100644 --- a/src/main/webapp/scripts/xnat/url.js +++ b/src/main/webapp/scripts/xnat/url.js @@ -46,7 +46,7 @@ var XNAT = getObject(XNAT||{}); // make sure the serverRoot string (and only ONE serverRoot string) // is at the beginning of a url function rootUrl(url){ - return fixRoot((window.serverRoot || XNAT.serverRoot || ''), url || ''); + return fixRoot((window.serverRoot || XNAT.serverRoot || ''), url) } url.rootUrl = rootUrl;