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

atinc / ngx-tethys / 2b0c2344-6c9c-4127-9e80-38f3934d3178

16 Nov 2024 09:49AM UTC coverage: 90.353% (+0.005%) from 90.348%
2b0c2344-6c9c-4127-9e80-38f3934d3178

push

circleci

minlovehua
feat: i18n structure

5521 of 6758 branches covered (81.7%)

Branch coverage included in aggregate %.

13193 of 13954 relevant lines covered (94.55%)

996.88 hits per line

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

91.57
/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
    TemplateRef,
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✔
21
import { InnerTransferDragEvent, ThyTransferDragEvent, ThyTransferItem, ThyTransferSelectEvent } from './transfer.interface';
38✔
22
import { useLocale } from 'ngx-tethys/i18n';
38✔
23

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

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

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

41
    private _diff: IterableDiffer<ThyTransferItem>;
42

23✔
43
    private _lockDiff: IterableDiffer<ThyTransferItem>;
44

38✔
45
    private _unlockDiff: IterableDiffer<ThyTransferItem>;
46

47
    locale = useLocale();
91✔
48

91✔
49
    @Input() title: string;
91✔
50

42!
51
    @Input() items: ThyTransferItem[];
211✔
52

40✔
53
    @Input() draggable: boolean;
54

55
    @Input() canLock: boolean;
171✔
56

57
    @Input() maxLock: number;
58

59
    @Input() max: number;
60

49✔
61
    @Input() disabled: boolean;
62

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

65
    @Input('renderContentRef') contentRef: TemplateRef<any>;
125✔
66

582✔
67
    @Output() draggableUpdate: EventEmitter<InnerTransferDragEvent> = new EventEmitter<InnerTransferDragEvent>();
68

125✔
69
    @Output() selectItem: EventEmitter<ThyTransferSelectEvent> = new EventEmitter<ThyTransferSelectEvent>();
52✔
70

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

73
    @HostBinding('class') hostClass = 'thy-transfer-list';
125✔
74

18✔
75
    ngOnInit() {
70✔
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();
80
        } else {
108✔
81
            this._unlockDiff = this.differs.find(this.unlockItems).create();
108✔
82
        }
53✔
83
        this._diff = this.differs.find(this.items).create();
53✔
84
    }
85

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

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