Skip to content

feat: 회의록페이지/ 위젯 db연동 - #61

Merged
Kwon812 merged 12 commits into
developfrom
feat/#58/workspace-meeting-notes-backend
Jul 16, 2026
Merged

feat: 회의록페이지/ 위젯 db연동#61
Kwon812 merged 12 commits into
developfrom
feat/#58/workspace-meeting-notes-backend

Conversation

@Kwon812

@Kwon812 Kwon812 commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Pull Request

작업 내용

  • 회의록(미팅노트) 도메인을 Supabase와 연동하고 CRUD를 구현했습니다. (조회 / 작성 / 수정 / 삭제)
  • 기존 mock + zustand 기반 회의록을 실제 DB 기반으로 전환하고, 회의록 테이블 RLS를 강화했습니다.
  • 작업 중 발견한 "닉네임 변경이 다른 화면에 즉시 반영되지 않는 문제"를 멤버 조회 하이브리드 전환으로 수정했습니다.

작업 결과

  • 회의록 목록 / 작성 / 수정 / 삭제가 모두 DB 기반으로 동작합니다.
  • 대시보드 "최근 회의록" 위젯이 DB와 연동됩니다.
  • 회의록 수정/삭제는 작성자 또는 워크스페이스 소유자만 가능합니다. (서버 액션 + RLS 이중 방어)
  • 프로필 탭에서 닉네임을 변경하면 멤버 목록 / 스프린트 / 워크스케줄 등 공유 캐시를 쓰는 화면에 즉시 반영됩니다.
  • 타입 체크(tsc --noEmit) / 린트(eslint) 통과.

변경 사항

Added

  • meeting-note 엔티티
  • model: db.types / mapper(row↔UI, 참석자·날짜 변환, 색상 파생) / schema(zod) / query-key
  • api: 목록 조회 getMeetingNotes, 단건 조회 getMeetingNote, createMeetingNote, updateMeetingNote, deleteMeetingNote, 권한 검증 공용 헬퍼 shared.ts
  • 회의록 수정 페이지/라우트: /workspaces/[workspaceId]/meeting-notes/[noteId]/edit
  • RLS 마이그레이션: 20260715000000_restrict_meeting_note_mutations.sql
  • 작성 시 author_id = auth.uid() 강제, 수정/삭제는 작성자·소유자만, 감사 필드(workspace_id/author_id/created_at) 불변 트리거
  • useWorkspaceMembersByWorkspaceId 훅에 선택적 initialData 지원 (하이브리드 전환 기반)

Changed

  • 회의록 목록 페이지: mock/zustand → RSC에서 getMeetingNotes로 DB 조회
  • 회의록 폼(MeetingNoteForm): 생성/수정 겸용화, 서버 액션 + useMutation 연동, 참석자는 userId만 저장
  • 회의록 카드(MeetingNoteCard): 권한이 있을 때만 노출되는 케밥(수정/삭제) 메뉴 추가
  • "최근 회의록" 위젯(RecentNotes): 클라이언트 React Query로 전환 (자료실 위젯과 동일 패턴)
  • 멤버를 RSC prop으로 받던 화면(설정 멤버 목록 / 스프린트 보드 / 워크스케줄)을 하이브리드로 전환 → workspaceMembersByWorkspaceQueryKey 공유 캐시로 통합
  • MemberProfileForm: 닉네임 저장을 useMutation으로 전환하고 onSuccess에서 멤버 캐시 무효화
  • 미사용 mock/zustand 제거: mock-meeting-notes-by-workspace.ts, use-meeting-notes-store.ts

Fixed

  • 프로필 탭에서 닉네임 변경 후 다른 탭/페이지에서 변경된 닉네임이 바로 반영되지 않던 문제
  • RecentNotes 위젯이 회의록이 없을 때 발생하던 크래시(빈 배열에서 latest.title 접근) 수정

실행화면

