+
+
+
+
+
+
+
+
diff --git a/front_vue/src/main.js b/front_vue/src/main.js
index 7b5cd15..0b20ebb 100644
--- a/front_vue/src/main.js
+++ b/front_vue/src/main.js
@@ -2,6 +2,10 @@ import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router'
+import { serverSettings } from './api'
+
+// Инициализация серверных настроек (timezone и т.д.)
+serverSettings.init()
const app = createApp(App)
app.use(createPinia())
diff --git a/front_vue/src/stores/projects.js b/front_vue/src/stores/projects.js
index 97a2406..a7dc086 100644
--- a/front_vue/src/stores/projects.js
+++ b/front_vue/src/stores/projects.js
@@ -1,6 +1,6 @@
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
-import { projectsApi, usersApi } from '../api'
+import { projectsApi, usersApi, authApi } from '../api'
export const useProjectsStore = defineStore('projects', () => {
// ==================== СОСТОЯНИЕ ====================
@@ -11,6 +11,7 @@ export const useProjectsStore = defineStore('projects', () => {
const users = ref([])
const loading = ref(false)
const initialized = ref(false)
+ const currentUser = ref(null) // Текущий авторизованный пользователь
// Текущий проект (из localStorage)
const savedProjectId = localStorage.getItem('currentProjectId')
@@ -30,6 +31,16 @@ export const useProjectsStore = defineStore('projects', () => {
return project ? Number(project.id_ready) : null
})
+ // ID текущего пользователя
+ const currentUserId = computed(() => currentUser.value?.id || null)
+
+ // Является ли текущий пользователь админом проекта
+ // Сервер возвращает id_admin: true только если текущий пользователь — админ
+ const isProjectAdmin = computed(() => {
+ const project = projects.value.find(p => p.id === currentProjectId.value)
+ return project?.id_admin === true
+ })
+
// ==================== ДЕЙСТВИЯ ====================
// Инициализация (загрузка проектов + данных активного)
const init = async () => {
@@ -74,6 +85,14 @@ export const useProjectsStore = defineStore('projects', () => {
const usersData = await usersApi.getAll()
if (usersData.success) users.value = usersData.data
+ // Загружаем текущего пользователя
+ const authData = await authApi.check()
+ if (authData.success && authData.user) {
+ // Находим полные данные пользователя (с id) из списка users
+ const fullUser = users.value.find(u => u.username === authData.user.username)
+ currentUser.value = fullUser || authData.user
+ }
+
initialized.value = true
} catch (error) {
console.error('Ошибка инициализации:', error)
@@ -108,6 +127,12 @@ export const useProjectsStore = defineStore('projects', () => {
columns.value = projectData.data.columns
departments.value = projectData.data.departments
labels.value = projectData.data.labels
+
+ // Обновляем id_admin в списке проектов (сервер возвращает true если текущий пользователь админ)
+ const project = projects.value.find(p => p.id === currentProjectId.value)
+ if (project && projectData.data.project?.id_admin === true) {
+ project.id_admin = true
+ }
}
} catch (error) {
console.error('Ошибка загрузки данных проекта:', error)
@@ -122,6 +147,7 @@ export const useProjectsStore = defineStore('projects', () => {
columns.value = []
users.value = []
currentProjectId.value = null
+ currentUser.value = null
initialized.value = false
localStorage.removeItem('currentProjectId')
localStorage.removeItem('currentProjectName')
@@ -137,9 +163,12 @@ export const useProjectsStore = defineStore('projects', () => {
loading,
initialized,
currentProjectId,
+ currentUser,
// Геттеры
currentProject,
doneColumnId,
+ currentUserId,
+ isProjectAdmin,
// Действия
init,
selectProject,
diff --git a/front_vue/src/views/ArchivePage.vue b/front_vue/src/views/ArchivePage.vue
index d256ddd..d9c21dd 100644
--- a/front_vue/src/views/ArchivePage.vue
+++ b/front_vue/src/views/ArchivePage.vue
@@ -82,6 +82,8 @@
:departments="store.departments"
:labels="store.labels"
:users="store.users"
+ :current-user-id="store.currentUserId"
+ :is-project-admin="store.isProjectAdmin"
@close="closePanel"
@save="handleSaveTask"
@delete="handleDeleteTask"
@@ -105,7 +107,7 @@ import { ref, computed, watch, onMounted } from 'vue'
import Sidebar from '../components/Sidebar.vue'
import Header from '../components/Header.vue'
import ArchiveCard from '../components/ArchiveCard.vue'
-import TaskPanel from '../components/TaskPanel.vue'
+import TaskPanel from '../components/TaskPanel'
import ConfirmDialog from '../components/ConfirmDialog.vue'
import ProjectSelector from '../components/ProjectSelector.vue'
import { useProjectsStore } from '../stores/projects'
@@ -156,6 +158,7 @@ const fetchCards = async () => {
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,
diff --git a/front_vue/src/views/MainApp.vue b/front_vue/src/views/MainApp.vue
index ea421d2..180e4a2 100644
--- a/front_vue/src/views/MainApp.vue
+++ b/front_vue/src/views/MainApp.vue
@@ -79,6 +79,8 @@
:departments="store.departments"
:labels="store.labels"
:users="store.users"
+ :current-user-id="store.currentUserId"
+ :is-project-admin="store.isProjectAdmin"
@close="closePanel"
@save="handleSaveTask"
@delete="handleDeleteTask"
@@ -92,7 +94,7 @@ import { ref, watch, onMounted, onUnmounted } from 'vue'
import Sidebar from '../components/Sidebar.vue'
import Header from '../components/Header.vue'
import Board from '../components/Board.vue'
-import TaskPanel from '../components/TaskPanel.vue'
+import TaskPanel from '../components/TaskPanel'
import ProjectSelector from '../components/ProjectSelector.vue'
import { useProjectsStore } from '../stores/projects'
import { cardsApi } from '../api'