Добавление проектов
Добавили возможность создавания разных проектов.
This commit is contained in:
145
front_vue/src/stores/projects.js
Normal file
145
front_vue/src/stores/projects.js
Normal 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
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user