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

atinc / ngx-tethys / 3b40a702-4b4d-4ddb-81a7-a96baae6d682

08 Nov 2024 05:40AM UTC coverage: 90.395% (-0.04%) from 90.431%
3b40a702-4b4d-4ddb-81a7-a96baae6d682

push

circleci

why520crazy
Merge branch 'master' into feat-theme

5503 of 6730 branches covered (81.77%)

Branch coverage included in aggregate %.

424 of 431 new or added lines in 171 files covered. (98.38%)

344 existing lines in 81 files now uncovered.

13150 of 13905 relevant lines covered (94.57%)

999.86 hits per line

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

91.46
/src/transfer/transfer-list.component.ts
1
import { CdkDrag, CdkDragDrop, CdkDropList, CdkDropListGroup, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';
2
import {
3
    Component,
4
    DoCheck,
5
    EventEmitter,
6
    HostBinding,
7
    Input,
8
    IterableChanges,
9
    IterableDiffer,
10
    IterableDiffers,
11
    OnInit,
1✔
12
    Output,
13
    TemplateRef,
38✔
14
    ViewEncapsulation,
38✔
15
    inject
38✔
16
} from '@angular/core';
38✔
17

38✔
18
import { NgClass, NgTemplateOutlet } from '@angular/common';
38✔
19
import { ThyList, ThyListItem } from 'ngx-tethys/list';
38✔
20
import { ThyDragDropDirective } from 'ngx-tethys/shared';
38✔
UNCOV
21
import { InnerTransferDragEvent, ThyTransferDragEvent, ThyTransferItem, ThyTransferSelectEvent } from './transfer.interface';
×
22

23
/**
38✔
UNCOV
24
 * @private
×
25
 */
26
@Component({
38✔
27
    selector: 'thy-transfer-list',
1✔
28
    templateUrl: './transfer-list.component.html',
29
    encapsulation: ViewEncapsulation.None,
38✔
30
    standalone: true,
2✔
31
    imports: [CdkDropListGroup, ThyList, CdkDropList, ThyDragDropDirective, ThyListItem, CdkDrag, NgClass, NgTemplateOutlet]
32
})
33
export class ThyTransferList implements OnInit, DoCheck {
34
    private differs = inject(IterableDiffers);
38✔
35

38✔
36
    public lockItems: ThyTransferItem[] = [];
15✔
37

15✔
38
    public unlockItems: ThyTransferItem[] = [];
39

40
    private _diff: IterableDiffer<ThyTransferItem>;
23✔
41

42
    private _lockDiff: IterableDiffer<ThyTransferItem>;
38✔
43

44
    private _unlockDiff: IterableDiffer<ThyTransferItem>;
45

91✔
46
    @Input() title: string;
91✔
47

91✔
48
    @Input() items: ThyTransferItem[];
42!
49

211✔
50
    @Input() draggable: boolean;
40✔
51

52
    @Input() canLock: boolean;
53

171✔
54
    @Input() maxLock: number;
55

56
    @Input() max: number;
57

58
    @Input() disabled: boolean;
49✔
59

60
    @Input() template: TemplateRef<any>;
61

62
    @Input('renderContentRef') contentRef: TemplateRef<any>;
63

125✔
64
    @Output() draggableUpdate: EventEmitter<InnerTransferDragEvent> = new EventEmitter<InnerTransferDragEvent>();
582✔
65

66
    @Output() selectItem: EventEmitter<ThyTransferSelectEvent> = new EventEmitter<ThyTransferSelectEvent>();
125✔
67

52✔
68
    @Output() unselectItem: EventEmitter<ThyTransferSelectEvent> = new EventEmitter<ThyTransferSelectEvent>();
208✔
69

70
    @HostBinding('class') hostClass = 'thy-transfer-list';
71

125✔
72
    ngOnInit() {
18✔
73
        this._combineTransferData();
70✔
74
        if (this.canLock) {
75
            this._lockDiff = this.differs.find(this.lockItems).create();
76
            this._unlockDiff = this.differs.find(this.unlockItems).create();
77
        } else {
78
            this._unlockDiff = this.differs.find(this.unlockItems).create();
108✔
79
        }
108✔
80
        this._diff = this.differs.find(this.items).create();
53✔
81
    }
53✔
82

83
    private _combineTransferData() {
108✔
84
        this.lockItems = [];
47✔
85
        this.unlockItems = [];
47✔
86
        if (this.canLock) {
21✔
87
            (this.items || []).forEach(item => {
88
                if (item.isLock) {
89
                    this.lockItems.push(item);
108✔
90
                } else {
108✔
91
                    this.unlockItems.push(item);
51✔
92
                }
93
            });
94
        } else {
95
            this.unlockItems = this.items;
4!
UNCOV
96
        }
×
97
    }
98

99
    private _afterChangeItems(changes: IterableChanges<ThyTransferItem>, items: ThyTransferItem[]) {
4✔
100
        // 数据发生变化时,更改order值
4!
101
        changes.forEachAddedItem(record => {
16✔
102
            record.item.order = record.currentIndex;
103
        });
4!
104
        changes.forEachRemovedItem(() => {
16✔
105
            items.forEach((item, index) => {
106
                item.order = index;
107
            });
4✔
108
        });
109
        changes.forEachMovedItem(() => {
110
            items.forEach((item, index) => {
111
                item.order = index;
112
            });
113
        });
4✔
114
    }
115

116
    ngDoCheck() {
117
        const changes = this._diff.diff(this.items);
118
        if (changes) {
1✔
119
            this._afterChangeItems(changes, this.items);
120
            this._combineTransferData();
121
        }
122
        if (this._lockDiff) {
123
            const lockChanges = this._lockDiff.diff(this.lockItems);
124
            if (lockChanges) {
125
                this._afterChangeItems(lockChanges, this.lockItems);
126
            }
127
        }
128
        const unlockChanges = this._unlockDiff.diff(this.unlockItems);
129
        if (unlockChanges) {
130
            this._afterChangeItems(unlockChanges, this.unlockItems);
131
        }
132
    }
133

134
    lockListEnterPredicate = () => {
1✔
135
        return this.lockItems.length < this.maxLock;
136
    };
137

138
    unlockListEnterPredicate = (event: CdkDrag<ThyTransferItem>) => {
139
        return !event.data.isFixed;
140
    };
141

142
    onSelectItem = (item: ThyTransferItem) => {
143
        this.selectItem.emit({ item });
144
    };
145

146
    onUnselectItem = (item: ThyTransferItem) => {
147
        this.unselectItem.emit({ item });
148
    };
149

150
    drop(event: CdkDragDrop<ThyTransferItem[]>) {
151
        if (event.previousContainer === event.container) {
152
            moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
153
        } else {
154
            transferArrayItem(event.previousContainer.data, event.container.data, event.previousIndex, event.currentIndex);
155
            (event.previousContainer.data || []).forEach(item => {
156
                item.isLock = event.previousContainer.id === 'lock';
157
            });
158

159
            (event.container.data || []).forEach(item => {
160
                item.isLock = event.container.id === 'lock';
161
            });
162
        }
163
        const dragEvent: ThyTransferDragEvent = {
164
            model: event.item.data,
165
            models: event.container.data,
166
            oldIndex: event.previousIndex,
167
            newIndex: event.currentIndex
168
        };
169
        this.draggableUpdate.emit({
170
            dragEvent: dragEvent,
171
            listData: { lock: this.lockItems, unlock: this.unlockItems }
172
        });
173
    }
174
}
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

© 2026 Coveralls, Inc