Skip to main content
Glama
+page.svelte3.45 kB
<script> import { onMount } from 'svelte'; import GanttChart from '$lib/components/GanttChart.svelte'; let tasks = []; let projects = []; let loading = true; let error = null; let selectedView = 'tasks'; // 'tasks' or 'projects' onMount(async () => { await loadData(); }); async function loadData() { try { loading = true; const [tasksResponse, projectsResponse] = await Promise.all([ fetch('/api/tasks'), fetch('/api/projects') ]); if (tasksResponse.ok && projectsResponse.ok) { tasks = await tasksResponse.json(); projects = await projectsResponse.json(); } else { error = 'Failed to load data'; } } catch (e) { error = 'Error loading data: ' + e.message; } finally { loading = false; } } </script> <svelte:head> <title>간트 차트 - WorkflowMCP Dashboard</title> </svelte:head> <div class="space-y-6"> <div class="flex items-center justify-between"> <h1 class="text-3xl font-bold text-gray-900">간트 차트</h1> <div class="flex items-center space-x-4"> <!-- View Selector --> <div class="flex bg-gray-100 rounded-lg p-1"> <button class="px-3 py-1 text-sm rounded-md transition-colors {selectedView === 'tasks' ? 'bg-white text-blue-600 shadow-sm' : 'text-gray-600 hover:text-gray-900'}" on:click={() => selectedView = 'tasks'} > 작업 기반 </button> <button class="px-3 py-1 text-sm rounded-md transition-colors {selectedView === 'projects' ? 'bg-white text-blue-600 shadow-sm' : 'text-gray-600 hover:text-gray-900'}" on:click={() => selectedView = 'projects'} > 프로젝트 기반 </button> </div> <button on:click={loadData} class="btn btn-secondary"> 🔄 새로고침 </button> </div> </div> {#if loading} <div class="flex justify-center items-center h-96"> <div class="animate-spin rounded-full h-32 w-32 border-b-2 border-blue-600"></div> </div> {:else if error} <div class="bg-red-50 border border-red-200 rounded-md p-4"> <div class="text-red-800">{error}</div> </div> {:else} <!-- Chart Container --> <div class="card"> <div class="mb-4 flex items-center justify-between"> <h3 class="text-lg font-semibold text-gray-900"> {selectedView === 'tasks' ? '작업별 타임라인' : '프로젝트별 타임라인'} </h3> <div class="text-sm text-gray-500"> 총 {selectedView === 'tasks' ? tasks.length : projects.length}개 항목 </div> </div> <GanttChart data={selectedView === 'tasks' ? tasks : projects} type={selectedView} /> </div> <!-- Legend --> <div class="card"> <h3 class="text-lg font-semibold text-gray-900 mb-4">범례</h3> <div class="grid grid-cols-2 md:grid-cols-4 gap-4"> <div class="flex items-center space-x-2"> <div class="w-4 h-4 bg-gray-400 rounded"></div> <span class="text-sm text-gray-600">대기중</span> </div> <div class="flex items-center space-x-2"> <div class="w-4 h-4 bg-blue-500 rounded"></div> <span class="text-sm text-gray-600">진행중</span> </div> <div class="flex items-center space-x-2"> <div class="w-4 h-4 bg-green-500 rounded"></div> <span class="text-sm text-gray-600">완료</span> </div> <div class="flex items-center space-x-2"> <div class="w-4 h-4 bg-red-500 rounded"></div> <span class="text-sm text-gray-600">지연</span> </div> </div> </div> {/if} </div>

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/foswmine/workflow-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server