Merge branch 'main' into board-comment-2

This commit is contained in:
dyhj625 2025-02-28 14:58:20 +09:00
commit 497d45e6df
6 changed files with 73 additions and 151 deletions

View File

@ -1,13 +1,30 @@
<template> <template>
<button class="btn btn-label-primary btn-icon"> <button class="btn btn-label-primary btn-icon" @click="toggleText">
<i class="bx bx-edit-alt"></i> <i :class="buttonClass"></i>
</button> </button>
</template> </template>
<script> <script setup>
export default { import { ref, defineProps } from 'vue';
name: 'EditButton',
methods: { const props = defineProps({
}, isToggleEnabled: {
}; type: Boolean,
default: false,
},
});
const buttonClass = ref("bx bx-edit-alt");
const toggleText = () => {
if (props.isToggleEnabled) {
buttonClass.value = buttonClass.value === "bx bx-edit-alt" ? "bx bx-x" : "bx bx-edit-alt";
}
};
const resetButton = () => {
buttonClass.value = "bx bx-edit-alt";
};
defineExpose({ resetButton });
</script> </script>

View File

@ -1,9 +1,30 @@
<template> <template>
<button class="btn btn-label-primary btn-icon float-end"> <button class="btn btn-label-primary btn-icon float-end" @click="toggleText">
<i class="bx bx-edit"></i> <i :class="buttonClass"></i>
</button> </button>
</template> </template>
<script setup> <script setup>
import { ref, defineProps, defineExpose } from 'vue';
</script> 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 });
</script>

View File

@ -101,7 +101,7 @@
import { computed, ref, watch, onMounted, inject } from 'vue'; import { computed, ref, watch, onMounted, inject } from 'vue';
import SearchBar from '@c/search/SearchBar.vue'; import SearchBar from '@c/search/SearchBar.vue';
import ProjectCard from '@c/list/ProjectCard.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 WriteBtn from '@c/button/WriteBtn.vue';
import CenterModal from '@c/modal/CenterModal.vue'; import CenterModal from '@c/modal/CenterModal.vue';
import FormSelect from '@c/input/FormSelect.vue'; import FormSelect from '@c/input/FormSelect.vue';

View File

