Использование угловых материалов для DropList, Заменяющих пустые позиции в Целевом списке

#angular #angular-material #drag-and-drop

Вопрос:

Я пытаюсь использовать угловые материалы для создания функции сопоставления столбцов, как показано на рисунке ниже. Идея заключается в том, что пользователь может взять один набор столбцов и сопоставить их с другим набором столбцов. Есть несколько примеров того, как использовать перетаскивание для перемещения элементов между двумя списками, однако, будучи новичком в угловых (материалах) Я изо всех сил пытаюсь понять, как подойти к этой конкретной проблеме. Элементы, перетаскиваемые из списка вправо, должны быть отброшены/заменены «пустыми» позициями в списке слева, вместо того, чтобы перемещаться между существующими элементами. Возможно ли добиться такого поведения с помощью cdkDropList?

введите описание изображения здесь

Обновить

Я добился некоторого прогресса в этом, создав пользовательскую функцию удаления, в которой я меняю местами целевой и исходный элемент. Все еще не уверен, что это лучший вариант, хотя. Я работаю с функциональностью-тиски, однако это выглядит не очень хорошо, и все равно похоже, что вы помещаете элемент между двумя другими элементами в целевом списке (см. Скриншот). Я так и не смог понять, как это обойти. Ценю любой вклад.

Из файла .ts.

   onDrop(event: CdkDragDrop<string[]>): void {

    if (event.previousContainer === event.container) {

      moveItemInArray(

        event.container.data,
        event.previousIndex,
        event.currentIndex

      );

    } else {


      if (event.container.data[event.currentIndex] === "" amp;amp; event.previousContainer.data[event.previousIndex] !== "") {

        let placeholder = event.previousContainer.data[event.previousIndex];
        event.previousContainer.data[event.previousIndex] = event.container.data[event.currentIndex];
        event.container.data[event.currentIndex] = placeholder;

      }

    }

  }
 

Из файла .html.

 <div cdkDropListGroup>
    
    <div class="list-container">

        <div class="list-child">

            <h3>Target Columns</h3>

            <div>

                <div class="drag-item" *ngFor="let column of referenceColumns">
            
                    {{ column }}
            
                </div>
            
            </div>

        </div>

        <div class="list-child">

            <h3>Mapping</h3>

            <div cdkDropList 
                
                id="targetColumnsList"
                [cdkDropListConnectedTo]="['sourceColumnsList']"
                (cdkDropListDropped)="onDrop($event)" 
                [cdkDropListData]="targetColumns"
                [cdkDropListEnterPredicate]="allowPredicate"
                style="padding-right: 50px;">

                <div class="drag-item" cdkDrag [cdkDragDisabled]="column === ''" [cdkDragData]="column" cdkDrag *ngFor="let column of targetColumns">

                    {{ column }}

                </div>

            </div>

        </div>

        <div class="list-child">

            <h3>Source Columns</h3>

            <div cdkDropList 

                id="sourceColumnsList"
                [cdkDropListConnectedTo]="['targetColumnsList']"
                (cdkDropListDropped)="onDrop($event)" 
                [cdkDropListData]="sourceColumns"
                [cdkDropListEnterPredicate]="allowPredicate">

                <div class="drag-item" cdkDrag [cdkDragDisabled]="column === ''" [cdkDragData]="column" *ngFor="let column of sourceColumns">
            
                    {{ column }}
            
                </div>
            
            </div>

        </div>


    </div>

</div>
 

From .scss file.

 .drag-item {

    padding: 0.5em;
    border: 1px solid gray;
    background-color: rgb(200, 200, 200);
    margin-bottom: 8px;
    max-width: 200px;
    min-height: 30px;

    amp;.cdk-drag-disabled {
        background: #ddd;
        border: dotted 1px #999;
        cursor: defau<
      }

}

.cdk-drag-preview {

    background-color: white;
    box-shadow: 0px 0px 8px 2px whitesmoke;
    color: grey;

}

.cdk-drag-placeholder {

    opacity: 0.5;

}

.cdk-drag-animating {

    transition: transform 200ms cubic-bezier(0, 0, 0.2, 0)

}
 

enter image description here