Changeset 6955


Ignore:
Timestamp:
Sep 28, 2015, 1:38:54 PM (6 years ago)
Author:
Nicklas Nordborg
Message:

References #1941: Store experimental factor values as part experiments

Implemented support for multi-valued annotations.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/clients/web/net/sf/basedb/clients/web/Base.java

    r6947 r6955  
    15141514        }
    15151515      }
    1516      
    1517       /*
    1518       for (int i = 0; i < modifiedAnnotations.length; ++i)
    1519       {
    1520         int annotationTypeId = Values.getInt(modifiedAnnotations[i], -1);
    1521         if (annotationTypeId != -1)
    1522         {
    1523           AnnotationType at = AnnotationType.getById(dc, annotationTypeId);
    1524           String[] values = request.getParameterValues(String.valueOf(at.getId()));
    1525           int unitId = Values.getInt(request.getParameter("unit:" + at.getId()), 0);
    1526           Unit unit = unitId == 0 ? null : Unit.getById(dc, unitId);
    1527           Annotation oldAn = oldAs == null || !oldAs.hasAnnotation(at, Annotation.Source.PRIMARY) ?
    1528             null : oldAs.getAnnotation(at);
    1529           Annotation newAn = newAs.hasAnnotation(at, Annotation.Source.PRIMARY) || values != null ?
    1530             newAs.getAnnotation(at) : null;
    1531           if (newAn == null) continue;
    1532 
    1533           if (oldAn == null && newAn.isInDatabase() || oldAn != null && oldAn.getValuesVersion() != newAn.getValuesVersion())
    1534           {
    1535             throw new ItemModifiedException(at.toString());
    1536           }
    1537           Type valueType = at.getValueType();
    1538           if (values == null)
    1539           {
    1540             newAs.removeAnnotation(at);
    1541           }
    1542           else
    1543           {
    1544             Object[] oValues = new Object[values.length];
    1545             Formatter<?> formatter = FormatterFactory.getTypeFormatter(dc.getSessionControl(), valueType);
    1546             for (int j = 0; j < values.length; ++j)
    1547             {
    1548               oValues[j] = formatter.parseString(values[j]);
    1549             }
    1550             newAn.setValues(Arrays.asList(oValues), unit);
    1551           }
    1552         }
    1553       }
    1554       */
    15551516    }
    15561517   
    1557     // Inherited annotations and annotation sets
    1558    
    1559     // Annotations that are no longer inherited
    1560     String removed = Values.getStringOrNull(request.getParameter("removedAnnotations"));
    1561     if (removed != null)
    1562     {
    1563       String[] removedAnnotations = removed.split(",");
    1564       AnnotationSet newAs = newItem.getAnnotationSet();
    1565       for (int i = 0; i < removedAnnotations.length; ++i)
    1566       {
    1567         int annotationId = Values.getInt(removedAnnotations[i], -1);
    1568         if (annotationId != -1)
    1569         {
    1570           newAs.removeInheritedAnnotation(Annotation.getById(dc, annotationId));
    1571         }
    1572       }
    1573     }
    1574    
    1575     // Annotations that we now are inheriting
    1576     String added = Values.getStringOrNull(request.getParameter("addedAnnotations"));
    1577     if (added != null)
    1578     {
    1579       String[] addedAnnotations = added.split(",");
    1580       AnnotationSet newAs = newItem.getAnnotationSet();
    1581       for (int i = 0; i < addedAnnotations.length; ++i)
    1582       {
    1583         int annotationId = Values.getInt(addedAnnotations[i], -1);
    1584         if (annotationId != -1)
    1585         {
    1586           newAs.inheritAnnotation(Annotation.getById(dc, annotationId), false);
    1587         }
    1588       }
    1589     }
    15901518  }
    15911519 
  • trunk/www/common/annotations/annotate.js

    r6947 r6955  
    3636  var parents;
    3737  var selectedAnnotation;
    38   var selectedIndex;
     38  var selectedMultiIndex;
    3939 
    4040
     
    6161    // Event handlers for input fields
    6262    Events.addEventHandler('STRING-input', 'change', annotate.valueOnChange);
     63    Events.addEventHandler('STRING-input', 'blur', annotate.valueOnBlur);
    6364    Events.addEventHandler('TEXT-input', 'change', annotate.valueOnChange);
     65    Events.addEventHandler('TEXT-input', 'blur', annotate.valueOnBlur);
    6466    Buttons.addClickHandler('TEXT-zoom', annotate.openTextZoom);
    6567    Events.addEventHandler('INT-input', 'keypress', Events.integerOnly);
    6668    Events.addEventHandler('INT-input', 'change', annotate.valueOnChange);
     69    Events.addEventHandler('INT-input', 'blur', annotate.valueOnBlur);
    6770    Events.addEventHandler('LONG-input', 'keypress', Events.integerOnly);
    6871    Events.addEventHandler('LONG-input', 'change', annotate.valueOnChange);
     72    Events.addEventHandler('LONG-input', 'blur', annotate.valueOnBlur);
    6973    Events.addEventHandler('FLOAT-input', 'keypress', Events.numberOnly);
    7074    Events.addEventHandler('FLOAT-input', 'change', annotate.valueOnChange);
     75    Events.addEventHandler('FLOAT-input', 'blur', annotate.valueOnBlur);
    7176    Events.addEventHandler('DOUBLE-input', 'keypress', Events.numberOnly);
    7277    Events.addEventHandler('DOUBLE-input', 'change', annotate.valueOnChange);
     78    Events.addEventHandler('DOUBLE-input', 'blur', annotate.valueOnBlur);
    7379    Events.addEventHandler('DATE-input', 'change', annotate.valueOnChange);
     80    Events.addEventHandler('DATE-input', 'blur', annotate.valueOnBlur);
    7481    Buttons.addClickHandler('DATE-calendar', annotate.openCalendar);
    7582    Events.addEventHandler('TIMESTAMP-input', 'change', annotate.valueOnChange);
     83    Events.addEventHandler('TIMESTAMP-input', 'blur', annotate.valueOnBlur);
    7684    Buttons.addClickHandler('TIMESTAMP-calendar', annotate.openCalendar);
    7785    Events.addEventHandler('BOOLEAN-input-NULL', 'click', annotate.valueOnChange);
     
    8189    Events.addEventHandler('ENUM-MULTIPLE-input', 'change', annotate.valueOnChange);
    8290
    83     /*
    8491    // Buttons for multi-valued annotations
    8592    Buttons.addClickHandler('btnMultiAdd', annotate.addMultiValue);
     
    8996   
    9097    // The category list box is used to filter visible annotations
    91     */
    9298    Events.addEventHandler('categories', 'change', annotate.categoryOnChange);
    9399    annotate.categoryOnChange();
     
    270276    // category list doesn't hide it
    271277    selectedAnnotation = annotate.getEntryById(entryId);
    272 
     278    selectedMultiIndex = -1;
     279   
    273280    var classes = [];
    274281    var valueElement;
     
    358365      }
    359366     
     367     
    360368      // Fill form with current values
    361       var values = ann.values.length > 0 ? ann.values : [''];
     369      var values = ann.values.length > 0 || at.multiplicity != 1 ? ann.values : [''];
    362370      if (valueElement.type && valueElement.type.indexOf('select') == 0)
    363371      {
     
    386394        else
    387395        {
    388           // TODO - multivalues annotation
     396          classes.push('multiple');
     397          // Fill the 'multi-values' list with the current values
     398          var multiValues = frm['multi-values'];
     399          multiValues.length = 0;
     400          for (var i = 0; i < values.length; i++)
     401          {
     402            multiValues[multiValues.length] = new Option(values[i]);
     403          }
     404          valueElement.value = '';
    389405        }
    390406      }
     
    392408    Doc.element('selected-container').className = classes.join(' ');
    393409    if (valueElement && valueElement.focus) valueElement.focus();
    394    
    395       /*
    396       else if (at.multiplicity == 1)
    397       {
    398         if (ann && ann.values && ann.values.length > 0)
    399         {
    400           if (valueElement.length) // ie. radio buttons for boolean parameter
    401           {
    402             Forms.checkRadio(valueElement, ann.values[0]);
    403           }
    404           else
    405           {
    406            
    407             valueElement.value = ann.values[0];
    408           }
    409         }
    410       }
    411       */
    412       /*
    413       else
    414       {
    415         var multiValues = frm['multi-values'];
    416         multiValues.length = 0;
    417         for (var i = 0; i < selectedAnnotation.values.length; i++)
    418         {
    419           multiValues[multiValues.length] = new Option(selectedAnnotation.values[i]);
    420         }
    421         var mult = Doc.element('multiplicity');
    422         mult.innerHTML = selectedAnnotation.multiplicity == 0 ? '' : '(Max '+selectedAnnotation.multiplicity+' values)';
    423         Doc.show('valuecontainer');
    424       }
    425       */
    426 
    427    
    428410  }
    429411 
     
    465447      {
    466448        typeSummary += ' &lt;= '+at.maxValue;
     449      }
     450      if (at.multiplicity > 1)
     451      {
     452        typeSummary += '; max '+at.multiplicity+' values';
    467453      }
    468454    }
     
    516502    var tmp = document.createDocumentFragment();
    517503    var ctlType = radio ? 'radio' : 'checkbox';
    518     if (includeNotSpecified)
     504    if (includeNotSpecified && radio)
    519505    {
    520506      var noop = annotate.createRadioOrCheckBox(ctlType, '', '- not specified -');
     
    560546    exception is thrown.
    561547  */
    562   annotate.setSingleValue = function(annotation, value)
     548  annotate.setSingleValue = function(entry, value)
    563549  {
    564550    var values = [];
     
    567553      values[0] = value;
    568554    }
    569     annotate.setMultipleValues(annotation, values);
     555    annotate.setMultipleValues(entry, values);
    570556  }
    571557 
     
    575561    exception is thrown.
    576562  */
    577   annotate.setMultipleValues = function(annotation, values)
    578   {
    579     var at = annotation.annotationType;
    580     var ann = annotation.annotation;
     563  annotate.setMultipleValues = function(entry, values)
     564  {
     565    var at = entry.annotationType;
     566    var ann = entry.annotation;
    581567   
    582568    if (at.multiplicity > 0 && values.length > at.multiplicity)
     
    585571    }
    586572    ann.values = values;
    587     annotation.modified = MODIFIED;
    588     annotate.updateIcon(annotation);
     573    entry.modified = MODIFIED;
     574    annotate.updateIcon(entry);
    589575  }
    590576 
     
    593579    is not accepted an exception is thrown.
    594580  */
    595   /*
    596   annotate.setIndexedValue = function(annotation, index, value)
    597   {
     581  annotate.setIndexedValue = function(entry, index, value)
     582  {
     583    var ann = entry.annotation;
     584    var at = entry.annotationType;
     585   
    598586    if (!value)
    599587    {
    600       if (index < annotation.values.length)
    601       {
    602         annotation.values.splice(index, 1);
     588      if (index < ann.values.length)
     589      {
     590        ann.values.splice(index, 1);
    603591      }
    604592    }
    605593    else
    606594    {
    607       if (index >= annotation.values.length)
     595      if (index >= ann.values.length)
    608596      {
    609597        // Add a new value
    610         if (annotation.multiplicity > 0 && annotation.values.length >= annotation.multiplicity)
    611         {
    612           throw 'Max '+annotation.multiplicity+' values allowed';
    613         }
    614         index = annotation.values.length;
    615       }
    616       annotation.values[index] = value;
    617     }
    618     annotation.modified = true;
    619     annotate.updateIcon(annotation);
    620   }
    621   */
     598        if (at.multiplicity > 0 && ann.values.length >= at.multiplicity)
     599        {
     600          throw 'Max '+at.multiplicity+' values allowed';
     601        }
     602        index = ann.values.length;
     603      }
     604      ann.values[index] = value;
     605    }
     606    entry.modified = MODIFIED;
     607    annotate.updateIcon(entry);
     608  }
    622609 
    623610  /**
     
    649636        annotate.setSingleValue(selectedAnnotation, target.value);
    650637      }
    651       /*
    652638      else if (at.enumeration)
    653639      {
     
    668654      {
    669655        // Otherwise we use the 'multi-values' control and update the currently
    670         // selected option
    671         if (selectedIndex >= 0)
    672         {
    673           annotate.setIndexedValue(selectedAnnotation, selectedIndex, target.value);
     656        // selected option (but note that we can't use 'selectedIndex' property of the
     657        // list control, since it may already point to the future selection
     658        var selectedIndex = frm['multi-values'].selectedIndex;
     659        if (selectedMultiIndex >= 0)
     660        {
     661          annotate.setIndexedValue(selectedAnnotation, selectedMultiIndex, target.value);
    674662          var multiValues = frm['multi-values'];
    675663          if (!target.value)
    676664          {
    677             multiValues[selectedIndex] = null;
    678             selectedIndex = -1;
     665            multiValues[selectedMultiIndex] = null;
     666            selectedMultiIndex = -1;
    679667          }
    680668          else
    681669          {
    682             multiValues[selectedIndex].text = target.value;
     670            multiValues[selectedMultiIndex].text = target.value;
    683671          }
    684672        }
    685673      }
    686       */
    687674    }
    688675    catch (errorMessage)
     
    690677      event.preventDefault();
    691678      Forms.showNotification(event.currentTarget, errorMessage);
     679    }
     680  }
     681 
     682  // To catch the case if 'new' was clicked but no value was entered
     683  annotate.valueOnBlur = function(event)
     684  {
     685    if (!selectedAnnotation && selectedMultiIndex < 0) return;
     686   
     687    var frm = document.forms['annotations'];
     688   
     689    if (event.currentTarget.value == '' && frm['multi-values'][selectedMultiIndex].isNewValue)
     690    {
     691      // This will remove the new but empty value
     692      Events.sendChangeEvent(event.currentTarget);
     693    }
     694    else
     695    {
     696      frm['multi-values'][selectedMultiIndex].isNewValue = false;
    692697    }
    693698  }
     
    10201025  }
    10211026 
    1022   /*
    10231027  annotate.addMultiValue = function(event)
    10241028  {
    10251029    if (!selectedAnnotation) return;
    10261030   
     1031    var at = selectedAnnotation.annotationType;
     1032
    10271033    var frm = document.forms['annotations'];
    1028     var valueElement = frm['value.'+selectedAnnotation.id];
     1034    var valueElement = frm[at.valueType+'-input'];
     1035   
    10291036    var multiValues = frm['multi-values'];
    10301037    var errorMessage = null;
    10311038    try
    10321039    {
    1033       if (selectedIndex >= 0)
     1040      // If one item is already selected, we create a new entry
     1041      if (selectedMultiIndex >= 0)
    10341042      {
    10351043        // Add a new option
     
    10371045        if (!errorMessage)
    10381046        {
    1039           multiValues[multiValues.length] = new Option('<new>', '', false, true);
    1040           selectedIndex = multiValues.length-1;
     1047          var opt = new Option('<new>', '', false, true);
     1048          opt.isNewValue = true;
     1049          multiValues[multiValues.length] = opt;
     1050          selectedMultiIndex = multiValues.length-1;
    10411051          valueElement.value = '';
    10421052        }
     
    10531063      }
    10541064      valueElement.focus();
    1055       annotate.updateIcon(selectedAnnotation);
    10561065    }
    10571066    catch (errorMessage)
     
    10631072  annotate.removeMultiValue = function()
    10641073  {
    1065     if (!selectedAnnotation || selectedIndex < 0) return;
    1066    
     1074    if (!selectedAnnotation) return;
     1075
    10671076    var frm = document.forms['annotations'];
    1068     var multiValues = frm['multi-values'];
    1069    
    1070     annotate.setIndexedValue(selectedAnnotation, multiValues.selectedIndex, null);
    1071     multiValues[multiValues.selectedIndex] = null;
    1072     frm['value.'+selectedAnnotation.id].value = '';
    1073     frm['value.'+selectedAnnotation.id].focus();
    1074   }
    1075   */
    1076  
     1077    var selectedIndex = frm['multi-values'].selectedIndex;
     1078   
     1079    if (selectedIndex >= 0)
     1080    {
     1081      // Clear the current value, and send a 'change' event to let the
     1082      // regular event handlers take care of the removal
     1083      var at = selectedAnnotation.annotationType;
     1084      var valueElement = frm[at.valueType+'-input'];
     1085      valueElement.value = '';
     1086      Events.sendChangeEvent(valueElement);
     1087    }
     1088  }
     1089   
    10771090  /**
    10781091    Event handler for the 'multi-values' selection list. This should change
    10791092    the value that is currently being edited to the selected option.
    10801093  */
    1081   /*
    1082   annotate.multiValueOnClick = function()
     1094  annotate.multiValueOnClick = function(event)
    10831095  {
    10841096    if (!selectedAnnotation) return;
     1097   
     1098    var at = selectedAnnotation.annotationType;
     1099    var ann = selectedAnnotation.annotation;
     1100   
    10851101    var frm = document.forms['annotations'];
    1086     selectedIndex = frm['multi-values'].selectedIndex;
    1087     if (selectedIndex >= 0)
    1088     {
    1089       frm['value.'+selectedAnnotation.id].value = selectedAnnotation.values[selectedIndex];
    1090       frm['value.'+selectedAnnotation.id].focus();
    1091     }
    1092   }
    1093   */
     1102    selectedMultiIndex = event.currentTarget.selectedIndex;
     1103    if (selectedMultiIndex >= 0)
     1104    {
     1105      var valueElement = frm[at.valueType+'-input'];
     1106      valueElement.value = ann.values[selectedMultiIndex];
     1107      valueElement.focus();
     1108    }
     1109  }
    10941110 
    10951111 
     
    11841200          tmp.annotationId = entry.annotation.id;
    11851201          tmp.unitId = entry.annotation.unit;
     1202          if (tmp.modified == MODIFIED && tmp.values.length == 0)
     1203          {
     1204            tmp.modified = DELETE;
     1205          }
    11861206        }
    11871207        if (entry.inherited)
     
    11921212    }
    11931213   
    1194     alert(JSON.stringify(modified));
     1214    //alert(JSON.stringify(modified));
    11951215   
    11961216    if (frm.modifiedAnnotations)
  • trunk/www/common/annotations/annotate.jsp

    r6947 r6955  
    458458  }
    459459  #selected-container.has-unit #unit-container
     460  {
     461    display: block;
     462  }
     463  #selected-container.multiple #multiple-container
    460464  {
    461465    display: block;
     
    603607        }
    604608        %>
    605         <div id="valuecontainer" style="display: none;">
    606           <b>Values</b> <span id="multiplicity"></span><br>
    607           <select name="multi-values" id="multi-values" size="5" style="width: 100%;">
    608           </select>
    609           <table>
    610           <tr>
    611             <td><base:button id="btnMultiAdd" title="Add" tooltip="Add a new value" /></td>
    612             <td><base:button id="btnMultiRemove" title="Remove" tooltip="Remove the selected values"/></td>
    613           </tr>
    614           </table>
    615         <br>
    616         </div>
    617609       
    618610        <div id="selected-container">
     
    638630       
    639631          <div id="input-container">
     632            <div id="multiple-container">
     633             
     634              <select name="multi-values" id="multi-values" size="5" style="width: calc(100% - 8px);">
     635              </select>
     636              <table>
     637              <tr>
     638                <td><base:button id="btnMultiAdd" title="Add" tooltip="Add a new value" /></td>
     639                <td><base:button id="btnMultiRemove" title="Remove" tooltip="Remove the selected values"/></td>
     640              </tr>
     641              </table>
     642            </div>
    640643         
    641644            <div id="ENUM-SINGLE">
    642645              <select name="ENUM-SINGLE-input" id="ENUM-SINGLE-input"
    643                 style="min-width: 5em;">
     646                style="min-width: 15em;">
    644647              </select>
    645648            </div>
     
    647650            <div id="ENUM-MULTIPLE">
    648651              <select name="ENUM-MULTIPLE-input" id="ENUM-MULTIPLE-input"
    649                 multiple size="10" style="min-width: 5em;">
     652                multiple size="10" style="min-width: 15em;">
    650653              </select>
    651654            </div>
     
    763766                value="false">false</label>
    764767            </div>
     768           
     769           
    765770          </div>
    766771         
Note: See TracChangeset for help on using the changeset viewer.