jqGrid multi-checkbox custom edittype solution [closed]
Asked Answered
V

0

15

For those of you trying to understand jqGrid custom edit types ...

I created a multi-checkbox form element, and thought I'd share. This was built using version 3.6.4. If anyone has a more efficient solution, please pass it on.

Within the colModel, the appropriate edit fields look like this:

edittype:'custom'
editoptions:{ custom_element:MultiCheckElem, custom_value:MultiCheckVal, list:'Check1,Check2,Check3,Check4' }

Here are the javascript functions (BTW, It also works – with some modifications – when the list of checkboxes is in a DIV block):

//————————————————————
// Description:
//   MultiCheckElem is the "custom_element" function that builds the custom multiple check box input
//   element. From what I have gathered, jqGrid calls this the first time the form is launched. After
//   that, only the "custom_value" function is called.
//
//   The full list of checkboxes is in the jqGrid "editoptions" section "list" tag (in the options
//   parameter).
//————————————————————
function MultiCheckElem( value, options )
{
   //———-
   // for each checkbox in the list
   //   build the input element
   //   set the initial "checked" status
   // endfor
   //———-
   var ctl = '';
   var ckboxAry = options.list.split(',');

   for ( var i in ckboxAry )
   {
      var item = ckboxAry[i];
      ctl += '<input type="checkbox" ';

      if ( value.indexOf(item + '|') != -1 )
         ctl += 'checked="checked" ';
      ctl += 'value="' + item + '"> ' + item + '</input><br />&nbsp;';
   }

   ctl = ctl.replace( /<br />&nbsp;$/, '' );
   return ctl;
}



//————————————————————
// Description:
//   MultiCheckVal is the "custom_value" function for the custom multiple check box input element. It
//   appears that jqGrid invokes this function the first time the form is submitted and, the rest of
//   the time, when the form is launched (action = set) and when it is submitted (action = 'get').
//————————————————————
function MultiCheckVal(elem, action, val)
{
   var items = '';
   if (action == 'get') // the form has been submitted
   {
      //———-
      // for each input element
      //   if it's checked, add it to the list of items
      // endfor
      //———-
      for (var i in elem)
      {
         if (elem[i].tagName == 'INPUT' && elem[i].checked )
            items += elem[i].value + ',';
      }

      // items contains a comma delimited list that is returned as the result of the element
      items = items.replace(/,$/, '');
   }
   else // the form is launched
   {
      //———-
      // for each input element
      //   based on the input value, set the checked status
      // endfor
      //———-
      for (var i in elem)
      {
         if (elem[i].tagName == 'INPUT')
         {
            if (val.indexOf(elem[i].value + '|') == -1)
               elem[i].checked = false;
            else
               elem[i].checked = true;
         }
      } // endfor
   }

   return items;
}
Vaclava answered 13/5, 2010 at 7:12 Comment(2)
can you clarify how you are passing in selected values. what is this: val.indexOf(elem[i].value + '|') doing ??Abell
@ooo - jqGrid populates the "value" parameter with the contents of the cell that is being opened for edit. In this example, the cell contains the pipe-delimited list of the selected items (as stored in my database). In MultiCheckVal, The code you referenced checks each INPUT tag in "elem" to see if its content is in the pipe-delimited cell content (passed in "val"). Hope this helps.Vaclava

© 2022 - 2024 — McMap. All rights reserved.