13693261870
2022-09-16 354b3dbfbffb3df45212a2a44dbbf48b4acc2594
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
Ext.require([
    'Ext.tree.*',
    'Ext.data.*',
    'Ext.layout.container.HBox',
    'Ext.window.MessageBox'
]);
 
Ext.define('Item', {
    extend: 'Ext.data.Model',
    fields: ['text', 'canDropOnFirst', 'canDropOnSecond']
})
 
Ext.onReady(function() {
    
    var store1 = new Ext.data.TreeStore({
        model: 'Item',
        root: {
            text: 'Root 1',
            expanded: true,
            children: [{
                text: 'Child 1',
                canDropOnFirst: true,
                canDropOnSecond: true,
                leaf: true
            }, {
                text: 'Child 2',
                canDropOnFirst: true,
                canDropOnSecond: false,
                leaf: true
            }, {
                text: 'Child 3',
                canDropOnFirst: false,
                canDropOnSecond: true,
                leaf: true
            }, {
                text: 'Child 4',
                canDropOnFirst: false,
                canDropOnSecond: false,
                leaf: true
            }]
        }
    });
    
    var store2 = new Ext.data.TreeStore({
        model: 'Item',
        root: {
            text: 'Root 2',
            expanded: true,
            children: [{
                text: 'Folder 1',
                children: [],
                expanded: true
            }, {
                text: 'Folder 2',
                children: [],
                expanded: true
            }]
        }
    });
 
    new Ext.panel.Panel({
        renderTo: 'tree-div',
        width: 300,
        height: 200,
        layout: {
            type: 'hbox',
            align: 'stretch'
        },
        defaultType: 'treepanel',
        defaults: {
            rootVisible: false,
            flex: 1
        },
        items: [{
            title: 'Source',
            store: store1,
            viewConfig: {
                plugins: {
                   ptype: 'treeviewdragdrop',
                   enableDrag: true,
                   enableDrop: false
                }
            }
        }, {
            title: 'Destination',
            store: store2,
            viewConfig: {
                plugins: {
                   ptype: 'treeviewdragdrop',
                   enableDrag: false,
                   enableDrop: true,
                   appendOnly: true
                },
                listeners: {
                    nodedragover: function(targetNode, position, dragData){
                        var rec = dragData.records[0],
                            isFirst = targetNode.isFirst(),
                            canDropFirst = rec.get('canDropOnFirst'),
                            canDropSecond = rec.get('canDropOnSecond');
                            
                        return isFirst ? canDropFirst : canDropSecond;
                    }
                }
            }
        }]
    });
});