Sortable: start event occurs without matching stop event preventing cursor style from changing back to default

Sortable: start event occurs without matching stop event preventing cursor style from changing back to default

A user reported that after trying to sort a table (that uses the sortable plugin) the cursor remained as the move cursor.

When I repeated the issue I noticed that a start event occurred but not a stop event so the style tag that is added to the body wasn't removed. 

This code shows how the sortable is set up.  Sorry I don't have a codepen or similar to show the issue. We are using jQuery v1.11.4.  I tried the latest version but the issue persisted.

Is there anything wrong with my setup or is this a bug?
  1. $rtbody. sortable(
    {
    axis: "y",
    cancel: ".rowsortdisabled,input,textarea,button,select,option",
    cursor: "move",
    delay: delay_opt,
    distance: distance_opt,
    handle: ".dragpoint",
    helper: function( e, ui)
    {
    $helper = ui;
    $scroll = ui. closest( ".rtscrollbody");
    //save scroll offset so that we can reset it during "start" event
    scrollOffset = $scroll. scrollTop();
    //create placeholder content with cell sizes based on dragged row
    h = ui. height();
    $placeholder = $helper. children(). map( function( i, el)
    {
    var w = ui. children(). eq( i). width();
    $pweb( this). width( w);
    return ( $pweb( "<td class='" + ( placeholderstyle ? placeholderstyle : '') + "' style='border-left:none; border-right:none;width:" + w + "px;height:" + h + "px;'>&nbsp;</td>")[ 0]);
    });
    $placeholder. first(). css( "border-right", null);
    $placeholder. last(). css( "border-left", null);
    $placeholder. css(
    {
    "box-sizing": "border-box"
    });
    return $helper;

    },
    items: "> .rowsortable",
    opacity: "0.5",
    placeholder: placeholderstyle ? placeholderstyle : false,
    revert: revert_opt,
    scroll: true,
    scrollSpeed: scrollSpeed_opt,
    start: function( event, ui)
    {
    var $parent = ui. item. parent();
    // insert the placeholder content
    ui. placeholder. empty(). append( $placeholder);
    // suppress the bottom border on the last row since it will appear once the item being sorted is moved to the end
    $lastRow. children(). css( "border-bottom", "none");
    // move hidden item to the bottom so that it doesn't screw up alternating colors
    ui. item. detach(). appendTo( $parent);
    // reset the scrollOffset
    $scroll. scrollTop( scrollOffset);
    },
    stop: Pweb. process. wrapCallback( function( event, ui)
    {
    if ( PwebProc. validation. errorElementId)
    {
    $rtbody. sortable( 'cancel');
    }
    }),
    update: Pweb. process. wrapCallback( function( event, ui)
    {
    // restore the last row's bottom border
    $lastRow. children(). css( "border-bottom", '');

    if ( Pweb. process. isVisible())
    {
    var dragEndEvent = $pweb. Event( "dragend",
    {
    dragdata: ui
    });
    var $comp = $pweb( ui. item). find( '.dragpoint'). first();
    $comp. trigger( dragEndEvent);
    }
    // If process isn't visible then cancel the sort operation
    else
    {
    $rtbody. sortable( 'cancel');
    }
    })
    });