style: #49 대시보드 화면 구현 - #51
Conversation
|
전체적인 화면 구성과 다만 현재 context 구조 중 백엔드에서 계산 기준이 불명확하거나, 현재 데이터 모델로는 정확히 만들기 어려운 값이 있어 머지 전에 아래 사항을 먼저 정리해야 할 것 같습니다. 1. 과목별
|
|
꼼꼼한 리뷰 감사합니다. 지적하신 내용 전부 반영해서 커밋 올렸습니다. 1. 과목별 Fit Bar 제거했습니다 2. 진행률은 완료 환산 기준으로 가겠습니다 3. has_plan 분기 추가했습니다
버튼 문구와 링크는 4. need_label_pct 분리했습니다 5. group_id 추가했습니다 6. '나중에' 버튼 제거했습니다 7. 색상 토큰화했습니다 값 정의
마지막에 말씀하신 단순화 방향 반영해서 전체적으로 가볍게 정리했습니다. |
|
바뀐 context 'has_plan': bool, 'overall': { 'subject_summary': [{ 'pending_recovery': {'group_id': ..., 'created_at': date}, |
|
수정사항 확인했습니다. 기존 리뷰에서 요청드린 아래 항목은 실제 코드에 반영된 것을 확인했습니다.
전체적으로 처음보다 context 구조가 훨씬 단순해졌고, View 연결도 가능한 방향으로 정리됐습니다. 다만 아래 사항은 추가 수정이 필요합니다. 1.
|
|
2/3/4번, 그리고 1번 라벨 변경은 확인했습니다. 다만 1번에 새로 추가된 부제 문구에서 하나만 짚고 넘어가면 좋을 것 같아요 !! 1.
|
|
2차 리뷰에서 요청드린 아래 사항은 반영된 것을 확인했습니다.
다만 현재 # 위험
required_max_minutes - available_minutes
# 불가능
required_min_minutes - available_minutes따라서 불가능 상태의 대시보드에서는 가능 상태 도달 기준을 별도 값으로 전달하는 것이 명확해 보입니다. max_shortage_minutes = max(
0,
max_minutes - available_minutes,
)
daily_extra_minutes = (
math.ceil(max_shortage_minutes / remaining_days)
if max_shortage_minutes > 0 and remaining_days > 0
else None
)context도 기존 'max_shortage_minutes': int,
'daily_extra_minutes': int | None,화면 문구 역시 같은 기준으로 아래처럼 통일하는 편이 좋겠습니다.
이 계산 기준과 context 이름까지 반영되면 PR #51은 머지해도 될 것 같습니다. |
fe18de9 to
3307aee
Compare
|
#49 dashboard.html이 기대하는 context 구조 (3차 리뷰 반영 후 최신) 최상위
overall (dict)
subject_summary (list of dict)
progress (dict)
참고: shortage_minutes(상태별 기준, calculate_feasibility() 원본 값)와 |
작업 내용
공통 토큰(#40) 위에 FE2 첫 화면인 대시보드를 구현했습니다.
planner 전용 CSS와 재사용 컴포넌트도 함께 만들었습니다.
추가한 파일
static/css/planner.css— 레이아웃, 버튼, 카드, 태그, 배지, Fit Bar, 빈 화면static/js/planner.js— 사이드바 접기templates/includes/icons.html— Lucide 아이콘 17개planner/templates/planner/dashboard.html— 기본 / 시험기간 없음 / 복구안 대기planner/templates/planner/includes/— sidebar, fit_bar, empty_state주요 결정 사항
검은 세로선(가능시간)이 띠(필요시간)보다 오른쪽이면 가능, 띠 안이면 위험, 왼쪽이면 불가능입니다.
전체 판정과 과목 카드에서 같은 컴포넌트를 재사용합니다.
empty_state.html하나를 문구만 바꿔 재사용합니다.{% url %}태그는 아직 URL이 없어href="#"+ TODO 주석으로 두었습니다.이번 PR 범위 밖
task_row.html— 대시보드에서 쓰지 않아 오늘의 공부 이슈로 넘겼습니다View에서 넘겨주셔야 하는 context
{ # 없으면 온보딩 화면이 뜹니다 'exam_period': { 'title': str, 'start_date': date, 'end_date': date, 'progress_percent': int, # 사이드바 진행 막대 }, 'today': date, # "10월 14일 수요일" 'remaining_days': int, 'today_minutes': int, 'today_count': int, # 사이드바 메뉴 옆 숫자 'pending_recovery': { # 없으면 배너 미표시 'created_at': date, }, 'overall': { 'status': 'ok|warn|bad', 'status_label': '가능|위험|불가능', 'min_pct': int, 'band_pct': int, 'mark_pct': int, # Fit Bar 좌표(%) 'min_minutes': int, 'max_minutes': int, 'available_minutes': int, 'axis_max': int, 'shortage_minutes': int, # 0이면 부족 없음으로 표시 'daily_extra_minutes': int, # 없으면 안내문 생략 'calculated_at': datetime, }, 'subject_status': [{ 'subject_name': str, 'exam_date': date, 'd_day': int, 'status': 'ok|warn|bad', 'status_label': str, 'min_pct': int, 'band_pct': int, 'mark_pct': int, 'min_minutes': int, 'max_minutes': int, 'available_minutes': int, }], 'subject_axis_max': int, # 과목 카드 공통 축 'progress': { 'today_percent': int, 'today_done_minutes': int, 'today_total_minutes': int, 'total_percent': int, 'total_done_minutes': int, 'total_minutes': int, 'core_left': int, 'core_by_subject': [{'name': str, 'count': int}], }, }Fit Bar 좌표 계산 (참고)
과목 카드는 세 과목 중 가장 큰 값으로
axis를 하나 잡고,세 카드의
_pct를 전부 그 값으로 계산해 주셔야 비교가 됩니다.화면 확인 방법
planner/urls.py에 아래를 임시로 추가하면/planner/dashboard/에서 볼 수 있습니다.(이번 PR에는 포함하지 않았습니다)
context가 없으므로 "시험기간 없음" 화면이 표시됩니다.
전체 화면은 view가 나온 뒤 확인 가능합니다.
확인 부탁드립니다
화면
반응형
코드
var(--neutral11)형태로만 썼는지context
Closes #49