스크린샷 2026-07-15 오후 3 13 00

테스트

  • 로컬 실행 확인
  • 주요 시나리오 확인 (회의록 작성/수정/삭제, 권한별 메뉴 노출, 닉네임 변경 후 타 화면 반영)
  • 영향 범위 확인 (대시보드 위젯 / 스프린트 / 워크스케줄 / 설정)
  • 마이그레이션 적용 (supabase db push) 후 RLS·권한 동작 확인

리뷰 체크리스트

  • PR base branch가 올바릅니다. (feature/* -> develop, 배포 시 develop 또는 release/* -> main)
  • 브랜치명이 Type/#issue-number/description 형식을 따릅니다.
  • 커밋 메시지가 컨벤션을 따릅니다.
  • 불필요한 console.log, 주석, 임시 코드를 제거했습니다. (서버 액션의 console.error는 오류 로깅 목적)
  • 타입 에러와 린트 에러를 확인했습니다.
  • CodeRabbit 1차 리뷰를 확인했습니다.
  • CodeRabbit 리뷰 반영 후 Discord에 공유했습니다.
  • 최소 1명 이상의 approve 후 merge합니다.

리뷰 요청사항

  • 멤버 조회 하이브리드 전환 방식(RSC initialData 시드 + 클라이언트 useQuery 공유 캐시)이 적절한지 봐주세요.
  • 회의록 참석자 표시 이름이 조회 시 profiles.real_name(실명)으로 해석되는 반면, 회의록 폼의 참석자 드롭다운은 workspace_nickname(닉네임)을 사용합니다. 실명/닉네임 혼용을 통일할지 논의가 필요합니다. (이번 PR 범위에서는 제외)
  • RLS 정책 및 감사 필드 불변 트리거(restrict_meeting_note_mutations) 검토 부탁드립니다.

관련 이슈

Closes #58

Summary by CodeRabbit

  • 새 기능
    • 실제 회의록 조회/생성/수정/삭제가 지원됩니다.
    • 회의록 편집 페이지가 추가되고, 최근 회의록 위젯이 실데이터로 동작합니다.
    • 작성자 또는 워크스페이스 소유자에게 편집·삭제 메뉴가 노출됩니다.
    • 삭제 시 확인 절차를 추가했습니다.
  • 개선
    • 회의록 목록/대시보드가 저장·삭제 후 즉시 동기화됩니다.
    • 회의록 입력값 검증 및 권한 처리 규칙이 강화되었습니다.
    • 스프린트 보드와 근무 일정에서 멤버 데이터가 초기값 기반으로 더 안정적으로 반영됩니다.

@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Kwon812, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 35 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 6ff389f3-c61d-4027-8a31-266e90aabaed

📥 Commits

Reviewing files that changed from the base of the PR and between d10e95e and b43bcfc.

📒 Files selected for processing (2)
  • src/features/manage-member-profile/ui/MemberProfileForm.tsx
  • src/views/dashboard/config/widget-catalog.tsx
📝 Walkthrough

Walkthrough

회의록 기능이 mock 데이터와 로컬 스토어에서 Supabase 기반 조회·생성·수정·삭제 흐름으로 전환되었습니다. 입력 검증, 권한 정책, 편집 페이지, React Query 캐시와 최근 회의록 위젯이 추가되었습니다.

Changes

회의록 DB 계약과 서버 처리

Layer / File(s) Summary
회의록 계약과 매핑
src/entities/meeting-note/model/*, src/entities/meeting-note/index.ts
회의록 타입, 입력 스키마, DB 행 타입, 날짜·참석자 매퍼, Query 키와 공개 API export가 추가되었습니다.
회의록 조회와 변경 API
src/entities/meeting-note/api/*
목록·단건 조회와 생성·수정·삭제 API가 입력 검증, 프로필 결합, 권한 확인과 캐시 재검증을 수행합니다.
회의록 RLS와 불변 필드 보호
supabase/migrations/20260715000000_restrict_meeting_note_mutations.sql
회의록 접근 정책이 멤버 및 작성자·소유자 기준으로 재구성되고, 핵심 필드 변경을 차단하는 트리거가 추가되었습니다.

회의록 관리 UI

Layer / File(s) Summary
회의록 생성·수정·삭제 UI
src/views/meeting-notes/*, src/features/manage-meeting-notes/*, src/entities/meeting-note/ui/*, src/app/workspaces/.../meeting-notes/...
회의록 페이지가 DB 데이터를 렌더링하고, 폼은 생성·수정 mutation을 호출하며, 목록 카드에는 권한 기반 수정·삭제 메뉴가 표시됩니다.

공유 멤버 데이터와 위젯

Layer / File(s) Summary
멤버 초기 데이터와 캐시 연동
src/entities/workspace-member/*, src/features/manage-member-profile/*, src/features/manage-workspace-members/*, src/views/side-project/sprint-board/*, src/views/store-operation/work-schedule/*, src/app/workspaces/...
멤버 훅이 서버 초기 데이터를 React Query 캐시에 주입하고 관련 화면들이 공유 캐시를 사용합니다.
최근 회의록 위젯 조회
src/views/dashboard/config/widget-catalog.tsx, src/widgets/side-project/dashboard-recent-notes/*
최근 회의록 위젯이 workspaceId 기반으로 실제 회의록을 조회하고 로딩·오류·빈 상태를 렌더링합니다.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

  • TeampleRun/syncly#24: 기존 mock 회의록 UI와 스토어를 대체하는 변경과 직접 연결됩니다.
  • TeampleRun/syncly#18: 대시보드 위젯 및 최근 회의록 렌더링 경로와 관련됩니다.
  • TeampleRun/syncly#12: 워크스케줄 화면의 멤버 초기 데이터 흐름과 관련됩니다.

Suggested reviewers: jiwoonge

Sequence Diagram(s)

sequenceDiagram
  participant MeetingNotesPage
  participant getMeetingNotes
  participant Supabase
  participant MeetingNotesList
  MeetingNotesPage->>getMeetingNotes: workspaceId로 목록 조회
  getMeetingNotes->>Supabase: meeting_notes, workspace_members, profiles 조회
  Supabase-->>getMeetingNotes: 회의록과 viewer 데이터
  getMeetingNotes-->>MeetingNotesPage: MeetingNoteBoardData
  MeetingNotesPage->>MeetingNotesList: meetingNotes와 viewer 전달
Loading
sequenceDiagram
  participant MeetingNotesList
  participant deleteMeetingNote
  participant Supabase
  MeetingNotesList->>deleteMeetingNote: 삭제 요청
  deleteMeetingNote->>Supabase: 권한 확인 및 회의록 삭제
  Supabase-->>deleteMeetingNote: 삭제 결과
  deleteMeetingNote-->>MeetingNotesList: 성공 또는 실패 응답
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 16.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 회의록 페이지와 위젯의 DB 연동이라는 핵심 변경을 짧고 명확하게 요약합니다.
Description check ✅ Passed 템플릿의 필수 섹션을 대부분 갖추고 있으며 작업 내용, 결과, 테스트, 이슈까지 구체적으로 작성됐습니다.
Linked Issues check ✅ Passed 직접 이슈 #58의 요구인 회의록 페이지/위젯 DB 연동을 구현했고, 제공된 범위와도 일치합니다.
Out of Scope Changes check ✅ Passed 멤버 캐시 하이브리드 전환과 권한/RLS 보강도 PR 목적에 포함된 개선으로 보이며 명백한 이탈 변경은 없습니다.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/#58/workspace-meeting-notes-backend

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.

@Kwon812 Kwon812 changed the title Feat/#58/workspace meeting notes backend feat: 회의록페이지/ 위젯 db연동 Jul 15, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 5

🤖 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 `@src/entities/meeting-note/api/get-meeting-notes.ts`:
- Around line 24-28: Update the meeting-notes query in the getMeetingNotes flow
to avoid fetching the entire workspace history on every list request. Add an
initial result limit using the existing query builder, while preserving the
workspace filter, selected fields, and descending meeting_at order so the newest
notes are returned first.
- Line 15: Update the workspaceIdSchema definition to use Zod’s strict UUID
validator z.uuid() instead of the more permissive z.guid(), ensuring workspace
IDs are validated as RFC-compliant UUIDs before database queries.

In `@src/entities/meeting-note/api/update-meeting-note.ts`:
- Around line 36-53: Update src/entities/meeting-note/api/update-meeting-note.ts
lines 36-53 in updateMeetingNote to select the affected id with maybeSingle()
after the update and treat missing data as failure; apply the same change to
src/entities/meeting-note/api/delete-meeting-note.ts lines 31-40 in
deleteMeetingNote after the delete. Preserve the existing error response for
database errors and return failure whenever no row was actually affected.

In `@src/entities/meeting-note/ui/MeetingNoteCard.tsx`:
- Around line 78-124: Update the card’s handleKeyDown handler to return when
event.target differs from event.currentTarget, so keyboard events from the menu,
edit, and delete controls do not toggle the card. Keep the existing onClick
guard and Enter/Space activation behavior unchanged.

In `@src/widgets/side-project/dashboard-recent-notes/ui/RecentNotes.tsx`:
- Around line 7-22: Move the static header definition into the RecentNotes
component so it can access workspaceId, import and use useRouter, and connect
the WidgetCardAction in the header to navigate to the workspace’s meeting-notes
list page when clicked. Preserve the existing title and header layout.
🪄 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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 8269e46a-ed03-4aaa-a96a-d83d4da92fa6

📥 Commits

Reviewing files that changed from the base of the PR and between 7e0a3b9 and 34d5660.

📒 Files selected for processing (32)
  • src/app/workspaces/[workspaceId]/meeting-notes/[noteId]/edit/page.tsx
  • src/app/workspaces/[workspaceId]/sprint-board/page.tsx
  • src/app/workspaces/[workspaceId]/work-schedule/page.tsx
  • src/entities/meeting-note/api/create-meeting-note.ts
  • src/entities/meeting-note/api/delete-meeting-note.ts
  • src/entities/meeting-note/api/get-meeting-note.ts
  • src/entities/meeting-note/api/get-meeting-notes.ts
  • src/entities/meeting-note/api/shared.ts
  • src/entities/meeting-note/api/update-meeting-note.ts
  • src/entities/meeting-note/index.ts
  • src/entities/meeting-note/model/meeting-note-query.ts
  • src/entities/meeting-note/model/meeting-note.db.types.ts
  • src/entities/meeting-note/model/meeting-note.mapper.ts
  • src/entities/meeting-note/model/meeting-note.schema.ts
  • src/entities/meeting-note/model/meeting-note.types.ts
  • src/entities/meeting-note/model/mock-meeting-notes-by-workspace.ts
  • src/entities/meeting-note/ui/MeetingNoteCard.tsx
  • src/entities/workspace-member/api/use-workspace-members-by-id.ts
  • src/features/manage-meeting-notes/index.ts
  • src/features/manage-meeting-notes/model/use-meeting-notes-store.ts
  • src/features/manage-meeting-notes/ui/MeetingNoteForm.tsx
  • src/features/manage-meeting-notes/ui/MeetingNotesList.tsx
  • src/features/manage-member-profile/ui/MemberProfileForm.tsx
  • src/features/manage-workspace-members/model/use-member-management.ts
  • src/views/dashboard/config/widget-catalog.tsx
  • src/views/meeting-notes/index.ts
  • src/views/meeting-notes/ui/EditMeetingNotePage.tsx
  • src/views/meeting-notes/ui/MeetingNotesPage.tsx
  • src/views/side-project/sprint-board/ui/SprintBoardView.tsx
  • src/views/store-operation/work-schedule/ui/WorkScheduleView.tsx
  • src/widgets/side-project/dashboard-recent-notes/ui/RecentNotes.tsx
  • supabase/migrations/20260715000000_restrict_meeting_note_mutations.sql
💤 Files with no reviewable changes (3)
  • src/entities/meeting-note/model/mock-meeting-notes-by-workspace.ts
  • src/features/manage-meeting-notes/index.ts
  • src/features/manage-meeting-notes/model/use-meeting-notes-store.ts

} from '../model/meeting-note.mapper';
import type { MeetingNoteBoardData } from '../model/meeting-note.types';

const workspaceIdSchema = z.guid();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

엄격한 UUID 검증이 필요하면 z.uuid()를 사용하세요.

z.guid()는 Zod 4에서 "UUID-like"한 값을 허용하는 더 관대한 검증기입니다. workspaceId가 Postgres UUID 기본키라면 z.uuid()(RFC 표준 준수)를 사용하는 것이 더 명확한 입력 오류를 제공합니다. 현재는 형식이 다소 어긋난 값도 통과해 Supabase 쿼리 단계에서 원시 Postgrest 오류로 이어질 수 있습니다.

♻️ 제안
-const workspaceIdSchema = z.guid();
+const workspaceIdSchema = z.uuid();

Also applies to: 18-18

🤖 Prompt for 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.

In `@src/entities/meeting-note/api/get-meeting-notes.ts` at line 15, Update the
workspaceIdSchema definition to use Zod’s strict UUID validator z.uuid() instead
of the more permissive z.guid(), ensuring workspace IDs are validated as
RFC-compliant UUIDs before database queries.

Comment on lines +24 to +28
supabase
.from('meeting_notes')
.select(MEETING_NOTE_SELECT_QUERY)
.eq('workspace_id', parsedWorkspaceId)
.order('meeting_at', { ascending: false }),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🚀 Performance & Scalability | 🔵 Trivial

페이지네이션 없이 워크스페이스 전체 회의록을 매번 조회합니다.

현재는 meeting_at 내림차순으로 전체 행을 가져옵니다. 워크스페이스가 오래될수록 목록 페이지 방문마다 전체 회의록 이력을 로드하게 되어 I/O 비용이 커질 수 있습니다. 초기 규모에서는 문제가 없지만, 추후 커서 기반 페이지네이션이나 limit을 고려해두면 좋습니다.

🤖 Prompt for 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.

In `@src/entities/meeting-note/api/get-meeting-notes.ts` around lines 24 - 28,
Update the meeting-notes query in the getMeetingNotes flow to avoid fetching the
entire workspace history on every list request. Add an initial result limit
using the existing query builder, while preserving the workspace filter,
selected fields, and descending meeting_at order so the newest notes are
returned first.

Comment on lines +36 to +53
const { error } = await authorized.context.supabase
.from('meeting_notes')
.update(
toMeetingNoteUpdate({
title: value.title,
meetingDate: value.meetingDate,
participantIds: value.participantIds,
decisions: value.decisions,
followUpActions: value.followUpActions,
}),
)
.eq('id', value.meetingNoteId)
.eq('workspace_id', value.workspaceId);

if (error) {
console.error('[meeting-note/updateMeetingNote] 수정 실패:', error);
return { ok: false, message: '회의록 수정에 실패했습니다. 잠시 후 다시 시도해주세요.' };
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

update/delete 서버 액션이 실제 반영 행 수를 확인하지 않아 거짓 성공을 반환할 수 있습니다.

두 파일 모두 authorizeMeetingNoteMutation으로 권한을 먼저 확인한 뒤 .update()/.delete()를 호출하지만 .select()가 없어, 매칭되는 행이 0개여도(권한 확인과 쓰기 사이의 레이스, 동시 삭제 등으로 RLS가 조용히 막는 경우) error가 발생하지 않고 { ok: true }가 반환됩니다. 근본 원인은 두 곳 모두 동일하게 결과 확인 없이 성공을 가정하는 것입니다.

  • src/entities/meeting-note/api/update-meeting-note.ts#L36-L53: .update(...).eq(...).eq(...).select('id').maybeSingle()을 추가하고, data가 없으면 실패로 처리하세요.
  • src/entities/meeting-note/api/delete-meeting-note.ts#L31-L40: .delete().eq(...).eq(...).select('id').maybeSingle()을 추가하고, data가 없으면 실패로 처리하세요.
📍 Affects 2 files
  • src/entities/meeting-note/api/update-meeting-note.ts#L36-L53 (this comment)
  • src/entities/meeting-note/api/delete-meeting-note.ts#L31-L40
🤖 Prompt for 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.

In `@src/entities/meeting-note/api/update-meeting-note.ts` around lines 36 - 53,
Update src/entities/meeting-note/api/update-meeting-note.ts lines 36-53 in
updateMeetingNote to select the affected id with maybeSingle() after the update
and treat missing data as failure; apply the same change to
src/entities/meeting-note/api/delete-meeting-note.ts lines 31-40 in
deleteMeetingNote after the delete. Preserve the existing error response for
database errors and return failure whenever no row was actually affected.

Comment thread src/entities/meeting-note/ui/MeetingNoteCard.tsx
Comment thread src/widgets/side-project/dashboard-recent-notes/ui/RecentNotes.tsx

@seongjinss555 seongjinss555 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

리뷰 반영해주세요~ 고생하셨습니다

@vercel

vercel Bot commented Jul 16, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
syncly Error Error Jul 16, 2026 3:02am
syncly-3ewg Error Error Jul 16, 2026 3:02am

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/entities/meeting-note/ui/MeetingNoteCard.tsx (1)

52-60: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

role="button" 컨테이너 안에 native <button>을 중첩하지 마세요.
메뉴·수정·삭제 버튼이 자손으로 들어가면 보조공학에서 인터랙션이 불안정하게 처리될 수 있습니다. 카드 토글 영역과 관리 버튼을 분리해 형제 구조로 바꾸세요.

🤖 Prompt for 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.

In `@src/entities/meeting-note/ui/MeetingNoteCard.tsx` around lines 52 - 60,
MeetingNoteCard의 role="button" 카드 토글 영역 안에 관리용 native button이 중첩되지 않도록 구조를
변경하세요. 카드 토글 컨테이너와 메뉴·수정·삭제 버튼 영역을 형제 요소로 분리하고, 카드의
onClick·onKeyDown·aria-expanded 동작은 토글 영역에만 유지하세요.
🤖 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.

Outside diff comments:
In `@src/entities/meeting-note/ui/MeetingNoteCard.tsx`:
- Around line 52-60: MeetingNoteCard의 role="button" 카드 토글 영역 안에 관리용 native
button이 중첩되지 않도록 구조를 변경하세요. 카드 토글 컨테이너와 메뉴·수정·삭제 버튼 영역을 형제 요소로 분리하고, 카드의
onClick·onKeyDown·aria-expanded 동작은 토글 영역에만 유지하세요.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: ff54a0b7-e59b-41e7-b9e6-688307844076

📥 Commits

Reviewing files that changed from the base of the PR and between 34d5660 and d10e95e.

📒 Files selected for processing (2)
  • src/entities/meeting-note/ui/MeetingNoteCard.tsx
  • src/widgets/side-project/dashboard-recent-notes/ui/RecentNotes.tsx

@Kwon812
Kwon812 merged commit a37c1d2 into develop Jul 16, 2026
2 of 4 checks passed
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.

feat: 회의록 페이지/ 위젯 db연동

2 participants