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

@@ -226,6 +226,156 @@ export const useProjectsStore = defineStore('projects', () => {
localStorage.removeItem('currentProjectName')
}
// ==================== CRUD ПРОЕКТОВ ====================
// Создание проекта
const createProject = async (name) => {
const result = await projectsApi.create(name)
if (result.success) {
// Добавляем проект в список
projects.value.push({
id: result.id,
name,
id_order: projects.value.length + 1,
id_ready: result.id_ready,
id_admin: true // Создатель = админ
})
// Переключаемся на новый проект
await selectProject(result.id)
}
return result
}
// Обновление проекта
const updateProject = async (id, name) => {
const result = await projectsApi.update(id, name)
if (result.success) {
const project = projects.value.find(p => p.id === id)
if (project) {
project.name = name
// Обновляем localStorage если это текущий проект
if (id === currentProjectId.value) {
localStorage.setItem('currentProjectName', name)
}
}
}
return result
}
// Удаление проекта
const deleteProject = async (id) => {
const result = await projectsApi.delete(id)
if (result.success) {
const index = projects.value.findIndex(p => p.id === id)
if (index !== -1) {
projects.value.splice(index, 1)
}
// Если удалили текущий проект — переключаемся на первый
if (id === currentProjectId.value) {
if (projects.value.length > 0) {
await selectProject(projects.value[0].id)
} else {
currentProjectId.value = null
columns.value = []
departments.value = []
cards.value = []
localStorage.removeItem('currentProjectId')
localStorage.removeItem('currentProjectName')
}
}
}
return result
}
// Обновление порядка проектов
const reorderProjects = async (ids) => {
// Оптимистичное обновление
const reordered = ids.map((id, index) => {
const project = projects.value.find(p => p.id === id)
return { ...project, id_order: index + 1 }
})
projects.value = reordered
// Отправляем на сервер
await projectsApi.updateOrder(ids)
}
// ==================== CRUD КОЛОНОК ====================
// Добавление колонки
const addColumn = async (name, color = '#6366f1') => {
if (!currentProjectId.value) return { success: false }
const result = await projectsApi.addColumn(currentProjectId.value, name, color)
if (result.success) {
columns.value.push(result.column)
}
return result
}
// Обновление колонки
const updateColumn = async (id, name, color) => {
const result = await projectsApi.updateColumn(id, name, color)
if (result.success) {
const column = columns.value.find(c => c.id === id)
if (column) {
if (name !== null && name !== undefined) column.name_columns = name
if (color !== null && color !== undefined) column.color = color
}
}
return result
}
// Получение количества задач в колонке
const getColumnTasksCount = async (id) => {
const result = await projectsApi.getColumnTasksCount(id)
return result.success ? result.count : 0
}
// Удаление колонки
const deleteColumn = async (id) => {
const result = await projectsApi.deleteColumn(id)
if (result.success) {
const index = columns.value.findIndex(c => c.id === id)
if (index !== -1) {
columns.value.splice(index, 1)
}
// Удаляем карточки этой колонки из локального состояния
cards.value = cards.value.filter(c => c.column_id !== id)
}
return result
}
// Обновление порядка колонок
const reorderColumns = async (ids) => {
if (!currentProjectId.value) return
// Оптимистичное обновление
const reordered = ids.map((id, index) => {
const column = columns.value.find(c => c.id === id)
return { ...column, id_order: index + 1 }
})
columns.value = reordered
// Отправляем на сервер
await projectsApi.updateColumnsOrder(currentProjectId.value, ids)
}
// Установка финальной колонки
const setReadyColumn = async (columnId) => {
if (!currentProjectId.value) return { success: false }
const result = await projectsApi.setReadyColumn(currentProjectId.value, columnId)
if (result.success) {
// Обновляем id_ready в проекте
const project = projects.value.find(p => p.id === currentProjectId.value)
if (project) {
project.id_ready = columnId
}
}
return result
}
return {
// Состояние
projects,
@@ -254,6 +404,18 @@ export const useProjectsStore = defineStore('projects', () => {
fetchCards,
fetchArchivedCards,
clearCards,
reset
reset,
// CRUD проектов
createProject,
updateProject,
deleteProject,
reorderProjects,
// CRUD колонок
addColumn,
updateColumn,
getColumnTasksCount,
deleteColumn,
reorderColumns,
setReadyColumn
}
})