-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathview.js
125 lines (124 loc) · 4.93 KB
/
view.js
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
// 展示对象, 操作DOM
var view = {
// 转换初始化, 将初始dom转换成js对象
dom2obj: function (container, dragkit) {
var j = 0,
arr = [],
opt = dragkit.opt,
elements = container.children;
dragkit.elements = {};
for (var i = 0, len = elements.length; i < len; i++) {
var ele = elements[i];
if (ele.classList.contains(DK_ITEM)) {
var temp = j++,
id = ele.getAttribute(DK_ID);
arr[temp] = {
id: id
};
arr[temp][opt.showFieldName] = ele.getAttribute(DK_TEXT);
dragkit.elements[id] = ele;
}
}
return arr;
},
setContainerParam: function (opt, data, container) {
var prompt = container.querySelector('.' + DK_ITEM_PROMPT_TEXT);
var height = data.length * (opt.nodeH + opt.padding);
if (data.length < opt.maxNodeNum && opt.isShowPromptText) {
height = height + (opt.nodeH);
prompt.style.cssText = 'display:block;';
} else {
prompt.style.cssText = 'display:none;';
}
container.style.cssText = 'height:' + height + 'px';
},
searchUp: function (node, className) {
if (!node || node === document.body || node === document) return undefined; // 向上递归到顶就停
if (node.classList.contains(className)) return node;
return this.searchUp(node.parentNode, className);
},
getOffset: function (node, offset, parent) {
if (!parent)
return node.getBoundingClientRect();
offset = offset || {top: 0, left: 0};
if (node === null || node === parent) return offset;
offset.top += node.offsetTop;
offset.left += node.offsetLeft;
return this.getOffset(node.offsetParent, offset, parent);
},
init: function (data, opt, container) {
var self = this,
elements = {},
fragment = document.createDocumentFragment();
if (data && data.length > 0) {
data.forEach(function (node, idx) {
var ele = self.create(node, opt);
elements[node.id] = ele;
fragment.appendChild(ele);
});
this.setContainerParam(opt, data, container);
container.appendChild(fragment);
}
return elements;
},
create: function (node, opt, className) {
var content = document.createElement("div"),
ele = document.createElement("div");
content.className = DK_ITEM_CONTENT;
content.innerHTML = node[opt && opt.showFieldName] || '';
ele.appendChild(content);
ele.className = className || DK_ITEM + ' ' + DK_ANIMATE_ITEM;
ele.setAttribute(DK_ID, node.id || '');
ele.style.cssText = this.setStyleTop(node.innerY);
// 节点悬停时需要显示删除图标(拖拽节点和待删除节点不会显示删除图标)
node.id && this.appendDelIco(ele, node.id);
return ele;
},
update: function (node, ele, opt, className) {
if (!node) return;
var content = ele.querySelector('.'+DK_ITEM_CONTENT);
content.innerHTML = node[opt.showFieldName] || '';
ele.className = className || DK_ITEM + ' ' + DK_ANIMATE_ITEM;
ele.setAttribute(DK_ID, node.id || '');
ele.style.cssText = this.setStyleTop(node.innerY);
// 节点悬停时需要显示删除图标(拖拽节点和待删除节点不会显示删除图标)
node.id && this.appendDelIco(ele, node.id);
return ele;
},
show: function(ele) {
ele.classList.remove(DK_HIDE_ITEM);
},
hide: function(ele) {
ele.classList.add(DK_HIDE_ITEM);
},
remove: function (container, id, className) {
className = className || DK_ITEM;
var attrSelector = id ? '[' + DK_ID + '="' + (id || '') + '"]' : '';
var delElement = container.querySelector('div.' + className + attrSelector);
delElement && container.removeChild(delElement);
},
render: function (opt, data, elements, container) {
for(var id in elements) {
if(elements.hasOwnProperty(id)) {
var ele = elements[id];
if (!ele.classList.contains(DK_GRAG_DROP_ITEM)) {
var node = data.filter(function (n) {
return n.id === ele.getAttribute(DK_ID)
})[0];
ele.style.cssText = this.setStyleTop(node.innerY);
}
}
}
this.setContainerParam(opt, data, container);
},
setStyleTop: function (top) {
return ';top:' + top + 'px;';
},
appendDelIco: function (ele, id) {
var delIco = document.createElement("div");
delIco.className = DK_DELETE_ITEM_ICO;
delIco.innerHTML = '\u2715';
delIco.setAttribute(DK_ID, id);
ele.appendChild(delIco);
}
};