에디터 미디어 선택 대상 계산 분리

This commit is contained in:
2026-07-24 18:18:12 +09:00
parent 408d4aa420
commit fe1a390699
7 changed files with 127 additions and 52 deletions

View File

@@ -22,14 +22,18 @@ import {
getEditorHistoryEntryValue
} from '../../lib/markdown-editor-history.js'
import {
buildMediaPickerUploadHint,
buildMediaPickerPageItems,
buildMediaPickerRangeLabel,
createMediaBlockMarkdown,
createDefaultMediaPickerPagination,
findUploadSizeLimitError,
getMediaPickerAcceptForTarget,
getMediaPickerKindForTarget,
getGallerySelectionOrder as getGallerySelectionOrderFromSelection,
getMediaItemKind,
getMediaPickerPreviewUrl,
isGalleryMediaPickerTarget,
isMediaItemSelectableForTarget,
isUploadFileAllowedForMediaTarget,
normalizeMediaPickerResponse,
@@ -54,7 +58,6 @@ import {
buildDefaultUploadSizeLimits,
DEFAULT_UPLOAD_MAX_FILE_COUNT,
DEFAULT_UPLOAD_MAX_TOTAL_SIZE,
formatUploadSizeLimit,
normalizeUploadMaxFileCount,
normalizeUploadMaxTotalSize
} from '../../lib/upload-size-limit.js'
@@ -164,33 +167,9 @@ const editorRedoStack = ref([])
const isRestoringEditorHistory = ref(false)
/** 마지막 히스토리 기록 시각 */
let lastEditorHistoryRecordAt = 0
const mediaPickerAccept = computed(() => {
if (['image', 'gallery', 'active-gallery'].includes(mediaPickerTarget.value)) {
return 'image/*'
}
const mediaPickerAccept = computed(() => getMediaPickerAcceptForTarget(mediaPickerTarget.value))
if (mediaPickerTarget.value === 'video') {
return 'video/*'
}
if (mediaPickerTarget.value === 'audio') {
return 'audio/*'
}
return '.pdf,.zip,.txt,.csv,.docx,.xlsx,.pptx'
})
const mediaPickerKind = computed(() => {
if (['image', 'gallery', 'active-gallery'].includes(mediaPickerTarget.value)) {
return 'image'
}
if (['video', 'audio', 'file'].includes(mediaPickerTarget.value)) {
return mediaPickerTarget.value
}
return 'all'
})
const mediaPickerKind = computed(() => getMediaPickerKindForTarget(mediaPickerTarget.value))
/** 작성 textarea 최소 높이(px) */
const MIN_TEXTAREA_HEIGHT_PX = 620
@@ -3393,32 +3372,16 @@ const mediaPickerTitle = computed(() => {
* 미디어 모달에서 다중 선택 여부를 반환한다.
* @returns {boolean} 다중 선택 여부
*/
const isGalleryMediaPicker = computed(() => mediaPickerTarget.value === 'gallery'
|| mediaPickerTarget.value === 'active-gallery')
const isGalleryMediaPicker = computed(() => isGalleryMediaPickerTarget(mediaPickerTarget.value))
/**
* 미디어 업로드 안내 문구를 반환한다.
* @returns {string} 안내 문구
*/
const mediaPickerUploadHint = computed(() => {
if (isGalleryMediaPicker.value) {
return `여러 이미지를 한 번에 선택할 수 있습니다. (최대 ${formatUploadSizeLimit(uploadSizeLimits.value.image)})`
}
if (mediaPickerTarget.value === 'video') {
return `MP4, WebM, MOV 비디오를 업로드할 수 있습니다. (최대 ${formatUploadSizeLimit(uploadSizeLimits.value.video)})`
}
if (mediaPickerTarget.value === 'audio') {
return `MP3, WAV, OGG, M4A 오디오를 업로드할 수 있습니다. (최대 ${formatUploadSizeLimit(uploadSizeLimits.value.audio)})`
}
if (mediaPickerTarget.value === 'file') {
return `PDF, ZIP, 문서 파일을 업로드할 수 있습니다. (최대 ${formatUploadSizeLimit(uploadSizeLimits.value.document)})`
}
return `단일 이미지가 본문에 삽입됩니다. (최대 ${formatUploadSizeLimit(uploadSizeLimits.value.image)})`
})
const mediaPickerUploadHint = computed(() => buildMediaPickerUploadHint(
mediaPickerTarget.value,
uploadSizeLimits.value
))
/**
* 붙여넣은 이미지 파일을 업로드한다.