From d3f42c6b484df3e90c138bf61624775235653f24 Mon Sep 17 00:00:00 2001 From: "LINING-PC\\lining" Date: Wed, 24 Sep 2025 16:06:58 +0800 Subject: [PATCH 1/4] v1.3.1 - bugfix; SonarQube Upgrades --- src/components/DatePicker.vue | 39 ++-- src/components/MilestonePoint.vue | 34 +-- src/components/TaskBar.vue | 45 ++-- src/components/TaskList.vue | 30 +-- src/components/TaskRow.vue | 16 +- src/components/Timeline.vue | 338 ++++++++++-------------------- 6 files changed, 192 insertions(+), 310 deletions(-) diff --git a/src/components/DatePicker.vue b/src/components/DatePicker.vue index f843f7a..407ab88 100644 --- a/src/components/DatePicker.vue +++ b/src/components/DatePicker.vue @@ -168,7 +168,7 @@ watch( selectedTime.value = parsed.timeStr } }, - { immediate: true }, + { immediate: true } ) // 处理单日期输入变化(预留,当前版本不使用) @@ -297,7 +297,7 @@ const scrollToSelectedTime = () => { const containerHeight = 160 // el-time-column-list 的高度 const scrollTop = Math.max( 0, - selectedHourIndex * itemHeight - containerHeight / 2 + itemHeight / 2, + selectedHourIndex * itemHeight - containerHeight / 2 + itemHeight / 2 ) hourListRef.value.scrollTop = scrollTop } @@ -312,7 +312,7 @@ const scrollToSelectedTime = () => { const containerHeight = 160 const scrollTop = Math.max( 0, - selectedMinuteIndex * itemHeight - containerHeight / 2 + itemHeight / 2, + selectedMinuteIndex * itemHeight - containerHeight / 2 + itemHeight / 2 ) minuteListRef.value.scrollTop = scrollTop } @@ -365,18 +365,16 @@ const confirmDate = () => { emit('update:modelValue', newValue) emit('change', newValue) } - } else { - if (singleValue.value) { - // 格式化日期和时间 - const date = new Date(singleValue.value) - const dateFormat = `${date.getFullYear()}/${String(date.getMonth() + 1).padStart(2, '0')}/${String(date.getDate()).padStart(2, '0')}` - const formattedDateTime = selectedTime.value - ? `${dateFormat} ${selectedTime.value}` - : dateFormat + } else if (singleValue.value) { + // 格式化日期和时间 + const date = new Date(singleValue.value) + const dateFormat = `${date.getFullYear()}/${String(date.getMonth() + 1).padStart(2, '0')}/${String(date.getDate()).padStart(2, '0')}` + const formattedDateTime = selectedTime.value + ? `${dateFormat} ${selectedTime.value}` + : dateFormat - emit('update:modelValue', formattedDateTime) - emit('change', formattedDateTime) - } + emit('update:modelValue', formattedDateTime) + emit('change', formattedDateTime) } // 确认后关闭面板 @@ -746,14 +744,6 @@ const handlePickerBlur = () => { } } -// 时间选择器获得焦点时取消关闭 -const handleTimePickerFocus = () => { - if (blurTimer.value) { - clearTimeout(blurTimer.value) - blurTimer.value = null - } -} - // 时间选择器失去焦点时关闭 const handleTimePickerBlur = () => { blurTimer.value = setTimeout(() => { @@ -972,7 +962,7 @@ const timePickerStyle = computed(() => { tabindex="-1" @click.stop @mousedown.prevent - @focus="handleTimePickerFocus" + @focus="handlePickerFocus" @blur="handleTimePickerBlur" >
@@ -1157,8 +1147,9 @@ const timePickerStyle = computed(() => {
- + { mouseX: e.clientX, isDragging: isDragging.value, }, - }), + }) ) const deltaX = e.clientX - dragStartX.value @@ -179,7 +179,7 @@ const handleMouseUp = () => { mouseX: 0, isDragging: false, }, - }), + }) ) // 只有在真正拖拽了(有临时数据)且状态为拖拽中时才触发更新 @@ -241,7 +241,7 @@ const handleMilestoneClick = (e: MouseEvent) => { scrollLeft: targetScrollLeft, smooth: true, }, - }), + }) ) } } @@ -304,14 +304,14 @@ const milestoneStyle = computed(() => { const centerPosition = calculateMilestonePositionFromTimelineData( milestoneDate, props.timelineData, - props.currentTimeScale, + props.currentTimeScale ) left = centerPosition - size / 2 // 从中心位置偏移到图标左上角 } else { // 日视图:保持原有逻辑 const startDiff = Math.floor( - (milestoneDate.getTime() - props.startDate.getTime()) / (1000 * 60 * 60 * 24), + (milestoneDate.getTime() - props.startDate.getTime()) / (1000 * 60 * 60 * 24) ) left = startDiff * props.dayWidth + props.dayWidth / 2 - size / 2 } @@ -377,7 +377,7 @@ const milestoneVisibility = computed(() => { if (iconRight <= leftBoundary + iconSize / 2) { // 检查左侧是否有其他停靠的里程碑,需要判断推挤优先级 const leftStickyMilestones = otherMilestones.filter( - m => m.id !== currentId && m.stickyPosition === 'left' && m.isSticky, + m => m.id !== currentId && m.stickyPosition === 'left' && m.isSticky ) // 如果有其他里程碑已经停靠在左侧,比较优先级决定推挤顺序 @@ -423,7 +423,7 @@ const milestoneVisibility = computed(() => { if (iconLeft >= rightBoundary - iconSize / 2) { // 检查右侧是否有其他停靠的里程碑,需要判断推挤优先级 const rightStickyMilestones = otherMilestones.filter( - m => m.id !== currentId && m.stickyPosition === 'right' && m.isSticky, + m => m.id !== currentId && m.stickyPosition === 'right' && m.isSticky ) // 如果有其他里程碑已经停靠在右侧,比较优先级决定推挤顺序 @@ -581,13 +581,13 @@ const calculateYearViewMilestonePosition = (targetDate: Date, baseStartDate: Dat const daysInHalfYear = month <= 6 ? Math.floor( - (new Date(targetYear, 6, 1).getTime() - new Date(targetYear, 0, 1).getTime()) / - (1000 * 60 * 60 * 24), - ) + (new Date(targetYear, 6, 1).getTime() - new Date(targetYear, 0, 1).getTime()) / + (1000 * 60 * 60 * 24) + ) : Math.floor( - (new Date(targetYear + 1, 0, 1).getTime() - new Date(targetYear, 6, 1).getTime()) / - (1000 * 60 * 60 * 24), - ) + (new Date(targetYear + 1, 0, 1).getTime() - new Date(targetYear, 6, 1).getTime()) / + (1000 * 60 * 60 * 24) + ) const dayPositionInHalfYear = (dayOffset / daysInHalfYear) * halfYearWidth position += dayPositionInHalfYear @@ -601,12 +601,12 @@ const calculateHourViewMilestonePosition = (targetDate: Date, baseStartDate: Dat const targetNormalized = new Date( targetDate.getFullYear(), targetDate.getMonth(), - targetDate.getDate(), + targetDate.getDate() ) const baseNormalized = new Date( baseStartDate.getFullYear(), baseStartDate.getMonth(), - baseStartDate.getDate(), + baseStartDate.getDate() ) const timeDiff = targetNormalized.getTime() - baseNormalized.getTime() const daysDiff = Math.floor(timeDiff / (1000 * 60 * 60 * 24)) @@ -645,7 +645,7 @@ const calculateQuarterViewMilestonePosition = (targetDate: Date, baseStartDate: const month = targetDate.getMonth() + 1 // getMonth()返回0-11,需要+1 let quarter = 1 if (month >= 1 && month <= 3) { - quarter = 1 // Q1: 1-3月 + // Q1: 1-3月 } else if (month >= 4 && month <= 6) { quarter = 2 // Q2: 4-6月 } else if (month >= 7 && month <= 9) { @@ -694,7 +694,7 @@ const calculateQuarterViewMilestonePosition = (targetDate: Date, baseStartDate: const calculateMilestonePositionFromTimelineData = ( targetDate: Date, timelineData: any, - timeScale: TimelineScale, + timeScale: TimelineScale ) => { // 回退到原来的逻辑用于其他时间刻度 let cumulativePosition = 0 diff --git a/src/components/TaskBar.vue b/src/components/TaskBar.vue index db5ebf0..c7a93c0 100644 --- a/src/components/TaskBar.vue +++ b/src/components/TaskBar.vue @@ -198,13 +198,13 @@ const taskBarStyle = computed(() => { const startDateOnly = new Date( startDate.getFullYear(), startDate.getMonth(), - startDate.getDate(), + startDate.getDate() ) const endDateOnly = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate()) const baseStartOnly = new Date( baseStart.getFullYear(), baseStart.getMonth(), - baseStart.getDate(), + baseStart.getDate() ) if (props.currentTimeScale === TimelineScale.YEAR) { @@ -226,7 +226,7 @@ const taskBarStyle = computed(() => { const startPosition = calculatePositionFromTimelineData( startDateOnly, props.timelineData, - props.currentTimeScale, + props.currentTimeScale ) // 计算结束位置:为结束日期添加一天来获取正确的结束位置 const nextDay = new Date(endDateOnly) @@ -234,7 +234,7 @@ const taskBarStyle = computed(() => { let endPosition = calculatePositionFromTimelineData( nextDay, props.timelineData, - props.currentTimeScale, + props.currentTimeScale ) // 如果结束日期+1天超出范围,使用结束日期的位置+一天的宽度 @@ -249,7 +249,7 @@ const taskBarStyle = computed(() => { calculatePositionFromTimelineData( endDateOnly, props.timelineData, - props.currentTimeScale, + props.currentTimeScale ) + dayWidth } @@ -258,7 +258,7 @@ const taskBarStyle = computed(() => { } else { // 日视图:基于日期的简单计算 const startDiff = Math.floor( - (startDateOnly.getTime() - baseStartOnly.getTime()) / (1000 * 60 * 60 * 24), + (startDateOnly.getTime() - baseStartOnly.getTime()) / (1000 * 60 * 60 * 24) ) // 计算持续天数(基于日期,忽略时间) @@ -437,7 +437,7 @@ const handleMouseMove = (e: MouseEvent) => { mouseX: e.clientX, isDragging: isDragging.value || isResizingLeft.value || isResizingRight.value, }, - }), + }) ) if (isDragging.value) { @@ -560,7 +560,7 @@ const handleMouseMove = (e: MouseEvent) => { const newDurationDays = newWidth / props.dayWidth const newEndDate = addDaysToLocalDate( props.startDate, - resizeStartLeft.value / props.dayWidth + newDurationDays - 1, + resizeStartLeft.value / props.dayWidth + newDurationDays - 1 ) // 只更新临时数据,不触发事件 @@ -580,7 +580,7 @@ const handleMouseUp = () => { mouseX: 0, isDragging: false, }, - }), + }) ) // 如果有临时数据,说明发生了拖拽或拉伸,提交数据更新 @@ -661,7 +661,7 @@ watch( reportBarPosition() }) }, - { deep: true }, + { deep: true } ) // 处理TaskBar双击事件 @@ -951,7 +951,7 @@ watch( } }, 200) } - }, + } ) // 监听外部hideBubbles属性变化,确保Timeline的容器变化能及时反应 @@ -964,7 +964,7 @@ watch( // 强制重新计算bubbleIndicator,确保容器宽度变化后正确显示半圆 }) } - }, + } ) // 监听TaskBar可见性变化,只在滚动时实现重新出现动画 @@ -973,7 +973,7 @@ watch( () => { // TaskBar重新出现时,不需要动画效果 // 半圆会自然消失,TaskBar会立即显示 - }, + } ) // 监听页面缩放和大小变化,重新计算气泡位置 @@ -1133,13 +1133,13 @@ const calculateYearViewPosition = (targetDate: Date, baseStartDate: Date): numbe const daysInHalfYear = month <= 6 ? Math.floor( - (new Date(targetYear, 6, 1).getTime() - new Date(targetYear, 0, 1).getTime()) / - (1000 * 60 * 60 * 24), - ) + (new Date(targetYear, 6, 1).getTime() - new Date(targetYear, 0, 1).getTime()) / + (1000 * 60 * 60 * 24) + ) : Math.floor( - (new Date(targetYear + 1, 0, 1).getTime() - new Date(targetYear, 6, 1).getTime()) / - (1000 * 60 * 60 * 24), - ) + (new Date(targetYear + 1, 0, 1).getTime() - new Date(targetYear, 6, 1).getTime()) / + (1000 * 60 * 60 * 24) + ) const dayPositionInHalfYear = (dayOffset / daysInHalfYear) * halfYearWidth position += dayPositionInHalfYear @@ -1163,7 +1163,7 @@ const calculatePositionFromTimelineData = ( subDays: Array<{ date: Date; dayOfWeek?: number }> }> }>, - timeScale: TimelineScale, + timeScale: TimelineScale ) => { let cumulativePosition = 0 @@ -1181,11 +1181,11 @@ const calculatePositionFromTimelineData = ( // 找到目标日期所在的季度 const quarterWidth = 60 const daysInQuarter = Math.ceil( - (quarterEnd.getTime() - quarterStart.getTime()) / (1000 * 60 * 60 * 24), + (quarterEnd.getTime() - quarterStart.getTime()) / (1000 * 60 * 60 * 24) ) const dayWidth = quarterWidth / daysInQuarter const dayInQuarter = Math.ceil( - (targetDate.getTime() - quarterStart.getTime()) / (1000 * 60 * 60 * 24), + (targetDate.getTime() - quarterStart.getTime()) / (1000 * 60 * 60 * 24) ) return cumulativePosition + dayInQuarter * dayWidth } @@ -1434,7 +1434,6 @@ onUnmounted(() => { user-select: none; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); transition: box-shadow 0.2s; - /*min-width: 60px;*/ z-index: 100; border: 2px solid; overflow: visible; /* 允许内容超出 TaskBar */ diff --git a/src/components/TaskList.vue b/src/components/TaskList.vue index f0f3182..a429678 100644 --- a/src/components/TaskList.vue +++ b/src/components/TaskList.vue @@ -61,7 +61,7 @@ const handleTaskRowHover = (taskId: number | null) => { window.dispatchEvent( new CustomEvent('task-list-hover', { detail: taskId, - }), + }) ) } @@ -85,14 +85,14 @@ const handleTaskRowDoubleClick = (task: Task) => { window.dispatchEvent( new CustomEvent('task-row-double-click', { detail: task, - }), + }) ) } } // 计算父级任务的进度和日期范围 const calculateParentTaskData = ( - task: Task, + task: Task ): { progress: number; startDate: string; endDate: string } => { if (!task.children || task.children.length === 0) { return { @@ -198,7 +198,7 @@ watch( // 更新父级任务数据 updateParentTasksData() }, - { immediate: true, deep: true }, + { immediate: true, deep: true } ) function toggleCollapse(task: Task) { @@ -258,7 +258,7 @@ const handleRequestTaskList = () => { window.dispatchEvent( new CustomEvent('task-list-updated', { detail: allTasks, - }), + }) ) } @@ -297,7 +297,7 @@ const handleTaskListScroll = (event: Event) => { window.dispatchEvent( new CustomEvent('task-list-vertical-scroll', { detail: { scrollTop }, - }), + }) ) } @@ -319,7 +319,7 @@ const handleTaskRowContextMenu = (event: { task: Task; position: { x: number; y: window.dispatchEvent( new CustomEvent('context-menu', { detail: event, - }), + }) ) } catch (error) { console.error('TaskList - Failed to dispatch context-menu event', error) @@ -371,7 +371,7 @@ onUnmounted(() => { window.removeEventListener('timeline-task-hover', handleTimelineHover as EventListener) window.removeEventListener( 'timeline-vertical-scroll', - handleTimelineVerticalScroll as EventListener, + handleTimelineVerticalScroll as EventListener ) window.removeEventListener('milestone-icon-changed', handleMilestoneIconChange as EventListener) window.removeEventListener('splitter-drag-start', handleSplitterDragStart as EventListener) @@ -473,33 +473,33 @@ onUnmounted(() => { .col-name { flex: 2 0 300px; - min-width: 300px; + max-width: 300px; justify-content: flex-start; } .col-pre { flex: 1 0 120px; - min-width: 120px; + max-width: 120px; } .col-assignee { - flex: 1 0 120px; - min-width: 120px; + flex: 1 0 200px; + max-width: 200px; } .col-date { flex: 1.2 0 140px; - min-width: 140px; + max-width: 140px; } .col-hours { flex: 1 0 100px; - min-width: 100px; + max-width: 100px; } .col-progress { flex: 1 0 100px; - min-width: 100px; + max-width: 100px; } .task-list-body { diff --git a/src/components/TaskRow.vue b/src/components/TaskRow.vue index da43c9b..9ac5838 100644 --- a/src/components/TaskRow.vue +++ b/src/components/TaskRow.vue @@ -186,7 +186,7 @@ watch( updateTimer() } }, - { immediate: true }, + { immediate: true } ) // 右键菜单相关状态 @@ -596,33 +596,33 @@ onUnmounted(() => { .col-name { flex: 2 0 300px; - min-width: 300px; + max-width: 300px; justify-content: flex-start; } .col-pre { flex: 1 0 120px; - min-width: 120px; + max-width: 120px; } .col-assignee { - flex: 1 0 120px; - min-width: 120px; + flex: 1 0 200px; + max-width: 200px; } .col-date { flex: 1.2 0 140px; - min-width: 140px; + max-width: 140px; } .col-hours { flex: 1 0 100px; - min-width: 100px; + max-width: 100px; } .col-progress { flex: 1 0 100px; - min-width: 100px; + max-width: 100px; } .task-name-text { diff --git a/src/components/Timeline.vue b/src/components/Timeline.vue index a965a9d..62a7634 100644 --- a/src/components/Timeline.vue +++ b/src/components/Timeline.vue @@ -354,7 +354,7 @@ const optimizedTimelineData = computed(() => { const currentDay = new Date(day.year, day.month - 1, day.day) currentDay.setHours(0, 0, 0, 0) const daysDiff = Math.floor( - (currentDay.getTime() - dayStart.getTime()) / (1000 * 60 * 60 * 24), + (currentDay.getTime() - dayStart.getTime()) / (1000 * 60 * 60 * 24) ) const totalHourOffset = daysDiff * 24 @@ -455,7 +455,7 @@ const computeAllMilestonesPositions = () => { if (!isNaN(milestoneDate.getTime())) { const startDiff = Math.floor( (milestoneDate.getTime() - timelineConfig.value.startDate.getTime()) / - (1000 * 60 * 60 * 24), + (1000 * 60 * 60 * 24) ) const left = startDiff * 30 + 30 / 2 - 12 // 30是dayWidth,12是图标半径 @@ -489,7 +489,7 @@ const computeAllMilestonesPositions = () => { if (!isNaN(milestoneDate.getTime())) { const startDiff = Math.floor( (milestoneDate.getTime() - timelineConfig.value.startDate.getTime()) / - (1000 * 60 * 60 * 24), + (1000 * 60 * 60 * 24) ) const left = startDiff * 30 + 30 / 2 - 12 @@ -592,7 +592,7 @@ const handleTaskRowHover = (taskId: number | null) => { window.dispatchEvent( new CustomEvent('timeline-task-hover', { detail: taskId, - }), + }) ) } @@ -644,7 +644,7 @@ const handleMilestoneIconChange = (milestoneId: number, icon: string) => { window.dispatchEvent( new CustomEvent('milestone-icon-changed', { detail: { milestoneId, icon }, - }), + }) ) } @@ -662,7 +662,7 @@ const handleMilestoneSave = (updatedMilestone: Milestone) => { window.dispatchEvent( new CustomEvent('milestone-data-updated', { detail: { milestone: updatedMilestone }, - }), + }) ) } @@ -675,14 +675,14 @@ const handleMilestoneDelete = (milestoneId: number) => { window.dispatchEvent( new CustomEvent('milestone-deleted', { detail: { milestoneId }, - }), + }) ) // 广播里程碑数据变化事件,确保Timeline重新渲染 window.dispatchEvent( new CustomEvent('milestone-data-changed', { detail: { milestoneId }, - }), + }) ) } @@ -697,7 +697,7 @@ const handleMilestoneUpdate = (updatedMilestone: Milestone) => { window.dispatchEvent( new CustomEvent('milestone-data-updated', { detail: { milestone: updatedMilestone }, - }), + }) ) } @@ -997,7 +997,7 @@ watch( clearTimelineCache() timelineData.value = generateTimelineData() } - }, + } ) // 保证每次时间轴数据变化后都自动居中今日(仅初始化和外部props变更时触发,不因任务/里程碑变更触发) @@ -1012,7 +1012,7 @@ watch( }) } }, - { deep: true }, + { deep: true } ) // 将今日定位到时间线中间位置 @@ -1029,26 +1029,21 @@ const scrollToTodayCenter = (retry = 0) => { // 年度视图和季度视图需要使用实际的timeline绘制起始日期 let startNormalized: Date - if (currentTimeScale.value === TimelineScale.YEAR) { + if ( + currentTimeScale.value === TimelineScale.YEAR || + currentTimeScale.value === TimelineScale.QUARTER + ) { const yearRange = getYearTimelineRange() startNormalized = new Date( yearRange.startDate.getFullYear(), yearRange.startDate.getMonth(), - yearRange.startDate.getDate(), - ) - } else if (currentTimeScale.value === TimelineScale.QUARTER) { - // 季度视图使用与年度视图相同的基准日期,确保坐标系统一致 - const yearRange = getYearTimelineRange() - startNormalized = new Date( - yearRange.startDate.getFullYear(), - yearRange.startDate.getMonth(), - yearRange.startDate.getDate(), + yearRange.startDate.getDate() ) } else { startNormalized = new Date( timelineStart.getFullYear(), timelineStart.getMonth(), - timelineStart.getDate(), + timelineStart.getDate() ) } @@ -1091,7 +1086,7 @@ const scrollToTodayCenter = (retry = 0) => { const month = todayNormalized.getMonth() + 1 let quarter = 1 if (month >= 1 && month <= 3) { - quarter = 1 // Q1: 1-3月 + // Q1: 1-3月 } else if (month >= 4 && month <= 6) { quarter = 2 // Q2: 4-6月 } else if (month >= 7 && month <= 9) { @@ -1121,7 +1116,7 @@ const scrollToTodayCenter = (retry = 0) => { } const dayOffset = Math.floor( - (todayNormalized.getTime() - startOfQuarter.getTime()) / (1000 * 60 * 60 * 24), + (todayNormalized.getTime() - startOfQuarter.getTime()) / (1000 * 60 * 60 * 24) ) const daysInQuarter = Math.floor((endOfQuarter.getTime() - startOfQuarter.getTime()) / (1000 * 60 * 60 * 24)) + 1 @@ -1178,7 +1173,7 @@ const getTodayLinePositionInYearView = computed(() => { const startNormalized = new Date( yearRange.startDate.getFullYear(), yearRange.startDate.getMonth(), - yearRange.startDate.getDate(), + yearRange.startDate.getDate() ) const startYear = startNormalized.getFullYear() @@ -1272,7 +1267,7 @@ const scrollToToday = () => { const startNormalized = new Date( timelineStart.getFullYear(), timelineStart.getMonth(), - timelineStart.getDate(), + timelineStart.getDate() ) // 计算今天距离时间线开始日期的天数 @@ -1323,7 +1318,7 @@ const updateTask = (updatedTask: Task) => { window.dispatchEvent( new CustomEvent('task-updated', { detail: updatedTask, - }), + }) ) } @@ -1383,7 +1378,7 @@ const handleTaskBarContextMenu = (event: { task: Task; position: { x: number; y: window.dispatchEvent( new CustomEvent('context-menu', { detail: event, - }), + }) ) } @@ -1466,7 +1461,7 @@ onMounted(() => { // 监听TaskList的垂直滚动事件 window.addEventListener( 'task-list-vertical-scroll', - handleTaskListVerticalScroll as EventListener, + handleTaskListVerticalScroll as EventListener ) // 监听语言变化 window.addEventListener('locale-changed', handleLocaleChange as EventListener) @@ -1476,7 +1471,7 @@ onMounted(() => { // 监听Timeline容器resize事件(TaskList切换等) window.addEventListener( 'timeline-container-resized', - handleTimelineContainerResized as EventListener, + handleTimelineContainerResized as EventListener ) // 监听里程碑点击定位事件 @@ -1566,7 +1561,7 @@ const handleTimelineBodyScroll = (event: Event) => { window.dispatchEvent( new CustomEvent('timeline-vertical-scroll', { detail: { scrollTop }, - }), + }) ) } } @@ -1579,7 +1574,7 @@ watch( updateSvgSize() }) }, - { immediate: true }, + { immediate: true } ) // 拖拽滑动相关状态 @@ -1763,7 +1758,7 @@ const startAutoScroll = (direction: 'left' | 'right') => { window.dispatchEvent( new CustomEvent('timeline-auto-scroll', { detail: { scrollDelta: newScrollLeft - currentScrollLeft }, - }), + }) ) autoScrollTimer = window.setTimeout(scroll, 16) // 约60fps @@ -1817,14 +1812,14 @@ onUnmounted(() => { window.removeEventListener('task-list-hover', handleTaskListHover as EventListener) window.removeEventListener( 'task-list-vertical-scroll', - handleTaskListVerticalScroll as EventListener, + handleTaskListVerticalScroll as EventListener ) window.removeEventListener('locale-changed', handleLocaleChange as EventListener) window.removeEventListener('splitter-drag-start', handleSplitterDragStart as EventListener) window.removeEventListener('splitter-drag-end', handleSplitterDragEnd as EventListener) window.removeEventListener( 'timeline-container-resized', - handleTimelineContainerResized as EventListener, + handleTimelineContainerResized as EventListener ) window.removeEventListener('milestone-click-locate', handleMilestoneClickLocate as EventListener) window.removeEventListener('drag-boundary-check', handleDragBoundaryCheck as EventListener) @@ -1935,7 +1930,7 @@ watch( } }) }, - { deep: true }, + { deep: true } ) // 处理里程碑点击定位事件 @@ -3471,152 +3466,6 @@ const handleAddSuccessor = (task: Task) => { opacity: 0.15; } -/* 小时视图专用样式 */ -.date-row { - min-height: 40px; - border-bottom: 1px solid var(--gantt-border-medium, #e1e4e8); - position: relative; - overflow: hidden; -} - -.hours-row { - min-height: 40px; - border-bottom: 1px solid var(--gantt-border-light, #d1d5da); - position: relative; - overflow: hidden; -} - -.timeline-day-item { - border-right: 1px solid var(--gantt-border-medium, #e1e4e8); - background-color: var(--gantt-bg-secondary, #f6f8fa); - display: flex; - align-items: center; - justify-content: center; - min-height: 40px; - box-sizing: border-box; -} - -/* 小时视图日期项专用样式 */ -.timeline-day-item.hour-view-day { - position: absolute; - top: 0; - height: 100%; - border-right: 1px solid var(--gantt-border-medium, #e1e4e8); - background-color: var(--gantt-bg-secondary, #f6f8fa); -} - -.timeline-hour-item { - height: 100%; - border-right: 1px solid var(--gantt-border-light, #d1d5da); - display: flex; - align-items: center; - justify-content: center; - min-height: 40px; - transition: background-color 0.2s ease; - box-sizing: border-box; - flex-shrink: 0; -} - -.hour-column { - position: absolute; - top: 0; - border-right: 1px solid var(--gantt-border-light, #d1d5da); - transition: background-color 0.2s ease; - box-sizing: border-box; -} - -.date-label { - color: var(--gantt-text-header, #24292e); - font-weight: 600; - font-size: 14px; - line-height: 1.5; - text-align: center; -} - -.hours-row { - min-height: 40px; - border-bottom: 1px solid var(--gantt-border-light, #d1d5da); - position: relative; - overflow: hidden; - display: flex; -} - -.timeline-hour-item { - height: 100%; - border-right: 1px solid var(--gantt-border-light, #d1d5da); - display: flex; - align-items: center; - justify-content: center; - min-height: 40px; - transition: background-color 0.2s ease; - box-sizing: border-box; - flex-shrink: 0; -} - -.timeline-hour-item.today { - background-color: var(--gantt-primary); - color: var(--gantt-text-white); -} - -.hour-label { - color: var(--gantt-text-primary, #24292e); - font-weight: 600; - font-size: 13px; - line-height: 1.3; - text-align: center; - letter-spacing: 0px; -} - -.timeline-hour-item.today .hour-label { - color: var(--gantt-text-white); -} - -.hour-column { - border-right: 1px solid var(--gantt-border-light, #d1d5da); - position: relative; - transition: background-color 0.2s ease; - box-sizing: border-box; -} - -.hour-column.weekend { - background-color: var(--gantt-bg-secondary, #f5f7fa); - opacity: 0.6; -} - -.hour-column.rest-hour { - background-color: var(--gantt-bg-secondary, #f5f7fa); - opacity: 0.6; -} - -.hour-column.working-hour { - background-color: var(--gantt-bg-primary, #ffffff); -} - -.hour-column.today { - background-color: var(--gantt-primary-color, #409eff); - opacity: 0.2; - border-left: 2px solid var(--gantt-primary-color, #409eff); -} - -/* 15分钟刻度线样式 */ -.quarter-hour-lines { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - pointer-events: none; -} - -.quarter-line { - position: absolute; - top: 0; - bottom: 0; - width: 1px; - background-color: var(--gantt-border-light, #d1d5da); - opacity: 0.5; -} - /* 年度视图样式 */ .half-years-row { min-height: 36px; @@ -3781,13 +3630,7 @@ const handleAddSuccessor = (task: Task) => { overflow: hidden; } -.hours-row { - min-height: 40px; - border-bottom: 1px solid var(--gantt-border-light, #d1d5da); - position: relative; - overflow: hidden; -} - +/*---------------*/ .timeline-day-item { top: 0; height: 100%; @@ -3800,6 +3643,60 @@ const handleAddSuccessor = (task: Task) => { box-sizing: border-box; } +/* 小时视图日期项专用样式 */ +.timeline-day-item.hour-view-day { + position: absolute; + top: 0; + height: 100%; + border-right: 1px solid var(--gantt-border-medium, #e1e4e8); + background-color: var(--gantt-bg-secondary, #f6f8fa); +} + +.date-label { + color: var(--gantt-text-header, #24292e); + font-weight: 600; + font-size: 14px; + line-height: 1.5; + text-align: center; +} + +.hours-row { + min-height: 40px; + border-bottom: 1px solid var(--gantt-border-light, #d1d5da); + position: relative; + overflow: hidden; + display: flex; +} + +.hour-label { + color: var(--gantt-text-primary, #24292e); + font-weight: 600; + font-size: 13px; + line-height: 1.3; + text-align: center; + letter-spacing: 0px; +} + +/* 15分钟刻度线样式 */ +.quarter-hour-lines { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + pointer-events: none; +} + +.quarter-line { + position: absolute; + top: 0; + bottom: 0; + width: 1px; + background-color: var(--gantt-border-light, #d1d5da); + opacity: 0.5; +} +/**------------------------ */ + .timeline-hour-item { top: 0; height: 100%; @@ -3810,6 +3707,16 @@ const handleAddSuccessor = (task: Task) => { min-height: 40px; transition: background-color 0.2s ease; box-sizing: border-box; + flex-shrink: 0; +} + +.timeline-hour-item.today { + background-color: var(--gantt-primary); + color: var(--gantt-text-white); +} + +.timeline-hour-item.today .hour-label { + color: var(--gantt-text-white); } /* 小时视图非工作时间样式 - 参考日视图周末样式 */ @@ -3826,61 +3733,46 @@ const handleAddSuccessor = (task: Task) => { position: relative; min-width: 100%; min-height: 100px; + display: flex; } .hour-column { position: absolute; top: 0; bottom: 0; - border-right: 1px solid var(--gantt-border-light, #d1d5da); - pointer-events: none; - background-color: transparent; - z-index: 1; -} - -.hour-column:hover { - background-color: var(--gantt-hover-bg, rgba(0, 123, 255, 0.1)); -} -.hour-columns-container { - position: relative; - display: flex; - min-width: 100%; -} - -/* 小时视图header容器 */ -.hour-header-container { - position: relative; - min-width: 100%; -} - -.date-row { - min-height: 40px; - border-bottom: 1px solid var(--gantt-border-light, #d1d5da); - position: relative; - overflow: hidden; -} - -.hour-column { border-right: 1px solid var(--gantt-border-light, #e0e6ed); background-color: var(--gantt-bg-primary, #ffffff); transition: background-color 0.2s ease; box-sizing: border-box; flex-shrink: 0; + pointer-events: none; + z-index: 1; } -.hour-column:hover { - background-color: var(--gantt-bg-hover, rgba(64, 158, 255, 0.05)); +.hour-column.weekend { + background-color: var(--gantt-bg-secondary, #f5f7fa); + opacity: 0.6; } -.hour-column.today { - background-color: var(--gantt-primary-color, #f0f9ff); - border-left: 2px solid var(--gantt-primary-color, #409eff); +.hour-column.rest-hour { + background-color: var(--gantt-bg-secondary, #f5f7fa); + opacity: 0.6; } .hour-column.working-hour { background-color: var(--gantt-bg-primary, #ffffff); } +.hour-column.today { + background-color: var(--gantt-primary-color, #409eff); + opacity: 0.2; + border-left: 2px solid var(--gantt-primary-color, #409eff); +} + +.hour-column:hover { + background-color: var(--gantt-bg-hover, rgba(64, 158, 255, 0.05)); +} + /* 小时视图暗色主题样式 */ :global(html[data-theme='dark']) .date-row { background: var(--gantt-bg-secondary, #1a1a1a) !important; From c66e2209b8003f47e77561bc599b190d0379aa47 Mon Sep 17 00:00:00 2001 From: "LINING-PC\\lining" Date: Wed, 24 Sep 2025 16:10:39 +0800 Subject: [PATCH 2/4] v1.3.2 - Bugfix; SonarQube Upgrades. --- src/components/DatePicker.vue | 6 ++-- src/components/MilestonePoint.vue | 32 +++++++++---------- src/components/TaskBar.vue | 44 +++++++++++++------------- src/components/TaskList.vue | 16 +++++----- src/components/TaskRow.vue | 2 +- src/components/Timeline.vue | 52 +++++++++++++++---------------- 6 files changed, 76 insertions(+), 76 deletions(-) diff --git a/src/components/DatePicker.vue b/src/components/DatePicker.vue index 407ab88..b788ced 100644 --- a/src/components/DatePicker.vue +++ b/src/components/DatePicker.vue @@ -168,7 +168,7 @@ watch( selectedTime.value = parsed.timeStr } }, - { immediate: true } + { immediate: true }, ) // 处理单日期输入变化(预留,当前版本不使用) @@ -297,7 +297,7 @@ const scrollToSelectedTime = () => { const containerHeight = 160 // el-time-column-list 的高度 const scrollTop = Math.max( 0, - selectedHourIndex * itemHeight - containerHeight / 2 + itemHeight / 2 + selectedHourIndex * itemHeight - containerHeight / 2 + itemHeight / 2, ) hourListRef.value.scrollTop = scrollTop } @@ -312,7 +312,7 @@ const scrollToSelectedTime = () => { const containerHeight = 160 const scrollTop = Math.max( 0, - selectedMinuteIndex * itemHeight - containerHeight / 2 + itemHeight / 2 + selectedMinuteIndex * itemHeight - containerHeight / 2 + itemHeight / 2, ) minuteListRef.value.scrollTop = scrollTop } diff --git a/src/components/MilestonePoint.vue b/src/components/MilestonePoint.vue index 6b6c859..20b5657 100644 --- a/src/components/MilestonePoint.vue +++ b/src/components/MilestonePoint.vue @@ -152,7 +152,7 @@ const handleMouseMove = (e: MouseEvent) => { mouseX: e.clientX, isDragging: isDragging.value, }, - }) + }), ) const deltaX = e.clientX - dragStartX.value @@ -179,7 +179,7 @@ const handleMouseUp = () => { mouseX: 0, isDragging: false, }, - }) + }), ) // 只有在真正拖拽了(有临时数据)且状态为拖拽中时才触发更新 @@ -241,7 +241,7 @@ const handleMilestoneClick = (e: MouseEvent) => { scrollLeft: targetScrollLeft, smooth: true, }, - }) + }), ) } } @@ -304,14 +304,14 @@ const milestoneStyle = computed(() => { const centerPosition = calculateMilestonePositionFromTimelineData( milestoneDate, props.timelineData, - props.currentTimeScale + props.currentTimeScale, ) left = centerPosition - size / 2 // 从中心位置偏移到图标左上角 } else { // 日视图:保持原有逻辑 const startDiff = Math.floor( - (milestoneDate.getTime() - props.startDate.getTime()) / (1000 * 60 * 60 * 24) + (milestoneDate.getTime() - props.startDate.getTime()) / (1000 * 60 * 60 * 24), ) left = startDiff * props.dayWidth + props.dayWidth / 2 - size / 2 } @@ -377,7 +377,7 @@ const milestoneVisibility = computed(() => { if (iconRight <= leftBoundary + iconSize / 2) { // 检查左侧是否有其他停靠的里程碑,需要判断推挤优先级 const leftStickyMilestones = otherMilestones.filter( - m => m.id !== currentId && m.stickyPosition === 'left' && m.isSticky + m => m.id !== currentId && m.stickyPosition === 'left' && m.isSticky, ) // 如果有其他里程碑已经停靠在左侧,比较优先级决定推挤顺序 @@ -423,7 +423,7 @@ const milestoneVisibility = computed(() => { if (iconLeft >= rightBoundary - iconSize / 2) { // 检查右侧是否有其他停靠的里程碑,需要判断推挤优先级 const rightStickyMilestones = otherMilestones.filter( - m => m.id !== currentId && m.stickyPosition === 'right' && m.isSticky + m => m.id !== currentId && m.stickyPosition === 'right' && m.isSticky, ) // 如果有其他里程碑已经停靠在右侧,比较优先级决定推挤顺序 @@ -581,13 +581,13 @@ const calculateYearViewMilestonePosition = (targetDate: Date, baseStartDate: Dat const daysInHalfYear = month <= 6 ? Math.floor( - (new Date(targetYear, 6, 1).getTime() - new Date(targetYear, 0, 1).getTime()) / - (1000 * 60 * 60 * 24) - ) + (new Date(targetYear, 6, 1).getTime() - new Date(targetYear, 0, 1).getTime()) / + (1000 * 60 * 60 * 24), + ) : Math.floor( - (new Date(targetYear + 1, 0, 1).getTime() - new Date(targetYear, 6, 1).getTime()) / - (1000 * 60 * 60 * 24) - ) + (new Date(targetYear + 1, 0, 1).getTime() - new Date(targetYear, 6, 1).getTime()) / + (1000 * 60 * 60 * 24), + ) const dayPositionInHalfYear = (dayOffset / daysInHalfYear) * halfYearWidth position += dayPositionInHalfYear @@ -601,12 +601,12 @@ const calculateHourViewMilestonePosition = (targetDate: Date, baseStartDate: Dat const targetNormalized = new Date( targetDate.getFullYear(), targetDate.getMonth(), - targetDate.getDate() + targetDate.getDate(), ) const baseNormalized = new Date( baseStartDate.getFullYear(), baseStartDate.getMonth(), - baseStartDate.getDate() + baseStartDate.getDate(), ) const timeDiff = targetNormalized.getTime() - baseNormalized.getTime() const daysDiff = Math.floor(timeDiff / (1000 * 60 * 60 * 24)) @@ -694,7 +694,7 @@ const calculateQuarterViewMilestonePosition = (targetDate: Date, baseStartDate: const calculateMilestonePositionFromTimelineData = ( targetDate: Date, timelineData: any, - timeScale: TimelineScale + timeScale: TimelineScale, ) => { // 回退到原来的逻辑用于其他时间刻度 let cumulativePosition = 0 diff --git a/src/components/TaskBar.vue b/src/components/TaskBar.vue index c7a93c0..d2eeb08 100644 --- a/src/components/TaskBar.vue +++ b/src/components/TaskBar.vue @@ -198,13 +198,13 @@ const taskBarStyle = computed(() => { const startDateOnly = new Date( startDate.getFullYear(), startDate.getMonth(), - startDate.getDate() + startDate.getDate(), ) const endDateOnly = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate()) const baseStartOnly = new Date( baseStart.getFullYear(), baseStart.getMonth(), - baseStart.getDate() + baseStart.getDate(), ) if (props.currentTimeScale === TimelineScale.YEAR) { @@ -226,7 +226,7 @@ const taskBarStyle = computed(() => { const startPosition = calculatePositionFromTimelineData( startDateOnly, props.timelineData, - props.currentTimeScale + props.currentTimeScale, ) // 计算结束位置:为结束日期添加一天来获取正确的结束位置 const nextDay = new Date(endDateOnly) @@ -234,7 +234,7 @@ const taskBarStyle = computed(() => { let endPosition = calculatePositionFromTimelineData( nextDay, props.timelineData, - props.currentTimeScale + props.currentTimeScale, ) // 如果结束日期+1天超出范围,使用结束日期的位置+一天的宽度 @@ -249,7 +249,7 @@ const taskBarStyle = computed(() => { calculatePositionFromTimelineData( endDateOnly, props.timelineData, - props.currentTimeScale + props.currentTimeScale, ) + dayWidth } @@ -258,7 +258,7 @@ const taskBarStyle = computed(() => { } else { // 日视图:基于日期的简单计算 const startDiff = Math.floor( - (startDateOnly.getTime() - baseStartOnly.getTime()) / (1000 * 60 * 60 * 24) + (startDateOnly.getTime() - baseStartOnly.getTime()) / (1000 * 60 * 60 * 24), ) // 计算持续天数(基于日期,忽略时间) @@ -437,7 +437,7 @@ const handleMouseMove = (e: MouseEvent) => { mouseX: e.clientX, isDragging: isDragging.value || isResizingLeft.value || isResizingRight.value, }, - }) + }), ) if (isDragging.value) { @@ -560,7 +560,7 @@ const handleMouseMove = (e: MouseEvent) => { const newDurationDays = newWidth / props.dayWidth const newEndDate = addDaysToLocalDate( props.startDate, - resizeStartLeft.value / props.dayWidth + newDurationDays - 1 + resizeStartLeft.value / props.dayWidth + newDurationDays - 1, ) // 只更新临时数据,不触发事件 @@ -580,7 +580,7 @@ const handleMouseUp = () => { mouseX: 0, isDragging: false, }, - }) + }), ) // 如果有临时数据,说明发生了拖拽或拉伸,提交数据更新 @@ -661,7 +661,7 @@ watch( reportBarPosition() }) }, - { deep: true } + { deep: true }, ) // 处理TaskBar双击事件 @@ -951,7 +951,7 @@ watch( } }, 200) } - } + }, ) // 监听外部hideBubbles属性变化,确保Timeline的容器变化能及时反应 @@ -964,7 +964,7 @@ watch( // 强制重新计算bubbleIndicator,确保容器宽度变化后正确显示半圆 }) } - } + }, ) // 监听TaskBar可见性变化,只在滚动时实现重新出现动画 @@ -973,7 +973,7 @@ watch( () => { // TaskBar重新出现时,不需要动画效果 // 半圆会自然消失,TaskBar会立即显示 - } + }, ) // 监听页面缩放和大小变化,重新计算气泡位置 @@ -1133,13 +1133,13 @@ const calculateYearViewPosition = (targetDate: Date, baseStartDate: Date): numbe const daysInHalfYear = month <= 6 ? Math.floor( - (new Date(targetYear, 6, 1).getTime() - new Date(targetYear, 0, 1).getTime()) / - (1000 * 60 * 60 * 24) - ) + (new Date(targetYear, 6, 1).getTime() - new Date(targetYear, 0, 1).getTime()) / + (1000 * 60 * 60 * 24), + ) : Math.floor( - (new Date(targetYear + 1, 0, 1).getTime() - new Date(targetYear, 6, 1).getTime()) / - (1000 * 60 * 60 * 24) - ) + (new Date(targetYear + 1, 0, 1).getTime() - new Date(targetYear, 6, 1).getTime()) / + (1000 * 60 * 60 * 24), + ) const dayPositionInHalfYear = (dayOffset / daysInHalfYear) * halfYearWidth position += dayPositionInHalfYear @@ -1163,7 +1163,7 @@ const calculatePositionFromTimelineData = ( subDays: Array<{ date: Date; dayOfWeek?: number }> }> }>, - timeScale: TimelineScale + timeScale: TimelineScale, ) => { let cumulativePosition = 0 @@ -1181,11 +1181,11 @@ const calculatePositionFromTimelineData = ( // 找到目标日期所在的季度 const quarterWidth = 60 const daysInQuarter = Math.ceil( - (quarterEnd.getTime() - quarterStart.getTime()) / (1000 * 60 * 60 * 24) + (quarterEnd.getTime() - quarterStart.getTime()) / (1000 * 60 * 60 * 24), ) const dayWidth = quarterWidth / daysInQuarter const dayInQuarter = Math.ceil( - (targetDate.getTime() - quarterStart.getTime()) / (1000 * 60 * 60 * 24) + (targetDate.getTime() - quarterStart.getTime()) / (1000 * 60 * 60 * 24), ) return cumulativePosition + dayInQuarter * dayWidth } diff --git a/src/components/TaskList.vue b/src/components/TaskList.vue index a429678..9488970 100644 --- a/src/components/TaskList.vue +++ b/src/components/TaskList.vue @@ -61,7 +61,7 @@ const handleTaskRowHover = (taskId: number | null) => { window.dispatchEvent( new CustomEvent('task-list-hover', { detail: taskId, - }) + }), ) } @@ -85,14 +85,14 @@ const handleTaskRowDoubleClick = (task: Task) => { window.dispatchEvent( new CustomEvent('task-row-double-click', { detail: task, - }) + }), ) } } // 计算父级任务的进度和日期范围 const calculateParentTaskData = ( - task: Task + task: Task, ): { progress: number; startDate: string; endDate: string } => { if (!task.children || task.children.length === 0) { return { @@ -198,7 +198,7 @@ watch( // 更新父级任务数据 updateParentTasksData() }, - { immediate: true, deep: true } + { immediate: true, deep: true }, ) function toggleCollapse(task: Task) { @@ -258,7 +258,7 @@ const handleRequestTaskList = () => { window.dispatchEvent( new CustomEvent('task-list-updated', { detail: allTasks, - }) + }), ) } @@ -297,7 +297,7 @@ const handleTaskListScroll = (event: Event) => { window.dispatchEvent( new CustomEvent('task-list-vertical-scroll', { detail: { scrollTop }, - }) + }), ) } @@ -319,7 +319,7 @@ const handleTaskRowContextMenu = (event: { task: Task; position: { x: number; y: window.dispatchEvent( new CustomEvent('context-menu', { detail: event, - }) + }), ) } catch (error) { console.error('TaskList - Failed to dispatch context-menu event', error) @@ -371,7 +371,7 @@ onUnmounted(() => { window.removeEventListener('timeline-task-hover', handleTimelineHover as EventListener) window.removeEventListener( 'timeline-vertical-scroll', - handleTimelineVerticalScroll as EventListener + handleTimelineVerticalScroll as EventListener, ) window.removeEventListener('milestone-icon-changed', handleMilestoneIconChange as EventListener) window.removeEventListener('splitter-drag-start', handleSplitterDragStart as EventListener) diff --git a/src/components/TaskRow.vue b/src/components/TaskRow.vue index 9ac5838..b960829 100644 --- a/src/components/TaskRow.vue +++ b/src/components/TaskRow.vue @@ -186,7 +186,7 @@ watch( updateTimer() } }, - { immediate: true } + { immediate: true }, ) // 右键菜单相关状态 diff --git a/src/components/Timeline.vue b/src/components/Timeline.vue index 62a7634..0e8ed34 100644 --- a/src/components/Timeline.vue +++ b/src/components/Timeline.vue @@ -354,7 +354,7 @@ const optimizedTimelineData = computed(() => { const currentDay = new Date(day.year, day.month - 1, day.day) currentDay.setHours(0, 0, 0, 0) const daysDiff = Math.floor( - (currentDay.getTime() - dayStart.getTime()) / (1000 * 60 * 60 * 24) + (currentDay.getTime() - dayStart.getTime()) / (1000 * 60 * 60 * 24), ) const totalHourOffset = daysDiff * 24 @@ -455,7 +455,7 @@ const computeAllMilestonesPositions = () => { if (!isNaN(milestoneDate.getTime())) { const startDiff = Math.floor( (milestoneDate.getTime() - timelineConfig.value.startDate.getTime()) / - (1000 * 60 * 60 * 24) + (1000 * 60 * 60 * 24), ) const left = startDiff * 30 + 30 / 2 - 12 // 30是dayWidth,12是图标半径 @@ -489,7 +489,7 @@ const computeAllMilestonesPositions = () => { if (!isNaN(milestoneDate.getTime())) { const startDiff = Math.floor( (milestoneDate.getTime() - timelineConfig.value.startDate.getTime()) / - (1000 * 60 * 60 * 24) + (1000 * 60 * 60 * 24), ) const left = startDiff * 30 + 30 / 2 - 12 @@ -592,7 +592,7 @@ const handleTaskRowHover = (taskId: number | null) => { window.dispatchEvent( new CustomEvent('timeline-task-hover', { detail: taskId, - }) + }), ) } @@ -644,7 +644,7 @@ const handleMilestoneIconChange = (milestoneId: number, icon: string) => { window.dispatchEvent( new CustomEvent('milestone-icon-changed', { detail: { milestoneId, icon }, - }) + }), ) } @@ -662,7 +662,7 @@ const handleMilestoneSave = (updatedMilestone: Milestone) => { window.dispatchEvent( new CustomEvent('milestone-data-updated', { detail: { milestone: updatedMilestone }, - }) + }), ) } @@ -675,14 +675,14 @@ const handleMilestoneDelete = (milestoneId: number) => { window.dispatchEvent( new CustomEvent('milestone-deleted', { detail: { milestoneId }, - }) + }), ) // 广播里程碑数据变化事件,确保Timeline重新渲染 window.dispatchEvent( new CustomEvent('milestone-data-changed', { detail: { milestoneId }, - }) + }), ) } @@ -697,7 +697,7 @@ const handleMilestoneUpdate = (updatedMilestone: Milestone) => { window.dispatchEvent( new CustomEvent('milestone-data-updated', { detail: { milestone: updatedMilestone }, - }) + }), ) } @@ -997,7 +997,7 @@ watch( clearTimelineCache() timelineData.value = generateTimelineData() } - } + }, ) // 保证每次时间轴数据变化后都自动居中今日(仅初始化和外部props变更时触发,不因任务/里程碑变更触发) @@ -1012,7 +1012,7 @@ watch( }) } }, - { deep: true } + { deep: true }, ) // 将今日定位到时间线中间位置 @@ -1037,13 +1037,13 @@ const scrollToTodayCenter = (retry = 0) => { startNormalized = new Date( yearRange.startDate.getFullYear(), yearRange.startDate.getMonth(), - yearRange.startDate.getDate() + yearRange.startDate.getDate(), ) } else { startNormalized = new Date( timelineStart.getFullYear(), timelineStart.getMonth(), - timelineStart.getDate() + timelineStart.getDate(), ) } @@ -1116,7 +1116,7 @@ const scrollToTodayCenter = (retry = 0) => { } const dayOffset = Math.floor( - (todayNormalized.getTime() - startOfQuarter.getTime()) / (1000 * 60 * 60 * 24) + (todayNormalized.getTime() - startOfQuarter.getTime()) / (1000 * 60 * 60 * 24), ) const daysInQuarter = Math.floor((endOfQuarter.getTime() - startOfQuarter.getTime()) / (1000 * 60 * 60 * 24)) + 1 @@ -1173,7 +1173,7 @@ const getTodayLinePositionInYearView = computed(() => { const startNormalized = new Date( yearRange.startDate.getFullYear(), yearRange.startDate.getMonth(), - yearRange.startDate.getDate() + yearRange.startDate.getDate(), ) const startYear = startNormalized.getFullYear() @@ -1267,7 +1267,7 @@ const scrollToToday = () => { const startNormalized = new Date( timelineStart.getFullYear(), timelineStart.getMonth(), - timelineStart.getDate() + timelineStart.getDate(), ) // 计算今天距离时间线开始日期的天数 @@ -1318,7 +1318,7 @@ const updateTask = (updatedTask: Task) => { window.dispatchEvent( new CustomEvent('task-updated', { detail: updatedTask, - }) + }), ) } @@ -1378,7 +1378,7 @@ const handleTaskBarContextMenu = (event: { task: Task; position: { x: number; y: window.dispatchEvent( new CustomEvent('context-menu', { detail: event, - }) + }), ) } @@ -1461,7 +1461,7 @@ onMounted(() => { // 监听TaskList的垂直滚动事件 window.addEventListener( 'task-list-vertical-scroll', - handleTaskListVerticalScroll as EventListener + handleTaskListVerticalScroll as EventListener, ) // 监听语言变化 window.addEventListener('locale-changed', handleLocaleChange as EventListener) @@ -1471,7 +1471,7 @@ onMounted(() => { // 监听Timeline容器resize事件(TaskList切换等) window.addEventListener( 'timeline-container-resized', - handleTimelineContainerResized as EventListener + handleTimelineContainerResized as EventListener, ) // 监听里程碑点击定位事件 @@ -1561,7 +1561,7 @@ const handleTimelineBodyScroll = (event: Event) => { window.dispatchEvent( new CustomEvent('timeline-vertical-scroll', { detail: { scrollTop }, - }) + }), ) } } @@ -1574,7 +1574,7 @@ watch( updateSvgSize() }) }, - { immediate: true } + { immediate: true }, ) // 拖拽滑动相关状态 @@ -1758,7 +1758,7 @@ const startAutoScroll = (direction: 'left' | 'right') => { window.dispatchEvent( new CustomEvent('timeline-auto-scroll', { detail: { scrollDelta: newScrollLeft - currentScrollLeft }, - }) + }), ) autoScrollTimer = window.setTimeout(scroll, 16) // 约60fps @@ -1812,14 +1812,14 @@ onUnmounted(() => { window.removeEventListener('task-list-hover', handleTaskListHover as EventListener) window.removeEventListener( 'task-list-vertical-scroll', - handleTaskListVerticalScroll as EventListener + handleTaskListVerticalScroll as EventListener, ) window.removeEventListener('locale-changed', handleLocaleChange as EventListener) window.removeEventListener('splitter-drag-start', handleSplitterDragStart as EventListener) window.removeEventListener('splitter-drag-end', handleSplitterDragEnd as EventListener) window.removeEventListener( 'timeline-container-resized', - handleTimelineContainerResized as EventListener + handleTimelineContainerResized as EventListener, ) window.removeEventListener('milestone-click-locate', handleMilestoneClickLocate as EventListener) window.removeEventListener('drag-boundary-check', handleDragBoundaryCheck as EventListener) @@ -1930,7 +1930,7 @@ watch( } }) }, - { deep: true } + { deep: true }, ) // 处理里程碑点击定位事件 From 1899f846027386ebe794061f5d15648ec86ddb5f Mon Sep 17 00:00:00 2001 From: "LINING-PC\\lining" Date: Wed, 24 Sep 2025 16:34:39 +0800 Subject: [PATCH 3/4] v1.3.2 - Descriptions update --- demo/version-history.json | 10 ++++++++++ package.json | 2 +- packageDemo/version-history.json | 10 ++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/demo/version-history.json b/demo/version-history.json index db38be4..28b755e 100644 --- a/demo/version-history.json +++ b/demo/version-history.json @@ -180,5 +180,15 @@ "SonarQube代码质量检查问题修改", "SonarQube code quality inspection issue modification" ] + }, + { + "version": "1.3.2", + "date": "2025-09-24", + "notes": [ + "Bugfix", + "Bugfix", + "SonarQube代码质量检查问题修改", + "SonarQube code quality inspection issue modification" + ] } ] diff --git a/package.json b/package.json index fd411b1..0582cbd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jordium-gantt-vue3", - "version": "1.3.0", + "version": "1.3.2", "type": "module", "main": "dist/jordium-gantt-vue3.cjs.js", "module": "dist/jordium-gantt-vue3.es.js", diff --git a/packageDemo/version-history.json b/packageDemo/version-history.json index db38be4..28b755e 100644 --- a/packageDemo/version-history.json +++ b/packageDemo/version-history.json @@ -180,5 +180,15 @@ "SonarQube代码质量检查问题修改", "SonarQube code quality inspection issue modification" ] + }, + { + "version": "1.3.2", + "date": "2025-09-24", + "notes": [ + "Bugfix", + "Bugfix", + "SonarQube代码质量检查问题修改", + "SonarQube code quality inspection issue modification" + ] } ] From 254f19f18443634efcf49ebce3007027986ced9f Mon Sep 17 00:00:00 2001 From: "LINING-PC\\lining" Date: Wed, 24 Sep 2025 16:35:44 +0800 Subject: [PATCH 4/4] v1.3.2 - version history updates --- packageDemo/version-history.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packageDemo/version-history.json b/packageDemo/version-history.json index 28b755e..47d0d58 100644 --- a/packageDemo/version-history.json +++ b/packageDemo/version-history.json @@ -185,7 +185,7 @@ "version": "1.3.2", "date": "2025-09-24", "notes": [ - "Bugfix", + "修复缺陷", "Bugfix", "SonarQube代码质量检查问题修改", "SonarQube code quality inspection issue modification"