feat: integrate coaching frameworks, Eisenhower matrix, Gantt chart, and Goal Validation test

This commit is contained in:
2026-05-25 07:59:09 +05:00
parent 7161523d01
commit bb971e665f
12 changed files with 2789 additions and 229 deletions
+97
View File
@@ -0,0 +1,97 @@
// Transform Obsidian canvas to Vue Flow elements
export const transformToFlowElements = (canvasData: any) => {
const nodes = (canvasData.nodes || []).map((node: any) => ({
id: node.id,
type: node.type === 'file' ? 'file' : node.type === 'ai' ? 'ai' : node.type === 'git' ? 'git' : node.type === 'task' ? 'task' : node.type === 'webhook' ? 'webhook' : 'text',
position: { x: Number(node.x) || 0, y: Number(node.y) || 0 },
data: {
...node,
width: node.width || 300,
height: node.height || 200,
label: node.label || node.text?.slice(0, 20) || node.file || 'Node',
// Ensure specific fields exist so the properties panel shows them
...(node.type === 'task' && {
text: node.text ?? '',
state: node.state ?? 'todo',
priority: node.priority ?? 'medium',
assigned_to: node.assigned_to ?? '',
start_date: node.start_date ?? '',
alarm: node.alarm ?? '',
script_id: node.script_id ?? ''
}),
...(node.type === 'text' && { text: node.text ?? '' }),
...(node.type === 'file' && { file: node.file ?? '' }),
...(node.type === 'ai' && { prompt: node.prompt ?? '' }),
...(node.type === 'webhook' && {
script_id: node.script_id ?? '',
url: node.url ?? '',
method: node.method ?? 'POST'
}),
...(node.type === 'git' && {
repo: node.repo ?? '',
branch: node.branch ?? 'main',
message: node.message ?? ''
})
},
style: {
width: `${node.width || 300}px`,
height: `${node.height || 200}px`,
background: node.style?.background || '#1e293b',
border: `1px solid ${node.style?.border || '#334155'}`,
borderRadius: '8px'
}
}))
const edges = (canvasData.edges || []).map((edge: any) => ({
id: edge.id,
source: edge.fromNode,
target: edge.toNode,
sourceHandle: edge.fromSide,
targetHandle: edge.toSide,
animated: true,
style: { stroke: '#475569', strokeWidth: 2 }
}))
return [...nodes, ...edges]
}
// Transform Vue Flow elements back to Obsidian canvas
export const transformToObsidianCanvas = (flowElements: any[]) => {
const nodes = flowElements.filter(el => el.position !== undefined).map(node => ({
id: node.id,
type: node.type === 'file' ? 'file' : node.type === 'task' ? 'task' : node.type === 'ai' ? 'ai' : node.type === 'webhook' ? 'webhook' : node.type === 'git' ? 'git' : 'text',
x: Math.round(Number(node.position.x) || 0),
y: Math.round(Number(node.position.y) || 0),
width: node.data.width || 300,
height: node.data.height || 200,
text: node.data.text,
label: node.data.label,
file: node.data.file,
state: node.data.state,
priority: node.data.priority,
assigned_to: node.data.assigned_to,
start_date: node.data.start_date,
alarm: node.data.alarm,
script_id: node.data.script_id,
prompt: node.data.prompt,
url: node.data.url,
method: node.data.method,
repo: node.data.repo,
branch: node.data.branch,
message: node.data.message,
style: {
background: node.style?.background || '#1e293b',
border: node.style?.border?.replace('1px solid ', '') || '#334155'
}
}))
const edges = flowElements.filter(el => el.source && el.target).map(edge => ({
id: edge.id,
fromNode: edge.source,
fromSide: edge.sourceHandle || 'right',
toNode: edge.target,
toSide: edge.targetHandle || 'left'
}))
return { nodes, edges }
}