• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

atinc / ngx-tethys / 8a6ba229-c82f-4a21-a1ed-95461f2ad66c

04 Sep 2023 08:37AM UTC coverage: 90.196% (-0.004%) from 90.2%
8a6ba229-c82f-4a21-a1ed-95461f2ad66c

Pull #2829

circleci

cmm-va
fix: delete f
Pull Request #2829: fix: add tabIndex

5164 of 6386 branches covered (0.0%)

Branch coverage included in aggregate %.

78 of 78 new or added lines in 26 files covered. (100.0%)

13024 of 13779 relevant lines covered (94.52%)

971.69 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

92.86
/src/drag-drop/drop-container.directive.ts
1
import { OnInit, Directive, Output, EventEmitter, ContentChildren, QueryList, AfterContentInit, NgZone, Input } from '@angular/core';
2
import { ThyDragDirective } from './drag.directive';
3
import { merge, Observable, defer } from 'rxjs';
4
import { InputBoolean, UnsubscribeMixin } from 'ngx-tethys/core';
5
import { takeUntil, startWith, take, switchMap } from 'rxjs/operators';
6
import { ThyDragDropEvent, ThyDragStartEvent, ThyDragEndEvent, ThyDragOverEvent } from './drag-drop.class';
7
import { THY_DROP_CONTAINER_DIRECTIVE, IThyDropContainerDirective } from './drop-container.class';
8

9
/**
10
 * @name thy-drop-container,[thyDropContainer]
11
 * @order 30
12
 */
13
@Directive({
1✔
14
    selector: 'thy-drop-container,[thyDropContainer]',
15
    providers: [
20✔
16
        {
17
            provide: THY_DROP_CONTAINER_DIRECTIVE,
18
            useExisting: ThyDropContainerDirective
20✔
19
        }
20✔
20
    ],
20✔
21
    standalone: true
20✔
22
})
20✔
23
export class ThyDropContainerDirective<T = any> extends UnsubscribeMixin implements OnInit, AfterContentInit, IThyDropContainerDirective {
20✔
24
    /**
25
     * 元数据
26
     * @type any[]
27
     */
20✔
28
    @Input('thyDropContainer')
20✔
29
    set dragContainer(data: T[]) {
30
        this.data = data;
31
    }
32

38✔
33
    /**
1✔
34
     * 元数据
35
     * @type any[]
38✔
36
     */
1✔
37
    @Input('thyDropContainerData') data: T[];
38

38✔
39
    /**
1✔
40
     * 是否禁用拖拽
41
     * @default false
38✔
42
     */
1✔
43
    @Input('thyDropContainerDisabled') @InputBoolean() disabled: boolean;
44

45
    /**
46
     * 拖拽之前的回调,函数返回 false 则阻止拖拽
80✔
47
     */
80!
48
    @Input('thyBeforeDragStart') beforeStart: (e: ThyDragStartEvent<T>) => boolean;
80✔
49

50
    /**
×
51
     * 拖拽时回调,函数返回 false 则阻止移入
52
     */
53
    @Input('thyBeforeDragOver') beforeOver: (e: ThyDragOverEvent<T>) => boolean;
1✔
54

55
    /**
56
     * 拖放到元素时回调,函数返回 false 则阻止放置
1✔
57
     */
58
    @Input('thyBeforeDragDrop') beforeDrop: (e: ThyDragDropEvent<T>) => boolean;
59

60
    /**
61
     * 开始拖拽时调用
62
     */
63
    @Output('thyDragStarted') started = new EventEmitter<ThyDragStartEvent<ThyDragDirective>>();
64

65
    /**
66
     * dragend 触发时调用
67
     */
68
    @Output('thyDragEnded') ended = new EventEmitter<ThyDragEndEvent<ThyDragDirective>>();
69

70
    /**
71
     * dragover 触发时调用
72
     */
1✔
73
    @Output('thyDragOvered') overed = new EventEmitter<ThyDragOverEvent<ThyDragDirective>>();
74

75
    /**
76
     * drop 触发时调用
1✔
77
     */
78
    @Output('thyDragDropped') dropped = new EventEmitter<ThyDragDropEvent<ThyDragDirective>>();
79

80
    /**
81
     * @internal
82
     */
83
    @ContentChildren(ThyDragDirective, {
84
        descendants: false
85
    })
86
    draggables: QueryList<ThyDragDirective>;
87

88
    constructor(private ngZone: NgZone) {
89
        super();
90
    }
91

92
    ngOnInit() {}
93

94
    ngAfterContentInit() {
95
        this.draggables.changes.pipe(startWith(null), takeUntil(this.ngUnsubscribe$)).subscribe(() => {
96
            this.draggableChanges();
97
        });
98
    }
99

100
    private draggableChanges() {
101
        this.resetDraggableChanges(item => item.dragRef.started).subscribe(event => {
102
            this.started.emit(event);
103
        });
104
        this.resetDraggableChanges(item => item.dragRef.ended).subscribe(event => {
105
            this.ended.emit(event);
106
        });
107
        this.resetDraggableChanges(item => item.dragRef.overed).subscribe(event => {
108
            this.overed.emit(event);
109
        });
110
        this.resetDraggableChanges(item => item.dragRef.dropped).subscribe(event => {
111
            this.dropped.emit(event);
112
        });
113
    }
114

115
    private resetDraggableChanges(fn: (item: ThyDragDirective) => Observable<any>) {
116
        return defer(() => {
117
            if (this.draggables) {
118
                return merge(...this.draggables.map(fn));
119
            }
120
            return this.ngZone.onStable.asObservable().pipe(
121
                take(1),
122
                switchMap(() => this.resetDraggableChanges.bind(this, fn))
123
            );
124
        }).pipe(takeUntil(merge(this.ngUnsubscribe$, this.draggables.changes))) as Observable<any>;
125
    }
126
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc