Spaces:
Sleeping
Sleeping
| <template> | |
| <div class="min-h-screen bg-gray-50"> | |
| <!-- Header --> | |
| <header class="bg-white border-b border-gray-200 px-6 py-4"> | |
| <div class="max-w-7xl mx-auto flex justify-between items-center"> | |
| <div> | |
| <h1 class="text-2xl font-bold text-gray-900">SAAP Dashboard</h1> | |
| <p class="text-sm text-gray-600">Multi-Agent Platform</p> | |
| </div> | |
| <div class="flex items-center space-x-4"> | |
| <div class="flex items-center space-x-2"> | |
| <div class="w-2 h-2 bg-green-400 rounded-full"></div> | |
| <span class="text-sm text-gray-700">Connected</span> | |
| </div> | |
| <div class="text-center"> | |
| <div class="text-xl font-bold text-blue-600">{{ activeAgents }}</div> | |
| <div class="text-xs text-gray-500 uppercase">Active Agents</div> | |
| </div> | |
| </div> | |
| </div> | |
| </header> | |
| <!-- Content --> | |
| <main class="max-w-7xl mx-auto px-6 py-6"> | |
| <!-- Action Buttons --> | |
| <div class="flex space-x-3 mb-6"> | |
| <button | |
| @click="refresh" | |
| class="flex items-center px-4 py-2 bg-white border border-gray-300 rounded-lg text-sm font-medium hover:bg-gray-50" | |
| > | |
| <ArrowPathIcon class="w-4 h-4 mr-2" /> | |
| Refresh | |
| </button> | |
| <button | |
| @click="showForm = !showForm" | |
| class="flex items-center px-4 py-2 bg-blue-600 text-white rounded-lg text-sm font-medium hover:bg-blue-700" | |
| > | |
| <PlusIcon class="w-4 h-4 mr-2" /> | |
| Add Agent | |
| </button> | |
| </div> | |
| <!-- Stats Grid --> | |
| <div class="grid grid-cols-1 md:grid-cols-4 gap-6 mb-8"> | |
| <div class="bg-white p-6 rounded-xl border border-gray-200"> | |
| <div class="flex items-center space-x-4"> | |
| <div class="w-12 h-12 bg-blue-100 rounded-lg flex items-center justify-center"> | |
| <UserGroupIcon class="w-6 h-6 text-blue-600" /> | |
| </div> | |
| <div> | |
| <div class="text-xl font-bold text-gray-900">{{ totalAgents }}</div> | |
| <div class="text-sm text-gray-600">Total Agents</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="bg-white p-6 rounded-xl border border-gray-200"> | |
| <div class="flex items-center space-x-4"> | |
| <div class="w-12 h-12 bg-green-100 rounded-lg flex items-center justify-center"> | |
| <ChartBarIcon class="w-6 h-6 text-green-600" /> | |
| </div> | |
| <div> | |
| <div class="text-xl font-bold text-gray-900">{{ activeAgents }}</div> | |
| <div class="text-sm text-gray-600">Active</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="bg-white p-6 rounded-xl border border-gray-200"> | |
| <div class="flex items-center space-x-4"> | |
| <div class="w-12 h-12 bg-orange-100 rounded-lg flex items-center justify-center"> | |
| <ChatBubbleLeftIcon class="w-6 h-6 text-orange-600" /> | |
| </div> | |
| <div> | |
| <div class="text-xl font-bold text-gray-900">{{ messages }}</div> | |
| <div class="text-sm text-gray-600">Messages</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="bg-white p-6 rounded-xl border border-gray-200"> | |
| <div class="flex items-center space-x-4"> | |
| <div class="w-12 h-12 bg-purple-100 rounded-lg flex items-center justify-center"> | |
| <ClockIcon class="w-6 h-6 text-purple-600" /> | |
| </div> | |
| <div> | |
| <div class="text-xl font-bold text-gray-900">1.8s</div> | |
| <div class="text-sm text-gray-600">Response Time</div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Add Agent Form (Toggle) --> | |
| <div v-if="showForm" class="bg-white p-6 rounded-xl border border-gray-200 mb-6"> | |
| <h3 class="text-lg font-semibold mb-4">Add New Agent</h3> | |
| <div class="grid grid-cols-1 md:grid-cols-2 gap-4"> | |
| <input | |
| v-model="newAgent.name" | |
| type="text" | |
| placeholder="Agent Name" | |
| class="px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500" | |
| > | |
| <select | |
| v-model="newAgent.type" | |
| class="px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500" | |
| > | |
| <option>Coordinator</option> | |
| <option>Developer</option> | |
| <option>Analyst</option> | |
| </select> | |
| </div> | |
| <div class="mt-4"> | |
| <button | |
| @click="addAgent" | |
| class="px-6 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700" | |
| > | |
| Create Agent | |
| </button> | |
| </div> | |
| </div> | |
| <!-- Agents Grid --> | |
| <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"> | |
| <div | |
| v-for="agent in agents" | |
| :key="agent.id" | |
| class="bg-white p-6 rounded-xl border border-gray-200 hover:shadow-md transition-shadow" | |
| > | |
| <div class="flex items-start justify-between mb-4"> | |
| <div class="flex items-center space-x-3"> | |
| <div | |
| class="w-10 h-10 rounded-full flex items-center justify-center text-white font-medium" | |
| :style="{ backgroundColor: agent.color }" | |
| > | |
| {{ agent.name.charAt(0) }} | |
| </div> | |
| <div> | |
| <h4 class="font-semibold text-gray-900">{{ agent.name }}</h4> | |
| <p class="text-sm text-gray-600">{{ agent.type }}</p> | |
| </div> | |
| </div> | |
| <span | |
| class="px-2 py-1 text-xs font-medium rounded-full" | |
| :class="agent.status === 'active' ? 'bg-green-100 text-green-800' : 'bg-gray-100 text-gray-800'" | |
| > | |
| {{ agent.status }} | |
| </span> | |
| </div> | |
| <div class="flex space-x-2"> | |
| <button | |
| v-if="agent.status !== 'active'" | |
| @click="toggleAgent(agent, 'active')" | |
| class="flex items-center px-3 py-1.5 bg-green-50 text-green-700 rounded-lg text-sm hover:bg-green-100" | |
| > | |
| <PlayIcon class="w-4 h-4 mr-1" /> | |
| Start | |
| </button> | |
| <button | |
| v-if="agent.status === 'active'" | |
| @click="toggleAgent(agent, 'inactive')" | |
| class="flex items-center px-3 py-1.5 bg-red-50 text-red-700 rounded-lg text-sm hover:bg-red-100" | |
| > | |
| <StopIcon class="w-4 h-4 mr-1" /> | |
| Stop | |
| </button> | |
| <button class="flex items-center px-3 py-1.5 bg-blue-50 text-blue-700 rounded-lg text-sm hover:bg-blue-100"> | |
| <ChatBubbleLeftIcon class="w-4 h-4 mr-1" /> | |
| Chat | |
| </button> | |
| </div> | |
| </div> | |
| <!-- Empty State --> | |
| <div v-if="agents.length === 0" class="col-span-full text-center py-12"> | |
| <CpuChipIcon class="w-16 h-16 mx-auto text-gray-400 mb-4" /> | |
| <h3 class="text-lg font-medium text-gray-900 mb-2">No Agents Yet</h3> | |
| <p class="text-gray-600 mb-6">Create your first AI agent to get started.</p> | |
| <button | |
| @click="showForm = true" | |
| class="px-6 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700" | |
| > | |
| <PlusIcon class="w-4 h-4 mr-2 inline" /> | |
| Add First Agent | |
| </button> | |
| </div> | |
| </div> | |
| </main> | |
| </div> | |
| </template> | |
| <script> | |
| import { ref, computed } from 'vue' | |
| import { | |
| ArrowPathIcon, | |
| PlusIcon, | |
| UserGroupIcon, | |
| ChartBarIcon, | |
| ChatBubbleLeftIcon, | |
| ClockIcon, | |
| PlayIcon, | |
| StopIcon, | |
| CpuChipIcon | |
| } from '@heroicons/vue/24/outline' | |
| export default { | |
| name: 'DashboardSimple', | |
| components: { | |
| ArrowPathIcon, | |
| PlusIcon, | |
| UserGroupIcon, | |
| ChartBarIcon, | |
| ChatBubbleLeftIcon, | |
| ClockIcon, | |
| PlayIcon, | |
| StopIcon, | |
| CpuChipIcon | |
| }, | |
| setup() { | |
| const showForm = ref(false) | |
| const newAgent = ref({ | |
| name: '', | |
| type: 'Coordinator' | |
| }) | |
| const agents = ref([ | |
| { | |
| id: '1', | |
| name: 'Jane Alesi', | |
| type: 'Lead Coordinator', | |
| status: 'active', | |
| color: '#8B5CF6' | |
| }, | |
| { | |
| id: '2', | |
| name: 'John Alesi', | |
| type: 'Developer', | |
| status: 'inactive', | |
| color: '#14B8A6' | |
| }, | |
| { | |
| id: '3', | |
| name: 'Lara Alesi', | |
| type: 'Medical Expert', | |
| status: 'active', | |
| color: '#EC4899' | |
| } | |
| ]) | |
| const totalAgents = computed(() => agents.value.length) | |
| const activeAgents = computed(() => | |
| agents.value.filter(a => a.status === 'active').length | |
| ) | |
| const messages = computed(() => totalAgents.value * 15) | |
| const refresh = () => { | |
| console.log('🔄 Refreshing data...') | |
| } | |
| const addAgent = () => { | |
| if (newAgent.value.name.trim()) { | |
| agents.value.push({ | |
| id: Date.now().toString(), | |
| name: newAgent.value.name, | |
| type: newAgent.value.type, | |
| status: 'inactive', | |
| color: '#6B7280' | |
| }) | |
| newAgent.value = { name: '', type: 'Coordinator' } | |
| showForm.value = false | |
| } | |
| } | |
| const toggleAgent = (agent, newStatus) => { | |
| agent.status = newStatus | |
| console.log(`${agent.name} is now ${newStatus}`) | |
| } | |
| return { | |
| showForm, | |
| newAgent, | |
| agents, | |
| totalAgents, | |
| activeAgents, | |
| messages, | |
| refresh, | |
| addAgent, | |
| toggleAgent | |
| } | |
| } | |
| } | |
| </script> |