This commit is contained in:
nevermoregb 2025-03-28 13:21:59 +09:00
commit 2baebdf1e9

View File

@ -70,7 +70,7 @@
<button type="button" class="btn btn-info right" @click="goBack"> <button type="button" class="btn btn-info right" @click="goBack">
<i class="bx bx-left-arrow-alt"></i> <i class="bx bx-left-arrow-alt"></i>
</button> </button>
<button type="button" class="btn btn-primary ms-1" @click="updateBoard"> <button type="button" class="btn btn-primary ms-1" :disabled="!isChanged" @click="updateBoard">
<i class="bx bx-check"></i> <i class="bx bx-check"></i>
</button> </button>
</div> </div>
@ -120,6 +120,58 @@
const editorUploadedImgList = ref([]); const editorUploadedImgList = ref([]);
const editorDeleteImgList = ref([]); const editorDeleteImgList = ref([]);
const originalTitle = ref('');
const originalPlainText = ref('');
const originalFiles = ref([]);
function extractPlainText(delta) {
if (!delta || !Array.isArray(delta.ops)) return '';
return delta.ops
.filter(op => typeof op.insert === 'string')
.map(op => op.insert.trim())
.join(' ')
.trim();
}
const isChanged = computed(() => {
const isTitleChanged = title.value !== originalTitle.value;
const currentPlainText = extractPlainText(content.value);
const isContentChanged = currentPlainText !== originalPlainText.value;
const currentAttachedFiles = attachFiles.value.filter(f => f.id);
const isFilesChanged =
attachFiles.value.some(f => !f.id) || // id
delFileIdx.value.length > 0 || //
!isSameFiles(
attachFiles.value.filter(f => f.id), // (id )
originalFiles.value
);
console.log(isTitleChanged);
console.log(isContentChanged);
console.log(isFilesChanged);
return isTitleChanged || isContentChanged || isFilesChanged;
});
watch(isChanged, (val) => {
console.log('🔄 isChanged changed:', val);
});
//
function isSameFiles(current, original) {
if (current.length !== original.length) return false;
const sortedCurrent = [...current].sort((a, b) => a.id - b.id);
const sortedOriginal = [...original].sort((a, b) => a.id - b.id);
return sortedCurrent.every((file, idx) => {
return (
file.id === sortedOriginal[idx].id &&
file.name === sortedOriginal[idx].name
);
});
}
// //
const fetchBoardDetails = async () => { const fetchBoardDetails = async () => {
// //
@ -139,15 +191,24 @@
const boardData = data.data; const boardData = data.data;
// //
if (boardData.hasAttachment && boardData.attachments.length > 0) { if (boardData.hasAttachment && boardData.attachments.length > 0) {
attachFiles.value = addDisplayFileName([...boardData.attachments]); const formatted = addDisplayFileName([...boardData.attachments]);
attachFiles.value = formatted;
originalFiles.value = formatted;
} }
// //
title.value = boardData.title || '제목 없음'; title.value = boardData.title || '제목 없음';
content.value = boardData.content || '내용 없음'; content.value = boardData.content || '내용 없음';
originalTitle.value = title.value;
contentLoaded.value = true; contentLoaded.value = true;
}; };
watch(content, (val) => {
if (contentLoaded.value && !originalPlainText.value) {
originalPlainText.value = extractPlainText(val);
}
}, { immediate: true });
const handleUpdateEditorImg = item => { const handleUpdateEditorImg = item => {
editorUploadedImgList.value = item; editorUploadedImgList.value = item;
}; };