1
0

Управление проектами

Добавил возможность удаления, создание и редактирование проектов.
This commit is contained in:
2026-01-18 10:19:34 +07:00
parent 15725ae90a
commit 250eac70a7
11 changed files with 2273 additions and 16 deletions

View File

@@ -7,12 +7,35 @@
<DepartmentTags
v-model="activeDepartment"
@project-change="onProjectChange"
@create-project="openCreateProjectPanel"
@edit-project="openEditProjectPanel"
/>
</template>
<!-- Мобильный: Проект + Отделы -->
<template #mobile-filters>
<ProjectSelector @change="onProjectChange" />
<ProjectSelector
@change="onProjectChange"
@edit="openEditProjectPanel"
/>
<!-- Кнопки управления проектами (мобильные) -->
<div class="mobile-project-actions">
<button
v-if="store.isProjectAdmin"
class="mobile-project-btn"
title="Настройки проекта"
@click="openEditProjectPanel(store.currentProject)"
>
<i data-lucide="settings"></i>
</button>
<button
class="mobile-project-btn"
title="Создать проект"
@click="openCreateProjectPanel"
>
<i data-lucide="plus"></i>
</button>
</div>
<MobileSelect
v-model="activeDepartment"
:options="departmentOptions"
@@ -69,6 +92,13 @@
@close="closePanel"
@delete="handleDeleteTask"
/>
<ProjectPanel
:show="projectPanelOpen"
:project="editingProject"
@close="closeProjectPanel"
@saved="onProjectSaved"
/>
</template>
</PageLayout>
</template>
@@ -79,6 +109,7 @@ import PageLayout from '../components/PageLayout.vue'
import Header from '../components/Header.vue'
import Board from '../components/Board.vue'
import TaskPanel from '../components/TaskPanel'
import ProjectPanel from '../components/ProjectPanel.vue'
import DepartmentTags from '../components/DepartmentTags.vue'
import ProjectSelector from '../components/ProjectSelector.vue'
import MobileSelect from '../components/ui/MobileSelect.vue'
@@ -172,6 +203,33 @@ const handleArchiveTask = async (cardId) => {
closePanel()
}
// ==================== ПАНЕЛЬ ПРОЕКТА ====================
const projectPanelOpen = ref(false)
const editingProject = ref(null)
const openCreateProjectPanel = () => {
editingProject.value = null
projectPanelOpen.value = true
}
const openEditProjectPanel = (project) => {
editingProject.value = project
projectPanelOpen.value = true
}
const closeProjectPanel = () => {
projectPanelOpen.value = false
editingProject.value = null
}
const onProjectSaved = async (projectId) => {
// Перезагружаем данные если изменился текущий проект
if (projectId === store.currentProjectId) {
await store.fetchProjectData()
await fetchCards()
}
}
// ==================== АВТООБНОВЛЕНИЕ (POLLING) ====================
const REFRESH_INTERVAL = (window.APP_CONFIG?.IDLE_REFRESH_SECONDS ?? 30) * 1000
let pollTimer = null
@@ -231,4 +289,36 @@ onUnmounted(() => {
.main.mobile {
padding: 0;
}
/* Мобильные кнопки управления проектами */
.mobile-project-actions {
display: flex;
align-items: center;
gap: 2px;
flex-shrink: 0;
}
.mobile-project-btn {
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
background: none;
border: none;
border-radius: 6px;
color: var(--text-muted);
cursor: pointer;
transition: all 0.15s;
}
.mobile-project-btn:active {
color: var(--accent);
background: rgba(255, 255, 255, 0.06);
}
.mobile-project-btn i {
width: 18px;
height: 18px;
}
</style>