Shuttle Component Fails to Transfer Short Description on Item Move
------------------------------------------------------------------

                 Key: TRINIDAD-723
                 URL: https://issues.apache.org/jira/browse/TRINIDAD-723
             Project: MyFaces Trinidad
          Issue Type: Bug
          Components: Components
    Affects Versions: 1.2.1-core
         Environment: [EMAIL PROTECTED]:~> uname -a
Linux aragorn 2.6.11.4-21.13-default #1 Mon Jul 17 09:21:59 UTC 2006 i686 i686 
i386 GNU/Linux

Eclipse Europa 3.3 with MyEclipse 3.3 M1.

Using JSF RI 1.2:
INFO: Initializing Sun's JavaServer Faces implementation (1.2_04-b16-p02) for 
context '/trinidaddemo' 
            Reporter: Gregg Leichtman


I have found and fixed what appears to be a bug in the shuttle component 
JavaScript code. This bug might affect other components as well. Any component 
that uses the TrShuttleProxy._moveItems and the TrShuttleProxy._moveAllItems 
functions would be affected.

The problem is that the title attribute for the HTML option tag is not 
propagated from the leading to the trailing portion of the shuttle or 
vice-versa when the user selects move or move all. Therefore, the short 
description attribute in the shuttle tags are converted to title attributes on 
the HTML options and show a tooltip on initial page load but are lost as soon 
as the user moves one or more selections between the leading and trailing 
portions of the shuttle. This seems to occur because the JavaScript that 
handles item moving simply has no code to propagate the HTML title attribute 
between the leading and trailing portions of the shuttle.

