jordium-gantt-vue3
Version:
A Vue 3 Gantt chart component for project management, task scheduling, resource planning, calendar, resource usage and timeline visualization.
180 lines (179 loc) • 9.5 kB
TypeScript
import { WorkingHoursConfig } from '../models/types/CalendarTypes';
/** 一天的毫秒数 */
export declare const DAY_MS: number;
/**
* 判断某天是否为周末(周六=6,周日=0)
*/
export declare function isWeekendDay(dayOfWeek: number): boolean;
/**
* 判断两个日期是否为同一天
*/
export declare function isSameDay(a: Date, b: Date): boolean;
export declare function isToday(date: Date): boolean;
/**
* 解析任务 startDate/endDate 字符串为 Date 对象,正确处理"仅日期"格式(如 "2025-04-15")。
*
* 修复:`new Date("2025-04-15")` 这类不带时间部分的 ISO 8601 日期字符串,会被 JS 引擎按
* **UTC 零点**解析(规范行为),在东八区等非 UTC 时区下会被转换成本地时间 08:00 而非
* 00:00,导致 `classifyTaskForDate` 里的"整点判断"(`start.getHours()===0`)失真,把本应
* 全天展示的任务误判为"从 08:00 开始的具体时段"(表现为日历日/周视图里全天任务被错误地
* 画进小时网格,标题显示为 "08:00 ~ 24:00")。
* 而 `"2025-04-15 00:00"`(空格分隔,带时间部分)等格式本身就会被解析为本地时间,不受
* 此问题影响,无需特殊处理,直接走 `new Date(value)` 即可。
*/
export declare function parseTaskDateTime(value?: string): Date | null;
/**
* 计算某个时间点距当日零点的分钟数(用于"当前时间指示线"定位)
*/
export declare function minutesSinceMidnight(date: Date): number;
/**
* 判断一段任务起止时间是否覆盖到指定日期(按天粒度比较,忽略起止时间的具体时分秒)。
* 修复此前 `start <= date && end >= date` 直接比较 Date 对象的缺陷:
* 当任务起止带有具体时分(如 08:00)时,与当日 00:00 的 date 参数比较会恒为 false,
* 导致月视图等按天渲染的场景遗漏当天有明确起止小时的任务。
*/
export declare function isTaskOnDate(start: Date, end: Date, date: Date): boolean;
/**
* 判断指定小时是否为工作时间
* @param hour 0-23 小时数
* @param dayOfWeek 0-6,0=周日
* @param workingHours 工作时间配置,不传则视为全部非工作时间
*/
export declare function isWorkingHour(hour: number, dayOfWeek: number, workingHours?: WorkingHoursConfig): boolean;
/** 日历日视图使用的小时单元数据 */
export interface CalendarHourCell {
hour: number;
label: string;
date: Date;
isWorkingHour: boolean;
isCurrentHour: boolean;
}
/**
* 生成指定日期的 24 小时单元数据(供日视图/周视图复用)
*/
export declare function generateDayHours(date: Date, workingHours?: WorkingHoursConfig): CalendarHourCell[];
/**
* 获取指定日期所在周的周一(周起始日)
*/
export declare function getWeekStart(date: Date): Date;
/** 日历周视图使用的一天数据 */
export interface CalendarWeekDayCell {
date: Date;
dayOfWeek: number;
isWeekend: boolean;
isToday: boolean;
hours: CalendarHourCell[];
}
/**
* 生成指定日期所在周的 7 天数据(周一到周日)
*/
export declare function generateWeekDays(anchorDate: Date, workingHours?: WorkingHoursConfig): CalendarWeekDayCell[];
/** 日历月视图使用的一天格子数据 */
export interface CalendarMonthDayCell {
date: Date;
/** 是否属于当前展示月份(false 表示为补齐网格的上月/下月弱化日期) */
isCurrentMonth: boolean;
isWeekend: boolean;
isToday: boolean;
}
/**
* 生成传统日历方格所需的月视图网格(含首尾补齐的相邻月日期)
* 固定周一为一周首日,网格行数随自然月天数浮动(5~6 行)
*/
export declare function generateMonthGrid(anchorDate: Date): CalendarMonthDayCell[][];
/**
* 将日期按指定分钟粒度吸附(向下取整),用于拖拽选区的最小刻度吸附
*/
export declare function snapToMinuteStep(date: Date, minuteStep: number): Date;
/**
* 将日期吸附到当天 00:00(用于月视图的天粒度选区)
*/
export declare function snapToDayStart(date: Date): Date;
/**
* 将 Date 格式化为 Task.startDate/endDate 使用的字符串格式(YYYY-MM-DD HH:mm),
* 与 GanttChart.vue 中 handleCalendarSelectionComplete 的 formatForDrawer 保持一致(v1.13.0)
*/
export declare function formatTaskDateTime(date: Date): string;
/**
* 将时间格式化为 HH:mm(用于任务卡片时间段展示)
*/
export declare function formatHourMinute(date: Date): string;
/**
* 格式化任务时间段文案,如 "08:30 ~ 09:30"(v1.13.0 任务卡片标题追加时间信息)
*/
export declare function formatTaskTimeRange(start: Date, end: Date): string;
/**
* 生成日历任务卡片标题:全天任务展示 "任务名 - 全天",有具体起止时间的任务展示
* "任务名 - HH:mm ~ HH:mm"(v1.13.0)
*/
export declare function formatTaskCardTitle(taskName: string, isAllDay: boolean, start: Date, end: Date, allDayLabel?: string): string;
/** 任务在指定日期(date)上的展示分类结果,供日/周视图统一判定全天/具体时段 */
export interface TaskDateClassification {
/** 'all-day' 展示为全天条目;'timed' 按分钟区间绘制具体时段;'none' 与该日期无关,不展示 */
type: 'all-day' | 'timed' | 'none';
/** type === 'timed' 时有效:当日区间起点(距当日零点的分钟数) */
startMinutes?: number;
/** type === 'timed' 时有效:当日区间止点(距当日零点的分钟数);跨天任务在起始日的止点固定为 1440(当日24:00) */
endMinutes?: number;
}
/**
* 判断任务在指定日期(date)应如何展示。仅依据 startDate/endDate 的日期与时间部分判断,
* 不依赖 estimatedHours(预计工时仅用于资源利用率占比计算,与日历展示位置无关)。
*
* 规则:
* 1. 起止日期为同一天:起止时间均为 00:00 -> 全天;否则按实际起止时间绘制具体时段。
* 2. 起止日期不同(跨天任务),按 date 与起止日期的关系分别处理:
* a. date 等于起始日期:起始时间为 00:00 -> 全天;否则从起始时间 ~ 当日24:00 绘制。
* b. date 等于结束日期:结束时间为 00:00 -> 全天;否则从当日00:00 ~ 结束时间绘制。
* c. date 严格介于起止日期之间(不含两端)-> 全天。
* 与 date 无任何交集 -> 'none'。
*/
export declare function classifyTaskForDate(start: Date, end: Date, date: Date): TaskDateClassification;
/** 将"距当日零点分钟数"格式化为 HH:mm;跨天任务当日片段的终点 1440 分钟格式化为 24:00 */
export declare function formatMinutesLabel(minutes: number): string;
/**
* 依据"距当日零点分钟数"区间生成任务卡片标题:"标题 - HH:mm ~ HH:mm"。
* 用于跨天任务:传入的是当日片段区间(如起始日的 "09:30 ~ 24:00"),而非任务整体起止时间。
*/
export declare function formatTaskCardTitleByMinutes(taskName: string, startMinutes: number, endMinutes: number): string;
/** Outlook 风格拖拽选区的分段渲染数据:每个半小时(或指定粒度)槽位一组 slot(底色)/indicator(精确覆盖比例) 矩形 */
export interface SelectionSegmentRect {
/** 槽位(如半小时格)在网格中的像素顶部偏移 */
slotTop: number;
/** 槽位整体像素高度 */
slotHeight: number;
/** 实际选区与该槽位重叠部分的像素顶部偏移 */
indicatorTop: number;
/** 实际选区与该槽位重叠部分的像素高度(未占满槽位时小于 slotHeight,对应"不满30分钟"的比例呈现) */
indicatorHeight: number;
}
/**
* 按固定粒度(默认 30 分钟)将一段选区拆分为多个槽位,每个槽位返回:
* - 槽位自身的完整像素区间(用于渲染整槽浅色背景)
* - 选区与该槽位的实际重叠像素区间(用于渲染左侧深色比例指示条)
* 供 CalendarDayView/CalendarWeekView 的拖拽选区高亮使用,实现类似 Outlook 的
* "半小时格淡蓝底 + 左侧比例指示条" 视觉效果。
*/
export declare function computeSelectionSegments(startMinutesRaw: number, endMinutesRaw: number, hourHeight: number, slotMinutes?: number): SelectionSegmentRect[];
/** 一段以"距当日零点分钟数"表示的时间区间 */
export interface MinuteRange {
start: number;
end: number;
}
/**
* 计算指定星期几的工作时间区间(分钟粒度,供全天任务的"工作时间高亮"渲染使用)。
* 周末或未配置 workingHours 时返回空数组。
*/
export declare function getWorkingHourMinuteRanges(dayOfWeek: number, workingHours?: WorkingHoursConfig): MinuteRange[];
/** 时间轴任务的列布局结果:column 为 0 基列序号,columnCount 为其所属重叠簇的总列数 */
export interface TimedTaskLayout {
column: number;
columnCount: number;
}
/**
* 经典的"日历事件重叠布局"算法(Google Calendar/Outlook 日视图同款思路):
* 按开始时间排序后,尽量复用已结束的列,无法复用时新增列;当某个重叠簇处理完毕
* (下一个事件的开始时间不早于当前簇内所有事件的最大结束时间)时,回填该簇内所有
* 事件的 columnCount,使同一簇内的事件按列等宽并排显示。
*/
export declare function computeTimedTaskLayout(intervals: MinuteRange[]): TimedTaskLayout[];