Changeset 6540


Ignore:
Timestamp:
Sep 26, 2014, 12:58:41 PM (8 years ago)
Author:
Nicklas Nordborg
Message:

Merged patch release 3.3.1 to the trunk.

Location:
trunk
Files:
22 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/credits.txt

    r6372 r6540  
    11$Id$
    22
    3 The current BASE team is (at BASE 3.2.4 release)
     3The current BASE team is (at BASE 3.3.1 release)
    44{{{
    55Jari Häkkinen
  • trunk/src/clients/web/net/sf/basedb/clients/web/taglib/Head.java

    r6520 r6540  
    236236      String longTexts = Values.getString(sc != null ? sc.getUserClientSetting("text.long") : null, "display");
    237237      String fontStyles = Values.getString(sc != null ? sc.getUserClientSetting("appearance.fontsize") : null, "size_m.css");
     238     
     239      String favicon = page.getFavicon();
     240      if (favicon != null && !favicon.startsWith("/"))
     241      {
     242        favicon = page.getRoot()+favicon;
     243      }
    238244
    239245      sb.append("<head>\n");
    240       sb.append("\t<link rel=\"SHORTCUT ICON\" href=\"").append(page.getRoot()).append("favicon.ico\">\n");
     246      if (favicon != null)
     247      {
     248        sb.append("\t<link id=\"fav-icon\" rel=\"SHORTCUT ICON\" href=\"").append(favicon).append("\">\n");
     249      }
    241250      appendStyles(sb, fontStyles, !"display".equals(longTexts));
    242251      appendScripts(sb);
  • trunk/src/clients/web/net/sf/basedb/clients/web/taglib/Page.java

    r6155 r6540  
    109109    </td>
    110110  </tr>
     111  <tr>
     112    <td>favicon</td>
     113    <td>favicon.ico</td>
     114    <td>no</td>
     115    <td>
     116      The 'favicon' to use.
     117    </td>
     118  </tr>
    111119  </table>
    112120 
     
    164172  */
    165173  private int type = PAGE_TYPE_DEFAULT;
     174
     175  /**
     176    The 'favicon' to use.
     177  */
     178  private String favicon = "favicon.ico";
    166179
    167180  private static volatile boolean initialized = false;
     
    259272  {
    260273    return doctype;
     274  }
     275  /**
     276 
     277    @since 3.3.1
     278  */
     279  public void setFavicon(String favicon)
     280  {
     281    this.favicon = favicon;
     282  }
     283 
     284  public String getFavicon()
     285  {
     286    return favicon;
    261287  }
    262288 
  • trunk/src/core/net/sf/basedb/core/ChildItem.java

    r6127 r6540  
    8989      granted |= Permission.grant(Permission.WRITE, Permission.DELETE, Permission.CREATE);
    9090    }
     91    else if (Permission.hasPermission(parentPermission, getPermissionForUse()))
     92    {
     93      granted |= Permission.grant(Permission.USE);
     94    }
    9195    else if (Permission.hasPermission(parentPermission, Permission.READ))
    9296    {
     
    113117 
    114118  /**
     119    Get the permission that is required on the parent item that gives
     120    use permission on the child item. The defult
     121    permission is use.
     122    @since 3.3.1
     123  */
     124  Permission getPermissionForUse()
     125  {
     126    return Permission.USE;
     127  }
     128 
     129  /**
    115130    Get the shareable parent item of this child item. This
    116131    is used by the {@link #initPermissions(int, int)} method to calculate
  • trunk/src/core/net/sf/basedb/core/DerivedBioAssay.java

    r6334 r6540  
    758758    checkPermission(Permission.WRITE);
    759759    if (software != null) software.checkPermission(Permission.USE);
    760     hardwareHasBeenSet = true;
     760    softwareHasBeenSet = true;
    761761    getData().setSoftware(software == null ? null : software.getData());
    762762  }
  • trunk/src/core/net/sf/basedb/core/Unit.java

    r6539 r6540  
    2424import java.util.HashSet;
    2525import java.util.Iterator;
     26import java.util.List;
    2627import java.util.Set;
    2728import java.util.TreeSet;
    2829
    2930import net.sf.basedb.core.Transactional.Action;
     31import net.sf.basedb.core.data.AnnotationSetData;
    3032import net.sf.basedb.core.data.QuantityData;
    3133import net.sf.basedb.core.data.UnitData;
    3234import net.sf.basedb.core.data.UnitSymbolData;
     35import net.sf.basedb.core.snapshot.SnapshotManager;
    3336import net.sf.basedb.util.formatter.Formatter;
    3437import net.sf.basedb.util.formatter.PrefixSuffixFormatter;
     
    552555          HibernateUtil.executeUpdate(query);
    553556        }
     557       
     558        // We also need to invalidate the annotations in the snapshot cache
     559        org.hibernate.Query query = HibernateUtil.createQuery(getDbControl().getHibernateSession(),
     560          "SELECT a.annotationSet " +
     561          "FROM AnnotationData a " +
     562          "INNER JOIN a.annotationType at " +
     563          "WHERE (a.unit = :unit OR at.defaultUnit = :unit) AND a.unit <> at.defaultUnit");
     564        query.setEntity("unit", getData());
     565        List<AnnotationSetData> tmp = HibernateUtil.loadList(AnnotationSetData.class, query, getSessionControl());
     566        for (AnnotationSetData as : tmp)
     567        {
     568          SnapshotManager.removeSnapshot(as.getId());
     569        }
    554570      }
    555571    }
  • trunk/www/WEB-INF/base.tld

    r6300 r6540  
    5858      <rtexprvalue>true</rtexprvalue>
    5959    </attribute>
     60    <attribute>
     61      <name>favicon</name>
     62      <rtexprvalue>true</rtexprvalue>
     63    </attribute>
    6064  </tag>
    6165
  • trunk/www/biomaterials/bioplates/wells/edit_biowell.jsp

    r6306 r6540  
    6767  ItemSubtype bioMaterialSubType = bioPlateType.getItemSubtype();
    6868 
    69   bioWell.checkPermission(Permission.WRITE);
     69  bioWell.checkPermission(Permission.USE);
    7070  WellCoordinateFormatter rowFormatter = new WellCoordinateFormatter(true);
    7171  WellCoordinateFormatter columnFormatter = new WellCoordinateFormatter(false);
  • trunk/www/biomaterials/bioplates/wells/list_biowells.jsp

    r6497 r6540  
    383383              MeasuredBioMaterial bioMaterial = null;
    384384              BioMaterialEvent creationEvent = null;
    385               boolean editWellPermission = true;
     385              boolean editWellPermission = item.hasPermission(Permission.USE);
    386386              try
    387387              {
     
    390390                {
    391391                  creationEvent = bioMaterial.getCreationEvent();
    392                   editWellPermission = bioMaterial.hasPermission(Permission.WRITE) && !bioMaterial.isLockedInWell();
     392                  editWellPermission &= bioMaterial.hasPermission(Permission.WRITE) && !bioMaterial.isLockedInWell();
    393393                }
    394394                else
    395395                {
    396                   editWellPermission = item.canAddBioMaterial();
     396                  editWellPermission &= item.canAddBioMaterial();
    397397                }
    398398              }
  • trunk/www/common/close_popup.jsp

    r6387 r6540  
    6464<base:page type="popup" title="<%=title%>">
    6565<base:head scripts="~close_popup.js" />
    66 <base:body>
     66<base:body data-no-dialog-position="1">
    6767  <div id="page-data" class="datacontainer"
    6868    data-wait="<%=millisecondsToWait%>"
  • trunk/www/common/plugin/parse_file.jsp

    r6412 r6540  
    203203    title="File data"
    204204    >
    205     <div style="padding-top: 1.5em; margin-top: -0.5em;">
     205    <div>
    206206    <%
    207207    if (file == null)
    208208    {
    209       %>
    210       <div class="messagecontainer error" style="margin-top: 0px;">
     209      %>&nbsp;
     210      <div class="messagecontainer error">
    211211        No file selected. Please select a file to test above.
    212212      </div>
     
    227227      }
    228228      %>
    229       <div class="itemlist fulltable">
    230         <div class="data" style="top: 0px; margin-top:0px;">
     229      <div class="itemlist">
     230        <div class="data" style="<%=messages.size()==0 ? "border-top: 0;" : ""%>">
    231231        <table>
    232232          <thead>
  • trunk/www/common/plugin/test_with_file.js

    r6394 r6540  
    7272  {
    7373    var frm = document.forms['testwithfile'];
    74     frm.file_id.value = event.detail.fileId;
     74    frm.file_id.value = event.detail.id;
    7575    frm.path.value = event.detail.name;
    76     test.updateCharset(fileId);
     76    test.updateCharset(event.detail.id);
    7777  }
    7878 
  • trunk/www/filemanager/select_file.jsp

    r6308 r6540  
    4848    ></div>
    4949 
    50     <div id="f1" class="absolutefull" style="bottom: 5em;"><iframe
     50    <div id="f1" class="absolutefull" style="bottom: 5em; overflow: hidden;"><iframe
    5151      name="manager" id="idManager" src="frameset.jsp?ID=<%=ID%>&amp;mode=<%=mode.getName()%>"
    5252      style="width: 100%; height: 100%;"></iframe></div>
  • trunk/www/footnote.js

    r6400 r6540  
    5656  footnote.reload = function()
    5757  {
    58     location.reload(true);
     58    location.reload(false);
    5959  }
    6060 
  • trunk/www/include/scripts/main-2.js

    r6520 r6540  
    2828  var topWin = null;
    2929  var app = {};
    30  
     30  var internal = {};
     31
     32  var root;
     33  var sessionId;
     34  var storage;
     35  var rememberDialogPositions;
     36
    3137  /**
    3238    Get the root URL path of this BASE installation. Always ends with a '/' (eg. /base/)
     
    3440  app.getRoot = function()
    3541  {
    36     return Data.get(document.body, 'app-root');
     42    return root;
    3743  }
    3844 
     
    4349  app.getSessionId = function()
    4450  {
    45     return Data.get(document.body, 'session-id', '');
     51    return sessionId;
    4652  }
    4753
     
    8793  app.rememberDialogPositions = function()
    8894  {
    89     return Data.int(document.body, 'remember-dialog-positions', 1);
     95    return rememberDialogPositions;
    9096  }
    9197 
     
    193199  app.localStorage = function()
    194200  {
    195     var storage = null;
     201    return storage;
     202  }
     203 
     204  app.setLocal = function(key, value)
     205  {
     206    if (storage == null) return;
     207    storage.setItem(root+':'+key, value);
     208  }
     209 
     210  app.getLocal = function(key, defaultValue)
     211  {
     212    if (storage == null) return defaultValue || null;
     213    return storage.getItem(root+':'+key) || defaultValue || null;
     214  }
     215 
     216  app.removeLocal = function(key)
     217  {
     218    if (storage == null) return;
     219    storage.removeItem(root+':'+key);
     220  }
     221 
     222  /**
     223    Write a message to the browser debug console.
     224  */
     225  app.debug = function(message)
     226  {
     227    console.log(message);
     228  }
     229 
     230  internal.initApp = function()
     231  {
     232    root = Data.get(document.body, 'app-root');
     233    sessionId = Data.get(document.body, 'session-id', '');
     234
    196235    try
    197236    {
     
    203242      // selected for cookies, so we have to catch this situation
    204243    }
    205     return storage;
    206   }
    207  
    208   /**
    209     Write a message to the browser debug console.
    210   */
    211   app.debug = function(message)
    212   {
    213     console.log(message);
    214   }
     244   
     245    rememberDialogPositions = Data.int(document.body, 'remember-dialog-positions', 1) && storage != null;
     246  }
     247 
     248  document.addEventListener('DOMContentLoaded', internal.initApp, false);
    215249 
    216250  return app;
     
    496530    internal.invokeOnLoadFunctions();
    497531    internal.invokeFinalizers();
    498     Events.addEventHandler('page-reload', 'click', function() { location.reload() });
     532    Events.addEventHandler('page-reload', 'click', function() { location.reload(true) });
    499533    var alertMsg = Data.get(document.body, 'alert-message');
    500534    if (alertMsg) alert(alertMsg);
     
    537571        catch (err)
    538572        {
    539           console.error(err.toString ? err.toString() : err);
     573          var msg = err;
     574          if (err.toString)
     575          {
     576            msg = err.toString() + '\n' + err.stack;
     577          }
     578          console.error(msg);
    540579        }
    541580      }
     
    557596      catch (err)
    558597      {
    559         console.error(err.toString ? err.toString() : err);
     598        var msg = err;
     599        if (err.toString)
     600        {
     601          msg = err.toString() + '\n' + err.stack;
     602        }
     603        console.error(msg);
    560604      }
    561605    }
     
    576620      catch (err)
    577621      {
    578         console.error(err.toString ? err.toString() : err);
     622        var msg = err;
     623        if (err.toString)
     624        {
     625          msg = err.toString() + '\n' + err.stack;
     626        }
     627        console.error(msg);
    579628      }
    580629    }
     
    12051254  dialogs.openPopup = function(url, name, width, height)
    12061255  {
    1207     // Get last position of the window
    1208     var position = null;
    1209     if (App.rememberDialogPositions())
    1210     {
    1211       position = JSON.parse(Data.getPageValue("last-position", name));
    1212     }
    1213 
    1214     if (!position)
     1256    // Get last position of the window -- can be null
     1257    var position = internal.getLastDialogPosition(name);
     1258
     1259    if (position == null)
    12151260    {
    12161261      // If no last position is know, use the specified settings
     
    12301275
    12311276    var options = "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes";
     1277    options += ",top="+position.top+",left="+position.left+",width="+position.width+",height="+position.height;
    12321278    // Check if another window with the same name already exists
    1233     var oldWin = window.open('', name, options+",top="+position.top+",left="+position.left+",width="+position.width+",height="+position.height);
     1279    var oldWin = window.open('', name, options);
    12341280    try
    12351281    {
     
    12431289          return;
    12441290        }
    1245         position = App.getWindowPosition(oldWin);
    1246         oldWin.close();
    12471291        url += '&warnIfOpen=0';
    12481292      }
     
    12511295    {}
    12521296   
    1253     if (App.rememberDialogPositions())
    1254     {
    1255       Data.setPageValue('requested-position', JSON.stringify(position), name);
    1256     }
    1257     options += ",top="+position.top+",left="+position.left+",width="+position.width+",height="+position.height;
     1297    internal.saveRequestedDialogPosition(name, position);
     1298
    12581299    var newWin;
    12591300    if (App.isTooLongUrl(url))
     
    12701311    newWin.focus();
    12711312    return newWin;
     1313  }
     1314 
     1315  internal.getLastDialogPosition = function(name)
     1316  {
     1317    if (!App.rememberDialogPositions()) return null;
     1318    return JSON.parse(App.getLocal('dialog-position:'+name));
     1319  }
     1320 
     1321  internal.saveRequestedDialogPosition = function(name, position)
     1322  {
     1323    if (!App.rememberDialogPositions()) return;
     1324    App.setLocal('dialog-position-req:'+name, JSON.stringify(position));
     1325  }
     1326 
     1327  dialogs.forgetDialogPositions = function()
     1328  {
     1329    var storage = App.localStorage();
     1330    if (!storage) return;
     1331   
     1332    var prefix = App.getRoot()+':dialog-position:';
     1333   
     1334    for (var i = storage.length-1; i >= 0; i--)
     1335    {
     1336      var key = storage.key(i);
     1337      if (key.indexOf(prefix) == 0) storage.removeItem(key);
     1338    }
    12721339  }
    12731340 
     
    44244491        onSuccessHandler.call(null, request);
    44254492      }
    4426       else if (request.onFailHandler)
     4493      else if (onFailHandler)
    44274494      {
    44284495        onFailHandler.call(null, request);
  • trunk/www/include/scripts/popup.js

    r6520 r6540  
    2929  var dy = 0;
    3030 
     31  var saveDialogPosition = false;
     32 
    3133  // If the popup dialog is read-only BASE will not
    3234  // display a warning when trying to re-open the same dialog
     
    3941  internal.delayInitPosition = function()
    4042  {
    41     setTimeout(internal.initPosition, 20);
     43    saveDialogPosition = window.top.name && App.rememberDialogPositions();
     44    if (saveDialogPosition) setTimeout(internal.initPosition, 500);
    4245  }
    4346 
     
    4649  internal.initPosition = function()
    4750  {
    48     if (window.top.name && App.rememberDialogPositions())
     51    var key = 'dialog-position-req:'+window.top.name;
     52    var rpos = JSON.parse(App.getLocal(key));
     53//    alert('['+window.screenX+', '+window.screenY+'], ['+rpos.width+', ' + rpos.height+'], ['+window.innerWidth+', ' + window.innerHeight+'], [' + window.outerWidth+', '+window.outerHeight+']');
     54    if (rpos)
    4955    {
    50       var rpos = JSON.parse(Data.getPageValue("requested-position", window.top.name));
     56      App.removeLocal(key);
    5157      var cpos = App.getWindowPosition(window.top);
    5258      dx = rpos.width-cpos.width;
     
    5763  internal.savePosition = function()
    5864  {
    59     if (window.top.name && App.rememberDialogPositions())
    60     {
    61       var pos = App.getWindowPosition(window.top);
    62       pos.width += dx;
    63       pos.height += dy;
    64       Data.setPageValue("last-position", JSON.stringify(pos), window.top.name);
    65     }
     65    if (!saveDialogPosition || Data.int(document.body, 'no-dialog-position')) return;
     66   
     67    var pos = App.getWindowPosition(window.top);
     68    pos.width += dx;
     69    pos.height += dy;
     70    App.setLocal('dialog-position:'+window.top.name, JSON.stringify(pos));
    6671  }
    6772 
  • trunk/www/index.jsp

    r6138 r6540  
    3939%>
    4040<base:page>
    41   <base:head>
     41  <base:head scripts="~index.js">
    4242  <%
    4343  if (RssNewsFeed.isEnabled())
  • trunk/www/login.js

    r6426 r6540  
    8181    if (storage)
    8282    {
    83       storage.setItem('last-login', lastLogin);
     83      App.setLocal('last-login', lastLogin);
    8484    }
    8585    else
     
    9999    if (storage)
    100100    {
    101       lastLogin = storage.getItem('last-login');
     101      lastLogin = App.getLocal('last-login');
    102102    }
    103103    if (!lastLogin)
     
    229229  {
    230230    Buttons.addClickHandler('user_id.select', impersonate.selectUser);
     231    Events.addEventHandler('user_id', 'base-selected', impersonate.setUserCallback);
    231232  }
    232233 
     
    237238  {
    238239    var frm = document.forms[pForm];
    239     var url = 'admin/users/index.jsp?ID=' + App.getSessionId();
    240     url += '&cmd=UpdateContext&mode=selectone&callback=Impersonate.setUserCallback';
     240    var url = '&resetTemporary=1';
    241241    if (frm.user_id.length > 0)
    242242    {
     
    244244      url += '&item_id='+id;
    245245    }
    246     Dialogs.openPopup(url, 'SelectUser', 1050, 700);
     246    Dialogs.selectItem('USER', 'user_id', 0, url);
    247247  }
    248248 
     
    250250    Callback for setting the selected user.
    251251  */
    252   impersonate.setUserCallback = function(id, name)
     252  impersonate.setUserCallback = function(event)
    253253  {
    254254    var frm = document.forms[pForm];
     
    258258      Forms.addListOption(list, 0, new Option());
    259259    }
    260     list[0].value = id;
    261     list[0].text = name;
     260    list[0].value = event.detail.id;
     261    list[0].text = event.detail.name;
    262262    list.selectedIndex = 0;
    263263  }
  • trunk/www/logout.jsp

    r6520 r6540  
    4040<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
    4141<%
    42 final SessionControl sc = Base.getExistingSessionControl(pageContext, false);
    43 final String ID = sc.getId();
    44 final boolean noconfirm = Values.getBoolean(request.getParameter("noconfirm"), !sc.isLoggedIn());
     42final SessionControl sc = Base.getSessionControl(pageContext, false);
     43final boolean noconfirm = sc == null || !sc.isLoggedIn() ||
     44    Values.getBoolean(request.getParameter("noconfirm"));
     45final String ID = sc == null ? "" : sc.getId();
    4546if (noconfirm)
    4647{
    4748  // Redirect to main login page
    4849  String redirect = "common/close_popup.jsp?ID="+ID+"&wait=0&redirect_opener=../main.jsp?ID="+ID;;
    49   if (sc.isImpersonated())
     50  if (sc != null)
    5051  {
    51     SessionControl original = (SessionControl)sc.getSessionSetting("impersonate.originalSessionControl");
    52     boolean revert = Values.getBoolean(request.getParameter("revert"));
    53     if (revert)
     52    if (sc.isImpersonated())
    5453    {
    55       redirect = "common/close_popup.jsp?ID="+original.getId()+"&wait=0&redirect_opener=../my_base/index.jsp?ID="+original.getId();
     54      SessionControl original = (SessionControl)sc.getSessionSetting("impersonate.originalSessionControl");
     55      boolean revert = Values.getBoolean(request.getParameter("revert"));
     56      if (revert)
     57      {
     58        redirect = "common/close_popup.jsp?ID="+original.getId()+"&wait=0&redirect_opener=../my_base/index.jsp?ID="+original.getId();
     59      }
     60      else
     61      {
     62        original.logout();
     63      }
    5664    }
    57     else
    58     {
    59       original.logout();
    60     }
     65    sc.logout();
    6166  }
    62   sc.logout();
    6367  response.sendRedirect(redirect);
    6468  return;
    6569}
    66 String title = sc.isImpersonated() ? "Logout impersonated?" : "Logout?";
     70String title = sc != null && sc.isImpersonated() ? "Logout impersonated?" : "Logout?";
    6771%>
    6872<base:page type="popup" title="<%=title%>">
  • trunk/www/my_base/user/preferences.js

    r6400 r6540  
    2626{
    2727  var preferences = {};
     28 
     29  var initialRememberDialogPositions;
    2830 
    2931  preferences.initPage = function()
     
    6668    Events.addEventHandler('stickyItems', 'dblclick', Preferences.moveFromSticky);
    6769    Events.addEventHandler('allItems', 'dblclick', Preferences.moveToSticky);
     70   
     71    var frm = document.forms['preferences'];
     72    initialRememberDialogPositions = frm.remember_positions.checked;
     73   
     74    if (!App.localStorage())
     75    {
     76      frm.remember_positions.checked = false;
     77      frm.remember_positions.disabled = true;
     78      Doc.element('rememberPositions').title = 'Your browser doesn\'t support this feature';
     79      Doc.addClass('rememberPositions', 'disabled');
     80    }
    6881  }
    6982
     
    113126    {
    114127      var sticky_items = frm.sticky_items;
    115       for (var i = 0; i < sticky_items.length; i++) // >
     128      for (var i = 0; i < sticky_items.length; i++)
    116129      {
    117130        sticky_items.options[i].selected = true;
    118131      }
     132     
     133      if (initialRememberDialogPositions && !frm.remember_positions.checked)
     134      {
     135        Dialogs.forgetDialogPositions();
     136        Data.set(document.body, 'no-dialog-position', 1);
     137      }
     138     
    119139      frm.submit();
    120140    }
  • trunk/www/my_base/user/preferences.jsp

    r6520 r6540  
    300300          <th>Dialogs</th>
    301301          <td>
    302             <label><input type="checkbox" name="remember_positions" value="1"
     302            <label id="rememberPositions"><input type="checkbox" name="remember_positions" value="1"
    303303              <%=rememberDialogPositions ? "checked" : "" %>
    304304              >Remember positions</label>
Note: See TracChangeset for help on using the changeset viewer.