에디터 미디어 빈 상태 문구 계산 분리
This commit is contained in:
@@ -22,6 +22,7 @@ import {
|
||||
getEditorHistoryEntryValue
|
||||
} from '../../lib/markdown-editor-history.js'
|
||||
import {
|
||||
buildMediaPickerEmptyMessage,
|
||||
buildMediaPickerUploadHint,
|
||||
buildMediaPickerPageItems,
|
||||
buildMediaPickerRangeLabel,
|
||||
@@ -3366,6 +3367,12 @@ const mediaPickerUploadHint = computed(() => buildMediaPickerUploadHint(
|
||||
uploadSizeLimits.value
|
||||
))
|
||||
|
||||
/**
|
||||
* 미디어 라이브러리 빈 상태 문구를 반환한다.
|
||||
* @returns {string} 빈 상태 문구
|
||||
*/
|
||||
const mediaPickerEmptyMessage = computed(() => buildMediaPickerEmptyMessage(mediaSearchQuery.value))
|
||||
|
||||
/**
|
||||
* 붙여넣은 이미지 파일을 업로드한다.
|
||||
* @param {ClipboardEvent} event - 붙여넣기 이벤트
|
||||
@@ -3702,12 +3709,7 @@ const handleKeydown = (event) => {
|
||||
</button>
|
||||
</div>
|
||||
<div v-else class="admin-markdown-editor__media-empty py-12 text-center text-sm text-[#8e9cac]">
|
||||
<template v-if="mediaSearchQuery.trim()">
|
||||
「{{ mediaSearchQuery.trim() }}」에 맞는 미디어가 없습니다.
|
||||
</template>
|
||||
<template v-else>
|
||||
선택할 미디어가 없습니다. 업로드 탭에서 파일을 추가할 수 있습니다.
|
||||
</template>
|
||||
{{ mediaPickerEmptyMessage }}
|
||||
</div>
|
||||
</template>
|
||||
<div
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
| lib/navigation-editor-tree.js | 관리자 메뉴 UI·서버 `renumberSortOrderByTree`가 쓰는 `buildNavigationEditorTree`, 관리자 상단 네비 평면 표용 `flattenNavigationEditorWrappers` |
|
||||
| lib/markdown-content-normalizer.js | 관리자 Markdown-first 전환 후 레거시 블록 배열·객체 본문 값을 저장용 마크다운 문자열로 변환 |
|
||||
| lib/markdown-editor-history.js | 관리자 Markdown-first 에디터 undo/redo 히스토리 항목 생성, 레거시 문자열 항목 본문 추출, 선택 범위 보정 |
|
||||
| lib/markdown-editor-media.js | 관리자 Markdown-first 에디터 미디어 선택 모달의 미디어 종류 판별, 대상별 선택 가능 여부, 미리보기 URL, 업로드 MIME 허용, 선택 대상별 제목·accept·API kind·업로드 안내, 선택 순서·토글·항목 해석, 업로드 오류·한도 검증, 페이지 상태·범위·페이지 번호 계산, fenced 미디어 블록 생성 |
|
||||
| lib/markdown-editor-media.js | 관리자 Markdown-first 에디터 미디어 선택 모달의 미디어 종류 판별, 대상별 선택 가능 여부, 미리보기 URL, 업로드 MIME 허용, 선택 대상별 제목·accept·API kind·업로드 안내, 라이브러리 빈 상태 문구, 선택 순서·토글·항목 해석, 업로드 오류·한도 검증, 페이지 상태·범위·페이지 번호 계산, fenced 미디어 블록 생성 |
|
||||
| lib/markdown-block-parser.js | 공개 Markdown 본문 문자열을 제목·문단·이미지·갤러리·fenced 블록·인용·목록·코드·표 렌더링 블록으로 변환 |
|
||||
| lib/markdown-block-context.js | 관리자 Markdown textarea·라이브 편집 포커스 위치 기준 이미지·갤러리·링크·iframe·HTML·인용·콜아웃·코드·토글 블록 설정 패널 대상 판별, 인용 옵션 공통 파서 연결, 코드 fenced 블록 여닫는 펜스 쌍 판별 |
|
||||
| lib/markdown-iframe-embed.js | 게시물 본문 iframe 블록의 코드 판별과 안전 속성 추출, `allowfullscreen`을 `allow=fullscreen` 권한으로 정규화 |
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
# 업데이트 이력
|
||||
|
||||
## v1.11.76
|
||||
|
||||
- 관리자 Markdown 에디터 미디어 선택 라이브러리의 빈 상태 문구 계산을 공통 helper로 분리.
|
||||
- 미디어 선택 빈 상태 문구 단위 테스트 추가.
|
||||
|
||||
## v1.11.75
|
||||
|
||||
- 관리자 Markdown 에디터 미디어 선택 대상별 모달 제목 계산을 공통 helper로 분리.
|
||||
|
||||
@@ -226,6 +226,21 @@ export const buildMediaPickerUploadHint = (target, uploadSizeLimits) => {
|
||||
return `단일 이미지가 본문에 삽입됩니다. (최대 ${formatUploadSizeLimit(uploadSizeLimits.image)})`
|
||||
}
|
||||
|
||||
/**
|
||||
* 미디어 선택 라이브러리 빈 상태 문구를 만든다.
|
||||
* @param {string} searchQuery - 검색어
|
||||
* @returns {string} 빈 상태 문구
|
||||
*/
|
||||
export const buildMediaPickerEmptyMessage = (searchQuery) => {
|
||||
const normalizedQuery = String(searchQuery || '').trim()
|
||||
|
||||
if (normalizedQuery) {
|
||||
return `「${normalizedQuery}」에 맞는 미디어가 없습니다.`
|
||||
}
|
||||
|
||||
return '선택할 미디어가 없습니다. 업로드 탭에서 파일을 추가할 수 있습니다.'
|
||||
}
|
||||
|
||||
/**
|
||||
* 미디어 항목으로 Prose 미디어 블록을 만든다.
|
||||
* @param {'video'|'audio'|'file'} blockType - 블록 유형
|
||||
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "sori.studio",
|
||||
"version": "1.11.75",
|
||||
"version": "1.11.76",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "sori.studio",
|
||||
"version": "1.11.75",
|
||||
"version": "1.11.76",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"@nuxtjs/tailwindcss": "^6.14.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "sori.studio",
|
||||
"version": "1.11.75",
|
||||
"version": "1.11.76",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"imports": {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import assert from 'node:assert/strict'
|
||||
import test from 'node:test'
|
||||
import {
|
||||
buildMediaPickerEmptyMessage,
|
||||
buildMediaPickerPageItems,
|
||||
buildMediaPickerRangeLabel,
|
||||
buildMediaPickerUploadHint,
|
||||
@@ -107,6 +108,11 @@ test('미디어 선택 대상별 갤러리 여부와 업로드 안내 문구를
|
||||
assert.equal(buildMediaPickerUploadHint('image', uploadSizeLimits), '단일 이미지가 본문에 삽입됩니다. (최대 10MB)')
|
||||
})
|
||||
|
||||
test('미디어 선택 라이브러리 빈 상태 문구를 계산한다', () => {
|
||||
assert.equal(buildMediaPickerEmptyMessage(''), '선택할 미디어가 없습니다. 업로드 탭에서 파일을 추가할 수 있습니다.')
|
||||
assert.equal(buildMediaPickerEmptyMessage(' car '), '「car」에 맞는 미디어가 없습니다.')
|
||||
})
|
||||
|
||||
test('미디어 항목으로 fenced 미디어 블록을 만든다', () => {
|
||||
assert.deepEqual(createMediaBlockMarkdown('video', {
|
||||
url: '/uploads/a.mp4',
|
||||
|
||||
Reference in New Issue
Block a user