feat(frontend) : integrate documents into TaskModal
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -121,6 +121,30 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</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 -->
|
<!-- Git section -->
|
||||||
<TaskGitSection
|
<TaskGitSection
|
||||||
v-if="hasGitea && isEditing && task"
|
v-if="hasGitea && isEditing && task"
|
||||||
@@ -191,6 +215,7 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type { Task, TaskWrite } from '~/services/dto/task'
|
import type { Task, TaskWrite } from '~/services/dto/task'
|
||||||
|
import type { TaskDocument } from '~/services/dto/task-document'
|
||||||
import { useGiteaService } from '~/services/gitea'
|
import { useGiteaService } from '~/services/gitea'
|
||||||
import type { TaskStatus } from '~/services/dto/task-status'
|
import type { TaskStatus } from '~/services/dto/task-status'
|
||||||
import type { TaskEffort } from '~/services/dto/task-effort'
|
import type { TaskEffort } from '~/services/dto/task-effort'
|
||||||
@@ -339,6 +364,45 @@ watch(() => props.modelValue, async (open) => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const { create, update, remove } = useTaskService()
|
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() {
|
async function handleDelete() {
|
||||||
if (!props.task) return
|
if (!props.task) return
|
||||||
|
|||||||
Reference in New Issue
Block a user