v1.0.10 - UX upgrades

This commit is contained in:
LINING-PC\lining
2025-07-06 11:03:03 +08:00
parent 94ee66cbb4
commit af4a35254f
20 changed files with 2026 additions and 191 deletions
+109
View File
@@ -0,0 +1,109 @@
/**
* 前置任务工具函数
*/
/**
* 获取任务的前置任务ID数组
* @param predecessor 前置任务字段,可能是数组、字符串或空
* @returns 前置任务ID数组
*/
export function getPredecessorIds(predecessor?: number[] | string | string[]): number[] {
if (!predecessor) return []
// 如果已经是number数组,直接返回
if (Array.isArray(predecessor) && typeof predecessor[0] === 'number') {
return predecessor as number[]
}
// 如果是字符串数组
if (Array.isArray(predecessor)) {
return predecessor
.filter(id => id && id.toString().trim())
.map(id => Number(id.toString().trim()))
.filter(id => !isNaN(id))
}
// 字符串格式,支持逗号分隔的多个ID
return predecessor
.split(',')
.map(id => id.trim())
.filter(id => id)
.map(id => Number(id))
.filter(id => !isNaN(id))
}
/**
* 将前置任务ID数组转换为数组格式(标准格式)
* @param predecessorIds 前置任务ID数组
* @returns number数组
*/
export function predecessorIdsToArray(predecessorIds: number[]): number[] {
return predecessorIds.filter(id => id > 0)
}
/**
* 将前置任务ID数组转换为字符串格式(兼容性)
* @param predecessorIds 前置任务ID数组
* @returns 逗号分隔的字符串
*/
export function predecessorIdsToString(predecessorIds: number[]): string {
return predecessorIds.filter(id => id > 0).join(',')
}
/**
* 将前置任务字符串转换为数组格式
* @param predecessor 前置任务字符串
* @returns 前置任务ID数组
*/
export function predecessorStringToArray(predecessor?: string): string[] {
if (!predecessor) return []
return predecessor
.split(',')
.map(id => id.trim())
.filter(id => id)
}
/**
* 检查任务是否有特定的前置任务
* @param task 任务对象
* @param predecessorId 要检查的前置任务ID
* @returns 是否包含该前置任务
*/
export function hasPredecessor(task: { predecessor?: number[] }, predecessorId: number): boolean {
const ids = getPredecessorIds(task.predecessor)
return ids.includes(predecessorId)
}
/**
* 添加前置任务到任务
* @param task 任务对象
* @param predecessorId 要添加的前置任务ID
*/
export function addPredecessor(task: { predecessor?: number[] }, predecessorId: number): void {
const ids = getPredecessorIds(task.predecessor)
if (!ids.includes(predecessorId)) {
ids.push(predecessorId)
task.predecessor = predecessorIdsToArray(ids)
}
}
/**
* 从任务中移除前置任务
* @param task 任务对象
* @param predecessorId 要移除的前置任务ID
*/
export function removePredecessor(task: { predecessor?: number[] }, predecessorId: number): void {
const ids = getPredecessorIds(task.predecessor)
const filteredIds = ids.filter(id => id !== predecessorId)
task.predecessor = filteredIds.length > 0 ? predecessorIdsToArray(filteredIds) : undefined
}
/**
* 格式化前置任务显示文本
* @param predecessor 前置任务字段
* @returns 格式化后的显示文本
*/
export function formatPredecessorDisplay(predecessor?: number[]): string {
const ids = getPredecessorIds(predecessor)
return ids.length > 0 ? ids.join(', ') : '-'
}