학생 계정 엑셀 일괄 등록 기능 추가 (신입생 등)
- 학생 계정 관리 화면에 드래그앤드롭/클릭 업로드 영역 추가 (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>
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
// 📄 [웹 전용] file_picker의 웹 구현체에 pickFile(s)가 아직 없어서(UnimplementedError),
|
||||
// 숨겨진 <input type="file">를 직접 만들어 처리한다.
|
||||
import 'dart:async';
|
||||
import 'dart:js_interop';
|
||||
import 'dart:typed_data';
|
||||
import 'package:web/web.dart' as web;
|
||||
|
||||
/// 사용자가 엑셀(.xlsx) 파일을 고르면 바이트를 돌려준다. 취소하면 null.
|
||||
Future<Uint8List?> pickExcelFileBytes() async {
|
||||
final completer = Completer<web.File?>();
|
||||
final input = web.HTMLInputElement()
|
||||
..type = 'file'
|
||||
..accept = '.xlsx'
|
||||
..style.display = 'none';
|
||||
// 문서에 실제로 붙어있지 않으면 일부 브라우저/자동화 환경에서 change 이벤트가
|
||||
// 안정적으로 안 잡힌다 — 그래서 body에 잠깐 붙였다가 끝나면 반드시 제거한다.
|
||||
web.document.body!.append(input);
|
||||
|
||||
input.onchange = (web.Event event) {
|
||||
final file = input.files?.item(0);
|
||||
input.remove();
|
||||
completer.complete(file);
|
||||
}.toJS;
|
||||
|
||||
input.click();
|
||||
final file = await completer.future;
|
||||
if (file == null) return null;
|
||||
|
||||
final buffer = await file.arrayBuffer().toDart;
|
||||
return buffer.toDart.asUint8List();
|
||||
}
|
||||
Reference in New Issue
Block a user