From 1ef50c111b0a5445a47302e9d87ffb7d4d0219cf Mon Sep 17 00:00:00 2001 From: zenn Date: Thu, 7 May 2026 10:36:01 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=EA=B8=80?= =?UTF-8?q?=EC=93=B0=EA=B8=B0=20=ED=99=94=EB=A9=B4=EA=B3=BC=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C=20=ED=99=98=EA=B2=BD=20=EB=AC=B8=EC=84=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/admin/AdminBlockEditor.vue | 2 +- components/admin/AdminPostForm.vue | 189 ++++++++++++++++---------- docs/deploy.md | 101 +++++++++++++- docs/history.md | 8 ++ docs/map.md | 8 +- docs/spec.md | 7 +- docs/todo.md | 2 - docs/update.md | 27 ++++ package-lock.json | 4 +- package.json | 2 +- pages/admin/posts/[id].vue | 16 +-- pages/admin/posts/new.vue | 12 +- scripts/dev-server.js | 13 +- 13 files changed, 276 insertions(+), 115 deletions(-) diff --git a/components/admin/AdminBlockEditor.vue b/components/admin/AdminBlockEditor.vue index b203dad..50527c8 100644 --- a/components/admin/AdminBlockEditor.vue +++ b/components/admin/AdminBlockEditor.vue @@ -1247,7 +1247,7 @@ onBeforeUnmount(() => { :class="getBlockClass(block)" contenteditable="true" spellcheck="true" - :data-placeholder="index === 0 ? '본문을 입력하거나 / 를 눌러 블록을 선택하세요' : '/ 를 눌러 블록 선택'" + :data-placeholder="index === 0 ? '본문을 입력하세요...' : '/ 를 눌러 블록 선택'" :data-show-placeholder="shouldShowPlaceholder(block, index)" @focus="activateBlock(block)" @input="updateBlockText($event, index)" diff --git a/components/admin/AdminPostForm.vue b/components/admin/AdminPostForm.vue index 54410b2..650e6f7 100644 --- a/components/admin/AdminPostForm.vue +++ b/components/admin/AdminPostForm.vue @@ -29,6 +29,7 @@ const autosaveTimer = ref(null) const autosaveNotice = ref(null) const autosaveStatus = ref('') const isRestoringAutosave = ref(false) +const isSettingsOpen = ref(true) /** * ISO 날짜를 datetime-local 입력값으로 변환 @@ -136,6 +137,22 @@ const isScheduledPost = () => { return form.status === 'published' && Boolean(publishedAt) && new Date(publishedAt) > new Date() } +const editorStatusLabel = computed(() => { + if (autosaveStatus.value) { + return autosaveStatus.value + } + + if (form.status === 'published') { + return isScheduledPost() ? '예약 발행' : '발행됨' + } + + if (form.status === 'private') { + return '비공개' + } + + return '초안' +}) + /** * 게시물 입력값 생성 * @returns {Object} 게시물 입력값 @@ -422,6 +439,14 @@ const previewPost = () => { emit('preview', createPostPayload()) } +/** + * 설정 패널 표시 상태 전환 + * @returns {void} + */ +const toggleSettingsPanel = () => { + isSettingsOpen.value = !isSettingsOpen.value +} + watch(form, scheduleAutosave, { deep: true }) onMounted(() => { @@ -455,12 +480,79 @@ defineExpose({