Merge branch 'main' into vacation
This commit is contained in:
commit
8324095bf4
@ -71,7 +71,8 @@
|
|||||||
const editor = ref(null); // 에디터 DOM 참조
|
const editor = ref(null); // 에디터 DOM 참조
|
||||||
const font = ref('nanum-gothic'); // 기본 폰트
|
const font = ref('nanum-gothic'); // 기본 폰트
|
||||||
const fontSize = ref('16px'); // 기본 폰트 크기
|
const fontSize = ref('16px'); // 기본 폰트 크기
|
||||||
const emit = defineEmits(['update:data']);
|
const emit = defineEmits(['update:data', 'update:uploadedImgList']);
|
||||||
|
const uploadedImgList = ref([]); // 에디터에 이미지 첨부시 업데이트 된 파일 인덱스 번호 리스트
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// 툴바에서 선택할 수 있는 폰트 목록 설정
|
// 툴바에서 선택할 수 있는 폰트 목록 설정
|
||||||
@ -112,6 +113,13 @@
|
|||||||
quillInstance.format('size', fontSize.value);
|
quillInstance.format('size', fontSize.value);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 이미지 첨부 리스트가 변경 되었을때
|
||||||
|
watch(uploadedImgList, () => {
|
||||||
|
console.log(!23);
|
||||||
|
emit('update:uploadedImgList', uploadedImgList.value);
|
||||||
|
console.log('uploadedImgList.value: ', uploadedImgList.value);
|
||||||
|
});
|
||||||
|
|
||||||
// 초기 데이터가 있을 경우, HTML 형식으로 삽입
|
// 초기 데이터가 있을 경우, HTML 형식으로 삽입
|
||||||
if (props.initialData) {
|
if (props.initialData) {
|
||||||
quillInstance.setContents(JSON.parse(props.initialData));
|
quillInstance.setContents(JSON.parse(props.initialData));
|
||||||
@ -150,7 +158,15 @@
|
|||||||
|
|
||||||
// 이미지 서버에 업로드 후 URL 받기
|
// 이미지 서버에 업로드 후 URL 받기
|
||||||
uploadImageToServer(formData)
|
uploadImageToServer(formData)
|
||||||
.then(serverImageUrl => {
|
.then(data => {
|
||||||
|
const uploadImgIdx = data?.fileIndex; // 업로드 된 파일 DB 인덱스
|
||||||
|
const serverImageUrl = data?.fileUrl; // 업로드 된 파일 url
|
||||||
|
|
||||||
|
// 업로드 된 파일 인덱스 (게시글 저장 시 해당 인덱스 번호에 게시글 인덱스를 업데이트)
|
||||||
|
if (uploadImgIdx) {
|
||||||
|
uploadedImgList.value = [...uploadedImgList.value, uploadImgIdx];
|
||||||
|
}
|
||||||
|
|
||||||
const baseUrl = $api.defaults.baseURL.replace(/api\/$/, '');
|
const baseUrl = $api.defaults.baseURL.replace(/api\/$/, '');
|
||||||
const fullImageUrl = `${baseUrl}${serverImageUrl.replace(/\\/g, '/')}`;
|
const fullImageUrl = `${baseUrl}${serverImageUrl.replace(/\\/g, '/')}`;
|
||||||
|
|
||||||
@ -216,4 +232,3 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@ -14,7 +14,6 @@
|
|||||||
:value="computedValue"
|
:value="computedValue"
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
:maxLength="maxlength"
|
:maxLength="maxlength"
|
||||||
:minLength="minlength"
|
|
||||||
:placeholder="title"
|
:placeholder="title"
|
||||||
@blur="$emit('blur')"
|
@blur="$emit('blur')"
|
||||||
/>
|
/>
|
||||||
@ -30,7 +29,6 @@
|
|||||||
:value="computedValue"
|
:value="computedValue"
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
:maxLength="maxlength"
|
:maxLength="maxlength"
|
||||||
:minLength="minlength"
|
|
||||||
:placeholder="title"
|
:placeholder="title"
|
||||||
@blur="$emit('blur')"
|
@blur="$emit('blur')"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -57,6 +57,7 @@
|
|||||||
v-if="contentLoaded"
|
v-if="contentLoaded"
|
||||||
@update:data="content = $event"
|
@update:data="content = $event"
|
||||||
@update:imageUrls="imageUrls = $event"
|
@update:imageUrls="imageUrls = $event"
|
||||||
|
@update:uploadedImgList="handleUpdateEditorImg"
|
||||||
:initialData="content"
|
:initialData="content"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@ -115,7 +116,7 @@
|
|||||||
const attachFilesAlert = ref(false);
|
const attachFilesAlert = ref(false);
|
||||||
const isFileValid = ref(true);
|
const isFileValid = ref(true);
|
||||||
const delFileIdx = ref([]); // 제외할 기존 첨부파일 ID
|
const delFileIdx = ref([]); // 제외할 기존 첨부파일 ID
|
||||||
const additionalFiles = ref([]); // 새로 추가할 첨부파일
|
const editorUploadedImgList = ref([]);
|
||||||
|
|
||||||
// 게시물 데이터 로드
|
// 게시물 데이터 로드
|
||||||
const fetchBoardDetails = async () => {
|
const fetchBoardDetails = async () => {
|
||||||
@ -145,6 +146,10 @@
|
|||||||
contentLoaded.value = true;
|
contentLoaded.value = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleUpdateEditorImg = item => {
|
||||||
|
editorUploadedImgList.value = item;
|
||||||
|
};
|
||||||
|
|
||||||
// 기존 첨부파일명을 노출
|
// 기존 첨부파일명을 노출
|
||||||
const addDisplayFileName = fileInfos =>
|
const addDisplayFileName = fileInfos =>
|
||||||
fileInfos.map(file => ({
|
fileInfos.map(file => ({
|
||||||
@ -247,6 +252,11 @@
|
|||||||
boardData.delFileIdx = [...delFileIdx.value];
|
boardData.delFileIdx = [...delFileIdx.value];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 에디터에 업로드 된 이미지 인덱스 목록
|
||||||
|
if (editorUploadedImgList.value && editorUploadedImgList.value.length > 0) {
|
||||||
|
boardData.editorUploadedImgList = [...editorUploadedImgList.value];
|
||||||
|
}
|
||||||
|
|
||||||
const fileArray = newFileFilter(attachFiles);
|
const fileArray = newFileFilter(attachFiles);
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
|
|
||||||
|
|||||||
@ -92,7 +92,7 @@
|
|||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<label class="col-md-2 col-form-label"> 내용 <span class="text-danger">*</span> </label>
|
<label class="col-md-2 col-form-label"> 내용 <span class="text-danger">*</span> </label>
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<QEditor @update:data="content = $event" />
|
<QEditor @update:data="content = $event" @update:uploadedImgList="handleUpdateEditorImg" />
|
||||||
</div>
|
</div>
|
||||||
<div class="invalid-feedback mt-1" :class="contentAlert ? 'd-block' : 'd-none'">내용을 입력해주세요.</div>
|
<div class="invalid-feedback mt-1" :class="contentAlert ? 'd-block' : 'd-none'">내용을 입력해주세요.</div>
|
||||||
</div>
|
</div>
|
||||||
@ -138,6 +138,7 @@
|
|||||||
const maxFiles = 5;
|
const maxFiles = 5;
|
||||||
const maxSize = 10 * 1024 * 1024;
|
const maxSize = 10 * 1024 * 1024;
|
||||||
const fileError = ref('');
|
const fileError = ref('');
|
||||||
|
const editorUploadedImgList = ref([]);
|
||||||
|
|
||||||
const fetchCategories = async () => {
|
const fetchCategories = async () => {
|
||||||
const response = await axios.get('board/categories');
|
const response = await axios.get('board/categories');
|
||||||
@ -154,6 +155,10 @@
|
|||||||
|
|
||||||
const fileCount = computed(() => attachFiles.value.length);
|
const fileCount = computed(() => attachFiles.value.length);
|
||||||
|
|
||||||
|
const handleUpdateEditorImg = item => {
|
||||||
|
editorUploadedImgList.value = item;
|
||||||
|
};
|
||||||
|
|
||||||
const handleFileUpload = files => {
|
const handleFileUpload = files => {
|
||||||
const validFiles = files.filter(file => file.size <= maxSize);
|
const validFiles = files.filter(file => file.size <= maxSize);
|
||||||
if (files.some(file => file.size > maxSize)) {
|
if (files.some(file => file.size > maxSize)) {
|
||||||
@ -236,6 +241,11 @@
|
|||||||
LOCBRDTYP: categoryValue.value,
|
LOCBRDTYP: categoryValue.value,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 에디터에 업로드 된 이미지 인덱스 목록
|
||||||
|
if (editorUploadedImgList.value && editorUploadedImgList.value.length > 0) {
|
||||||
|
boardData.editorUploadedImgList = [...editorUploadedImgList.value];
|
||||||
|
}
|
||||||
|
|
||||||
const { data: boardResponse } = await axios.post('board', boardData);
|
const { data: boardResponse } = await axios.post('board', boardData);
|
||||||
const boardId = boardResponse.data;
|
const boardId = boardResponse.data;
|
||||||
// 첨부파일 업로드 (비동기 병렬 처리)
|
// 첨부파일 업로드 (비동기 병렬 처리)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user