파일선택 > 삭제했다가 다시 파일선택시 안들어감

This commit is contained in:
nevermoregb 2025-03-28 18:48:23 +09:00
parent ad3af31e37
commit 8d1748548e
3 changed files with 36 additions and 19 deletions

View File

@ -3,7 +3,16 @@
<label :for="inputId" class="col-md-2 col-form-label">{{ title }}</label> <label :for="inputId" class="col-md-2 col-form-label">{{ title }}</label>
<div class="col-md-10"> <div class="col-md-10">
<label :for="inputId" class="btn btn-label-primary">파일 선택</label> <label :for="inputId" class="btn btn-label-primary">파일 선택</label>
<input class="form-control" type="file" style="display: none" :id="inputId" ref="fileInput" @change="changeHandler" multiple /> <input
class="form-control"
type="file"
style="display: none"
:id="inputId"
ref="fileInput"
:key="autoIncrement"
@change="changeHandler"
multiple
/>
<div v-if="showError" class="text-danger mt-1"> <div v-if="showError" class="text-danger mt-1">
{{ errorMessage }} {{ errorMessage }}
</div> </div>
@ -33,10 +42,14 @@
required: false, required: false,
}, },
}); });
//:key="autoIncrement" .
const inputId = computed(() => props.name || 'defaultFileInput'); const inputId = computed(() => props.name || 'defaultFileInput');
const emits = defineEmits(['update:data', 'update:isValid']); const emits = defineEmits(['update:data', 'update:isValid']);
const autoIncrement = ref(props.autoIncrement);
const MAX_TOTAL_SIZE = 5 * 1024 * 1024; // 5MB const MAX_TOTAL_SIZE = 5 * 1024 * 1024; // 5MB
const MAX_FILE_COUNT = 5; // const MAX_FILE_COUNT = 5; //
const ALLOWED_FILE_TYPES = []; // const ALLOWED_FILE_TYPES = []; //

View File

@ -25,6 +25,7 @@
title="첨부파일" title="첨부파일"
name="files" name="files"
:is-alert="attachFilesAlert" :is-alert="attachFilesAlert"
:key="autoIncrement"
@update:data="handleFileUpload" @update:data="handleFileUpload"
@update:isValid="isFileValid = $event" @update:isValid="isFileValid = $event"
/> />
@ -98,6 +99,7 @@
// //
const title = ref(''); const title = ref('');
const content = ref(''); const content = ref('');
const autoIncrement = ref(0);
// //
const titleAlert = ref(false); const titleAlert = ref(false);
@ -124,9 +126,8 @@
const originalPlainText = ref(''); const originalPlainText = ref('');
const originalFiles = ref([]); const originalFiles = ref([]);
function extractPlainText(delta) { function extractPlainText(delta) {
if (!delta || !Array.isArray(delta.ops)) return ''; if (!delta || !Array.isArray(delta.ops)) return '';
return delta.ops return delta.ops
.filter(op => typeof op.insert === 'string') .filter(op => typeof op.insert === 'string')
.map(op => op.insert.trim()) .map(op => op.insert.trim())
@ -142,21 +143,17 @@
const currentAttachedFiles = attachFiles.value.filter(f => f.id); const currentAttachedFiles = attachFiles.value.filter(f => f.id);
const isFilesChanged = const isFilesChanged =
attachFiles.value.some(f => !f.id) || // id attachFiles.value.some(f => !f.id) || // id
delFileIdx.value.length > 0 || // delFileIdx.value.length > 0 || //
!isSameFiles( !isSameFiles(
attachFiles.value.filter(f => f.id), // (id ) attachFiles.value.filter(f => f.id), // (id )
originalFiles.value originalFiles.value,
); );
console.log(isTitleChanged);
console.log(isContentChanged);
console.log(isFilesChanged);
return isTitleChanged || isContentChanged || isFilesChanged; return isTitleChanged || isContentChanged || isFilesChanged;
}); });
watch(isChanged, (val) => { watch(isChanged, val => {
console.log('🔄 isChanged changed:', val); console.log('🔄 isChanged changed:', val);
}); });
// //
function isSameFiles(current, original) { function isSameFiles(current, original) {
if (current.length !== original.length) return false; if (current.length !== original.length) return false;
@ -165,10 +162,7 @@
const sortedOriginal = [...original].sort((a, b) => a.id - b.id); const sortedOriginal = [...original].sort((a, b) => a.id - b.id);
return sortedCurrent.every((file, idx) => { return sortedCurrent.every((file, idx) => {
return ( return file.id === sortedOriginal[idx].id && file.name === sortedOriginal[idx].name;
file.id === sortedOriginal[idx].id &&
file.name === sortedOriginal[idx].name
);
}); });
} }
@ -203,11 +197,15 @@
contentLoaded.value = true; contentLoaded.value = true;
}; };
watch(content, (val) => { watch(
if (contentLoaded.value && !originalPlainText.value) { content,
originalPlainText.value = extractPlainText(val); val => {
} if (contentLoaded.value && !originalPlainText.value) {
}, { immediate: true }); originalPlainText.value = extractPlainText(val);
}
},
{ immediate: true },
);
const handleUpdateEditorImg = item => { const handleUpdateEditorImg = item => {
editorUploadedImgList.value = item; editorUploadedImgList.value = item;
@ -288,6 +286,7 @@
if (attachFiles.value.length <= maxFiles) { if (attachFiles.value.length <= maxFiles) {
fileError.value = ''; fileError.value = '';
} }
autoIncrement.value++;
}; };
watch(attachFiles, () => { watch(attachFiles, () => {

View File

@ -69,6 +69,7 @@
title="첨부파일" title="첨부파일"
name="files" name="files"
:is-alert="attachFilesAlert" :is-alert="attachFilesAlert"
:key="autoIncrement"
@update:data="handleFileUpload" @update:data="handleFileUpload"
@update:isValid="isFileValid = $event" @update:isValid="isFileValid = $event"
/> />
@ -154,6 +155,8 @@
} }
}; };
const autoIncrement = ref(0);
onMounted(() => { onMounted(() => {
fetchCategories(); fetchCategories();
}); });
@ -180,6 +183,7 @@
} }
fileError.value = ''; fileError.value = '';
attachFiles.value = [...attachFiles.value, ...validFiles].slice(0, maxFiles); attachFiles.value = [...attachFiles.value, ...validFiles].slice(0, maxFiles);
console.log('attachFiles.value: ', attachFiles.value);
}; };
const removeFile = index => { const removeFile = index => {
@ -187,6 +191,7 @@
if (attachFiles.value.length <= maxFiles) { if (attachFiles.value.length <= maxFiles) {
fileError.value = ''; fileError.value = '';
} }
autoIncrement.value++;
}; };
watch(attachFiles, () => { watch(attachFiles, () => {