diff --git a/src/main/webapp/page/admin/plugins/content.jsp b/src/main/webapp/page/admin/plugins/content.jsp new file mode 100755 index 0000000000000000000000000000000000000000..c9e1fac5839dac0f1a2f95d0dfd2769aeeb2b0b4 --- /dev/null +++ b/src/main/webapp/page/admin/plugins/content.jsp @@ -0,0 +1,103 @@ +<%@ page session="true" contentType="text/html" pageEncoding="UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="pg" tagdir="/WEB-INF/tags/page" %> + +<%-- + ~ web: content.jsp + ~ XNAT http://www.xnat.org + ~ Copyright (c) 2016, Washington University School of Medicine and Howard Hughes Medical Institute + ~ All Rights Reserved + ~ + ~ Released under the Simplified BSD. + --%> + +<c:set var="redirect"> + <div class="error">Not authorized. Redirecting...</div> + <script> window.location.href = XNAT.url.rootUrl('/') </script> +</c:set> + +<pg:restricted msg="${redirect}"> + + <div id="page-body"> + <div class="pad"> + + <div id="admin-page"> + <header id="content-header"> + <h2 class="pull-left">Plugin Settings</h2> + <div class="clearfix"></div> + </header> + + <!-- Plugin Settings tab container --> + <div id="plugin-settings-tabs"> + + <div class="content-tabs xnat-tab-container"> + + <%-- + <div class="xnat-nav-tabs side pull-left"> + <!-- ================== --> + <!-- Admin tab flippers --> + <!-- ================== --> + </div> + <div class="xnat-tab-content side pull-right"> + <!-- ================== --> + <!-- Admin tab panes --> + <!-- ================== --> + </div> + --%> + + </div> + + </div> + + <c:import url="/xapi/plugins" var="plugins"/> + + <script> + (function(){ + + XNAT.xapi = getObject(XNAT.xapi); + + <c:if test="${not empty plugins}"> + XNAT.xapi.plugins = ${plugins}; + XNAT.data['/xapi/plugins'] = XNAT.xapi.plugins; + </c:if> + + XNAT.data = extend(true, { + plugins: XNAT.xapi.plugins + }, XNAT.data||{}); + + // these properties MUST be set before spawning 'tabs' widgets + XNAT.tabs.container = $('#plugin-settings-tabs').find('div.content-tabs'); + XNAT.tabs.layout = 'left'; + + function pluginTabs(name){ + var tabSpawn = XNAT.spawner.resolve(name + '/siteSettings'); + tabSpawn.render(XNAT.tabs.container, 200) + .fail(function(){ + console.log('"' + name + '" site settings tabs not found'); + }); + return tabSpawn; + } + + // try to get plugin tab Spawner objects + // from url: + // /xapi/spawner/resolve/pluginName/siteSettings + forOwn(XNAT.xapi.plugins, function(name, obj){ + // first try to load admin js file at + // /scripts/xnat-plugins/pluginName/admin.js + //loadjs(XNAT.url.rootUrl('/scripts/xnat-plugins/' + name + '/admin.js'), name); + pluginTabs(name); + }); + + })(); + </script> + + </div> + + </div> + </div> + <!-- /#page-body --> + + <div id="xnat-scripts"></div> + +</pg:restricted> + diff --git a/src/main/webapp/page/admin/plugins/index.jsp b/src/main/webapp/page/admin/plugins/index.jsp new file mode 100644 index 0000000000000000000000000000000000000000..4ed945e8cbf7840adf529fd69954edf71a4debd4 --- /dev/null +++ b/src/main/webapp/page/admin/plugins/index.jsp @@ -0,0 +1,20 @@ +<%@ page session="true" contentType="text/html" pageEncoding="UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="pg" tagdir="/WEB-INF/tags/page" %> + +<%-- + ~ web: index.jsp + ~ XNAT http://www.xnat.org + ~ Copyright (c) 2016, Washington University School of Medicine and Howard Hughes Medical Institute + ~ All Rights Reserved + ~ + ~ Released under the Simplified BSD. + --%> + +<pg:wrapper> + <pg:xnat> + + <jsp:include page="content.jsp"/> + + </pg:xnat> +</pg:wrapper> diff --git a/src/main/webapp/page/content.jsp b/src/main/webapp/page/content.jsp index 9994de235c39995e68bad10c44bc872c46b2ff26..d60e848cf43461941d940bf66714a213c4cade5c 100755 --- a/src/main/webapp/page/content.jsp +++ b/src/main/webapp/page/content.jsp @@ -21,7 +21,7 @@ <div id="page-wrapper"> <div class="pad"> - <div id="page-content">loading...</div> + <div id="page-content"></div> </div> </div> @@ -29,13 +29,13 @@ (function(){ var customPage = XNAT.app.customPage; - var $pageContent = $('#page-content'); + var $pageContent = $('#page-content').html('loading...'); - customPage.getPage(['', '/#'], $pageContent); + customPage.getPage(null, $pageContent); -// window.onhashchange = function(){ -// customPage.getPage('', $pageContent); -// } + // window.onhashchange = function(){ + // customPage.getPage('', $pageContent); + // } })(); </script> diff --git a/src/main/webapp/scripts/globals.js b/src/main/webapp/scripts/globals.js index 4301f3c2cf891cd8981b130f05186c326eab2c76..f5748d4c99b7f0b0f3e2923af1accd999404867c 100644 --- a/src/main/webapp/scripts/globals.js +++ b/src/main/webapp/scripts/globals.js @@ -1209,7 +1209,7 @@ function writeCSS( href ){ function loadCSS( url, parent ){ // use CSS-style selector for 'parent' parent = parent ? document.querySelector(parent) : document.querySelector('head'); - parent.appendChild(scriptElement(url, min, name)); + parent.appendChild(cssElement(url)); } // basic indentation formatting only @@ -1243,8 +1243,14 @@ function prettifyJSON(data, indent) { // call 'test' at 'interval' until it returns true // then execute 'callback' -- basic but useful function waitForIt(interval, test, callback){ + var _test = test; + if (typeof test !== 'function') { + _test = function(){ + return !!test + } + } var waiting = setInterval(function(){ - if (test()) { + if (_test()) { var called = callback(); clearInterval(waiting); return called; diff --git a/src/main/webapp/scripts/xnat/admin/pluginSettings.js b/src/main/webapp/scripts/xnat/admin/pluginSettings.js new file mode 100644 index 0000000000000000000000000000000000000000..fe547b20193fde0e3329447b7535eea8abfc58be --- /dev/null +++ b/src/main/webapp/scripts/xnat/admin/pluginSettings.js @@ -0,0 +1,89 @@ +/*! + * Plugin site settings functions + */ + +var XNAT = getObject(XNAT); + +(function(factory){ + if (typeof define === 'function' && define.amd) { + define(factory); + } + else if (typeof exports === 'object') { + module.exports = factory(); + } + else { + return factory(); + } +}(function(){ + + var pluginSettings; + + XNAT.admin = + getObject(XNAT.admin); + + XNAT.admin.pluginSettings = pluginSettings = + getObject(XNAT.admin.pluginSettings); + + pluginSettings.check = function(){ + + return XNAT.xhr.get(XNAT.url.restUrl('/xapi/plugins'), function(plugins){ + + console.log('/xapi/plugins response:'); + console.log(plugins); + + var showMenuItem = false; + + if (!isEmpty(plugins)) { + + // calling forOwn() returns the key names + var pluginNames = forOwn(plugins); + + console.log('plugin names:'); + console.log(pluginNames); + + var setPaths = function(names){ + var paths = []; + [].concat(names).forEach(function(name){ + paths.push(name + '/siteSettings'); + // paths.push(name + '/admin'); + }); + return paths; + }; + + var pluginSettingsPaths = setPaths(pluginNames); + + function getPluginSpawnerElements(path){ + var _url = XNAT.url.restUrl('/xapi/spawner/resolve/' + path); + return XNAT.xhr.get(_url); + } + + function lookForSettings(i) { + if (showMenuItem || i === pluginSettingsPaths.length){ + // console.log("couldn't do it"); + return false; + } + // recursively try to get settings at different places + getPluginSpawnerElements(pluginSettingsPaths[i]) + .done(function(){ + showMenuItem = true; + $('#view-plugin-settings').removeClass('hidden'); + }) + .fail(function(){ + lookForSettings(++i) + }); + } + + // do the stuff + lookForSettings(0); + + } + + }); + }; + + // call it. + pluginSettings.check(); + + XNAT.admin.pluginSettings = pluginSettings; + +})); diff --git a/src/main/webapp/scripts/xnat/spawner.js b/src/main/webapp/scripts/xnat/spawner.js index 5bb3765420f4391d2e3559f7f1fe6f342de00f73..e8c661fe7f111dcd57b7c830b3f524913ae5f145 100644 --- a/src/main/webapp/scripts/xnat/spawner.js +++ b/src/main/webapp/scripts/xnat/spawner.js @@ -344,8 +344,6 @@ var XNAT = getObject(XNAT); // you can pass a config object as the only argument opts = cloneObject(firstDefined(opts, getObject(nsPath))); - console.log(opts); - var url = opts.url || XNAT.url.restUrl('/xapi/spawner/resolve/' + nsPath); var request = XNAT.xhr.getJSON(extend(true, { diff --git a/src/main/webapp/scripts/xnat/ui/panel.js b/src/main/webapp/scripts/xnat/ui/panel.js index b72e956e36b2a65e0e249d78e5df400ddb552737..07fa28f9a92bf7ae1db4772e44d48c39f7678255 100644 --- a/src/main/webapp/scripts/xnat/ui/panel.js +++ b/src/main/webapp/scripts/xnat/ui/panel.js @@ -560,7 +560,12 @@ var XNAT = getObject(XNAT || {}); // ajaxConfig.data = JSON.stringify(form2js(this, /[:\[\]]/)); ajaxConfig.data = JSON.stringify(form2js(inputs, ':', false)); ajaxConfig.processData = false; - ajaxConfig.contentType = 'application/json'; + if (opts.contentType === 'text/json') { + ajaxConfig.contentType = opts.contentType; + } + else { + ajaxConfig.contentType = 'application/json'; + } //$.ajax(ajaxConfig); // XNAT.xhr.form($form, ajaxConfig); } diff --git a/src/main/webapp/scripts/xnat/ui/select.js b/src/main/webapp/scripts/xnat/ui/select.js index ef8ef9d84d4d47e9f7aba84acad6ce0adc72bd81..4da84d3607a1b7557af70057ba1cfd52bc109d3d 100644 --- a/src/main/webapp/scripts/xnat/ui/select.js +++ b/src/main/webapp/scripts/xnat/ui/select.js @@ -34,12 +34,24 @@ var XNAT = getObject(XNAT); // as methods and properties to the function select = getObject(XNAT.ui.select || {}); - function addOption(el, opt){ - el.appendChild(spawn('option', extend(true, { - value: opt.value !== undefined ? opt.value : '', - html: opt.html || opt.text || opt.label || opt.value, - selected: opt.selected || false - }, opt.element ))); + function addOption(el, opt, sel){ + var val, txt; + if (typeof opt === 'string') { + val = opt; + txt = opt; + } + else { + val = opt.value !== undefined ? opt.value : ''; + txt = opt.html || opt.text || opt.label || val; + } + var option = spawn('option', extend(true, { + value: val, + html: txt, + selected: val === sel || [].concat(sel).indexOf(val) > -1 || opt.selected || false + }, opt.element, { + //selected: val === sel || [].concat(sel).indexOf(val) > -1 || opt.selected || false + })); + el.appendChild(option); } // generate JUST the options @@ -62,7 +74,7 @@ var XNAT = getObject(XNAT); select.menu = function(config){ var frag = document.createDocumentFragment(), - menu, label; + $menu, menu, label; config = cloneObject(config); @@ -71,22 +83,24 @@ var XNAT = getObject(XNAT); config.id = config.id || toDashed(config.name) || randomID('menu-', false); config.name = config.name || ''; + config.value = config.value !== undefined ? config.value : ''; config.element = extend(true, { id: config.id, name: config.name, - value: config.value !== undefined ? config.value : '', + value: config.value, title: config.title || '' }, config.element); - menu = spawn('select', config.element); + $menu = $.spawn('select', config.element); + menu = $menu[0]; addOption(menu, { html: 'Select' }); if (config.options){ if (Array.isArray(config.options)) { forEach(config.options, function(opt){ - addOption(menu, opt); + addOption(menu, opt, config.value); }) } else { @@ -99,14 +113,15 @@ var XNAT = getObject(XNAT); else { opt = txt; } - addOption(menu, opt); + addOption(menu, opt, config.value); }); } } // force menu change event to select 'selected' option - $(menu).change(); - + $menu.changeVal(config.value); + // $menu.find('[value="' + config.value + '"]').prop('selected', true); + // if there's no label, wrap the // <select> inside a <label> element if (!config.label) { diff --git a/src/main/webapp/scripts/xnat/ui/tabs.js b/src/main/webapp/scripts/xnat/ui/tabs.js index 2305742c9dde8fa4c1a51bb0cc51762f14aad204..9542a5ccafa30ad0d35b4a80c8f3cd8dbf24a0e1 100755 --- a/src/main/webapp/scripts/xnat/ui/tabs.js +++ b/src/main/webapp/scripts/xnat/ui/tabs.js @@ -50,6 +50,8 @@ var XNAT = getObject(XNAT || {}); tab.group = function(obj){ var id = toDashed(obj.id || obj.name); if (!id) return; // a tab group MUST have an id + // return if the group already exists + if ($('ul#' + id + '.nav.tab-group').length) return; return spawn('ul.nav.tab-group', { id: id }, [ ['li.label', (obj.label || obj.title || obj.text || 'Tab Group')] ]); @@ -194,24 +196,23 @@ var XNAT = getObject(XNAT || {}); // use existing tabs if already present if ($container.find(NAV_TABS).length) { - navTabs = $container.find(NAV_TABS)[0] + $navTabs = $container.find(NAV_TABS); } else { - navTabs = spawn(NAV_TABS); - $container.append(navTabs); + $navTabs = $.spawn(NAV_TABS); + $container.append($navTabs); } + navTabs = $navTabs[0]; // use existing content container if already present if ($container.find(TAB_CONTENT).length) { - tabContent = $container.find(TAB_CONTENT)[0]; + $tabContent = $container.find(TAB_CONTENT); } else { - tabContent = spawn(TAB_CONTENT); - $container.append(tabContent); + $tabContent = $.spawn(TAB_CONTENT); + $container.append($tabContent); } - - $navTabs = $(navTabs); - $tabContent = $(tabContent); + tabContent = $tabContent[0]; layout = obj.layout || tabs.layout || 'left'; diff --git a/src/main/webapp/scripts/xnat/xhr.js b/src/main/webapp/scripts/xnat/xhr.js index 734219592e9cfaf93b25789ef93954a3399268bc..5f3754f454586e43ae23df97e3831e790f828e41 100755 --- a/src/main/webapp/scripts/xnat/xhr.js +++ b/src/main/webapp/scripts/xnat/xhr.js @@ -593,11 +593,19 @@ var XNAT = getObject(XNAT||{}), var inputs = $inputs.toArray(); if (/POST|PUT/i.test(opts.method)) { + if ($form.hasAnyClass('json-text text-json')) { + opts.contentType = 'text/json'; + } if ($form.hasClass('json') || /json/i.test(opts.contentType||'')){ // opts.data = formToJSON($form, true); opts.data = JSON.stringify(form2js(inputs, opts.delimiter||opts.delim||':', false)); opts.processData = false; - opts.contentType = 'application/json'; + if (opts.contentType === 'text/json') { + opts.contentType = 'text/plain'; + } + else { + opts.contentType = 'application/json'; + } } else { opts.data = $form.find(':input').not('.ignore').serialize(); diff --git a/src/main/webapp/xnat-templates/screens/topBar/Administer/Automation.vm b/src/main/webapp/xnat-templates/screens/topBar/Administer/Automation.vm new file mode 100644 index 0000000000000000000000000000000000000000..1396e02fbcbb15c3cffa7bee9246b9d62729a115 --- /dev/null +++ b/src/main/webapp/xnat-templates/screens/topBar/Administer/Automation.vm @@ -0,0 +1,3 @@ +<!-- Sequence: 80 --> + +<li><a href="${SITE_ROOT}/app/template/Scripts.vm">Automation</a></li> diff --git a/src/main/webapp/xnat-templates/screens/topBar/Administer/DataTypes.vm b/src/main/webapp/xnat-templates/screens/topBar/Administer/DataTypes.vm new file mode 100644 index 0000000000000000000000000000000000000000..61664a8a2a727664bdfe8e8732c1da746d1dd2e3 --- /dev/null +++ b/src/main/webapp/xnat-templates/screens/topBar/Administer/DataTypes.vm @@ -0,0 +1,3 @@ +<!-- Sequence: 50 --> + +<li><a href="${SITE_ROOT}/app/template/XDATScreen_dataTypes.vm">Data Types</a></li> diff --git a/src/main/webapp/xnat-templates/screens/topBar/Administer/Default.vm b/src/main/webapp/xnat-templates/screens/topBar/Administer/Default.vm index 68db2d8eafd0818fd69fb4611def0ee025ef3baf..5757cb5dcf47f478cc1f2a585cd016696990fcd1 100644 --- a/src/main/webapp/xnat-templates/screens/topBar/Administer/Default.vm +++ b/src/main/webapp/xnat-templates/screens/topBar/Administer/Default.vm @@ -1,10 +1,82 @@ <!-- Sequence: 10 --> -##<li><a href="/page/admin/">Site Administration</a></li> -<li><a href="${SITE_ROOT}/app/template/Page.vm?view=admin">Site Administration</a></li> -<li><a href="$link.setPage("XDATScreen_admin.vm")">Users</a></li> -<li><a href="$link.setPage("XDATScreen_groups.vm")">Groups</a></li> -<li><a href="$link.setPage("XDATScreen_dataTypes.vm")">Data Types</a></li> -<li><a href="$link.setPage("XDATScreen_email.vm")">Email</a></li> -<li><a href="$link.setPage("XDATScreen_manage_pipeline.vm")">Pipelines</a></li> -<li><a href="$link.setPage("Scripts.vm")">Automation</a></li> -<li><a href="$link.setPage("XDATScreen_admin_options.vm")">More...</a></li> + +<!-- xnat-templates/screens/topBar/Administer/Default.vm --> + +####<li><a href="/page/admin/">Site Administration</a></li> +##<li><a href="${SITE_ROOT}/app/template/Page.vm?view=admin">Site Administration</a></li> +##<li id="view-plugin-settings" class="hidden"><a href="${SITE_ROOT}/app/template/Page.vm?view=admin/plugins">Plugin Settings</a></li> +##<li><a href="$link.setPage("XDATScreen_admin.vm")">Users</a></li> +##<li><a href="$link.setPage("XDATScreen_groups.vm")">Groups</a></li> +##<li><a href="$link.setPage("XDATScreen_dataTypes.vm")">Data Types</a></li> +##<li><a href="$link.setPage("XDATScreen_email.vm")">Email</a></li> +##<li><a href="$link.setPage("XDATScreen_manage_pipeline.vm")">Pipelines</a></li> +##<li><a href="$link.setPage("Scripts.vm")">Automation</a></li> +##<li><a href="$link.setPage("XDATScreen_admin_options.vm")">More...</a></li> +## +##<script src="${SITE_ROOT}/scripts/xnat/admin/pluginSettings.js"></script> +## +##<script> +## XNAT.xhr.get(XNAT.url.restUrl('/xapi/plugins'), function(plugins){ +## +## console.log('/xapi/plugins response'); +## console.log(plugins); +## +## var hideMenuItem = true; +## +## if (!isEmpty(plugins)) { +## +## var setPaths = function(names){ +## var paths = []; +## [].concat(names).forEach(function(name){ +## paths.push(name + '/siteSettings'); +## paths.push(name + '/admin'); +## }); +## return paths; +## }; +## +## // calling forOwn() returns the key names +## var pluginNames = forOwn(plugins); +## var pluginSettingsPaths = setPaths(pluginNames); +## +## function getPluginSpawnerElements(path){ +## var _url = XNAT.url.restUrl('/xapi/spawner/resolve/' + path) +## return XNAT.xhr.get(_url); +## } +## +## function lookForSettings(i) { +## if (i === pluginSettingsPaths.length){ +## // console.log("couldn't do it"); +## return false; +## } +## // recursively try to get settings at different places +## getPluginSpawnerElements(pluginSettingsPaths[i]) +## .done(function(){ +## $('#view-plugin-settings').removeClass('hidden'); +## }) +## .fail(function(){ +## lookForSettings(++i) +## }); +## } +## +## // do the stuff +## lookForSettings(0); +## +##// forOwn(plugins, function(name, obj){ +##// if (hideMenuItem) return; +##// getPluginSpawnerElements(name + '/siteSettings') +##// .done(function(){ +##// showMenuItem = true; +##// $('#view-plugin-settings').removeClass('hidden'); +##// }) +##// .fail(function(){ +##// getPluginSpawnerElements(name + '/admin') +##// .done(function(){ +##// showMenuItem = true; +##// $('#view-plugin-settings').removeClass('hidden'); +##// }) +##// }); +##// }); +## } +## +## }); +##</script> \ No newline at end of file diff --git a/src/main/webapp/xnat-templates/screens/topBar/Administer/Email.vm b/src/main/webapp/xnat-templates/screens/topBar/Administer/Email.vm new file mode 100644 index 0000000000000000000000000000000000000000..10d03d5979f4dcd039c7e40b5d063d1986201ea5 --- /dev/null +++ b/src/main/webapp/xnat-templates/screens/topBar/Administer/Email.vm @@ -0,0 +1,3 @@ +<!-- Sequence: 60 --> + +<li><a href="${SITE_ROOT}/app/template/XDATScreen_email.vm">Email</a></li> diff --git a/src/main/webapp/xnat-templates/screens/topBar/Administer/Groups.vm b/src/main/webapp/xnat-templates/screens/topBar/Administer/Groups.vm new file mode 100644 index 0000000000000000000000000000000000000000..0886e2dd9f9b72e355972cc1bb02a5ac62d53945 --- /dev/null +++ b/src/main/webapp/xnat-templates/screens/topBar/Administer/Groups.vm @@ -0,0 +1,3 @@ +<!-- Sequence: 40 --> + +<li><a href="${SITE_ROOT}/app/template/XDATScreen_groups.vm">Groups</a></li> diff --git a/src/main/webapp/xnat-templates/screens/topBar/Administer/More.vm b/src/main/webapp/xnat-templates/screens/topBar/Administer/More.vm new file mode 100644 index 0000000000000000000000000000000000000000..a7af17941e0bd2fe8a7d01b25ca4796f7dcea7bf --- /dev/null +++ b/src/main/webapp/xnat-templates/screens/topBar/Administer/More.vm @@ -0,0 +1,3 @@ +<!-- Sequence: 90 --> + +<li><a href="${SITE_ROOT}/app/template/XDATScreen_admin_options.vm">More...</a></li> diff --git a/src/main/webapp/xnat-templates/screens/topBar/Administer/Pipelines.vm b/src/main/webapp/xnat-templates/screens/topBar/Administer/Pipelines.vm new file mode 100644 index 0000000000000000000000000000000000000000..2abb6acc66ec6346b3520dadbbdb0e793b607394 --- /dev/null +++ b/src/main/webapp/xnat-templates/screens/topBar/Administer/Pipelines.vm @@ -0,0 +1,3 @@ +<!-- Sequence: 70 --> + +<li><a href="${SITE_ROOT}/app/template/XDATScreen_manage_pipeline.vm">Pipelines</a></li> diff --git a/src/main/webapp/xnat-templates/screens/topBar/Administer/PluginSettings.vm b/src/main/webapp/xnat-templates/screens/topBar/Administer/PluginSettings.vm new file mode 100644 index 0000000000000000000000000000000000000000..61631d4243c994f67d6a0ffe11f7a05bec31f21f --- /dev/null +++ b/src/main/webapp/xnat-templates/screens/topBar/Administer/PluginSettings.vm @@ -0,0 +1,5 @@ +<!-- Sequence: 20 --> +<li id="view-plugin-settings" class="hidden"> + <a href="${SITE_ROOT}/app/template/Page.vm?view=admin/plugins">Plugin Settings</a> +</li> +<script src="${SITE_ROOT}/scripts/xnat/admin/pluginSettings.js"></script> \ No newline at end of file diff --git a/src/main/webapp/xnat-templates/screens/topBar/Administer/SiteAdmin.vm b/src/main/webapp/xnat-templates/screens/topBar/Administer/SiteAdmin.vm new file mode 100644 index 0000000000000000000000000000000000000000..d5b31ceeb8ad1373c03a05b39ff5d85ca31dda80 --- /dev/null +++ b/src/main/webapp/xnat-templates/screens/topBar/Administer/SiteAdmin.vm @@ -0,0 +1,3 @@ +<!-- Sequence: 10 --> +##<li><a href="/page/admin/">Site Administration</a></li> +<li><a href="${SITE_ROOT}/app/template/Page.vm?view=admin">Site Administration</a></li> \ No newline at end of file diff --git a/src/main/webapp/xnat-templates/screens/topBar/Administer/Users.vm b/src/main/webapp/xnat-templates/screens/topBar/Administer/Users.vm new file mode 100644 index 0000000000000000000000000000000000000000..ebfc04f4be119c8b9386672f8e52ad9c1cd24b8c --- /dev/null +++ b/src/main/webapp/xnat-templates/screens/topBar/Administer/Users.vm @@ -0,0 +1,3 @@ +<!-- Sequence: 30 --> + +<li><a href="${SITE_ROOT}/app/template/XDATScreen_admin.vm">Users</a></li>