Skip to content

[refactor] 개발자 포털 백오피스 UI 개선#1587

Open
Zepelown wants to merge 3 commits into
develop/befrom
refactor/#1586-admin-MOA-895
Open

[refactor] 개발자 포털 백오피스 UI 개선#1587
Zepelown wants to merge 3 commits into
develop/befrom
refactor/#1586-admin-MOA-895

Conversation

@Zepelown
Copy link
Copy Markdown
Member

@Zepelown Zepelown commented May 19, 2026

#️⃣연관된 이슈

#1586, MOA-895

📝작업 내용

  • 개발자 포털 로그인 화면을 별도 풀페이지 로그인 카드로 분리했습니다.
  • 로그인 후에는 좌측 사이드바와 상단 작업 헤더를 가진 백오피스형 레이아웃으로 전환되도록 개선했습니다.
  • 사이드바 메뉴 클릭 시 전체 섹션을 한 페이지에 펼치지 않고, 선택한 메뉴 섹션만 페이지처럼 표시하도록 변경했습니다.
  • 홍보게시판 장소 검색 영역에서 장소 후보 목록이 좁게 보이던 문제를 개선했습니다.
    • 홍보게시판 목록/편집 영역을 세로 배치로 바꿔 편집 영역 폭을 확보했습니다.
    • 장소 검색 결과 카드 폭, 높이, 여백을 키우고 좁은 화면에서는 지도와 결과 목록이 세로로 쌓이도록 했습니다.
  • 홍보게시판 이미지 업로드 input에서 여러 이미지를 선택할 수 있게 하고, 기존 단건 업로드 API를 순차 호출해 다중 업로드를 지원했습니다.
  • 동아리 관리/단어사전 목록의 ID 칸에 복사 버튼을 추가해 복사 가능 여부를 명확히 했습니다.

중점적으로 리뷰받고 싶은 부분(선택)

  • 정적 HTML 기반 개발자 포털에서 별도 라이브러리 없이 CSS/JS만으로 백오피스형 레이아웃을 구성한 방향이 적절한지 봐주세요.
  • 홍보 이미지 다중 업로드를 백엔드 API 변경 없이 프론트 순차 업로드로 처리한 방식이 운영 도구 관점에서 충분한지 확인 부탁드립니다.

논의하고 싶은 부분(선택)

  • 향후 업로드 파일 수가 많아질 경우 multipart files[] 기반 배치 업로드 API를 별도로 추가할지 논의가 필요합니다.

🫡 참고사항

  • 검증: node --checkindex.html 내부 script 문법 확인
  • 검증: git diff --check
  • 미추적 파일 backend/.gradle-user-home/는 커밋에 포함하지 않았습니다.

Summary by CodeRabbit

  • New Features

    • 포털 앱이 사이드바와 상단바 기반 구조로 재구성되었습니다.
    • 다중 파일 업로드 기능이 추가되었습니다.
    • ID 복사 전용 버튼이 추가되었습니다.
  • Refactor

    • 섹션이 URL hash와 로그인 상태에 따라 동적으로 전환됩니다.
    • 업로드 진행률 표시 및 부분 성공 처리 로직이 개선되었습니다.
  • Style

    • 레이아웃 및 반응형 CSS가 조정되었습니다.

Review Change Stack

@vercel
Copy link
Copy Markdown

vercel Bot commented May 19, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
moadong Ready Ready Preview, Comment May 19, 2026 2:49pm

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 19, 2026

Warning

Rate limit exceeded

@Zepelown has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 19 minutes and 23 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 029b86f1-f527-428f-bb0b-f766c55a5289

📥 Commits

Reviewing files that changed from the base of the PR and between d5beeeb and eb38165.

📒 Files selected for processing (1)
  • backend/src/main/resources/static/dev/index.html

Warning

.coderabbit.yaml has a parsing error

The CodeRabbit configuration file in this repository has a parsing error and default settings were used instead. Please fix the error(s) in the configuration file. You can initialize chat with CodeRabbit to get help with the configuration file.

💥 Parsing errors (1)
Validation error: Invalid regex pattern for base branch. Received: "**" at "reviews.auto_review.base_branches[0]"
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Walkthrough

포털 개발자 도구의 UI를 사이드바+상단바 기반 앱 셸로 재구성하고, 활성 섹션을 URL hash에 따라 동적으로 관리하도록 변경했습니다. 클럽/단어사전 목록의 ID 복사 기능을 행 클릭에서 분리한 버튼으로 제공하고, 프로모션 이미지 업로드를 다중 파일 지원 및 부분 실패 처리로 개선했습니다.

Changes

포털 UI 및 기능 재구성

