Skip to content

feat(web): 대시보드와 보관함의 확정 스케줄 달력 가독성 개선 - #104

Merged
ehlung merged 5 commits into
developfrom
feature/schedule-calendar-readability
Jun 30, 2026
Merged

feat(web): 대시보드와 보관함의 확정 스케줄 달력 가독성 개선#104
ehlung merged 5 commits into
developfrom
feature/schedule-calendar-readability

Conversation

@meteorqz6

@meteorqz6 meteorqz6 commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

개요

대시보드와 보관함의 확정 스케줄 달력 가독성을 개선하고, 조직 운영 시간 입력을 30분 단위 선택 UI로 변경합니다.


변경 사항

  • 확정 스케줄 달력을 시간대별 그룹 표시와 날짜 클릭 상세 모달로 공통화
  • 대시보드/보관함 섹션명을 최근 확정 스케줄, 확정 스케줄 기록으로 정리
  • 조직 생성/수정의 요일별 운영 시간 입력을 30분 단위 선택 컴포넌트로 변경
  • 일부 저장 버튼 문구를 저장으로 간결화

변경 유형

  • feat — 새로운 기능

영향 범위

  • webapps/web

테스트 방법

  1. corepack pnpm --filter @fragment/web lint
  2. corepack pnpm --filter @fragment/web typecheck
  3. corepack pnpm --filter @fragment/web test

체크리스트

  • CI (테스트 + 린트) 통과 확인
  • 상태 분류 규칙(서버/전역/로컬/폼 상태) 준수
  • 에러 처리 및 Fallback UI 확인 (해당 없음)
  • API 명세 업데이트 (API 변경 없음)
  • 공유 타입·스키마(packages/shared) 업데이트 (타입 변경 없음)

리뷰 포인트

  • 확정 스케줄 달력의 시간대별 그룹 표시와 날짜 클릭 상세 모달 UX
  • 조직 운영 시간 입력을 30분 단위 선택 UI로 바꾼 흐름

Summary by CodeRabbit

  • New Features

    • 확정 스케줄을 주간 달력 형태로 제공하고, 날짜 선택 시 상세를 팝업으로 확인할 수 있습니다(더보기 포함).
    • 스케줄 기록/대시보드에서 “최근 확정 스케줄” 중심으로 달력·요약 영역을 정리했습니다.
    • 스케줄 페이지에서 미충족 조건과 근무 일정이 날짜·시간대별 카드로 더 보기 쉽게 재구성되었습니다.
    • 조직 운영 시간을 선택형(30분 단위)으로 입력할 수 있습니다.
  • Bug Fixes

    • 저장 버튼 문구가 간결하게 정리되었습니다.
    • 운영 시간의 30분 경계 밖 값은 유효성 오류로 거부됩니다.

@vercel

vercel Bot commented Jun 29, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
final-project-web Ready Ready Preview, Comment Jun 30, 2026 6:48am

@coderabbitai

coderabbitai Bot commented Jun 29, 2026

Copy link
Copy Markdown

Review Change Stack

Walkthrough

공유 확정 스케줄 캘린더를 추가하고, 대시보드·히스토리·스케줄 페이지의 일정 표시를 그룹형 UI로 바꿨다. 조직 폼은 운영 시간 입력을 Select로 전환했고, 조직 생성 검증과 저장 버튼 문구를 정리했다.

Changes

확정 스케줄 표시 재구성

Layer / File(s) Summary
ConfirmedScheduleCalendar 신규 구현
apps/web/src/features/schedules/components/confirmed-schedule-calendar.tsx
ConfirmedScheduleCalendarItem 타입, 주간 날짜 계산, (startTime, endTime) 기준 그룹화, 달력 셀 미리보기, 선택 날짜 Dialog 렌더링이 추가됐다.
대시보드와 히스토리 캘린더 교체
apps/web/src/features/dashboard/components/mvp-dashboard-page.tsx, apps/web/src/features/schedule-history/components/mvp-schedule-history-page.tsx
수동 달력 계산과 그리드를 제거하고 ConfirmedScheduleCalendar로 교체했다. 확정 스케줄 개수 표시와 관련 헤더 문구도 함께 정리됐다.
스케줄 페이지 그룹형 표시로 전환
apps/web/src/features/schedules/components/mvp-schedules-page.tsx
시간대 그룹, 날짜별 미충족 그룹, 상세 토글, 카드형 사이드 패널, 후보 배지 정리가 추가됐고 캘린더 셀과 미충족 조건 표시가 그룹 단위로 바뀌었다.

