jordium-gantt-vue3
Version:
A modern, flexible, and feature-rich Gantt chart component library for Vue 3
1 lines • 1.01 MB
JavaScript
"use strict";var pE=Object.defineProperty;var vE=(r,t,e)=>t in r?pE(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e;var UA=(r,t,e)=>vE(r,typeof t!="symbol"?t+"":t,e);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("vue"),hc={"zh-CN":{dateNotSet:"未设置",taskName:"任务名称",predecessor:"前置任务",assignee:"分配人",startDate:"开始日期",endDate:"结束日期",estimatedHours:"预计工时(hr)",actualHours:"实际工时(hr)",progress:"进度",type:"类型",description:"描述",csvHeaders:{id:"ID",taskName:"任务名称",predecessor:"前置任务",assignee:"分配人",startDate:"开始日期",endDate:"结束日期",estimatedHours:"预计工时(hr)",actualHours:"实际工时(hr)",progress:"进度(%)",type:"类型",description:"描述"},yearMonthFormat:(r,t)=>`${r}年${String(t).padStart(2,"0")}月`,monthFormat:r=>`${r}月`,monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],weekDays:["日","一","二","三","四","五","六"],milestone:"里程碑",targetDate:"目标日期",today:"今天",milestoneDetails:"里程碑详情",milestoneName:"里程碑名称",milestoneDate:"里程碑日期",milestoneIcon:"里程碑图标",diamond:"菱形",rocket:"火箭",enterMilestoneName:"请输入里程碑名称",enterAssignee:"请输入负责人",enterDescription:"请输入描述信息",milestoneNameRequired:"里程碑名称为必填项",milestoneDateRequired:"里程碑日期为必填项",save:"保存",close:"关闭",confirm:"确认",delete:"删除",confirmDelete:"确定要删除这个里程碑吗?",addTask:"新增需求/任务",addMilestone:"新增里程碑",todayLocate:"今日",todayLocateTooltip:"定位到今天",exportCsv:"导出 CSV",exportPdf:"导出 PDF",expandAll:"全部展开",collapseAll:"全部折叠",language:"中文",languageTooltip:"选择语言",lightMode:"明亮模式",darkMode:"暗黑模式",fullscreen:"全屏",exitFullscreen:"退出全屏",githubDocs:"查看Github文档",giteeDocs:"查看Gitee文档",timeScaleHour:"时",timeScaleDay:"日",timeScaleWeek:"周",timeScaleMonth:"月",timeScaleQuarter:"季",timeScaleYear:"年",timeScaleTooltip:"切换时间刻度",halfYearFirst:"上半年",halfYearSecond:"下半年",confirmDialogMessage:"是否需要保留该设置?",newTask:"新建任务",taskNamePlaceholder:"请输入任务名称",assigneePlaceholder:"请输入负责人",progressPlaceholder:"0-100",hoursPlaceholder:"工时",descriptionPlaceholder:"请输入任务描述...",hours:"小时",create:"创建",taskNameRequired:"任务名称不能为空",startDateRequired:"开始日期不能为空",endDateRequired:"结束日期不能为空",endDateInvalid:"结束日期不能早于开始日期",newMilestone:"新建里程碑",editMilestone:"编辑里程碑",cancel:"取消",startTimer:"开始计时",stopTimer:"停止计时",timerStarted:"任务计时已开始",timerStopped:"任务计时已停止",addPredecessor:"添加前置任务",addSuccessor:"添加后置任务",pdfExportLoading:"正在生成PDF,请稍候...",pdfExportTitle:"甘特图导出",pdfExportDate:"导出日期",milestoneGroup:"里程碑",collapseTaskList:"收起任务列表",expandTaskList:"展开任务列表",taskType:"任务类型",taskTypeRequired:"请选择任务类型",taskTypeMap:{task:"任务",milestone:"里程碑",story:"需求",epic:"史诗",bug:"缺陷"},editTask:"编辑任务",parentTask:"上级任务",time:"时间",selectTime:"选择时间",hour:"时",minute:"分",noParentTask:"无上级任务",update:"更新",taskNameTooLong:"任务名称不能超过50个字符",predecessorPlaceholder:"请选择前置任务",selectPredecessor:"选择前置任务",removePredecessor:"移除前置任务",operationFailed:"操作失败,请重试",taskUpdateSuccess:"任务更新成功",taskCreateSuccess:"任务创建成功",confirmDeleteTask:'确定要删除任务"{name}"吗?此操作不可撤销。',taskDeleteFailed:"删除失败,请重试",confirmDeleteStory:"是否删除该需求{name}及其所有的子任务?该操作不可撤回",storyDeleteYes:"是, 继续",storyDeleteNo:"不,仅删除需求",storyDeleteAllSuccess:"已删除需求【{name}】及其所有子任务",storyDeleteOnlySuccess:"已删除需求【{name}】,{count}个子任务已升级保留",storyNotFound:"未找到要删除的需求,ID:{id}",milestoneDeleteSuccess:"里程碑删除成功",taskDeletedSuccess:"已删除任务",selectAssignee:"请选择负责人",customCsvExportCalled:"自定义CSV导出被调用",languageSwitchedTo:"语言切换到:{language}",themeSwitchedTo:"主题切换到:{theme}",lightModeText:"明亮模式",darkModeText:"暗黑模式",taskNotFound:"未找到要更新的任务,ID:{id}",newParentTaskNotFound:"未找到新父任务,ID:{parentId},将作为顶级任务添加",inPlaceUpdateFailed:"就地更新失败,未找到任务,ID:{id}",taskToDeleteNotFound:"未找到要删除的任务,ID:{id}",milestoneIconUpdateNotFound:"未找到要更新图标的里程碑,ID:{id}",overtime:"超",overdue:"逾期",days:"天",timerConfirmPrefix:"即将为任务",timerConfirmSuffix:"计时,若有特殊说明请完善下面的描述",timerConfirmPlaceholder:"请输入计时说明",configDemo:"配置演示",taskListConfig:{title:"TaskList 配置",columns:{title:"列显示"},width:{title:"宽度设置",defaultWidth:"默认宽度",minWidth:"最小宽度",maxWidth:"最大宽度",pixelsModel:"像素 (px)",percentageModel:"百分比 (%)"}},taskBarConfig:{title:"TaskBar 配置",display:{title:"显示选项",showAvatar:"显示头像 (Avatar)",showTitle:"显示标题 (Title)",showProgress:"显示进度 (Progress)"},mistouch:{title:"防误触配置",dragThreshold:"拖拽阈值 (px)",dragThresholdHint:"移动超过此距离才触发拖拽",resizeHandleWidth:"拉伸手柄宽度 (px)",resizeHandleWidthHint:"调整手柄的可点击宽度 (5-15px)",enableDragDelay:"启用拖拽延迟",enableDragDelayHint:"按住一段时间后才能拖拽",dragDelayTime:"延迟时间 (ms)",dragDelayTimeHint:"延迟启动拖拽的时间",allowDragOnClick:"允许拖拽和拉伸 TaskBar 和 Milestone",allowDragOnClickHint:"控制是否允许拖拽 TaskBar 和 Milestone,以及拉伸 TaskBar 的长度"}},disableTaskbarFocusMode:"关闭聚焦功能",dataSourceAlreadyLoaded:"{name} 已是当前数据源",dataSourceLoadSuccess:"已加载 {name}",dataSourceLoadFailed:"{name} 加载失败",dataSourceSwitch:{title:"数据源切换",subtitle:"对比常规与超大数据集的初始化体验",loading:"数据加载中,请稍候...",alreadyLoaded:"{name} 已是当前数据源",loadSuccess:"已加载 {name}",loadFailed:"{name} 加载失败",sources:{normal:{label:"常规数据源",description:"data.json · 含完整前/后置依赖,适合功能演示",badge:"data.json"},large:{label:"超大数据源",description:"data-large-1m.json · 百万级任务,验证虚拟渲染性能",badge:"data-large-1m.json"}}}},"en-US":{dateNotSet:"Not set",taskName:"Task Name",predecessor:"Predecessor",assignee:"Assignee",startDate:"Start Date",endDate:"End Date",estimatedHours:"Est. Hours",actualHours:"Act. Hours",progress:"Progress",type:"Type",csvHeaders:{id:"ID",taskName:"Task Name",predecessor:"Predecessor",assignee:"Assignee",startDate:"Start Date",endDate:"End Date",estimatedHours:"Est. Hours",actualHours:"Act. Hours",progress:"Progress (%)",type:"Type",description:"Description"},yearMonthFormat:(r,t)=>`${r}/${String(t).padStart(2,"0")}`,monthFormat:r=>`${String(r).padStart(2,"0")}`,monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],weekDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],milestone:"Milestone",today:"Today",targetDate:"Target Date",milestoneDetails:"Milestone Details",milestoneName:"Milestone Name",milestoneDate:"Milestone Date",milestoneIcon:"Milestone Icon",diamond:"Diamond",rocket:"Rocket",enterMilestoneName:"Enter milestone name",enterAssignee:"Enter assignee",enterDescription:"Enter description",milestoneNameRequired:"Milestone name is required",milestoneDateRequired:"Milestone date is required",save:"Save",close:"Close",confirm:"Confirm",description:"Description",delete:"Delete",confirmDelete:"Are you sure you want to delete this milestone?",addTask:"Add Requirement/Task",addMilestone:"Add Milestone",todayLocate:"Today",todayLocateTooltip:"Locate to today",exportCsv:"Export CSV",exportPdf:"Export PDF",expandAll:"Expand All",collapseAll:"Collapse All",language:"English",languageTooltip:"Select language",lightMode:"Light Mode",darkMode:"Dark Mode",fullscreen:"Fullscreen",exitFullscreen:"Exit Fullscreen",githubDocs:"GitHub Docs",giteeDocs:"Gitee Docs",timeScaleHour:"Hour",timeScaleDay:"Day",timeScaleWeek:"Week",timeScaleMonth:"Month",timeScaleQuarter:"Quarter",timeScaleYear:"Year",timeScaleTooltip:"Switch Time Scale",halfYearFirst:"First Half",halfYearSecond:"Second Half",confirmDialogMessage:"Do you want to save this setting?",taskNamePlaceholder:"Enter task name",assigneePlaceholder:"Enter assignee",progressPlaceholder:"0-100",hoursPlaceholder:"Hours",descriptionPlaceholder:"Enter task description...",hours:"Hours",create:"Create",taskNameRequired:"Task name is required",startDateRequired:"Start date is required",endDateRequired:"End date is required",endDateInvalid:"End date cannot be earlier than start date",newMilestone:"New Milestone",editMilestone:"Edit Milestone",cancel:"Cancel",timerStarted:"Timer Started",timerStopped:"Timer Stopped",startTimer:"Start Timer",stopTimer:"Stop Timer",addPredecessor:"Add Predecessor",addSuccessor:"Add Successor",pdfExportLoading:"Generating PDF, please wait...",pdfExportTitle:"Gantt Chart Export",pdfExportDate:"Export Date",milestoneGroup:"Milestone",collapseTaskList:"Collapse Task List",expandTaskList:"Expand Task List",taskType:"Task Type",taskTypeRequired:"Please select task type",taskTypeMap:{task:"Task",milestone:"Milestone",story:"Story",epic:"Epic",bug:"Bug"},editTask:"Edit Task",newTask:"New Task",parentTask:"Parent Task",time:"Time",selectTime:"Select Time",hour:"Hour",minute:"Minute",noParentTask:"No Parent Task",update:"Update",taskNameTooLong:"Task name cannot exceed 50 characters",predecessorPlaceholder:"Select predecessor",selectPredecessor:"Select Predecessor",removePredecessor:"Remove Predecessor",operationFailed:"Operation failed, please try again",taskUpdateSuccess:"Task updated successfully",taskCreateSuccess:"Task created successfully",confirmDeleteTask:'Are you sure you want to delete task "{name}"? This action cannot be undone.',taskDeleteFailed:"Delete failed, please try again",confirmDeleteStory:"Do you want to delete the requirement {name} and all its subtasks? This action cannot be undone",storyDeleteYes:"Yes, Continue",storyDeleteNo:"No, Delete Requirement Only",storyDeleteAllSuccess:"Deleted requirement [{name}] and all its subtasks",storyDeleteOnlySuccess:"Deleted requirement [{name}], {count} subtasks have been promoted",storyNotFound:"Requirement not found, ID: {id}",milestoneDeleteSuccess:"Milestone deleted successfully",taskDeletedSuccess:"Task deleted",selectAssignee:"Select assignee",customCsvExportCalled:"Custom CSV export called",languageSwitchedTo:"Language switched to: {language}",themeSwitchedTo:"Theme switched to: {theme}",lightModeText:"Light Mode",darkModeText:"Dark Mode",taskNotFound:"Task not found for update, ID: {id}",newParentTaskNotFound:"New parent task not found, ID: {parentId}, will be added as top-level task",inPlaceUpdateFailed:"In-place update failed, task not found, ID: {id}",taskToDeleteNotFound:"Task to delete not found, ID: {id}",milestoneIconUpdateNotFound:"Milestone not found for icon update, ID: {id}",overtime:"Over",overdue:"Overdue",days:" days",timerConfirmPrefix:"About to start timing for",timerConfirmSuffix:". If there are special notes, please complete the description below.",timerConfirmPlaceholder:"Please enter timer description",configDemo:"Configuration Demo",taskListConfig:{title:"TaskList Configuration",columns:{title:"Columns"},width:{title:"Width Settings",defaultWidth:"Default Width",minWidth:"Min Width",maxWidth:"Max Width",pixelsModel:"pixels (px)",percentageModel:"percentage (%)"}},taskBarConfig:{title:"TaskBar Configuration",display:{title:"Display Options",showAvatar:"Show Avatar",showTitle:"Show Title",showProgress:"Show Progress"},mistouch:{title:"Mistouch Prevention",dragThreshold:"Drag Threshold (px)",dragThresholdHint:"Distance to trigger dragging",resizeHandleWidth:"Resize Handle Width (px)",resizeHandleWidthHint:"Clickable width of resize handle (5-15px)",enableDragDelay:"Enable Drag Delay",enableDragDelayHint:"Hold to drag after a delay",dragDelayTime:"Delay Time (ms)",dragDelayTimeHint:"Delay time before dragging starts",allowDragOnClick:"Allow dragging and resizing of TaskBars and Milestones",allowDragOnClickHint:"Controls whether to allow dragging of TaskBars and Milestones, as well as resizing the length of TaskBars"}},disableTaskbarFocusMode:"Disable Focus Mode",dataSourceAlreadyLoaded:"{name} is already active",dataSourceLoadSuccess:"{name} loaded successfully",dataSourceLoadFailed:"{name} failed to load",dataSourceSwitch:{title:"Data Sources",subtitle:"Compare default vs. mega dataset initialization",loading:"Loading data, please wait…",alreadyLoaded:"{name} is already active",loadSuccess:"{name} loaded successfully",loadFailed:"{name} failed to load",sources:{normal:{label:"Standard Dataset",description:"data.json · Full predecessor graph for feature demos",badge:"data.json"},large:{label:"Massive Dataset",description:"data-large-1m.json · Million-level tasks to stress virtual rendering",badge:"data-large-1m.json"}}}}};function Rv(r,t){hc[r]&&(hc[r]={...hc[r],...t},gc.value===r&&window.dispatchEvent(new CustomEvent("locale-changed",{detail:{locale:r}})))}const mE="gantt-locale",wE=()=>{if(typeof window<"u"){const r=localStorage.getItem(mE);if(r&&(r==="zh-CN"||r==="en-US"))return r}return"zh-CN"},gc=i.ref(wE());function Zn(){const r=i.computed(()=>hc[gc.value]),t=s=>{const l=r.value[s];return typeof l=="string"?l:s},e=(s,l)=>{let c=t(s);return Object.keys(l).forEach(u=>{c=c.replace(new RegExp(`{${u}}`,"g"),String(l[u]))}),c},A=s=>{gc.value=s,window.dispatchEvent(new CustomEvent("locale-changed",{detail:{locale:s}}))},n=i.computed(()=>gc.value);return{t:r,getTranslation:t,formatTranslation:e,locale:n,setLocale:A,formatYearMonth:(s,l)=>r.value.yearMonthFormat(s,l),formatMonth:s=>r.value.monthFormat(s)}}function BE(r){if(!r)return null;const[t,e,A]=r.split("-").map(Number);return new Date(t,e-1,A)}function Tc(r){return r?Array.isArray(r)&&typeof r[0]=="number"?r:Array.isArray(r)?r.filter(t=>t&&t.toString().trim()).map(t=>Number(t.toString().trim())).filter(t=>!isNaN(t)):r.split(",").map(t=>t.trim()).filter(t=>t).map(t=>Number(t)).filter(t=>!isNaN(t)):[]}function gg(r){const t=Tc(r);return t.length>0?t.join(", "):"-"}const yE={class:"confirm-timer-dialog-overlay"},bE={class:"confirm-timer-dialog"},CE={class:"dialog-message"},EE={class:"task-name-highlight"},FE=["placeholder"],xE={class:"dialog-actions"},SE=i.defineComponent({__name:"ConfirmTimerDialog",props:{visible:Boolean,title:{type:String,default:"确认开始计时"},message:{type:String,default:""},defaultDesc:{type:String,default:""},placeholder:{type:String,default:"请输入计时说明"}},emits:["confirm","cancel"],setup(r,{emit:t}){const e=r,A=t,{getTranslation:n}=Zn(),a=i.ref(e.defaultDesc);i.watch(()=>e.visible,l=>{l&&(a.value=e.defaultDesc)});const o=()=>A("confirm",a.value),s=i.computed(()=>{if(e.message){const l=e.message.match(/任务([\S\s]+?)计时|Task ([\S\s]+?) timing/);if(l&&(l[1]||l[2]))return l[1]||l[2]}return e.defaultDesc});return(l,c)=>(i.openBlock(),i.createElementBlock("div",yE,[i.createElementVNode("div",bE,[i.createElementVNode("div",CE,[i.createElementVNode("span",null,i.toDisplayString(i.unref(n)("timerConfirmPrefix")),1),i.createElementVNode("span",EE,i.toDisplayString(s.value),1),i.createElementVNode("span",null,i.toDisplayString(i.unref(n)("timerConfirmSuffix")),1)]),i.withDirectives(i.createElementVNode("textarea",{"onUpdate:modelValue":c[0]||(c[0]=u=>a.value=u),class:"dialog-textarea",placeholder:i.unref(n)("timerConfirmPlaceholder"),rows:"3"},null,8,FE),[[i.vModelText,a.value]]),i.createElementVNode("div",xE,[i.createElementVNode("button",{class:"btn btn-default",onClick:c[1]||(c[1]=u=>l.$emit("cancel"))},i.toDisplayString(i.unref(n)("cancel")),1),i.createElementVNode("button",{class:"btn btn-confirm",onClick:o},i.toDisplayString(i.unref(n)("startTimer")),1)])])]))}}),Bn=(r,t)=>{const e=r.__vccOpts||r;for(const[A,n]of t)e[A]=n;return e},ZB=Bn(SE,[["__scopeId","data-v-6b662ffc"]]),UE={class:"gantt-confirm-header"},TE={class:"gantt-confirm-title"},kE={class:"gantt-confirm-content"},QE={class:"gantt-confirm-footer"},DE={class:"gantt-confirm-footer-right"},LE=i.defineComponent({__name:"GanttConfirmDialog",props:{visible:Boolean,title:{type:String,default:"确认"},message:{type:String,default:""},confirmText:{type:String,default:"确认"},cancelText:{type:String,default:"取消"},yesText:{type:String,default:"是"},noText:{type:String,default:"否"},type:{type:String,default:"confirm-cancel"}},emits:["confirm","cancel","yes","no"],setup(r,{emit:t}){const e=r,A=t,n=()=>A("confirm"),a=()=>A("cancel"),o=()=>A("yes"),s=()=>A("no");return(l,c)=>r.visible?(i.openBlock(),i.createElementBlock("div",{key:0,class:"gantt-confirm-overlay",onClick:a},[i.createElementVNode("div",{class:"gantt-confirm-dialog",onClick:c[0]||(c[0]=i.withModifiers(()=>{},["stop"]))},[i.createElementVNode("div",UE,[i.createElementVNode("h4",TE,i.toDisplayString(e.title),1)]),i.createElementVNode("div",kE,[i.createElementVNode("p",null,i.toDisplayString(e.message),1)]),i.createElementVNode("div",QE,[e.type==="yes-no-cancel"?(i.openBlock(),i.createElementBlock(i.Fragment,{key:0},[i.createElementVNode("button",{type:"button",class:"btn btn-default",onClick:a},i.toDisplayString(e.cancelText),1),i.createElementVNode("div",DE,[i.createElementVNode("button",{type:"button",class:"btn btn-warning",onClick:s},i.toDisplayString(e.noText),1),i.createElementVNode("button",{type:"button",class:"btn btn-danger",onClick:o},i.toDisplayString(e.yesText),1)])],64)):(i.openBlock(),i.createElementBlock(i.Fragment,{key:1},[i.createElementVNode("button",{type:"button",class:"btn btn-default",onClick:a},i.toDisplayString(e.cancelText),1),i.createElementVNode("button",{type:"button",class:"btn btn-danger",onClick:n},i.toDisplayString(e.confirmText),1)],64))])])])):i.createCommentVNode("",!0)}}),dp=Bn(LE,[["__scopeId","data-v-528e8fed"]]),IE={class:"icon-wrapper"},NE=i.defineComponent({__name:"TaskContextMenu",props:{visible:{type:Boolean},position:{},task:{}},emits:["start-timer","stop-timer","add-predecessor","add-successor","delete","close"],setup(r,{emit:t}){const e=r,A=t,{t:n}=Zn(),a=i.ref(null),o=i.ref({x:0,y:0}),s=i.ref({display:"none",left:"50%",top:"-8px",transform:"rotate(0deg)"}),l=i.ref(!1),c=i.ref(""),u=i.ref(!1),g=i.computed(()=>{var T;return((T=e.task)==null?void 0:T.type)==="story"?"yes-no-cancel":"confirm-cancel"}),p=i.computed(()=>{var T,L,N;return((T=e.task)==null?void 0:T.type)==="story"?n.value.confirmDeleteStory.replace("{name}",((L=e.task)==null?void 0:L.name)||""):n.value.confirmDeleteTask.replace("{name}",((N=e.task)==null?void 0:N.name)||"")});function f(){var T;c.value=((T=e.task)==null?void 0:T.name)||"",l.value=!0}function v(){l.value=!1}function y(T){if(l.value=!1,e.task&&typeof e.task=="object"){A("close");const L=Date.now();Object.assign(e.task,{timerStartDesc:T||"",isTimerRunning:!0,timerStartTime:L,timerElapsedTime:0}),A("start-timer",e.task)}}function b(){u.value=!0}const B=()=>{u.value=!1,e.task&&(A("delete",e.task),A("close"))},E=()=>{u.value=!1},S=()=>{u.value=!1,e.task&&(A("delete",e.task,!0),R())},F=()=>{u.value=!1,e.task&&(A("delete",e.task,!1),R())},j=i.computed(()=>{var T;return((T=e.task)==null?void 0:T.type)!=="story"});i.watch([()=>e.visible,()=>e.position],([T,L])=>{T&&L&&i.nextTick(()=>{if(a.value){const N=window.innerWidth,ie=window.innerHeight,le=a.value.offsetWidth,z=a.value.offsetHeight;let X=L.x-le/2,Ae=L.y+10,se="50%",fe="-8px",U="rotate(0deg)";if(X+le>N){const Q=X+le-N+5;X-=Q,se=`calc(50% + ${Q}px)`}if(X<5){const Q=5-X;X=5,se=`calc(50% - ${Q}px)`}Ae+z>ie&&(Ae=L.y-z-10,fe="100%",U="rotate(180deg)"),o.value={x:X,y:Ae},s.value={display:"block",left:se,top:fe,transform:U}}})},{immediate:!0,deep:!0});const R=()=>{A("close")},K=()=>{var T;(T=e.task)!=null&&T.isTimerRunning?(A("close"),Object.assign(e.task,{isTimerRunning:!1,timerEndTime:Date.now(),timerElapsedTime:(e.task.timerElapsedTime||0)+(Date.now()-(e.task.timerStartTime||Date.now()))}),A("stop-timer",e.task)):f()},H=()=>{e.task&&(A("close"),i.nextTick(()=>{A("add-predecessor",e.task)}))},I=()=>{e.task&&(A("close"),i.nextTick(()=>{A("add-successor",e.task)}))},ee=T=>{a.value&&!a.value.contains(T.target)&&R()},x=T=>{T.key==="Escape"&&R()};return i.onMounted(()=>{document.addEventListener("mousedown",ee),document.addEventListener("keydown",x)}),i.onUnmounted(()=>{document.removeEventListener("mousedown",ee),document.removeEventListener("keydown",x)}),(T,L)=>{var N,ie,le,z;return i.openBlock(),i.createBlock(i.Teleport,{to:"body"},[T.visible?(i.openBlock(),i.createElementBlock("div",{key:0,ref_key:"menuRef",ref:a,class:"task-context-menu",style:i.normalizeStyle({left:`${o.value.x}px`,top:`${o.value.y}px`,zIndex:1e4,position:"fixed"})},[i.createElementVNode("div",{class:"menu-arrow",style:i.normalizeStyle({display:s.value.display,left:s.value.left,top:s.value.top,transform:s.value.transform})},null,4),j.value?(i.openBlock(),i.createElementBlock("div",{key:0,class:"menu-item",onClick:K},[i.createElementVNode("div",IE,[i.createElementVNode("i",{class:i.normalizeClass(["menu-icon",(N=e.task)!=null&&N.isTimerRunning?"stop-icon":"timer-icon"])},null,2)]),i.createTextVNode(" "+i.toDisplayString((ie=e.task)!=null&&ie.isTimerRunning?i.unref(n).stopTimer:i.unref(n).startTimer),1)])):i.createCommentVNode("",!0),i.createElementVNode("div",{class:"menu-item",onClick:H},[L[0]||(L[0]=i.createElementVNode("div",{class:"icon-wrapper"},[i.createElementVNode("i",{class:"menu-icon predecessor-icon"})],-1)),i.createTextVNode(" "+i.toDisplayString(i.unref(n).addPredecessor),1)]),i.createElementVNode("div",{class:"menu-item",onClick:I},[L[1]||(L[1]=i.createElementVNode("div",{class:"icon-wrapper"},[i.createElementVNode("i",{class:"menu-icon successor-icon"})],-1)),i.createTextVNode(" "+i.toDisplayString(i.unref(n).addSuccessor),1)]),L[3]||(L[3]=i.createElementVNode("div",{class:"menu-divider"},null,-1)),i.createElementVNode("div",{class:"menu-item menu-item-danger",onClick:b},[L[2]||(L[2]=i.createElementVNode("div",{class:"icon-wrapper"},[i.createElementVNode("i",{class:"menu-icon delete-icon"})],-1)),i.createTextVNode(" "+i.toDisplayString(i.unref(n).delete),1)]),i.createVNode(dp,{visible:u.value,title:i.unref(n).delete,type:g.value,message:p.value,"confirm-text":i.unref(n).confirm,"cancel-text":i.unref(n).cancel,"yes-text":i.unref(n).storyDeleteYes,"no-text":i.unref(n).storyDeleteNo,onConfirm:B,onYes:S,onNo:F,onCancel:E},null,8,["visible","title","type","message","confirm-text","cancel-text","yes-text","no-text"]),l.value?(i.openBlock(),i.createBlock(ZB,{key:1,visible:l.value,title:"确认开始计时",message:`即将为任务${(le=e.task)==null?void 0:le.name}计时,若有特殊说明请完善下面的描述`,"default-desc":((z=e.task)==null?void 0:z.name)||"",onConfirm:y,onCancel:v},null,8,["visible","message","default-desc"])):i.createCommentVNode("",!0)],4)):i.createCommentVNode("",!0)])}}}),ey=Bn(NE,[["__scopeId","data-v-12581219"]]),_E={width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},ME={key:0,points:"9,18 15,12 9,6"},OE={key:1,points:"18,15 12,9 6,15"},HE={key:1,class:"milestone-spacer"},RE={class:"task-icon"},PE={key:0,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",class:"milestone-group-icon"},VE={key:1,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},KE={key:2,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},qE=["title"],jE={key:0,class:"timer-dot"},GE={key:3,class:"status-badge overtime"},WE={key:4,class:"status-badge overdue"},YE={key:0,class:"milestone-empty-col"},zE={key:1,class:"assignee-info"},$E={class:"avatar"},XE={class:"assignee-name"},JE=10,ZE=i.defineComponent({__name:"TaskRow",props:{task:{},level:{},isHovered:{type:Boolean},hoveredTaskId:{},onHover:{type:Function},columns:{},getColumnWidthStyle:{type:Function},disableChildrenRender:{type:Boolean}},emits:["toggle","dblclick","contextmenu","start-timer","stop-timer","add-predecessor","add-successor","delete"],setup(r,{emit:t}){const e=r,A=t,{t:n}=Zn(),a=i.computed(()=>{var Q;return((Q=n.value)==null?void 0:Q.overtime)??""}),o=i.computed(()=>{var Q;return((Q=n.value)==null?void 0:Q.overdue)??""}),s=i.computed(()=>{var Q;return((Q=n.value)==null?void 0:Q.days)??""}),l=i.useSlots(),c=i.computed(()=>!!l["custom-task-content"]),u=i.computed(()=>`${JE+e.level*20}px`),g=i.computed(()=>!!(e.task.children&&e.task.children.length>0)),p=i.computed(()=>e.task.type==="story"),f=i.computed(()=>e.task.type==="milestone-group"),v=i.computed(()=>e.task.type==="milestone"),y=i.computed(()=>p.value||g.value||f.value);function b(){A("toggle",e.task)}function B(){(p.value||g.value)&&!f.value&&A("toggle",e.task)}const E=Q=>{Q.stopPropagation(),A("dblclick",e.task)},S=()=>{H.value||e.onHover&&e.onHover(e.task.id)},F=()=>{H.value||e.onHover&&e.onHover(null)};function j(){const Q=e.task.progress||0,M=new Date,G=e.task.endDate?new Date(e.task.endDate):null;return G&&M>G&&Q<100?"progress-danger":Q>=100?"progress-success":Q>0?"progress-warning":""}function R(){return e.task.actualHours&&e.task.estimatedHours&&e.task.actualHours>e.task.estimatedHours}function K(){const Q=new Date,M=e.task.endDate?new Date(e.task.endDate):null,G=e.task.progress||0;if(M&&Q>M&&G<100){const $=new Date(Q.getFullYear(),Q.getMonth(),Q.getDate()),ce=new Date(M.getFullYear(),M.getMonth(),M.getDate());return Math.floor(($.getTime()-ce.getTime())/(1e3*60*60*24))}return 0}const H=i.ref(!1),I=()=>{H.value=!0},ee=()=>{H.value=!1},x=i.ref(0),T=i.ref(null),L=i.computed(()=>{const Q=Math.floor(x.value/1e3),M=Math.floor(Q/3600),G=Math.floor(Q%3600/60),$=Q%60;return`${String(M).padStart(2,"0")}:${String(G).padStart(2,"0")}:${String($).padStart(2,"0")}`}),N=()=>{if(e.task.isTimerRunning&&e.task.timerStartTime){const Q=e.task.timerElapsedTime||0;x.value=Date.now()-e.task.timerStartTime+Q}else e.task.timerElapsedTime?x.value=e.task.timerElapsedTime:x.value=0};i.watch(()=>[e.task.isTimerRunning,e.task.timerStartTime,e.task.timerElapsedTime],()=>{T.value&&(clearInterval(T.value),T.value=null),e.task.isTimerRunning?(N(),T.value=window.setInterval(N,1e3)):N()},{immediate:!0});const ie=i.ref(!1),le=i.ref({x:0,y:0}),z=i.computed(()=>e.task);function X(Q){if(window.dispatchEvent(new CustomEvent("close-all-taskbar-menus")),e.task.type!=="task"&&e.task.type!=="story"){Q.preventDefault(),ie.value=!1;return}Q.preventDefault(),ie.value=!0,le.value={x:Q.clientX,y:Q.clientY}}function Ae(){ie.value=!1}const se=(Q,M)=>{A("delete",Q,M),Ae()},fe=i.computed(()=>j()),U=i.computed(()=>({isRowContent:!0,task:e.task,level:e.level,indent:u.value,isHovered:e.isHovered??!1,hoveredTaskId:e.hoveredTaskId??null,isParent:y.value,hasChildren:g.value,collapsed:!!e.task.collapsed,formattedTimer:L.value,timerRunning:!!e.task.isTimerRunning,timerElapsed:x.value,isOvertime:R(),overdueDays:K(),overtimeText:a.value,overdueText:o.value,daysText:s.value,progressClass:fe.value}));return i.onMounted(()=>{window.addEventListener("splitter-drag-start",I),window.addEventListener("splitter-drag-end",ee),window.addEventListener("close-all-taskbar-menus",Ae)}),i.onUnmounted(()=>{window.removeEventListener("splitter-drag-start",I),window.removeEventListener("splitter-drag-end",ee),window.removeEventListener("close-all-taskbar-menus",Ae),T.value&&clearInterval(T.value)}),(Q,M)=>{const G=i.resolveComponent("TaskRow",!0);return i.openBlock(),i.createElementBlock("div",null,[i.createElementVNode("div",{class:i.normalizeClass(["task-row",{"task-row-hovered":Q.isHovered,"parent-task":y.value,"milestone-group-row":f.value,"task-type-story":p.value,"task-type-task":e.task.type==="task","task-type-milestone":v.value}]),onClick:B,onDblclick:E,onMouseenter:S,onMouseleave:F,onContextmenu:X},[i.createElementVNode("div",{class:"col col-name",style:i.normalizeStyle({paddingLeft:u.value})},[(p.value||g.value)&&!f.value?(i.openBlock(),i.createElementBlock("span",{key:0,class:"collapse-btn",onClick:i.withModifiers(b,["stop"])},[(i.openBlock(),i.createElementBlock("svg",_E,[e.task.collapsed?(i.openBlock(),i.createElementBlock("polyline",ME)):(i.openBlock(),i.createElementBlock("polyline",OE))]))])):i.createCommentVNode("",!0),f.value?(i.openBlock(),i.createElementBlock("span",HE)):i.createCommentVNode("",!0),i.createElementVNode("span",RE,[f.value?(i.openBlock(),i.createElementBlock("svg",PE,M[10]||(M[10]=[i.createElementVNode("polygon",{points:"12,2 22,12 12,22 2,12"},null,-1)]))):p.value||g.value?(i.openBlock(),i.createElementBlock("svg",VE,M[11]||(M[11]=[i.createElementVNode("path",{d:"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-5l-2-2H5a2 2 0 00-2 2z"},null,-1)]))):(i.openBlock(),i.createElementBlock("svg",KE,M[12]||(M[12]=[i.createStaticVNode('<path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z" data-v-9c1569ff></path><polyline points="14,2 14,8 20,8" data-v-9c1569ff></polyline><line x1="16" y1="13" x2="8" y2="13" data-v-9c1569ff></line><line x1="16" y1="17" x2="8" y2="17" data-v-9c1569ff></line><polyline points="10,9 9,9 8,9" data-v-9c1569ff></polyline>',5)])))]),i.createElementVNode("span",{class:i.normalizeClass(["task-name-text",{"parent-task":y.value}]),title:e.task.name},[c.value?i.renderSlot(Q.$slots,"custom-task-content",i.mergeProps({key:0},U.value,{type:"task-row"}),void 0,!0):(i.openBlock(),i.createElementBlock(i.Fragment,{key:1},[i.createTextVNode(i.toDisplayString(e.task.name),1)],64)),e.task.isTimerRunning||e.task.timerElapsedTime?(i.openBlock(),i.createElementBlock("span",{key:2,class:i.normalizeClass(["timer-badge",{"timer-active":e.task.isTimerRunning}])},[e.task.isTimerRunning?(i.openBlock(),i.createElementBlock("span",jE)):i.createCommentVNode("",!0),i.createTextVNode(" "+i.toDisplayString(L.value),1)],2)):i.createCommentVNode("",!0),R()?(i.openBlock(),i.createElementBlock("span",GE,i.toDisplayString(a.value),1)):i.createCommentVNode("",!0),K()>0?(i.openBlock(),i.createElementBlock("span",WE,i.toDisplayString(o.value)+i.toDisplayString(K()>0?K()+s.value:""),1)):i.createCommentVNode("",!0)],10,qE)],4),(i.openBlock(!0),i.createElementBlock(i.Fragment,null,i.renderList(Q.columns,$=>(i.openBlock(),i.createElementBlock("div",{key:$.key,class:i.normalizeClass(["col",$.cssClass||`col-${$.key}`]),style:i.normalizeStyle(Q.getColumnWidthStyle?Q.getColumnWidthStyle($):void 0)},[f.value?(i.openBlock(),i.createElementBlock("div",YE)):(i.openBlock(),i.createElementBlock(i.Fragment,{key:1},[$.key==="predecessor"?(i.openBlock(),i.createElementBlock(i.Fragment,{key:0},[i.createTextVNode(i.toDisplayString(i.unref(gg)(e.task.predecessor)),1)],64)):$.key==="assignee"?(i.openBlock(),i.createElementBlock("div",zE,[i.createElementVNode("div",$E,i.toDisplayString(e.task.assignee?e.task.assignee.charAt(0):"-"),1),i.createElementVNode("span",XE,i.toDisplayString(e.task.assignee||"-"),1)])):$.key==="startDate"?(i.openBlock(),i.createElementBlock(i.Fragment,{key:2},[i.createTextVNode(i.toDisplayString(e.task.startDate||"-"),1)],64)):$.key==="endDate"?(i.openBlock(),i.createElementBlock(i.Fragment,{key:3},[i.createTextVNode(i.toDisplayString(e.task.endDate||"-"),1)],64)):$.key==="estimatedHours"?(i.openBlock(),i.createElementBlock(i.Fragment,{key:4},[i.createTextVNode(i.toDisplayString(e.task.estimatedHours||"-"),1)],64)):$.key==="actualHours"?(i.openBlock(),i.createElementBlock(i.Fragment,{key:5},[i.createTextVNode(i.toDisplayString(e.task.actualHours||"-"),1)],64)):$.key==="progress"?(i.openBlock(),i.createElementBlock("span",{key:6,class:i.normalizeClass(["progress-value",fe.value])},i.toDisplayString(e.task.progress!=null?e.task.progress+"%":"-"),3)):(i.openBlock(),i.createElementBlock(i.Fragment,{key:7},[i.createTextVNode(i.toDisplayString(e.task[$.key]||"-"),1)],64))],64))],6))),128))],34),!e.disableChildrenRender&&g.value&&!e.task.collapsed&&!f.value?(i.openBlock(!0),i.createElementBlock(i.Fragment,{key:0},i.renderList(e.task.children,$=>(i.openBlock(),i.createBlock(G,{key:$.id,task:$,level:e.level+1,"is-hovered":e.hoveredTaskId===$.id,"hovered-task-id":e.hoveredTaskId,"on-hover":e.onHover,columns:e.columns,"get-column-width-style":e.getColumnWidthStyle,"disable-children-render":e.disableChildrenRender,onToggle:M[0]||(M[0]=ce=>A("toggle",ce)),onDblclick:M[1]||(M[1]=ce=>A("dblclick",ce)),onStartTimer:M[2]||(M[2]=ce=>A("start-timer",ce)),onStopTimer:M[3]||(M[3]=ce=>A("stop-timer",ce)),onAddPredecessor:M[4]||(M[4]=ce=>A("add-predecessor",ce)),onAddSuccessor:M[5]||(M[5]=ce=>A("add-successor",ce)),onDelete:se},i.createSlots({_:2},[c.value?{name:"custom-task-content",fn:i.withCtx(ce=>[i.renderSlot(Q.$slots,"custom-task-content",i.mergeProps({ref_for:!0},ce),void 0,!0)]),key:"0"}:void 0]),1032,["task","level","is-hovered","hovered-task-id","on-hover","columns","get-column-width-style","disable-children-render"]))),128)):i.createCommentVNode("",!0),i.createVNode(ey,{visible:ie.value,task:z.value,position:le.value,onClose:Ae,onStartTimer:M[6]||(M[6]=$=>Q.$emit("start-timer",e.task)),onStopTimer:M[7]||(M[7]=$=>Q.$emit("stop-timer",e.task)),onAddPredecessor:M[8]||(M[8]=$=>Q.$emit("add-predecessor",e.task)),onAddSuccessor:M[9]||(M[9]=$=>Q.$emit("add-successor",e.task)),onDelete:se},null,8,["visible","task","position"])])}}}),ty=Bn(ZE,[["__scopeId","data-v-9c1569ff"]]),e4=320,Pv=280,t4=1160;function Nu(r,t,e){if(r==null)return e;if(typeof r=="number")return r;if(typeof r=="string"){const A=r.trim();if(A.endsWith("%")){const a=parseFloat(A);if(!isNaN(a))return Math.round(t*a/100)}const n=parseFloat(A);if(!isNaN(n))return n}return e}const A4=[{type:"name",key:"taskName",label:"任务名称",cssClass:"col-name",visible:!0},{type:"predecessor",key:"predecessor",label:"前置任务",cssClass:"col-pre",visible:!0},{type:"assignee",key:"assignee",label:"负责人",cssClass:"col-assignee",visible:!0},{type:"startDate",key:"startDate",label:"开始日期",cssClass:"col-date",visible:!0},{type:"endDate",key:"endDate",label:"结束日期",cssClass:"col-date",visible:!0},{type:"estimatedHours",key:"estimatedHours",label:"预估工时",cssClass:"col-hours",visible:!0},{type:"actualHours",key:"actualHours",label:"实际工时",cssClass:"col-hours",visible:!0},{type:"progress",key:"progress",label:"进度",cssClass:"col-progress",visible:!0}],r4={class:"task-list-header"},n4={class:"col col-name"},vo=51,Vv=5,a4=i.defineComponent({__name:"TaskList",props:{tasks:{},useDefaultDrawer:{type:Boolean},taskListConfig:{}},emits:["task-collapse-change","start-timer","stop-timer","add-predecessor","add-successor","delete"],setup(r,{emit:t}){const e=r,A=t,n=i.useSlots(),a=i.computed(()=>!!n["custom-task-content"]),{t:o}=Zn(),s=i.ref(null),l=i.ref(null),c=i.ref(0);let u=null,g=null;const p=i.ref(0),f=i.ref(0),v=be=>{if(!be.width)return{};let Qe;if(typeof be.width=="string"&&be.width.includes("%")){const Pe=c.value||0;if(Pe>0){const P=parseFloat(be.width)/100;Qe=`${Math.floor(Pe*P)}px`}else return{}}else Qe=`${be.width}px`;return{flex:`0 0 ${Qe}`,minWidth:Qe,maxWidth:Qe}},y=i.computed(()=>{var Qe;return(((Qe=e.taskListConfig)==null?void 0:Qe.columns)||A4).filter(Pe=>Pe.visible!==!1)}),b=i.ref([]),B=i.ref(null),E=i.ref(!1),S=()=>{E.value=!0},F=()=>{if(E.value=!1,s.value){const be=s.value.offsetWidth;Math.abs(be-c.value)>1&&(c.value=be)}},j=be=>{E.value||(B.value=be,window.dispatchEvent(new CustomEvent("task-list-hover",{detail:be})))},R=be=>{B.value=be.detail},K=be=>{be.type==="milestone"||be.type==="milestone-group"||window.dispatchEvent(new CustomEvent("task-row-double-click",{detail:be}))},H=be=>{if(!be.children||be.children.length===0)return{progress:be.progress||0,startDate:be.startDate||"",endDate:be.endDate||""};const Qe=[],Pe=je=>{je.forEach(At=>{Qe.push(At),At.children&&At.children.length>0&&Pe(At.children)})};Pe(be.children);const P=Qe.reduce((je,At)=>je+(At.progress||0),0),ue=Qe.length>0?Math.round(P/Qe.length):0,Te=Qe.filter(je=>je.startDate&&je.endDate);if(Te.length===0)return{progress:ue,startDate:be.startDate||"",endDate:be.endDate||""};const Ye=Te.map(je=>new Date(je.startDate)),Ve=Te.map(je=>new Date(je.endDate)),dt=new Date(Math.min(...Ye.map(je=>je.getTime()))),at=new Date(Math.max(...Ve.map(je=>je.getTime())));return{progress:ue,startDate:dt.toISOString().split("T")[0],endDate:at.toISOString().split("T")[0]}},I=()=>{const be=Qe=>Qe.map(Pe=>{if(Pe.children&&Pe.children.length>0){const P=be(Pe.children),ue=H({...Pe,children:P});return{...Pe,progress:ue.progress,startDate:ue.startDate,endDate:ue.endDate,children:P}}return Pe});b.value=be(b.value)},ee=be=>{const Qe=[],Pe=P=>{P.forEach(ue=>{Qe.push(ue),ue.children&&ue.children.length>0&&Pe(ue.children)})};return Pe(be),Qe},x=(be,Qe=0)=>{const Pe=[];for(const P of be)Pe.push({task:P,level:Qe}),!(P.type==="milestone-group")&&P.children&&P.children.length>0&&!P.collapsed&&Pe.push(...x(P.children,Qe+1));return Pe},T=i.computed(()=>x(b.value)),L=i.computed(()=>{const be=p.value,Qe=f.value||600,Pe=Math.floor(be/vo)-Vv,P=Math.ceil((be+Qe)/vo)+Vv,ue=T.value.length,Te=Math.min(Math.max(0,Pe),ue),Ye=Math.min(ue,Math.max(Te+1,P));return{startIndex:Te,endIndex:Ye}}),N=i.computed(()=>{const{startIndex:be,endIndex:Qe}=L.value;return T.value.slice(be,Qe)}),ie=i.computed(()=>T.value.length*vo),le=i.computed(()=>L.value.startIndex*vo),z=i.computed(()=>{const be=N.value.length*vo;return Math.max(0,ie.value-le.value-be)});i.watch(()=>e.tasks,be=>{b.value=be||[],I()},{immediate:!0,deep:!0});function X(be){be.collapsed=!be.collapsed,A("task-collapse-change",be)}const Ae=be=>{const Qe=Pe=>Pe.map(P=>P.id===be.id?{...P,...be,children:P.children}:P.children?{...P,children:Qe(P.children)}:P);b.value=Qe(b.value),I()},se=be=>{const Qe=be.detail;Ae(Qe)},fe=be=>{const Qe=be.detail;b.value.push(Qe),I()},U=()=>{const be=ee(b.value);window.dispatchEvent(new CustomEvent("task-list-updated",{detail:be}))},Q=be=>{const{milestoneId:Qe,icon:Pe}=be.detail,P=ue=>{for(const Te of ue){if(Te.type==="milestone-group"&&Te.children){const Ye=Te.children.find(Ve=>Ve.id===Qe);if(Ye)return Ye.icon=Pe,!0}if(Te.children&&P(Te.children))return!0}return!1};P(b.value)},M=be=>{const Qe=be.target;if(!Qe)return;const Pe=Qe.scrollTop;p.value=Pe,window.dispatchEvent(new CustomEvent("task-list-vertical-scroll",{detail:{scrollTop:Pe}}))},G=be=>{const{scrollTop:Qe}=be.detail,Pe=l.value;p.value=Qe,Pe&&Math.abs(Pe.scrollTop-Qe)>1&&(Pe.scrollTop=Qe)},$=be=>{try{window.dispatchEvent(new CustomEvent("context-menu",{detail:be}))}catch(Qe){console.error("TaskList - Failed to dispatch context-menu event",Qe)}},ce=be=>{A("start-timer",be)},ge=be=>{A("stop-timer",be)},oe=be=>{A("add-predecessor",be)},Se=be=>{A("add-successor",be)},Oe=(be,Qe)=>{A("delete",be,Qe)};return i.onMounted(async()=>{s.value&&(u=new ResizeObserver(be=>{if(!E.value)for(const Qe of be)c.value=Qe.contentRect.width}),u.observe(s.value)),l.value&&(f.value=l.value.clientHeight,p.value=l.value.scrollTop,g=new ResizeObserver(be=>{for(const Qe of be)f.value=Qe.contentRect.height}),g.observe(l.value)),window.addEventListener("task-updated",se),window.addEventListener("task-added",fe),window.addEventListener("request-task-list",U),window.addEventListener("timeline-task-hover",R),window.addEventListener("timeline-vertical-scroll",G),window.addEventListener("milestone-icon-changed",Q),window.addEventListener("splitter-drag-start",S),window.addEventListener("splitter-drag-end",F),I()}),i.onUnmounted(()=>{u&&(u.disconnect(),u=null),g&&(g.disconnect(),g=null),window.removeEventListener("task-updated",se),window.removeEventListener("task-added",fe),window.removeEventListener("request-task-list",U),window.removeEventListener("timeline-task-hover",R),window.removeEventListener("timeline-vertical-scroll",G),window.removeEventListener("milestone-icon-changed",Q),window.removeEventListener("splitter-drag-start",S),window.removeEventListener("splitter-drag-end",F)}),(be,Qe)=>(i.openBlock(),i.createElementBlock("div",{ref_key:"taskListRef",ref:s,class:"task-list"},[i.createElementVNode("div",r4,[i.createElementVNode("div",n4,i.toDisplayString(i.unref(o).taskName||"任务名称"),1),(i.openBlock(!0),i.createElementBlock(i.Fragment,null,i.renderList(y.value,Pe=>(i.openBlock(),i.createElementBlock("div",{key:Pe.key,class:i.normalizeClass(["col",Pe.cssClass||`col-${Pe.key}`]),style:i.normalizeStyle(v(Pe))},i.toDisplayString(i.unref(o)[Pe.key]||Pe.label),7))),128))]),i.createElementVNode("div",{ref_key:"taskListBodyRef",ref:l,class:"task-list-body",onScroll:M},[i.createElementVNode("div",{class:"task-list-body-spacer",style:i.normalizeStyle({height:`${le.value}px`})},null,4),(i.openBlock(!0),i.createElementBlock(i.Fragment,null,i.renderList(N.value,({task:Pe,level:P})=>(i.openBlock(),i.createBlock(ty,{key:Pe.id,task:Pe,level:P,"is-hovered":B.value===Pe.id,"hovered-task-id":B.value,"on-hover":j,columns:y.value,"get-column-width-style":v,"disable-children-render":!0,onToggle:X,onDblclick:K,onContextmenu:$,onStartTimer:ce,onStopTimer:ge,onAddPredecessor:oe,onAddSuccessor:Se,onDelete:Oe},i.createSlots({_:2},[a.value?{name:"custom-task-content",fn:i.withCtx(ue=>[i.renderSlot(be.$slots,"custom-task-content",i.mergeProps({ref_for:!0},ue),void 0,!0)]),key:"0"}:void 0]),1032,["task","level","is-hovered","hovered-task-id","columns"]))),128)),i.createElementVNode("div",{class:"task-list-body-spacer",style:i.normalizeStyle({height:`${z.value}px`})},null,4)],544)],512))}}),Ay=Bn(a4,[["__scopeId","data-v-6afc1aa7"]]),Ie={HOUR:"hour",DAY:"day",WEEK:"week",MONTH:"month",QUARTER:"quarter",YEAR:"year"},i4={hour:{scale:Ie.HOUR,cellWidth:40,headerLevels:2,formatters:{primary:"yyyy年MM月dd日",secondary:"HH:mm"}},day:{scale:Ie.DAY,cellWidth:30,headerLevels:2,formatters:{primary:"yyyy年MM月",secondary:"dd"}},week:{scale:Ie.WEEK,cellWidth:120,headerLevels:2,formatters:{primary:"yyyy年MM月",secondary:"W周"}},month:{scale:Ie.MONTH,cellWidth:180,headerLevels:2,formatters:{primary:"yyyy年",secondary:"MM月"}},quarter:{scale:Ie.QUARTER,cellWidth:60,headerLevels:2,formatters:{primary:"yyyy年",secondary:"Q季度"}},year:{scale:Ie.YEAR,cellWidth:180,headerLevels:2,formatters:{primary:"yyyy年",secondary:"上半年|下半年"}}},s4={showAvatar:!0,showTitle:!0,showProgress:!0,dragThreshold:5,resizeHandleWidth:5,enableDragDelay:!1,dragDelayTime:150},o4={key:0,class:"parent-label"},l4=["src","alt"],c4={key:1,class:"avatar-text"},u4={key:2,class:"avatar-icon",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg"},f4={key:1,class:"task-name"},d4={class:"tooltip-title"},h4={class:"tooltip-content"},g4={class:"tooltip-row"},p4={class:"tooltip-label"},v4={class:"tooltip-value"},m4={class:"tooltip-row"},w4={class:"tooltip-label"},B4={class:"tooltip-value"},y4={class:"tooltip-row"},b4={class:"tooltip-label"},C4={class:"tooltip-value"},E4={class:"tooltip-row"},F4={class:"tooltip-label"},x4={class:"tooltip-value"},S4={class:"tooltip-row"},U4={class:"tooltip-label"},T4={class:"tooltip-value"},k4={class:"drag-tooltip-content"},Q4={class:"tooltip-row"},D4={class:"tooltip-label"},L4={class:"tooltip-value"},I4={class:"tooltip-row"},N4={class:"tooltip-label"},_4={class:"tooltip-value"},M4=1e3,O4=100,H4=250,R4=i.defineComponent({__name:"TaskBar",props:{task:{},rowHeight:{},dayWidth:{},startDate:{},isParent:{type:Boolean},onClick:{type:Function},scrollLeft:{},containerWidth:{},hideBubbles:{type:Boolean},timelineData:{},currentTimeScale:{},taskBarConfig:{},allowDragAndResize:{type:Boolean},isHighlighted:{type:Boolean},isPrimaryHighlight:{type:Boolean},isInHighlightMode:{type:Boolean}},emits:["update:task","bar-mounted","click","dblclick","drag-end","resize-end","scroll-to-position","start-timer","stop-timer","add-predecessor","add-successor","delete","context-menu","long-press"],setup(r,{emit:t}){const e=r,A=t,n=i.useSlots(),{getTranslation:a}=Zn(),o=pe=>a(pe),s=i.computed(()=>!!n["custom-task-content"]),l=i.computed(()=>({...s4,...e.taskBarConfig})),c=pe=>{if(!pe)return null;if(pe instanceof Date)return pe;if(typeof pe=="string"&&/^\d{4}-\d{2}-\d{2}$/.test(pe)){const[te,me,we]=pe.split("-").map(Number);return new Date(te,me-1,we)}if(typeof pe=="string"&&/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/.test(pe)){const[te,me]=pe.split(" "),[we,q,he]=te.split("-").map(Number),[Be,Me]=me.split(":").map(Number);return new Date(we,q-1,he,Be,Me)}const V=new Date(pe);return isNaN(V.getTime())?null:V},u=()=>{const pe=new Date;return new Date(pe.getFullYear(),pe.getMonth(),pe.getDate())},g=i.ref(u());let p=null;i.onMounted(()=>{p=window.setInterval(()=>{g.value=u()},6e4)}),i.onUnmounted(()=>{p!==null&&(clearInterval(p),p=null)});const f=pe=>{const V=pe.getFullYear(),te=String(pe.getMonth()+1).padStart(2,"0"),me=String(pe.getDate()).padStart(2,"0");if(e.currentTimeScale===Ie.HOUR){const we=String(pe.getHours()).padStart(2,"0"),q=String(pe.getMinutes()).padStart(2,"0");return`${V}-${te}-${me} ${we}:${q}`}return`${V}-${te}-${me}`},v=(pe,V)=>{const te=new Date(pe);return te.setDate(te.getDate()+V),te},y=(pe,V)=>{const te=new Date(pe);return te.setMinutes(te.getMinutes()+V),te},b=(pe,V)=>Math.round((V.getTime()-pe.getTime())/(1e3*60)),B=i.computed(()=>e.task.isEditable===!1?!0:e.currentTimeScale===Ie.YEAR),E=i.ref(!1),S=i.ref(!1),F=i.ref(!1),j=i.ref(!1),R=i.ref(0),K=i.ref(0),H=i.ref(0),I=i.ref(0),ee=i.ref(0),x=i.ref(0),T=i.ref(null),L=i.ref(!1),N=i.computed(()=>l.value.dragThreshold??5),ie=i.ref(!1),le=i.ref(null),z=i.ref(null),X=i.ref(!1),Ae=i.ref(0),se=i.ref(null),fe=i.ref(null),U=i.ref(null),Q=i.ref(null),M=i.ref(0),G=i.computed(()=>{var Be,Me;if(fe.value&&e.currentTimeScale===Ie.QUARTER)return{left:`${fe.value.left??0}px`,width:`${fe.value.width??100}px`,height:`${e.rowHeight-10}px`,top:"4px"};const pe=((Be=se.value)==null?void 0:Be.startDate)||e.task.startDate,V=((Me=se.value)==null?void 0:Me.endDate)||e.task.endDate,te=c(pe),me=c(V),we=ge.value;if(!te||!me||!we)return{left:"0px",width:"0px",height:`${e.rowHeight-10}px`,top:"4px"};let q=0,he=0;if(e.currentTimeScale===Ie.HOUR){const Re=new Date(we);Re.setHours(0,0,0,0);let Ke=te,st=me;const tt=pe||e.task.startDate,ht=V||e.task.endDate;typeof tt=="string"&&/^\d{4}-\d{2}-\d{2}$/.test(tt.trim())&&(Ke=new Date(te),Ke.setHours(0,0,0,0)),typeof ht=="string"&&/^\d{4}-\d{2}-\d{2}$/.test(ht.trim())&&(st=new Date(me),st.setDate(st.getDate()+1),st.setHours(0,0,0,0));const Ft=b(Re,Ke),Tt=b(Re,st),sA=40/60;q=Math.max(0,Ft*sA),he=Math.max(4,(Tt-Ft)*sA)}else{const Re=new Date(te.getFullYear(),te.getMonth(),te.getDate()),Ke=new Date(me.getFullYear(),me.getMonth(),me.getDate()),st=new Date(we.getFullYear(),we.getMonth(),we.getDate());if(e.timelineData&&e.currentTimeScale&&(e.currentTimeScale===Ie.WEEK||e.currentTimeScale===Ie.MONTH||e.currentTimeScale===Ie.QUARTER||e.currentTimeScale===Ie.YEAR)){const tt=lA(Re,e.timelineData,e.currentTimeScale),ht=new Date(Ke);ht.setDate(ht.getDate()+1);let Ft=lA(ht,e.timelineData,e.currentTimeScale);if(Ft===tt){let Tt=2;e.currentTimeScale===Ie.WEEK?Tt=60/7:e.currentTimeScale===Ie.QUARTER?Tt=60/90:e.currentTimeScale===Ie.YEAR&&(Tt=180/182),Ft=lA(Ke,e.timelineData,e.currentTimeScale)+Tt}q=tt,he=Math.max(Ft-tt,4)}else if(e.timelineData&&e.currentTimeScale===Ie.DAY){const tt=lA(Re,e.timelineData,e.currentTimeScale),ht=new Date(Ke);ht.setDate(ht.getDate()+1);let Ft=lA(ht,e.timelineData,e.currentTimeScale);Ft===tt&&(Ft=lA(Ke,e.timelineData,e.currentTimeScale)+30),q=tt,he=Math.max(Ft-tt,4)}else{const tt=Math.floor((Re.getTime()-st.getTime())/864e5),ht=Ke.getTime()-Re.getTime(),Ft=Math.round(ht/(1e3*60*60*24)),Tt=Ft===0?1:Ft+1;q=tt*e.dayWidth,he=Tt*e.dayWidth}}return{left:`${q}px`,width:`${he}px`,height:`${e.rowHeight-10}px`,top:"4px"}}),$=i.ref({left:0,top:0,width:0,height:0,timestamp:0}),ce=i.computed(()=>c(e.task.endDate||"")),ge=i.computed(()=>c(e.startDate)),oe=i.computed(()=>{if(e.isParent)return{type:"parent",color:"#409eff",bgColor:"#409eff",borderColor:"#409eff"};const pe=g.value,V=ce.value,te=e.task.progress||0;return te>=100?{type:"completed",color:"#909399",bgColor:"#f4f4f5",borderColor:"#d3d4d6"}:V&&V<pe&&te<100?{type:"delayed",color:"#f56c6c",bgColor:"#fef0f0",borderColor:"#fbc4c4"}:V&&V>=pe&&te>0?{type:"in-progress",color:"#e6a23c",bgColor:"#fdf6ec",borderColor:"#f5dab1"}:{type:"not-started",color:"#409eff",bgColor:"#ecf5ff",borderColor:"#b3d8ff"}}),Se=i.computed(()=>({type:"task-bar",task:e.task,status:oe.value,statusType:oe.value.type,isParent:e.isParent??!1,progress:e.task.progress||0,currentTimeScale:e.currentTimeScale,rowHeight:e.rowHeight,dayWidth:e.dayWidth})),Oe=i.computed(()=>(e.task.progress||0)>=100),be=i.computed(()=>e.isInHighlightMode&&!e.isHighlighted&&!e.isPrimaryHighlight),Qe=i.computed(()=>{const pe=e.task.progress||0,V=parseInt(G.value.width);return`${pe/100*V}px`}),Pe=i.computed(()=>e.dayWidth<=9),P=i.computed(()=>parseFloat(G.value.width||"0")<80),ue=i.computed(()=>Pe.value&&P.value),Te=(pe,V)=>{if(e.isHighlighted||e.isPrimaryHighlight||e.allowDragAndResize===!1||Oe.value||e.isParent||B.value||(pe.preventDefault(),pe.stopPropagation(),se.value=null,ie.value=!1,X.value=!1,le.value=V,L.value=!1,T.value&&(clearTimeout(T.value),T.value=null),V==="drag"&&(T.value=window.setTimeout(()=>{!ie.value&&!E.value&&!S.value&&!F.value&&(L.value=!0,A("long-press",e.task.id)),T.value=null},M4)),l.value.enableDragDelay&&l.value.dragDelayTime?z.value=window.setTimeout(()=>{X.value=!0,z.value=null},l.value.dragDelayTime):X.value=!0,!document.querySelector(".timeline")||!U.value))return;const me=U.value.getBoundingClientRect();Ae.value=pe.clientX-me.left,R.value=pe.clientX,K.value=parseInt(G.value.left),H.value=parseInt(G.value.width),(V==="resize-left"||V==="resize-right")&&(I.value=pe.clientX,ee.value=parseInt(G.value.width),x.value=parseInt(G.value.left)),window.addEventListener("timeline-auto-scroll",Ye),document.addEventListener("mousemove",qe),document.addEventListener("mouseup",rt)},Ye=pe=>{const{scrollDelta:V}=pe.detail;E.value?R.value-=V:(S.value||F.value)&&(I.value-=V)};let Ve=!1;function dt(){Ve||(Ve=!0,requestAnimationFrame(()=>{if(Ve=!1,!U.value)return;const pe=Date.now();if(pe-$.value.timestamp<O4){A("bar-mounted",{id:e.task.id,left:$.value.left,top:$.value.top,width:$.value.width,height:$.value.height});return}const V=U.value.getBoundingClientRect(),te={left:V.left,top:V.top,width:V.width,height:V.height};$.value={...te,timestamp:pe},A("bar-mounted",{id:e.task.id,...te})}))}const at=i.ref(!1),je=i.ref({x:0,y:0}),At=i.ref({startDate:"",endDate:""}),qe=pe=>{if(!(e.isHighlighted||e.isPrimaryHighlight)&&!(l.value.enableDragDelay&&!X.value)){if(!ie.value){if(Math.abs(pe.clientX-R.value)<N.value)return;ie.value=!0,le.value==="drag"?E.value=!0:le.value==="resize-left"?S.value=!0:le.value==="resize-right"&&(F.value=!0)}if(ie.value){if(window.dispatchEvent(new CustomEvent("drag-boundary-check",{detail:{mouseX:pe.clientX,isDragging:E.value||S.value||F.value}})),(E.value||S.value||F.value)&&(at.value=!0,je.value={x:pe.clientX+15,y:pe.clientY-60}),E.value){const V=pe.clientX-R.value;if(e.currentTimeScale===Ie.HOUR){const te=.6666666666666666,me=te*15,we=Math.max(0,K.value+V),q=Math.round(we/me)*me,he=Math.round(q/te),Be=new Date(e.startDate);Be.setHours(0,0,0,0);const Me=y(Be,he),Re=c(e.task.startDate)||e.startDate,Ke=c(e.task.endDate)||e.startDate;let st;if(e.task.startDate&&!e.task.startDate.includes(" ")){const ht=Ke.getTime()-Re.getTime();st=Math.max(1,Math.round(ht/(1e3*60*60*24))+1)*24*60}else st=b(Re,Ke);const tt=y(Me,st);se.value={startDate:f(Me),endDate:f(tt)},At.value={startDate:f(Me),endDate:f