diff --git a/frontend/src/components/chat/KanbanDetail.vue b/frontend/src/components/chat/KanbanDetail.vue index ba2fca6..1a2881d 100644 --- a/frontend/src/components/chat/KanbanDetail.vue +++ b/frontend/src/components/chat/KanbanDetail.vue @@ -1,5 +1,6 @@ - - × - - ☑ - {{ mockTask.title }} + + {{ mockTask.title }} + + + - C - {{ mockTask.assignee }} 创建于:{{ mockTask.createdAt }} + 创建于:{{ mockTask.createdAt }} - - ✓ + + + + @@ -70,25 +179,40 @@ function formatDate() { ☞ 描述 - - 添加详细描述... - + ☰ - 负责人:C{{ mockTask.assignname }} + 主负责指挥官: + + + {{ agent.icon }} {{ agent.name }} + + ⚑ - 优先级:{{ mockTask.priority }} + 优先级: + + + {{ p.name }} + + 📅 - 任务状态: - {{ mockTask.completed ? '已完成' : '进行中' }} - + 任务状态: + + + {{ s.name }} + + @@ -98,9 +222,44 @@ function formatDate() { ☑ 子任务 - 添加子任务 + 添加子任务 + + 暂无子任务 + + + ⋮⋮ + + + + 子指挥官 + + {{ agent.icon }} {{ agent.name }} + + + × + - 暂无子任务 @@ -120,41 +279,6 @@ function formatDate() { - - - - ✂ - 标记未完成 - - - ↻ - 优先级 - - - 👤 - 负责人 - - - 📆 - 计划时间 - - - 📎 - 添加附件 - - - 📧 - 关注人 - - - 📁 - 归档 - - - 🗑 - 删除 - - @@ -200,23 +324,6 @@ function formatDate() { transform: scale(1); } -.detail-close { - position: absolute; - top: 16px; - right: 20px; - font-size: 28px; - color: #ff4d4f; - background: none; - border: none; - cursor: pointer; - line-height: 1; - z-index: 10; -} - -.detail-close:hover { - color: #ff7875; -} - .detail-header { display: flex; justify-content: space-between; @@ -225,8 +332,38 @@ function formatDate() { border-bottom: 1px solid rgba(0, 243, 255, 0.1); } +.header-actions { + display: flex; + align-items: center; + gap: 16px; +} + +.btn-delete-icon { + width: 32px; + height: 32px; + border-radius: 8px; + border: 1px solid rgba(255, 77, 79, 0.3); + background: rgba(255, 77, 79, 0.08); + color: #ff4d4f; + cursor: pointer; + transition: all var(--transition-fast); + display: flex; + align-items: center; + justify-content: center; +} + +.btn-delete-icon:hover { + background: rgba(255, 77, 79, 0.2); + border-color: #ff4d4f; +} + +.btn-delete-icon :deep(svg) { + stroke: currentColor; +} + .task-title-section { flex: 1; + min-width: 0; } .task-title { @@ -234,13 +371,71 @@ function formatDate() { font-weight: 600; color: #e0f7ff; margin-bottom: 10px; - display: flex; + display: inline-flex; align-items: center; gap: 8px; + max-width: 100%; } .check-icon { color: #52c41a; + flex-shrink: 0; +} + +.title-text { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 400px; +} + +.title-input { + font-size: 22px; + font-weight: 600; + font-family: inherit; + color: #e0f7ff; + background: rgba(0, 243, 255, 0.08); + border: 1px solid rgba(0, 243, 255, 0.3); + border-radius: 6px; + padding: 4px 10px; + outline: none; + min-width: 200px; + max-width: 400px; +} + +.title-input:focus { + border-color: rgba(0, 243, 255, 0.6); + box-shadow: 0 0 12px rgba(0, 245, 212, 0.2); +} + +.btn-edit-title { + width: 28px; + height: 28px; + border-radius: 6px; + border: 1px solid transparent; + background: transparent; + color: var(--text-dim); + cursor: pointer; + transition: all var(--transition-fast); + display: flex; + align-items: center; + justify-content: center; + opacity: 0; + flex-shrink: 0; +} + +.task-title:hover .btn-edit-title { + opacity: 1; +} + +.btn-edit-title:hover { + background: rgba(0, 243, 255, 0.1); + border-color: rgba(0, 243, 255, 0.2); + color: var(--accent-cyan); +} + +.btn-edit-title :deep(svg) { + stroke: currentColor; } .task-meta { @@ -262,20 +457,7 @@ function formatDate() { margin-right: 6px; } -.status-badge { - width: 80px; - height: 80px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-size: 36px; -} - .detail-content { - display: grid; - grid-template-columns: 1fr 240px; - gap: 20px; padding: 20px 24px; flex: 1; overflow-y: auto; @@ -320,13 +502,27 @@ function formatDate() { } .description-box { + width: 100%; background: rgba(0, 0, 0, 0.3); border: 1px solid rgba(0, 243, 255, 0.1); border-radius: 8px; padding: 16px; - min-height: 60px; + min-height: 100px; color: var(--text-dim); font-size: 14px; + font-family: inherit; + resize: vertical; + outline: none; + transition: border-color var(--transition-fast); + box-sizing: border-box; +} + +.description-box:focus { + border-color: rgba(0, 243, 255, 0.3); +} + +.description-box::placeholder { + color: var(--text-dim); } .task-info-list { @@ -350,6 +546,80 @@ function formatDate() { text-align: center; } +.agent-select { + background: rgba(0, 0, 0, 0.3); + border: 1px solid rgba(0, 243, 255, 0.2); + border-radius: 6px; + color: #e0f7ff; + font-size: 13px; + font-family: inherit; + padding: 6px 10px; + cursor: pointer; + outline: none; + transition: border-color var(--transition-fast); +} + +.agent-select:hover { + border-color: rgba(0, 243, 255, 0.4); +} + +.agent-select:focus { + border-color: rgba(0, 243, 255, 0.5); +} + +.agent-select option { + background: #0a0f1a; + color: #e0f7ff; +} + +.priority-select { + background: rgba(0, 0, 0, 0.3); + border: 1px solid rgba(0, 243, 255, 0.2); + border-radius: 6px; + color: #e0f7ff; + font-size: 13px; + font-family: inherit; + padding: 6px 10px; + cursor: pointer; + outline: none; + transition: border-color var(--transition-fast); +} + +.priority-select:hover { + border-color: rgba(0, 243, 255, 0.4); +} + +.priority-select:focus { + border-color: rgba(0, 243, 255, 0.5); +} + +.priority-select option, +.status-select option { + background: #0a0f1a; + color: #e0f7ff; +} + +.status-select { + background: rgba(0, 0, 0, 0.3); + border: 1px solid rgba(0, 243, 255, 0.2); + border-radius: 6px; + color: #e0f7ff; + font-size: 13px; + font-family: inherit; + padding: 6px 10px; + cursor: pointer; + outline: none; + transition: border-color var(--transition-fast); +} + +.status-select:hover { + border-color: rgba(0, 243, 255, 0.4); +} + +.status-select:focus { + border-color: rgba(0, 243, 255, 0.5); +} + .priority-high { color: #ff4d4f; font-weight: 600; @@ -385,6 +655,124 @@ function formatDate() { font-size: 14px; } +.subtask-list { + display: flex; + flex-direction: column; + gap: 8px; +} + +.subtask-item { + display: flex; + align-items: center; + gap: 10px; + padding: 8px; + background: rgba(0, 0, 0, 0.2); + border: 1px solid rgba(0, 243, 255, 0.08); + border-radius: 8px; + transition: border-color var(--transition-fast), opacity var(--transition-fast); +} + +.subtask-item.drag-over { + border-color: rgba(0, 243, 255, 0.5); + border-style: dashed; +} + +.subtask-checkbox { + width: 16px; + height: 16px; + cursor: pointer; + flex-shrink: 0; +} + +.subtask-input { + flex: 1; + background: transparent; + border: none; + color: #e0f7ff; + font-size: 13px; + font-family: inherit; + outline: none; +} + +.subtask-input.completed { + text-decoration: line-through; + color: var(--text-dim); +} + +.subtask-input::placeholder { + color: var(--text-dim); +} + +.subtask-delete { + width: 24px; + height: 24px; + border: none; + background: transparent; + color: var(--text-dim); + font-size: 18px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + border-radius: 4px; + transition: all var(--transition-fast); + flex-shrink: 0; +} + +.subtask-delete:hover { + background: rgba(255, 77, 79, 0.2); + color: #ff4d4f; +} + +.subtask-drag { + width: 24px; + height: 24px; + border: none; + background: transparent; + color: var(--text-dim); + font-size: 14px; + cursor: grab; + display: flex; + align-items: center; + justify-content: center; + border-radius: 4px; + transition: all var(--transition-fast); + flex-shrink: 0; +} + +.subtask-drag:hover { + background: rgba(0, 243, 255, 0.1); + color: var(--accent-cyan); +} + +.subtask-agent { + background: rgba(0, 0, 0, 0.3); + border: 1px solid rgba(0, 243, 255, 0.15); + border-radius: 4px; + color: #e0f7ff; + font-size: 11px; + font-family: inherit; + padding: 4px 6px; + cursor: pointer; + outline: none; + transition: border-color var(--transition-fast); + flex-shrink: 0; + min-width: 80px; +} + +.subtask-agent:hover { + border-color: rgba(0, 243, 255, 0.3); +} + +.subtask-agent:focus { + border-color: rgba(0, 243, 255, 0.4); +} + +.subtask-agent option { + background: #0a0f1a; + color: #e0f7ff; +} + .comment-empty { color: var(--text-dim); font-size: 14px; @@ -436,46 +824,6 @@ function formatDate() { background: rgba(0, 243, 255, 0.2); } -.sidebar { - display: flex; - flex-direction: column; - gap: 8px; -} - -.sidebar-btn { - padding: 10px 14px; - border: 1px solid rgba(0, 243, 255, 0.15); - border-radius: 6px; - background: rgba(0, 0, 0, 0.2); - color: #e0f7ff; - font-size: 13px; - text-align: left; - cursor: pointer; - transition: all var(--transition-fast); - display: flex; - align-items: center; - gap: 8px; -} - -.sidebar-btn:hover { - border-color: rgba(0, 243, 255, 0.4); - background: rgba(0, 243, 255, 0.08); -} - -.sidebar-btn .icon { - font-size: 14px; -} - -.sidebar-btn.btn-delete { - border-color: rgba(255, 77, 79, 0.3); - color: #ff4d4f; -} - -.sidebar-btn.btn-delete:hover { - background: rgba(255, 77, 79, 0.1); - border-color: #ff4d4f; -} - /* Scrollbar styling */ .detail-content::-webkit-scrollbar { width: 8px;