Skip to content

Commit 314892d

Browse files
palbizuPatricio Albizu
andauthored
Add dynamic draggable list (#1494)
* feat: add dynamic draggable list * feat: fix comments * feat: fix lintern Co-authored-by: Patricio Albizu <[email protected]>
1 parent 928dc9c commit 314892d

File tree

2 files changed

+42
-11
lines changed

2 files changed

+42
-11
lines changed

projects/components/src/draggable-list/draggable-list.component.scss

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@import 'color-palette';
1+
@import 'mixins';
22

33
.draggable-list .draggable-item {
44
cursor: move;
@@ -9,3 +9,21 @@
99
cursor: not-allowed;
1010
}
1111
}
12+
13+
.draggable-list.cdk-drop-list-dragging .draggable-item:not(.cdk-drag-placeholder) {
14+
transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
15+
}
16+
17+
.cdk-drag-placeholder {
18+
opacity: 0;
19+
}
20+
21+
.cdk-drag-animating {
22+
transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
23+
}
24+
25+
.cdk-drag-preview {
26+
box-sizing: border-box;
27+
border-radius: 4px;
28+
box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12);
29+
}

projects/components/src/draggable-list/draggable-list.component.ts

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,28 @@ import {
99
Output,
1010
QueryList
1111
} from '@angular/core';
12+
import { queryListAndChanges$ } from '@hypertrace/common';
13+
import { Observable } from 'rxjs';
14+
import { map } from 'rxjs/operators';
1215
import { DraggableItemComponent } from './draggable-item/draggable-item.component';
1316

1417
@Component({
1518
selector: 'ht-draggable-list',
1619
changeDetection: ChangeDetectionStrategy.OnPush,
1720
styleUrls: ['./draggable-list.component.scss'],
1821
template: `
19-
<div cdkDropList class="draggable-list" (cdkDropListDropped)="this.dropList($event)">
22+
<div
23+
class="draggable-list"
24+
*ngIf="this.draggableItems$ | async as draggableItems"
25+
cdkDropList
26+
(cdkDropListDropped)="this.dropList($event, draggableItems)"
27+
>
2028
<div
21-
*ngFor="let draggableItem of this.draggableItems"
22-
cdkDrag
29+
*ngFor="let draggableItem of draggableItems"
2330
class="draggable-item"
24-
[ngClass]="{ disabled: disabled || draggableItem.disabled }"
25-
[cdkDragDisabled]="disabled || draggableItem.disabled"
31+
[ngClass]="{ disabled: this.disabled || draggableItem.disabled }"
32+
[cdkDragDisabled]="this.disabled || draggableItem.disabled"
33+
cdkDrag
2634
>
2735
<ng-container *ngTemplateOutlet="draggableItem.content"></ng-container>
2836
</div>
@@ -39,14 +47,19 @@ export class DraggableListComponent<T> implements AfterContentInit {
3947
@ContentChildren(DraggableItemComponent)
4048
public draggableItemsRef!: QueryList<DraggableItemComponent<T>>;
4149

42-
public draggableItems: DraggableItemComponent<T>[] = [];
50+
public draggableItems$!: Observable<DraggableItemComponent<T>[]>;
4351

4452
public ngAfterContentInit(): void {
45-
this.draggableItems = this.draggableItemsRef.toArray();
53+
this.draggableItems$ = queryListAndChanges$(this.draggableItemsRef).pipe(
54+
map(draggableItems => draggableItems.toArray())
55+
);
4656
}
4757

48-
public dropList(event: CdkDragDrop<DraggableItemComponent<unknown>[]>): void {
49-
moveItemInArray(this.draggableItems, event.previousIndex, event.currentIndex);
50-
this.draggableListChange.emit(this.draggableItems.map(dragabbleItem => dragabbleItem.data!));
58+
public dropList(
59+
event: CdkDragDrop<DraggableItemComponent<unknown>[]>,
60+
draggableItems: DraggableItemComponent<T>[]
61+
): void {
62+
moveItemInArray(draggableItems, event.previousIndex, event.currentIndex);
63+
this.draggableListChange.emit(draggableItems.map(dragabbleItem => dragabbleItem.data!));
5164
}
5265
}

0 commit comments

Comments
 (0)