diff --git a/docs/map.md b/docs/map.md index 8117f1b..a999127 100644 --- a/docs/map.md +++ b/docs/map.md @@ -32,6 +32,7 @@ | lib/admin-post-settings-section.js | 관리자 설정 POST 설정 필드 목록·기본 스냅샷·정규화·스냅샷 복사·변경 비교 helper | | lib/admin-spam-settings-section.js | 관리자 설정 스팸 필터 필드 목록·기본 스냅샷·정규화·textarea 변환·스냅샷 복사·변경 비교 helper | | lib/admin-brand-settings-section.js | 관리자 설정 브랜드 설정 필드 목록·기본 스냅샷·정규화·스냅샷 복사·변경 비교 helper | +| lib/admin-announcement-settings-section.js | 관리자 설정 어나운스 바 설정 필드 목록·기본 스냅샷·정규화·스냅샷 복사·변경 비교 helper | | lib/post-card-thumbnail-url.js | 게시물 카드 썸네일 `thumbs/*-card.webp`, Pages 커버 썸네일 `thumbs/*-page-cover.webp`, 본문 표시용 `body-1600`/`body-720`·라이트박스용 `body-2560` 파생 이미지 URL 판별과 레거시 `body`/`lightbox` 판별, 자동 생성 이미지 캐시 버전 URL 생성(대표 이미지·본문 이미지·갤러리·Pages 커버 선택 및 서버 검증 공용) | | lib/external-favicon-url.js | 외부 URL origin 기준 Google `gstatic.com/faviconV2` 파비콘 URL 생성(내부 경로는 빈 문자열) | | lib/navigation-url.js | 네비게이션 URL 접두사 분리·합성·정규화(`https://` 자동 보정, `/` 내부 경로) | diff --git a/docs/todo.md b/docs/todo.md index f8e2783..b607cec 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -4,7 +4,6 @@ - 거대 컴포넌트 책임 분리 진행. - `components/admin/AdminMarkdownEditor.vue`: 미디어 모달, 슬래시 명령, 히스토리·선택 복원, 라이브/소스 전환 로직을 단계적으로 composable 또는 하위 컴포넌트로 분리. - - `pages/admin/settings/index.vue`: 정규화가 필요한 설정 섹션(어나운스 바)의 편집 상태·스냅샷·저장 요청 로직을 composable 단위로 추가 분리. - `components/content/ContentMarkdownRenderer.vue`: 파싱·블록 렌더링·라이브 편집 중개·라이트박스·광고 삽입 책임을 분리. - `components/admin/AdminPostForm.vue`: 태그 입력, 대표 이미지 선택, 발행/초안 저장 상태, 우측 설정 패널 책임을 분리. - `pages/admin/media/index.vue`: 미디어 목록, 폴더 트리, 상세 모달, 재생성 액션을 작은 단위로 분리. diff --git a/docs/update.md b/docs/update.md index c142faa..c9e7269 100644 --- a/docs/update.md +++ b/docs/update.md @@ -1,5 +1,11 @@ # 업데이트 이력 +## v1.11.39 + +- 어나운스 바 설정 정규화·스냅샷 복사·변경 비교 로직을 `lib/admin-announcement-settings-section.js`로 분리. +- 설정 화면의 어나운스 바 편집 시작·취소·저장 로직을 공통 helper 기반으로 정리. +- 설정 저장 payload의 어나운스 바 설정 필드 정규화를 한 경로로 통합. + ## v1.11.38 - 브랜드 설정 정규화·스냅샷 복사·변경 비교 로직을 `lib/admin-brand-settings-section.js`로 분리. diff --git a/lib/admin-announcement-settings-section.js b/lib/admin-announcement-settings-section.js new file mode 100644 index 0000000..af55a01 --- /dev/null +++ b/lib/admin-announcement-settings-section.js @@ -0,0 +1,64 @@ +import { + DEFAULT_ANNOUNCEMENT_ALIGNMENT, + DEFAULT_ANNOUNCEMENT_BACKGROUND_COLOR, + normalizeAnnouncementAlignment, + normalizeAnnouncementBackgroundColor +} from './announcement-bar.js' + +export const ANNOUNCEMENT_SETTINGS_FIELDS = [ + 'announcementEnabled', + 'announcementText', + 'announcementUrl', + 'announcementBackgroundColor', + 'announcementAlignment' +] + +/** + * 어나운스 바 설정 기본 스냅샷을 만든다. + * @returns {Object} 기본 어나운스 바 설정 값 + */ +export const createDefaultAnnouncementSettingsSnapshot = () => ({ + announcementEnabled: false, + announcementText: '', + announcementUrl: '', + announcementBackgroundColor: DEFAULT_ANNOUNCEMENT_BACKGROUND_COLOR, + announcementAlignment: DEFAULT_ANNOUNCEMENT_ALIGNMENT +}) + +/** + * 어나운스 바 설정 값을 저장·비교 가능한 형태로 정규화한다. + * @param {Object} source - 원본 설정 값 + * @returns {Object} 정규화된 어나운스 바 설정 값 + */ +export const normalizeAnnouncementSettingsSection = (source = {}) => ({ + announcementEnabled: Boolean(source.announcementEnabled), + announcementText: source.announcementText || '', + announcementUrl: source.announcementUrl || '', + announcementBackgroundColor: normalizeAnnouncementBackgroundColor(source.announcementBackgroundColor || DEFAULT_ANNOUNCEMENT_BACKGROUND_COLOR), + announcementAlignment: normalizeAnnouncementAlignment(source.announcementAlignment || DEFAULT_ANNOUNCEMENT_ALIGNMENT) +}) + +/** + * 어나운스 바 설정 필드만 대상 객체에 복사한다. + * @param {Object} target - 값을 받을 객체 + * @param {Object} source - 값을 제공할 객체 + * @returns {void} + */ +export const assignAnnouncementSettingsSection = (target, source = {}) => { + const normalized = normalizeAnnouncementSettingsSection(source) + ANNOUNCEMENT_SETTINGS_FIELDS.forEach((field) => { + target[field] = normalized[field] + }) +} + +/** + * 두 어나운스 바 설정 값이 다른지 확인한다. + * @param {Object} current - 현재 설정 값 + * @param {Object} snapshot - 비교할 스냅샷 + * @returns {boolean} 변경 여부 + */ +export const hasAnnouncementSettingsSectionChanges = (current, snapshot) => { + const normalizedCurrent = normalizeAnnouncementSettingsSection(current) + const normalizedSnapshot = normalizeAnnouncementSettingsSection(snapshot) + return ANNOUNCEMENT_SETTINGS_FIELDS.some((field) => normalizedCurrent[field] !== normalizedSnapshot[field]) +} diff --git a/package-lock.json b/package-lock.json index 205c406..300daad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sori.studio", - "version": "1.11.38", + "version": "1.11.39", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sori.studio", - "version": "1.11.38", + "version": "1.11.39", "hasInstallScript": true, "dependencies": { "@nuxtjs/tailwindcss": "^6.14.0", diff --git a/package.json b/package.json index 2abaeb1..b04e667 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sori.studio", - "version": "1.11.38", + "version": "1.11.39", "private": true, "type": "module", "imports": { diff --git a/pages/admin/settings/index.vue b/pages/admin/settings/index.vue index 8d7e078..0384090 100644 --- a/pages/admin/settings/index.vue +++ b/pages/admin/settings/index.vue @@ -1,10 +1,4 @@