178 lines
4.8 KiB
JavaScript
178 lines
4.8 KiB
JavaScript
var treeSection = document.querySelector('.tree-section');
|
|
|
|
var isDragging = false;
|
|
var startX, startY, scrollLeft, scrollTop;
|
|
|
|
treeSection.addEventListener('mousedown', (e) => {
|
|
isDragging = true;
|
|
startX = e.pageX - treeSection.offsetLeft;
|
|
startY = e.pageY - treeSection.offsetTop;
|
|
scrollLeft = treeSection.scrollLeft;
|
|
scrollTop = treeSection.scrollTop;
|
|
treeSection.style.cursor = 'grabbing';
|
|
});
|
|
|
|
treeSection.addEventListener('mouseleave', () => {
|
|
isDragging = false;
|
|
treeSection.style.cursor = 'grab';
|
|
});
|
|
|
|
treeSection.addEventListener('mouseup', () => {
|
|
isDragging = false;
|
|
treeSection.style.cursor = 'grab';
|
|
});
|
|
|
|
treeSection.addEventListener('mousemove', (e) => {
|
|
if (!isDragging) return;
|
|
e.preventDefault();
|
|
var x = e.pageX - treeSection.offsetLeft;
|
|
var y = e.pageY - treeSection.offsetTop;
|
|
var walkX = (x - startX) * 1.5;
|
|
var walkY = (y - startY) * 1.5;
|
|
treeSection.scrollLeft = scrollLeft - walkX;
|
|
treeSection.scrollTop = scrollTop - walkY;
|
|
});
|
|
|
|
treeSection.addEventListener('touchstart', (e) => {
|
|
isDragging = true;
|
|
startX = e.touches[0].pageX - treeSection.offsetLeft;
|
|
startY = e.touches[0].pageY - treeSection.offsetTop;
|
|
scrollLeft = treeSection.scrollLeft;
|
|
scrollTop = treeSection.scrollTop;
|
|
});
|
|
|
|
treeSection.addEventListener('touchend', () => {
|
|
isDragging = false;
|
|
});
|
|
|
|
treeSection.addEventListener('touchmove', (e) => {
|
|
if (!isDragging) return;
|
|
var x = e.touches[0].pageX - treeSection.offsetLeft;
|
|
var y = e.touches[0].pageY - treeSection.offsetTop;
|
|
var walkX = (x - startX) * 1.5;
|
|
var walkY = (y - startY) * 1.5;
|
|
treeSection.scrollLeft = scrollLeft - walkX;
|
|
treeSection.scrollTop = scrollTop - walkY;
|
|
});
|
|
|
|
function buildTree(assignments) {
|
|
console.log(assignments);
|
|
|
|
let senderName = $("#senderFullName").val();
|
|
const root = { id: senderId, name: senderName, children: [] };
|
|
const map = new Map();
|
|
map.set(senderId, root);
|
|
|
|
assignments.forEach(assignment => {
|
|
const { assignerId, assignedId, assignedName } = assignment;
|
|
|
|
if (!map.has(assignerId)) {
|
|
map.set(assignerId, { id: assignerId, children: [] });
|
|
}
|
|
if (!map.has(assignedId)) {
|
|
map.set(assignedId, { id: assignedId, name: assignedName, children: [] });
|
|
}
|
|
|
|
const assignerNode = map.get(assignerId);
|
|
const assignedNode = map.get(assignedId);
|
|
|
|
if (assignerId !== assignedId) {
|
|
assignerNode.children.push(assignedNode);
|
|
}
|
|
|
|
//برای نمایش ارجاع به خود
|
|
|
|
//else {
|
|
// assignerNode.children.push({ id: assignedNode.id, name: assignedNode.name, children: [] });
|
|
//}
|
|
});
|
|
|
|
return root;
|
|
}
|
|
|
|
var FirstTime = false;
|
|
function renderTree(node, container) {
|
|
const entry = document.createElement('div');
|
|
entry.classList.add("entry");
|
|
if (!FirstTime) {
|
|
entry.classList.add("no-line");
|
|
FirstTime = true;
|
|
}
|
|
|
|
const subEntry = document.createElement('span');
|
|
subEntry.textContent = `${node.name}`;
|
|
|
|
entry.appendChild(subEntry);
|
|
container.appendChild(entry);
|
|
|
|
if (node.children.length > 0) {
|
|
const branch = document.createElement('div');
|
|
branch.classList.add("branch");
|
|
entry.appendChild(branch);
|
|
|
|
node.children.forEach(child => {
|
|
renderTree(child, branch);
|
|
});
|
|
}
|
|
}
|
|
|
|
$(document).ready(function () {
|
|
const treeData = buildTree(assignments);
|
|
|
|
const diagramContainer = document.getElementById('tree-container');
|
|
renderTree(treeData, diagramContainer);
|
|
|
|
|
|
|
|
const canvasWrapper = document.getElementById("canvas-wrapper");
|
|
const tree = document.getElementById("tree");
|
|
let isDragging = false;
|
|
let startX, startY;
|
|
let translateX = -50, translateY = -50;
|
|
let scale = 1;
|
|
let dragSensitivity = 0.4;
|
|
|
|
canvasWrapper.addEventListener("mousedown", (e) => {
|
|
isDragging = true;
|
|
startX = e.clientX;
|
|
startY = e.clientY;
|
|
canvasWrapper.classList.add("dragging");
|
|
});
|
|
|
|
canvasWrapper.addEventListener("mousemove", (e) => {
|
|
if (!isDragging) return;
|
|
|
|
const dx = (e.clientX - startX) * dragSensitivity / scale;
|
|
const dy = (e.clientY - startY) * dragSensitivity / scale;
|
|
|
|
translateX += dx;
|
|
translateY += dy;
|
|
|
|
tree.style.transform = `translate(${translateX}%, ${translateY}%) scale(${scale})`;
|
|
|
|
startX = e.clientX;
|
|
startY = e.clientY;
|
|
});
|
|
|
|
document.addEventListener("mouseup", () => {
|
|
isDragging = false;
|
|
canvasWrapper.classList.remove("dragging");
|
|
});
|
|
|
|
canvasWrapper.addEventListener("wheel", (e) => {
|
|
e.preventDefault();
|
|
const delta = e.deltaY > 0 ? -0.1 : 0.1;
|
|
|
|
scale = Math.min(Math.max(0.2, scale + delta), 3);
|
|
|
|
tree.style.transform = `translate(${translateX}%, ${translateY}%) scale(${scale})`;
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|