feat(frontend) : integrate documents into TaskModal

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-15 18:09:20 +01:00
parent 28fbc73248
commit 245a8a932e

View File

@@ -121,6 +121,30 @@
/>
</div>
<!-- Documents -->
<TaskDocumentUpload
v-if="isEditing && task && isAdmin"
:task-id="task.id"
@uploaded="handleDocumentUploaded"
/>
<TaskDocumentList
v-if="isEditing && task"
:documents="documents"
:is-admin="isAdmin"
@preview="openPreview"
@delete="handleDeleteDocument"
/>
<!-- Document preview modal -->
<TaskDocumentPreview
:document="previewDoc"
:has-prev="previewIndex > 0"
:has-next="previewIndex < documents.length - 1"
@close="previewDoc = null"
@prev="prevPreview"
@next="nextPreview"
/>
<!-- Git section -->
<TaskGitSection
v-if="hasGitea && isEditing && task"
@@ -191,6 +215,7 @@
<script setup lang="ts">
import type { Task, TaskWrite } from '~/services/dto/task'
import type { TaskDocument } from '~/services/dto/task-document'
import { useGiteaService } from '~/services/gitea'
import type { TaskStatus } from '~/services/dto/task-status'
import type { TaskEffort } from '~/services/dto/task-effort'
@@ -339,6 +364,45 @@ watch(() => props.modelValue, async (open) => {
})
const { create, update, remove } = useTaskService()
const { remove: removeDocument } = useTaskDocumentService()
const { t } = useI18n()
const authStore = useAuthStore()
const isAdmin = computed(() => authStore.user?.roles?.includes('ROLE_ADMIN') ?? false)
const documents = computed(() => props.task?.documents ?? [])
const previewDoc = ref<TaskDocument | null>(null)
const previewIndex = computed(() => {
if (!previewDoc.value) return -1
return documents.value.findIndex(d => d.id === previewDoc.value!.id)
})
function openPreview(doc: TaskDocument) {
previewDoc.value = doc
}
function prevPreview() {
if (previewIndex.value > 0) {
previewDoc.value = documents.value[previewIndex.value - 1]
}
}
function nextPreview() {
if (previewIndex.value < documents.value.length - 1) {
previewDoc.value = documents.value[previewIndex.value + 1]
}
}
async function handleDeleteDocument(doc: TaskDocument) {
if (!confirm(t('taskDocuments.confirmDeleteMessage'))) return
await removeDocument(doc.id)
emit('saved')
}
function handleDocumentUploaded() {
emit('saved')
}
async function handleDelete() {
if (!props.task) return