|  | @@ -2,6 +2,8 @@ import { ReactiveCache } from '/imports/reactiveCache';
 | 
	
		
			
				|  |  |  import dragscroll from '@wekanteam/dragscroll';
 | 
	
		
			
				|  |  |  const { calculateIndex } = Utils;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  function currentListIsInThisSwimlane(swimlaneId) {
 | 
	
		
			
				|  |  |    const currentList = Utils.getCurrentList();
 | 
	
		
			
				|  |  |    return (
 | 
	
	
		
			
				|  | @@ -52,11 +54,9 @@ function initSortable(boardComponent, $listsDom) {
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    // Check if sortable is already initialized
 | 
	
		
			
				|  |  |    if ($listsDom.data('uiSortable') || $listsDom.data('sortable')) {
 | 
	
		
			
				|  |  | -    console.log('initSortable: Sortable already initialized, skipping');
 | 
	
		
			
				|  |  | -    return;
 | 
	
		
			
				|  |  | +    $listsDom.sortable('destroy');
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  | -  console.log('initSortable: Initializing sortable for', $listsDom.length, 'elements');
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    // We want to animate the card details window closing. We rely on CSS
 | 
	
		
			
				|  |  |    // transition for the actual animation.
 | 
	
	
		
			
				|  | @@ -77,31 +77,27 @@ function initSortable(boardComponent, $listsDom) {
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |    };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  console.log('Initializing list sortable with', $listsDom.length, 'elements');
 | 
	
		
			
				|  |  | -  console.log('Connected elements:', $('.js-swimlane, .js-lists').length);
 | 
	
		
			
				|  |  | -  console.log('Available swimlanes:', $('.js-swimlane').map(function() { return $(this).attr('id'); }).get());
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    // Add click debugging for drag handles
 | 
	
		
			
				|  |  |    $listsDom.on('mousedown', '.js-list-handle', function(e) {
 | 
	
		
			
				|  |  | -    console.log('List drag handle clicked!', e.target);
 | 
	
		
			
				|  |  |      e.stopPropagation();
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    $listsDom.on('mousedown', '.js-list-header', function(e) {
 | 
	
		
			
				|  |  | -    console.log('List header clicked!', e.target);
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  // Add debugging for any mousedown on lists
 | 
	
		
			
				|  |  | +  $listsDom.on('mousedown', '.js-list', function(e) {
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    // Add debugging for sortable events
 | 
	
		
			
				|  |  |    $listsDom.on('sortstart', function(e, ui) {
 | 
	
		
			
				|  |  | -    console.log('Sortable start event fired!', ui.item);
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    $listsDom.on('sortbeforestop', function(e, ui) {
 | 
	
		
			
				|  |  | -    console.log('Sortable beforeStop event fired!', ui.item);
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    $listsDom.on('sortstop', function(e, ui) {
 | 
	
		
			
				|  |  | -    console.log('Sortable stop event fired!', ui.item);
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    try {
 | 
	
	
		
			
				|  | @@ -120,7 +116,6 @@ function initSortable(boardComponent, $listsDom) {
 | 
	
		
			
				|  |  |        forcePlaceholderSize: true,
 | 
	
		
			
				|  |  |        cursor: 'move',
 | 
	
		
			
				|  |  |      start(evt, ui) {
 | 
	
		
			
				|  |  | -      console.log('List drag started');
 | 
	
		
			
				|  |  |        ui.helper.css('z-index', 1000);
 | 
	
		
			
				|  |  |        ui.placeholder.height(ui.helper.height());
 | 
	
		
			
				|  |  |        ui.placeholder.width(ui.helper.width());
 | 
	
	
		
			
				|  | @@ -131,8 +126,10 @@ function initSortable(boardComponent, $listsDom) {
 | 
	
		
			
				|  |  |        ui.item.addClass('ui-sortable-helper');
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        // Disable dragscroll during list dragging to prevent interference
 | 
	
		
			
				|  |  | -      console.log('Disabling dragscroll for list dragging');
 | 
	
		
			
				|  |  | -      dragscroll.reset();
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        dragscroll.reset();
 | 
	
		
			
				|  |  | +      } catch (e) {
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        // Also disable dragscroll on all swimlanes during list dragging
 | 
	
		
			
				|  |  |        $('.js-swimlane').each(function() {
 | 
	
	
		
			
				|  | @@ -144,7 +141,6 @@ function initSortable(boardComponent, $listsDom) {
 | 
	
		
			
				|  |  |        ui.item.removeClass('ui-sortable-helper');
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      stop(evt, ui) {
 | 
	
		
			
				|  |  | -      console.log('List drag stopped');
 | 
	
		
			
				|  |  |        // To attribute the new index number, we need to get the DOM element
 | 
	
		
			
				|  |  |        // of the previous and the following card -- if any.
 | 
	
		
			
				|  |  |        const prevListDom = ui.item.prev('.js-list').get(0);
 | 
	
	
		
			
				|  | @@ -174,13 +170,11 @@ function initSortable(boardComponent, $listsDom) {
 | 
	
		
			
				|  |  |        const targetSwimlaneDom = ui.item.closest('.js-swimlane');
 | 
	
		
			
				|  |  |        let targetSwimlaneId = null;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      console.log('Target swimlane DOM:', targetSwimlaneDom.length, targetSwimlaneDom.attr('id'));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        if (targetSwimlaneDom.length > 0) {
 | 
	
		
			
				|  |  |          // List was dropped in a swimlane
 | 
	
		
			
				|  |  |          try {
 | 
	
		
			
				|  |  |            targetSwimlaneId = targetSwimlaneDom.attr('id').replace('swimlane-', '');
 | 
	
		
			
				|  |  | -          console.log('List dropped in swimlane:', targetSwimlaneId);
 | 
	
		
			
				|  |  |          } catch (error) {
 | 
	
		
			
				|  |  |            console.error('Error getting target swimlane ID:', error);
 | 
	
		
			
				|  |  |            return;
 | 
	
	
		
			
				|  | @@ -193,7 +187,6 @@ function initSortable(boardComponent, $listsDom) {
 | 
	
		
			
				|  |  |            const defaultSwimlane = currentBoard.getDefaultSwimline();
 | 
	
		
			
				|  |  |            if (defaultSwimlane) {
 | 
	
		
			
				|  |  |              targetSwimlaneId = defaultSwimlane._id;
 | 
	
		
			
				|  |  | -            console.log('List dropped in lists view, using default swimlane:', targetSwimlaneId);
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        }
 | 
	
	
		
			
				|  | @@ -217,18 +210,10 @@ function initSortable(boardComponent, $listsDom) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        // Check if the list was dropped in a different swimlane
 | 
	
		
			
				|  |  |        const isDifferentSwimlane = targetSwimlaneId && targetSwimlaneId !== originalSwimlaneId;
 | 
	
		
			
				|  |  | -      console.log('Cross-swimlane check:', {
 | 
	
		
			
				|  |  | -        originalSwimlaneId,
 | 
	
		
			
				|  |  | -        targetSwimlaneId,
 | 
	
		
			
				|  |  | -        isDifferentSwimlane
 | 
	
		
			
				|  |  | -      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        // If the list was dropped in a different swimlane, update the swimlaneId
 | 
	
		
			
				|  |  |        if (isDifferentSwimlane) {
 | 
	
		
			
				|  |  |          updateData.swimlaneId = targetSwimlaneId;
 | 
	
		
			
				|  |  | -        if (process.env.DEBUG === 'true') {
 | 
	
		
			
				|  |  | -          console.log(`Moving list "${list.title}" from swimlane ${originalSwimlaneId} to swimlane ${targetSwimlaneId}`);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Move all cards in the list to the new swimlane
 | 
	
		
			
				|  |  |          const cardsInList = ReactiveCache.getCards({
 | 
	
	
		
			
				|  | @@ -240,9 +225,6 @@ function initSortable(boardComponent, $listsDom) {
 | 
	
		
			
				|  |  |            card.move(list.boardId, targetSwimlaneId, list._id);
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if (process.env.DEBUG === 'true') {
 | 
	
		
			
				|  |  | -          console.log(`Moved ${cardsInList.length} cards to swimlane ${targetSwimlaneId}`);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Don't cancel the sortable when moving to a different swimlane
 | 
	
		
			
				|  |  |          // The DOM move should be allowed to complete
 | 
	
	
		
			
				|  | @@ -255,7 +237,6 @@ function initSortable(boardComponent, $listsDom) {
 | 
	
		
			
				|  |  |          Lists.update(list._id, {
 | 
	
		
			
				|  |  |            $set: updateData,
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  | -        console.log('List updated successfully:', list._id, updateData);
 | 
	
		
			
				|  |  |        } catch (error) {
 | 
	
		
			
				|  |  |          console.error('Error updating list:', error);
 | 
	
		
			
				|  |  |          return;
 | 
	
	
		
			
				|  | @@ -264,8 +245,10 @@ function initSortable(boardComponent, $listsDom) {
 | 
	
		
			
				|  |  |        boardComponent.setIsDragging(false);
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        // Re-enable dragscroll after list dragging is complete
 | 
	
		
			
				|  |  | -      console.log('Re-enabling dragscroll after list dragging');
 | 
	
		
			
				|  |  | -      dragscroll.reset();
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        dragscroll.reset();
 | 
	
		
			
				|  |  | +      } catch (e) {
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        // Re-enable dragscroll on all swimlanes
 | 
	
		
			
				|  |  |        $('.js-swimlane').each(function() {
 | 
	
	
		
			
				|  | @@ -278,38 +261,14 @@ function initSortable(boardComponent, $listsDom) {
 | 
	
		
			
				|  |  |      return;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  | -  console.log('List sortable initialization completed successfully');
 | 
	
		
			
				|  |  | -  console.log('Sortable data after init:', $listsDom.data('uiSortable') || $listsDom.data('sortable'));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  boardComponent.autorun(() => {
 | 
	
		
			
				|  |  | -    const $listDom = $listsDom;
 | 
	
		
			
				|  |  | -    console.log('Autorun running, checking sortable status...');
 | 
	
		
			
				|  |  | -    console.log('Has uiSortable:', $listDom.data('uiSortable'));
 | 
	
		
			
				|  |  | -    console.log('Has sortable:', $listDom.data('sortable'));
 | 
	
		
			
				|  |  | -    if ($listDom.data('uiSortable') || $listDom.data('sortable')) {
 | 
	
		
			
				|  |  | -      if (Utils.isTouchScreenOrShowDesktopDragHandles()) {
 | 
	
		
			
				|  |  | -        $listsDom.sortable('option', 'handle', '.js-list-handle');
 | 
	
		
			
				|  |  | -        console.log('List sortable: Using .js-list-handle as handle');
 | 
	
		
			
				|  |  | -        console.log('Found drag handles:', $listsDom.find('.js-list-handle').length);
 | 
	
		
			
				|  |  | -      } else {
 | 
	
		
			
				|  |  | -        $listsDom.sortable('option', 'handle', '.js-list-header');
 | 
	
		
			
				|  |  | -        console.log('List sortable: Using .js-list-header as handle');
 | 
	
		
			
				|  |  | -        console.log('Found list headers:', $listsDom.find('.js-list-header').length);
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      
 | 
	
		
			
				|  |  | -      const currentUser = ReactiveCache.getCurrentUser();
 | 
	
		
			
				|  |  | -      const canModify = Utils.canModifyBoard();
 | 
	
		
			
				|  |  | -      const isDisabled = !canModify;
 | 
	
		
			
				|  |  | -      $listsDom.sortable('option', 'disabled', isDisabled);
 | 
	
		
			
				|  |  | -      console.log('List sortable disabled:', isDisabled);
 | 
	
		
			
				|  |  | -      console.log('Can modify board:', canModify);
 | 
	
		
			
				|  |  | -      console.log('Current user:', currentUser ? currentUser.username : 'null');
 | 
	
		
			
				|  |  | -      console.log('Is board member:', currentUser ? currentUser.isBoardMember() : 'null');
 | 
	
		
			
				|  |  | -      console.log('Is comment only:', currentUser ? currentUser.isCommentOnly() : 'null');
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      console.log('List sortable not initialized yet');
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  });
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  // Check if drag handles exist
 | 
	
		
			
				|  |  | +  const dragHandles = $listsDom.find('.js-list-handle');
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  // Check if lists exist
 | 
	
		
			
				|  |  | +  const lists = $listsDom.find('.js-list');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Skip the complex autorun and options for now
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  BlazeComponent.extendComponent({
 | 
	
	
		
			
				|  | @@ -317,15 +276,54 @@ BlazeComponent.extendComponent({
 | 
	
		
			
				|  |  |      const boardComponent = this.parentComponent();
 | 
	
		
			
				|  |  |      const $listsDom = this.$('.js-lists');
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -    console.log('Swimlane onRendered - DOM elements found:', $listsDom.length);
 | 
	
		
			
				|  |  | -    console.log('Swimlane onRendered - DOM element:', $listsDom[0]);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if (!Utils.getCurrentCardId()) {
 | 
	
		
			
				|  |  |        boardComponent.scrollLeft();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    console.log('Calling initSortable...');
 | 
	
		
			
				|  |  | -    initSortable(boardComponent, $listsDom);
 | 
	
		
			
				|  |  | +    // Try a simpler approach - initialize sortable directly like cards do
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    // Wait for DOM to be ready
 | 
	
		
			
				|  |  | +    setTimeout(() => {
 | 
	
		
			
				|  |  | +      const $lists = this.$('.js-list');
 | 
	
		
			
				|  |  | +      
 | 
	
		
			
				|  |  | +      const $parent = $lists.parent();
 | 
	
		
			
				|  |  | +      
 | 
	
		
			
				|  |  | +      if ($lists.length > 0) {
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        // Check for drag handles
 | 
	
		
			
				|  |  | +        const $handles = $parent.find('.js-list-handle');
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        // Test if drag handles are clickable
 | 
	
		
			
				|  |  | +        $handles.on('click', function(e) {
 | 
	
		
			
				|  |  | +          e.preventDefault();
 | 
	
		
			
				|  |  | +          e.stopPropagation();
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        $parent.sortable({
 | 
	
		
			
				|  |  | +          connectWith: '.js-swimlane, .js-lists',
 | 
	
		
			
				|  |  | +          tolerance: 'pointer',
 | 
	
		
			
				|  |  | +          appendTo: '.board-canvas',
 | 
	
		
			
				|  |  | +          helper: 'clone',
 | 
	
		
			
				|  |  | +          items: '.js-list:not(.js-list-composer)',
 | 
	
		
			
				|  |  | +          placeholder: 'list placeholder',
 | 
	
		
			
				|  |  | +          distance: 7,
 | 
	
		
			
				|  |  | +          handle: '.js-list-handle',
 | 
	
		
			
				|  |  | +          disabled: !Utils.canModifyBoard(),
 | 
	
		
			
				|  |  | +          start(evt, ui) {
 | 
	
		
			
				|  |  | +            ui.helper.css('z-index', 1000);
 | 
	
		
			
				|  |  | +            ui.placeholder.height(ui.helper.height());
 | 
	
		
			
				|  |  | +            ui.placeholder.width(ui.helper.width());
 | 
	
		
			
				|  |  | +            EscapeActions.executeUpTo('popup-close');
 | 
	
		
			
				|  |  | +            boardComponent.setIsDragging(true);
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          stop(evt, ui) {
 | 
	
		
			
				|  |  | +            boardComponent.setIsDragging(false);
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }, 100);
 | 
	
		
			
				|  |  |    },
 | 
	
		
			
				|  |  |    onCreated() {
 | 
	
		
			
				|  |  |      this.draggingActive = new ReactiveVar(false);
 | 
	
	
		
			
				|  | @@ -388,7 +386,6 @@ BlazeComponent.extendComponent({
 | 
	
		
			
				|  |  |            const isInNoDragArea = $(evt.target).closest(noDragInside.join(',')).length > 0;
 | 
	
		
			
				|  |  |            
 | 
	
		
			
				|  |  |            if (isResizeHandle) {
 | 
	
		
			
				|  |  | -            console.log('Board drag prevented - resize handle clicked');
 | 
	
		
			
				|  |  |              return;
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |            
 | 
	
	
		
			
				|  | @@ -572,6 +569,7 @@ BlazeComponent.extendComponent({
 | 
	
		
			
				|  |  |    },
 | 
	
		
			
				|  |  |  }).register('swimlane');
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  BlazeComponent.extendComponent({
 | 
	
		
			
				|  |  |    onCreated() {
 | 
	
		
			
				|  |  |      this.currentBoard = Utils.getCurrentBoard();
 | 
	
	
		
			
				|  | @@ -641,6 +639,108 @@ Template.swimlane.helpers({
 | 
	
		
			
				|  |  |    },
 | 
	
		
			
				|  |  |  });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// Initialize sortable on DOM elements
 | 
	
		
			
				|  |  | +setTimeout(() => {
 | 
	
		
			
				|  |  | +  const $swimlaneElements = $('.swimlane');
 | 
	
		
			
				|  |  | +  const $listsGroupElements = $('.list-group');
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  // Initialize sortable on ALL swimlane elements (even empty ones)
 | 
	
		
			
				|  |  | +  $swimlaneElements.each(function(index) {
 | 
	
		
			
				|  |  | +    const $swimlane = $(this);
 | 
	
		
			
				|  |  | +    const $lists = $swimlane.find('.js-list');
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    // Only initialize on swimlanes that have the .js-lists class (the container for lists)
 | 
	
		
			
				|  |  | +    if ($swimlane.hasClass('js-lists')) {
 | 
	
		
			
				|  |  | +      $swimlane.sortable({
 | 
	
		
			
				|  |  | +        connectWith: '.js-swimlane, .js-lists',
 | 
	
		
			
				|  |  | +        tolerance: 'pointer',
 | 
	
		
			
				|  |  | +        appendTo: '.board-canvas',
 | 
	
		
			
				|  |  | +        helper: 'clone',
 | 
	
		
			
				|  |  | +        items: '.js-list:not(.js-list-composer)',
 | 
	
		
			
				|  |  | +        placeholder: 'list placeholder',
 | 
	
		
			
				|  |  | +        distance: 7,
 | 
	
		
			
				|  |  | +        handle: '.js-list-handle',
 | 
	
		
			
				|  |  | +        disabled: !Utils.canModifyBoard(),
 | 
	
		
			
				|  |  | +        start(evt, ui) {
 | 
	
		
			
				|  |  | +          ui.helper.css('z-index', 1000);
 | 
	
		
			
				|  |  | +          ui.placeholder.height(ui.helper.height());
 | 
	
		
			
				|  |  | +          ui.placeholder.width(ui.helper.width());
 | 
	
		
			
				|  |  | +          EscapeActions.executeUpTo('popup-close');
 | 
	
		
			
				|  |  | +          // Try to get board component
 | 
	
		
			
				|  |  | +          try {
 | 
	
		
			
				|  |  | +            const boardComponent = BlazeComponent.getComponentForElement(ui.item[0]);
 | 
	
		
			
				|  |  | +            if (boardComponent && boardComponent.setIsDragging) {
 | 
	
		
			
				|  |  | +              boardComponent.setIsDragging(true);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          } catch (e) {
 | 
	
		
			
				|  |  | +            // Silent fail
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        stop(evt, ui) {
 | 
	
		
			
				|  |  | +          // Try to get board component
 | 
	
		
			
				|  |  | +          try {
 | 
	
		
			
				|  |  | +            const boardComponent = BlazeComponent.getComponentForElement(ui.item[0]);
 | 
	
		
			
				|  |  | +            if (boardComponent && boardComponent.setIsDragging) {
 | 
	
		
			
				|  |  | +              boardComponent.setIsDragging(false);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          } catch (e) {
 | 
	
		
			
				|  |  | +            // Silent fail
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  // Initialize sortable on ALL listsGroup elements (even empty ones)
 | 
	
		
			
				|  |  | +  $listsGroupElements.each(function(index) {
 | 
	
		
			
				|  |  | +    const $listsGroup = $(this);
 | 
	
		
			
				|  |  | +    const $lists = $listsGroup.find('.js-list');
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    // Only initialize on listsGroup elements that have the .js-lists class
 | 
	
		
			
				|  |  | +    if ($listsGroup.hasClass('js-lists')) {
 | 
	
		
			
				|  |  | +      $listsGroup.sortable({
 | 
	
		
			
				|  |  | +        connectWith: '.js-swimlane, .js-lists',
 | 
	
		
			
				|  |  | +        tolerance: 'pointer',
 | 
	
		
			
				|  |  | +        appendTo: '.board-canvas',
 | 
	
		
			
				|  |  | +        helper: 'clone',
 | 
	
		
			
				|  |  | +        items: '.js-list:not(.js-list-composer)',
 | 
	
		
			
				|  |  | +        placeholder: 'list placeholder',
 | 
	
		
			
				|  |  | +        distance: 7,
 | 
	
		
			
				|  |  | +        handle: '.js-list-handle',
 | 
	
		
			
				|  |  | +        disabled: !Utils.canModifyBoard(),
 | 
	
		
			
				|  |  | +        start(evt, ui) {
 | 
	
		
			
				|  |  | +          ui.helper.css('z-index', 1000);
 | 
	
		
			
				|  |  | +          ui.placeholder.height(ui.helper.height());
 | 
	
		
			
				|  |  | +          ui.placeholder.width(ui.helper.width());
 | 
	
		
			
				|  |  | +          EscapeActions.executeUpTo('popup-close');
 | 
	
		
			
				|  |  | +          // Try to get board component
 | 
	
		
			
				|  |  | +          try {
 | 
	
		
			
				|  |  | +            const boardComponent = BlazeComponent.getComponentForElement(ui.item[0]);
 | 
	
		
			
				|  |  | +            if (boardComponent && boardComponent.setIsDragging) {
 | 
	
		
			
				|  |  | +              boardComponent.setIsDragging(true);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          } catch (e) {
 | 
	
		
			
				|  |  | +            // Silent fail
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        stop(evt, ui) {
 | 
	
		
			
				|  |  | +          // Try to get board component
 | 
	
		
			
				|  |  | +          try {
 | 
	
		
			
				|  |  | +            const boardComponent = BlazeComponent.getComponentForElement(ui.item[0]);
 | 
	
		
			
				|  |  | +            if (boardComponent && boardComponent.setIsDragging) {
 | 
	
		
			
				|  |  | +              boardComponent.setIsDragging(false);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          } catch (e) {
 | 
	
		
			
				|  |  | +            // Silent fail
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +}, 1000);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  BlazeComponent.extendComponent({
 | 
	
		
			
				|  |  |    currentCardIsInThisList(listId, swimlaneId) {
 | 
	
		
			
				|  |  |      return currentCardIsInThisList(listId, swimlaneId);
 | 
	
	
		
			
				|  | @@ -671,18 +771,58 @@ BlazeComponent.extendComponent({
 | 
	
		
			
				|  |  |      const boardComponent = this.parentComponent();
 | 
	
		
			
				|  |  |      const $listsDom = this.$('.js-lists');
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -    console.log('ListsGroup onRendered - DOM elements found:', $listsDom.length);
 | 
	
		
			
				|  |  | -    console.log('ListsGroup onRendered - DOM element:', $listsDom[0]);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if (!Utils.getCurrentCardId()) {
 | 
	
		
			
				|  |  |        boardComponent.scrollLeft();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    console.log('ListsGroup calling initSortable...');
 | 
	
		
			
				|  |  | -    initSortable(boardComponent, $listsDom);
 | 
	
		
			
				|  |  | +    // Try a simpler approach for listsGroup too
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    // Wait for DOM to be ready
 | 
	
		
			
				|  |  | +    setTimeout(() => {
 | 
	
		
			
				|  |  | +      const $lists = this.$('.js-list');
 | 
	
		
			
				|  |  | +      
 | 
	
		
			
				|  |  | +      const $parent = $lists.parent();
 | 
	
		
			
				|  |  | +      
 | 
	
		
			
				|  |  | +      if ($lists.length > 0) {
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        // Check for drag handles
 | 
	
		
			
				|  |  | +        const $handles = $parent.find('.js-list-handle');
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        // Test if drag handles are clickable
 | 
	
		
			
				|  |  | +        $handles.on('click', function(e) {
 | 
	
		
			
				|  |  | +          e.preventDefault();
 | 
	
		
			
				|  |  | +          e.stopPropagation();
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        $parent.sortable({
 | 
	
		
			
				|  |  | +          connectWith: '.js-swimlane, .js-lists',
 | 
	
		
			
				|  |  | +          tolerance: 'pointer',
 | 
	
		
			
				|  |  | +          appendTo: '.board-canvas',
 | 
	
		
			
				|  |  | +          helper: 'clone',
 | 
	
		
			
				|  |  | +          items: '.js-list:not(.js-list-composer)',
 | 
	
		
			
				|  |  | +          placeholder: 'list placeholder',
 | 
	
		
			
				|  |  | +          distance: 7,
 | 
	
		
			
				|  |  | +          handle: '.js-list-handle',
 | 
	
		
			
				|  |  | +          disabled: !Utils.canModifyBoard(),
 | 
	
		
			
				|  |  | +          start(evt, ui) {
 | 
	
		
			
				|  |  | +            ui.helper.css('z-index', 1000);
 | 
	
		
			
				|  |  | +            ui.placeholder.height(ui.helper.height());
 | 
	
		
			
				|  |  | +            ui.placeholder.width(ui.helper.width());
 | 
	
		
			
				|  |  | +            EscapeActions.executeUpTo('popup-close');
 | 
	
		
			
				|  |  | +            boardComponent.setIsDragging(true);
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          stop(evt, ui) {
 | 
	
		
			
				|  |  | +            boardComponent.setIsDragging(false);
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }, 100);
 | 
	
		
			
				|  |  |    },
 | 
	
		
			
				|  |  |  }).register('listsGroup');
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  class MoveSwimlaneComponent extends BlazeComponent {
 | 
	
		
			
				|  |  |    serverMethod = 'moveSwimlane';
 | 
	
		
			
				|  |  |  
 |