diff --git a/.gitignore b/.gitignore
index bf162d7..8eaf4a3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,4 +10,5 @@ backend/public/*
# Личные файлы
deploy.js
deploy.php
-.vscode
\ No newline at end of file
+.vscode
+.cursorrules
\ No newline at end of file
diff --git a/front_vue/src/components/Board.vue b/front_vue/src/components/Board.vue
index 8f58093..6edb1e2 100644
--- a/front_vue/src/components/Board.vue
+++ b/front_vue/src/components/Board.vue
@@ -12,6 +12,7 @@
@open-task="(card) => emit('open-task', { card, columnId: column.id })"
@create-task="emit('create-task', column.id)"
@archive-task="archiveTask"
+ @move-request="handleMoveRequest"
/>
@@ -29,17 +30,59 @@
>
+
+
+
+
+
diff --git a/front_vue/src/views/ArchivePage.vue b/front_vue/src/views/ArchivePage.vue
index 3dc184f..eb0337e 100644
--- a/front_vue/src/views/ArchivePage.vue
+++ b/front_vue/src/views/ArchivePage.vue
@@ -108,8 +108,8 @@
:users="store.users"
:current-user-id="store.currentUserId"
:is-project-admin="store.isProjectAdmin"
+ :on-save="handleSaveTask"
@close="closePanel"
- @save="handleSaveTask"
@delete="handleDeleteTask"
@restore="handleRestoreFromPanel"
/>
@@ -120,6 +120,8 @@
title="Удалить задачу?"
message="Задача будет удалена безвозвратно. Это действие нельзя отменить."
confirm-text="Удалить"
+ variant="danger"
+ :is-loading="isDeleting"
@confirm="handleConfirmDelete"
@cancel="confirmDialogOpen = false"
/>
@@ -141,6 +143,10 @@ import { useMobile } from '../composables/useMobile'
const { isMobile } = useMobile()
+// ==================== СОСТОЯНИЯ ЗАГРУЗКИ ====================
+const isRestoring = ref(false)
+const isDeleting = ref(false)
+
// ==================== STORE ====================
const store = useProjectsStore()
@@ -288,21 +294,33 @@ const confirmDelete = (cardId) => {
}
const handleConfirmDelete = async () => {
- if (cardToDelete.value) {
+ if (isDeleting.value || !cardToDelete.value) return
+
+ isDeleting.value = true
+ try {
const result = await cardsApi.delete(cardToDelete.value)
if (result.success) {
cards.value = cards.value.filter(c => c.id !== cardToDelete.value)
}
+ confirmDialogOpen.value = false
+ cardToDelete.value = null
+ } finally {
+ isDeleting.value = false
}
- confirmDialogOpen.value = false
- cardToDelete.value = null
}
// ==================== ВОССТАНОВЛЕНИЕ ====================
const handleRestore = async (cardId) => {
- const result = await cardsApi.setArchive(cardId, 0)
- if (result.success) {
- cards.value = cards.value.filter(c => c.id !== cardId)
+ if (isRestoring.value) return
+
+ isRestoring.value = true
+ try {
+ const result = await cardsApi.setArchive(cardId, 0)
+ if (result.success) {
+ cards.value = cards.value.filter(c => c.id !== cardId)
+ }
+ } finally {
+ isRestoring.value = false
}
}
diff --git a/front_vue/src/views/MainApp.vue b/front_vue/src/views/MainApp.vue
index b8d1765..5f18f22 100644
--- a/front_vue/src/views/MainApp.vue
+++ b/front_vue/src/views/MainApp.vue
@@ -93,8 +93,8 @@
:users="store.users"
:current-user-id="store.currentUserId"
:is-project-admin="store.isProjectAdmin"
+ :on-save="handleSaveTask"
@close="closePanel"
- @save="handleSaveTask"
@delete="handleDeleteTask"
@archive="handleArchiveTask"
/>