Initial commit,修正
This commit is contained in:
+248
@@ -0,0 +1,248 @@
|
||||
/*! jquery.tablednd.js 20-11-2020 */ ! function(a, b, c, d) {
|
||||
var e = "touchstart mousedown",
|
||||
f = "touchmove mousemove",
|
||||
g = "touchend mouseup";
|
||||
a(c).ready(function() {
|
||||
function b(a) {
|
||||
for (var b = {}, c = a.match(/([^;:]+)/g) || []; c.length;) b[c.shift()] = c.shift().trim();
|
||||
return b
|
||||
}
|
||||
a("table").each(function() {
|
||||
"dnd" === a(this).data("table") && a(this).tableDnD({
|
||||
onDragStyle: a(this).data("ondragstyle") && b(a(this).data("ondragstyle")) || null,
|
||||
onDropStyle: a(this).data("ondropstyle") && b(a(this).data("ondropstyle")) || null,
|
||||
onDragClass: a(this).data("ondragclass") === d && "tDnD_whileDrag" || a(this).data("ondragclass"),
|
||||
onDrop: a(this).data("ondrop") && new Function("table", "row", a(this).data("ondrop")),
|
||||
onDragStart: a(this).data("ondragstart") && new Function("table", "row", a(this).data("ondragstart")),
|
||||
onDragStop: a(this).data("ondragstop") && new Function("table", "row", a(this).data("ondragstop")),
|
||||
scrollAmount: a(this).data("scrollamount") || 5,
|
||||
sensitivity: a(this).data("sensitivity") || 10,
|
||||
hierarchyLevel: a(this).data("hierarchylevel") || 0,
|
||||
indentArtifact: a(this).data("indentartifact") || '<div class="indent"> </div>',
|
||||
autoWidthAdjust: a(this).data("autowidthadjust") || !0,
|
||||
autoCleanRelations: a(this).data("autocleanrelations") || !0,
|
||||
jsonPretifySeparator: a(this).data("jsonpretifyseparator") || "\t",
|
||||
serializeRegexp: a(this).data("serializeregexp") && new RegExp(a(this).data("serializeregexp")) || /[^\-]*$/,
|
||||
serializeParamName: a(this).data("serializeparamname") || !1,
|
||||
dragHandle: a(this).data("draghandle") || null
|
||||
})
|
||||
})
|
||||
}), jQuery.tableDnD = {
|
||||
currentTable: null,
|
||||
dragObject: null,
|
||||
mouseOffset: null,
|
||||
oldX: 0,
|
||||
oldY: 0,
|
||||
build: function(b) {
|
||||
return this.each(function() {
|
||||
this.tableDnDConfig = a.extend({
|
||||
onDragStyle: null,
|
||||
onDropStyle: null,
|
||||
onDragClass: "tDnD_whileDrag",
|
||||
onDrop: null,
|
||||
onDragStart: null,
|
||||
onDragStop: null,
|
||||
scrollAmount: 5,
|
||||
sensitivity: 10,
|
||||
hierarchyLevel: 0,
|
||||
indentArtifact: '<div class="indent"> </div>',
|
||||
autoWidthAdjust: !0,
|
||||
autoCleanRelations: !0,
|
||||
jsonPretifySeparator: "\t",
|
||||
serializeRegexp: /[^\-]*$/,
|
||||
serializeParamName: !1,
|
||||
dragHandle: null
|
||||
}, b || {}), a.tableDnD.makeDraggable(this), this.tableDnDConfig.hierarchyLevel && a.tableDnD.makeIndented(this)
|
||||
}), this
|
||||
},
|
||||
makeIndented: function(b) {
|
||||
var c, d, e = b.tableDnDConfig,
|
||||
f = b.rows,
|
||||
g = a(f).first().find("td:first")[0],
|
||||
h = 0,
|
||||
i = 0;
|
||||
if (a(b).hasClass("indtd")) return null;
|
||||
d = a(b).addClass("indtd").attr("style"), a(b).css({
|
||||
whiteSpace: "nowrap"
|
||||
});
|
||||
for (var j = 0; j < f.length; j++) i < a(f[j]).find("td:first").text().length && (i = a(f[j]).find("td:first").text().length, c = j);
|
||||
for (a(g).css({
|
||||
width: "auto"
|
||||
}), j = 0; j < e.hierarchyLevel; j++) a(f[c]).find("td:first").prepend(e.indentArtifact);
|
||||
for (g && a(g).css({
|
||||
width: g.offsetWidth
|
||||
}), d && a(b).css(d), j = 0; j < e.hierarchyLevel; j++) a(f[c]).find("td:first").children(":first").remove();
|
||||
return e.hierarchyLevel && a(f).each(function() {
|
||||
(h = a(this).data("level") || 0) <= e.hierarchyLevel && a(this).data("level", h) || a(this).data("level", 0);
|
||||
for (var b = 0; b < a(this).data("level"); b++) a(this).find("td:first").prepend(e.indentArtifact)
|
||||
}), this
|
||||
},
|
||||
makeDraggable: function(b) {
|
||||
var c = b.tableDnDConfig;
|
||||
c.dragHandle && a(c.dragHandle, b).each(function() {
|
||||
a(this).bind(e, function(d) {
|
||||
return a.tableDnD.initialiseDrag(a(this).parents("tr")[0], b, this, d, c), !1
|
||||
})
|
||||
}) || a(b.rows).each(function() {
|
||||
a(this).hasClass("nodrag") ? a(this).css("cursor", "") : a(this).bind(e, function(d) {
|
||||
if ("TD" === d.target.tagName) return a.tableDnD.initialiseDrag(this, b, this, d, c), !1
|
||||
}).css("cursor", "move")
|
||||
})
|
||||
},
|
||||
currentOrder: function() {
|
||||
var b = this.currentTable.rows;
|
||||
return a.map(b, function(b) {
|
||||
return (a(b).data("level") + b.id).replace(/\s/g, "")
|
||||
}).join("")
|
||||
},
|
||||
initialiseDrag: function(b, d, e, h, i) {
|
||||
this.dragObject = b, this.currentTable = d, this.mouseOffset = this.getMouseOffset(e, h), this.originalOrder = this.currentOrder(), a(c).bind(f, this.mousemove).bind(g, this.mouseup), i.onDragStart && i.onDragStart(d, e)
|
||||
},
|
||||
updateTables: function() {
|
||||
this.each(function() {
|
||||
this.tableDnDConfig && a.tableDnD.makeDraggable(this)
|
||||
})
|
||||
},
|
||||
mouseCoords: function(a) {
|
||||
return a.originalEvent.changedTouches ? {
|
||||
x: a.originalEvent.changedTouches[0].clientX,
|
||||
y: a.originalEvent.changedTouches[0].clientY
|
||||
} : a.pageX || a.pageY ? {
|
||||
x: a.pageX,
|
||||
y: a.pageY
|
||||
} : {
|
||||
x: a.clientX + c.body.scrollLeft - c.body.clientLeft,
|
||||
y: a.clientY + c.body.scrollTop - c.body.clientTop
|
||||
}
|
||||
},
|
||||
getMouseOffset: function(a, c) {
|
||||
var d, e;
|
||||
return c = c || b.event, e = this.getPosition(a), d = this.mouseCoords(c), {
|
||||
x: d.x - e.x,
|
||||
y: d.y - e.y
|
||||
}
|
||||
},
|
||||
getPosition: function(a) {
|
||||
for (var b = 0, c = 0; a.offsetParent;) b += a.offsetLeft, c += a.offsetTop, a = a.offsetParent;
|
||||
return b += a.offsetLeft, c += a.offsetTop, {
|
||||
x: b,
|
||||
y: c
|
||||
}
|
||||
},
|
||||
autoScroll: function(a) {
|
||||
var d = this.currentTable.tableDnDConfig,
|
||||
e = b.pageYOffset,
|
||||
f = b.innerHeight ? b.innerHeight : c.documentElement.clientHeight ? c.documentElement.clientHeight : c.body.clientHeight;
|
||||
c.all && (void 0 !== c.compatMode && "BackCompat" !== c.compatMode ? e = c.documentElement.scrollTop : void 0 !== c.body && (e = c.body.scrollTop)), a.y - e < d.scrollAmount && b.scrollBy(0, -d.scrollAmount) || f - (a.y - e) < d.scrollAmount && b.scrollBy(0, d.scrollAmount)
|
||||
},
|
||||
moveVerticle: function(a, b) {
|
||||
0 !== a.vertical && b && this.dragObject !== b && this.dragObject.parentNode === b.parentNode && (0 > a.vertical && this.dragObject.parentNode.insertBefore(this.dragObject, b.nextSibling) || 0 < a.vertical && this.dragObject.parentNode.insertBefore(this.dragObject, b))
|
||||
},
|
||||
moveHorizontal: function(b, c) {
|
||||
var d, e = this.currentTable.tableDnDConfig;
|
||||
if (!e.hierarchyLevel || 0 === b.horizontal || !c || this.dragObject !== c) return null;
|
||||
d = a(c).data("level"), 0 < b.horizontal && d > 0 && a(c).find("td:first").children(":first").remove() && a(c).data("level", --d), 0 > b.horizontal && d < e.hierarchyLevel && a(c).prev().data("level") >= d && a(c).children(":first").prepend(e.indentArtifact) && a(c).data("level", ++d)
|
||||
},
|
||||
mousemove: function(b) {
|
||||
var c, d, e, f, g, h = a(a.tableDnD.dragObject),
|
||||
i = a.tableDnD.currentTable.tableDnDConfig;
|
||||
return b && b.preventDefault(), !!a.tableDnD.dragObject && ("touchmove" === b.type && event.preventDefault(), i.onDragClass && h.addClass(i.onDragClass) || h.css(i.onDragStyle), d = a.tableDnD.mouseCoords(b), f = d.x - a.tableDnD.mouseOffset.x, g = d.y - a.tableDnD.mouseOffset.y, a.tableDnD.autoScroll(d), c = a.tableDnD.findDropTargetRow(h, g), e = a.tableDnD.findDragDirection(f, g), a.tableDnD.moveVerticle(e, c), a.tableDnD.moveHorizontal(e, c), !1)
|
||||
},
|
||||
findDragDirection: function(a, b) {
|
||||
var c = this.currentTable.tableDnDConfig.sensitivity,
|
||||
d = this.oldX,
|
||||
e = this.oldY,
|
||||
f = d - c,
|
||||
g = d + c,
|
||||
h = e - c,
|
||||
i = e + c,
|
||||
j = {
|
||||
horizontal: a >= f && a <= g ? 0 : a > d ? -1 : 1,
|
||||
vertical: b >= h && b <= i ? 0 : b > e ? -1 : 1
|
||||
};
|
||||
return 0 !== j.horizontal && (this.oldX = a), 0 !== j.vertical && (this.oldY = b), j
|
||||
},
|
||||
findDropTargetRow: function(b, c) {
|
||||
for (var d = 0, e = this.currentTable.rows, f = this.currentTable.tableDnDConfig, g = 0, h = null, i = 0; i < e.length; i++)
|
||||
if (h = e[i], g = this.getPosition(h).y, d = parseInt(h.offsetHeight) / 2, 0 === h.offsetHeight && (g = this.getPosition(h.firstChild).y, d = parseInt(h.firstChild.offsetHeight) / 2), c > g - d && c < g + d) return b.is(h) || f.onAllowDrop && !f.onAllowDrop(b, h) || a(h).hasClass("nodrop") ? null : h;
|
||||
return null
|
||||
},
|
||||
processMouseup: function() {
|
||||
if (!this.currentTable || !this.dragObject) return null;
|
||||
var b = this.currentTable.tableDnDConfig,
|
||||
d = this.dragObject,
|
||||
e = 0,
|
||||
h = 0;
|
||||
a(c).unbind(f, this.mousemove).unbind(g, this.mouseup), b.hierarchyLevel && b.autoCleanRelations && a(this.currentTable.rows).first().find("td:first").children().each(function() {
|
||||
(h = a(this).parents("tr:first").data("level")) && a(this).parents("tr:first").data("level", --h) && a(this).remove()
|
||||
}) && b.hierarchyLevel > 1 && a(this.currentTable.rows).each(function() {
|
||||
if ((h = a(this).data("level")) > 1)
|
||||
for (e = a(this).prev().data("level"); h > e + 1;) a(this).find("td:first").children(":first").remove(), a(this).data("level", --h)
|
||||
}), b.onDragClass && a(d).removeClass(b.onDragClass) || a(d).css(b.onDropStyle), this.dragObject = null, b.onDrop && this.originalOrder !== this.currentOrder() && a(d).hide().fadeIn("fast") && b.onDrop(this.currentTable, d), b.onDragStop && b.onDragStop(this.currentTable, d), this.currentTable = null
|
||||
},
|
||||
mouseup: function(b) {
|
||||
return b && b.preventDefault(), a.tableDnD.processMouseup(), !1
|
||||
},
|
||||
jsonize: function(a) {
|
||||
var b = this.currentTable;
|
||||
return a ? JSON.stringify(this.tableData(b), null, b.tableDnDConfig.jsonPretifySeparator) : JSON.stringify(this.tableData(b))
|
||||
},
|
||||
serialize: function() {
|
||||
return a.param(this.tableData(this.currentTable))
|
||||
},
|
||||
serializeTable: function(a) {
|
||||
for (var b = "", c = a.tableDnDConfig.serializeParamName || a.id, d = a.rows, e = 0; e < d.length; e++) {
|
||||
b.length > 0 && (b += "&");
|
||||
var f = d[e].id;
|
||||
f && a.tableDnDConfig && a.tableDnDConfig.serializeRegexp && (f = f.match(a.tableDnDConfig.serializeRegexp)[0], b += c + "[]=" + f)
|
||||
}
|
||||
return b
|
||||
},
|
||||
serializeTables: function() {
|
||||
var b = [];
|
||||
return a("table").each(function() {
|
||||
this.id && b.push(a.param(a.tableDnD.tableData(this)))
|
||||
}), b.join("&")
|
||||
},
|
||||
tableData: function(b) {
|
||||
var c, d, e, f, g = b.tableDnDConfig,
|
||||
h = [],
|
||||
i = 0,
|
||||
j = 0,
|
||||
k = null,
|
||||
l = {};
|
||||
if (b || (b = this.currentTable), !b || !b.rows || !b.rows.length) return {
|
||||
error: {
|
||||
code: 500,
|
||||
message: "Not a valid table."
|
||||
}
|
||||
};
|
||||
if (!b.id && !g.serializeParamName) return {
|
||||
error: {
|
||||
code: 500,
|
||||
message: "No serializable unique id provided."
|
||||
}
|
||||
};
|
||||
f = g.autoCleanRelations && b.rows || a.makeArray(b.rows), d = g.serializeParamName || b.id, e = d, c = function(a) {
|
||||
return a && g && g.serializeRegexp ? a.match(g.serializeRegexp)[0] : a
|
||||
}, l[e] = [], !g.autoCleanRelations && a(f[0]).data("level") && f.unshift({
|
||||
id: "undefined"
|
||||
});
|
||||
for (var m = 0; m < f.length; m++)
|
||||
if (g.hierarchyLevel) {
|
||||
if (0 === (j = a(f[m]).data("level") || 0)) e = d, h = [];
|
||||
else if (j > i) h.push([e, i]), e = c(f[m - 1].id);
|
||||
else if (j < i)
|
||||
for (var n = 0; n < h.length; n++) h[n][1] === j && (e = h[n][0]), h[n][1] >= i && (h[n][1] = 0);
|
||||
i = j, a.isArray(l[e]) || (l[e] = []), k = c(f[m].id), k && l[e].push(k)
|
||||
} else(k = c(f[m].id)) && l[e].push(k);
|
||||
return l
|
||||
}
|
||||
}, jQuery.fn.extend({
|
||||
tableDnD: a.tableDnD.build,
|
||||
tableDnDUpdate: a.tableDnD.updateTables,
|
||||
tableDnDSerialize: a.proxy(a.tableDnD.serialize, a.tableDnD),
|
||||
tableDnDSerializeAll: a.tableDnD.serializeTables,
|
||||
tableDnDData: a.proxy(a.tableDnD.tableData, a.tableDnD)
|
||||
})
|
||||
}(jQuery, window, window.document);
|
||||
Reference in New Issue
Block a user