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