-
zhangwei
2025-03-10 309cc3fe6303d8464951063e89fc9d623915501e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// 本文件由FirstUI授权予四川政采招投标咨询有限公司(会员ID:16  3,营业执照号:91  5    1013     1 33    2 006193K)专用,请尊重知识产权,勿私下传播,违者追究法律责任。
// #ifndef APP-PLUS || MP-WEIXIN || H5
 
export default {
    data() {
        return {
            current: -1,
            transX: '0px',
            transY: '0px',
            startTouch: null,
            tDragging: false,
            sId: null,
            preStartKey: null
        }
    },
    methods: {
        outOfRange(x1, y1, x2, y2, x3, y3) {
            return x1 < 0 || x1 >= y1 || x2 < 0 || x2 >= y2 || x3 < 0 || x3 >= y3
        },
        listSort(sKey, eKey) {
            let endRealKey = -1;
            this.list.forEach((item) => {
                if (item.sortKey === eKey) endRealKey = item.realKey;
            });
 
            return this.list.map((item) => {
                let cKey = item.sortKey;
                let rKey = item.realKey;
                if (sKey < eKey) {
                    if (cKey > sKey && cKey <= eKey) {
                        --rKey;
                        --cKey;
                    } else if (cKey === sKey) {
                        rKey = endRealKey;
                        cKey = eKey;
                    }
                } else if (sKey > eKey) {
                    if (cKey >= eKey && cKey < sKey) {
                        ++rKey;
                        ++cKey;
                    } else if (cKey === sKey) {
                        rKey = endRealKey;
                        cKey = eKey;
                    }
                }
                if (item.sortKey !== cKey) {
                    let columns = Number(this.columns)
                    item.transX = (cKey % columns) * this.cellWidth + "px";
                    item.transY = Math.floor(cKey / columns) * this.cellHeight + "px";
                    item.sortKey = cKey;
                    item.realKey = rKey;
                }
                return item;
            });
        },
        emitsEvent(list, type) {
            let changeList = [],
                itemList = [];
 
            list.forEach((item) => {
                changeList[item.sortKey] = item;
            });
 
            changeList.forEach((item) => {
                itemList.push(item.entity);
            });
            if (type == "change") {
                this.change({
                    itemList: itemList
                });
            } else {
                this.sortend({
                    itemList: itemList
                });
            }
        },
        longPress(e) {
            if (!this.isDrag) return;
            let touch = e.changedTouches && e.changedTouches[0] ? e.changedTouches[0] : this.startTouch;
            if (!touch) return;
            this.current = Number(e.currentTarget.dataset.index);
 
            if (this.tDragging) return;
            //pageX
            this.transX = this.columns == 1 ? 0 : touch.clientX - (this.cellWidth / 2 + this.wrapLeft) + 'px';
            this.transY = touch.clientY - (this.cellHeight / 2 + this.wrapTop) + 'px';
            this.sId = touch.identifier;
            this.tDragging = true;
        },
        touchstart(e) {
            if (!this.isDrag) return;
            this.startTouch = e.changedTouches[0] || e.touches[0];
        },
        touchmove(e) {
            if (!this.isDrag || !this.tDragging) return;
            let touch = e.changedTouches[0] || e.touches[0];
            if (!touch || this.sId !== touch.identifier) return;
            let transX = this.columns == 1 ? 0 : touch.clientX - (this.cellWidth / 2 + this.wrapLeft);
            let transY = touch.clientY - (this.cellHeight / 2 + this.wrapTop);
 
            if (touch.clientY > this.windowHeight - this.cellHeight) {
                this.pageScroll({
                    scrollTop: touch.pageY + this.cellHeight - this.windowHeight
                })
            } else if (touch.clientY < this.cellHeight) {
                this.pageScroll({
                    scrollTop: touch.pageY - this.cellHeight
                })
            }
            this.transX = transX + 'px'
            this.transY = transY + 'px'
 
            let startKey = this.list[this.current].sortKey;
            let curX = Math.round(transX / this.cellWidth);
            let curY = Math.round(transY / this.cellHeight);
            let endKey = curX + Number(this.columns) * curY;
 
            if (this.outOfRange(curX, Number(this.columns), curY, this.rows, endKey, this.list.length)) return;
 
            if (startKey === endKey || startKey === this.preStartKey) return;
            this.preStartKey = startKey;
 
            let list = this.listSort(startKey, endKey);
            this.listChange({
                itemList: list
            })
            this.emitsEvent(list, "change");
        },
        touchend(e) {
            if (!this.isDrag || !this.tDragging) return;
            this.emitsEvent(this.list, "sortend");
            this.preStartKey = -1;
            this.tDragging = false;
            this.current = -1;
            this.transX = '0px';
            this.transY = '0px';
        }
    }
}
 
// #endif
 
// #ifdef APP-PLUS|| MP-WEIXIN || H5
export default {}
// #endif