feat: complete task board workflow gates
This commit is contained in:
@@ -16,6 +16,7 @@ import {
|
||||
} from '@lucide/vue'
|
||||
import { apiFetch } from '../services/api'
|
||||
import { useAuthStore } from '../stores/auth'
|
||||
import { TASK_AGENT_LABELS, TASK_AGENT_OPTIONS } from '../constants/agentPool'
|
||||
|
||||
/* ── Types ──────────────────────────────────── */
|
||||
interface TaskDto {
|
||||
@@ -166,7 +167,9 @@ function childStatusSummary(taskId: string): string {
|
||||
}
|
||||
|
||||
function progressHint(taskLike: Pick<TaskDto, 'id' | 'lastActivityMessage' | 'expectedFrom'>): string {
|
||||
return taskLike.lastActivityMessage?.trim() || childStatusSummary(taskLike.id) || (taskLike.expectedFrom ? `Wartet auf ${taskLike.expectedFrom}` : 'Noch kein relevanter Progress-Status')
|
||||
return taskLike.lastActivityMessage?.trim()
|
||||
|| childStatusSummary(taskLike.id)
|
||||
|| (taskLike.expectedFrom ? `Wartet auf ${TASK_AGENT_LABELS[taskLike.expectedFrom.toLowerCase()] ?? taskLike.expectedFrom}` : 'Noch kein relevanter Progress-Status')
|
||||
}
|
||||
|
||||
function delegationSummary(taskLike: TaskDto): string | null {
|
||||
@@ -451,7 +454,11 @@ function handleKeydown(e: KeyboardEvent) {
|
||||
<option value="Medium">Medium</option>
|
||||
<option value="Low">Low</option>
|
||||
</select>
|
||||
<input v-model="subtaskAssign" class="galaxy-input narrow" placeholder="Zuständig (bao, iris, researcher…)" />
|
||||
<select v-model="subtaskAssign" class="galaxy-input galaxy-select narrow">
|
||||
<option v-for="option in TASK_AGENT_OPTIONS" :key="option.id || 'unassigned'" :value="option.id">
|
||||
{{ option.label }}
|
||||
</option>
|
||||
</select>
|
||||
<button class="btn-primary btn-sm" @click="createSubtask" :disabled="creatingSubtask">
|
||||
{{ creatingSubtask ? 'Erstelle…' : 'Anlegen' }}
|
||||
</button>
|
||||
@@ -565,14 +572,9 @@ function handleKeydown(e: KeyboardEvent) {
|
||||
<label class="sidebar-field">
|
||||
<span>Zuständig</span>
|
||||
<select v-model="form.assignedTo" class="galaxy-input galaxy-select">
|
||||
<option value="">Nicht zugewiesen</option>
|
||||
<option value="bao">👤 Bao</option>
|
||||
<option value="iris">🤖 Iris</option>
|
||||
<option value="programmer">🛠 Programmer</option>
|
||||
<option value="reviewer">🔎 Reviewer</option>
|
||||
<option value="architekt">🏛 Architekt</option>
|
||||
<option value="researcher">🔬 Researcher</option>
|
||||
<option value="executor">⚡ Executor</option>
|
||||
<option v-for="option in TASK_AGENT_OPTIONS" :key="option.id || 'unassigned'" :value="option.id">
|
||||
{{ option.label }}
|
||||
</option>
|
||||
</select>
|
||||
</label>
|
||||
<label class="sidebar-field">
|
||||
@@ -590,6 +592,7 @@ function handleKeydown(e: KeyboardEvent) {
|
||||
<div><dt>Erstellt</dt><dd>{{ formatDate(task.createdAt) }}</dd></div>
|
||||
<div><dt>Geändert</dt><dd>{{ formatDate(task.updatedAt, true) }}</dd></div>
|
||||
<div v-if="task.isAgentTask"><dt>Letzter Status</dt><dd>{{ relativeTime(task.lastActivityAt ?? task.updatedAt) }}</dd></div>
|
||||
<div v-if="task.expectedFrom"><dt>Erwartet von</dt><dd>{{ TASK_AGENT_LABELS[task.expectedFrom.toLowerCase()] ?? task.expectedFrom }}</dd></div>
|
||||
<div v-if="task.parentTaskId"><dt>Task-Typ</dt><dd>Sichtbare Child-Task</dd></div>
|
||||
</dl>
|
||||
</section>
|
||||
|
||||
Reference in New Issue
Block a user