1
0

Добавление проектов

Добавили возможность создавания разных проектов.
This commit is contained in:
2026-01-14 10:46:38 +07:00
parent 04e88cb7fa
commit 719aecd09e
22 changed files with 996 additions and 233 deletions

View File

@@ -0,0 +1,145 @@
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { projectsApi, usersApi } from '../api'
export const useProjectsStore = defineStore('projects', () => {
// ==================== СОСТОЯНИЕ ====================
const projects = ref([])
const departments = ref([])
const labels = ref([])
const columns = ref([])
const users = ref([])
const loading = ref(false)
const initialized = ref(false)
// Текущий проект (из localStorage)
const savedProjectId = localStorage.getItem('currentProjectId')
const savedProjectName = localStorage.getItem('currentProjectName')
const currentProjectId = ref(savedProjectId ? parseInt(savedProjectId) : null)
// ==================== ГЕТТЕРЫ ====================
// Текущий проект (объект)
const currentProject = computed(() =>
projects.value.find(p => p.id === currentProjectId.value) ||
(savedProjectName && currentProjectId.value ? { id: currentProjectId.value, name: savedProjectName } : null)
)
// ID колонки "Готово" текущего проекта
const doneColumnId = computed(() => {
const project = projects.value.find(p => p.id === currentProjectId.value)
return project ? Number(project.id_ready) : null
})
// ==================== ДЕЙСТВИЯ ====================
// Инициализация (загрузка проектов + данных активного)
const init = async () => {
if (initialized.value) return
loading.value = true
try {
// Загружаем проекты и данные активного одним запросом
const result = await projectsApi.getAll(currentProjectId.value || undefined)
if (result.success) {
if (result.data.projects) {
projects.value = result.data.projects
// Применяем данные активного проекта
if (result.data.active) {
columns.value = result.data.active.columns
departments.value = result.data.active.departments
labels.value = result.data.active.labels
}
} else {
projects.value = result.data
}
// Если нет выбранного проекта — выбираем первый
if (!currentProjectId.value || !projects.value.find(p => p.id === currentProjectId.value)) {
if (projects.value.length > 0) {
await selectProject(projects.value[0].id, false)
}
} else {
// Обновляем название в localStorage
const project = projects.value.find(p => p.id === currentProjectId.value)
if (project) localStorage.setItem('currentProjectName', project.name)
}
}
// Загружаем пользователей
const usersData = await usersApi.getAll()
if (usersData.success) users.value = usersData.data
initialized.value = true
} catch (error) {
console.error('Ошибка инициализации:', error)
} finally {
loading.value = false
}
}
// Выбор проекта
const selectProject = async (projectId, fetchData = true) => {
currentProjectId.value = projectId
localStorage.setItem('currentProjectId', projectId.toString())
// Сохраняем название
const project = projects.value.find(p => p.id === projectId)
if (project) localStorage.setItem('currentProjectName', project.name)
// Загружаем данные проекта
if (fetchData) {
await fetchProjectData()
}
}
// Загрузка данных текущего проекта
const fetchProjectData = async () => {
if (!currentProjectId.value) return
try {
const projectData = await projectsApi.getData(currentProjectId.value)
if (projectData.success) {
columns.value = projectData.data.columns
departments.value = projectData.data.departments
labels.value = projectData.data.labels
}
} catch (error) {
console.error('Ошибка загрузки данных проекта:', error)
}
}
// Сброс при выходе
const reset = () => {
projects.value = []
departments.value = []
labels.value = []
columns.value = []
users.value = []
currentProjectId.value = null
initialized.value = false
localStorage.removeItem('currentProjectId')
localStorage.removeItem('currentProjectName')
}
return {
// Состояние
projects,
departments,
labels,
columns,
users,
loading,
initialized,
currentProjectId,
// Геттеры
currentProject,
doneColumnId,
// Действия
init,
selectProject,
fetchProjectData,
reset
}
})