diff --git a/.env.dev b/.env.dev index 5702020..4da29f6 100644 --- a/.env.dev +++ b/.env.dev @@ -1,6 +1,6 @@ VITE_DOMAIN = https://192.168.0.251:5173/ # VITE_LOGIN_URL = http://localhost:10325/ms/ -# VITE_FILE_URL = http://localhost:10325/ms/ -VITE_API_URL = https://192.168.0.251:10325/api/ -VITE_TEST_URL = https://192.168.0.251:10325/test/ +VITE_SERVER = https://192.168.0.251:10300/ +VITE_API_URL = https://192.168.0.251:10300/api/ +VITE_TEST_URL = https://192.168.0.251:10300/test/ VITE_KAKAO_MAP_KEY=6f092e8f45ee81186bb6d8408f66a492 \ No newline at end of file diff --git a/.env.mine b/.env.mine index 6f5a98c..07aa984 100644 --- a/.env.mine +++ b/.env.mine @@ -1,6 +1,6 @@ VITE_DOMAIN = http://localhost:5173/ # VITE_LOGIN_URL = http://localhost:10325/ms/ -# VITE_FILE_URL = http://localhost:10325/ms/ +VITE_SERVER = http://localhost:10325/ VITE_API_URL = http://localhost:10325/api/ VITE_TEST_URL = http://localhost:10325/test/ VITE_KAKAO_MAP_KEY=6f092e8f45ee81186bb6d8408f66a492 \ No newline at end of file diff --git a/index.html b/index.html index 3a0ef47..3859f38 100644 --- a/index.html +++ b/index.html @@ -32,7 +32,6 @@ - diff --git a/jenkinsfile b/jenkinsfile new file mode 100644 index 0000000..d554d83 --- /dev/null +++ b/jenkinsfile @@ -0,0 +1,41 @@ +pipeline { + agent any + tools { + nodejs 'nodejs22' + } + stages { + stage('Build'){ + steps { + bat 'npm install' + bat 'npm ci' + bat 'npm run build' + } + } + stage('Deploy') { + steps { + // 로컬 Nginx 서버에 빌드 파일 배포 + bat ''' + :: 루트경로 설정 + set NGINX_ROOT=C:\\nginx\\html + + :: 기존 빌드 삭제 + if exist "%NGINX_ROOT%\\dist" rmdir /s /q "%NGINX_ROOT%\\dist" + + :: 빌드 파일 복사 + xcopy /s /y dist\\* "%NGINX_ROOT%\\dist\\" + ''' + } + } + stage('Restart Server!') { + steps { + // 로컬 Nginx 서버 재실행 + bat ''' + net stop localnginx + ping -n 5 127.0.0.1 > nul + net start localnginx + ping -n 5 127.0.0.1 > nul + ''' + } + } + } +} diff --git a/package.json b/package.json index 9640429..037bc66 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "dev": "vite --host 0.0.0.0 --mode dev", "mine": "vite --host 0.0.0.0 --mode mine", - "build": "vite build --mode prod", + "build": "vite build --mode dev", "preview": "vite preview", "lint": "eslint . --fix", "format": "prettier --write src/" diff --git a/public/css/custom.css b/public/css/custom.css index 182e491..2ac47f0 100644 --- a/public/css/custom.css +++ b/public/css/custom.css @@ -3,22 +3,33 @@ /* 휴가 */ -.fc-daygrid-day-events { - max-height: 100px !important; - overflow-y: auto !important; -} + /* 이벤트 선 없게 */ .fc-event { border: none; } -/* 오전전반차 그래프 */ +/* 오전 반차 그래프 (왼쪽 절반) */ .fc-daygrid-event.half-day-am { - width: calc(50% - 4px) !important; + width: 50% !important; + height: 8px !important; + border-radius: 2px !important; + font-size: 0px !important; } -/* 오후반차 그래프프 */ +/* 오후 반차 그래프 (오른쪽 절반) */ .fc-daygrid-event.half-day-pm { - width: calc(50% - 4px) !important; - margin-left: auto !important + width: 50% !important; + height: 8px !important; + margin-left: auto !important; + border-radius: 2px !important; + font-size: 0px !important; +} +/* 연차 그래프 (풀풀) */ +.fc-daygrid-event.full-day { + width: 100% !important; + height: 8px !important; + margin-left: auto !important; + border-radius: 2px !important; + font-size: 0px !important; } /* 공휴일,일요일 색상 */ .fc-day-sun .fc-daygrid-day-number, @@ -39,8 +50,8 @@ .flatpickr-calendar:after { display: none !important; } - /* 기본 스타일은 그대로 두고, 데이트피커 인풋의 추가 스타일 정의 */ - .fc-toolbar-title { +/* 기본 스타일은 그대로 두고, 데이트피커 인풋의 추가 스타일 정의 */ +.fc-toolbar-title { cursor: pointer; } /* 클릭 가능한 날짜 (오늘 + 미래) */ @@ -84,7 +95,6 @@ opacity: 0.6; /* 흐려 보이게 */ /* 본인 모달 */ - /* 닫기 버튼 */ .close-btn { position: absolute; @@ -109,7 +119,6 @@ opacity: 0.6; /* 흐려 보이게 */ /* 선물하기 모달 */ - /* 연차 개수 버튼 */ .count-btn { font-size: 18px; @@ -127,7 +136,6 @@ opacity: 0.6; /* 흐려 보이게 */ background: #cccccc; cursor: not-allowed; } - /* 버튼 컨테이너 (우측 정렬) */ .custom-button-container { display: flex; @@ -141,18 +149,17 @@ opacity: 0.6; /* 흐려 보이게 */ padding: 10px; /* 크기 조정 */ cursor: pointer; /* 클릭 가능하도록 변경 */ } - /* 아이콘 색상 변경 (기본) */ .custom-button i { color: #282538; /* 기본 아이콘 색상 */ font-size: 25px; /* 아이콘 크기 */ } - /* 버튼 호버 효과 */ .custom-button:hover i { color: #ff0800; /* 호버 시 아이콘 색상 변경 */ } + .grayscaleImg { filter: grayscale(100%); } diff --git a/public/img/mbti/enfj.png b/public/img/mbti/enfj.png new file mode 100644 index 0000000..2d85491 Binary files /dev/null and b/public/img/mbti/enfj.png differ diff --git a/public/img/mbti/enfp.png b/public/img/mbti/enfp.png new file mode 100644 index 0000000..abc6c69 Binary files /dev/null and b/public/img/mbti/enfp.png differ diff --git a/public/img/mbti/entj.png b/public/img/mbti/entj.png new file mode 100644 index 0000000..7ef1341 Binary files /dev/null and b/public/img/mbti/entj.png differ diff --git a/public/img/mbti/entp.png b/public/img/mbti/entp.png new file mode 100644 index 0000000..84b2a11 Binary files /dev/null and b/public/img/mbti/entp.png differ diff --git a/public/img/mbti/esfj.png b/public/img/mbti/esfj.png new file mode 100644 index 0000000..0548975 Binary files /dev/null and b/public/img/mbti/esfj.png differ diff --git a/public/img/mbti/esfp.png b/public/img/mbti/esfp.png new file mode 100644 index 0000000..a3932e6 Binary files /dev/null and b/public/img/mbti/esfp.png differ diff --git a/public/img/mbti/est.png b/public/img/mbti/est.png new file mode 100644 index 0000000..720aa00 Binary files /dev/null and b/public/img/mbti/est.png differ diff --git a/public/img/mbti/estp.png b/public/img/mbti/estp.png new file mode 100644 index 0000000..036e95f Binary files /dev/null and b/public/img/mbti/estp.png differ diff --git a/public/img/mbti/infj.png b/public/img/mbti/infj.png new file mode 100644 index 0000000..4660186 Binary files /dev/null and b/public/img/mbti/infj.png differ diff --git a/public/img/mbti/infp.png b/public/img/mbti/infp.png new file mode 100644 index 0000000..442b8dd Binary files /dev/null and b/public/img/mbti/infp.png differ diff --git a/public/img/mbti/intj.png b/public/img/mbti/intj.png new file mode 100644 index 0000000..39b06a2 Binary files /dev/null and b/public/img/mbti/intj.png differ diff --git a/public/img/mbti/intp.png b/public/img/mbti/intp.png new file mode 100644 index 0000000..8dbb981 Binary files /dev/null and b/public/img/mbti/intp.png differ diff --git a/public/img/mbti/isfj.png b/public/img/mbti/isfj.png new file mode 100644 index 0000000..7dad009 Binary files /dev/null and b/public/img/mbti/isfj.png differ diff --git a/public/img/mbti/isfp.png b/public/img/mbti/isfp.png new file mode 100644 index 0000000..61e4bad Binary files /dev/null and b/public/img/mbti/isfp.png differ diff --git a/public/img/mbti/istj.png b/public/img/mbti/istj.png new file mode 100644 index 0000000..4924396 Binary files /dev/null and b/public/img/mbti/istj.png differ diff --git a/public/img/mbti/istp.png b/public/img/mbti/istp.png new file mode 100644 index 0000000..276f39c Binary files /dev/null and b/public/img/mbti/istp.png differ diff --git a/public/js/main.js b/public/js/main.js index c118e86..102f787 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -7,12 +7,6 @@ //----------------- let menu, animate; -<<<<<<< HEAD -var menu, animate; -(function () { - // Initialize menu - //----------------- -======= let layoutMenuEl = document.querySelectorAll('#layout-menu'); layoutMenuEl.forEach(function (element) { menu = new Menu(element, { @@ -23,7 +17,6 @@ var menu, animate; window.Helpers.scrollToActive((animate = false)); window.Helpers.mainMenu = menu; }); ->>>>>>> board-comment // Initialize menu togglers and bind click on each let menuToggler = document.querySelectorAll('.layout-menu-toggle'); @@ -118,5 +111,7 @@ var menu, animate; // If current layout is vertical and current window screen is > small // Auto update menu collapsed/expanded based on the themeConfig - window.Helpers.setCollapsed(true, false); + // 250304 pc 화면에서 메뉴바 고정을 위해 false 처리 + window.Helpers.setCollapsed(false, false); + //window.Helpers.setCollapsed(true, false); })(); diff --git a/src/common/common.js b/src/common/common.js index d1e4b91..9acd369 100644 --- a/src/common/common.js +++ b/src/common/common.js @@ -73,6 +73,14 @@ const common = { seconds: zeroFormat(date.getSeconds()), }; }, + + isNotEmpty(obj) { + if (obj === null || obj === undefined) return false; + if (typeof obj === 'string' && obj.trim() === '') return false; + if ((Array.isArray(obj) || obj === Object(obj)) && Object.keys(obj).length === 0) return false; + + return true; + }, }; export default { diff --git a/src/components/board/BoardComment.vue b/src/components/board/BoardComment.vue index ded58dc..c7e9220 100644 --- a/src/components/board/BoardComment.vue +++ b/src/components/board/BoardComment.vue @@ -11,43 +11,42 @@ :isLike="!isLike" :isCommentPassword="isCommentPassword" :isCommentProfile="true" - @editClick="aaaa" + @editClick="handleEditClick" @deleteClick="$emit('deleteClick', comment)" @updateReaction="handleUpdateReaction" - /> - - + /> -
+
{{ passwordCommentAlert }}
- -
+
- + + + @@ -58,10 +57,6 @@ :key="child.commentId" class="mt-8 pt-6 ps-10 border-top" > - - - -

