썸네일 미참조 삭제 허용·원본명 업로드·미디어 검색 정리(v0.0.91)

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-05-12 10:52:57 +09:00
parent 21024602b0
commit 16bb9370fa
10 changed files with 150 additions and 55 deletions

View File

@@ -133,15 +133,9 @@ const filteredMediaItems = computed(() => {
? true
: (!folder || item.category === folder || item.category?.startsWith(`${folder}/`))
const usageTitles = item.usage?.map((usage) => usage.title) || []
const ownerFields = item.avatarOwner
? [item.avatarOwner.username, item.avatarOwner.email, item.avatarOwner.lastSeenIp]
: []
const matchesQuery = !query || [
item.name,
item.url,
item.category,
...usageTitles,
...ownerFields
...usageTitles
].some((value) => String(value || '').toLowerCase().includes(query))
return matchesFolder && matchesQuery
@@ -467,7 +461,7 @@ const renameMedia = async () => {
const editingItem = mediaItems.value.find((item) => item.url === editingUrl.value)
if (editingItem && isMediaItemLocked(editingItem)) {
errorMessage.value = '사용 중이거나 회원 썸네일인 미디어는 파일명을 변경할 수 없습니다.'
errorMessage.value = '게시물·페이지에서 쓰이거나, 회원 프로필에 연결된 썸네일은 파일명을 바꿀 수 없습니다.'
return
}
@@ -496,7 +490,7 @@ const renameMedia = async () => {
*/
const deleteMedia = async (item) => {
if (isMediaItemLocked(item)) {
errorMessage.value = '사용 중이거나 회원 썸네일인 미디어는 삭제할 수 없습니다.'
errorMessage.value = '게시물·페이지에서 쓰이거나, 회원 프로필에 연결된 썸네일은 삭제할 수 없습니다.'
return
}
@@ -558,7 +552,7 @@ const deleteMedia = async (item) => {
v-model="searchText"
class="admin-media__search w-full rounded border border-line bg-white px-3 py-2 text-sm md:w-72"
type="search"
:placeholder="activeTab === 'thumbnails' ? '닉네임, 이메일, IP, 파일명 검색' : '파일명, 경로, 폴더, 사용처 검색'"
:placeholder="activeTab === 'thumbnails' ? '파일명, 게시물 제목(사용처) 검색' : '파일명, 게시물 제목(사용처) 검색'"
>
</div>
</div>
@@ -641,7 +635,7 @@ const deleteMedia = async (item) => {
<span>{{ thumbnailMediaItems.length }}</span>
</button>
<p class="admin-media__thumb-hint mt-4 text-xs leading-relaxed text-muted">
회원 프로필에서 저장된 이미지만 표시됩니다. 파일 삭제·이름 변경은 이 화면에서 할 수 없으며, 회원이 프로필에서 바꾸면 갱신됩니다.
회원 프로필에서 쓰는 이미지는 연결 회원이 있을 때만 삭제·이름 변경이 막힙니다. 프로필에서 바꾸거나 해제된 파일은 이 목록에 남으며, 관리자가 직접 정리할 수 있습니다.
</p>
</aside>
@@ -804,10 +798,6 @@ const deleteMedia = async (item) => {
<dt class="admin-media__info-label text-xs font-semibold text-muted">용량</dt>
<dd class="admin-media__info-value mt-1">{{ formatFileSize(selectedMedia.size) }}</dd>
</div>
<div class="admin-media__info-row">
<dt class="admin-media__info-label text-xs font-semibold text-muted">폴더</dt>
<dd class="admin-media__info-value mt-1 break-all">{{ selectedMedia.category }}</dd>
</div>
</dl>
<div class="admin-media__category grid gap-2">
@@ -903,7 +893,7 @@ const deleteMedia = async (item) => {
@keydown.enter.prevent="renameMedia"
>
<p v-if="isMediaItemLocked(selectedMedia)" class="admin-media__locked text-xs text-muted">
사용 중이거나 회원 썸네일인 미디어는 파일명 변경과 삭제가 잠겨 있습니다.
게시물·페이지에서 사용 중이거나, 회원 프로필에 연결된 썸네일은 파일명 변경과 삭제가 잠깁니다.
</p>
</div>