boardview 에서 수정, 삭제시 버튼 클릭 활성화

This commit is contained in:
nevermoregb 2025-04-03 22:17:30 +09:00
parent 2072a41ca9
commit 7e0ae7063d
6 changed files with 172 additions and 52 deletions

View File

@ -12,6 +12,8 @@
:isLike="!isLike"
:isCommentPassword="isCommentPassword"
:isCommentProfile="true"
:is-edit-pushed="isEditPushed"
:is-delete-pushed="isDeletePushed"
@editClick="handleEditClick"
@deleteClick="$emit('deleteClick', comment)"
@updateReaction="handleUpdateReaction"
@ -116,9 +118,20 @@
password: {
type: String,
},
// isEditPushed: {
// type: Boolean,
// required: false,
// },
// isDeletePushed: {
// type: Boolean,
// required: false,
// },
editCommentAlert: String,
});
const isEditPushed = ref(false);
const isDeletePushed = ref(false);
const displayName = computed(() => {
return props.nickname ? props.nickname : props.comment.author;
});
@ -171,6 +184,24 @@
emit('submitPassword', props.comment, props.password);
};
const handleInject = inject('isBtnPushed');
// ,
watch(
() => handleInject.value,
(newValue, oldValue) => {
if (newValue) {
if (newValue.target == props.comment.commentId) {
isEditPushed.value = newValue.isEditPushed;
isDeletePushed.value = newValue.isDeletePushed;
} else {
isEditPushed.value = false;
isDeletePushed.value = false;
}
}
},
);
watch(
() => props.comment.isEditTextarea,
newVal => {

View File

@ -13,6 +13,8 @@
:currentPasswordCommentId="currentPasswordCommentId"
:password="password"
:editCommentAlert="editCommentAlert[comment.commentId]"
:is-edit-pushed="comment.isEditPushed"
:is-delete-pushed="comment.isDeletePushed"
@editClick="handleEditClick"
@deleteClick="handleDeleteClick"
@submitPassword="submitPassword"
@ -40,6 +42,8 @@
:passwordCommentAlert="passwordCommentAlert"
:password="password"
:editCommentAlert="editCommentAlert[child.commentId]"
:is-edit-pushed="child.isEditPushed"
:is-delete-pushed="child.isDeletePushed"
@editClick="handleReplyEditClick"
@deleteClick="$emit('deleteClick', child)"
@submitEdit="(comment, editedContent) => $emit('submitEdit', comment, editedContent, child.commentId)"
@ -59,7 +63,7 @@
</template>
<script setup>
import { defineProps, defineEmits } from 'vue';
import { defineProps, defineEmits, watch } from 'vue';
import BoardComment from './BoardComment.vue';
const props = defineProps({

View File

@ -27,8 +27,8 @@
<!-- 수정, 삭제 버튼 -->
<template v-if="!isDeletedComment && (unknown || isCommentAuthor || isAuthor)">
<div class="float-end ms-1">
<EditButton @click.stop="editClick" />
<DeleteButton :class="'ms-1'" @click.stop="deleteClick" />
<EditButton @click.stop="editClick" :is-pushed="isEditPushed" />
<DeleteButton :class="'ms-1'" @click.stop="deleteClick" :is-pushed="isDeletePushed" />
</div>
</template>
@ -107,6 +107,14 @@
type: String,
default: false,
},
isEditPushed: {
type: Boolean,
require: false,
},
isDeletePushed: {
type: Boolean,
require: false,
},
});
const emit = defineEmits(['updateReaction', 'editClick', 'deleteClick']);

View File

@ -1,13 +1,14 @@
<template>
<button class="btn btn-label-primary btn-icon">
<i class='bx bx-trash' ></i>
<button class="btn btn-label-primary btn-icon" :class="{ active: props.isPushed }">
<i class="bx bx-trash"></i>
</button>
</template>
<script>
export default {
name: 'DeleteButton',
methods: {
<script setup>
const props = defineProps({
isPushed: {
type: Boolean,
required: false,
},
};
});
</script>

View File

@ -1,10 +1,10 @@
<template>
<button class="btn btn-label-primary btn-icon" @click="toggleText">
<button class="btn btn-label-primary btn-icon" :class="{ active: props.isPushed }" @click="toggleText">
<i :class="buttonClass"></i>
</button>
</template>
<script setup>
import { ref, watch, defineProps, defineEmits, watchEffect } from 'vue';
import { ref, watch, defineEmits, watchEffect } from 'vue';
const props = defineProps({
isToggleEnabled: {
type: Boolean,
@ -14,18 +14,22 @@
type: Boolean,
required: false,
},
isPushed: {
type: Boolean,
required: false,
},
});
const emit = defineEmits(["click"]);
const emit = defineEmits(['click']);
const buttonClass = ref('bx bx-edit-alt');
watchEffect(() => {
buttonClass.value = props.isActive ? 'bx bx-x' : 'bx bx-edit-alt';
});
const toggleText = (event) => {
const toggleText = event => {
//
if (props.isToggleEnabled) {
buttonClass.value = buttonClass.value === 'bx bx-edit-alt' ? 'bx bx-x' : 'bx bx-edit-alt';
}
emit("click", event); //
emit('click', event); //
};
const resetButton = () => {
buttonClass.value = 'bx bx-edit-alt';

View File

@ -17,6 +17,8 @@
:date="formattedBoardDate"
:isLike="false"
:isAuthor="isAuthor"
:is-edit-pushed="isEditPushed"
:is-delete-pushed="isDeletePushed"
@editClick="editClick"
@deleteClick="deleteClick"
/>
@ -92,7 +94,7 @@
@updateReaction="handleUpdateReaction"
/>
</div>
<div v-if="!type" >
<div v-if="!type">
<!-- 댓글 입력 영역 -->
<BoardCommentArea
:profileName="profileName"
@ -142,7 +144,7 @@
import BoardCommentList from '@c/board/BoardCommentList.vue';
import BoardRecommendBtn from '@c/button/BoardRecommendBtn.vue';
import Pagination from '@c/pagination/Pagination.vue';
import { ref, onMounted, computed, inject } from 'vue';
import { ref, onMounted, computed, inject, provide } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { useUserInfoStore } from '@/stores/useUserInfoStore';
import { useToastStore } from '@s/toastStore';
@ -165,6 +167,8 @@
const attachment = ref(false);
const comments = ref([]);
const profileImg = ref('');
const isEditPushed = ref(false);
const isDeletePushed = ref(false);
const route = useRoute();
const router = useRouter();
@ -319,6 +323,9 @@
});
fetchComments(pagination.value.currentPage);
closeAllEditTextareas();
closeAllPasswordAreas();
activeCommentBtnClass();
};
//
@ -476,6 +483,9 @@
if (isUnknown) {
togglePassword('edit');
closeAllEditTextareas();
closeAllPasswordAreas();
activeCommentBtnClass();
} else {
router.push({ name: 'BoardEdit', params: { id: currentBoardId.value } });
}
@ -505,11 +515,36 @@
return null;
};
const btnState = ref({});
provide('isBtnPushed', btnState);
const activeCommentBtnClass = (targetComment = null, type = 3) => {
const target = targetComment?.commentId;
let editPush = false;
let deletePush = false;
if (targetComment) {
if (type == 1) {
editPush = true;
deletePush = false;
} else if (type == 2) {
editPush = false;
deletePush = true;
}
}
btnState.value = {
target: target,
isEditPushed: editPush,
isDeletePushed: deletePush,
};
};
// ( )
const editComment = comment => {
acitveButtonType(); //
password.value = '';
passwordCommentAlert.value = '';
//currentPasswordCommentId.value = null;
isPassword.value = false; //
const targetComment = findCommentById(comment.commentId, comments.value);
@ -522,27 +557,20 @@
if (isMyComment) {
if (targetComment.isEditTextarea) {
//
targetComment.isEditTextarea = false;
currentPasswordCommentId.value = comment.commentId;
activeCommentBtnClass(targetComment, 3);
} else {
//
closeAllEditTextareas();
currentPasswordCommentId.value = null;
//
targetComment.isEditTextarea = true;
closeAllEditTextareas(); //
currentPasswordCommentId.value = null; //
targetComment.isEditTextarea = true; //
activeCommentBtnClass(targetComment, 1);
}
} else if (isAnonymous) {
if (currentPasswordCommentId.value === comment.commentId) {
//
toggleCommentPassword(comment, 'edit');
return;
toggleCommentPassword(comment, 'edit'); //
} else {
//
closeAllEditTextareas();
//
closeAllEditTextareas(); //
targetComment.isEditTextarea = false;
toggleCommentPassword(comment, 'edit');
}
@ -551,6 +579,26 @@
}
};
//
const deleteComment = async comment => {
const isMyComment = comment.authorId === currentUserId.value;
//
if (unknown.value && !isMyComment) {
//
if (comment.isEditTextarea) {
comment.isEditTextarea = false;
comment.isCommentPassword = true;
toggleCommentPassword(comment, 'delete');
} else {
activeCommentBtnClass(comment, 3);
toggleCommentPassword(comment, 'delete');
}
} else {
deleteReplyComment(comment);
}
};
//
const closeAllEditTextareas = () => {
comments.value.forEach(comment => {
@ -568,30 +616,20 @@
passwordCommentAlert.value = '';
};
//
const deleteComment = async comment => {
const isMyComment = comment.authorId === currentUserId.value;
if (unknown.value && !isMyComment) {
if (comment.isEditTextarea) {
comment.isEditTextarea = false;
comment.isCommentPassword = true;
toggleCommentPassword(comment, 'delete');
} else {
toggleCommentPassword(comment, 'delete');
}
} else {
deleteReplyComment(comment);
}
};
//
const toggleCommentPassword = (comment, button) => {
if (lastCommentClickedButton.value === button && currentPasswordCommentId.value === comment.commentId) {
currentPasswordCommentId.value = null; //
password.value = '';
passwordCommentAlert.value = '';
activeCommentBtnClass(comment, 3);
} else {
if (button == 'edit') {
activeCommentBtnClass(comment, 1);
} else if (button == 'delete') {
activeCommentBtnClass(comment, 2);
}
currentPasswordCommentId.value = comment.commentId; //
password.value = '';
passwordCommentAlert.value = '';
@ -608,17 +646,49 @@
isPassword.value = false;
boardPasswordAlert.value = '';
password.value = '';
acitveButtonType();
return;
}
closeAllPasswordAreas();
if (lastClickedButton.value === button) {
isPassword.value = !isPassword.value;
boardPasswordAlert.value = '';
lastClickedButton.value = '';
acitveButtonType();
} else {
isPassword.value = true;
}
lastClickedButton.value = button;
if (button == 'edit') {
acitveButtonType(1);
} else if (button == 'delete') {
acitveButtonType(2);
} else {
acitveButtonType();
}
}
};
// (, )
const acitveButtonType = type => {
//closeAllEditTextareas(); //
//inActiveCommentButtonClass(); //
//
if (type == 1) {
isEditPushed.value = true;
isDeletePushed.value = false;
//
} else if (type == 2) {
isEditPushed.value = false;
isDeletePushed.value = true;
//
} else {
isEditPushed.value = false;
isDeletePushed.value = false;
}
};
//
@ -738,6 +808,7 @@
if (response.data.code === 200) {
await fetchComments(pagination.value.currentPage);
closeAllPasswordAreas();
activeCommentBtnClass();
if (targetComment) {
// " ." ,
@ -766,6 +837,7 @@
if (response.status === 200) {
togglePassword('close');
fetchComments(pagination.value.currentPage);
activeCommentBtnClass();
return;
// const targetComment = findCommentById(comment.commentId, comments.value);