조직 운영 시간 입력 및 문구 정리

Layer / File(s) Summary
운영 시간 입력을 Select로 전환
apps/web/src/features/organization/components/organization-form.tsx
Controller를 추가하고 30분 단위 시간 옵션을 도입했으며, 요일별 openTime/closeTime 입력을 Select로 교체했다. 조직 정보 헤더 블록도 제거됐다.
조직 검증과 저장 라벨 정리
apps/api/test/organization.routes.test.ts, apps/web/src/features/availability/components/mvp-availability-page.tsx, apps/web/src/features/organization/components/mvp-organization-edit-page.tsx
조직 생성 API에 30분 경계 검증 테스트가 추가됐고, 조직 편집과 가용성 페이지의 저장 버튼 문구가 모두 "저장"으로 바뀌었다.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.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
Description check ✅ Passed 개요, 변경 사항, 유형, 영향 범위, 테스트 방법, 체크리스트, 리뷰 포인트가 포함돼 템플릿을 대부분 충족합니다.
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.
Title check ✅ Passed 제목이 대시보드/보관함의 확정 스케줄 달력 가독성 개선이라는 주요 변경을 정확히 요약합니다.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/schedule-calendar-readability

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.

@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: 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 `@apps/web/src/features/organization/components/organization-form.tsx`:
- Around line 34-48: TIME_OPTIONS is fixed to 30-minute slots, so existing saved
times like 09:15 cannot be rendered or re-saved in the organization form. Update
organization-form.tsx around TIME_OPTIONS and the SelectItem usage so the
current value is always included even if it is not on the 30-minute grid, or
else align the shared/API schema and validation to enforce 30-minute increments
everywhere. Make sure the form round-trips existing values in the organization
form component without breaking editability.

In
`@apps/web/src/features/schedule-history/components/mvp-schedule-history-page.tsx`:
- Around line 256-260: The `ConfirmedScheduleCalendar` instance in
`MvpScheduleHistoryPage` keeps its internal `selectedDate` state when
`selectedHistory` changes, so switching history can leave the detail modal open
or show stale selection data. Update the `ConfirmedScheduleCalendar` usage to
reset its identity when the history changes by adding a `key` derived from
`selectedHistory.id`, so the component remounts and clears its internal state on
each history switch.

In `@apps/web/src/features/schedules/components/confirmed-schedule-calendar.tsx`:
- Line 200: The span in confirmed-schedule-calendar uses an arbitrary Tailwind
typography value (`text-[11px]`) that violates the token-based styling
guideline; update the relevant JSX in the calendar component to use the default
scale (`text-xs`) instead, or if this exact size is reused elsewhere, promote it
to a shared token in globals.css and reference that token consistently.
🪄 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: 6e010e4a-3abc-4130-8d08-395e1486d2a0

📥 Commits

Reviewing files that changed from the base of the PR and between f591396 and 5565caa.

📒 Files selected for processing (6)
  • apps/web/src/features/availability/components/mvp-availability-page.tsx
  • apps/web/src/features/dashboard/components/mvp-dashboard-page.tsx
  • apps/web/src/features/organization/components/mvp-organization-edit-page.tsx
  • apps/web/src/features/organization/components/organization-form.tsx
  • apps/web/src/features/schedule-history/components/mvp-schedule-history-page.tsx
  • apps/web/src/features/schedules/components/confirmed-schedule-calendar.tsx

Comment on lines +34 to +48
const TIME_OPTION_STEP_MINUTES = 30;
const MINUTES_IN_DAY = 24 * 60;

const TIME_OPTIONS = Array.from(
{ length: MINUTES_IN_DAY / TIME_OPTION_STEP_MINUTES },
(_, index) => {
const minutes = index * TIME_OPTION_STEP_MINUTES;
const hour = Math.floor(minutes / 60);
const minute = minutes % 60;
const value = `${String(hour).padStart(2, "0")}:${String(minute).padStart(2, "0")}`;

return { label: value, value };
},
);

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

기존 저장 운영 시간이 편집 불가능해질 수 있습니다.

Line 37의 TIME_OPTIONS가 30분 단위로만 고정되면서, 기존 input[type="time"]나 API를 통해 저장된 09:15 같은 값은 수정 화면에서 SelectItem으로 표현되지 않습니다. 이 PR은 shared/API 스키마를 바꾸지 않았기 때문에, 현재는 합법적인 저장값을 웹 폼이 round-trip 하지 못하는 상태입니다.

