Changeset 5645


Ignore:
Timestamp:
May 27, 2011, 9:48:13 AM (10 years ago)
Author:
Nicklas Nordborg
Message:

References #1597: Subtypes of items

Added subtype functionality for sample list, view and edit dialog. Show the inversely related subtypes on the subtype view page.

Location:
trunk
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/core/net/sf/basedb/core/Install.java

    r5642 r5645  
    15991599        if (related != null)
    16001600        {
    1601           Map<Integer, ItemSubtypeData> allRelated = subtype.getReleatedSubtypes();
     1601          Map<Integer, ItemSubtypeData> allRelated = subtype.getRelatedSubtypes();
    16021602          for (ItemSubtypeData rel : related)
    16031603          {
  • trunk/src/core/net/sf/basedb/core/ItemSubtype.java

    r5631 r5645  
    379379  public ItemSubtype getRelatedSubtype(Item itemType)
    380380  {
    381     return getDbControl().getItem(ItemSubtype.class, getData().getReleatedSubtypes().get(itemType.getValue()));
     381    return getDbControl().getItem(ItemSubtype.class, getData().getRelatedSubtypes().get(itemType.getValue()));
    382382  }
    383383 
     
    392392    checkPermission(Permission.WRITE);
    393393    if (subtype == null) throw new InvalidUseOfNullException("subtype");
    394     getData().getReleatedSubtypes().put(subtype.getMainItemType().getValue(), subtype.getData());
     394    getData().getRelatedSubtypes().put(subtype.getMainItemType().getValue(), subtype.getData());
    395395  }
    396396 
     
    403403  {
    404404    checkPermission(Permission.WRITE);
    405     getData().getReleatedSubtypes().remove(itemType.getValue());
     405    getData().getRelatedSubtypes().remove(itemType.getValue());
     406  }
     407 
     408  /**
     409    Get a query returning all subtypes that are related to this subtype.
     410  */
     411  public ItemQuery<ItemSubtype> getRelatedSubtypes()
     412  {
     413    ItemQuery<ItemSubtype> query = getQuery(null);
     414    query.joinPermanent(Hql.innerJoin("parents", "p"));
     415    query.restrictPermanent(Restrictions.eq(Hql.alias("p"), Hql.entity(this)));
     416    return query;
     417  }
     418 
     419  /**
     420    Get a query returning all subtypes that have a relation to this subtype.
     421  */
     422  public ItemQuery<ItemSubtype> getParentSubtypes()
     423  {
     424    ItemQuery<ItemSubtype> query = getQuery(null);
     425    query.joinPermanent(Hql.innerJoin("relatedSubtypes", "p"));
     426    query.restrictPermanent(Restrictions.eq(Hql.alias("p"), Hql.entity(this)));
     427    return query;
    406428  }
    407429 
  • trunk/src/core/net/sf/basedb/core/data/ItemSubtypeData.java

    r5631 r5645  
    2525import java.util.HashMap;
    2626import java.util.Map;
     27import java.util.Set;
    2728
    2829/**
     
    141142    @hibernate.collection-many-to-many column="`related_subtype_id`" class="net.sf.basedb.core.data.ItemSubtypeData"
    142143  */
    143   public Map<Integer, ItemSubtypeData> getReleatedSubtypes()
     144  public Map<Integer, ItemSubtypeData> getRelatedSubtypes()
    144145  {
    145146    if (relatedSubtypes == null)
     
    149150    return relatedSubtypes;
    150151  }
    151   void setReleatedSubtypes(Map<Integer, ItemSubtypeData> relatedSubtypes)
     152  void setRelatedSubtypes(Map<Integer, ItemSubtypeData> relatedSubtypes)
    152153  {
    153154    this.relatedSubtypes = relatedSubtypes;
    154155  }
    155156 
     157  private Set<ItemSubtypeData> parents;
     158  /**
     159    This is the inverse end. See {@link #getRelatedSubtypes()}.
     160    @hibernate.set table="`RelatedSubtypes`" lazy="true"
     161    @hibernate.collection-key column="`related_subtype_id`"
     162    @hibernate.collection-many-to-many column="`itemsubtype_id`" class="net.sf.basedb.core.data.ItemSubtypeData"
     163  */
     164  Set<ItemSubtypeData> getParents()
     165  {
     166    return parents;
     167  }
     168  void setParents(Set<ItemSubtypeData> parents)
     169  {
     170    this.parents = parents;
     171  }
     172 
    156173 
    157174}
  • trunk/www/admin/itemsubtypes/ajax.jsp

    r5631 r5645  
    4949  {
    5050    Item relatedType = Item.valueOf(request.getParameter("relatedType"));
     51    int defaultRelatedId = Values.getInt(request.getParameter("defaultRelatedId"));
    5152    dc = sc.newDbControl();
    52     ItemSubtype subtype = ItemSubtype.getById(dc, itemId);
    53     ItemSubtype related = subtype.getRelatedSubtype(relatedType);
     53    ItemSubtype related = null;
     54    if (itemId > 0)
     55    {
     56      ItemSubtype subtype = ItemSubtype.getById(dc, itemId);
     57      related = subtype.getRelatedSubtype(relatedType);
     58    }
     59    if (related == null && defaultRelatedId > 0)
     60    {
     61      related = ItemSubtype.getById(dc, defaultRelatedId);
     62    }
    5463    if (related != null)
    5564    {
  • trunk/www/admin/itemsubtypes/edit_subtype.jsp

    r5643 r5645  
    197197
    198198    <h3 class="docked"><%=title%> <base:help tabcontrol="settings" /></h3>
    199     <t:tabcontrol id="settings" contentstyle="<%="height: "+(int)(scale*280)+"px;"%>"
     199    <t:tabcontrol id="settings" contentstyle="<%="height: "+(int)(scale*320)+"px;"%>"
    200200      position="bottom" remember="<%=subtype != null%>"
    201201      extensions="<%=invoker%>">
     
    215215          {
    216216            %>
    217             <select name="itemType" class="required unchangeable" onchange="mainItemOnChange()">
     217            <select name="itemType" class="required unchangeable selectionlist" onchange="mainItemOnChange()">
    218218            <%
    219219            int itemCode = Values.getInt(cc.getPropertyValue("itemType"), -1);
     
    263263              onselect="<%="relatedItemOnSelect('" + item.name() + "')"%>"
    264264              newitem="<%=subtype == null%>"
     265              clazz="selectionlist"
    265266            />
    266267          </td>
  • trunk/www/admin/itemsubtypes/list_subtypes.jsp

    r5630 r5645  
    271271        >
    272272        <tbl:button
     273          visible="<%=!mode.isSelectionMode() %>"
    273274          disabled="<%=createPermission ? false : true %>"
    274275          image="<%=createPermission ? "new.gif" : "new_disabled.gif"%>"
  • trunk/www/admin/itemsubtypes/view_subtype.jsp

    r5631 r5645  
    248248      </table>
    249249
     250      <%
     251      ItemQuery<ItemSubtype> parentQuery = subtype.getParentSubtypes();
     252      parentQuery.include(Include.ALL);
     253      parentQuery.order(Orders.asc(Hql.property("name")));
     254      ItemResultList<ItemSubtype> parents = parentQuery.list(dc);
     255      if (parents.size() == 0)
     256      {
     257        %>
     258        <h4>Subtypes with relation to this subtype</h4>
     259        There are no subtypes (or, you don't have permission to view them).
     260        <%
     261      }
     262      else
     263      {
     264        %>
     265        <base:section
     266          id="parents"
     267          title="<%="Subtypes with relation to this subtype (" + parents.size() + ")"%>"
     268          context="<%=cc%>"
     269          >       
     270          <tbl:table
     271            id="parents"
     272            clazz="itemlist"
     273            columns="all"
     274            >
     275            <tbl:columndef
     276              id="name"
     277              title="Name"
     278            />
     279            <tbl:columndef
     280              id="mainType"
     281              title="Main item type"
     282            />
     283            <tbl:columndef
     284              id="description"
     285              title="Description"
     286            />
     287            <tbl:data>
     288              <tbl:columns>
     289              </tbl:columns>
     290              <tbl:rows>
     291              <%
     292              for (ItemSubtype parent : parents)
     293              {
     294                %>
     295                <tbl:row>
     296                  <tbl:cell column="name"><base:icon
     297                      image="deleted.gif"
     298                      tooltip="This item has been scheduled for deletion"
     299                      visible="<%=parent.isRemoved()%>"
     300                    /><%=Base.getLinkedName(ID, parent, false, true)%></tbl:cell>
     301                  <tbl:cell column="mainType"><%=parent.getMainItemType() %></tbl:cell>
     302                  <tbl:cell column="description"><%=HTML.encodeTags(parent.getDescription())%></tbl:cell>
     303                </tbl:row>
     304                <%
     305              }
     306              %>
     307              </tbl:rows>
     308            </tbl:data>
     309          </tbl:table>
     310        </base:section>
     311        <%
     312      }
     313      %>
     314
    250315      <jsp:include page="../../common/anytoany/list_anytoany.jsp">
    251316        <jsp:param name="ID" value="<%=ID%>" />
  • trunk/www/biomaterials/samples/edit_sample.jsp

    r5630 r5645  
    3434  import="net.sf.basedb.core.Sample"
    3535  import="net.sf.basedb.core.BioSource"
     36  import="net.sf.basedb.core.ItemSubtype"
    3637  import="net.sf.basedb.core.BioMaterialEvent"
    3738  import="net.sf.basedb.core.BioPlate"
     
    8485  boolean lockEventProperties = false;
    8586
     87  boolean readCurrentSubtype = true;
     88  int currentSubtypeId = 0;
    8689  boolean readCurrentProtocol = true;
    8790  Protocol currentProtocol = null;
     
    123126    title = "Create sample";
    124127    cc.removeObject("item");
     128    currentSubtypeId = Values.getInt(request.getParameter("subtype_id"));
     129    if (currentSubtypeId == 0)
     130    {
     131      int recentSubtypeId = Values.getInt(cc.getRecent(Item.ITEMSUBTYPE.name(), 0));
     132      currentSubtypeId = Values.getInt(cc.getPropertyValue("itemSubtype"), recentSubtypeId);
     133    }
    125134    if (cc.getPropertyFilter("creationEvent.protocol.name") != null)
    126135    {
     
    149158  {
    150159    sample = Sample.getById(dc, itemId);
     160    sample.checkPermission(Permission.WRITE);
    151161    cc.setObject("item", sample);
    152162    title = "Edit sample -- " + HTML.encodeTags(sample.getName());
     
    160170    try
    161171    {
     172      ItemSubtype subtype = sample.getItemSubtype();
     173      if (subtype != null) currentSubtypeId = subtype.getId();
     174    }
     175    catch (PermissionDeniedException ex)
     176    {
     177      readCurrentSubtype = false;
     178    }
     179
     180   
     181    try
     182    {
    162183      currentProtocol = creationEvent.getProtocol();
    163184    }
     
    195216    samplesQuery.include(Include.ALL);
    196217    samplesQuery.order(Orders.asc(Hql.property("name")));
     218  }
    197219 
    198   }
    199   if (sample != null && !sample.hasPermission(Permission.WRITE))
    200   {
    201     throw new PermissionDeniedException(Permission.WRITE, itemType.toString());
    202   }
     220  // Query to retrieve item types
     221  final ItemQuery<ItemSubtype> subtypesQuery = Base.getSubtypesQuery(itemType);
     222  subtypesQuery.include(Include.ALL);
     223 
    203224  final String clazz = "class=\"text\"";
    204225  final String requiredClazz = "class=\"text required\"";
     
    211232  %>
    212233  <base:page type="popup" title="<%=title%>">
    213   <base:head scripts="tabcontrol.js,annotations.js,linkitems.js" styles="tabcontrol.css">
     234  <base:head scripts="tabcontrol.js,annotations.js,linkitems.js,subtypes.js,ajax.js,json2.js" styles="tabcontrol.css">
    214235    <ext:scripts context="<%=jspContext%>" />
    215236    <ext:stylesheets context="<%=jspContext%>" />
     
    263284        if (tabId == 'annotations' && (protocolChanged || !annotationsLoaded))
    264285        {
    265           Annotations.loadAnnotateFrame(frames.annotations, '<%=ID%>', '<%=itemType.name()%>', <%=itemId%>, getProtocolId());
     286          Annotations.loadAnnotateFrame(frames.annotations, '<%=ID%>', '<%=itemType.name()%>', <%=itemId%>, getProtocolId(), ItemSubtype.getSubtypeId('sample'));
    266287          annotationsLoaded = true;
    267288          protocolChanged = false;
     
    311332    {
    312333      var frm = document.forms['sample'];
    313       var url = '../../admin/protocols/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setProtocolCallback';
     334      var url = '../../admin/protocols/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone';
     335      url += '&callback=setProtocolCallback&resetTemporary=1';
     336      url += ItemSubtype.createRelatedFilter('sample', 'PROTOCOL', <%=SystemItems.getId(Protocol.SAMPLING)%>);
    314337      if (frm.protocol_id.length > 1)
    315338      {
     
    447470        return;
    448471      }
    449       var url = '../biosources/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setBioSourceCallback';
     472
     473      var url = '../biosources/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone';
     474      url += '&callback=setBioSourceCallback&resetTemporary=1';
     475      ItemSubtype.createRelatedFilter('sample', 'BIOSOURCE');
    450476      if (frm.biosource_id.length > 1)
    451477      {
     
    477503        return;
    478504      }
    479       Main.openPopup('index.jsp?ID=<%=ID%>&mode=selectmultiple&callback=addSampleCallback', 'AddSamples', 1000, 700);
     505     
     506      var url = 'index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple';
     507      url += '&callback=addSampleCallback&resetTemporary=1';
     508      url += ItemSubtype.createRelatedFilter('sample', 'SAMPLE');
     509      Main.openPopup(url, 'AddSamples', 1000, 700);
    480510    }
    481511    function addSampleCallback(sampleId, name)
     
    584614          value="<%=HTML.encodeTags(name)%>"
    585615          size="40" maxlength="<%=Sample.MAX_NAME_LENGTH%>"></td>
     616      </tr>
     617      <tr valign="top">
     618        <td class="prompt">Type</td>
     619        <td colspan="2">
     620          <select name="subtype_id"
     621            <%=!readCurrentSubtype ? "disabled readonly class=\"disabled selectionlist\"" : "class=\"selectionlist\""%>>
     622          <%
     623          if (!readCurrentSubtype)
     624          {
     625            %>
     626            <option value="-1">- denied -
     627            <%
     628          }
     629          else
     630          {
     631            %>
     632            <option value="0">-none-
     633            <%
     634            for (ItemSubtype subtype : subtypesQuery.list(dc))
     635            {
     636              int id = subtype.getId();
     637              if (id != currentSubtypeId && subtype.isRemoved()) continue;
     638              %>
     639              <option value="<%=id == currentSubtypeId && sample != null ? -id : id%>"
     640                <%=id == currentSubtypeId ? "selected" : ""%>
     641                title="<%=HTML.encodeTags(subtype.getDescription()) %>"
     642                ><%=HTML.encodeTags(subtype.getName())%>
     643              <%
     644            }
     645          }
     646          %>
     647          </select>
     648        </td>
    586649      </tr>
    587650      <tr>
     
    726789          <td>
    727790            <select name="samples" size="5" multiple style="width: 20em;"
    728               onchange="samplesOnChange()"
     791              onchange="samplesOnChange()">
    729792            </select>&nbsp;<br>
    730793            Used
  • trunk/www/biomaterials/samples/index.jsp

    r5590 r5645  
    3434  import="net.sf.basedb.core.BioPlateEventType"
    3535  import="net.sf.basedb.core.BioWell"
     36  import="net.sf.basedb.core.ItemSubtype"
    3637  import="net.sf.basedb.core.Extract"
    3738  import="net.sf.basedb.core.Protocol"
     
    7980<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
    8081<%!
    81   private static final ItemContext defaultContext = Base.createDefaultContext("name", "name,originalQuantity,remainingQuantity,extracts,description");
     82  private static final ItemContext defaultContext = Base.createDefaultContext("name", "name,itemSubtype,originalQuantity,remainingQuantity,extracts,description");
    8283  private static final Item itemType = Item.SAMPLE;
    8384 
     
    238239          if (pt != null) cc.setRecent(pt, maxRecent);
    239240        }
     241      }
     242     
     243      int subtypeId = Values.getInt(request.getParameter("subtype_id"), -1);
     244      if (subtypeId >= 0) // < 0 = denied or unchanged
     245      {
     246        ItemSubtype subtype = subtypeId == 0 ? null : ItemSubtype.getById(dc, subtypeId);
     247        sample.setItemSubtype(subtype);
     248        if (subtype != null) cc.setRecent(subtype, maxRecent);
    240249      }
    241250     
  • trunk/www/biomaterials/samples/list_samples.jsp

    r5567 r5645  
    3535  import="net.sf.basedb.core.BioWell"
    3636  import="net.sf.basedb.core.AnnotationType"
     37  import="net.sf.basedb.core.ItemSubtype"
    3738  import="net.sf.basedb.core.AnnotationSet"
    3839  import="net.sf.basedb.core.ItemQuery"
     
    99100{
    100101  final ItemQuery<AnnotationType> annotationTypeQuery = Base.getAnnotationTypesQuery(itemType);
     102  final ItemQuery<ItemSubtype> subtypesQuery = Base.getSubtypesQuery(itemType);
    101103  final ItemQuery<Extract> extractQuery = Extract.getQuery();
    102104  extractQuery.include(cc.getInclude());
     
    288290        exportable="true"
    289291        show="always"
     292      />
     293      <tbl:columndef
     294        id="itemSubtype"
     295        property="itemSubtype"
     296        sortproperty="itemSubtype.name"
     297        exportproperty="itemSubtype.name"
     298        datatype="int"
     299        enumeration="<%=Enumeration.fromItems(subtypesQuery.list(dc), "-none-")%>"
     300        title="Type"
     301        sortable="true"
     302        filterable="true"
     303        exportable="true"
    290304      />
    291305      <tbl:columndef
     
    694708                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
    695709                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
     710                <tbl:cell column="itemSubtype"><base:propertyvalue
     711                    item="<%=item%>"
     712                    property="itemSubtype"
     713                    enableEditLink="<%=mode.hasEditLink()%>"
     714                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
     715                  /></tbl:cell>
    696716                <tbl:cell column="externalId"><%=HTML.encodeTags(item.getExternalId())%></tbl:cell>               
    697717                <tbl:cell column="originalQuantity"><%=Values.formatNumber(item.getOriginalQuantity(), 2)%></tbl:cell>
  • trunk/www/biomaterials/samples/view_sample.jsp

    r5491 r5645  
    293293      </tr>
    294294      <tr>
     295        <td class="prompt">Type</td>
     296        <td><base:propertyvalue item="<%=sample%>" property="itemSubtype" /></td>
     297      </tr>
     298      <tr>
    295299        <td class="prompt">External ID</td>
    296300        <td><%=HTML.encodeTags(sample.getExternalId())%></td>
  • trunk/www/include/scripts/main.js

    r5642 r5645  
    601601    this.controllers['CHANGEHISTORY'] = { url:'common/history/index.jsp', width:600, height:480, edit:false, popup:true };
    602602    this.controllers['ANNOTATION'] = { url:'common/annotations/index.jsp', width:700, height:480, edit:true, popup:true };
    603     this.controllers['ITEMSUBTYPE'] = { url:'admin/itemsubtypes/index.jsp', width:600, height:400 };
     603    this.controllers['ITEMSUBTYPE'] = { url:'admin/itemsubtypes/index.jsp', width:640, height:440 };
    604604  }
    605605 
  • trunk/www/include/scripts/subtypes.js

    r5644 r5645  
    3030  /**
    3131    Get the subtype that is related to the given one.
     32    @param subtypeId The main subtype
     33    @param relatedItemType The item type of the related subtype we are
     34      looking for
     35    @param defaultSubtype The id of the default subtype to return if
     36      no related subtype is found (optional)
     37    @return An object with the 'id' and 'name' of the related subtype or null
     38      if no related subtype is found
    3239  */
    33   this.getRelatedSubtype = function(subtypeId, relatedItemType, defaultSubtype)
     40  this.getRelatedSubtype = function(subtypeId, relatedItemType, defaultSubtypeId)
    3441  {
     42    if (!subtypeId && !defaultSubtypeId)
     43    {
     44      return null;
     45    }
    3546    var request = Ajax.getXmlHttpRequest();
    3647    var ID = getSessionId();
    3748    var url = getRoot() + 'admin/itemsubtypes/ajax.jsp?ID=' + ID;
    3849    url += "&cmd=GetRelatedSubtype&relatedType=" + relatedItemType;
    39     url += '&item_id='+subtypeId;
     50    if (subtypeId)
     51    {
     52      url += '&item_id='+subtypeId;
     53    }
     54    if (defaultSubtypeId)
     55    {
     56      url += '&defaultRelatedId=' + defaultSubtypeId;
     57    }
    4058    request.open("GET", url, false);
    4159    request.send(null);
    4260   
    4361    var response = JSON.parse(request.responseText);
    44     if (!response.id && defaultSubtype)
    45     {
    46       response.id = defaultSubtype;
    47     }
    48     return response;
    49 
     62    return response && response.id ? response : null;
    5063  }
    5164
     65  this.createRelatedFilter = function(formId, relatedItemType, defaultSubtypeId)
     66  {
     67    var subtypeId = this.getSubtypeId(formId);
     68    var relatedSubtype = this.getRelatedSubtype(subtypeId, relatedItemType, defaultSubtypeId);
     69    return relatedSubtype ? '&tmpfilter:INT:itemSubtype=' + relatedSubtype.id : '';
     70  }
     71 
    5272  this.getSubtypeId = function(formId)
    5373  {
Note: See TracChangeset for help on using the changeset viewer.