diff --git a/CHANGELOG.md b/CHANGELOG.md
index 470cfff..d2b2d7e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [1.0.6] - 2025-07-03
+
+### Changed
+- 更新TaskDrawer组件的Progressbar样式
+- 可通过拖拽进度条和文本修改的方式更改任务的进度
+- Story进度根据子任务集进度改编重新计算
+- 同时保留Story进度单独的调整方式
+
## [1.0.5] - 2025-07-02
### Changed
diff --git a/demo/App.vue b/demo/App.vue
index 529de2e..0277485 100644
--- a/demo/App.vue
+++ b/demo/App.vue
@@ -113,14 +113,14 @@ const handleMilestoneDelete = async (milestoneId: number) => {
window.dispatchEvent(
new CustomEvent('milestone-deleted', {
detail: { milestoneId },
- })
+ }),
)
// 触发强制更新事件,确保Timeline重新渲染
window.dispatchEvent(
new CustomEvent('milestone-data-changed', {
detail: { milestones: milestones.value },
- })
+ }),
)
}
@@ -240,8 +240,6 @@ const handleTaskUpdate = (updatedTask: Task) => {
showMessage(`就地更新失败,未找到任务,ID: ${updatedTask.id}`, 'warning', { closable: true })
}
}
-
- showMessage('任务更新完成', 'success', { closable: false })
}
// 任务添加处理器
@@ -252,7 +250,7 @@ const handleTaskAdd = (newTask: Task) => {
const maxId = Math.max(
...tasks.value.map(t => t.id || 0),
...milestones.value.map(m => m.id || 0),
- 0
+ 0,
)
newTask.id = maxId + 1
}
@@ -383,7 +381,7 @@ function handleTaskbarDragOrResizeEnd(newTask) {
`开始: ${oldTask.startDate} → ${newTask.startDate}\n` +
`结束: ${oldTask.endDate} → ${newTask.endDate}`,
'info',
- { closable: true }
+ { closable: true },
)
}
function handleMilestoneDragEnd(newMilestone) {
@@ -393,7 +391,7 @@ function handleMilestoneDragEnd(newMilestone) {
`里程碑【${newMilestone.name}】\n` +
`开始: ${oldMilestone.endDate} → ${newMilestone.startDate}`,
'info',
- { closable: true }
+ { closable: true },
)
}
diff --git a/demo/version-history.json b/demo/version-history.json
index 4ceb4b8..58d7745 100644
--- a/demo/version-history.json
+++ b/demo/version-history.json
@@ -105,5 +105,15 @@
"version": "1.0.5",
"date": "2025-07-02",
"notes": ["更新README中所有NPM徽章CDN地址"]
+ },
+ {
+ "version": "1.0.6",
+ "date": "2025-07-03",
+ "notes": [
+ "更新TaskDrawer组件的Progressbar样式",
+ "可通过拖拽进度条和文本修改的方式更改任务的进度",
+ "Story进度根据子任务集进度改编重新计算",
+ "同时保留Story进度单独的调整方式"
+ ]
}
]
diff --git a/package.json b/package.json
index d784300..b63204c 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "jordium-gantt-vue3",
- "version": "1.0.5",
+ "version": "1.0.6",
"type": "module",
"main": "dist/jordium-gantt-vue3.cjs.js",
"module": "dist/jordium-gantt-vue3.es.js",
diff --git a/packageDemo/App.vue b/packageDemo/App.vue
index 187be8d..0277485 100644
--- a/packageDemo/App.vue
+++ b/packageDemo/App.vue
@@ -1,11 +1,15 @@
diff --git a/src/composables/useMessage.ts b/src/composables/useMessage.ts
index 61b296d..d8123f7 100644
--- a/src/composables/useMessage.ts
+++ b/src/composables/useMessage.ts
@@ -31,6 +31,10 @@ function getContainer() {
return container
}
+// 防重复消息队列,存储最近的消息内容和时间
+const recentMessages = new Map()
+const DUPLICATE_THRESHOLD = 1000 // 1秒内相同消息视为重复
+
export function useMessage() {
/**
* @param message 消息内容
@@ -38,12 +42,32 @@ export function useMessage() {
* @param options 可选项:
* - duration: 自动关闭的毫秒数(默认3000,0表示不自动关闭)
* - closable: 是否显示关闭按钮(true=手动关闭,false=自动关闭)
+ * - allowDuplicate: 是否允许重复消息(默认false)
*/
const showMessage = (
message: string,
type: MessageType = 'success',
- options?: { duration?: number; closable?: boolean },
+ options?: { duration?: number; closable?: boolean; allowDuplicate?: boolean },
) => {
+ // 防重复检查
+ const now = Date.now()
+ const messageKey = `${type}:${message}`
+ const lastTime = recentMessages.get(messageKey)
+
+ if (!options?.allowDuplicate && lastTime && now - lastTime < DUPLICATE_THRESHOLD) {
+ // 重复消息,忽略
+ return
+ }
+
+ // 记录消息时间
+ recentMessages.set(messageKey, now)
+
+ // 清理过期的消息记录
+ for (const [key, time] of recentMessages.entries()) {
+ if (now - time > DUPLICATE_THRESHOLD * 2) {
+ recentMessages.delete(key)
+ }
+ }
const messageEl = document.createElement('div')
messageEl.className = `message ${type}`
messageEl.textContent = message