@wimi/vtable-gantt 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/cjs/Gantt.d.ts +19 -0
  2. package/cjs/Gantt.js +135 -9
  3. package/cjs/Gantt.js.map +1 -1
  4. package/cjs/event/event-manager.js +17 -6
  5. package/cjs/event/event-manager.js.map +1 -1
  6. package/cjs/gantt-helper.d.ts +7 -0
  7. package/cjs/gantt-helper.js +76 -66
  8. package/cjs/gantt-helper.js.map +1 -1
  9. package/cjs/index.d.ts +1 -1
  10. package/cjs/index.js +1 -1
  11. package/cjs/index.js.map +1 -1
  12. package/cjs/plugins/index.js.map +1 -1
  13. package/cjs/scenegraph/dependency-link.js +28 -38
  14. package/cjs/scenegraph/dependency-link.js.map +1 -1
  15. package/cjs/scenegraph/grid.js +12 -11
  16. package/cjs/scenegraph/grid.js.map +1 -1
  17. package/cjs/scenegraph/mark-line.js +10 -12
  18. package/cjs/scenegraph/mark-line.js.map +1 -1
  19. package/cjs/scenegraph/task-bar.d.ts +11 -1
  20. package/cjs/scenegraph/task-bar.js +189 -29
  21. package/cjs/scenegraph/task-bar.js.map +1 -1
  22. package/cjs/scenegraph/timeline-header.js +1 -4
  23. package/cjs/scenegraph/timeline-header.js.map +1 -1
  24. package/cjs/state/state-manager.js +22 -18
  25. package/cjs/state/state-manager.js.map +1 -1
  26. package/cjs/tools/isx.d.ts +1 -1
  27. package/cjs/tools/util.js +2 -1
  28. package/cjs/tools/util.js.map +1 -1
  29. package/cjs/ts-types/gantt-engine.d.ts +8 -0
  30. package/cjs/ts-types/gantt-engine.js +2 -1
  31. package/cjs/ts-types/gantt-engine.js.map +1 -1
  32. package/cjs/zoom-scale/DataZoomIntegration.d.ts +2 -0
  33. package/cjs/zoom-scale/DataZoomIntegration.js +32 -20
  34. package/cjs/zoom-scale/DataZoomIntegration.js.map +1 -1
  35. package/cjs/zoom-scale/ZoomScaleManager.js +1 -2
  36. package/dist/vtable-gantt.js +4154 -1803
  37. package/dist/vtable-gantt.min.js +1 -15
  38. package/es/Gantt.d.ts +19 -0
  39. package/es/Gantt.js +135 -8
  40. package/es/Gantt.js.map +1 -1
  41. package/es/event/event-manager.js +17 -6
  42. package/es/event/event-manager.js.map +1 -1
  43. package/es/gantt-helper.d.ts +7 -0
  44. package/es/gantt-helper.js +75 -63
  45. package/es/gantt-helper.js.map +1 -1
  46. package/es/index.d.ts +1 -1
  47. package/es/index.js +1 -1
  48. package/es/index.js.map +1 -1
  49. package/es/plugins/index.js.map +1 -1
  50. package/es/scenegraph/dependency-link.js +29 -27
  51. package/es/scenegraph/dependency-link.js.map +1 -1
  52. package/es/scenegraph/grid.js +10 -12
  53. package/es/scenegraph/grid.js.map +1 -1
  54. package/es/scenegraph/mark-line.js +10 -11
  55. package/es/scenegraph/mark-line.js.map +1 -1
  56. package/es/scenegraph/task-bar.d.ts +11 -1
  57. package/es/scenegraph/task-bar.js +190 -29
  58. package/es/scenegraph/task-bar.js.map +1 -1
  59. package/es/scenegraph/timeline-header.js +2 -3
  60. package/es/scenegraph/timeline-header.js.map +1 -1
  61. package/es/state/state-manager.js +22 -18
  62. package/es/state/state-manager.js.map +1 -1
  63. package/es/tools/isx.d.ts +1 -1
  64. package/es/tools/util.js +2 -1
  65. package/es/tools/util.js.map +1 -1
  66. package/es/ts-types/gantt-engine.d.ts +8 -0
  67. package/es/ts-types/gantt-engine.js +2 -1
  68. package/es/ts-types/gantt-engine.js.map +1 -1
  69. package/es/zoom-scale/DataZoomIntegration.d.ts +2 -0
  70. package/es/zoom-scale/DataZoomIntegration.js +32 -20
  71. package/es/zoom-scale/DataZoomIntegration.js.map +1 -1
  72. package/es/zoom-scale/ZoomScaleManager.js +1 -2
  73. package/package.json +11 -9
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tools/util.ts"],"names":[],"mappings":"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","file":"util.js","sourcesContent":["import { isValid } from '@visactor/vutils';\nimport { DayTimes } from '../gantt-helper';\n\n/**\n * throttle 保障了首次立即执行 后续触发的回调执行间隔delay时间 区别于throttle2 最后执行时机会提前\n * @param { Function } func 执行函数\n * @param { Interger } time 多长时间内不能第二次执行\n * @returns function 返回经过节流处理的函数\n */\nexport function throttle(func: Function, delay: number) {\n let timer: any = null;\n return function (this: any, ...args: any[]) {\n // let args=arguments 也可以写成这种或...args也是代表我们传过来的实参\n if (!timer) {\n func.apply(this, args); //先执行函数,保证第一次立即执行\n timer = setTimeout(() => {\n timer = null;\n }, delay);\n }\n // console.log('throttle');\n // 当我们第一次触发事件,定时器不存在时就执行函数,当我们再次点击时,因为定时器存在,\n // 所以无法再进入函数调用(无论事件如何执行),那么只能等定时器事件结束,\n // 我们让timer=null,回到第一次的状态,就又重新开始新的一轮\n };\n}\n/**\n * throttle节流 间隔delay时间后执行 保障了最后执行时机是在delay之后\n * @param { Function } func 执行函数\n * @param { Interger } time 多长时间内不能第二次执行\n * @returns function 返回经过节流处理的函数\n */\nexport function throttle2(func: Function, delay: number) {\n let timer: any = null;\n return function (this: any, ...args: any[]) {\n // let args=arguments 也可以写成这种或...args也是代表我们传过来的实参\n if (!timer) {\n timer = setTimeout(() => {\n func.apply(this, args);\n timer = null;\n }, delay);\n }\n };\n}\n// export function parseDateFormat(dateString: string) {\n// const formats = [\n// 'yyyy-mm-dd',\n// 'dd-mm-yyyy',\n// 'mm/dd/yyyy',\n// 'yyyy/mm/dd',\n// 'dd/mm/yyyy',\n// 'yyyy.mm.dd',\n// 'dd.mm.yyyy',\n// 'mm.dd.yyyy'\n// ];\n// const separatorsInDate = dateString.match(/[^\\w]/g);\n// for (let i = 0; i < formats.length; i++) {\n// const format = formats[i];\n// const separators = format.match(/[^\\w]/g);\n// let isValidFormat = true;\n// for (let j = 0; j < separators.length; j++) {\n// const part = separators[j];\n// if (part !== separatorsInDate[j]) {\n// isValidFormat = false;\n// break;\n// }\n// }\n// if (isValidFormat) {\n// return format;\n// }\n// }\n\n// return null;\n// }\n\n// export function parseDate(dateString, format) {\n// // 根据解析出的格式将 dateString 解析为日期对象\n// // 这里只是一个示例,假设解析格式为 \"yyyy-mm-dd\"\n// const parts = dateString.split('-');\n// const year = parseInt(parts[0], 10);\n// const month = parseInt(parts[1], 10) - 1;\n// const day = parseInt(parts[2], 10);\n// return new Date(year, month, day);\n// }\nexport function getTodayNearDay(dayOffset: number, format?: string) {\n const today = new Date();\n const todayTime = today.getTime();\n const oneDayTime = 24 * 60 * 60 * 1000;\n const targetTime = todayTime + dayOffset * oneDayTime;\n const date = new Date(targetTime);\n if (format) {\n const year = date.getFullYear().toString();\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n format = format.replace('yyyy', year);\n format = format.replace('mm', month);\n format = format.replace('dd', day);\n return format;\n }\n return date;\n}\n\nexport function formatDate(date: Date, format: string) {\n const year = date.getFullYear().toString();\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n\n format = format.replace('yyyy', year);\n format = format.replace('mm', month);\n format = format.replace('dd', day);\n if (format.length > 10) {\n const hour = date.getHours().toString().padStart(2, '0');\n const minute = date.getMinutes().toString().padStart(2, '0');\n const second = date.getSeconds().toString().padStart(2, '0');\n\n format = format.replace('hh', hour);\n format = format.replace('mm', minute);\n format = format.replace('ss', second);\n }\n\n return format;\n}\n\n// 修正后的 validateDate 函数\nfunction validateDate(dateParts: string[], format: string) {\n // 根据格式确定年、月、日的索引\n const yearIndex = format.indexOf('yyyy');\n const monthIndex = format.indexOf('mm');\n const dayIndex = format.indexOf('dd');\n const dateYearIndex = yearIndex < monthIndex ? (yearIndex < dayIndex ? 0 : 1) : monthIndex < dayIndex ? 1 : 2;\n const dateMonthIndex = monthIndex < yearIndex ? (monthIndex < dayIndex ? 0 : 1) : monthIndex < dayIndex ? 1 : 2;\n const dateDayIndex = dayIndex < yearIndex ? (dayIndex < monthIndex ? 0 : 1) : dayIndex < monthIndex ? 1 : 2;\n // 解析年、月、日\n const year = parseInt(dateParts[dateYearIndex], 10);\n const month = parseInt(dateParts[dateMonthIndex], 10) - 1; // 月份从0开始\n const day = parseInt(dateParts[dateDayIndex], 10);\n\n // 检查年份是否有效\n if (isNaN(year) || year < 1) {\n return false;\n }\n\n // 检查月份是否有效\n if (isNaN(month) || month < 0 || month > 11) {\n return false;\n }\n\n // 检查日期是否有效\n // 每个月的天数不同,需要考虑闰年\n const daysInMonth = [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n if (isNaN(day) || day < 1 || day > daysInMonth[month]) {\n return false;\n }\n\n return true;\n}\n// 修正后的 validateDate 函数\nfunction validateTime(dateParts: string[], format: string) {\n // 如果格式包含时分秒,则进一步解析和验证\n if (format.includes('hh') || format.includes('mm') || format.includes('ss')) {\n const timeIndex = format.indexOf('hh') > -1 ? format.indexOf('hh') : format.indexOf('HH');\n const hour = parseInt(dateParts[timeIndex], 10);\n const minute = parseInt(dateParts[timeIndex + 1], 10);\n const second = dateParts.length > timeIndex + 2 ? parseInt(dateParts[timeIndex + 2], 10) : 0;\n\n if (isNaN(hour) || hour < 0 || hour > 23) {\n return false;\n }\n\n if (isNaN(minute) || minute < 0 || minute > 59) {\n return false;\n }\n\n if (isNaN(second) || second < 0 || second > 59) {\n return false;\n }\n }\n\n return true;\n}\n// 辅助函数,用于判断是否为闰年\nfunction isLeapYear(year: number) {\n // 能被4整除且不能被100整除,或者能被400整除的年份是闰年\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n// // 修正后的 parseDateFormat 函数\n// export function parseDateFormat(dateString: string) {\n// const formats = [\n// 'yyyy-mm-dd',\n// 'dd-mm-yyyy',\n// 'mm/dd/yyyy',\n// 'yyyy/mm/dd',\n// 'dd/mm/yyyy',\n// 'yyyy.mm.dd',\n// 'mm.dd.yyyy',\n// 'dd.mm.yyyy'\n// ];\n// dateString = dateString.replace(/\\s+/g, ''); // 移除空格\n// for (let i = 0; i < formats.length; i++) {\n// const format = formats[i];\n// const dateParts = dateString.split(getSeparator(format));\n// const isValid = validateDate(dateParts, format);\n// if (dateParts.length === 3 && isValid) {\n// return format;\n// }\n// }\n// return null;\n// }\n\n// 修正后的 parseDateFormat 函数\nexport function parseDateFormat(dateString: string) {\n const formats = [\n 'yyyy-mm-dd',\n 'dd-mm-yyyy',\n 'mm/dd/yyyy',\n 'yyyy/mm/dd',\n 'dd/mm/yyyy',\n 'yyyy.mm.dd',\n 'mm.dd.yyyy',\n 'dd.mm.yyyy'\n ];\n const timeFormat = ['hh:mm:ss', 'hh:mm'];\n dateString = dateString.trim(); // 移除空格\n const dates = dateString.split(' ');\n const date = dates[0];\n const time = dates[1];\n let dateFormatMatched;\n let timeFormatMatched;\n if (date) {\n for (let i = 0; i < formats.length; i++) {\n const format = formats[i];\n const dateParts = date.split(getSeparator(format));\n const isValid = validateDate(dateParts, format);\n if (dateParts.length === 3 && isValid) {\n dateFormatMatched = format;\n break;\n }\n }\n }\n if (dateFormatMatched) {\n if (time) {\n for (let i = 0; i < timeFormat.length; i++) {\n const format = timeFormat[i];\n const timeParts = time.split(getSeparator(format));\n const formatParts = format.split(getSeparator(format));\n const isValid = validateTime(timeParts, format);\n if (isValid && timeParts.length === formatParts.length) {\n timeFormatMatched = format;\n break;\n }\n }\n }\n }\n if (date && time && dateFormatMatched && timeFormatMatched) {\n return dateFormatMatched + ' ' + timeFormatMatched;\n }\n if (date && !time) {\n return dateFormatMatched;\n }\n return 'yyyy-mm-dd hh:mm:ss';\n}\n\n// 根据日期格式获取分隔符正则表达式\nfunction getSeparator(format: string) {\n // 找到日期格式中的分隔符\n const separators = format.match(/[^\\w]/g);\n if (separators) {\n // 转义分隔符,以确保正则表达式正确处理特殊字符\n const escapedSeparators = separators.map(s => '\\\\' + s).join('|');\n return new RegExp(escapedSeparators, 'g');\n }\n return /[^\\w]/;\n}\n\nexport function parseStringTemplate(template: string, data: any) {\n const result = template.replace(/\\{([^}]+)\\}/g, (match, key) => {\n const keys = key.split('.');\n let value = data;\n\n for (const k of keys) {\n if (value.hasOwnProperty(k)) {\n value = value[k];\n } else {\n value = match; // 如果找不到对应的字段值,保持原样\n break;\n }\n }\n\n return value;\n });\n return result;\n}\n\nexport function toBoxArray<T>(obj: T | T[]): [T, T, T, T] {\n if (!Array.isArray(obj)) {\n return [obj /*top*/, obj /*right*/, obj /*bottom*/, obj /*left*/];\n }\n if (obj.length === 3) {\n return [obj[0] /*top*/, obj[1] /*right*/, obj[2] /*bottom*/, obj[1] /*left*/];\n }\n if (obj.length === 2) {\n return [obj[0] /*top*/, obj[1] /*right*/, obj[0] /*bottom*/, obj[1] /*left*/];\n }\n if (obj.length === 1) {\n return [obj[0] /*top*/, obj[0] /*right*/, obj[0] /*bottom*/, obj[0] /*left*/];\n }\n // return obj as [T, T, T, T];//原先这种返回方式,会造成修改引用问题\n return [obj[0] /*top*/, obj[1] /*right*/, obj[2] /*bottom*/, obj[3] /*left*/];\n}\n\nexport function getWeekNumber(currentDate: Date) {\n // Calculate the week number within the year\n const startOfYear = new Date(currentDate.getFullYear(), 0, 1);\n // 以下代码的第一个 +1 是为了处理currentDate正好是一周当中的第一天0点0分0秒的情况 ;第2个 +1 是天索引从0开始的缘故\n const weekNumber = Math.ceil(((currentDate.getTime() + 1 - startOfYear.getTime()) / 86400000 + 1) / 7);\n return weekNumber;\n}\n\nexport function getWeekday(dateString: string | Date, format: 'long' | 'short' = 'long') {\n const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n const date = new Date(dateString);\n\n if (format === 'short') {\n return days[date.getDay()].substr(0, 3);\n } else if (format === 'long') {\n return days[date.getDay()];\n }\n return 'Invalid format specified. Please use \"short\" or \"long\".';\n}\n/** 判断对象的属性是否可写 */\nexport function isPropertyWritable(obj: any, prop: string | number) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (!descriptor) {\n // 属性不存在\n return false;\n }\n\n // 检查是否有 setter 方法或 writable 属性为 true\n return !!descriptor.set || descriptor.writable === true;\n}\n\n/** 创建日期 */\nexport function createDateAtMidnight(dateStr?: string | number | Date, forceMidnight: boolean = false): Date {\n let date;\n if (dateStr) {\n date = new Date(dateStr);\n if (typeof dateStr === 'string') {\n if (dateStr.length > 10) {\n if (forceMidnight) {\n date.setHours(0, 0, 0, 0);\n }\n // 如果 dateStr 是字符串类型且包含时分秒,不需要设置为午夜\n return date;\n }\n date.setHours(0, 0, 0, 0);\n }\n } else {\n date = new Date();\n }\n if (forceMidnight) {\n date.setHours(0, 0, 0, 0);\n }\n return date;\n}\nexport function createDateAtLastMinute(dateStr?: string | number | Date, forceSetMinute: boolean = false): Date {\n let date;\n if (dateStr) {\n date = new Date(dateStr);\n if (typeof dateStr === 'string') {\n if (dateStr.length > 10) {\n if (forceSetMinute) {\n date.setMinutes(59, 59, 999);\n }\n // 如果 dateStr 是字符串类型且包含时分秒,不需要设置为午夜\n return date;\n }\n date.setMinutes(59, 59, 999);\n }\n } else {\n date = new Date();\n }\n if (forceSetMinute) {\n date.setMinutes(59, 59, 999);\n }\n return date;\n}\n\nexport function createDateAtLastSecond(dateStr?: string | number | Date, forceSetSecond: boolean = false): Date {\n let date;\n if (dateStr) {\n date = new Date(dateStr);\n if (typeof dateStr === 'string') {\n if (dateStr.length > 10) {\n if (forceSetSecond) {\n date.setSeconds(59, 999);\n }\n // 如果 dateStr 是字符串类型且包含时分秒,不需要设置为午夜\n return date;\n }\n date.setSeconds(59, 999);\n }\n } else {\n date = new Date();\n }\n if (forceSetSecond) {\n date.setSeconds(59, 999);\n }\n return date;\n}\n\nexport function createDateAtLastMillisecond(\n dateStr?: string | number | Date,\n forceSetMillisecond: boolean = false\n): Date {\n let date;\n if (dateStr) {\n date = new Date(dateStr);\n if (typeof dateStr === 'string') {\n if (dateStr.length > 10) {\n if (forceSetMillisecond) {\n date.setMilliseconds(999);\n }\n // 如果 dateStr 是字符串类型且包含时分秒,不需要设置为午夜\n return date;\n }\n date.setMilliseconds(999);\n }\n } else {\n date = new Date();\n }\n if (forceSetMillisecond) {\n date.setMilliseconds(999);\n }\n return date;\n}\n/** 创建日期 */\nexport function createDateAtLastHour(dateStr?: string | number | Date, forceLastHour: boolean = false): Date {\n let date;\n if (dateStr) {\n date = new Date(dateStr);\n if (typeof dateStr === 'string') {\n if (dateStr.length > 10) {\n if (forceLastHour) {\n date.setHours(23, 59, 59, 999);\n }\n // 如果 dateStr 是字符串类型且包含时分秒,不需要设置为午夜\n return date;\n }\n date.setHours(23, 59, 59, 999);\n }\n } else {\n date = new Date();\n }\n if (forceLastHour) {\n date.setHours(23, 59, 59, 999);\n }\n return date;\n}\n\nexport function getEndDateByTimeUnit(\n startDate: Date,\n date: Date,\n timeScale: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second',\n step: number\n) {\n let endDate = new Date(date);\n\n switch (timeScale) {\n case 'second':\n endDate.setMilliseconds(999);\n break;\n case 'minute':\n endDate.setSeconds(59, 999);\n break;\n case 'hour':\n endDate.setMinutes(59, 59, 999);\n break;\n case 'day':\n endDate.setHours(23, 59, 59, 999);\n break;\n case 'week':\n const day = endDate.getDay();\n const diffToEndOfWeek = 6 - day;\n endDate.setDate(endDate.getDate() + diffToEndOfWeek);\n endDate.setHours(23, 59, 59, 999);\n break;\n case 'month':\n const lastDayOfMonth = new Date(endDate.getFullYear(), endDate.getMonth() + 1, 0).getDate();\n endDate.setDate(lastDayOfMonth);\n endDate.setHours(23, 59, 59, 999);\n break;\n case 'quarter':\n const currentMonth = endDate.getMonth();\n const endMonthOfQuarter = currentMonth - (currentMonth % 3) + 2;\n const lastDayOfQuarter = new Date(endDate.getFullYear(), endMonthOfQuarter + 1, 0).getDate();\n endDate.setMonth(endMonthOfQuarter, lastDayOfQuarter);\n endDate.setHours(23, 59, 59, 999);\n break;\n case 'year':\n endDate.setMonth(11, 31);\n endDate.setHours(23, 59, 59, 999);\n break;\n default:\n throw new Error('Invalid time scale');\n }\n\n const count = computeCountToTimeScale(endDate, startDate, timeScale, step, 1);\n const targetCount = Math.ceil(count);\n if (targetCount > count) {\n const dif = (targetCount - count) * step;\n const msInSecond = 1000;\n const msInMinute = msInSecond * 60;\n const msInHour = msInMinute * 60;\n const msInDay = msInHour * 24;\n const msInWeek = msInDay * 7;\n const adjusted_date = new Date(endDate.getTime() + 1);\n switch (timeScale) {\n case 'second':\n endDate.setTime(endDate.getTime() + dif * msInSecond);\n break;\n case 'minute':\n endDate.setTime(endDate.getTime() + dif * msInMinute);\n break;\n case 'hour':\n endDate.setTime(endDate.getTime() + dif * msInHour);\n break;\n case 'day':\n endDate.setTime(endDate.getTime() + dif * msInDay);\n break;\n case 'week':\n endDate.setTime(endDate.getTime() + dif * msInWeek);\n break;\n case 'month':\n endDate = new Date(endDate.getFullYear(), endDate.getMonth() + 1 + Math.round(dif), 0);\n // endDate.setTime(lastDayOfMonth);\n endDate.setHours(23, 59, 59, 999);\n break;\n case 'quarter':\n const currentMonth = endDate.getMonth();\n const endMonthOfQuarter = currentMonth - (currentMonth % 3) + 2;\n endDate = new Date(endDate.getFullYear(), endMonthOfQuarter + Math.round(dif * 3) + 1, 0);\n endDate.setHours(23, 59, 59, 999);\n break;\n case 'year':\n endDate.setFullYear(endDate.getFullYear() + Math.floor(dif));\n endDate.setHours(23, 59, 59, 999);\n break;\n default:\n throw new Error('Invalid time scale');\n }\n }\n\n return endDate;\n}\n\n// export function getEndDateByTimeUnit(\n// startDate: Date,\n// date: Date,\n// timeScale: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second',\n// step: number\n// ): Date {\n// const count = computeCountToTimeScale(date, startDate, timeScale, step);\n// const targetCount = Math.ceil(count);\n// debugger;\n// const endDate = new Date(startDate);\n\n// switch (timeScale) {\n// case 'second':\n// endDate.setSeconds(endDate.getSeconds() + targetCount * step);\n// endDate.setMilliseconds(999);\n// break;\n// case 'minute':\n// endDate.setMinutes(endDate.getMinutes() + targetCount * step);\n// endDate.setSeconds(59, 999);\n// break;\n// case 'hour':\n// endDate.setHours(endDate.getHours() + targetCount * step);\n// endDate.setMinutes(59, 59, 999);\n// break;\n// case 'day':\n// endDate.setDate(endDate.getDate() + targetCount * step);\n// endDate.setHours(23, 59, 59, 999);\n// break;\n// case 'week':\n// endDate.setDate(endDate.getDate() + targetCount * step * 7);\n// endDate.setHours(23, 59, 59, 999);\n// break;\n// case 'month':\n// endDate.setMonth(endDate.getMonth() + targetCount * step);\n// const lastDayOfMonth = new Date(endDate.getFullYear(), endDate.getMonth() + 1, 0).getDate();\n// endDate.setDate(lastDayOfMonth);\n// endDate.setHours(23, 59, 59, 999);\n// break;\n// case 'quarter':\n// endDate.setMonth(endDate.getMonth() + targetCount * step * 3);\n// const lastDayOfQuarter = new Date(endDate.getFullYear(), endDate.getMonth() + 1, 0).getDate();\n// endDate.setDate(lastDayOfQuarter);\n// endDate.setHours(23, 59, 59, 999);\n// break;\n// case 'year':\n// endDate.setFullYear(endDate.getFullYear() + targetCount * step);\n// endDate.setMonth(11, 31);\n// endDate.setHours(23, 59, 59, 999);\n// break;\n// default:\n// throw new Error('Invalid time scale');\n// }\n\n// return endDate;\n// }\n\nexport function getStartDateByTimeUnit(\n date: Date,\n timeScale: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second',\n startOfWeekSetting = 'monday'\n): Date {\n const startDate = new Date(date);\n\n switch (timeScale) {\n case 'second':\n startDate.setMilliseconds(0);\n break;\n case 'minute':\n startDate.setSeconds(0, 0);\n break;\n case 'hour':\n startDate.setMinutes(0, 0, 0);\n break;\n case 'day':\n startDate.setHours(0, 0, 0, 0);\n break;\n case 'week':\n const day = startDate.getDay();\n let diffToStartOfWeek = day;\n if (startOfWeekSetting === 'monday') {\n diffToStartOfWeek = day === 0 ? -6 : 1 - day; // Adjusting for Sunday as the start of the week\n } else {\n diffToStartOfWeek = -day;\n }\n\n startDate.setDate(startDate.getDate() + diffToStartOfWeek);\n startDate.setHours(0, 0, 0, 0);\n break;\n case 'month':\n startDate.setDate(1);\n startDate.setHours(0, 0, 0, 0);\n break;\n case 'quarter':\n const currentMonth = startDate.getMonth();\n const startMonthOfQuarter = currentMonth - (currentMonth % 3);\n startDate.setMonth(startMonthOfQuarter, 1);\n startDate.setHours(0, 0, 0, 0);\n break;\n case 'year':\n startDate.setMonth(0, 1);\n startDate.setHours(0, 0, 0, 0);\n break;\n default:\n throw new Error('Invalid time scale');\n }\n\n return startDate;\n}\n\nexport function computeCountToTimeScale(\n date: Date,\n startDate: Date,\n timeScale: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second',\n step: number,\n diffMS: number = 0\n): number {\n const msInSecond = 1000;\n const msInMinute = msInSecond * 60;\n const msInHour = msInMinute * 60;\n const msInDay = msInHour * 24;\n const msInWeek = msInDay * 7;\n\n let difference: number;\n const adjusted_date = new Date(date.getTime() + diffMS);\n switch (timeScale) {\n case 'second':\n difference = (adjusted_date.getTime() - startDate.getTime()) / msInSecond;\n break;\n case 'minute':\n difference = (adjusted_date.getTime() - startDate.getTime()) / msInMinute;\n break;\n case 'hour':\n difference = (adjusted_date.getTime() - startDate.getTime()) / msInHour;\n break;\n case 'day':\n difference = (adjusted_date.getTime() - startDate.getTime()) / msInDay;\n break;\n case 'week':\n difference = (adjusted_date.getTime() - startDate.getTime()) / msInWeek;\n break;\n case 'month':\n difference =\n (adjusted_date.getFullYear() - startDate.getFullYear()) * 12 +\n (adjusted_date.getMonth() - startDate.getMonth());\n difference +=\n (adjusted_date.getDate() - startDate.getDate()) /\n new Date(adjusted_date.getFullYear(), adjusted_date.getMonth() + 1, 0).getDate();\n break;\n case 'quarter':\n difference =\n (adjusted_date.getFullYear() - startDate.getFullYear()) * 4 +\n (adjusted_date.getMonth() - startDate.getMonth()) / 3;\n difference +=\n (adjusted_date.getDate() - startDate.getDate()) /\n (3 * new Date(adjusted_date.getFullYear(), adjusted_date.getMonth() + 1, 0).getDate());\n break;\n case 'year':\n difference = adjusted_date.getFullYear() - startDate.getFullYear();\n difference += (adjusted_date.getMonth() - startDate.getMonth()) / 12;\n break;\n default:\n throw new Error('Invalid time scale');\n }\n\n return difference / step;\n}\n\n/** 暂时没有用上 函数为了解析日期的余数 */\nexport function parseDateToTimeUnit(\n date: Date,\n timeUnit: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second'\n): number {\n const millisecondsInSecond = 1000;\n const secondsInMinute = 60;\n const minutesInHour = 60;\n const hoursInDay = 24;\n const daysInWeek = 7;\n const monthsInYear = 12;\n const quartersInYear = 4;\n\n const millisecondsInMinute = millisecondsInSecond * secondsInMinute;\n const millisecondsInHour = millisecondsInMinute * minutesInHour;\n const millisecondsInDay = millisecondsInHour * hoursInDay;\n const millisecondsInWeek = millisecondsInDay * daysInWeek;\n const millisecondsInMonth = millisecondsInDay * (365.25 / monthsInYear); // 近似值\n const millisecondsInQuarter = millisecondsInMonth * (monthsInYear / quartersInYear); // 近似值\n const millisecondsInYear = millisecondsInDay * 365.25; // 近似值\n const daysInMonth = new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n switch (timeUnit) {\n case 'second':\n return date.getMilliseconds() / millisecondsInSecond;\n case 'minute':\n return (date.getSeconds() + date.getMilliseconds() / millisecondsInSecond) / secondsInMinute;\n case 'hour':\n return (\n (date.getMinutes() * secondsInMinute + date.getSeconds() + date.getMilliseconds() / millisecondsInSecond) /\n (minutesInHour * secondsInMinute)\n );\n case 'day':\n return (\n (date.getHours() * minutesInHour * secondsInMinute +\n date.getMinutes() * secondsInMinute +\n date.getSeconds() +\n date.getMilliseconds() / millisecondsInSecond) /\n (hoursInDay * minutesInHour * secondsInMinute)\n );\n case 'week':\n return (\n (date.getDay() * hoursInDay * minutesInHour * secondsInMinute +\n date.getHours() * minutesInHour * secondsInMinute +\n date.getMinutes() * secondsInMinute +\n date.getSeconds() +\n date.getMilliseconds() / millisecondsInSecond) /\n (daysInWeek * hoursInDay * minutesInHour * secondsInMinute)\n );\n case 'month':\n return (\n ((date.getDate() - 1) * hoursInDay * minutesInHour * secondsInMinute +\n date.getHours() * minutesInHour * secondsInMinute +\n date.getMinutes() * secondsInMinute +\n date.getSeconds() +\n date.getMilliseconds() / millisecondsInSecond) /\n (daysInMonth * hoursInDay * minutesInHour * secondsInMinute)\n );\n case 'quarter':\n const monthInQuarter = date.getMonth() % 3;\n const daysInQuarter = new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate() * 3;\n return (\n ((monthInQuarter * daysInMonth + date.getDate() - 1) * hoursInDay * minutesInHour * secondsInMinute +\n date.getHours() * minutesInHour * secondsInMinute +\n date.getMinutes() * secondsInMinute +\n date.getSeconds() +\n date.getMilliseconds() / millisecondsInSecond) /\n (daysInQuarter * hoursInDay * minutesInHour * secondsInMinute)\n );\n case 'year':\n const daysInYear = isLeapYear(date.getFullYear()) ? 366 : 365;\n return (\n ((date.getMonth() * daysInMonth + date.getDate() - 1) * hoursInDay * minutesInHour * secondsInMinute +\n date.getHours() * minutesInHour * secondsInMinute +\n date.getMinutes() * secondsInMinute +\n date.getSeconds() +\n date.getMilliseconds() / millisecondsInSecond) /\n (daysInYear * hoursInDay * minutesInHour * secondsInMinute)\n );\n default:\n throw new Error('Invalid time unit');\n }\n}\n\n// // 示例用法\n// const date = new Date('2024-07-04T17:20:30');\n// const timeUnit = 'hour';\n// const result = parseDateToTimeUnit(date, timeUnit);\n// console.log(result); // 输出相对于小时的时间差值\n"]}
1
+ {"version":3,"sources":["../src/tools/util.ts"],"names":[],"mappings":"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","file":"util.js","sourcesContent":["import { isValid } from '@visactor/vutils';\nimport { DayTimes } from '../gantt-helper';\n\n/**\n * throttle 保障了首次立即执行 后续触发的回调执行间隔delay时间 区别于throttle2 最后执行时机会提前\n * @param { Function } func 执行函数\n * @param { Interger } time 多长时间内不能第二次执行\n * @returns function 返回经过节流处理的函数\n */\nexport function throttle(func: Function, delay: number) {\n let timer: any = null;\n return function (this: any, ...args: any[]) {\n // let args=arguments 也可以写成这种或...args也是代表我们传过来的实参\n if (!timer) {\n func.apply(this, args); //先执行函数,保证第一次立即执行\n timer = setTimeout(() => {\n timer = null;\n }, delay);\n }\n // console.log('throttle');\n // 当我们第一次触发事件,定时器不存在时就执行函数,当我们再次点击时,因为定时器存在,\n // 所以无法再进入函数调用(无论事件如何执行),那么只能等定时器事件结束,\n // 我们让timer=null,回到第一次的状态,就又重新开始新的一轮\n };\n}\n/**\n * throttle节流 间隔delay时间后执行 保障了最后执行时机是在delay之后\n * @param { Function } func 执行函数\n * @param { Interger } time 多长时间内不能第二次执行\n * @returns function 返回经过节流处理的函数\n */\nexport function throttle2(func: Function, delay: number) {\n let timer: any = null;\n return function (this: any, ...args: any[]) {\n // let args=arguments 也可以写成这种或...args也是代表我们传过来的实参\n if (!timer) {\n timer = setTimeout(() => {\n func.apply(this, args);\n timer = null;\n }, delay);\n }\n };\n}\n// export function parseDateFormat(dateString: string) {\n// const formats = [\n// 'yyyy-mm-dd',\n// 'dd-mm-yyyy',\n// 'mm/dd/yyyy',\n// 'yyyy/mm/dd',\n// 'dd/mm/yyyy',\n// 'yyyy.mm.dd',\n// 'dd.mm.yyyy',\n// 'mm.dd.yyyy'\n// ];\n// const separatorsInDate = dateString.match(/[^\\w]/g);\n// for (let i = 0; i < formats.length; i++) {\n// const format = formats[i];\n// const separators = format.match(/[^\\w]/g);\n// let isValidFormat = true;\n// for (let j = 0; j < separators.length; j++) {\n// const part = separators[j];\n// if (part !== separatorsInDate[j]) {\n// isValidFormat = false;\n// break;\n// }\n// }\n// if (isValidFormat) {\n// return format;\n// }\n// }\n\n// return null;\n// }\n\n// export function parseDate(dateString, format) {\n// // 根据解析出的格式将 dateString 解析为日期对象\n// // 这里只是一个示例,假设解析格式为 \"yyyy-mm-dd\"\n// const parts = dateString.split('-');\n// const year = parseInt(parts[0], 10);\n// const month = parseInt(parts[1], 10) - 1;\n// const day = parseInt(parts[2], 10);\n// return new Date(year, month, day);\n// }\nexport function getTodayNearDay(dayOffset: number, format?: string) {\n const today = new Date();\n const todayTime = today.getTime();\n const oneDayTime = 24 * 60 * 60 * 1000;\n const targetTime = todayTime + dayOffset * oneDayTime;\n const date = new Date(targetTime);\n if (format) {\n const year = date.getFullYear().toString();\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n format = format.replace('yyyy', year);\n format = format.replace('mm', month);\n format = format.replace('dd', day);\n return format;\n }\n return date;\n}\n\nexport function formatDate(date: Date, format: string) {\n const year = date.getFullYear().toString();\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n\n format = format.replace('yyyy', year);\n format = format.replace('mm', month);\n format = format.replace('dd', day);\n if (format.length > 10) {\n const hour = date.getHours().toString().padStart(2, '0');\n const minute = date.getMinutes().toString().padStart(2, '0');\n const second = date.getSeconds().toString().padStart(2, '0');\n\n format = format.replace('hh', hour);\n format = format.replace('mm', minute);\n format = format.replace('ss', second);\n }\n\n return format;\n}\n\n// 修正后的 validateDate 函数\nfunction validateDate(dateParts: string[], format: string) {\n // 根据格式确定年、月、日的索引\n const yearIndex = format.indexOf('yyyy');\n const monthIndex = format.indexOf('mm');\n const dayIndex = format.indexOf('dd');\n const dateYearIndex = yearIndex < monthIndex ? (yearIndex < dayIndex ? 0 : 1) : monthIndex < dayIndex ? 1 : 2;\n const dateMonthIndex = monthIndex < yearIndex ? (monthIndex < dayIndex ? 0 : 1) : monthIndex < dayIndex ? 1 : 2;\n const dateDayIndex = dayIndex < yearIndex ? (dayIndex < monthIndex ? 0 : 1) : dayIndex < monthIndex ? 1 : 2;\n // 解析年、月、日\n const year = parseInt(dateParts[dateYearIndex], 10);\n const month = parseInt(dateParts[dateMonthIndex], 10) - 1; // 月份从0开始\n const day = parseInt(dateParts[dateDayIndex], 10);\n\n // 检查年份是否有效\n if (isNaN(year) || year < 1) {\n return false;\n }\n\n // 检查月份是否有效\n if (isNaN(month) || month < 0 || month > 11) {\n return false;\n }\n\n // 检查日期是否有效\n // 每个月的天数不同,需要考虑闰年\n const daysInMonth = [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n if (isNaN(day) || day < 1 || day > daysInMonth[month]) {\n return false;\n }\n\n return true;\n}\n// 修正后的 validateDate 函数\nfunction validateTime(dateParts: string[], format: string) {\n // 如果格式包含时分秒,则进一步解析和验证\n if (format.includes('hh') || format.includes('mm') || format.includes('ss')) {\n const timeIndex = format.indexOf('hh') > -1 ? format.indexOf('hh') : format.indexOf('HH');\n const hour = parseInt(dateParts[timeIndex], 10);\n const minute = parseInt(dateParts[timeIndex + 1], 10);\n const second = dateParts.length > timeIndex + 2 ? parseInt(dateParts[timeIndex + 2], 10) : 0;\n\n if (isNaN(hour) || hour < 0 || hour > 23) {\n return false;\n }\n\n if (isNaN(minute) || minute < 0 || minute > 59) {\n return false;\n }\n\n if (isNaN(second) || second < 0 || second > 59) {\n return false;\n }\n }\n\n return true;\n}\n// 辅助函数,用于判断是否为闰年\nfunction isLeapYear(year: number) {\n // 能被4整除且不能被100整除,或者能被400整除的年份是闰年\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n// // 修正后的 parseDateFormat 函数\n// export function parseDateFormat(dateString: string) {\n// const formats = [\n// 'yyyy-mm-dd',\n// 'dd-mm-yyyy',\n// 'mm/dd/yyyy',\n// 'yyyy/mm/dd',\n// 'dd/mm/yyyy',\n// 'yyyy.mm.dd',\n// 'mm.dd.yyyy',\n// 'dd.mm.yyyy'\n// ];\n// dateString = dateString.replace(/\\s+/g, ''); // 移除空格\n// for (let i = 0; i < formats.length; i++) {\n// const format = formats[i];\n// const dateParts = dateString.split(getSeparator(format));\n// const isValid = validateDate(dateParts, format);\n// if (dateParts.length === 3 && isValid) {\n// return format;\n// }\n// }\n// return null;\n// }\n\n// 修正后的 parseDateFormat 函数\nexport function parseDateFormat(dateString: string) {\n const formats = [\n 'yyyy-mm-dd',\n 'dd-mm-yyyy',\n 'mm/dd/yyyy',\n 'yyyy/mm/dd',\n 'dd/mm/yyyy',\n 'yyyy.mm.dd',\n 'mm.dd.yyyy',\n 'dd.mm.yyyy'\n ];\n const timeFormat = ['hh:mm:ss', 'hh:mm'];\n dateString = dateString.trim(); // 移除空格\n const dates = dateString.split(' ');\n const date = dates[0];\n const time = dates[1];\n let dateFormatMatched;\n let timeFormatMatched;\n if (date) {\n for (let i = 0; i < formats.length; i++) {\n const format = formats[i];\n const dateParts = date.split(getSeparator(format));\n const isValid = validateDate(dateParts, format);\n if (dateParts.length === 3 && isValid) {\n dateFormatMatched = format;\n break;\n }\n }\n }\n if (dateFormatMatched) {\n if (time) {\n for (let i = 0; i < timeFormat.length; i++) {\n const format = timeFormat[i];\n const timeParts = time.split(getSeparator(format));\n const formatParts = format.split(getSeparator(format));\n const isValid = validateTime(timeParts, format);\n if (isValid && timeParts.length === formatParts.length) {\n timeFormatMatched = format;\n break;\n }\n }\n }\n }\n if (date && time && dateFormatMatched && timeFormatMatched) {\n return dateFormatMatched + ' ' + timeFormatMatched;\n }\n if (date && !time) {\n return dateFormatMatched;\n }\n return 'yyyy-mm-dd hh:mm:ss';\n}\n\n// 根据日期格式获取分隔符正则表达式\nfunction getSeparator(format: string) {\n // 找到日期格式中的分隔符\n const separators = format.match(/[^\\w]/g);\n if (separators) {\n // 转义分隔符,以确保正则表达式正确处理特殊字符\n const escapedSeparators = separators.map(s => '\\\\' + s).join('|');\n return new RegExp(escapedSeparators, 'g');\n }\n return /[^\\w]/;\n}\n\nexport function parseStringTemplate(template: string, data: any) {\n const result = template.replace(/\\{([^}]+)\\}/g, (match, key) => {\n const keys = key.split('.');\n let value = data;\n\n for (const k of keys) {\n if (value.hasOwnProperty(k)) {\n value = value[k];\n } else {\n value = match; // 如果找不到对应的字段值,保持原样\n break;\n }\n }\n\n return value;\n });\n return result;\n}\n\nexport function toBoxArray<T>(obj: T | T[]): [T, T, T, T] {\n if (!Array.isArray(obj)) {\n return [obj /*top*/, obj /*right*/, obj /*bottom*/, obj /*left*/];\n }\n if (obj.length === 3) {\n return [obj[0] /*top*/, obj[1] /*right*/, obj[2] /*bottom*/, obj[1] /*left*/];\n }\n if (obj.length === 2) {\n return [obj[0] /*top*/, obj[1] /*right*/, obj[0] /*bottom*/, obj[1] /*left*/];\n }\n if (obj.length === 1) {\n return [obj[0] /*top*/, obj[0] /*right*/, obj[0] /*bottom*/, obj[0] /*left*/];\n }\n // return obj as [T, T, T, T];//原先这种返回方式,会造成修改引用问题\n return [obj[0] /*top*/, obj[1] /*right*/, obj[2] /*bottom*/, obj[3] /*left*/];\n}\n\nexport function getWeekNumber(currentDate: Date) {\n // Calculate the week number within the year\n const startOfYear = new Date(currentDate.getFullYear(), 0, 1);\n // 以下代码的第一个 +1 是为了处理currentDate正好是一周当中的第一天0点0分0秒的情况 ;第2个 +1 是天索引从0开始的缘故\n const weekNumber = Math.ceil(((currentDate.getTime() + 1 - startOfYear.getTime()) / 86400000 + 1) / 7);\n return weekNumber;\n}\n\nexport function getWeekday(dateString: string | Date, format: 'long' | 'short' = 'long') {\n const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n const date = new Date(dateString);\n\n if (format === 'short') {\n return days[date.getDay()].substr(0, 3);\n } else if (format === 'long') {\n return days[date.getDay()];\n }\n return 'Invalid format specified. Please use \"short\" or \"long\".';\n}\n/** 判断对象的属性是否可写 */\nexport function isPropertyWritable(obj: any, prop: string | number) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (!descriptor) {\n // 属性不存在\n return false;\n }\n\n // 检查是否有 setter 方法或 writable 属性为 true\n return !!descriptor.set || descriptor.writable === true;\n}\n\n/** 创建日期 */\nexport function createDateAtMidnight(dateStr?: string | number | Date, forceMidnight: boolean = false): Date {\n let date;\n if (dateStr) {\n date = new Date(dateStr);\n if (typeof dateStr === 'string') {\n if (dateStr.length > 10) {\n if (forceMidnight) {\n date.setHours(0, 0, 0, 0);\n }\n // 如果 dateStr 是字符串类型且包含时分秒,不需要设置为午夜\n return date;\n }\n date.setHours(0, 0, 0, 0);\n }\n } else {\n date = new Date();\n }\n if (forceMidnight) {\n date.setHours(0, 0, 0, 0);\n }\n return date;\n}\nexport function createDateAtLastMinute(dateStr?: string | number | Date, forceSetMinute: boolean = false): Date {\n let date;\n if (dateStr) {\n date = new Date(dateStr);\n if (typeof dateStr === 'string') {\n if (dateStr.length > 10) {\n if (forceSetMinute) {\n date.setMinutes(59, 59, 999);\n }\n // 如果 dateStr 是字符串类型且包含时分秒,不需要设置为午夜\n return date;\n }\n date.setMinutes(59, 59, 999);\n }\n } else {\n date = new Date();\n }\n if (forceSetMinute) {\n date.setMinutes(59, 59, 999);\n }\n return date;\n}\n\nexport function createDateAtLastSecond(dateStr?: string | number | Date, forceSetSecond: boolean = false): Date {\n let date;\n if (dateStr) {\n date = new Date(dateStr);\n if (typeof dateStr === 'string') {\n if (dateStr.length > 10) {\n if (forceSetSecond) {\n date.setSeconds(59, 999);\n }\n // 如果 dateStr 是字符串类型且包含时分秒,不需要设置为午夜\n return date;\n }\n date.setSeconds(59, 999);\n }\n } else {\n date = new Date();\n }\n if (forceSetSecond) {\n date.setSeconds(59, 999);\n }\n return date;\n}\n\nexport function createDateAtLastMillisecond(\n dateStr?: string | number | Date,\n forceSetMillisecond: boolean = false\n): Date {\n let date;\n if (dateStr) {\n date = new Date(dateStr);\n if (typeof dateStr === 'string') {\n if (dateStr.length > 10) {\n if (forceSetMillisecond) {\n date.setMilliseconds(999);\n }\n // 如果 dateStr 是字符串类型且包含时分秒,不需要设置为午夜\n return date;\n }\n date.setMilliseconds(999);\n }\n } else {\n date = new Date();\n }\n if (forceSetMillisecond) {\n date.setMilliseconds(999);\n }\n return date;\n}\n/** 创建日期 */\nexport function createDateAtLastHour(dateStr?: string | number | Date, forceLastHour: boolean = false): Date {\n let date;\n if (dateStr) {\n date = new Date(dateStr);\n if (typeof dateStr === 'string') {\n if (dateStr.length > 10) {\n if (forceLastHour) {\n date.setHours(23, 59, 59, 999);\n }\n // 如果 dateStr 是字符串类型且包含时分秒,不需要设置为午夜\n return date;\n }\n date.setHours(23, 59, 59, 999);\n }\n } else {\n date = new Date();\n }\n if (forceLastHour) {\n date.setHours(23, 59, 59, 999);\n }\n return date;\n}\n\nexport function getEndDateByTimeUnit(\n startDate: Date,\n date: Date,\n timeScale: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second',\n step: number\n) {\n let endDate = new Date(date);\n\n switch (timeScale) {\n case 'second':\n endDate.setMilliseconds(999);\n break;\n case 'minute':\n endDate.setSeconds(59, 999);\n break;\n case 'hour':\n endDate.setMinutes(59, 59, 999);\n break;\n case 'day':\n endDate.setHours(23, 59, 59, 999);\n break;\n case 'week':\n const day = endDate.getDay();\n const diffToEndOfWeek = 6 - day;\n endDate.setDate(endDate.getDate() + diffToEndOfWeek);\n endDate.setHours(23, 59, 59, 999);\n break;\n case 'month':\n const lastDayOfMonth = new Date(endDate.getFullYear(), endDate.getMonth() + 1, 0).getDate();\n endDate.setDate(lastDayOfMonth);\n endDate.setHours(23, 59, 59, 999);\n break;\n case 'quarter':\n const currentMonth = endDate.getMonth();\n const endMonthOfQuarter = currentMonth - (currentMonth % 3) + 2;\n const lastDayOfQuarter = new Date(endDate.getFullYear(), endMonthOfQuarter + 1, 0).getDate();\n endDate.setMonth(endMonthOfQuarter, lastDayOfQuarter);\n endDate.setHours(23, 59, 59, 999);\n break;\n case 'year':\n endDate.setMonth(11, 31);\n endDate.setHours(23, 59, 59, 999);\n break;\n default:\n throw new Error('Invalid time scale');\n }\n\n const count = computeCountToTimeScale(endDate, startDate, timeScale, step, 1);\n const targetCount = Math.ceil(count);\n if (targetCount > count) {\n const dif = (targetCount - count) * step;\n const msInSecond = 1000;\n const msInMinute = msInSecond * 60;\n const msInHour = msInMinute * 60;\n const msInDay = msInHour * 24;\n const msInWeek = msInDay * 7;\n const adjusted_date = new Date(endDate.getTime() + 1);\n switch (timeScale) {\n case 'second':\n endDate.setTime(endDate.getTime() + dif * msInSecond);\n break;\n case 'minute':\n endDate.setTime(endDate.getTime() + dif * msInMinute);\n break;\n case 'hour':\n endDate.setTime(endDate.getTime() + dif * msInHour);\n break;\n case 'day':\n endDate.setTime(endDate.getTime() + dif * msInDay);\n break;\n case 'week':\n endDate.setTime(endDate.getTime() + dif * msInWeek);\n break;\n case 'month':\n endDate = new Date(endDate.getFullYear(), endDate.getMonth() + 1 + Math.round(dif), 0);\n // endDate.setTime(lastDayOfMonth);\n endDate.setHours(23, 59, 59, 999);\n break;\n case 'quarter':\n const currentMonth = endDate.getMonth();\n const endMonthOfQuarter = currentMonth - (currentMonth % 3) + 2;\n endDate = new Date(endDate.getFullYear(), endMonthOfQuarter + Math.round(dif * 3) + 1, 0);\n endDate.setHours(23, 59, 59, 999);\n break;\n case 'year':\n endDate.setFullYear(endDate.getFullYear() + Math.floor(dif));\n endDate.setHours(23, 59, 59, 999);\n break;\n default:\n throw new Error('Invalid time scale');\n }\n }\n\n return endDate;\n}\n\n// export function getEndDateByTimeUnit(\n// startDate: Date,\n// date: Date,\n// timeScale: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second',\n// step: number\n// ): Date {\n// const count = computeCountToTimeScale(date, startDate, timeScale, step);\n// const targetCount = Math.ceil(count);\n// debugger;\n// const endDate = new Date(startDate);\n\n// switch (timeScale) {\n// case 'second':\n// endDate.setSeconds(endDate.getSeconds() + targetCount * step);\n// endDate.setMilliseconds(999);\n// break;\n// case 'minute':\n// endDate.setMinutes(endDate.getMinutes() + targetCount * step);\n// endDate.setSeconds(59, 999);\n// break;\n// case 'hour':\n// endDate.setHours(endDate.getHours() + targetCount * step);\n// endDate.setMinutes(59, 59, 999);\n// break;\n// case 'day':\n// endDate.setDate(endDate.getDate() + targetCount * step);\n// endDate.setHours(23, 59, 59, 999);\n// break;\n// case 'week':\n// endDate.setDate(endDate.getDate() + targetCount * step * 7);\n// endDate.setHours(23, 59, 59, 999);\n// break;\n// case 'month':\n// endDate.setMonth(endDate.getMonth() + targetCount * step);\n// const lastDayOfMonth = new Date(endDate.getFullYear(), endDate.getMonth() + 1, 0).getDate();\n// endDate.setDate(lastDayOfMonth);\n// endDate.setHours(23, 59, 59, 999);\n// break;\n// case 'quarter':\n// endDate.setMonth(endDate.getMonth() + targetCount * step * 3);\n// const lastDayOfQuarter = new Date(endDate.getFullYear(), endDate.getMonth() + 1, 0).getDate();\n// endDate.setDate(lastDayOfQuarter);\n// endDate.setHours(23, 59, 59, 999);\n// break;\n// case 'year':\n// endDate.setFullYear(endDate.getFullYear() + targetCount * step);\n// endDate.setMonth(11, 31);\n// endDate.setHours(23, 59, 59, 999);\n// break;\n// default:\n// throw new Error('Invalid time scale');\n// }\n\n// return endDate;\n// }\n\nexport function getStartDateByTimeUnit(\n date: Date,\n timeScale: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second',\n startOfWeekSetting = 'monday'\n): Date {\n const startDate = new Date(date);\n\n switch (timeScale) {\n case 'second':\n startDate.setMilliseconds(0);\n break;\n case 'minute':\n startDate.setSeconds(0, 0);\n break;\n case 'hour':\n startDate.setMinutes(0, 0, 0);\n break;\n case 'day':\n startDate.setHours(0, 0, 0, 0);\n break;\n case 'week':\n const day = startDate.getDay();\n let diffToStartOfWeek = day;\n if (startOfWeekSetting === 'monday') {\n diffToStartOfWeek = day === 0 ? -6 : 1 - day; // Adjusting for Sunday as the start of the week\n } else {\n diffToStartOfWeek = -day;\n }\n\n startDate.setDate(startDate.getDate() + diffToStartOfWeek);\n startDate.setHours(0, 0, 0, 0);\n break;\n case 'month':\n startDate.setDate(1);\n startDate.setHours(0, 0, 0, 0);\n break;\n case 'quarter':\n const currentMonth = startDate.getMonth();\n const startMonthOfQuarter = currentMonth - (currentMonth % 3);\n startDate.setMonth(startMonthOfQuarter, 1);\n startDate.setHours(0, 0, 0, 0);\n break;\n case 'year':\n startDate.setMonth(0, 1);\n startDate.setHours(0, 0, 0, 0);\n break;\n default:\n throw new Error('Invalid time scale');\n }\n\n return startDate;\n}\n\nexport function computeCountToTimeScale(\n date: Date,\n startDate: Date,\n timeScale: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second',\n step: number,\n diffMS: number = 0\n): number {\n const msInSecond = 1000;\n const msInMinute = msInSecond * 60;\n const msInHour = msInMinute * 60;\n const msInDay = msInHour * 24;\n const msInWeek = msInDay * 7;\n\n let difference: number;\n const adjusted_date = new Date(date.getTime() + diffMS);\n\n switch (timeScale) {\n case 'second':\n difference = (adjusted_date.getTime() - startDate.getTime()) / msInSecond;\n break;\n case 'minute':\n difference = (adjusted_date.getTime() - startDate.getTime()) / msInMinute;\n break;\n case 'hour':\n difference = (adjusted_date.getTime() - startDate.getTime()) / msInHour;\n break;\n case 'day':\n difference = (adjusted_date.getTime() - startDate.getTime()) / msInDay;\n break;\n case 'week':\n difference = (adjusted_date.getTime() - startDate.getTime()) / msInWeek;\n break;\n case 'month':\n const startDaysInMonth = new Date(startDate.getFullYear(), startDate.getMonth() + 1, 0).getDate();\n const adjustedDaysInMonth = new Date(adjusted_date.getFullYear(), adjusted_date.getMonth() + 1, 0).getDate();\n difference =\n (adjusted_date.getFullYear() - startDate.getFullYear()) * 12 +\n (adjusted_date.getMonth() - startDate.getMonth());\n\n // Calculate fractional difference by normalizing day progress within each specific month\n // This handles variable month lengths (28/29/30/31 days) correctly\n difference += adjusted_date.getDate() / adjustedDaysInMonth - startDate.getDate() / startDaysInMonth;\n break;\n case 'quarter':\n difference =\n (adjusted_date.getFullYear() - startDate.getFullYear()) * 4 +\n (adjusted_date.getMonth() - startDate.getMonth()) / 3;\n difference +=\n (adjusted_date.getDate() - startDate.getDate()) /\n (3 * new Date(adjusted_date.getFullYear(), adjusted_date.getMonth() + 1, 0).getDate());\n break;\n case 'year':\n difference = adjusted_date.getFullYear() - startDate.getFullYear();\n difference += (adjusted_date.getMonth() - startDate.getMonth()) / 12;\n break;\n default:\n throw new Error('Invalid time scale');\n }\n\n return difference / step;\n}\n\n/** 暂时没有用上 函数为了解析日期的余数 */\nexport function parseDateToTimeUnit(\n date: Date,\n timeUnit: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second'\n): number {\n const millisecondsInSecond = 1000;\n const secondsInMinute = 60;\n const minutesInHour = 60;\n const hoursInDay = 24;\n const daysInWeek = 7;\n const monthsInYear = 12;\n const quartersInYear = 4;\n\n const millisecondsInMinute = millisecondsInSecond * secondsInMinute;\n const millisecondsInHour = millisecondsInMinute * minutesInHour;\n const millisecondsInDay = millisecondsInHour * hoursInDay;\n const millisecondsInWeek = millisecondsInDay * daysInWeek;\n const millisecondsInMonth = millisecondsInDay * (365.25 / monthsInYear); // 近似值\n const millisecondsInQuarter = millisecondsInMonth * (monthsInYear / quartersInYear); // 近似值\n const millisecondsInYear = millisecondsInDay * 365.25; // 近似值\n const daysInMonth = new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n switch (timeUnit) {\n case 'second':\n return date.getMilliseconds() / millisecondsInSecond;\n case 'minute':\n return (date.getSeconds() + date.getMilliseconds() / millisecondsInSecond) / secondsInMinute;\n case 'hour':\n return (\n (date.getMinutes() * secondsInMinute + date.getSeconds() + date.getMilliseconds() / millisecondsInSecond) /\n (minutesInHour * secondsInMinute)\n );\n case 'day':\n return (\n (date.getHours() * minutesInHour * secondsInMinute +\n date.getMinutes() * secondsInMinute +\n date.getSeconds() +\n date.getMilliseconds() / millisecondsInSecond) /\n (hoursInDay * minutesInHour * secondsInMinute)\n );\n case 'week':\n return (\n (date.getDay() * hoursInDay * minutesInHour * secondsInMinute +\n date.getHours() * minutesInHour * secondsInMinute +\n date.getMinutes() * secondsInMinute +\n date.getSeconds() +\n date.getMilliseconds() / millisecondsInSecond) /\n (daysInWeek * hoursInDay * minutesInHour * secondsInMinute)\n );\n case 'month':\n return (\n ((date.getDate() - 1) * hoursInDay * minutesInHour * secondsInMinute +\n date.getHours() * minutesInHour * secondsInMinute +\n date.getMinutes() * secondsInMinute +\n date.getSeconds() +\n date.getMilliseconds() / millisecondsInSecond) /\n (daysInMonth * hoursInDay * minutesInHour * secondsInMinute)\n );\n case 'quarter':\n const monthInQuarter = date.getMonth() % 3;\n const daysInQuarter = new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate() * 3;\n return (\n ((monthInQuarter * daysInMonth + date.getDate() - 1) * hoursInDay * minutesInHour * secondsInMinute +\n date.getHours() * minutesInHour * secondsInMinute +\n date.getMinutes() * secondsInMinute +\n date.getSeconds() +\n date.getMilliseconds() / millisecondsInSecond) /\n (daysInQuarter * hoursInDay * minutesInHour * secondsInMinute)\n );\n case 'year':\n const daysInYear = isLeapYear(date.getFullYear()) ? 366 : 365;\n return (\n ((date.getMonth() * daysInMonth + date.getDate() - 1) * hoursInDay * minutesInHour * secondsInMinute +\n date.getHours() * minutesInHour * secondsInMinute +\n date.getMinutes() * secondsInMinute +\n date.getSeconds() +\n date.getMilliseconds() / millisecondsInSecond) /\n (daysInYear * hoursInDay * minutesInHour * secondsInMinute)\n );\n default:\n throw new Error('Invalid time unit');\n }\n}\n\n// // 示例用法\n// const date = new Date('2024-07-04T17:20:30');\n// const timeUnit = 'hour';\n// const result = parseDateToTimeUnit(date, timeUnit);\n// console.log(result); // 输出相对于小时的时间差值\n"]}
@@ -48,6 +48,8 @@ export interface GanttConstructorOptions {
48
48
  timelineHeader: {
49
49
  backgroundColor?: string;
50
50
  colWidth?: number;
51
+ hideWeekend?: boolean;
52
+ weekendColWidth?: number | ((colWidth: number) => number);
51
53
  verticalLine?: ILineStyle;
52
54
  horizontalLine?: ILineStyle;
53
55
  zoomScale?: IZoomScale;
@@ -58,6 +60,10 @@ export interface GanttConstructorOptions {
58
60
  startDateField?: string;
59
61
  endDateField?: string;
60
62
  progressField?: string;
63
+ baselineStartDateField?: string;
64
+ baselineEndDateField?: string;
65
+ baselineStyle?: ITaskBarStyle | ((args: TaskBarInteractionArgumentType) => ITaskBarStyle);
66
+ baselinePosition?: 'top' | 'bottom' | 'overlap';
61
67
  labelText?: ITaskBarLabelText;
62
68
  labelTextStyle?: ITaskBarLabelTextStyle;
63
69
  barStyle?: ITaskBarStyle | ((args: TaskBarInteractionArgumentType) => ITaskBarStyle);
@@ -77,6 +83,7 @@ export interface GanttConstructorOptions {
77
83
  contextMenuItems?: TYPES.MenuListItem[] | ((record: string, index: number, dateIndex: number, startDate: Date, endDate: Date) => TYPES.MenuListItem[]);
78
84
  };
79
85
  scheduleCreatable?: boolean | ((interactionArgs: TaskBarInteractionArgumentType) => boolean);
86
+ locateIcon?: boolean;
80
87
  scheduleCreation?: {
81
88
  buttonStyle?: ILineStyle & {
82
89
  cornerRadius?: number;
@@ -159,6 +166,7 @@ export interface ITaskBarStyle {
159
166
  borderLineWidth?: number;
160
167
  borderColor?: string;
161
168
  minSize?: number;
169
+ paddingTop?: number;
162
170
  }
163
171
  export interface IMilestoneStyle {
164
172
  borderColor?: string;
@@ -14,4 +14,5 @@ function(DependencyType) {
14
14
  TasksShowMode.Sub_Tasks_Compact = "sub_tasks_compact", TasksShowMode.Project_Sub_Tasks_Inline = "project_sub_tasks_inline";
15
15
  }(TasksShowMode = exports.TasksShowMode || (exports.TasksShowMode = {})), function(TaskType) {
16
16
  TaskType.TASK = "task", TaskType.PROJECT = "project", TaskType.MILESTONE = "milestone";
17
- }(TaskType = exports.TaskType || (exports.TaskType = {}));
17
+ }(TaskType = exports.TaskType || (exports.TaskType = {}));
18
+ //# sourceMappingURL=gantt-engine.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ts-types/gantt-engine.ts"],"names":[],"mappings":";;;AAsdA,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,mDAAiC,CAAA;IACjC,iDAA+B,CAAA;IAC/B,qDAAmC,CAAA;IACnC,mDAAiC,CAAA;AACnC,CAAC,EALW,cAAc,GAAd,sBAAc,KAAd,sBAAc,QAKzB;AACD,IAAY,aAaX;AAbD,WAAY,aAAa;IAEvB,kDAAiC,CAAA;IAEjC,sDAAqC,CAAA;IAErC,0DAAyC,CAAA;IAEzC,wDAAuC,CAAA;IAEvC,wDAAuC,CAAA;IAEvC,sEAAqD,CAAA;AACvD,CAAC,EAbW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAaxB;AAID,IAAY,QAIX;AAJD,WAAY,QAAQ;IAClB,yBAAa,CAAA;IACb,+BAAmB,CAAA;IACnB,mCAAuB,CAAA;AACzB,CAAC,EAJW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAInB","file":"gantt-engine.js","sourcesContent":["import type { ColumnsDefine, TYPES, ListTableConstructorOptions } from '@visactor/vtable';\nimport type { Group } from '@visactor/vtable/es/vrender';\nimport type { Gantt } from '../Gantt';\nexport type LayoutObjectId = number | string;\nimport type { IGanttPlugin } from '../plugins/interface';\nimport type { IZoomScale } from './zoom-scale';\nexport interface ITimelineDateInfo {\n days: number;\n endDate: Date;\n startDate: Date;\n title: string;\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number;\n unit: 'year' | 'month' | 'quarter' | 'week' | 'day' | 'hour' | 'minute' | 'second';\n step: number;\n}\n\nexport interface ITimelineHeaderStyle {\n padding?: number | number[];\n fontSize?: number;\n fontWeight?: string;\n color?: string;\n strokeColor?: string;\n // backgroundColor?: string;\n textAlign?: 'center' | 'end' | 'left' | 'right' | 'start'; // 设置单元格内文字的水平对齐方式\n textOverflow?: string;\n textBaseline?: 'alphabetic' | 'bottom' | 'middle' | 'top'; // 设置单元格内文字的垂直对齐方式\n textStick?: boolean;\n}\nexport interface IGrid {\n backgroundColor?: string;\n /** 需要按数据行设置不同背景色 */\n horizontalBackgroundColor?: string[] | ((args: GridHorizontalLineStyleArgumentType) => string);\n /** 需要按日期列设置不同背景色 */\n verticalBackgroundColor?: string[] | ((args: GridVerticalLineStyleArgumentType) => string);\n cellBackgroundColor?:\n | string[]\n | ((args: GridCellStyleArgumentType) =>\n | string\n | {\n color: string;\n startTime: Date;\n endTime: Date;\n });\n /** 周末背景色 */\n weekendBackgroundColor?: string;\n\n verticalLine?: ILineStyle | ((args: GridVerticalLineStyleArgumentType) => ILineStyle);\n horizontalLine?: ILineStyle | ((args: GridHorizontalLineStyleArgumentType) => ILineStyle);\n /** 竖线依赖的日期刻度。默认为timelineHeader中scales中的最小时间粒度 */\n verticalLineDependenceOnTimeScale?: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second';\n}\n//#region gantt\nexport interface GanttConstructorOptions {\n /**\n * 数据集合\n */\n records?: any[];\n\n /** 左侧任务信息表格相关配置 */\n taskListTable?: {\n /** 左侧任务列表信息占用的宽度。如果设置为'auto'表示将所有列完全展示 */\n tableWidth?: 'auto' | number;\n /** 左侧任务列表 最小宽度 */\n minTableWidth?: number;\n /** 左侧任务列表 最大宽度 */\n maxTableWidth?: number;\n } & Omit<\n //ListTable表格可配置的属性\n ListTableConstructorOptions,\n | 'container'\n | 'records'\n | 'defaultHeaderRowHeight'\n | 'defaultRowHeight'\n | 'overscrollBehavior'\n | 'rowSeriesNumber'\n | 'scrollStyle'\n | 'pixelRatio'\n | 'title'\n >;\n /** 时间刻度 */\n timelineHeader: {\n backgroundColor?: string;\n colWidth?: number;\n /** 垂直间隔线样式 */\n verticalLine?: ILineStyle;\n /** 水平间隔线样式 */\n horizontalLine?: ILineStyle;\n /**\n * ZoomScale 多级别缩放配置(优先级高于 timelineHeader.scales)\n * 当启用时,会根据缩放级别自动切换不同的 scales 组合\n */\n zoomScale?: IZoomScale;\n scales: ITimelineScale[];\n includeHourUnits?: IGrid['verticalLineDependenceOnTimeScale'][];\n };\n\n /** 任务条相关配置及样式 */\n taskBar?: {\n /** 任务开始日期对应的数据字段名 默认按'startDate' */\n startDateField?: string;\n /** 任务结束日期对应的数据字段名 默认按'endDate' */\n endDateField?: string;\n /** 任务进度对应的数据字段名 */\n progressField?: string;\n /** 任务条展示文字。可以配置固定文本 或者 字符串模版`${fieldName}` */\n labelText?: ITaskBarLabelText;\n /** 任务条文字样式 */\n labelTextStyle?: ITaskBarLabelTextStyle;\n /** 任务条样式 */\n barStyle?: ITaskBarStyle | ((args: TaskBarInteractionArgumentType) => ITaskBarStyle);\n milestoneStyle?: IMilestoneStyle;\n projectStyle?: ITaskBarStyle | ((args: TaskBarInteractionArgumentType) => ITaskBarStyle);\n /** 自定义布局渲染 */\n customLayout?: ITaskBarCustomLayout;\n /** 任务条是否可调整大小 */\n resizable?:\n | boolean\n | [boolean, boolean]\n | ((interactionArgs: TaskBarInteractionArgumentType) => boolean | [boolean, boolean]);\n /** 任务条是否可移动 */\n moveable?: boolean | ((interactionArgs: TaskBarInteractionArgumentType) => boolean);\n /** 任务进度是否可调整 */\n progressAdjustable?: boolean | ((interactionArgs: TaskBarInteractionArgumentType) => boolean);\n /** 任务条拖拽超出当前日期范围时自动扩展日期范围 */\n moveToExtendDateRange?: boolean;\n /** 任务条是否可以被拖拽来改变顺序 */\n dragOrder?: boolean;\n /** 任务条hover时的样式 */\n hoverBarStyle?: ITaskBarHoverStyle;\n /** 任务条选择时的样式 TODO */\n selectedBarStyle?: ITaskBarSelectedStyle;\n /** 任务条是否可选择,默认为true */\n selectable?: boolean;\n /** 任务条是否裁剪溢出部分 */\n clip?: boolean;\n /** 任务条右键菜单 */\n menu?: {\n /** 右键菜单。代替原来的option.contextmenu */\n contextMenuItems?:\n | TYPES.MenuListItem[]\n | ((\n record: string,\n index: number,\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number,\n startDate: Date,\n endDate: Date\n ) => TYPES.MenuListItem[]);\n };\n /** 数据没有排期时,可通过创建任务条排期。默认为true */\n scheduleCreatable?: boolean | ((interactionArgs: TaskBarInteractionArgumentType) => boolean);\n /** 针对没有分配日期的任务,可以显示出创建按钮 */\n scheduleCreation?: {\n buttonStyle?: ILineStyle & {\n cornerRadius?: number;\n backgroundColor?: string;\n };\n /** 任务条创建按钮的自定义渲染 */\n customLayout?: ITaskCreationCustomLayout;\n /** 任务条创建按钮的最大宽度 */\n maxWidth?: number;\n /** 任务条创建按钮的最小宽度 */\n minWidth?: number;\n };\n };\n /** 数据条目可唯一标识的字段名,默认为'id' */\n taskKeyField?: string;\n /** 任务之间的依赖关系 */\n dependency?: {\n links: ITaskLink[];\n linkLineStyle?: ILineStyle;\n linkCreatable?: boolean;\n linkSelectable?: boolean;\n linkDeletable?: boolean;\n linkSelectedLineStyle?: ITaskLinkSelectedStyle;\n /** 创建关联线的操作点 */\n linkCreatePointStyle?: IPointStyle;\n /** 创建关联线的操作点响应状态效果 */\n linkCreatingPointStyle?: IPointStyle;\n /** 创建关联线的操作线样式 */\n linkCreatingLineStyle?: ILineStyle;\n /** 依赖关系线拐点与任务条的距离 默认20 */\n distanceToTaskBar?: number;\n };\n /** 网格线配置 */\n grid?: IGrid;\n\n /** 整个外边框及横纵分割线配置。 */\n frame?: {\n outerFrameStyle: IFrameStyle;\n verticalSplitLine?: ILineStyle;\n horizontalSplitLine?: ILineStyle;\n verticalSplitLineMoveable?: boolean;\n //列调整宽度的直线\n verticalSplitLineHighlight?: ILineStyle;\n };\n\n /** 标记线配置 如果配置为true 会自动给今天做标记 */\n markLine?: boolean | IMarkLine | IMarkLine[];\n\n /** 指定整个甘特图的最小日期 */\n minDate?: string;\n /** 指定整个甘特图的最大日期 不设置的话用默认规则*/\n maxDate?: string;\n\n /** 顶部表头部分默认行高。如果想按表头层级依次配置,请配置到timelineHeader.scale中 */\n headerRowHeight?: number;\n\n /** 数据默认行高 */\n rowHeight?: number;\n\n /** 行号配置 */\n rowSeriesNumber?: IRowSeriesNumber;\n\n /**\n * 'auto':和浏览器滚动行为一致 表格滚动到顶部/底部时 触发浏览器默认行为;\n * 设置为 'none' 时, 表格滚动到顶部/底部时, 不再触发父容器滚动\n * */\n overscrollBehavior?: 'auto' | 'none';\n\n scrollStyle?: IScrollStyle;\n\n pixelRatio?: number;\n dateFormat?:\n | 'yyyy-mm-dd'\n | 'dd-mm-yyyy'\n | 'mm/dd/yyyy'\n | 'yyyy/mm/dd'\n | 'dd/mm/yyyy'\n | 'yyyy.mm.dd'\n | 'dd.mm.yyyy'\n | 'mm.dd.yyyy';\n\n /** 表格绘制范围外的canvas上填充的颜色 */\n underlayBackgroundColor?: string;\n groupBy?: true | string | string[];\n /** 展示嵌套结构数据时的模式,默认为full。*/\n tasksShowMode?: TasksShowMode;\n /**\n * 当使用Project_Sub_Tasks_Inline模式时,控制是否启用项目子任务的展开/收起功能\n * 默认值为true\n * 当设置为true(默认值)时,项目节点可以展开/收起其子任务\n * 当设置为false时,项目节点将始终以内联方式显示其子任务,没有展开/收起功能\n */\n projectSubTasksExpandable?: boolean;\n eventOptions?: IEventOptions;\n keyboardOptions?: IKeyboardOptions;\n markLineCreateOptions?: IMarkLineCreateOptions;\n plugins?: IGanttPlugin[];\n}\n/**\n * IBarLabelText\n * 可以配置固定文本 或者 ${fieldName} 或者自定义函数\n */\nexport type ITaskBarLabelText = string; //| string[] | ((args: any) => string | string[]);\nexport interface ITimelineScale {\n rowHeight?: number;\n unit: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second';\n step: number;\n startOfWeek?: 'sunday' | 'monday';\n customLayout?: IDateCustomLayout;\n style?: ITimelineHeaderStyle;\n format?: (date: DateFormatArgumentType) => string;\n visible?: boolean;\n}\nexport interface ITaskBarLabelTextStyle {\n fontFamily?: string;\n fontSize?: number;\n color?: string;\n /** 当文字显示在任务条外侧时的颜色,默认为黑色 */\n outsideColor?: string;\n textAlign?: 'center' | 'end' | 'left' | 'right' | 'start'; // 设置单元格内文字的水平对齐方式\n textOverflow?: string;\n textBaseline?: 'alphabetic' | 'bottom' | 'middle' | 'top'; // 设置单元格内文字的垂直对齐方式\n padding?: number | number[];\n /** 相对于任务条文字方位位置,可选值:'left', 'top', 'right', 'bottom',分别代表左、上、右、下四个方向 */\n orient?: 'left' | 'top' | 'right' | 'bottom';\n /** 只有当文本在 taskbar 中容纳不下时,会根据该方位将文本显示在任务条旁边。当配置 orient 时,该配置无效 */\n orientHandleWithOverflow?: 'left' | 'top' | 'right' | 'bottom';\n}\nexport interface ITaskBarStyle {\n /** 任务条的颜色 */\n barColor?: string;\n /** 已完成部分任务条的颜色 */\n completedBarColor?: string;\n /** 任务条的宽度 */\n width?: number;\n /** 任务条的圆角 */\n cornerRadius?: number;\n /**@deprecated 请配置borderLineWidth */\n borderWidth?: number;\n\n /** 任务条的边框宽度 */\n borderLineWidth?: number;\n /** 边框颜色 */\n borderColor?: string;\n\n /** 任务条的最小尺寸 */\n minSize?: number;\n}\nexport interface IMilestoneStyle {\n /** 里程碑边框颜色 */\n borderColor?: string;\n /** 里程碑边框宽度 */\n borderLineWidth?: number;\n /** 里程碑填充颜色 */\n fillColor?: string;\n /** 里程碑正方形圆角 */\n cornerRadius?: number;\n /** 里程碑默认是个正方形,这个width配置正方形的边长 */\n width?: number;\n /** 里程碑展示文字。可以配置固定文本 或者 字符串模版`${fieldName}` */\n labelText?: ITaskBarLabelText;\n /** 里程碑文字样式 */\n labelTextStyle?: ITaskBarLabelTextStyle;\n // /** 里程碑图标 */\n // icon?: string;\n /** 文字相对于里程碑的位置 */\n textOrient?: 'left' | 'top' | 'right' | 'bottom';\n}\nexport type ILineStyle = {\n lineColor?: string;\n lineWidth?: number;\n lineDash?: number[];\n};\nexport type IPointStyle = {\n strokeColor?: string;\n strokeWidth?: number;\n fillColor?: string;\n radius?: number;\n};\nexport interface IMarkLine {\n date: string;\n content?: string;\n contentStyle?: {\n color?: string;\n fontSize?: number;\n fontWeight?: string;\n lineHeight?: number;\n backgroundColor?: string;\n cornerRadius?: number | number[];\n };\n style?: ILineStyle;\n /** 标记线显示在日期列下的位置 默认为'left' */\n position?: 'left' | 'right' | 'middle' | 'date';\n /** 自动将日期范围内 包括改标记线 */\n scrollToMarkLine?: boolean;\n}\nexport type ITableColumnsDefine = ColumnsDefine;\nexport type IFrameStyle = {\n borderColor?: string;\n borderLineWidth?: number | number[];\n borderLineDash?: number[];\n cornerRadius?: number;\n};\n\nexport type ITableStyle = TYPES.ThemeStyle;\nexport type IRowSeriesNumber = TYPES.IRowSeriesNumber;\nexport type IScrollStyle = TYPES.ScrollStyle;\nexport type IEventOptions = TYPES.TableEventOptions;\n\nexport interface IKeyboardOptions {\n /** 当按下del按键是否删除连线 默认为false */\n deleteLinkOnDel?: boolean;\n /** 当按下back按键是否删除连线 默认为false */\n deleteLinkOnBack?: boolean;\n}\nexport type DateFormatArgumentType = {\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number;\n startDate: Date;\n endDate: Date;\n};\nexport type TaskBarInteractionArgumentType = {\n taskRecord: any;\n index: number;\n subIndex?: number;\n startDate: Date;\n endDate: Date;\n ganttInstance: Gantt;\n};\n\nexport type TaskBarCustomLayoutArgumentType = {\n width: number;\n height: number;\n index: number;\n startDate: Date;\n endDate: Date;\n taskDays: number;\n progress: number;\n taskRecord: any;\n ganttInstance: Gantt;\n};\nexport type ITaskBarCustomLayoutObj = {\n rootContainer?: Group;\n renderDefaultBar?: boolean; // 默认false\n renderDefaultResizeIcon?: boolean; // 默认false\n renderDefaultText?: boolean; // 默认false\n};\nexport type ITaskBarCustomLayout = (args: TaskBarCustomLayoutArgumentType) => ITaskBarCustomLayoutObj; //CustomLayout\n\nexport type DateCustomLayoutArgumentType = {\n width: number;\n height: number;\n index: number;\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number;\n title: string;\n startDate: Date;\n endDate: Date;\n days: number;\n ganttInstance: Gantt;\n};\nexport type IDateCustomLayoutObj = {\n rootContainer: Group;\n renderDefaultText?: boolean; // 默认false\n};\nexport type IDateCustomLayout = (args: DateCustomLayoutArgumentType) => IDateCustomLayoutObj;\n\nexport type GridVerticalLineStyleArgumentType = {\n /** 竖线是第几条线*/\n index: number;\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number;\n /** 如果是竖线,date代表分割线指向的具体时间点 */\n date?: Date;\n ganttInstance: Gantt;\n};\n\nexport type GridHorizontalLineStyleArgumentType = {\n /** 横线是第几条线 也代表了左侧表格的body行号 */\n index: number;\n ganttInstance: Gantt;\n};\n\nexport type GridCellStyleArgumentType = {\n rowIndex: number;\n colIndex: number;\n date?: Date;\n ganttInstance: Gantt;\n};\n\nexport type TaskCreationCustomLayoutArgumentType = {\n width: number;\n height: number;\n // index: number;\n ganttInstance: Gantt;\n};\nexport type ITaskCreationCustomLayoutObj = {\n rootContainer: Group;\n};\nexport type ITaskCreationCustomLayout = (args: TaskCreationCustomLayoutArgumentType) => ITaskCreationCustomLayoutObj;\n\nexport type ITaskLink = {\n /** 依赖的类型 */\n type: DependencyType;\n /** 依赖线的起始任务唯一标识。如果是tree树形结构的数据 设置数组的话 查找性能会更高 */\n linkedFromTaskKey?: string | number | (string | number)[];\n /** 依赖的终止目标任务唯一标识。如果是tree树形结构的数据 设置数组的话 查找性能会更高 */\n linkedToTaskKey?: string | number | (string | number)[];\n /** 依赖线的样式 */\n linkLineStyle?: ILineStyle;\n};\n\nexport type ITaskLinkSelectedStyle = ILineStyle & {\n shadowBlur?: number; //阴影宽度\n shadowOffset?: number; //偏移\n shadowColor?: string; //阴影颜色\n};\nexport enum DependencyType {\n FinishToStart = 'finish_to_start',\n StartToStart = 'start_to_start',\n FinishToFinish = 'finish_to_finish',\n StartToFinish = 'start_to_finish'\n}\nexport enum TasksShowMode {\n /** 每一个任务节点用单独一行来展示,父任务占用一行,子任务分别占用一行。这是默认的显示效果 */\n Tasks_Separate = 'tasks_separate',\n /** 省去父任务节点不展示,并把所有子任务的节点都放到同一行来展示。 */\n Sub_Tasks_Inline = 'sub_tasks_inline',\n /** 省去父任务节点不展示,且所有子任务的节点分别用一行展示。*/\n Sub_Tasks_Separate = 'sub_tasks_separate',\n /** 省去父任务节点不展示,且所有子任务会维持records中的数据顺序布局,并保证节点不重叠展示 */\n Sub_Tasks_Arrange = 'sub_tasks_arrange',\n /** 省去父任务节点不展示,且所有子任务会按照日期早晚的属性来布局,并保证节点不重叠的紧凑型展示 */\n Sub_Tasks_Compact = 'sub_tasks_compact',\n /** 数据标记为project的节点,会把所有子任务的节点都放到和主任务的同一行来展示。其他节点则保持默认的显示效果即Tasks_Separate */\n Project_Sub_Tasks_Inline = 'project_sub_tasks_inline'\n}\n/**\n * 任务类型枚举,用于区分不同类型的任务\n */\nexport enum TaskType {\n TASK = 'task', // record没有指明type的 会默认使用TASK\n PROJECT = 'project',\n MILESTONE = 'milestone'\n}\nexport type ITaskBarSelectedStyle = {\n shadowBlur?: number; //阴影宽度\n shadowOffsetX?: number; //x方向偏移\n shadowOffsetY?: number; //Y方向偏移\n shadowColor?: string; //阴影颜色\n borderColor?: string; //边框颜色\n borderLineWidth?: number;\n};\nexport type ITaskBarHoverStyle = {\n /** 任务条的圆角 */\n cornerRadius?: number;\n barOverlayColor?: string;\n};\n//#endregion\n\nexport type IMarkLineCreateOptions = {\n markLineCreatable: boolean;\n markLineCreationHoverToolTip?: {\n position?: 'top' | 'bottom';\n tipContent?: string;\n style?: {\n contentStyle?: any;\n panelStyle?: any;\n };\n };\n markLineCreationStyle?: {\n fill?: string;\n size?: number;\n iconSize?: number;\n svg?: string;\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/ts-types/gantt-engine.ts"],"names":[],"mappings":";;;AAoeA,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,mDAAiC,CAAA;IACjC,iDAA+B,CAAA;IAC/B,qDAAmC,CAAA;IACnC,mDAAiC,CAAA;AACnC,CAAC,EALW,cAAc,GAAd,sBAAc,KAAd,sBAAc,QAKzB;AACD,IAAY,aAaX;AAbD,WAAY,aAAa;IAEvB,kDAAiC,CAAA;IAEjC,sDAAqC,CAAA;IAErC,0DAAyC,CAAA;IAEzC,wDAAuC,CAAA;IAEvC,wDAAuC,CAAA;IAEvC,sEAAqD,CAAA;AACvD,CAAC,EAbW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAaxB;AAID,IAAY,QAIX;AAJD,WAAY,QAAQ;IAClB,yBAAa,CAAA;IACb,+BAAmB,CAAA;IACnB,mCAAuB,CAAA;AACzB,CAAC,EAJW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAInB","file":"gantt-engine.js","sourcesContent":["import type { ColumnsDefine, TYPES, ListTableConstructorOptions } from '@visactor/vtable';\nimport type { Group } from '@visactor/vtable/es/vrender';\nimport type { Gantt } from '../Gantt';\nexport type LayoutObjectId = number | string;\nimport type { IGanttPlugin } from '../plugins/interface';\nimport type { IZoomScale } from './zoom-scale';\nexport interface ITimelineDateInfo {\n days: number;\n endDate: Date;\n startDate: Date;\n title: string;\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number;\n unit: 'year' | 'month' | 'quarter' | 'week' | 'day' | 'hour' | 'minute' | 'second';\n step: number;\n}\n\nexport interface ITimelineHeaderStyle {\n padding?: number | number[];\n fontSize?: number;\n fontWeight?: string;\n color?: string;\n strokeColor?: string;\n // backgroundColor?: string;\n textAlign?: 'center' | 'end' | 'left' | 'right' | 'start'; // 设置单元格内文字的水平对齐方式\n textOverflow?: string;\n textBaseline?: 'alphabetic' | 'bottom' | 'middle' | 'top'; // 设置单元格内文字的垂直对齐方式\n textStick?: boolean;\n}\nexport interface IGrid {\n backgroundColor?: string;\n /** 需要按数据行设置不同背景色 */\n horizontalBackgroundColor?: string[] | ((args: GridHorizontalLineStyleArgumentType) => string);\n /** 需要按日期列设置不同背景色 */\n verticalBackgroundColor?: string[] | ((args: GridVerticalLineStyleArgumentType) => string);\n cellBackgroundColor?:\n | string[]\n | ((args: GridCellStyleArgumentType) =>\n | string\n | {\n color: string;\n startTime: Date;\n endTime: Date;\n });\n /** 周末背景色 */\n weekendBackgroundColor?: string;\n\n verticalLine?: ILineStyle | ((args: GridVerticalLineStyleArgumentType) => ILineStyle);\n horizontalLine?: ILineStyle | ((args: GridHorizontalLineStyleArgumentType) => ILineStyle);\n /** 竖线依赖的日期刻度。默认为timelineHeader中scales中的最小时间粒度 */\n verticalLineDependenceOnTimeScale?: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second';\n}\n//#region gantt\nexport interface GanttConstructorOptions {\n /**\n * 数据集合\n */\n records?: any[];\n\n /** 左侧任务信息表格相关配置 */\n taskListTable?: {\n /** 左侧任务列表信息占用的宽度。如果设置为'auto'表示将所有列完全展示 */\n tableWidth?: 'auto' | number;\n /** 左侧任务列表 最小宽度 */\n minTableWidth?: number;\n /** 左侧任务列表 最大宽度 */\n maxTableWidth?: number;\n } & Omit<\n //ListTable表格可配置的属性\n ListTableConstructorOptions,\n | 'container'\n | 'records'\n | 'defaultHeaderRowHeight'\n | 'defaultRowHeight'\n | 'overscrollBehavior'\n | 'rowSeriesNumber'\n | 'scrollStyle'\n | 'pixelRatio'\n | 'title'\n >;\n /** 时间刻度 */\n timelineHeader: {\n backgroundColor?: string;\n colWidth?: number;\n hideWeekend?: boolean;\n weekendColWidth?: number | ((colWidth: number) => number);\n /** 垂直间隔线样式 */\n verticalLine?: ILineStyle;\n /** 水平间隔线样式 */\n horizontalLine?: ILineStyle;\n /**\n * ZoomScale 多级别缩放配置(优先级高于 timelineHeader.scales)\n * 当启用时,会根据缩放级别自动切换不同的 scales 组合\n */\n zoomScale?: IZoomScale;\n scales: ITimelineScale[];\n includeHourUnits?: IGrid['verticalLineDependenceOnTimeScale'][];\n };\n\n /** 任务条相关配置及样式 */\n taskBar?: {\n /** 任务开始日期对应的数据字段名 默认按'startDate' */\n startDateField?: string;\n /** 任务结束日期对应的数据字段名 默认按'endDate' */\n endDateField?: string;\n /** 任务进度对应的数据字段名 */\n progressField?: string;\n /** 基线开始日期对应的数据字段名 默认按'baselineStartDate' */\n baselineStartDateField?: string;\n /** 基线结束日期对应的数据字段名 默认按'baselineEndDate' */\n baselineEndDateField?: string;\n /** 基线样式 */\n baselineStyle?: ITaskBarStyle | ((args: TaskBarInteractionArgumentType) => ITaskBarStyle);\n /** 基线相对于任务条的位置:'top'|'bottom'|'overlap',默认'bottom' */\n baselinePosition?: 'top' | 'bottom' | 'overlap';\n /** 任务条展示文字。可以配置固定文本 或者 字符串模版`${fieldName}` */\n labelText?: ITaskBarLabelText;\n /** 任务条文字样式 */\n labelTextStyle?: ITaskBarLabelTextStyle;\n /** 任务条样式 */\n barStyle?: ITaskBarStyle | ((args: TaskBarInteractionArgumentType) => ITaskBarStyle);\n milestoneStyle?: IMilestoneStyle;\n projectStyle?: ITaskBarStyle | ((args: TaskBarInteractionArgumentType) => ITaskBarStyle);\n /** 自定义布局渲染 */\n customLayout?: ITaskBarCustomLayout;\n /** 任务条是否可调整大小 */\n resizable?:\n | boolean\n | [boolean, boolean]\n | ((interactionArgs: TaskBarInteractionArgumentType) => boolean | [boolean, boolean]);\n /** 任务条是否可移动 */\n moveable?: boolean | ((interactionArgs: TaskBarInteractionArgumentType) => boolean);\n /** 任务进度是否可调整 */\n progressAdjustable?: boolean | ((interactionArgs: TaskBarInteractionArgumentType) => boolean);\n /** 任务条拖拽超出当前日期范围时自动扩展日期范围 */\n moveToExtendDateRange?: boolean;\n /** 任务条是否可以被拖拽来改变顺序 */\n dragOrder?: boolean;\n /** 任务条hover时的样式 */\n hoverBarStyle?: ITaskBarHoverStyle;\n /** 任务条选择时的样式 TODO */\n selectedBarStyle?: ITaskBarSelectedStyle;\n /** 任务条是否可选择,默认为true */\n selectable?: boolean;\n /** 任务条是否裁剪溢出部分 */\n clip?: boolean;\n /** 任务条右键菜单 */\n menu?: {\n /** 右键菜单。代替原来的option.contextmenu */\n contextMenuItems?:\n | TYPES.MenuListItem[]\n | ((\n record: string,\n index: number,\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number,\n startDate: Date,\n endDate: Date\n ) => TYPES.MenuListItem[]);\n };\n /** 数据没有排期时,可通过创建任务条排期。默认为true */\n scheduleCreatable?: boolean | ((interactionArgs: TaskBarInteractionArgumentType) => boolean);\n /** 是否开启“任务条超出可视区”定位图标能力。默认 false */\n locateIcon?: boolean;\n /** 针对没有分配日期的任务,可以显示出创建按钮 */\n scheduleCreation?: {\n buttonStyle?: ILineStyle & {\n cornerRadius?: number;\n backgroundColor?: string;\n };\n /** 任务条创建按钮的自定义渲染 */\n customLayout?: ITaskCreationCustomLayout;\n /** 任务条创建按钮的最大宽度 */\n maxWidth?: number;\n /** 任务条创建按钮的最小宽度 */\n minWidth?: number;\n };\n };\n /** 数据条目可唯一标识的字段名,默认为'id' */\n taskKeyField?: string;\n /** 任务之间的依赖关系 */\n dependency?: {\n links: ITaskLink[];\n linkLineStyle?: ILineStyle;\n linkCreatable?: boolean;\n linkSelectable?: boolean;\n linkDeletable?: boolean;\n linkSelectedLineStyle?: ITaskLinkSelectedStyle;\n /** 创建关联线的操作点 */\n linkCreatePointStyle?: IPointStyle;\n /** 创建关联线的操作点响应状态效果 */\n linkCreatingPointStyle?: IPointStyle;\n /** 创建关联线的操作线样式 */\n linkCreatingLineStyle?: ILineStyle;\n /** 依赖关系线拐点与任务条的距离 默认20 */\n distanceToTaskBar?: number;\n };\n /** 网格线配置 */\n grid?: IGrid;\n\n /** 整个外边框及横纵分割线配置。 */\n frame?: {\n outerFrameStyle: IFrameStyle;\n verticalSplitLine?: ILineStyle;\n horizontalSplitLine?: ILineStyle;\n verticalSplitLineMoveable?: boolean;\n //列调整宽度的直线\n verticalSplitLineHighlight?: ILineStyle;\n };\n\n /** 标记线配置 如果配置为true 会自动给今天做标记 */\n markLine?: boolean | IMarkLine | IMarkLine[];\n\n /** 指定整个甘特图的最小日期 */\n minDate?: string;\n /** 指定整个甘特图的最大日期 不设置的话用默认规则*/\n maxDate?: string;\n\n /** 顶部表头部分默认行高。如果想按表头层级依次配置,请配置到timelineHeader.scale中 */\n headerRowHeight?: number;\n\n /** 数据默认行高 */\n rowHeight?: number;\n\n /** 行号配置 */\n rowSeriesNumber?: IRowSeriesNumber;\n\n /**\n * 'auto':和浏览器滚动行为一致 表格滚动到顶部/底部时 触发浏览器默认行为;\n * 设置为 'none' 时, 表格滚动到顶部/底部时, 不再触发父容器滚动\n * */\n overscrollBehavior?: 'auto' | 'none';\n\n scrollStyle?: IScrollStyle;\n\n pixelRatio?: number;\n dateFormat?:\n | 'yyyy-mm-dd'\n | 'dd-mm-yyyy'\n | 'mm/dd/yyyy'\n | 'yyyy/mm/dd'\n | 'dd/mm/yyyy'\n | 'yyyy.mm.dd'\n | 'dd.mm.yyyy'\n | 'mm.dd.yyyy';\n\n /** 表格绘制范围外的canvas上填充的颜色 */\n underlayBackgroundColor?: string;\n groupBy?: true | string | string[];\n /** 展示嵌套结构数据时的模式,默认为full。*/\n tasksShowMode?: TasksShowMode;\n /**\n * 当使用Project_Sub_Tasks_Inline模式时,控制是否启用项目子任务的展开/收起功能\n * 默认值为true\n * 当设置为true(默认值)时,项目节点可以展开/收起其子任务\n * 当设置为false时,项目节点将始终以内联方式显示其子任务,没有展开/收起功能\n */\n projectSubTasksExpandable?: boolean;\n eventOptions?: IEventOptions;\n keyboardOptions?: IKeyboardOptions;\n markLineCreateOptions?: IMarkLineCreateOptions;\n plugins?: IGanttPlugin[];\n}\n/**\n * IBarLabelText\n * 可以配置固定文本 或者 ${fieldName} 或者自定义函数\n */\nexport type ITaskBarLabelText = string; //| string[] | ((args: any) => string | string[]);\nexport interface ITimelineScale {\n rowHeight?: number;\n unit: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second';\n step: number;\n startOfWeek?: 'sunday' | 'monday';\n customLayout?: IDateCustomLayout;\n style?: ITimelineHeaderStyle;\n format?: (date: DateFormatArgumentType) => string;\n visible?: boolean;\n}\nexport interface ITaskBarLabelTextStyle {\n fontFamily?: string;\n fontSize?: number;\n color?: string;\n /** 当文字显示在任务条外侧时的颜色,默认为黑色 */\n outsideColor?: string;\n textAlign?: 'center' | 'end' | 'left' | 'right' | 'start'; // 设置单元格内文字的水平对齐方式\n textOverflow?: string;\n textBaseline?: 'alphabetic' | 'bottom' | 'middle' | 'top'; // 设置单元格内文字的垂直对齐方式\n padding?: number | number[];\n /** 相对于任务条文字方位位置,可选值:'left', 'top', 'right', 'bottom',分别代表左、上、右、下四个方向 */\n orient?: 'left' | 'top' | 'right' | 'bottom';\n /** 只有当文本在 taskbar 中容纳不下时,会根据该方位将文本显示在任务条旁边。当配置 orient 时,该配置无效 */\n orientHandleWithOverflow?: 'left' | 'top' | 'right' | 'bottom';\n}\nexport interface ITaskBarStyle {\n /** 任务条的颜色 */\n barColor?: string;\n /** 已完成部分任务条的颜色 */\n completedBarColor?: string;\n /** 任务条的宽度 */\n width?: number;\n /** 任务条的圆角 */\n cornerRadius?: number;\n /**@deprecated 请配置borderLineWidth */\n borderWidth?: number;\n\n /** 任务条的边框宽度 */\n borderLineWidth?: number;\n /** 边框颜色 */\n borderColor?: string;\n\n /** 任务条的最小尺寸 */\n minSize?: number;\n /** 任务条距离行顶部的距离 */\n paddingTop?: number;\n}\nexport interface IMilestoneStyle {\n /** 里程碑边框颜色 */\n borderColor?: string;\n /** 里程碑边框宽度 */\n borderLineWidth?: number;\n /** 里程碑填充颜色 */\n fillColor?: string;\n /** 里程碑正方形圆角 */\n cornerRadius?: number;\n /** 里程碑默认是个正方形,这个width配置正方形的边长 */\n width?: number;\n /** 里程碑展示文字。可以配置固定文本 或者 字符串模版`${fieldName}` */\n labelText?: ITaskBarLabelText;\n /** 里程碑文字样式 */\n labelTextStyle?: ITaskBarLabelTextStyle;\n // /** 里程碑图标 */\n // icon?: string;\n /** 文字相对于里程碑的位置 */\n textOrient?: 'left' | 'top' | 'right' | 'bottom';\n}\nexport type ILineStyle = {\n lineColor?: string;\n lineWidth?: number;\n lineDash?: number[];\n};\nexport type IPointStyle = {\n strokeColor?: string;\n strokeWidth?: number;\n fillColor?: string;\n radius?: number;\n};\nexport interface IMarkLine {\n date: string;\n content?: string;\n contentStyle?: {\n color?: string;\n fontSize?: number;\n fontWeight?: string;\n lineHeight?: number;\n backgroundColor?: string;\n cornerRadius?: number | number[];\n };\n style?: ILineStyle;\n /** 标记线显示在日期列下的位置 默认为'left' */\n position?: 'left' | 'right' | 'middle' | 'date';\n /** 自动将日期范围内 包括改标记线 */\n scrollToMarkLine?: boolean;\n}\nexport type ITableColumnsDefine = ColumnsDefine;\nexport type IFrameStyle = {\n borderColor?: string;\n borderLineWidth?: number | number[];\n borderLineDash?: number[];\n cornerRadius?: number;\n};\n\nexport type ITableStyle = TYPES.ThemeStyle;\nexport type IRowSeriesNumber = TYPES.IRowSeriesNumber;\nexport type IScrollStyle = TYPES.ScrollStyle;\nexport type IEventOptions = TYPES.TableEventOptions;\n\nexport interface IKeyboardOptions {\n /** 当按下del按键是否删除连线 默认为false */\n deleteLinkOnDel?: boolean;\n /** 当按下back按键是否删除连线 默认为false */\n deleteLinkOnBack?: boolean;\n}\nexport type DateFormatArgumentType = {\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number;\n startDate: Date;\n endDate: Date;\n};\nexport type TaskBarInteractionArgumentType = {\n taskRecord: any;\n index: number;\n subIndex?: number;\n startDate: Date;\n endDate: Date;\n ganttInstance: Gantt;\n};\n\nexport type TaskBarCustomLayoutArgumentType = {\n width: number;\n height: number;\n index: number;\n startDate: Date;\n endDate: Date;\n taskDays: number;\n progress: number;\n taskRecord: any;\n ganttInstance: Gantt;\n};\nexport type ITaskBarCustomLayoutObj = {\n rootContainer?: Group;\n renderDefaultBar?: boolean; // 默认false\n renderDefaultResizeIcon?: boolean; // 默认false\n renderDefaultText?: boolean; // 默认false\n};\nexport type ITaskBarCustomLayout = (args: TaskBarCustomLayoutArgumentType) => ITaskBarCustomLayoutObj; //CustomLayout\n\nexport type DateCustomLayoutArgumentType = {\n width: number;\n height: number;\n index: number;\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number;\n title: string;\n startDate: Date;\n endDate: Date;\n days: number;\n ganttInstance: Gantt;\n};\nexport type IDateCustomLayoutObj = {\n rootContainer: Group;\n renderDefaultText?: boolean; // 默认false\n};\nexport type IDateCustomLayout = (args: DateCustomLayoutArgumentType) => IDateCustomLayoutObj;\n\nexport type GridVerticalLineStyleArgumentType = {\n /** 竖线是第几条线*/\n index: number;\n /** 当期日期属于该日期刻度的第几位。如季度日期中第四季度 返回4。 */\n dateIndex: number;\n /** 如果是竖线,date代表分割线指向的具体时间点 */\n date?: Date;\n ganttInstance: Gantt;\n};\n\nexport type GridHorizontalLineStyleArgumentType = {\n /** 横线是第几条线 也代表了左侧表格的body行号 */\n index: number;\n ganttInstance: Gantt;\n};\n\nexport type GridCellStyleArgumentType = {\n rowIndex: number;\n colIndex: number;\n date?: Date;\n ganttInstance: Gantt;\n};\n\nexport type TaskCreationCustomLayoutArgumentType = {\n width: number;\n height: number;\n // index: number;\n ganttInstance: Gantt;\n};\nexport type ITaskCreationCustomLayoutObj = {\n rootContainer: Group;\n};\nexport type ITaskCreationCustomLayout = (args: TaskCreationCustomLayoutArgumentType) => ITaskCreationCustomLayoutObj;\n\nexport type ITaskLink = {\n /** 依赖的类型 */\n type: DependencyType;\n /** 依赖线的起始任务唯一标识。如果是tree树形结构的数据 设置数组的话 查找性能会更高 */\n linkedFromTaskKey?: string | number | (string | number)[];\n /** 依赖的终止目标任务唯一标识。如果是tree树形结构的数据 设置数组的话 查找性能会更高 */\n linkedToTaskKey?: string | number | (string | number)[];\n /** 依赖线的样式 */\n linkLineStyle?: ILineStyle;\n};\n\nexport type ITaskLinkSelectedStyle = ILineStyle & {\n shadowBlur?: number; //阴影宽度\n shadowOffset?: number; //偏移\n shadowColor?: string; //阴影颜色\n};\nexport enum DependencyType {\n FinishToStart = 'finish_to_start',\n StartToStart = 'start_to_start',\n FinishToFinish = 'finish_to_finish',\n StartToFinish = 'start_to_finish'\n}\nexport enum TasksShowMode {\n /** 每一个任务节点用单独一行来展示,父任务占用一行,子任务分别占用一行。这是默认的显示效果 */\n Tasks_Separate = 'tasks_separate',\n /** 省去父任务节点不展示,并把所有子任务的节点都放到同一行来展示。 */\n Sub_Tasks_Inline = 'sub_tasks_inline',\n /** 省去父任务节点不展示,且所有子任务的节点分别用一行展示。*/\n Sub_Tasks_Separate = 'sub_tasks_separate',\n /** 省去父任务节点不展示,且所有子任务会维持records中的数据顺序布局,并保证节点不重叠展示 */\n Sub_Tasks_Arrange = 'sub_tasks_arrange',\n /** 省去父任务节点不展示,且所有子任务会按照日期早晚的属性来布局,并保证节点不重叠的紧凑型展示 */\n Sub_Tasks_Compact = 'sub_tasks_compact',\n /** 数据标记为project的节点,会把所有子任务的节点都放到和主任务的同一行来展示。其他节点则保持默认的显示效果即Tasks_Separate */\n Project_Sub_Tasks_Inline = 'project_sub_tasks_inline'\n}\n/**\n * 任务类型枚举,用于区分不同类型的任务\n */\nexport enum TaskType {\n TASK = 'task', // record没有指明type的 会默认使用TASK\n PROJECT = 'project',\n MILESTONE = 'milestone'\n}\nexport type ITaskBarSelectedStyle = {\n shadowBlur?: number; //阴影宽度\n shadowOffsetX?: number; //x方向偏移\n shadowOffsetY?: number; //Y方向偏移\n shadowColor?: string; //阴影颜色\n borderColor?: string; //边框颜色\n borderLineWidth?: number;\n};\nexport type ITaskBarHoverStyle = {\n /** 任务条的圆角 */\n cornerRadius?: number;\n barOverlayColor?: string;\n};\n//#endregion\n\nexport type IMarkLineCreateOptions = {\n markLineCreatable: boolean;\n markLineCreationHoverToolTip?: {\n position?: 'top' | 'bottom';\n tipContent?: string;\n style?: {\n contentStyle?: any;\n panelStyle?: any;\n };\n };\n markLineCreationStyle?: {\n fill?: string;\n size?: number;\n iconSize?: number;\n svg?: string;\n };\n};\n"]}
@@ -23,10 +23,12 @@ export declare class DataZoomIntegration {
23
23
  private isUpdatingFromDataZoom;
24
24
  private isUpdatingFromGantt;
25
25
  private lastDataZoomState;
26
+ private lastSpanLimits;
26
27
  private cleanupCallbacks;
27
28
  private resizeTimeout;
28
29
  private isInitializing;
29
30
  constructor(gantt: Gantt, config: DataZoomConfig);
31
+ private syncDataZoomToGanttView;
30
32
  private getContainerId;
31
33
  private initializeDataZoom;
32
34
  private setupEventListeners;
@@ -11,9 +11,21 @@ class DataZoomIntegration {
11
11
  this.isUpdatingFromDataZoom = !1, this.isUpdatingFromGantt = !1, this.lastDataZoomState = {
12
12
  start: .2,
13
13
  end: .5
14
- }, this.cleanupCallbacks = [], this.resizeTimeout = null, this.isInitializing = !0,
15
- this.gantt = gantt, this.initializeDataZoom(config), this.setupEventListeners(),
16
- this.updateDataZoomLimits();
14
+ }, this.lastSpanLimits = null, this.cleanupCallbacks = [], this.resizeTimeout = null,
15
+ this.isInitializing = !0, this.gantt = gantt, this.initializeDataZoom(config), this.setupEventListeners(),
16
+ setTimeout((() => {
17
+ this.updateDataZoomLimits(), this.syncDataZoomToGanttView();
18
+ }), 0);
19
+ }
20
+ syncDataZoomToGanttView() {
21
+ var _a, _b, _c;
22
+ try {
23
+ const scrollLeft = (null === (_a = this.gantt.stateManager) || void 0 === _a ? void 0 : _a.scrollLeft) || 0, totalWidth = (null === (_c = (_b = this.gantt).getAllDateColsWidth) || void 0 === _c ? void 0 : _c.call(_b)) || 0, viewportWidth = this.gantt.tableNoFrameWidth || 0;
24
+ if (totalWidth > 0 && viewportWidth > 0) {
25
+ const start = Math.max(0, Math.min(1, scrollLeft / totalWidth)), end = Math.max(0, Math.min(1, (scrollLeft + viewportWidth) / totalWidth));
26
+ this.dataZoomAxis.setStartAndEnd(start, end);
27
+ }
28
+ } catch (error) {}
17
29
  }
18
30
  getContainerId(providedId) {
19
31
  if (providedId) return providedId;
@@ -104,12 +116,10 @@ class DataZoomIntegration {
104
116
  let start = null !== (_c = null !== (_a = event.start) && void 0 !== _a ? _a : null === (_b = event.detail) || void 0 === _b ? void 0 : _b.start) && void 0 !== _c ? _c : null === (_e = null === (_d = event.currentTarget) || void 0 === _d ? void 0 : _d.attribute) || void 0 === _e ? void 0 : _e.start, end = null !== (_h = null !== (_f = event.end) && void 0 !== _f ? _f : null === (_g = event.detail) || void 0 === _g ? void 0 : _g.end) && void 0 !== _h ? _h : null === (_k = null === (_j = event.currentTarget) || void 0 === _j ? void 0 : _j.attribute) || void 0 === _k ? void 0 : _k.end;
105
117
  void 0 !== start && void 0 !== end || (start = this.dataZoomAxis.attribute.start,
106
118
  end = this.dataZoomAxis.attribute.end), void 0 === start || void 0 === end || isNaN(start) || isNaN(end) || this.applyDataZoomRangeToGantt(start, end),
107
- setTimeout((() => {
108
- this.isUpdatingFromDataZoom = !1;
109
- }), 50);
119
+ this.updateDataZoomLimits(), this.isUpdatingFromDataZoom = !1;
110
120
  };
111
- this.dataZoomAxis.addEventListener("change", dataZoomChangeHandler), this.cleanupCallbacks.push((() => {
112
- this.dataZoomAxis.removeEventListener("change", dataZoomChangeHandler);
121
+ this.dataZoomAxis.addEventListener("dataZoomChange", dataZoomChangeHandler), this.cleanupCallbacks.push((() => {
122
+ this.dataZoomAxis.removeEventListener("dataZoomChange", dataZoomChangeHandler);
113
123
  }));
114
124
  const ganttScrollHandler = event => {
115
125
  if (this.isUpdatingFromDataZoom) return;
@@ -117,25 +127,22 @@ class DataZoomIntegration {
117
127
  this.isUpdatingFromGantt = !0;
118
128
  const boundaries = this.getGanttViewBoundaries();
119
129
  this.dataZoomAxis.setStartAndEnd(boundaries.startRatio, boundaries.endRatio), this.stage.render(),
120
- setTimeout((() => {
121
- this.dataZoomAxis.setAttribute("disableTriggerEvent", !1), this.isUpdatingFromGantt = !1;
122
- }), 10);
130
+ this.dataZoomAxis.setAttribute("disableTriggerEvent", !1), this.isUpdatingFromGantt = !1;
123
131
  };
124
132
  this.gantt.addEventListener("scroll", ganttScrollHandler), this.cleanupCallbacks.push((() => {
125
133
  this.gantt.removeEventListener("scroll", ganttScrollHandler);
126
134
  }));
127
135
  const windowResizeHandler = () => {
128
136
  clearTimeout(this.resizeTimeout), this.resizeTimeout = setTimeout((() => {
129
- this.updateResponsive(), this.updateDataZoomLimits();
130
- }), 50);
137
+ this.updateDataZoomLimits(), this.updateResponsive();
138
+ }), 70);
131
139
  };
132
140
  window.addEventListener("resize", windowResizeHandler), this.cleanupCallbacks.push((() => {
133
141
  window.removeEventListener("resize", windowResizeHandler), this.resizeTimeout && clearTimeout(this.resizeTimeout);
134
142
  }));
135
143
  const ganttZoomHandler = () => {
136
- setTimeout((() => {
137
- this.updateDataZoomLimits(), this.isUpdatingFromDataZoom || this.syncToDataZoom();
138
- }), 50);
144
+ this.isUpdatingFromDataZoom || (this.isUpdatingFromGantt = !0, this.updateDataZoomLimits(),
145
+ this.isUpdatingFromDataZoom || this.syncToDataZoom(), this.isUpdatingFromGantt = !1);
139
146
  };
140
147
  this.gantt.addEventListener("zoom", ganttZoomHandler), this.cleanupCallbacks.push((() => {
141
148
  this.gantt.removeEventListener("zoom", ganttZoomHandler);
@@ -157,10 +164,17 @@ class DataZoomIntegration {
157
164
  }
158
165
  updateDataZoomLimits() {
159
166
  const limits = this.calculateDataZoomLimits();
167
+ if (!(!this.lastSpanLimits || limits.minRangeRatio !== this.lastSpanLimits.minSpan || limits.maxRangeRatio !== this.lastSpanLimits.maxSpan)) return;
168
+ const start = this.lastDataZoomState.start, end = this.lastDataZoomState.end;
160
169
  this.dataZoomAxis.setAttributes({
170
+ minSpan: limits.minRangeRatio,
171
+ maxSpan: limits.maxRangeRatio,
172
+ start: start,
173
+ end: end
174
+ }), this.lastSpanLimits = {
161
175
  minSpan: limits.minRangeRatio,
162
176
  maxSpan: limits.maxRangeRatio
163
- }), this.stage.render();
177
+ }, this.stage.render();
164
178
  }
165
179
  getGanttViewBoundaries() {
166
180
  const scrollLeft = this.gantt.stateManager.scrollLeft, totalWidth = this.gantt.getAllDateColsWidth(), viewportWidth = this.gantt.tableNoFrameWidth;
@@ -238,9 +252,7 @@ class DataZoomIntegration {
238
252
  const taskTableWidth = this.gantt.taskTableWidth || 0, newWidth = ganttContainer.offsetWidth - taskTableWidth;
239
253
  this.resize(newWidth);
240
254
  const defaultX = this.gantt.taskTableWidth || 0;
241
- this.updatePosition(defaultX, 0), setTimeout((() => {
242
- this.syncToDataZoom();
243
- }), 10);
255
+ this.updatePosition(defaultX, 0), this.syncToDataZoom();
244
256
  }
245
257
  updatePosition(x, y) {
246
258
  var _a;