1
0

Исправления фронта

Множество оптимизаций по фронту
This commit is contained in:
2026-01-16 10:15:33 +07:00
parent cb075e56be
commit 3258fa9137
30 changed files with 1797 additions and 2584 deletions

View File

@@ -1,6 +1,6 @@
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { projectsApi, usersApi, authApi } from '../api'
import { projectsApi, usersApi, authApi, cardsApi } from '../api'
export const useProjectsStore = defineStore('projects', () => {
// ==================== СОСТОЯНИЕ ====================
@@ -9,6 +9,9 @@ export const useProjectsStore = defineStore('projects', () => {
const labels = ref([])
const columns = ref([])
const users = ref([])
const cards = ref([]) // Активные карточки текущего проекта
const archivedCards = ref([]) // Архивные карточки текущего проекта
const cardsLoading = ref(false) // Загрузка карточек
const loading = ref(false)
const initialized = ref(false)
const currentUser = ref(null) // Текущий авторизованный пользователь
@@ -33,6 +36,12 @@ export const useProjectsStore = defineStore('projects', () => {
// ID текущего пользователя
const currentUserId = computed(() => currentUser.value?.id || null)
// Имя текущего пользователя
const currentUserName = computed(() => currentUser.value?.name || '')
// Аватар текущего пользователя
const currentUserAvatar = computed(() => currentUser.value?.avatar_url || '')
// Является ли текущий пользователь админом проекта
// Сервер возвращает id_admin: true только если текущий пользователь — админ
@@ -139,6 +148,65 @@ export const useProjectsStore = defineStore('projects', () => {
}
}
// ==================== КАРТОЧКИ ====================
// Загрузка активных карточек (silent = тихое обновление без loading)
const fetchCards = async (silent = false) => {
if (!currentProjectId.value) {
cardsLoading.value = false
return
}
if (!silent) cardsLoading.value = true
try {
const result = await cardsApi.getAll(currentProjectId.value)
if (result.success) cards.value = result.data
} finally {
if (!silent) cardsLoading.value = false
}
}
// Загрузка архивных карточек
const fetchArchivedCards = async () => {
if (!currentProjectId.value) return
cardsLoading.value = true
try {
const result = await cardsApi.getAll(currentProjectId.value, 1) // archive = 1
if (result.success) {
archivedCards.value = result.data.map(card => ({
id: card.id,
title: card.title,
description: card.descript,
details: card.descript_full,
departmentId: card.id_department,
labelId: card.id_label,
accountId: card.id_account,
assignee: card.avatar_img,
dueDate: card.date,
dateCreate: card.date_create,
dateClosed: card.date_closed,
columnId: card.column_id,
order: card.order ?? 0,
comments_count: card.comments_count || 0,
files: card.files || (card.file_img || []).map(f => ({
name: f.name,
url: f.url,
size: f.size,
preview: f.url
}))
}))
}
} finally {
cardsLoading.value = false
}
}
// Очистка карточек при смене проекта
const clearCards = () => {
cards.value = []
archivedCards.value = []
}
// Сброс при выходе
const reset = () => {
projects.value = []
@@ -146,6 +214,8 @@ export const useProjectsStore = defineStore('projects', () => {
labels.value = []
columns.value = []
users.value = []
cards.value = []
archivedCards.value = []
currentProjectId.value = null
currentUser.value = null
initialized.value = false
@@ -160,6 +230,9 @@ export const useProjectsStore = defineStore('projects', () => {
labels,
columns,
users,
cards,
archivedCards,
cardsLoading,
loading,
initialized,
currentProjectId,
@@ -168,11 +241,16 @@ export const useProjectsStore = defineStore('projects', () => {
currentProject,
doneColumnId,
currentUserId,
currentUserName,
currentUserAvatar,
isProjectAdmin,
// Действия
init,
selectProject,
fetchProjectData,
fetchCards,
fetchArchivedCards,
clearCards,
reset
}
})