Changeset 5723


Ignore:
Timestamp:
Sep 7, 2011, 3:08:08 PM (10 years ago)
Author:
Nicklas Nordborg
Message:

References #1597: Subtypes of items

Update the "Create child plate" event wizard to use item subtypes when possible.

Location:
trunk
Files:
6 edited

Legend:

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

    r5713 r5723  
    5252public class ItemSubtype
    5353  extends BasicItem<ItemSubtypeData>
    54   implements Nameable, Removable, Registered, SystemItem
     54  implements Nameable, Removable, Registered, SystemItem, Subtypable
    5555{
    5656
     
    349349  }
    350350  // -------------------------------------------
     351  /*
     352    From the Subtypable interface
     353    -------------------------------------------
     354  */
     355  /**
     356    @return A reference to self
     357  */
     358  @Override
     359  public ItemSubtype getItemSubtype()
     360  {
     361    return this;
     362  }
     363  /**
     364    Do nothing.
     365  */
     366  @Override
     367  public void setItemSubtype(ItemSubtype subtype)
     368  {}
     369  // -------------------------------------------
    351370
    352371  /*
  • trunk/www/biomaterials/wizards/create_child_bioplate_step1.jsp

    r5642 r5723  
    2727  import="net.sf.basedb.core.BioPlateEventType"
    2828  import="net.sf.basedb.core.BioPlateType"
     29  import="net.sf.basedb.core.BioWell"
    2930  import="net.sf.basedb.core.PlateGeometry"
    3031  import="net.sf.basedb.core.MeasuredBioMaterial"
     
    3233  import="net.sf.basedb.core.Protocol"
    3334  import="net.sf.basedb.core.Tag"
     35  import="net.sf.basedb.core.ItemSubtype"
    3436  import="net.sf.basedb.core.DbControl"
    3537  import="net.sf.basedb.core.Item"
     
    3941  import="net.sf.basedb.core.SessionControl"
    4042  import="net.sf.basedb.core.SystemItems"
     43  import="net.sf.basedb.core.PermissionDeniedException"
    4144  import="net.sf.basedb.core.query.Restrictions"
    4245  import="net.sf.basedb.core.query.Orders"
     
    7578  List<BioPlateType> recentPlateTypes = (List<BioPlateType>)cc.getRecent(dc, Item.BIOPLATETYPE, sourceBioMaterialType.name());
    7679  List<Hardware> recentFreezers = (List<Hardware>)cc.getRecent(dc, Item.HARDWARE, "freezer");
     80 
     81  // Load subtypes
     82  final List<ItemSubtype> sampleSubtypes = sourceBioMaterialType == Item.SAMPLE ?
     83    Base.getSubtypesQuery(Item.SAMPLE).list(dc) : null;
     84  final List<ItemSubtype> extractSubtypes = Base.getSubtypesQuery(Item.EXTRACT).list(dc);
     85  final List<ItemSubtype> bioAssaySubtypes = sourceBioMaterialType == Item.EXTRACT ?
     86    Base.getSubtypesQuery(Item.PHYSICALBIOASSAY).list(dc) : null;
     87  // Find a common itemsubtype (if any)
     88  ItemSubtype commonSubtype = null;
     89  boolean first = true;
     90  for (BioWell well : sourcePlate.getBioWells().list(dc))
     91  {
     92    try
     93    {
     94      if (!well.isEmpty())
     95      {
     96        ItemSubtype subtype = well.getBioMaterial().getItemSubtype();
     97        if (first)
     98        {
     99          commonSubtype = subtype;
     100          first = false;
     101        }
     102        else
     103        {
     104          if (subtype == null || !subtype.equals(commonSubtype))
     105          {
     106            commonSubtype = null;
     107            break;
     108          }
     109        }
     110      }
     111    }
     112    catch (PermissionDeniedException ex)
     113    {}
     114  }
    77115   
    78116  final String clazz = "class=\"text\"";
     
    84122  %>
    85123  <base:page type="popup" title="Create child bioplate - step 1/2">
    86   <base:head>
     124  <base:head scripts="subtypes.js,ajax.js">
    87125    <script language="javascript">
    88126 
     
    135173      }
    136174      url += '&resetTemporary=1';
     175      var childType = frm.child_biomaterial_type[frm.child_biomaterial_type.selectedIndex].value;
     176      url += ItemSubtype.createRelatedFilter('main', 'HARDWARE', '', childType+'_subtype_id');
    137177      Main.openPopup(url, 'SelectHardware', 1000, 700);
    138178    }
     
    154194      var frm = document.forms['main'];
    155195      var url = '../../admin/protocols/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setProtocolCallback';
     196      url += '&resetTemporary=1';
    156197      if (frm.protocol_id.length > 1)
    157198      {
     
    159200        url += '&item_id='+id;
    160201      }
    161       url += '&resetTemporary=1';
     202      var childType = frm.child_biomaterial_type[frm.child_biomaterial_type.selectedIndex].value;
     203      url += ItemSubtype.createRelatedFilter('main', 'PROTOCOL', '', childType+'_subtype_id');
    162204      Main.openPopup(url, 'SelectProtocol', 1000, 700);
    163205    }
     206
    164207    function setProtocolCallback(id, name)
    165208    {
     
    174217      list.selectedIndex = 1;
    175218    }
     219   
     220    function selectTagOnClick()
     221    {
     222      var frm = document.forms['main'];
     223      var url = '../tags/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setTagCallback';
     224      url += '&resetTemporary=1';
     225      if (frm.protocol_id.length > 1)
     226      {
     227        var id = Math.abs(parseInt(frm.protocol_id[1].value));       
     228        url += '&item_id='+id;
     229      }
     230      var childType = frm.child_biomaterial_type[frm.child_biomaterial_type.selectedIndex].value;
     231      url += ItemSubtype.createRelatedFilter('main', 'TAG', '', childType+'_subtype_id');
     232      Main.openPopup(url, 'SelectTag', 1000, 700);
     233    }
     234
     235    function setTagCallback(id, name)
     236    {
     237      var frm = document.forms['main'];
     238      var list = frm.tag_id;
     239      if (list.length < 2 || list[1].value == '0') // >
     240      {
     241        Forms.addListOption(list, 1, new Option());
     242      }
     243      list[1].value = id;
     244      list[1].text = name;
     245      list.selectedIndex = 1;
     246    }
     247
    176248   
    177249    function selectPlateGeometryOnClick()
     
    196268    }
    197269
     270    var bioMaterialTypes = { 'EXTRACT': <%=Item.EXTRACT.getValue()%>, 'SAMPLE': <%=Item.SAMPLE.getValue()%> };
    198271    function selectBioPlateTypeOnClick()
    199272    {
     
    201274      var url = '../bioplatetypes/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setBioPlateTypeCallback';
    202275      if (frm.bioplatetype_id.length > 0) url += '&item_id='+frm.bioplatetype_id[0].value;
     276     
     277      url += '&resetTemporary=1';
     278      var childType = frm.child_biomaterial_type[frm.child_biomaterial_type.selectedIndex].value;
     279      // Restrict to plates that can holds to target biomaterial
     280      url += '&tmpfilter:INT:bioMaterialType=|'+bioMaterialTypes[childType];
     281      var subtypeId = ItemSubtype.getSubtypeId('main', childType+'_subtype_id');
     282      // Restrict to plates with the given subtype
     283      url += '&tmpfilter:INT:itemSubtype='+(subtypeId ? '|' + subtypeId : '=');
     284   
    203285      Main.openPopup(url, 'SelectBioPlateType', 1000, 700);
    204286    }
     
    242324      var frm = document.forms['main'];
    243325      var childType = frm.child_biomaterial_type[frm.child_biomaterial_type.selectedIndex].value;
    244       Main.showHide('tagDiv', childType == 'EXTRACT');
     326      var isSample = childType == 'SAMPLE';
     327      var isExtract = childType == 'EXTRACT';
    245328      var isBioAssay = childType == 'PHYSICALBIOASSAY';
     329      Main.showHide('sampleSubtypesDiv', isSample);
     330      Main.showHide('extractSubtypesDiv', isExtract);
     331      Main.showHide('bioAssaySubtypesDiv', isBioAssay);
     332      Main.showHide('tagDiv', isExtract);
    246333      Main.showHide('originalQuantityDiv', !isBioAssay);
    247334      Main.showHide('freezerDiv', !isBioAssay);
     
    260347  <base:body onload="init()">
    261348 
    262     <h3>Create child bioplate - step 1/2</h3>
     349    <h3>Create child bioplate - step 1/2 <base:help helpid="bioplateevent.create-child-1" /></h3>
    263350    <div class="boxedbottom" style="height: <%=(int)(scale*500)%>px; background: #e0e0e0;">
    264351      <form name="main" action="create_child_bioplate_step2.jsp" method="post">
     
    347434          <td class="prompt">Type</td>
    348435          <td>
    349             <select name="child_biomaterial_type" class="required" onchange="childTypeOnChange()">
     436            <select name="child_biomaterial_type" class="required selectionlist" onchange="childTypeOnChange()">
    350437              <%
    351438              if (sourceBioMaterialType == Item.SAMPLE)
     
    368455        </tr>
    369456        <%
    370         if (sourceBioMaterialType == Item.EXTRACT)
     457        if (sampleSubtypes != null && sampleSubtypes.size() > 0)
    371458        {
    372           final ItemQuery<Tag> tagsQuery = Tag.getQuery();
    373           tagsQuery.order(Orders.asc(Hql.property("name")));
    374           tagsQuery.include(Include.MINE, Include.SHARED, Include.IN_PROJECT, Include.OTHERS);
    375           tagsQuery.setCacheResult(true);
    376           final List<Tag> tags = tagsQuery.list(dc);
    377459          %>
    378           <tr id="tagDiv">
    379             <td class="prompt">Tag</td>
     460          <tr id="sampleSubtypesDiv" style="display: none;">
     461            <td class="prompt">Subtype</td>
    380462            <td>
    381               <select name="tag_id" size="1"
    382                 style="width: 20em;">
    383                 <option value="">- none -
     463              <select name="SAMPLE_subtype_id" class="selectionlist">
     464                <option value="0">- none -
    384465                <%
    385                 for (Tag tag : tags)
     466                int currentSubtypeId = 0;
     467                if (commonSubtype != null)
    386468                {
     469                  List<ItemSubtype> relatedToParent = ItemSubtype.getParentSubtypes(dc, commonSubtype, Item.SAMPLE);
     470                  if (relatedToParent.size() > 0) currentSubtypeId = relatedToParent.get(0).getId();
     471                }
     472                for (ItemSubtype subtype : sampleSubtypes)
     473                {
     474                  int id = subtype.getId();
    387475                  %>
    388                   <option value="<%=tag.getId()%>"><%=HTML.encodeTags(tag.getName())%>
     476                  <option value="<%=id%>"
     477                    <%=id == currentSubtypeId ? "selected" : ""%>
     478                    title="<%=HTML.encodeTags(subtype.getDescription()) %>"
     479                    ><%=HTML.encodeTags(subtype.getName())%>
     480                  <%
     481                }
     482                %>
     483              </select>
     484            </td>
     485          </tr>
     486          <%
     487        }
     488        if (extractSubtypes != null && extractSubtypes.size() > 0)
     489        {
     490          %>
     491          <tr id="extractSubtypesDiv" style="display: none;">
     492            <td class="prompt">Subtype</td>
     493            <td>
     494              <select name="EXTRACT_subtype_id" class="selectionlist">
     495                <option value="0">- none -
     496                <%
     497                int currentSubtypeId = 0;
     498                if (commonSubtype != null)
     499                {
     500                  List<ItemSubtype> relatedToParent = ItemSubtype.getParentSubtypes(dc, commonSubtype, Item.EXTRACT);
     501                  if (relatedToParent.size() > 0) currentSubtypeId = relatedToParent.get(0).getId();
     502                }
     503                for (ItemSubtype subtype : extractSubtypes)
     504                {
     505                  int id = subtype.getId();
     506                  %>
     507                  <option value="<%=id%>"
     508                    <%=id == currentSubtypeId ? "selected" : ""%>
     509                    title="<%=HTML.encodeTags(subtype.getDescription()) %>"
     510                    ><%=HTML.encodeTags(subtype.getName())%>
    389511                  <%
    390512                }
     
    396518        }
    397519        %>
    398        
     520        <%
     521        if (bioAssaySubtypes != null && bioAssaySubtypes.size() > 0)
     522        {
     523          %>
     524          <tr id="bioAssaySubtypesDiv" style="display: none;">
     525            <td class="prompt">Subtype</td>
     526            <td>
     527              <select name="PHYSICALBIOASSAY_subtype_id" class="selectionlist">
     528                <option value="0">- none -
     529                <%
     530                int currentSubtypeId = 0;
     531                if (commonSubtype != null)
     532                {
     533                  List<ItemSubtype> relatedToParent = ItemSubtype.getParentSubtypes(dc, commonSubtype, Item.PHYSICALBIOASSAY);
     534                  if (relatedToParent.size() > 0) currentSubtypeId = relatedToParent.get(0).getId();
     535                }
     536                for (ItemSubtype subtype : bioAssaySubtypes)
     537                {
     538                  int id = subtype.getId();
     539                  %>
     540                  <option value="<%=id%>"
     541                    <%=id == currentSubtypeId ? "selected" : ""%>
     542                    title="<%=HTML.encodeTags(subtype.getDescription()) %>"
     543                    ><%=HTML.encodeTags(subtype.getName())%>
     544                  <%
     545                }
     546                %>
     547              </select>
     548            </td>
     549          </tr>
     550          <%
     551        }
     552        %>
     553        <tr id="tagDiv" style="display: none;">
     554          <td class="prompt">Tag</td>
     555          <td>
     556            <base:select
     557              id="tag_id"
     558              clazz="selectionlist"
     559              required="false"
     560              unselectedtext="<%=sourceBioMaterialType == Item.SAMPLE ? "- none -" : "- same as parent -" %>"
     561              current="<%=null%>"
     562              onselect="selectTagOnClick()"
     563            />
     564          </td>
     565        </tr>
    399566        <tr id="originalQuantityDiv">
    400567          <td class="prompt">Original quantity</td>
  • trunk/www/biomaterials/wizards/create_child_bioplate_step2.jsp

    r5642 r5723  
    717717      <!-- child biomaterial properties -->
    718718      <input type="hidden" name="child_biomaterial_type" value="<%=childBioMaterialType.name()%>">
     719      <input type="hidden" name="subtype_id" value="<%=request.getParameter(childBioMaterialType.name() + "_subtype_id")%>">
    719720      <input type="hidden" name="original_quantity" value="<%=HTML.encodeTags(request.getParameter("original_quantity"))%>">
    720721      <input type="hidden" name="used_quantity" value="<%=HTML.encodeTags(request.getParameter("used_quantity"))%>">
    721722      <input type="hidden" name="child_description" value="<%=HTML.encodeTags(request.getParameter("child_description"))%>">
    722       <input type="hidden" name="label_id" value="<%=HTML.encodeTags(request.getParameter("label_id"))%>">
     723      <input type="hidden" name="tag_id" value="<%=HTML.encodeTags(request.getParameter("tag_id"))%>">
    723724 
    724725    <tbl:toolbar id="toolbar.mappings" style="border-left: 0px; border-right: 0px; border-top: 0px;">
  • trunk/www/biomaterials/wizards/index.jsp

    r5722 r5723  
    4343  import="net.sf.basedb.core.Extract"
    4444  import="net.sf.basedb.core.Tag"
     45  import="net.sf.basedb.core.ItemSubtype"
    4546  import="net.sf.basedb.core.PlateGeometry"
    4647  import="net.sf.basedb.core.InvalidDataException"
     
    239240      }
    240241    }
     242    ItemSubtype subtype = null;
     243    int subtypeId = Values.getInt(request.getParameter("subtype_id"));
     244    if (subtypeId > 0)
     245    {
     246      subtype = ItemSubtype.getById(dc, subtypeId);
     247      cc.setRecent(subtype, sourceBioMaterialType.name(), maxRecent);
     248    }
     249    Tag tag = null;
     250    int tagId = Values.getInt(request.getParameter("tag_id"));
     251    if (tagId > 0)
     252    {
     253      tag = Tag.getById(dc, tagId);
     254    }
    241255    int numChildPlates = Values.getInt(request.getParameter("number_of_plates"));
    242256    int size = Values.getInt(request.getParameter("size"));
     
    270284        pba.setDescription(Values.getStringOrNull(request.getParameter("plate_description")));
    271285        pba.setSize(size);
     286        pba.setItemSubtype(subtype);
    272287        dc.saveItem(pba);
    273288        pbaCreationEvent = pba.getCreationEvent();
     
    302317              BioWell well = childPlate.getBioWell(row, column);
    303318              MeasuredBioMaterial child = null;
    304               boolean pooled = childBioMaterialType == sourceBioMaterialType;
    305319              if (childBioMaterialType == Item.SAMPLE)
    306320              {
     
    309323              else if (childBioMaterialType == Item.EXTRACT)
    310324              {
    311                 child = Extract.getNew(dc, destParticipant);
    312                 //if (!pooled) ((Extract)child).setSample((Sample)parent).setUsedQuantity(usedQuantity);
     325                Extract extract = Extract.getNew(dc, destParticipant);
     326                if (tag != null)
     327                {
     328                  extract.setTag(tag);
     329                }
     330                else if (parent instanceof Extract)
     331                {
     332                  extract.setTag(((Extract)parent).getTag());
     333                }
     334                child = extract;
    313335              }
    314               /*
    315               else if (childBioMaterialType == Item.LABELEDEXTRACT)
    316               {
    317                 Label label = Label.getById(dc, Values.getInt(request.getParameter("label_id")));
    318                 child = LabeledExtract.getNew(dc, label, destParticipant);
    319                 if (!pooled) ((LabeledExtract)child).setExtract((Extract)parent, usedQuantity);
    320               }
    321               */
    322336              else
    323337              {
    324338                throw new InvalidDataException("Can't create child biomaterial of type: " + childBioMaterialType);
    325339              }
     340              child.setItemSubtype(subtype);
    326341              child.setName(Values.getStringOrNull(request.getParameter(prefix + ".name")));
    327342              child.setDescription(Values.getStringOrNull(request.getParameter("child_description")));
    328343              child.setBioWell(well);
    329344              child.setOriginalQuantity(originalQuantity);
    330              
    331               if (pooled)
    332               {
    333                 child.getCreationEvent().addSource(parent).setUsedQuantity(usedQuantity);
    334               }
     345              child.getCreationEvent().setSource(parent).setUsedQuantity(usedQuantity);
    335346              dc.saveItem(child);
    336347            }
     
    339350        }
    340351      }
    341      
    342352    }
    343353
  • trunk/www/biomaterials/wizards/move_biomaterial.jsp

    r5722 r5723  
    7373  catch (PermissionDeniedException ex)
    7474  {}
     75  // Find a common itemsubtype (if any)
    7576  ItemSubtype commonSubtype = null;
    7677  boolean first = true;
  • trunk/www/include/scripts/subtypes.js

    r5701 r5723  
    9292  }
    9393
    94   this.createRelatedFilter = function(formId, relatedItemType, defaultSubtypeId)
    95   {
    96     var subtypeId = this.getSubtypeId(formId);
     94  this.createRelatedFilter = function(formId, relatedItemType, defaultSubtypeId, listName)
     95  {
     96    var subtypeId = this.getSubtypeId(formId, listName);
    9797    var relatedSubtype = this.getRelatedSubtype(subtypeId, relatedItemType, defaultSubtypeId);
    9898    return relatedSubtype ? '&tmpfilter:INT:itemSubtype=' + relatedSubtype.id : '';
    9999  }
    100100 
    101   this.getSubtypeId = function(formId)
     101  this.getSubtypeId = function(formId, listName)
    102102  {
    103103    var frm = document.forms[formId];
    104104    if (!frm) return null;
    105     var list = frm['subtype_id'];
     105    if (!listName) listName = 'subtype_id';
     106    var list = frm[listName];
    106107    if (!list || list.disabled || list.length == 0) return null;
    107108    return Math.abs(parseInt(list[list.selectedIndex].value));
Note: See TracChangeset for help on using the changeset viewer.