Merge remote-tracking branch 'origin/main' into board-comment
This commit is contained in:
commit
2226782662
@ -37,7 +37,7 @@ $api.interceptors.response.use(
|
|||||||
},
|
},
|
||||||
function (error) {
|
function (error) {
|
||||||
const toastStore = useToastStore();
|
const toastStore = useToastStore();
|
||||||
//const currentPage = error.config.headers['X-Page-Route'];
|
const currentPage = error.config.headers['X-Page-Route'];
|
||||||
// 오류 응답 처리
|
// 오류 응답 처리
|
||||||
if (error.response) {
|
if (error.response) {
|
||||||
switch (error.response.status) {
|
switch (error.response.status) {
|
||||||
|
|||||||
@ -63,7 +63,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { defineProps, ref } from 'vue';
|
import { defineProps, ref } from 'vue';
|
||||||
import UserList from '@c/user/UserList.vue';
|
import UserList from '@c/user/UserList.vue';
|
||||||
import CenterModal from '../modal/CenterModal.vue';
|
import CenterModal from '@c/modal/CenterModal.vue';
|
||||||
import $api from '@api';
|
import $api from '@api';
|
||||||
|
|
||||||
// Props 정의
|
// Props 정의
|
||||||
|
|||||||
@ -34,7 +34,7 @@
|
|||||||
:is-label="true"
|
:is-label="true"
|
||||||
:is-common="true"
|
:is-common="true"
|
||||||
:data="allColors"
|
:data="allColors"
|
||||||
v-model="selectedProject.projctcolor"
|
v-model="selectedProject.PROJCTCOL"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<FormInput
|
<FormInput
|
||||||
@ -85,19 +85,23 @@
|
|||||||
import FormInput from '@c/input/FormInput.vue';
|
import FormInput from '@c/input/FormInput.vue';
|
||||||
import FormSelect from '@c/input/FormSelect.vue';
|
import FormSelect from '@c/input/FormSelect.vue';
|
||||||
import commonApi from '@/common/commonApi';
|
import commonApi from '@/common/commonApi';
|
||||||
import ArrInput from '../input/ArrInput.vue';
|
import ArrInput from '@c/input/ArrInput.vue';
|
||||||
import { useUserInfoStore } from '@/stores/useUserInfoStore';
|
import { useUserInfoStore } from '@/stores/useUserInfoStore';
|
||||||
|
import { useToastStore } from '@s/toastStore';
|
||||||
|
|
||||||
|
const toastStore = useToastStore();
|
||||||
|
|
||||||
const projectList = ref([]);
|
const projectList = ref([]);
|
||||||
const isModalOpen = ref(false);
|
const isModalOpen = ref(false);
|
||||||
|
let originalColor = ref('');
|
||||||
|
|
||||||
const userStore = useUserInfoStore();
|
const userStore = useUserInfoStore();
|
||||||
const user = ref(null);
|
const user = ref(null);
|
||||||
|
|
||||||
const nameAlert = ref(false);
|
const nameAlert = ref(false);
|
||||||
const selectedProject = ref({
|
const selectedProject = ref({
|
||||||
|
PROJCTSEQ:'',
|
||||||
PROJCTNAM: '',
|
PROJCTNAM: '',
|
||||||
projctcolor: '',
|
|
||||||
PROJCTSTR: '',
|
PROJCTSTR: '',
|
||||||
PROJCTEND: '',
|
PROJCTEND: '',
|
||||||
PROJCTZIP: '',
|
PROJCTZIP: '',
|
||||||
@ -105,6 +109,7 @@
|
|||||||
PROJCTDTL: '',
|
PROJCTDTL: '',
|
||||||
PROJCTDES: '',
|
PROJCTDES: '',
|
||||||
PROJCTCOL: '',
|
PROJCTCOL: '',
|
||||||
|
projctcolor:'',
|
||||||
});
|
});
|
||||||
|
|
||||||
const { colorList } = commonApi({
|
const { colorList } = commonApi({
|
||||||
@ -124,13 +129,14 @@
|
|||||||
const getProjectList = () => {
|
const getProjectList = () => {
|
||||||
$api.get('project/select').then(res => {
|
$api.get('project/select').then(res => {
|
||||||
projectList.value = res.data.data.projectList;
|
projectList.value = res.data.data.projectList;
|
||||||
console.log(projectList.value);
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
const openModal = (post) => {
|
const openModal = (post) => {
|
||||||
isModalOpen.value = true;
|
isModalOpen.value = true;
|
||||||
|
|
||||||
|
originalColor.value = post.PROJCTCOL;
|
||||||
selectedProject.value = { ...post };
|
selectedProject.value = { ...post };
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -156,20 +162,23 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
console.log(projectList.PROJCTSEQ)
|
|
||||||
|
|
||||||
const handleSubmit = () => {
|
const handleSubmit = () => {
|
||||||
|
|
||||||
|
console.log(selectedProject.value.PROJCTCOL)
|
||||||
|
console.log(originalColor.value)
|
||||||
|
|
||||||
$api.patch('project/update', {
|
$api.patch('project/update', {
|
||||||
projctSeq: projectList.PROJCTSEQ,
|
projctSeq: selectedProject.value.PROJCTSEQ,
|
||||||
projctNam: selectedProject.value.PROJCTNAM,
|
projctNam: selectedProject.value.PROJCTNAM,
|
||||||
projctCol: selectedProject.value.projctcolor,
|
projctCol: selectedProject.value.PROJCTCOL,
|
||||||
projctArr: selectedProject.value.PROJCTARR,
|
projctArr: selectedProject.value.PROJCTARR,
|
||||||
projctDtl: selectedProject.value.PROJCTDTL,
|
projctDtl: selectedProject.value.PROJCTDTL,
|
||||||
projctZip: selectedProject.value.PROJCTZIP,
|
projctZip: selectedProject.value.PROJCTZIP,
|
||||||
projctStr: selectedProject.value.PROJCTSTR,
|
projctStr: selectedProject.value.PROJCTSTR,
|
||||||
projctEnd: selectedProject.value.PROJCTEND,
|
projctEnd: selectedProject.value.PROJCTEND || null,
|
||||||
projctDes: selectedProject.value.PROJCTDES,
|
projctDes: selectedProject.value.PROJCTDES,
|
||||||
projctUmb: user.value.name,
|
projctUmb: user.value.name,
|
||||||
|
originalColor: originalColor.value === selectedProject.value.PROJCTCOL ? null : originalColor.value
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
toastStore.onToast('수정이 완료 되었습니다.', 's');
|
toastStore.onToast('수정이 완료 되었습니다.', 's');
|
||||||
|
|||||||
@ -7,19 +7,19 @@
|
|||||||
<!-- 연차 사용 및 받은 연차 리스트 -->
|
<!-- 연차 사용 및 받은 연차 리스트 -->
|
||||||
<div class="modal-body" v-if="mergedVacations.length > 0">
|
<div class="modal-body" v-if="mergedVacations.length > 0">
|
||||||
<ol class="vacation-list">
|
<ol class="vacation-list">
|
||||||
<li
|
<li v-for="(vacation, index) in mergedVacations" :key="index" class="vacation-item">
|
||||||
v-for="(vacation, index) in mergedVacations"
|
|
||||||
:key="index"
|
|
||||||
class="vacation-item"
|
|
||||||
>
|
|
||||||
<span v-if="vacation.type === 'used'" class="vacation-index">
|
<span v-if="vacation.type === 'used'" class="vacation-index">
|
||||||
{{ totalUsedVacationCount - usedVacations.findIndex(v => v.date === vacation.date) }} )
|
{{ getVacationIndex(index) }})
|
||||||
</span>
|
</span>
|
||||||
<span :class="vacation.type === 'used' ? 'minus-symbol' : 'plus-symbol'">
|
<span :class="vacation.type === 'used' ? 'minus-symbol' : 'plus-symbol'">
|
||||||
{{ vacation.type === 'used' ? '-' : '+' }}
|
{{ vacation.type === 'used' ? '-' : '+' }}
|
||||||
</span>
|
</span>
|
||||||
<span :style="{ color: userColors[vacation.senderId || vacation.receiverId] || '#000' }"
|
<span
|
||||||
class="vacation-date">{{ formatDate(vacation.date) }}</span>
|
:style="{ color: userColors[vacation.senderId || vacation.receiverId] || '#000' }"
|
||||||
|
class="vacation-date"
|
||||||
|
>
|
||||||
|
{{ formatDate(vacation.date) }}
|
||||||
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
@ -53,22 +53,32 @@
|
|||||||
|
|
||||||
const emit = defineEmits(["close"]);
|
const emit = defineEmits(["close"]);
|
||||||
|
|
||||||
// ✅ 사용한 연차 개수
|
|
||||||
const totalUsedVacationCount = computed(() => props.myVacations.length);
|
|
||||||
|
|
||||||
// ✅ 사용한 연차 + 받은 연차 통합 후 내림차순 정렬
|
// ✅ 사용한 연차 + 받은 연차 통합 후 내림차순 정렬
|
||||||
const usedVacations = computed(() => props.myVacations.map(v => ({ ...v, type: "used" })));
|
const usedVacations = computed(() =>
|
||||||
const receivedVacations = computed(() => props.receivedVacations
|
props.myVacations.map(v => ({ ...v, type: "used" }))
|
||||||
.filter(v => !v.senderId) // ✅ 보낸 사람이 있는 경우 리스트에서 제외
|
|
||||||
.map(v => ({ ...v, type: "received" }))
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const receivedVacations = computed(() =>
|
||||||
|
props.receivedVacations.map(v => ({ ...v, type: "received" }))
|
||||||
|
);
|
||||||
|
|
||||||
|
// ✅ 정확한 정렬 및 리스트 병합
|
||||||
const mergedVacations = computed(() => {
|
const mergedVacations = computed(() => {
|
||||||
return [...usedVacations.value, ...receivedVacations.value].sort(
|
return [...usedVacations.value, ...receivedVacations.value].sort(
|
||||||
(a, b) => new Date(b.date) - new Date(a.date)
|
(a, b) => new Date(b.date) - new Date(a.date)
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// ✅ 연차 개수 반영된 인덱스 반환 (누적 합산)
|
||||||
|
const getVacationIndex = (index) => {
|
||||||
|
let count = 0;
|
||||||
|
for (let i = 0; i <= index; i++) {
|
||||||
|
const v = mergedVacations.value[i];
|
||||||
|
count += v.used_quota; // 누적하여 더함
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
};
|
||||||
|
|
||||||
// ✅ 날짜 형식 변환 (YYYY-MM-DD)
|
// ✅ 날짜 형식 변환 (YYYY-MM-DD)
|
||||||
const formatDate = (dateString) => {
|
const formatDate = (dateString) => {
|
||||||
const date = new Date(dateString);
|
const date = new Date(dateString);
|
||||||
@ -80,7 +90,6 @@
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
/* 모달 스타일 */
|
/* 모달 스타일 */
|
||||||
.modal-dialog {
|
.modal-dialog {
|
||||||
@ -159,6 +168,14 @@ font-size: 16px;
|
|||||||
color: #333;
|
color: #333;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 연차 유형 스타일 */
|
||||||
|
.vacation-type {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: normal;
|
||||||
|
color: gray;
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
/* 연차 데이터 없음 */
|
/* 연차 데이터 없음 */
|
||||||
.no-data {
|
.no-data {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|||||||
@ -87,7 +87,7 @@ const localCateList = ref([...props.cateList]);
|
|||||||
const selectedCategory = ref('');
|
const selectedCategory = ref('');
|
||||||
|
|
||||||
// cateList emit
|
// cateList emit
|
||||||
const emit = defineEmits(['update:cateList']);
|
const emit = defineEmits(['update:cateList','refreshWordList']);
|
||||||
|
|
||||||
// 글 수정 상태
|
// 글 수정 상태
|
||||||
const isWriteVisible = ref(false);
|
const isWriteVisible = ref(false);
|
||||||
@ -126,6 +126,7 @@ const addCategory = (data) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 용어집 수정
|
// 용어집 수정
|
||||||
const editWord = (data) => {
|
const editWord = (data) => {
|
||||||
console.log('📌 수정할 데이터:', data);
|
console.log('📌 수정할 데이터:', data);
|
||||||
@ -142,15 +143,15 @@ const editWord = (data) => {
|
|||||||
|
|
||||||
axios.patch('worddict/updateWord', {
|
axios.patch('worddict/updateWord', {
|
||||||
WRDDICSEQ: data.id,
|
WRDDICSEQ: data.id,
|
||||||
WRDDICCAT: 600104,
|
WRDDICCAT: data.category,
|
||||||
WRDDICTTL: data.title,
|
WRDDICTTL: data.title,
|
||||||
WRDDICRIK: $common.deltaAsJson(data.content),
|
WRDDICCON: $common.deltaAsJson(data.content),
|
||||||
})
|
})
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (res.data.data === '1') {
|
if (res.data.data === 1) {
|
||||||
toastStore.onToast('✅ 용어가 수정되었습니다.', 's');
|
toastStore.onToast('✅ 용어가 수정되었습니다.', 's');
|
||||||
isWriteVisible.value = false; // 성공 시에만 닫기
|
isWriteVisible.value = false;
|
||||||
// getwordList(); // 목록 갱신
|
emit('refreshWordList');
|
||||||
} else {
|
} else {
|
||||||
console.warn('⚠️ 서버 응답이 예상과 다릅니다:', res.data);
|
console.warn('⚠️ 서버 응답이 예상과 다릅니다:', res.data);
|
||||||
toastStore.onToast('용어 수정이 정상적으로 처리되지 않았습니다.', 'e');
|
toastStore.onToast('용어 수정이 정상적으로 처리되지 않았습니다.', 'e');
|
||||||
|
|||||||
@ -73,6 +73,11 @@ const addCategoryAlert = ref(false);
|
|||||||
//선택 카테고리
|
//선택 카테고리
|
||||||
const selectCategory = ref('');
|
const selectCategory = ref('');
|
||||||
|
|
||||||
|
// 카테고리 상태
|
||||||
|
const selectedCategory = computed(() =>
|
||||||
|
selectCategory.value === '' ? props.formValue : selectCategory.value
|
||||||
|
);
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
dataList: {
|
dataList: {
|
||||||
type: Array,
|
type: Array,
|
||||||
@ -133,7 +138,7 @@ const saveWord = () => {
|
|||||||
const wordData = {
|
const wordData = {
|
||||||
id: props.NumValue || null,
|
id: props.NumValue || null,
|
||||||
title: wordTitle.value,
|
title: wordTitle.value,
|
||||||
category: selectCategory.value,
|
category: selectedCategory.value,
|
||||||
content: content.value,
|
content: content.value,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -99,6 +99,7 @@ const handleProfileClick = async (user) => {
|
|||||||
if (user.MEMBERSEQ === userStore.user.id) {
|
if (user.MEMBERSEQ === userStore.user.id) {
|
||||||
// 내 프로필을 클릭한 경우
|
// 내 프로필을 클릭한 경우
|
||||||
const response = await axios.get(`vacation/history`);
|
const response = await axios.get(`vacation/history`);
|
||||||
|
console.log(response)
|
||||||
|
|
||||||
if (response.status === 200 && response.data) {
|
if (response.status === 200 && response.data) {
|
||||||
myVacations.value = response.data.data.usedVacations || [];
|
myVacations.value = response.data.data.usedVacations || [];
|
||||||
|
|||||||
@ -49,6 +49,7 @@
|
|||||||
:key="item.WRDDICSEQ"
|
:key="item.WRDDICSEQ"
|
||||||
:item="item"
|
:item="item"
|
||||||
:cateList="cateList"
|
:cateList="cateList"
|
||||||
|
@refreshWordList="getwordList"
|
||||||
/>
|
/>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user