Управление проектами
Добавил возможность удаления, создание и редактирование проектов.
This commit is contained in:
@@ -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
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user