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

atinc / ngx-tethys / 68ef226c-f83e-44c1-b8ed-e420a83c5d84

28 May 2025 10:31AM UTC coverage: 10.352% (-80.0%) from 90.316%
68ef226c-f83e-44c1-b8ed-e420a83c5d84

Pull #3460

circleci

pubuzhixing8
chore: xxx
Pull Request #3460: refactor(icon): migrate signal input #TINFR-1476

132 of 6823 branches covered (1.93%)

Branch coverage included in aggregate %.

10 of 14 new or added lines in 1 file covered. (71.43%)

11648 existing lines in 344 files now uncovered.

2078 of 14525 relevant lines covered (14.31%)

6.69 hits per line

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

3.61
/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,
12
    Output,
1✔
13
    Signal,
UNCOV
14
    TemplateRef,
×
UNCOV
15
    ViewEncapsulation,
×
UNCOV
16
    inject
×
UNCOV
17
} from '@angular/core';
×
UNCOV
18

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

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

×
UNCOV
37
    public lockItems: ThyTransferItem[] = [];
×
UNCOV
38

×
UNCOV
39
    public unlockItems: ThyTransferItem[] = [];
×
40

41
    private _diff: IterableDiffer<ThyTransferItem>;
UNCOV
42

×
43
    private _lockDiff: IterableDiffer<ThyTransferItem>;
UNCOV
44

×
45
    private _unlockDiff: IterableDiffer<ThyTransferItem>;
46

UNCOV
47
    locale: Signal<ThyTransferLocale> = injectLocale('transfer');
×
UNCOV
48

×
UNCOV
49
    @Input() title: string;
×
UNCOV
50

×
UNCOV
51
    @Input() items: ThyTransferItem[];
×
UNCOV
52

×
53
    @Input() draggable: boolean;
54

UNCOV
55
    @Input() canLock: boolean;
×
56

57
    @Input() maxLock: number;
58

59
    @Input() max: number;
UNCOV
60

×
61
    @Input() disabled: boolean;
62

63
    @Input() template: TemplateRef<any>;
64

UNCOV
65
    @Input('renderContentRef') contentRef: TemplateRef<any>;
×
UNCOV
66

×
67
    @Output() draggableUpdate: EventEmitter<InnerTransferDragEvent> = new EventEmitter<InnerTransferDragEvent>();
UNCOV
68

×
UNCOV
69
    @Output() selectItem: EventEmitter<ThyTransferSelectEvent> = new EventEmitter<ThyTransferSelectEvent>();
×
UNCOV
70

×
71
    @Output() unselectItem: EventEmitter<ThyTransferSelectEvent> = new EventEmitter<ThyTransferSelectEvent>();
72

UNCOV
73
    @HostBinding('class') hostClass = 'thy-transfer-list';
×
UNCOV
74

×
UNCOV
75
    ngOnInit() {
×
76
        this._combineTransferData();
77
        if (this.canLock) {
78
            this._lockDiff = this.differs.find(this.lockItems).create();
79
            this._unlockDiff = this.differs.find(this.unlockItems).create();
UNCOV
80
        } else {
×
UNCOV
81
            this._unlockDiff = this.differs.find(this.unlockItems).create();
×
UNCOV
82
        }
×
UNCOV
83
        this._diff = this.differs.find(this.items).create();
×
84
    }
UNCOV
85

×
UNCOV
86
    private _combineTransferData() {
×
UNCOV
87
        this.lockItems = [];
×
UNCOV
88
        this.unlockItems = [];
×
89
        if (this.canLock) {
90
            (this.items || []).forEach(item => {
UNCOV
91
                if (item.isLock) {
×
UNCOV
92
                    this.lockItems.push(item);
×
UNCOV
93
                } else {
×
94
                    this.unlockItems.push(item);
95
                }
96
            });
UNCOV
97
        } else {
×
UNCOV
98
            this.unlockItems = this.items;
×
99
        }
100
    }
UNCOV
101

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

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

1✔
137
    lockListEnterPredicate = () => {
138
        return this.lockItems.length < this.maxLock;
139
    };
140

141
    unlockListEnterPredicate = (event: CdkDrag<ThyTransferItem>) => {
142
        return !event.data.isFixed;
143
    };
144

145
    onSelectItem = (item: ThyTransferItem) => {
146
        this.selectItem.emit({ item });
147
    };
148

149
    onUnselectItem = (item: ThyTransferItem) => {
150
        this.unselectItem.emit({ item });
151
    };
152

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

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