130 lines
5.1 KiB
JavaScript
130 lines
5.1 KiB
JavaScript
/*
|
|
작성자 : 박지윤
|
|
작성일 : 2025-02-25
|
|
수정자 :
|
|
수정일 :
|
|
설명 : 프로젝트 목록
|
|
*/
|
|
import { defineStore } from 'pinia';
|
|
import { ref, watch } from 'vue';
|
|
import $api from '@api';
|
|
import { useUserInfoStore } from '@/stores/useUserInfoStore';
|
|
import { useAuthStore } from '@/stores/useAuthStore';
|
|
|
|
export const useProjectStore = defineStore('project', () => {
|
|
const projectList = ref([]); // 모든 프로젝트 (종료된 프로젝트 포함)
|
|
const activeProjectList = ref([]); // 진행 중인 프로젝트만 (종료된 프로젝트 제외)
|
|
const memberProjectList = ref([]); // 사용자가 속한 프로젝트
|
|
const activeMemberProjectList = ref([]); // 사용자가 속한 진행 중인 프로젝트
|
|
const selectedProject = ref(null);
|
|
const userStore = useUserInfoStore();
|
|
const authStore = useAuthStore();
|
|
|
|
// 전체 프로젝트 가져오기 (종료된 프로젝트 포함 여부에 따라 다른 배열에 저장)
|
|
const getProjectList = async (searchText = '', selectedYear = '', excludeEnded = 'false') => {
|
|
if (!userStore.user) return;
|
|
const res = await $api.get('project/select', {
|
|
params: {
|
|
searchKeyword: searchText || '',
|
|
category: selectedYear || '',
|
|
excludeEnded: excludeEnded
|
|
},
|
|
});
|
|
|
|
if (excludeEnded === 'true') {
|
|
// 종료되지 않은 프로젝트만 저장
|
|
activeProjectList.value = res.data.data.projectList;
|
|
} else {
|
|
// 모든 프로젝트 저장 (종료된 프로젝트 포함)
|
|
projectList.value = res.data.data.projectList;
|
|
}
|
|
};
|
|
|
|
// 모든 프로젝트 목록 로드 (종료 여부 구분하여 모두 로드)
|
|
const loadAllProjectLists = async (searchText = '', selectedYear = '') => {
|
|
// 진행 중인 프로젝트 로드
|
|
await getProjectList(searchText, selectedYear, 'true');
|
|
// 모든 프로젝트 로드 (종료된 프로젝트 포함)
|
|
await getProjectList(searchText, selectedYear, 'false');
|
|
};
|
|
|
|
// 사용자가 속한 프로젝트 목록 가져오기
|
|
const getMemberProjects = async () => {
|
|
if (!userStore.user) return; // 로그인한 사용자 확인
|
|
|
|
const res = await $api.get(`project/${userStore.user.id}`);
|
|
const allMemberProjects = res.data.data;
|
|
memberProjectList.value = allMemberProjects;
|
|
|
|
// 사용자가 속한 프로젝트 중 진행 중인 프로젝트만 필터링
|
|
activeMemberProjectList.value = allMemberProjects.filter(project =>
|
|
!project.ENDYN || project.ENDYN === 'N'
|
|
);
|
|
|
|
if (activeMemberProjectList.value.length > 0 && !selectedProject.value) {
|
|
setSelectedProject(activeMemberProjectList.value[0]);
|
|
}
|
|
};
|
|
|
|
const setSelectedProject = (project) => {
|
|
selectedProject.value = project ? { ...project } : null;
|
|
if (project) {
|
|
localStorage.setItem('selectedProject', JSON.stringify(project));
|
|
} else {
|
|
localStorage.removeItem('selectedProject');
|
|
}
|
|
};
|
|
|
|
const getSelectedProject = () => {
|
|
if (!selectedProject.value) {
|
|
const storedProject = localStorage.getItem('selectedProject');
|
|
if (storedProject) {
|
|
selectedProject.value = JSON.parse(storedProject);
|
|
}
|
|
}
|
|
return selectedProject.value;
|
|
};
|
|
|
|
// 프로젝트 리스트가 변경될 때 자동으로 반응
|
|
watch(activeProjectList, (newList) => {
|
|
// 선택된 프로젝트가 없고 목록이 있는 경우
|
|
if (!selectedProject.value && newList.length > 0) {
|
|
// 사용자가 속한 프로젝트가 있는지 먼저 확인
|
|
if (activeMemberProjectList.value.length > 0) {
|
|
setSelectedProject(activeMemberProjectList.value[0]);
|
|
} else {
|
|
setSelectedProject(newList[0]);
|
|
}
|
|
}
|
|
});
|
|
|
|
watch(activeMemberProjectList, (newList) => {
|
|
if (newList.length > 0) {
|
|
// 현재 선택된 프로젝트가 없는 경우 첫 번째 항목 선택
|
|
if (!selectedProject.value) {
|
|
setSelectedProject(newList[0]);
|
|
} else {
|
|
// 선택된 프로젝트가 있는 경우 목록에 있는지 확인
|
|
const exists = newList.some(project => project.PROJCTSEQ === selectedProject.value.PROJCTSEQ);
|
|
|
|
if (!exists) {
|
|
setSelectedProject(newList[0]);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
return {
|
|
projectList, // 종료된 프로젝트 포함한 모든 프로젝트
|
|
activeProjectList, // 진행 중인 프로젝트만
|
|
memberProjectList, // 사용자가 속한 모든 프로젝트
|
|
activeMemberProjectList, // 사용자가 속한 진행 중인 프로젝트
|
|
selectedProject,
|
|
getProjectList,
|
|
loadAllProjectLists, // 모든 프로젝트 목록 한번에 로드
|
|
getMemberProjects,
|
|
setSelectedProject,
|
|
getSelectedProject,
|
|
};
|
|
});
|