@ -18,7 +18,6 @@
type="checkbox" type="checkbox"
class="form-check-input admin-chk" class="form-check-input admin-chk"
:name="item.WRDDICSEQ" :name="item.WRDDICSEQ"
id=""
@change="toggleCheck($event)" @change="toggleCheck($event)"
> >
<div class="d-flex align-ite-center"> <div class="d-flex align-ite-center">
@ -66,7 +65,7 @@
</div> </div>
<div class="edit-btn" v-if="userStore.user.role !== 'ROLE_ADMIN'"> <div class="edit-btn" v-if="userStore.user.role !== 'ROLE_ADMIN'">
<EditBtn @click="writeStore.toggleItem(item.WRDDICSEQ)" /> <EditBtn ref="writeButton" @click="writeStore.toggleItem(item.WRDDICSEQ)" :isToggleEnabled="true"/>
</div> </div>
</li> </li>
</template> </template>
@ -74,7 +73,7 @@
<script setup> <script setup>
import axios from "@api"; import axios from "@api";
import { useToastStore } from '@s/toastStore'; import { useToastStore } from '@s/toastStore';
import { ref, toRefs, getCurrentInstance, } from 'vue'; import { getCurrentInstance, ref } from 'vue';
import EditBtn from '@/components/button/EditBtn.vue'; import EditBtn from '@/components/button/EditBtn.vue';
import $api from '@api'; import $api from '@api';
import DictWrite from './DictWrite.vue'; import DictWrite from './DictWrite.vue';
@ -82,6 +81,7 @@ import { useUserInfoStore } from '@s/useUserInfoStore';
import { useWriteVisibleStore } from '@s/writeVisible'; import { useWriteVisibleStore } from '@s/writeVisible';
const writeStore = useWriteVisibleStore(); const writeStore = useWriteVisibleStore();
const writeButton = ref(null);
// //
const userStore = useUserInfoStore(); const userStore = useUserInfoStore();
@ -103,68 +103,12 @@ const props = defineProps({
} }
}); });
//
// const localCateList = ref([...props.cateList]);
//
// const selectedCategory = ref('');
// cateList emit // cateList emit
const emit = defineEmits(['update:cateList','refreshWordList', 'updateChecked']); const emit = defineEmits(['update:cateList','refreshWordList', 'updateChecked']);
//
// const isWriteVisible = ref(false);
// toggle
// const toggleWriteVisible = () => {
// isWriteVisible.value = !isWriteVisible.value;
// };
//
// const addCategory = (data) => {
// try {
// const lastCategory = localCateList.value.length > 0
// ? localCateList.value[localCateList.value.length - 1]
// : null;
// const newValue = lastCategory ? lastCategory.value + 1 : 600101;
// // // console.log('lastCategory', lastCategory);
// // // console.log('newValue', newValue);
// axios.post('worddict/insertCategory', {
// CMNCODNAM: data
// }).then(res => {
// if(res.data.data === 1){
// toastStore.onToast(' .', 's');
// const newCategory = { label: data, value: newValue };
// localCateList.value = [newCategory, ...localCateList.value];
// selectedCategory.value = newCategory.value;
// // // console.log('newCategory', newCategory);
// // // console.log('localCateList.value', localCateList.value);
// // // console.log('selectedCategory.value', selectedCategory.value);
// // //
// emit('update:cateList', localCateList.value);
// } else if(res.data.message == ' .') {
// toastStore.onToast(res.data.message, 'e');
// }
// }).catch(err => {
// console.error(' :', err);
// });
// } catch (err) {
// console.error(' :', err);
// }
// }
// //
const editWord = (data) => { const editWord = (data) => {
// console.log('📌 :', data);
// console.log('📌 :', data.id);
// console.log('📌 :', data.category);
// console.log('📌 :', data.title);
// console.log('📌 :', $common.deltaAsJson(data.content));
if (!data.id) { if (!data.id) {
console.error('❌ 수정할 데이터의 ID가 없습니다.'); console.error('❌ 수정할 데이터의 ID가 없습니다.');
@ -181,8 +125,10 @@ const editWord = (data) => {
.then((res) => { .then((res) => {
if (res.data.data === 1) { if (res.data.data === 1) {
toastStore.onToast('✅ 용어가 수정되었습니다.', 's'); toastStore.onToast('✅ 용어가 수정되었습니다.', 's');
// isWriteVisible.value = false;
writeStore.closeAll(); writeStore.closeAll();
if (writeButton.value) {
writeButton.value.resetButton();
}
emit('refreshWordList'); emit('refreshWordList');
} else { } else {
console.warn('⚠️ 서버 응답이 예상과 다릅니다:', res.data); console.warn('⚠️ 서버 응답이 예상과 다릅니다:', res.data);
@ -216,10 +162,13 @@ const toggleCheck = (event) => {
</script> </script>
<style scoped> <style scoped>
/* 동그란 테두리 설정 */ .avatar {
cursor: default;
}
.user-avatar { .user-avatar {
border: 3px solid; /* 테두리 */ border: 3px solid;
padding: 0.1px; /* 테두리와 이미지 사이의 간격 */ padding: 0.1px;
} }
.edit-btn { .edit-btn {

View File

@ -29,11 +29,6 @@
@focusout="handleCategoryFocusout(addCategory)" @focusout="handleCategoryFocusout(addCategory)"
/> />
</div> </div>
<!-- <div class="col-2 btn-margin">
<button class="btn btn-primary btn-icon" @click="saveInput">
<i class="bx bx-check"></i>
</button>
</div> -->
</div> </div>
</div> </div>
<div class="dict-w"> <div class="dict-w">
@ -65,14 +60,6 @@ import QEditor from '@/components/editor/QEditor.vue';
import FormInput from '@/components/input/FormInput.vue'; import FormInput from '@/components/input/FormInput.vue';
import FormSelect from '@/components/input/FormSelect.vue'; import FormSelect from '@/components/input/FormSelect.vue';
import PlusBtn from '../button/PlusBtn.vue'; import PlusBtn from '../button/PlusBtn.vue';
// import { clearConfig } from 'dompurify';
// import { useUserInfoStore } from '@s/useUserInfoStore';
//
// const userStore = useUserInfoStore();
// disabled
// const isDisabled = computed(() => userStore.user.role !== 'ROLE_ADMIN');
const emit = defineEmits(['close','addCategory','addWord']); const emit = defineEmits(['close','addCategory','addWord']);
@ -133,20 +120,6 @@ const toggleInput = () => {
showInput.value = !showInput.value; showInput.value = !showInput.value;
}; };
//
// const saveInput = () => {
// if(addCategory.value == ''){
// addCategoryAlert.value = true;
// return;
// }else {
// addCategoryAlert.value = false;
// }
// console.log(' !',addCategory.value);
// emit('addCategory', addCategory.value);
// showInput.value = false;
// };
const onChange = (newValue) => { const onChange = (newValue) => {
selectCategory.value = newValue.target.value; selectCategory.value = newValue.target.value;
}; };
@ -199,11 +172,9 @@ const handleCategoryFocusout = (value) => {
const valueTrim = value.trim(); const valueTrim = value.trim();
const existingCategory = props.dataList.find(item => item.label === valueTrim); const existingCategory = props.dataList.find(item => item.label === valueTrim);
// console.log('existingCategory', existingCategory);
// //
if(valueTrim == ''){ if(valueTrim == ''){
//alert(' ');
addCategoryAlert.value = true; addCategoryAlert.value = true;
// focus // focus

View File

@ -13,8 +13,7 @@
<!-- 단어 갯수, 작성하기 --> <!-- 단어 갯수, 작성하기 -->
<div class="mt-4"> <div class="mt-4">
단어 : {{ total }} <WriteButton ref="writeButton" @click="writeStore.toggleItem(999999)" :isToggleEnabled="true"/>
<WriteButton @click="writeStore.toggleItem(999999)" />
</div> </div>
<!-- --> <!-- -->
@ -67,7 +66,7 @@
</template> </template>
<script setup> <script setup>
import { ref, watchEffect, computed, onMounted, getCurrentInstance, toRaw } from 'vue'; import { ref, computed, onMounted, getCurrentInstance, toRaw } from 'vue';
import axios from '@api'; import axios from '@api';
import SearchBar from '@c/search/SearchBar.vue'; import SearchBar from '@c/search/SearchBar.vue';
import WriteButton from '@c/button/WriteBtn.vue'; import WriteButton from '@c/button/WriteBtn.vue';
@ -77,14 +76,11 @@
import DictAlphabetFilter from '@/components/wordDict/DictAlphabetFilter.vue'; import DictAlphabetFilter from '@/components/wordDict/DictAlphabetFilter.vue';
import commonApi from '@/common/commonApi'; import commonApi from '@/common/commonApi';
import { useToastStore } from '@s/toastStore'; import { useToastStore } from '@s/toastStore';
import { useUserInfoStore } from '@s/useUserInfoStore';
import { useWriteVisibleStore } from '@s/writeVisible'; import { useWriteVisibleStore } from '@s/writeVisible';
// //
const writeStore = useWriteVisibleStore(); const writeStore = useWriteVisibleStore();
const writeButton = ref(null);
//
// const userStore = useUserInfoStore();
const { appContext } = getCurrentInstance(); const { appContext } = getCurrentInstance();
const $common = appContext.config.globalProperties.$common; const $common = appContext.config.globalProperties.$common;
@ -107,7 +103,6 @@
}); });
const selectedCategory = ref(''); const selectedCategory = ref('');
const selectCategory = ref('');
// //
const checkedItems = ref([]); const checkedItems = ref([]);
@ -121,9 +116,6 @@
// //
const searchText = ref(''); const searchText = ref('');
//
// const isWriteVisible = ref(false);
// //
onMounted(() => { onMounted(() => {
getwordList(); getwordList();
@ -168,34 +160,8 @@
// //
const handleSelectedCategoryChange = (category) => { const handleSelectedCategoryChange = (category) => {
selectedCategory.value = category; selectedCategory.value = category;
getwordList(searchText.value, selectedAlphabet.value, selectedCategory.value) getwordList(searchText.value, selectedAlphabet.value, selectedCategory.value);
} }
// toggle
// const toggleWriteForm = () => {
// isWriteVisible.value = !isWriteVisible.value;
// };
//
// const addCategory = (data) =>{
// const lastCategory = cateList.value[cateList.value.length - 1];
// const newValue = lastCategory ? lastCategory.value + 1 : 600101;
// const newCategory = { label: data, value: newValue };
// cateList.value = [newCategory, ...cateList.value];
// selectedCategory.value = newCategory.value;
//// axios.post('worddict/insertCategory',{
//// CMNCODNAM: data
//// }).then(res => {
//// if(res.data.data == '1'){
//// toastStore.onToast(' .', 's');
//// const newCategory = { label: data, value: newValue };
//// cateList.value = [newCategory, ...cateList.value];
//// selectedCategory.value = newCategory.value;
//// } else if(res.data.message == ' .') {
//// toastStore.onToast(res.data.message, 'e');
//// }
//// })
// }
// //
const addWord = (wordData, data) => { const addWord = (wordData, data) => {
@ -208,9 +174,9 @@
category = existingCategory.label == '' ? wordData.category : existingCategory.value; category = existingCategory.label == '' ? wordData.category : existingCategory.value;
} else { } else {
// //
// console.log(' ');
const lastCategory = cateList.value[cateList.value.length - 1]; const lastCategory = cateList.value[cateList.value.length - 1];
category = lastCategory ? lastCategory.value + 1 : 600101; category = lastCategory ? lastCategory.value + 1 : 600101;
} }
sendWordRequest(category, wordData, data, !existingCategory); sendWordRequest(category, wordData, data, !existingCategory);
}; };
@ -227,8 +193,10 @@
axios.post('worddict/insertWord', payload).then(res => { axios.post('worddict/insertWord', payload).then(res => {
if (res.data.status === 'OK') { if (res.data.status === 'OK') {
toastStore.onToast('용어가 등록 되었습니다.', 's'); toastStore.onToast('용어가 등록 되었습니다.', 's');
// isWriteVisible.value = false;
writeStore.closeAll(); writeStore.closeAll();
if (writeButton.value) {
writeButton.value.resetButton();
}
getwordList(); getwordList();
const newCategory = { label: data, value: category }; const newCategory = { label: data, value: category };
cateList.value = [newCategory, ...cateList.value]; cateList.value = [newCategory, ...cateList.value];
@ -238,8 +206,10 @@
axios.post('worddict/insertWord', payload).then(res => { axios.post('worddict/insertWord', payload).then(res => {
if (res.data.status === 'OK') { if (res.data.status === 'OK') {
toastStore.onToast('용어가 등록 되었습니다.', 's'); toastStore.onToast('용어가 등록 되었습니다.', 's');
// isWriteVisible.value = false;
writeStore.closeAll(); writeStore.closeAll();
if (writeButton.value) {
writeButton.value.resetButton();
}
getwordList(); getwordList();
} }
}); });
@ -256,16 +226,12 @@
checkedItems.value = checkedItems.value.filter(item => item !== id); checkedItems.value = checkedItems.value.filter(item => item !== id);
checkedNames.value = checkedNames.value.filter(item => item !== name); checkedNames.value = checkedNames.value.filter(item => item !== name);
} }
// name
// console.log(" name :", checkedNames.value);
}; };
const isAnyChecked = computed(() => checkedItems.value.length > 0); const isAnyChecked = computed(() => checkedItems.value.length > 0);
// //
const deleteCheckedItems = () => { const deleteCheckedItems = () => {
// console.log(" name :", Object.values(checkedNames.value));
axios.patch('worddict/deleteword', { axios.patch('worddict/deleteword', {
idList: Object.values(checkedNames.value) idList: Object.values(checkedNames.value)
@ -273,7 +239,6 @@
.then(res => { .then(res => {
if (res.data.status == 'OK') { if (res.data.status == 'OK') {
toastStore.onToast('용어 삭제가 완료되었습니다.', 's'); toastStore.onToast('용어 삭제가 완료되었습니다.', 's');
// isWriteVisible.value = false;
writeStore.closeAll(); writeStore.closeAll();
getwordList(); getwordList();
@ -283,7 +248,6 @@
} }
}) })
.catch(error => { .catch(error => {
// console.error(' :', error);
toastStore.onToast('오류가 발생했습니다. 다시 시도해주세요.', 'e'); toastStore.onToast('오류가 발생했습니다. 다시 시도해주세요.', 'e');
}); });