최소한 기존 값이 옵션에 없으면 임시로 주입해서 표시·재저장 가능하게 하거나, 30분 제한을 도입하려면 shared schema/API validation/backfill까지 같이 맞춰야 합니다.

가능한 국소 수정 예시
 const TIME_OPTIONS = Array.from(
   { length: MINUTES_IN_DAY / TIME_OPTION_STEP_MINUTES },
   (_, index) => {
     const minutes = index * TIME_OPTION_STEP_MINUTES;
     const hour = Math.floor(minutes / 60);
     const minute = minutes % 60;
     const value = `${String(hour).padStart(2, "0")}:${String(minute).padStart(2, "0")}`;

     return { label: value, value };
   },
 );
+
+function getTimeOptions(currentValue?: string | null) {
+  if (!currentValue || TIME_OPTIONS.some((option) => option.value === currentValue)) {
+    return TIME_OPTIONS;
+  }
+
+  return [...TIME_OPTIONS, { label: currentValue, value: currentValue }].sort((a, b) =>
+    a.value.localeCompare(b.value),
+  );
+}
- {TIME_OPTIONS.map((option) => (
+ {getTimeOptions(field.value).map((option) => (
     <SelectItem key={option.value} value={option.value}>
       {option.label}
     </SelectItem>
   ))}

As per path instructions, "SPEC의 입력 검증(필수값, 이메일 형식, 비밀번호 확인, 날짜 범위, 시작/종료 시간, 1명 이상/1 이상의 숫자)을 UI와 schema가 함께 처리하는지 확인".

Also applies to: 221-263

🤖 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 `@apps/web/src/features/organization/components/organization-form.tsx` around
lines 34 - 48, TIME_OPTIONS is fixed to 30-minute slots, so existing saved times
like 09:15 cannot be rendered or re-saved in the organization form. Update
organization-form.tsx around TIME_OPTIONS and the SelectItem usage so the
current value is always included even if it is not on the 30-minute grid, or
else align the shared/API schema and validation to enforce 30-minute increments
everywhere. Make sure the form round-trips existing values in the organization
form component without breaking editability.

Source: Path instructions

Comment thread apps/web/src/features/schedule-history/components/mvp-schedule-history-page.tsx Outdated
Comment thread apps/web/src/features/schedules/components/confirmed-schedule-calendar.tsx Outdated

@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: 2

🤖 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 `@apps/web/src/features/schedules/components/mvp-schedules-page.tsx`:
- Around line 1091-1095: The worker preview text in mvp-schedules-page should
stop using the arbitrary `text-[11px]` Tailwind value and switch to the closest
default scale token instead. Update the `getWorkerNamesPreview` label span in
the schedules page so it uses a standard typography utility consistent with the
rest of the file’s Tailwind token rules, avoiding file-local pixel sizing.
- Around line 615-617: The selected-date detail list is re-filtering the
original unfilledConditions array, so it can lose the timeRange ordering already
applied in groupUnfilledConditionsByDate(). Update mvp-schedules-page.tsx to
reuse the grouped/sorted data for selectedDateUnfilledConditions instead of
filtering the raw list, using the existing groupUnfilledConditionsByDate logic
and the selectedDate branch so the summary and detail panels stay in the same
order.
🪄 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: 943960d8-9147-4d90-aef6-623939e2e4b8

📥 Commits

Reviewing files that changed from the base of the PR and between 5565caa and 0c39c11.

📒 Files selected for processing (4)
  • apps/api/test/organization.routes.test.ts
  • apps/web/src/features/schedule-history/components/mvp-schedule-history-page.tsx
  • apps/web/src/features/schedules/components/confirmed-schedule-calendar.tsx
  • apps/web/src/features/schedules/components/mvp-schedules-page.tsx

Comment thread apps/web/src/features/schedules/components/mvp-schedules-page.tsx Outdated
Comment thread apps/web/src/features/schedules/components/mvp-schedules-page.tsx
@meteorqz6 meteorqz6 changed the title feat(web): improve schedule calendar readability feat(web): 대시보드와 보관함의 확정 스케줄 달력 가독성 개선 Jun 30, 2026
@ehlung
ehlung merged commit 8edc214 into develop Jun 30, 2026
4 checks passed
@ehlung
ehlung deleted the feature/schedule-calendar-readability branch June 30, 2026 07:23
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