I have patched and overridden the generated JavaScript code as shown below to 
fix this problem (patched code demarcated by // gsl fix):

    /*
     * Overridden method to fix bug in generated code. gsl
     * Remove this code when fix is incorporated into Trinidad.
     * Should be incorporated by version 1.2.3.
     *
     * _moveItems
     *
     * This function moves the selected items in the 'from' list to the
     * 'to' list.  If no formName is supplied, the form is found when
     * this is called.  The items are inserted in the 'to' list
     * at the bottom. The 'from' and 'to' parameters should be the
     * list names(i.e.  "<shuttleName>:leading" or "<shuttleName>:trailing")
     */
    TrShuttleProxy._moveItems = function(
      from,
      to,
      formName
      )
    {
          //get the formName if needed
          if(formName == (void 0))
          {
            formName = TrShuttleProxy._findFormNameContaining(from);
          }
          if(formName.length == 0)
          {
            alert(shuttle_no_form_available);
            return;
          }
          //store the from and to lists
          var fromList = document.forms[formName].elements[from];
          var toList = document.forms[formName].elements[to];
          if ( fromList == (void 0 ) || toList == (void 0 ))
            return;
          //get all the indexes of the selected items
          var selItems = TrShuttleProxy._getSelectedIndexes(formName, from);
          //if no items are selected, return with alert.
          if(selItems.length == 0)
          {
            if (_shuttle_no_items_selected.length > 0)
              alert(_shuttle_no_items_selected);
            return;
          }
          var fromDescArray = TrShuttleProxy._getDescArray(from);
          var toDescArray = TrShuttleProxy._getDescArray(to);
          //set no selection on toList so it will only have new items selected.
          toList.selectedIndex = -1;
          //get the index in the toList to start inserting at.  Length-1 
because of
          //bars.
          var insertAt = toList.length-1;
          //save bar text so you know how long it should be
          var barText = toList.options[insertAt].text;
          //insert the items at the end of the toList
          for(var i=0; i<selItems.length; i++)
          {
            var oText = fromList.options[selItems[i]].text;
            var oValue = fromList.options[selItems[i]].value;
    var oTitle = fromList.options[selItems[i]].title // gsl fix
            if(i == 0)
            { //replace the bars
              toList.options[insertAt].text = oText;
              toList.options[insertAt].value = oValue;
            }
            else
            {  //have to make new item
              toList.options[insertAt] = new Option(oText, oValue, false, 
false);
            }
    toList.options[insertAt].title = oTitle; // gsl fix
            if ( toDescArray != (void 0) && fromDescArray != (void 0) )
              toDescArray[insertAt] = fromDescArray[selItems[i]];
            toList.options[insertAt].selected = true;
            insertAt++;
          }
          //insert a new bar at bottom of toList
          toList.options[insertAt] = new Option(barText, "", false, false);
          toList.options[insertAt].selected = false;
          //remove items from fromList.  do this backward to maintain indices
          for( var i=selItems.length-1; i >= 0; i--)
          {
            if ( fromDescArray != (void 0) )
              TrShuttleProxy._remove( fromDescArray, selItems[i], 1 );
            fromList.options[selItems[i]] = null;
          }
          //make no selected on fromList
          fromList.selectedIndex = -1;
          TrShuttleProxy._clearDescAreas( formName, from);
          TrShuttleProxy._displayDesc( to, formName );
          //make the new lists for submitting.
          TrShuttleProxy._makeList(formName, from);
          TrShuttleProxy._makeList(formName, to);
        }
       
    /*
     * Overridden method to fix bug in generated code. gsl
     * Remove this code when fix is incorporated into Trinidad.
     * Should be incorporated by version 1.2.3.
     *
     * _moveAllItems
     *
     * This function moves all the items in the 'from' list to the
     * 'to' list.  If no formName is supplied, the form is found when
     * this is called.  The items are inserted in the 'to' list
     * at the bottom. The 'from' and 'to' parameters should be the
     * list names(i.e.  "<shuttleName>:leading" or "<shuttleName>:trailing")
     */
    TrShuttleProxy._moveAllItems = function(
      from,
      to,
      formName
      )
    {
      //get the formName is needed
      if(formName == (void 0))
      {
        formName = TrShuttleProxy._findFormNameContaining(from);
      }
      //get the lists
      var fromList = document.forms[formName].elements[from];
      var toList = document.forms[formName].elements[to];
      //save the bar text for later use.
      var barText =
        toList.options[document.forms[formName].elements[to].length-1].text
      //get the index to start inserting at in the toList.  length-1 because of
      //bars
      var insertAt = toList.length-1;
      var fromDescArray = TrShuttleProxy._getDescArray(from);
      var toDescArray = TrShuttleProxy._getDescArray(to);
      //move the items
      if (fromList.length > 1)
      {
        //move all but the last (bars).
        var initialLength = fromList.length
        for(var i=0; i<initialLength-1; i++)
        {
          var oText = fromList.options[0].text;
          var oValue = fromList.options[0].value;
    var oTitle = fromList.options[0].title // gsl fix
          fromList.options[0] = null;
          if(i == 0)
          { //replace the bars
            toList.options[insertAt].text = oText;
            toList.options[insertAt].value = oValue;
          }
          else
          { //make new option
            toList.options[insertAt] = new Option (oText,oValue,false,false);
          }
    toList.options[insertAt].title = oTitle; // gsl fix
          if ( toDescArray != (void 0) && fromDescArray != (void 0) )
            toDescArray[insertAt] = fromDescArray[i];
              insertAt++;
        }
        //insert a new bar:
        toList.options[insertAt] = new Option(barText, "", false, false);
        toList.options[insertAt].selected = false;
        if ( fromDescArray != (void 0) )
        {
          var len = fromDescArray.length;
          TrShuttleProxy._remove(fromDescArray, 0, len);
        }
        //set no selection on both lists
        fromList.selectedIndex = -1;
        toList.selectedIndex = -1;
        TrShuttleProxy._clearDescAreas( formName, from, to );
        //make the lists for submission
        TrShuttleProxy._makeList(formName, from);
        TrShuttleProxy._makeList(formName, to);
      }
      else if (_shuttle_no_items.length > 0)
      {
        alert(_shuttle_no_items);
      }



-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to