레이어 / 파일(s) 요약
CSS 레이아웃 및 앱 셸 마크업
backend/src/main/resources/static/dev/index.html (lines 9–58, 113–117, 147, 183–190, 202–227, 242–288, 636–638)
CSS 변수, 앱 셸 그리드 레이아웃, 사이드바/상단바 스타일, ID 복사 버튼 스타일, 프로모션 지도/검색 결과 카드 스타일, 반응형 미디어 쿼리, 새로운 HTML 마크업 구조를 통합하여 전체 시각적 기반을 재구성.
동적 섹션 관리 및 라우팅
backend/src/main/resources/static/dev/index.html (lines 649, 699–763, 796, 838–844)
PORTAL_SECTION_IDS 상수, getActivePortalSectionId(), loadActivePortalSectionData(), showActivePortalSection(), updateActiveNav() 함수를 추가하여 URL hash 기반 활성 섹션 판별, 데이터 로드, hashchange 이벤트 처리, 로그인/로그아웃 통합을 구현.
ID 복사 기능 분리
backend/src/main/resources/static/dev/index.html (lines 856–860, 869–885, 975–991)
copyTextToClipboard() 헬퍼를 추가하고, 클럽 및 단어사전 목록에서 ID 셀 렌더링을 변경하여 행 클릭과 분리된 "ID 복사" 아이콘 버튼 제공.
프로모션 다중 이미지 업로드
backend/src/main/resources/static/dev/index.html (lines 477–479, 2466–2472, 2518–2561, 2573–2578)
파일 입력을 multiple 속성으로 확장하고, 업로드 진행 상태 표시, 파일별 루프 처리, 부분 실패 처리, 성공 카운트 토스트, 최종 버튼 라벨 복원을 구현.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Suggested labels

🔨 Refactor, 💻 FE

Suggested reviewers

  • oesnuj
  • seongwon030
  • suhyun113
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목은 '개발자 포털 백오피스 UI 개선'으로, 실제 변경 사항인 사이드바 기반 레이아웃 구조화, 섹션 동적 전환, 홍보게시판 다중 이미지 업로드, ID 복사 버튼 추가 등의 핵심 변경을 정확히 요약하고 있습니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/#1586-admin-MOA-895

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 19, 2026

Test Results

123 tests   123 ✅  21s ⏱️
 29 suites    0 💤
 29 files      0 ❌

Results for commit eb38165.

♻️ This comment has been updated with latest results.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@backend/src/main/resources/static/dev/index.html`:
- Around line 756-759: The code is calling showActivePortalSection() twice (once
indirectly via showLogin(true) and again immediately after), causing duplicate
list loads and flicker; remove the redundant showActivePortalSection() call and
instead call only the Kakao map initializer (or a small helper, e.g.,
initKakaoMap()) conditionally if the second call exists solely to initialize the
map, or move/guard the map init inside showActivePortalSection() so it only runs
once; apply the same fix pattern to the other duplicate blocks that mirror this
behavior (the other occurrences noted in the review).
- Around line 2518-2527: The partial-upload failure branch in
handlePartialUploadFailure currently only sets a banner and skips updating local
UI, so ensure that even if reloadPromotionList({ selectedArticleId:
targetArticleId, keepMessage: true }) fails you still apply the
already-uploadedUrls to the local state used by the textarea/preview; after
computing syncMessage, call the local updater that populates the
preview/textarea (e.g., the component/state setter that renders uploaded images
— replace with your actual setter such as setPromotionImages/updatePreviewState)
with uploadedUrls before calling setPromotionBanner, so the UI reflects
server-side uploads even when sync fails.
- Around line 856-858: The copyTextToClipboard function currently calls
navigator.clipboard.writeText() without awaiting it; update the function
(copyTextToClipboard) to await the Promise returned by
navigator.clipboard.writeText(text || '') and add a try/catch around that await
so you only call showToast(message || '복사됨', 'success') on successful completion
and call showToast with an error message (e.g., '복사 실패') in the catch block;
this prevents unhandled rejections and ensures the toast reflects the actual
result.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ce0bf80f-b372-42e2-a6a8-ff44cb2e5383

📥 Commits

Reviewing files that changed from the base of the PR and between 70a81e4 and d5beeeb.

📒 Files selected for processing (1)
  • backend/src/main/resources/static/dev/index.html

Comment thread backend/src/main/resources/static/dev/index.html
Comment thread backend/src/main/resources/static/dev/index.html
Comment thread backend/src/main/resources/static/dev/index.html
Copy link
Copy Markdown
Member

@seongwon030 seongwon030 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

개발자페이지 개선 굳굳

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants