Commit Graph
68 Commits
Author SHA1 Message Date
sihooandClaude Sonnet 5 a3894cc878 스마트기기 반출 대장: 전체 학생 허용 + 많은 시간요청 학생 검토 기능 추가
- "전체 학생 허용" 아이콘을 새로고침 버튼 옆에 추가 - 대기 중인 요청을
  한 명씩 승인하는 대신 확인 팝업 후 한 번에 전부 승인
- "많은 시간요청 학생" 아이콘 추가 - 학생이 시간을 비정상적으로 길게
  적어낼 수 있으니, 2시간 이상 신청한 대기 중인 요청만 따로 모아 보여줌
  (해당 건수를 빨간 배지로 표시). 목록에서 바로 승인/거절 가능
- 컨트롤러에 durationHours/longPendingRequests/approveAllPending 추가.
  일괄 승인은 서버에 batch API가 없어서 대기 요청마다 순서대로
  승인 요청을 보내고 마지막에 한 번만 새로고침

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 19:58:34 +09:00
sihooandClaude Sonnet 5 ce77c32026 페이지를 화면에 position: fixed로 고정해서 스크롤/바운스 자체를 없앰
배경색을 맞추는 대신, html/body를 position: fixed + overflow: hidden +
overscroll-behavior: none으로 화면에 못박아 브라우저가 바운스할 대상
자체가 없게 만듦 (Safari/iOS에서 rubber-band 스크롤을 막는 표준 기법).
Flutter 내부 스크롤(대시보드, 하위 화면 목록 등)은 별도로 동작하므로
영향 없음 - 실제로 정상 스크롤되는 것 확인함.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 19:29:20 +09:00
sihooandClaude Sonnet 5 a0403e40f2 스크롤 바운스 시 파란색 대신 앱 배경색이 보이게 수정
다른 사이트/브라우저에서도 똑같이 나타난다는 걸 확인 - macOS 트랙패드의
정상적인 "탄력 바운스" 동작이었음. 다만 지난번 overflow: hidden으로
막아버린 탓에, 브라우저가 우리 페이지를 진짜 스크롤 가능한 문서로
인식하지 못해서 바운스 시 body 배경색 대신 브라우저 기본색(파란색)이
드러났던 것으로 보임. overflow: hidden을 제거해서 다른 사이트들처럼
자연스럽게 바운스되면서 body의 실제 배경색(#EEF0F2)이 드러나게 함.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 18:27:48 +09:00
sihooandClaude Sonnet 5 7e83884d33 스크롤 시 파랗게 보이는 진짜 원인 발견 - PWA manifest 기본 파란색 제거
manifest.json의 theme_color/background_color가 Flutter 프로젝트
템플릿의 기본값(#0175C2, Flutter 브랜드 파란색)으로 그대로 남아있었음.
Safari가 스크롤 시 툴바 주변을 이 색으로 물들여서 파란 줄이 보인 것.

- manifest.json: theme_color를 앱의 ink색(#1C1C1C)으로, background_color를
  앱 배경색(#EEF0F2)으로 교체
- index.html에도 <meta name="theme-color">를 명시적으로 추가해 이중으로 보장

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 18:17:03 +09:00
sihooandClaude Sonnet 5 0467f31996 스크롤 시 나오는 파란 영역 - 브라우저 페이지 바운스 원천 차단
Flutter 자체 오버스크롤 글로우를 껐는데도 계속 보인다는 피드백 -
Flutter 레이어가 아니라 브라우저가 HTML 문서 자체를 스크롤 가능한
것으로 인식해서 트랙패드 제스처로 페이지 전체가 바운스되며 배경이
드러나는 것으로 보임. html/body에 overflow: hidden +
overscroll-behavior: none을 줘서 브라우저 차원의 바운스를 막고,
혹시 드러나더라도 흰색/파란색이 아니라 앱 배경색(#EEF0F2)이
보이도록 배경색도 지정.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 18:10:33 +09:00
sihooandClaude Sonnet 5 2d87a681ca 스크롤 시 나오는 파란 오버스크롤 글로우 효과 제거
Flutter 기본 GlowingOverscrollIndicator가 스크롤 경계에서 파란색으로
번쩍이던 걸 커스텀 ScrollBehavior로 전체 앱에서 비활성화.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 18:05:18 +09:00
sihooandClaude Sonnet 5 c40cbed0bb 메인 대시보드 타일 크기 50px 축소 (276 -> 226)
직전 커밋에서 타일을 너무 키웠다는 피드백을 반영.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 17:50:18 +09:00
sihooandClaude Sonnet 5 5d37d3e3b1 제목 알약 폰트 통일 + 위치 조정, 좁은 폼 너비, 메인 타일 확대
- TitlePill을 String 기반으로 바꿔서 모든 화면(설정/교사 회원가입/관리자
  시스템/NFC 태그 쓰기·체크인/학생 관리/스마트기기 반출 신청·대장/실시간
  출석 현황)이 완전히 같은 폰트(굵게, 15px, 흰색)를 쓰게 통일
- 알약이 화면 맨 위에 딱 붙어 보이지 않도록 위쪽에 8px 여백 추가
- "스마트기기 반출 신청" 폼과 "관리자 시스템"의 "모든 출석 데이터 초기화"
  버튼이 넓은 화면에서 양옆으로 과하게 늘어지던 문제 수정 - 최대 폭
  420px로 제한하고 가운데 정렬 (기존 대비 약 1/3 크기)
- 메인 대시보드 타일 목표 크기를 184 → 276(50% 확대)로 키우고, 아이콘/
  패딩/폰트 기준값도 함께 올려서 제목 10→12pt, 부제 8→10pt로 확대

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 16:26:29 +09:00
sihooandClaude Sonnet 5 527661b6e5 나머지 기능 화면들도 검정 AppBar를 둥근 제목 알약으로 통일
실시간 출석 현황과 같은 톤으로, 설정/교사 회원가입/관리자 시스템/
NFC 태그 쓰기·체크인/학생 통합 관리 센터/스마트기기 반출 신청·대장
화면의 검정 배경 AppBar를 투명 배경 + 가운데 둥근 제목 알약으로 교체.

출석 현황 화면과 달리 폰트 크기는 줄이지 않고 각 화면이 원래 쓰던
스타일(굵기 등)을 그대로 유지 - 공용 TitlePill 위젯이 스타일링된
Text를 그대로 감싸주기만 함.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 15:17:05 +09:00
sihooandClaude Sonnet 5 d9ca4913d4 실시간 출석 현황 모바일 화면: 검정 요약바 제거 + 중복 필터 정리
작은 화면(폰) 레이아웃만 데스크탑과 톤을 맞춤 - 큰 화면(사이드바/좌석
그리드)은 그대로 둠.

- 검정 배경 요약바(_buildSummaryCards)를 없애고, 데스크탑 사이드바와
  같은 흰색 캡슐(_sidebarStatPill)을 가로로 3개 배치. 탭하면 바로
  전체/출석/미출석 필터가 적용됨
- 전체 학생 수 캡슐 바로 아래 있던 필터 칩 줄(전체/출석자/미출석자 +
  학년 칩)은 위 캡슐과 기능이 겹쳐서 제거하고, 데스크탑과 동일한
  "학생 나눠보기"(런치패드 학년 필터 메뉴) 버튼으로 대체
- 더 이상 안 쓰는 _buildSummaryCards/_summaryCard/_buildFilterChips 삭제

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 14:23:36 +09:00
sihooandClaude Sonnet 5 3946e2ef04 앱 전체 알림을 알약형(AppNotice)으로 통일
나머지 화면들(교사 회원가입, 학생 계정 관리, 관리자 대시보드, 스마트기기
반출 신청/대장, NFC 태그 쓰기/체크인, 비밀번호 변경)에 남아있던 예전
ScaffoldMessenger.showSnackBar를 전부 AppNotice로 교체.

- AppNotice.show에 선택적 color 파라미터 추가 - NFC 태그 쓰기/체크인
  화면처럼 성공(초록)/실패(빨강) 등 색으로 구분하던 알림은 그 색을
  그대로 유지하면서 모양/위치만 통일된 알약 스타일로 바뀜
- 알림 직후 화면을 전환(로그인 성공 후 대시보드 이동, 회원가입 성공 후
  로그인 화면 복귀 등)하던 곳들도, AppNotice가 화면(Scaffold)이 아니라
  전역 Overlay를 쓰기 때문에 전환 중에 알림이 잘리지 않고 새 화면 위에
  계속 보임 (기존 스낵바 방식보다 개선됨)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 13:11:55 +09:00
sihooandClaude Sonnet 5 f80f1f7837 실시간 출석 현황: 하교 처리 등 결과 알림을 알약형(AppNotice)으로 통일
_runAction이 아직 예전 ScaffoldMessenger.showSnackBar(하단 스낵바)를
쓰고 있어서, 하교 처리/반출 허용/출석시간 설정/테스트 초기화 결과가
다른 화면과 다르게 아래에서 떴던 문제 수정. AppNotice.show로 교체해서
웹은 왼쪽 위, 앱은 하단(기존 위치)에 나머지 화면들과 같은 스타일로 뜨게 함.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 12:55:35 +09:00
sihooandClaude Sonnet 5 32203baffc 실시간 출석 현황: 제목 알약을 앱바에서 사이드바 상단으로 이동
앱바 가운데 제목 대신, "전체 학생 수" 버튼 바로 위(사이드바 최상단)에
제목 알약을 두도록 변경. 모바일도 요약 카드 위로 동일하게 이동.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 09:38:56 +09:00
sihooandClaude Sonnet 5 20f751b65e 실시간 출석 현황: 검정 배너 제거 + 기능들을 런치패드 메뉴로 통합
- 상단 검정 AppBar 대신 투명 배경 + 가운데 둥근 알약 제목으로 변경
- 새로고침/자습실 출석시간 설정/반출 허용 시간 설정/하교 처리/테스트용
  초기화를 "자습실 시간 설정 메뉴" 하나로 모아서, 메인 대시보드의
  로그아웃/설정 메뉴와 같은 런치패드 스타일(배경 블러) 오버레이로 표시
- 데스크탑은 사이드바에 전용 버튼을 추가하고, 폰에서는 앱바의 "..."
  아이콘으로 같은 메뉴에 접근 (모바일 기능 접근성 유지)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 09:31:17 +09:00
sihooandClaude Sonnet 5 2d0768da73 실시간 출석 현황 데스크탑 화면을 좌석표 스타일로 재구성
80명 이상인 자습실 인원을 스크롤 없이 최대한 한눈에 보기 위해,
데스크탑(교실 컴퓨터) 레이아웃을 왼쪽 요약/필터 사이드바 + 오른쪽
촘촘한 좌석 그리드 구조로 바꿈. 학생 한 명당 칸을 92x62 크기로 작게
줄여 한 화면에 훨씬 많은 인원이 들어가게 했고, 사이드바의 인원 수
캡슐(전체/출석/미출석)을 눌러 바로 필터링할 수 있게 함. 학년 필터는
런치패드 스타일 오버레이 메뉴로 이동. 모바일 카드 리스트 레이아웃은
그대로 유지.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 09:01:51 +09:00
sihooandClaude Sonnet 5 2fb24f5e46 release: 1.1.5 Android 빌드 호환성 수정
AGP 9 환경에서 desktop_drop 플러그인의 Kotlin Gradle Plugin
적용 방식이 깨져 있어 릴리즈 APK 빌드가 실패하던 문제를 해결.
desktop_drop을 0.8.3으로 올리고, :desktop_drop 서브프로젝트에
kotlin-android 플러그인을 명시적으로 적용하도록 root build.gradle.kts에
예외 처리 추가.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 00:17:23 +09:00
sihooandClaude Sonnet 5 75b906c648 웹에서 타일이 너무 작아 보이는 문제 수정 - 1x1 크기를 프로필 카드에 맞춤
임의로 20% 축소하던 방식 대신, 1x1 타일 목표 크기(184px, 계정 프로필
카드와 비슷한 크기)를 기준으로 그리드 폭을 계산하도록 변경. 화면이
목표 크기보다 넓으면 가운데로 모아 여백을 주고, 좁으면(폰) 화면 폭에
그대로 맞춘다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 00:08:20 +09:00
sihooandClaude Sonnet 5 73542fa11c 대시보드 타일 그리드 여백 확보 - 4열 고정 + 크기 20% 축소
- 화면이 넓어져도 열 개수를 6개까지 늘리지 않고 4열에서 고정
- 그리드 캔버스 자체 너비를 700px로 제한하고 20% 더 줄여서, 타일이
  화면을 꽉 채우는 느낌 대신 가운데에 여백을 두고 정갈하게 보이게 함

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-07 23:59:59 +09:00
sihooandClaude Sonnet 5 79938898a0 대시보드 레이아웃을 목업처럼 재구성 (작은 프로필 카드 + 매이슨리 타일 그리드)
- 화면 전체를 차지하던 색상 배너를 작은 둥근 프로필 카드로 교체하고 가운데에 배치
- 앱바는 ">" 메뉴 버튼만 올라가는 투명한 얇은 바로 변경
- 균일한 그리드 대신 flutter_staggered_grid_view로 타일마다 크기가 다른
  매이슨리 레이아웃 적용 (NFC 태그는 세로로 길게, 실시간 출석/서버 DB 제어는
  가로로 넓게) - 화면 폭에 따라 열 개수가 자동으로 바뀌어 폰에서도 안 깨짐
- 가로로 넓지만 낮은 타일에서 내용이 넘치지 않도록 카드 배율 계산을
  가로/세로 중 작은 쪽 기준으로 변경

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-07 23:45:38 +09:00
sihooandClaude Sonnet 5 f885719674 런치패드 스타일 화면 전환 + 설정/로그아웃 메뉴 오버레이 + 알약형 알림 추가
- 좌우 슬라이드 대신 맥북 런치패드처럼 확대+페이드로 나타나고 전환 중 뒤 화면이
  블러 처리되는 LaunchpadPageRoute 추가, 대시보드의 모든 기능 타일 이동에 적용
- 오른쪽 위 설정 아이콘 + 로그아웃 아이콘 2개를 ">" 버튼 1개로 통합하고,
  누르면 로그아웃/설정 메뉴가 런치패드 스타일 오버레이(배경 블러 유지)로 뜨게 변경
- 기능 타일을 누를 때 뜨는 안내 메시지를 스낵바 대신 알약(pill) 모양 알림으로 교체
  (AppNotice) - 웹에서는 왼쪽 위, 앱에서는 기존처럼 아래쪽에 표시. 푸시 알림과는 무관.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-07 23:25:23 +09:00
sihooandClaude Sonnet 5 c94f51a033 타일 UI 편집 기능 임시 보류 + 로그인 유지 체크박스 추가
- 폰처럼 작은 화면에서 6칸 고정 격자 때문에 레이아웃이 깨지는 문제로,
  타일 드래그 이동/크기조절 기능을 kTileEditingEnabled 플래그로 임시 비활성화
  (관련 코드는 그대로 유지 - 작은 화면 대응 방안 마련 후 플래그만 켜면 재사용 가능)
- 비활성화 상태에서는 화면 폭에 따라 열이 자동으로 줄어드는 기본 그리드 사용
- 설정 화면의 "UI 편집" 항목은 비활성화 표시로 안내
- 로그인 화면에 "로그인 상태 유지" 체크박스 추가 (기본 체크됨, 해제 시 세션 저장 안 함)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-07 22:47:07 +09:00
sihooandClaude Sonnet 5 7495ece0c8 대시보드 배너/타이틀 중앙정렬 + 타일 UI 편집(드래그 이동/크기조절) + 로그인 유지 기능 추가
- 이름/부제, "스마트 관리 시스템 메뉴" 제목을 중앙 정렬
- 타일을 1x1~4x4 크기로 자유 배치할 수 있는 편집 모드 추가 (6x4 캔버스, 삼성 One UI 위젯 편집 방식)
- 타일 배치는 계정별로 서버에 저장/복원 (dashboard_layout_controller.dart)
- 설정 화면(톱니바퀴 아이콘) > "UI 편집" 진입점 추가
- shared_preferences로 로그인 유지 기능 추가 (비밀번호는 저장하지 않음)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-07 22:18:16 +09:00
sihooandClaude Sonnet 5 83c148186d 전역 테마를 팔레트로 교체 + 빠졌던 팝업 화면들 마무리
앱 전체 MaterialApp의 ThemeData가 여전히 primarySwatch: Colors.indigo
였던 게 진짜 원인이었음 — 개별 화면 색은 고쳤지만, 기본 위젯 스타일
(포커스 안 된 텍스트필드 밑줄, FilterChip 선택 색 등)은 전부 이
전역 테마를 그대로 따라가고 있어서 여전히 예전 색으로 보였음.
ColorScheme을 AppPalette 기준으로 재구성해 해결.

추가로 팔레트 작업에서 빠졌던 화면들도 마무리:
- teacher_register_screen.dart (교사 회원가입)
- nfc_tag_writer_screen.dart (NFC 태그 쓰기)
- change_password_screen.dart (미사용이지만 일관성을 위해 정리)
- teacher_attendance_page.dart의 주머니 번호 칩 색상

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-07 13:35:46 +09:00
sihooandClaude Sonnet 5 9089b9032e UI 문구 이모티콘 제거 + 계정 강제 삭제 아이콘 검정으로 통일
화면 타이틀, 스낵바/다이얼로그 메시지, 백그라운드 알림 문구 등
사용자에게 노출되는 텍스트에서 이모티콘을 전부 제거 (코드 주석은
대상 아님). 아이콘 위젯은 그대로 유지.

main_dashboard.dart의 "계정 강제 삭제" 타일 아이콘 색상도 빨간색
대신 다른 타일과 동일한 검정(AppPalette.ink)으로 통일.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-04 22:31:03 +09:00
sihooandClaude Sonnet 5 dce5f1ad1b 앱 전체 배경/카드 색상을 coolors 팔레트로 통일
coolors.co 무채색 팔레트(1c1c1c-daddd8-ecebe4-eef0f2-fafaff)를
lib/theme/app_palette.dart에 정의하고, 로그인/대시보드/출석 확인/
학생 계정 관리/스마트기기 반출(신청·대장)/관리자 화면 전반의
배너·배경·카드·기본 버튼 색을 이 팔레트로 교체.

기능적으로 의미 있는 색(위반/미출석/삭제/거절 등 경고성 빨간색,
승인 대기 등 상태 표시)은 그대로 유지 — 구조적/장식적 색상만
무채색으로 통일해 위험한 동작이 시각적으로 더 도드라지게 함.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-04 14:36:30 +09:00
sihooandClaude Sonnet 5 dcb5dbc71b 파비콘 리사이즈(32x32) + PWA 아이콘 전부 새 이미지로 교체
원본 파비콘이 1024x1024(610KB)라 매 접속마다 불필요하게 큰 파일을
받아오던 문제를 32x32로 리사이즈해 해결. PWA 홈화면 아이콘
(192/512, maskable 포함)도 같은 새 이미지로 통일.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-04 14:10:04 +09:00
sihooandClaude Sonnet 5 9217a13206 파비콘 이미지 교체
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-04 14:05:35 +09:00
sihooandClaude Sonnet 5 b1c8447eaf 학생/교사/관리자 대시보드를 하나의 공통 화면으로 통합
StudentDashboard, TeacherDashboard, AdminDashboard(진입 라우팅)를
MainDashboard 하나로 합치고, 역할(role)에 따라 배너 색상/문구와
보이는 타일만 달라지게 함. 그리드 레이아웃/카드 디자인은 이제
한 곳에서만 관리되어, 앞으로 UI를 고치면 모든 역할에 자동 적용됨.

- 2061(개발자) 계정에 기존에 빠져있던 "스마트기기 반출 대장" 타일 추가
- role=='admin' 실 계정도 이제 학생 계정 관리/출석 확인 등 교사 기능에
  접근 가능 (관리자는 교사 권한을 포함하는 것으로 정리)
- 작은 DB 초기화 전용 화면(admin_dashboard.dart)은 "서버 DB 제어"
  타일의 목적지로만 유지, 로그인 직후 랜딩 화면 역할은 제거

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-03 21:54:33 +09:00
sihooandClaude Sonnet 5 2b3227f268 스마트기기 반출: "기기 반납 확인" 버튼 추가
자동 감지 하드웨어가 아직 없어서, 승인된(APPROVED) 요청에 선생님이
기기를 실제로 돌려받았을 때 누르는 "기기 반납 확인" 버튼을 추가.
누르면 상태가 반납완료로 바뀌어 10분 후 미반납 알림이 더 이상
가지 않는다 (백엔드는 별도 저장소에서 이미 배포 완료).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-01 14:05:19 +09:00
sihooandClaude Sonnet 5 383de8b3a1 스마트기기 반출: 저울 하드웨어 제거, 승인 선생님 지정 알림으로 변경
계획 변경에 따라 저울/아두이노 기반 픽업·반납·무단반출 감지를 없애고
순수 시간 기반 알림만 남김 (백엔드는 별도 저장소에서 이미 배포 완료).

- 승인 시 현재 로그인한 선생님의 teacherId/teacherName을 서버에 함께
  전송하여 저장하고, 대장에 "OOO 선생님이 허용했습니다" 표시
- 반납 시간 초과 알림은 승인한 선생님에게만 전송 (서버가 해당 선생님의
  등록된 기기를 못 찾으면 전체 선생님에게 대체 발송)
- 대장 카드의 상태 표시에서 IN_USE/RETURNED(픽업 대기) 문구 제거

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-01 13:20:28 +09:00
sihooandClaude Sonnet 5 83cb4a5300 학생 계정 개별 추가: 기본 비밀번호 1234로 고정
엑셀 일괄 등록과 동일하게 초기 비밀번호를 항상 1234로 고정하고
입력칸을 없앰. 대신 폼에 "초기 비밀번호: 1234 (고정)" 안내 표시.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-01 08:43:20 +09:00
sihooandClaude Sonnet 5 f1b9f14eb0 계정 추가 폼이 작은 박스 안에서도 버튼까지 다 보이도록 조정
박스 크기를 살짝 키우고(25% 크기 기준 +45%) 입력 필드를 촘촘하게
(isDense, 작은 폰트/패딩) 만들어 스크롤 없이 등록 버튼까지 모두
보이도록 함.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-01 08:38:24 +09:00
sihooandClaude Sonnet 5 f49d6d8722 계정 추가/엑셀 등록 칸 크기를 25%로 재축소
정사각형 기본 크기(절반 폭)로 되돌렸더니 다시 너무 커졌다는
피드백에 따라 25% 크기로 재조정.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-01 08:29:50 +09:00
sihooandClaude Sonnet 5 75f12b8c46 계정 추가/엑셀 등록 칸만 원래의 정사각형(절반 폭) 크기로 복원
NFC 출석 확인 타일 규격에 맞췄던 계정 추가/엑셀 등록 칸 크기를
되돌리고, 학생 목록 타일 크기/폰트는 그대로 유지.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-01 08:24:19 +09:00
sihooandClaude Sonnet 5 d9ab6adb51 학생 계정 관리 타일 크기/폰트를 실시간 출석 확인 목록과 통일
계정 추가/엑셀 등록 칸과 학생 목록 타일 모두 "실시간 출석 확인"
목록의 타일 규격(220x148, 이름15/상태11.5/칩11 폰트)에 맞춰
동일한 비율로 재조정.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-01 08:20:47 +09:00
sihooandClaude Sonnet 5 eba23ecf9b 학생 목록 타일 글자 확대 + 계정 추가/엑셀 칸을 학생 타일 크기로 통일
학생 타일의 이름/상태/학년칩 폰트와 아이콘 크기를 키워 가독성을
높이고, 계정 추가/엑셀 등록 정사각형 칸의 크기를 학생 목록 타일과
동일한 크기(tileSize)로 통일했다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-01 00:48:43 +09:00
sihooandClaude Sonnet 5 e9d31ce41e 학생 계정 관리 화면 박스 크기 재조정
계정 추가/엑셀 등록 정사각형 칸은 기존 크기의 25%로 축소하고,
학생 목록 타일은 기존보다 50% 더 큰 정사각형으로 확대. 목록 폭은
더 이상 위 두 칸 폭에 종속되지 않고 전체 폭을 사용하도록 변경.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-01 00:42:05 +09:00
sihooandClaude Sonnet 5 517aa791b5 학생 목록 타일 크기 약 1/4로 축소
타일이 너무 크다는 피드백에 따라 crossAxisCount를 늘리고(8/4)
아바타, 폰트, 버튼 크기를 전반적으로 줄여 훨씬 컴팩트한 타일로 변경.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-01 00:34:06 +09:00
sihooandClaude Sonnet 5 5b3eb2fcf8 학생 계정 관리 화면 레이아웃 재구성 (정사각형 2칸 + 타일형 학생 목록)
웹 넓은 화면에서 계정 추가/엑셀 일괄 등록을 정사각형 2칸으로
나란히 배치(왼쪽 계정 추가, 오른쪽 엑셀 등록)하고, 그 아래 학생
목록을 두 칸 합친 폭에 맞춘 타일 그리드로 변경. 각 타일은 아이콘/
이름/상태/액션 버튼을 모두 중앙 정렬. 폰 화면은 기존처럼 세로 스택
유지.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-01 00:28:51 +09:00
sihooandClaude Sonnet 5 debf733afd 학생 계정 관리 - 신규 계정 추가 폼 폭 축소
웹 넓은 화면에서 계정 추가 폼이 페이지 전체 폭으로 늘어나
지나치게 길어 보이던 문제 수정. 현재 폭의 2/3로 제한.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-31 19:52:49 +09:00
sihooandClaude Sonnet 5 eccd55c201 선생님 대시보드 웹 타일 그리드 반응형으로 수정
웹(넓은 화면)에서 항상 2개씩 줄바꿈되던 버그 수정. 학생 대시보드와
동일하게 LayoutBuilder로 폭이 800 이상이면 한 줄에 5개, 좁으면
기존처럼 2개씩 보이도록 함.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-31 19:46:19 +09:00
sihooandClaude Sonnet 5 fd0bc4f814 스마트기기(패드) 반출 신청/승인 시스템 추가
패드는 NFC를 못 쓰므로 학생이 사용 시간/목적을 신청하면 선생님이
대시보드의 반출 대장에서 승인/거절하는 흐름을 추가. 저울-아두이노
연동(무게 기반 픽업/반납 감지)은 백엔드에 구현되어 있으나 실기기
연동은 추후 진행.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-31 01:49:17 +09:00
sihooandClaude Sonnet 5 ccff219874 선생님 대시보드에 학년 필터 칩 추가
출석자/미출석자 필터처럼 학년 전체/1학년/2학년/3학년 칩을 추가해서
선택한 학년만 볼 수 있게 함. 상태 필터와 조합해서 같이 적용됨.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-31 01:07:38 +09:00
sihooandClaude Sonnet 5 94ba3efff7 선생님/마스터 계정의 학생 계정 관리 화면을 하나로 통합
- 두 화면이 서로 다른 기능만 갖고 있던 문제 해결: 선생님 화면(엑셀 일괄등록,
  학년 지정, 커스텀 초기비번)에 마스터 화면에만 있던 실시간 학생 목록 조회 +
  기기 리셋(학생이 폰 바꿨을 때 재등록용) 기능을 합침
- 학번을 직접 타이핑하던 블라인드 학년변경/삭제 다이얼로그를 목록의
  행별 액션(학년 칩, 기기 리셋 버튼, 삭제 버튼)으로 교체
- 계정 생성/삭제/학년변경 성공 시 목록 자동 새로고침
- 마스터(2061) 계정의 "학생 계정 관리" 카드도 이 통합 화면으로 연결하고,
  중복되던 student_management_screen.dart / student_management_controller.dart 삭제

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-30 01:23:46 +09:00
sihooandClaude Sonnet 5 a622249008 학생 계정 엑셀 일괄 등록 기능 추가 (신입생 등)
- 학생 계정 관리 화면에 드래그앤드롭/클릭 업로드 영역 추가
  (excel, desktop_drop, file_picker 패키지 도입)
- .xlsx 파싱 → 미리보기 팝업 → 확인 후 한 명씩 순서대로 계정 생성,
  결과(성공/실패)를 요약해서 보여줌. 초기 비밀번호는 1234 고정
- file_picker의 웹 구현체가 pickFile(s)를 아직 구현하지 않아서
  (UnimplementedError) 웹에서는 package:web으로 직접 <input type=file>을
  다뤄서 우회 (lib/function/excel_file_picker_web.dart), 다른 플랫폼은
  기존 file_picker 사용 (excel_file_picker_io.dart)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-29 22:44:40 +09:00
sihooandClaude Sonnet 5 db903fcdef 기존 학생 계정 학년 지정/변경 기능 추가
- 학생 계정 관리 화면에 학번으로 학년을 지정/변경하는 카드+다이얼로그 추가
- 계정 생성 성공 판정을 HTTP 상태코드가 아닌 응답 status 필드로 정확히 확인하도록 수정

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-28 22:05:36 +09:00
sihooandClaude Sonnet 5 d1c59c521b 선생님 대시보드 학년별 카테고리 분류 + 학생 계정 관리 버그 수정
- 실시간 출석 현황을 학년별 섹션으로 묶어서 표시 (백엔드에 grade 필드 추가)
- 학생 계정 추가 폼에 학년 선택 드롭다운 추가
- 학생 계정 생성/삭제가 실제로는 존재하지 않는 엔드포인트를 호출하던
  버그 수정 (/api/users/register-student, /api/users/delete/{id} →
  /api/users/create, /api/users/delete)
- 학생 대시보드(개발자 모드) 카드 그리드가 넓은 화면에서 과도하게
  커지던 레이아웃 버그 수정, 웹은 5열/폰은 2열로 반응형 처리
- 버전 1.2.0+6

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-28 16:29:40 +09:00
sihooandClaude Sonnet 5 9354e2998a 아이폰 근접센서 주머니 감시, 학생 목록 타일 UI, 학교 서버 주소 반영
- iOS는 조도 센서/백그라운드 서비스가 불가능해서 근접센서(UIDevice
  proximityMonitoring) + 가이드 접근 안내로 대체 구현 (Core NFC와 마찬가지로
  네이티브 플러그인 필요해서 ProximityMonitorPlugin.swift 추가)
- 교사 대시보드 실시간 출석 현황: 모바일 리스트/데스크톱 표를 타일 그리드로
  통일해서 한눈에 보기 쉽게 변경
- 서버를 학교 자체 서버(Cloudflare Tunnel, api.backsanhi.shop)로 이전하면서
  기본 BASE_URL 갱신
- Firebase CLI 로컬 캐시(.firebase/)는 소스가 아니라 gitignore 처리

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-27 21:50:38 +09:00
sihoo f9fa05f817 학교별 배포를 위해 서버주소/학교이름을 빌드타임 설정으로 전환
- config.dart의 baseUrl/webVapidKey와 학교 이름을 String.fromEnvironment로 전환
- 기본값은 기존 백산고 값 그대로라 인자 없이 빌드하면 지금과 동일하게 동작
- 다른 학교는 --dart-define=BASE_URL=...=SCHOOL_NAME=...=WEB_VAPID_KEY=...로 빌드
2026-08-06 14:36:10 +09:00
sihoo 26d143d713 안드로이드 Gradle 빌드 폴더 git 추적 제외
- android/build/ 아래 자동생성 리포트(HTML)가 실수로 커밋되어 있던 것을 제거
- .gitignore에 android/**/build/, ios/**/build/ 추가해서 재발 방지
  (Gitea 언어 통계가 HTML 위주로 잘못 표시되던 원인)
2026-08-05 15:07:10 +09:00
sihoo 29e319110c lib/ 코드를 UI(lib/ui/)와 기능(lib/function/)으로 분리
- 화면마다 위젯/스타일만 담당하는 UI 파일과, 서버통신/상태/파생로직만 담당하는
  ChangeNotifier 컨트롤러 파일로 1:1 분리 (lib/screens/ -> lib/ui/ + lib/function/)
- UI는 ListenableBuilder로 컨트롤러를 구독해서 재렌더링, 버튼은 컨트롤러 메서드만 호출
- 다이얼로그/스낵바 등 위젯 코드는 전부 UI 파일에 남기고, 컨트롤러는 결과값(성공여부+메시지)
  또는 콜백으로만 UI와 통신 (BuildContext/Widget 의존성 없음)
- 디자인/레이아웃은 기존과 완전히 동일하게 유지 (순수 코드 재배치)
- change_password_screen.dart, debug_pocket_main.dart(미사용 파일)는 깨지지 않게 import
  경로만 갱신하고 리팩터링은 보류
2026-08-05 15:04:24 +09:00
sihoo dca7912f8d 로그인 화면 아이디/비밀번호 입력칸 폭 제한 (데스크톱 웹에서 너무 넓게 늘어지던 문제 수정) 2026-08-05 14:07:06 +09:00
sihoo 4e12b279e2 선생님 정상 로그인 시 대시보드 이름 표시 버그 수정 + 앱 버전 1.1.4
- 로그인 성공 후 TeacherDashboard로 이동할 때 실제 이름/학번을 안 넘겨줘서
  항상 "간편인증 선생"으로 표시되던 문제 수정
2026-08-05 14:01:50 +09:00
sihoo d864927957 전체 반출 허용 중일 때 대시보드에 배너 표시 추가 2026-08-04 14:55:22 +09:00
sihoo 61aedac312 한 번도 태깅 안 한 학생은 미제출 대신 미등록으로 표시 2026-08-04 14:47:15 +09:00
sihoo 5ab1c4c37c 하교 처리 후 무단반출 오탐 버그 수정 + 앱 버전 1.1.3
- 조도 센서가 폰 반출을 감지하면, 위반 경고를 울리기 전에 서버에 반출 허용 상태(하교/허용시간대)를 먼저 확인
- 허용된 상태면 위반 경고 없이 조용히 정상 회수로 처리
2026-08-04 14:36:38 +09:00
sihoo 3a62ebacd8 출석/무단반출 팝업 중복 표시 버그 수정 + 앱 버전 1.1.2
- 새 팝업(출석완료/무단반출)을 띄우기 전 이전에 열려있던 팝업을 먼저 닫도록 수정
- 재태깅이 짧은 간격으로 반복되면 팝업이 여러 개 겹쳐 쌓이던 문제 해결
2026-08-04 14:24:35 +09:00
sihoo 26fb4c32cf 테스트용 허용시간 초기화 디버그 버튼 추가 2026-08-04 14:15:20 +09:00
sihoo 4137a6815c 자습실 출석시간 지정 기능 추가 + 앱 버전 1.1.1
- 대시보드에서 자습실 출석시간(HH:MM) 지정 가능, 하교 시 자동 초기화
- 지정 시간 이전 태깅은 "출석 미완료", 이후는 시간 강조 표시로 구분
2026-08-04 14:01:50 +09:00
sihooandClaude Sonnet 5 4ff063c76d 하교 처리 시 출석 현황 표시도 함께 초기화
하교 버튼을 누르면 반출 허용뿐 아니라, 그 시각을 기준선으로 삼아 대시보드의
"출석 완료" 표시도 미제출로 초기화되도록 함. 실제 출석 기록(attendance 테이블)은
삭제하지 않고, 대시보드가 "오늘 출석"으로 인정하는 기준 시각만 옮기는 방식이라
데이터 손실 없이 표시만 리셋된다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 01:25:20 +09:00
sihooandClaude Sonnet 5 77688170b7 하교 버튼 추가 + 무단반출 후 재태깅 시 재출석 처리 + 테스트용 감시종료 버튼 제거
- 선생님 대시보드에 "하교" 버튼 추가: 시간 입력 없이 바로 전체 학생 반출 허용
  (실수 클릭 방지를 위해 확인 다이얼로그 한 번 거침)
- 무단반출이 감지되면 클라이언트의 감시 상태를 해제해서, 다음 태깅이
  체크아웃이 아니라 새 출석으로 처리되도록 수정
- 주머니 감시 화면에 있던 "폰 회수하고 감시 종료 (테스트용)" 버튼 제거
  (정식 플로우는 재태깅으로만 체크아웃/재출석 처리)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 01:08:48 +09:00
sihooandClaude Sonnet 5 c17a28bad9 새로고침 버튼에 로딩 표시 추가
버튼을 눌러도 아무 반응이 없어 보인다는 피드백 반영 - 클릭 시 아이콘이
잠깐 스피너로 바뀌도록 해서 실제로 새로고침이 진행 중임을 알 수 있게 함.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 00:52:26 +09:00
sihooandClaude Sonnet 5 9adaba10cd 교사 대시보드에 새로고침 버튼 추가 + 웹 배포 캐시 무효화 설정
- TeacherAttendancePage 앱바에 수동 새로고침 버튼 추가
- Firebase Hosting에서 index.html/flutter_service_worker.js/version.json을
  no-cache로 설정해서, 재배포 후 브라우저가 예전 버전을 계속 들고 있는 문제 방지

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 00:42:15 +09:00
sihoo 77ef666e16 Merge README update from remote 2026-08-04 00:33:47 +09:00
sihooandClaude Sonnet 5 c8ed8f2fd2 교사 데스크톱 대시보드 + 무단반출 허용 기능 추가
- 실시간 출석 현황 화면(TeacherAttendancePage)에 데스크톱(웹 브라우저 800px+) 전용
  레이아웃 추가: 통계 타일 3개 + 정식 DataTable. 교사 대시보드 메뉴 그리드도
  데스크톱에서 카드가 지나치게 커지지 않도록 최대 너비 제한
- Firebase Hosting에 웹 빌드 배포 설정 추가 (firebase.json hosting 섹션),
  https://school-display-ff28f.web.app 로 선생님이 브라우저에서 바로 접속 가능
- 무단 반출(/api/violations/active) 감지 시 대시보드에 빨간 표시 + "반출 허용" 버튼 추가
- 선생님이 개별 학생에게 N분간 반출 허용(/api/violations/allow), 또는 전체 학생에게
  한 번에 반출 허용 시간대 설정(/api/permissions/window, 쉬는시간 등) 가능하도록 연동

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 00:32:30 +09:00
sihoo 49ab432fe9 README.md 업데이트 2026-08-03 14:15:51 +00:00
sihooandClaude Sonnet 5 7f6448ae9b 플레이스토어 출시 준비: 릴리즈 서명, 패키지명 변경, HTTPS 전환, NFC 태그 쓰기 기능 추가
## 릴리즈 빌드 준비
- android/app/build.gradle.kts: 디버그 키로 서명하던 release 빌드 타입을
  android/key.properties 기반 정식 릴리즈 키스토어(upload-keystore.jks) 서명으로 변경
- applicationId를 com.example.school_attendance → com.backsanhighschool.app 로 변경
  (com.example.* 패키지는 구글 플레이 업로드 자체가 거부되기 때문)

## Firebase 재등록
- 새 패키지명(com.backsanhighschool.app)으로 Firebase Android 앱을 새로 등록
- google-services.json, lib/firebase_options.dart, firebase.json을 새 앱 ID 기준으로 재생성

## HTTPS 전환
- lib/config.dart: baseUrl을 http:// → https:// 로 변경
  (서버에 이미 발급되어 있었지만 프록시에 연결이 안 되어 있던 Let's Encrypt
  인증서를 nginx-proxy-manager에 연결하고 HTTP→HTTPS 강제 리다이렉트 설정)
- AndroidManifest.xml: 더 이상 필요 없는 usesCleartextTraffic="true" 제거

## NFC 태그 쓰기 기능 (신규)
- lib/screens/nfc_tag_writer_screen.dart 추가: 관리자가 빈 NFC 스티커에
  "POCKET_번호" 텍스트를 쓰고, 태그 하드웨어 UID를 서버(/api/pockets/register)에
  등록해서 태그 복제(내용만 베낀 위조 태그)를 방지
- lib/nfc_poccket_checkin_screen.dart: 체크인 시 태그 UID를 함께 서버로 전송해서
  등록된 진짜 주머니 번호로 검증하도록 변경
- lib/screens/student_dashboard.dart: 개발자 메뉴에 "NFC 태그 쓰기" 카드 추가,
  기존 "가상 NFC 태깅" 카드는 "NFC 태그"로 이름 변경

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-03 15:46:51 +09:00
sihoo 3f2fb0a57e 오류 메세지 수정 2026-07-28 19:13:14 +09:00