Files
im-uniapp/components/Gantt/core/Layout.js
2025-07-16 14:23:42 +08:00

57 lines
2.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Layout布局计算器负责任务条和依赖线的布局
export default class Layout {
constructor(tasks, config) {
this.tasks = tasks;
this.config = config;
}
// 计算任务条布局
computeTaskLayout() {
// 简单实现每个任务一行计算左侧start、宽度end-start
const layout = [];
this.tasks.forEach((task, idx) => {
const startPixel = this.dateToPixel(task.start);
const endPixel = this.dateToPixel(task.end);
layout.push({
id: task.id,
top: idx * 32,
left: startPixel,
width: endPixel - startPixel,
height: 28,
color: this.getTaskColor(task)
});
});
return layout;
}
// 计算依赖线布局(可扩展)
computeDependencyLines() {
// 返回依赖线的起止坐标
return [];
}
// 工具:日期转像素
dateToPixel(date) {
const start = new Date(this.config.startDate);
const d = new Date(date);
const scaleMap = { day: 40, week: 80, month: 200, quarter: 600 };
const scale = scaleMap[this.config.timeScale] || 80;
let diff = 0;
if (this.config.timeScale === 'day') {
diff = (d - start) / (1000 * 3600 * 24);
} else if (this.config.timeScale === 'week') {
diff = (d - start) / (1000 * 3600 * 24 * 7);
} else if (this.config.timeScale === 'month') {
diff = (d.getFullYear() - start.getFullYear()) * 12 + (d.getMonth() - start.getMonth());
} else if (this.config.timeScale === 'quarter') {
diff = ((d.getFullYear() - start.getFullYear()) * 12 + (d.getMonth() - start.getMonth())) / 3;
}
return diff * scale;
}
// 工具:获取任务颜色
getTaskColor(task) {
const group = this.config.groupBy;
if (group && task.dimensions && task.dimensions[group]) {
const id = task.dimensions[group].id;
return this.config.colors && this.config.colors[group] && this.config.colors[group][id] ? this.config.colors[group][id] : '#409EFF';
}
return '#409EFF';
}
}