child.isCommentPassword: {{ child.isCommentPassword }}

@@ -114,20 +114,29 @@ const props = defineProps({ type: Boolean, default: false }, + isDeleted: { + type: Boolean, + default: false + }, isCommentPassword: { type: Boolean, default: false, }, passwordCommentAlert: { type: String, - default: false - } + default: '' + }, + currentPasswordCommentId: { + type: Number + }, + password:{ + type: String + }, }); // emits 정의 -const emit = defineEmits(['submitComment', 'updateReaction', 'editClick', 'deleteClick', 'submitPassword', 'submitEdit', 'cancelEdit']); +const emit = defineEmits(['submitComment', 'updateReaction', 'editClick', 'deleteClick', 'submitPassword', 'submitEdit', 'cancelEdit', 'update:password']); -const password = ref(''); const localEditedContent = ref(props.comment.content); // 댓글 입력 창 토글 @@ -154,8 +163,7 @@ const handleUpdateReaction = (reactionData) => { // 비밀번호 확인 const logPasswordAndEmit = () => { - emit('submitPassword', props.comment, password.value); - password.value = ""; + emit('submitPassword', props.comment, props.password); }; watch(() => props.comment.isEditTextarea, (newVal) => { @@ -164,13 +172,26 @@ watch(() => props.comment.isEditTextarea, (newVal) => { } }); +// watch(() => props.comment.isDeleted, () => { +// console.log("BoardComment - isDeleted 상태 변경됨:", newVal); + +// if (newVal) { +// localEditedContent.value = "댓글이 삭제되었습니다."; // UI 반영 +// props.comment.isEditTextarea = false; +// } +// }); + // 수정버튼 const submitEdit = () => { emit('submitEdit', props.comment, localEditedContent.value); }; -const aaaa = () => { +const handleEditClick = () => { emit('editClick', props.comment); } +const handleReplyEditClick = (comment) => { + emit('editClick', comment); +} + diff --git a/src/components/board/BoardCommentArea.vue b/src/components/board/BoardCommentArea.vue index 4f2fca2..283ce8b 100644 --- a/src/components/board/BoardCommentArea.vue +++ b/src/components/board/BoardCommentArea.vue @@ -11,13 +11,9 @@
-->
- + {{ commentAlert }} + {{ textAlert }}
@@ -26,12 +22,7 @@
- +
@@ -46,15 +37,13 @@ placeholder="비밀번호 입력" /> {{ passwordAlert }} + {{ passwordAlert2 }}
- +
@@ -62,7 +51,8 @@ + diff --git a/src/components/board/BoardCommentList.vue b/src/components/board/BoardCommentList.vue index 3ee4624..0987a4c 100644 --- a/src/components/board/BoardCommentList.vue +++ b/src/components/board/BoardCommentList.vue @@ -10,16 +10,19 @@ :comment="comment" :isCommentAuthor="comment.isCommentAuthor" :isEditTextarea="comment.isEditTextarea" + :isDeleted="isDeleted" :isCommentPassword="isCommentPassword" - :passwordCommentAlert="passwordCommentAlert" + :passwordCommentAlert="passwordCommentAlert || ''" + :currentPasswordCommentId="currentPasswordCommentId" + :password="password" @editClick="handleEditClick" @deleteClick="handleDeleteClick" @submitPassword="submitPassword" @submitComment="submitComment" - @commentDeleted="handleCommentDeleted" @submitEdit="handleSubmitEdit" @cancelEdit="handleCancelEdit" @updateReaction="(reactionData) => handleUpdateReaction(reactionData, comment.commentId, comment.boardId)" + @update:password="updatePassword" /> @@ -51,13 +54,23 @@ const props = defineProps({ type: Boolean, default: false, }, + isDeleted: { + type: Boolean, + default: false, + }, passwordCommentAlert: { type: String, - default: false - } + default: '' + }, + currentPasswordCommentId: { + type: Number + }, + password:{ + type: String + }, }); -const emit = defineEmits(['submitComment', 'updateReaction', 'editClick', 'deleteClick', 'submitPassword', 'clearPassword']); +const emit = defineEmits(['submitComment', 'updateReaction', 'editClick', 'deleteClick', 'submitPassword', 'clearPassword','submitEdit', 'update:password']); const submitComment = (replyData) => { emit('submitComment', replyData); @@ -78,7 +91,11 @@ const submitPassword = (comment, password) => { }; const handleEditClick = (comment) => { - emit('editClick', comment); + if (comment.parentId) { + emit('editClick', comment); // 대댓글 + } else { + emit('editClick', comment); // 댓글 + } }; const handleSubmitEdit = (comment, editedContent) => { @@ -100,4 +117,8 @@ const handleCancelEdit = (comment) => { emit('cancelEdit', comment); // 댓글 수정 취소 } }; + +const updatePassword = (newPassword) => { + emit('update:password', newPassword); +}; diff --git a/src/components/board/BoardProfile.vue b/src/components/board/BoardProfile.vue index c3c4f91..25ae89d 100644 --- a/src/components/board/BoardProfile.vue +++ b/src/components/board/BoardProfile.vue @@ -2,8 +2,9 @@
- Avatar + Avatar
+
{{ profileName }}
@@ -22,8 +23,7 @@
- - - - diff --git a/src/components/button/BoardRecommendBtn.vue b/src/components/button/BoardRecommendBtn.vue index e297eb7..8ffa805 100644 --- a/src/components/button/BoardRecommendBtn.vue +++ b/src/components/button/BoardRecommendBtn.vue @@ -13,7 +13,7 @@ import { ref, computed } from 'vue'; const props = defineProps({ comment: { type: Object, - required: true, + default: () => ({}), }, likeClicked : { type : Boolean, @@ -36,7 +36,7 @@ const props = defineProps({ required: true, }, commentId: { - type: Number, + type: [Number, null], default: null, }, likeCount: { diff --git a/src/components/button/EditBtn.vue b/src/components/button/EditBtn.vue index 9987ddb..d3437b0 100644 --- a/src/components/button/EditBtn.vue +++ b/src/components/button/EditBtn.vue @@ -1,13 +1,30 @@ - diff --git a/src/components/button/HalfDayButtons.vue b/src/components/button/HalfDayButtons.vue index 9bb125f..c4fa6ee 100644 --- a/src/components/button/HalfDayButtons.vue +++ b/src/components/button/HalfDayButtons.vue @@ -20,7 +20,8 @@
-
@@ -28,26 +29,28 @@ +const props = defineProps({ + isToggleEnabled: { + type: Boolean, + default: false, + }, +}); + +const buttonClass = ref("bx bx-edit"); + +const toggleText = () => { + if (props.isToggleEnabled) { + buttonClass.value = buttonClass.value === "bx bx-edit" ? "bx bx-x" : "bx bx-edit"; + } +}; + +const resetButton = () => { + buttonClass.value = "bx bx-edit"; +}; + +defineExpose({ resetButton }); + \ No newline at end of file diff --git a/src/components/input/FormFile.vue b/src/components/input/FormFile.vue index bc45bea..833c6b0 100644 --- a/src/components/input/FormFile.vue +++ b/src/components/input/FormFile.vue @@ -1,11 +1,12 @@ \ No newline at end of file + + +const selected = computed(() => { + const selectedItem = props.data.find(item => + props.isCommon ? item.value === selectData.value : props.data.indexOf(item) === selectData.value + ); + return selectedItem ? selectedItem.label : null; +}); + + diff --git a/src/components/list/ProjectCard.vue b/src/components/list/ProjectCard.vue index e81e4fb..7af8059 100644 --- a/src/components/list/ProjectCard.vue +++ b/src/components/list/ProjectCard.vue @@ -38,7 +38,7 @@
{{ address }} {{ addressdtail }} -
+
@@ -46,8 +46,7 @@ v-if="coordinates" :lat="coordinates.lat" :lng="coordinates.lng" - :draggable="false" - class="w-100 h-px-200" + class="w-px-200 h-px-200" > { isEditModalOpen.value = false; }; +// 변경된 내용 있는지 확인 +const hasChanges = computed(() => { + return selectedProject.value.PROJCTNAM !== props.title || + selectedProject.value.PROJCTSTR !== props.strdate || + selectedProject.value.PROJCTEND !== props.enddate || + selectedProject.value.PROJCTZIP !== props.addressZip || + selectedProject.value.PROJCTARR !== props.address || + selectedProject.value.PROJCTDTL !== props.addressdtail || + selectedProject.value.PROJCTDES !== props.description || + selectedProject.value.PROJCTCOL !== props.projctCol; +}); + // 프로젝트 수정 const handleUpdate = () => { nameAlert.value = selectedProject.value.PROJCTNAM.trim() === ''; @@ -318,6 +329,11 @@ const handleUpdate = () => { return; } + if (!hasChanges.value) { + toastStore.onToast('변경된 내용이 없습니다.', 'e'); + return; + } + $api.patch('project/update', { projctSeq: selectedProject.value.PROJCTSEQ, projctNam: selectedProject.value.PROJCTNAM, @@ -336,7 +352,6 @@ const handleUpdate = () => { closeEditModal(); // 상위 컴포넌트에 업데이트 알림 emit('update'); - window.location.reload() } }); }; diff --git a/src/components/projectlist/ProjectList.vue b/src/components/projectlist/ProjectList.vue index 7df7b41..cc10764 100644 --- a/src/components/projectlist/ProjectList.vue +++ b/src/components/projectlist/ProjectList.vue @@ -49,6 +49,7 @@ :is-essential="true" :is-label="true" :is-common="true" + :is-color="true" :data="colorList" @update:data="color = $event" /> @@ -100,7 +101,7 @@ import { computed, ref, watch, onMounted, inject } from 'vue'; import SearchBar from '@c/search/SearchBar.vue'; import ProjectCard from '@c/list/ProjectCard.vue'; - import CategoryBtn from '@c/category/CategoryBtn.vue'; + import CategoryBtn from '@/components/category/CategoryBtn.vue'; import WriteBtn from '@c/button/WriteBtn.vue'; import CenterModal from '@c/modal/CenterModal.vue'; import FormSelect from '@c/input/FormSelect.vue'; diff --git a/src/components/user/FindPassword.vue b/src/components/user/FindPassword.vue index 0260908..09866eb 100644 --- a/src/components/user/FindPassword.vue +++ b/src/components/user/FindPassword.vue @@ -68,20 +68,21 @@ :is-alert="passwordcheckAlert" @update:data="passwordcheck = $event" @update:alert="passwordcheckAlert = $event" - @blur="checkPw" + @input="checkPw" :value="passwordcheck" /> {{ passwordcheckError }} -
- -

{{ pwErrMsg }}

+
+ +
+

{{ pwErrMsg }}

diff --git a/src/components/user/RegisterForm.vue b/src/components/user/RegisterForm.vue index 2953ea3..5a5b557 100644 --- a/src/components/user/RegisterForm.vue +++ b/src/components/user/RegisterForm.vue @@ -92,6 +92,7 @@ :is-row="false" :is-label="true" :is-common="true" + :is-color="true" :data="colorList" @update:data="color = $event" class="w-50" @@ -118,6 +119,7 @@ :is-row="false" :is-label="true" :is-common="true" + :is-mbti="true" :data="mbtiList" @update:data="mbti = $event" class="w-50" diff --git a/src/components/user/UserList.vue b/src/components/user/UserList.vue index 27f81e6..f921ce3 100644 --- a/src/components/user/UserList.vue +++ b/src/components/user/UserList.vue @@ -1,7 +1,7 @@ diff --git a/src/views/vacation/VacationManagement.vue b/src/views/vacation/VacationManagement.vue index f61dba6..c8ac838 100644 --- a/src/views/vacation/VacationManagement.vue +++ b/src/views/vacation/VacationManagement.vue @@ -7,9 +7,11 @@