PageSourceSearch

https://naemo.ai/_next/static/chunks/6518.eb7995a357081d61.js

js naemo.ai collected 2026-09-24 14:31:23 UTC 67,787 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6518],{16011:function(e,t,r){r.d(t,{J5:function(){return i},Od:function(){return n},W:function(){return d},Y6:function(){return l},ln:function(){return a}}),r(83079);var s=r(12119),a=(0,s.$)("fc5f94b04a0542d499822142b7b4f64c39012342"),n=(0,s.$)("fca6dd844ba9770f5af8e9b00b684ad694adaa4a");(0,s.$)("a23c7989ead4c3f0bbc34ab968897e577d69c34e");var l=(0,s.$)("25b3af908b23b7a432042fc7fc768d9a77983d41");(0,s.$)("6b3568d6b307d0ad395124e72ce56f40a95ffa5e");var i=(0,s.$)("8909e13eb61723a8c65f1da87ec810139ad46edd"),d=(0,s.$)("610035678b1f5c2ab1d276b66f1f6b8d7da99c5b")},76518:function(e,t,r){r.r(t),r.d(t,{default:function(){return O}});var s=r(57437),a=r(2265),n=r(10136),l=r(41905),i=r(45675),d=r(30401),c=r(18930),o=r(48736),x=r(55900),u=r(37806),m=r(99397),h=r(32489),p=r(92735),f=r(76858),b=r(76865),g=r(59717),v=r(66109),j=r(88507),N=r(93448),w=r(4908),k=r(73369),y=r(83008),z=r(53834),C=r(45007),I=r(67920),D=r(27526),E=r(93202);r(83079);var S=r(12119),F=(0,S.$)("1e17e29b0cdb1025b4b181a66c2946236226e00d"),A=r(16011),_=(0,S.$)("16ec8a38244286f86515499ce5645f62ae04b383"),L=r(60706),Z=r(98319),B=r(73348),P=r(7888),M=r(74791);function R(e){return e?"bg-[#EAEAEA] dark:bg-[#27272a] text-zinc-900 dark:text-white":"text-[#a1a1aa] hover:bg-[#EAEAEA]/50 dark:hover:bg-[#27272a]/50 hover:text-zinc-900 dark:hover:text-white"}function T(e){return(0,N.cn)("text-sm transition-colors file-upload-class-count text-zinc-500 dark:text-[#71717a]",!e&&"group-hover:text-zinc-900 dark:group-hover:text-white")}let W=e=>{let{cls:t,isActive:r,isEditing:a,count:n,editClassInput:d,setEditClassInput:c,setEditingClass:o,handleRenameClass:x,onClick:u}=e,m=(0,g.o)();return a?(0,s.jsx)(v.e,{value:t,dragListener:!1,children:(0,s.jsx)("form",{onSubmit:x,className:"px-1 py-1",children:(0,s.jsx)("input",{autoFocus:!0,value:d,onChange:e=>c(e.target.value),placeholder:"반 이름 입력 후 Enter",className:"w-full px-2 py-1.5 text-sm bg-black/20 border border-[#3f3f46] rounded focus:outline-none focus:border-blue-500 text-white",onBlur:()=>{d.trim()&&d.trim()!==t||o(null)},onKeyDown:e=>{"Escape"===e.key&&o(null)}})})},t):(0,s.jsxs)(v.e,{value:t,dragListener:!1,dragControls:m,layout:!0,transition:{type:"spring",stiffness:400,damping:30},className:(0,N.cn)("w-full flex items-center justify-between pl-2 pr-3 py-2.5 rounded-lg text-sm font-normal transition-colors group cursor-pointer select-none",R(r)),onClick:u,children:[(0,s.jsxs)("div",{className:"flex items-center gap-1 min-w-0",children:[(0,s.jsx)("div",{className:"cursor-grab active:cursor-grabbing text-zinc-400 hover:text-zinc-700 dark:text-zinc-500 dark:hover:text-white transition-colors drag-handle shrink-0",onPointerDown:e=>{m.start(e)},children:(0,s.jsx)(l.Z,{size:14})}),(0,s.jsx)("span",{className:"truncate flex-1 min-w-0",children:t})]}),(0,s.jsxs)("div",{className:"flex items-center gap-1.5 shrink-0",children:[(0,s.jsx)("button",{"aria-label":"수정",onClick:e=>{e.stopPropagation(),o(t),c(t)}
1,className:"p-1 opacity-0 group-hover:opacity-100 hover:bg-white/10 rounded transition",children:(0,s.jsx)(i.Z,{size:12})}),(0,s.jsxs)("span",{className:T(r),children:[n,"명"]})]})]},t)};function O(e){var t,l,i,g;let{onClose:v,minimal:S=!1,activeTabOverride:O,initialGradeFileType:$,hidePrimarySidebar:q=!1,studentId:X,autoAddClass:G=!1}=e,[V,K]=(0,a.useState)("student-list");(0,a.useEffect)(()=>{O&&K(O)},[O]);let{classes:U,students:Y,addClass:H,removeClass:J,renameClass:Q,reloadStudents:ee,updateClassOrder:et}=(0,w.AF)(),{showToast:er}=(0,Z.p)(),es=(0,I.XC)(),ea=(0,n.N)(),[en,el]=(0,a.useState)("담임 학급"),[ei,ed]=(0,a.useState)(G),[ec,eo]=(0,a.useState)(""),[ex,eu]=(0,a.useState)(null),[em,eh]=(0,a.useState)(""),[ep,ef]=(0,a.useState)([]),eb=(0,a.useRef)();(0,a.useEffect)(()=>{ef(U.filter(e=>"담임 학급"!==e))},[U]);let[eg,ev]=(0,a.useState)([]),[ej,eN]=(0,a.useState)(!1),[ew,ek]=(0,a.useState)(!1),[ey,ez]=(0,a.useState)(!1),[eC,eI]=(0,a.useState)(null),[eD,eE]=(0,a.useState)(!1),[eS,eF]=(0,a.useState)(!1),[eA,e_]=(0,a.useState)(!1),[eL,eZ]=(0,a.useState)(!1),eB=(0,a.useRef)(null),[eP,eM]=(0,a.useState)([]),[eR,eT]=(0,a.useState)(null),eW=(0,a.useRef)(null),eO=(0,a.useRef)(null),e$=(0,a.useRef)(null),eq=(0,a.useRef)(null),[eX,eG]=(0,a.useState)($||"school"),[eV,eK]=(0,a.useState)(null),[eU,eY]=(0,a.useState)([]),[eH,eJ]=(0,a.useState)(null),[eQ,e0]=(0,a.useState)(null),[e1,e2]=(0,a.useState)(null),[e5,e3]=(0,a.useState)(!1),[e4,e7]=(0,a.useState)(null),[e9,e8]=(0,a.useState)(null),{data:e6}=(0,D.kP)();a.useMemo(()=>{var e;return null!=e6&&!!e6.user&&(!!e6.user.isSystemAdmin||["OWNER","SCHOOL_ADMIN","GRADE_ADMIN"].includes((null===(e=e6.user.role)||void 0===e?void 0:e.toUpperCase())||""))},[e6]);let{uploadLifeRecord:te}=(0,E.l)(),tt=(e,t)=>{let r=(Number(e.grade)||0)-(Number(t.grade)||0);if(0!==r)return r;let s=(Number(e.classNum)||0)-(Number(t.classNum)||0);return 0!==s?s:(Number(e.number)||0)-(Number(t.number)||0)},{createStudent:tr,updateStudent:ts,deleteStudent:ta,bulkCreateStudents:tn,clearClassStudents:tl}=(0,k.N)(),ti=async(e,t)=>{ek(!0);let r=0,s=0,a=[];try{if(t.length>0&&(await Promise.allSettled(t.map(e=>ts.mutateAsync({id:e.id,...e.data})))).forEach(e=>{"fulfilled"===e.status?r++:s++}),e.length>0)try{let t=await tn.mutateAsync({students:e});r+=t.count||0,s+=t.failureCount||0,t.results&&t.results.forEach(e=>{e.success||a.push("".concat(e.student,": ").concat(e.error))})}catch(t){console.error(t),s+=e.length,a.push("일괄 등록 중 오류 발생")}await ee();let n=Y.filter(e=>{var t;return e.homeClassId===en||(null===(t=e.customClassIds)||void 0===t?void 0:t.includes(en))}).map(e=>({...e,isValid:!0})).sort(tt);if(ev(n),eF(!1),e_(!1),eZ(!1),0===s)er("학생 ".concat(r,"명을 반영했습니다."),"success");else{let e=a.slice(0,5).join("\n");er("처리 완료: 성공 ".concat(r,"명, 실패 ").concat(s,"명\n\n").concat(e).concat(a.length>5?"...":""),"error")}}catch(e){console.error("Batch execution error:",e),er("작업 중 오류가 발생했습니다.","error")}finally{ek(!1)}},td=async()=>{if(0===eg.length)return;ek(!0);let e=[...eg].sort(tt);ev(e);try{let t=Y.filter(e=>{var t;return e.homeClassId===en||(null===(t=e.customClassIds)||void 0===t?void 0:t.includes(en))}),r=[],s=[];e.forEach(e=>{let a=t.find(t=>t.number===e.number);if(a){var n;let t=null!==(n=a.homeClassId)&&void 0!==n?n:null,r=a.customClassIds||[],l=t,i=[...r];"담임 학급"===en?(t&&"담임 학급"!==t&&(i=Array.from(new Set([...i,t]))),l="담임 학급"):t===en||i.includes(en)||(i=Array.from(new Set([...i,en]))),i=i.filter(e=>e&&e!==l);let d={number:e.number,name:e.name,homeClassId:l,customClassIds:i,grade:e.grade||(null==a?void 0:a.grade)||1,classNum:e.classNum||(null==a?void 0:a.classNum),memo:e.memo||(null==a?void 0:a.memo),previousStudentId:void 0};s.push({id:a.id,data:d})}else r.push({number:e.number,name:e.name,homeClassId:en,customClassIds:[],grade:e.grade||1,classNum:e.classNum,memo:e.memo,previousStudentId:void 0})}),await ti(r,s)}catch(e){console.error("Upload error:",e),er("업로드 중 오류가 발생했습니다.","error"),ek(!1)}};(0,a.useEffect)(()=>{$&&eG($)},[$]);let tc=async()=>{ek(!0);try{await tl.mutateAsync({homeClassId:en}),ev([]),await ee(),er("학생 명단을 모두 삭제했습니다.","success")}
1catch(e){console.error("Delete all error:",e),er("삭제 중 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.","error")}finally{ek(!1),ez(!1)}},to=async e=>{if(e.preventDefault(),ex&&em.trim()){if(em.trim()===ex){eu(null);return}await Q(ex,em.trim()),en===ex&&el(em.trim()),e_(!1),eZ(!1),eu(null),eh("")}};(0,a.useEffect)(()=>{if(!eL&&Y.length>0&&0===eg.length){let e=Y.filter(e=>{var t;return e.homeClassId===en||(null===(t=e.customClassIds)||void 0===t?void 0:t.includes(en))}).map(e=>({...e,isValid:!0})).sort(tt);e.length>0&&ev(e)}},[Y,en,eg.length,eL]);let tx=async e=>{eE(!0);try{await new Promise(e=>setTimeout(e,1500));let t=await e.arrayBuffer(),{parseGradeExcel:s}=await Promise.all([r.e(1425),r.e(4635)]).then(r.bind(r,73947)),a=await s(t);if(!a.parsedData||0===a.parsedData.length){er("파싱된 성적 데이터가 없습니다. 파일 형식을 확인해주세요.","error");return}let n=new Map;a.parsedData.forEach(e=>{let{studentNumber:t,studentName:r,currentGrade:s,currentClass:a}=e;n.has(t)||n.set(t,{studentNumber:t,studentName:r,studentId:void 0,currentGrade:s,currentClass:a,grades:[]}),n.get(t).grades.push({...e,classRank:null,percentile:null})});let l=[];n.forEach(e=>{let t=e.studentName.replace(/\s/g,""),r=e.studentNumber>100?e.studentNumber%100:e.studentNumber,s=Y.find(s=>{let a=s.name.replace(/\s/g,""),n=s.number;if((n===e.studentNumber||n===r)&&a===t){let t=e.currentGrade,r=e.currentClass;return t>0&&r>0&&s.grade===t&&s.classNum,!0}return!1});l.push({...e,studentId:null==s?void 0:s.id})}),l.sort((e,t)=>e.studentNumber-t.studentNumber);let i=l.reduce((e,t)=>e+t.grades.length,0);eM(l),eT({gradeClass:a.gradeClass||"알 수 없음",totalRecords:i})}catch(e){console.error("Grade file parsing error:",e),er((0,P.q)(e,"성적 파일을 분석하는 중 오류가 발생했습니다. 파일 형식을 확인해 주세요."),"error")}finally{eE(!1)}},tu=async e=>{eE(!0);try{await new Promise(e=>setTimeout(e,1500));let t=await e.arrayBuffer(),{parseMidtermExcel:s}=await Promise.all([r.e(1425),r.e(8588)]).then(r.bind(r,44004)),a=await s(t);if(!a.gradeData||0===a.gradeData.length){er("중간고사 데이터를 찾지 못했습니다. 파일 형식을 확인해 주세요.","warning");return}let n=new Map;a.gradeData.forEach(e=>{let t="".concat(e.currentClass,"-").concat(e.studentNumber);n.has(t)||n.set(t,{studentNumber:e.studentNumber,studentName:e.studentName,studentId:void 0,currentGrade:e.currentGrade,currentClass:e.currentClass,grades:[]}),n.get(t).grades.push({...e,classRank:null,percentile:e.percentile||null})});let l=Y.filter(e=>"담임 학급"===e.homeClassId),i=[];n.forEach(e=>{let t=e.studentName.replace(/\s/g,""),r=l.find(r=>r.name.replace(/\s/g,"")===t&&r.classNum===e.currentClass&&r.number===e.studentNumber);i.push({...e,studentId:null==r?void 0:r.id})}),i.sort((e,t)=>e.studentId&&!t.studentId?-1:!e.studentId&&t.studentId?1:e.currentClass-t.currentClass||e.studentNumber-t.studentNumber),i.filter(e=>e.studentId).length;let d=i.filter(e=>e.studentId).reduce((e,t)=>e+t.grades.length,0);eY(i),eJ({gradeClass:"".concat(a.grade,"학년 전체"),totalRecords:d,totalStudents:a.students.length})}catch(e){console.error("Midterm file parsing error:",e),er((0,P.q)(e,"파일을 분석하는 중 오류가 발생했습니다. 파일 형식을 확인해 주세요."),"error")}finally{eE(!1)}},tm=async()=>{if(0!==eU.length){ek(!0);try{let e=eU.filter(e=>e.studentId),t=e.flatMap(e=>e.grades),r=await _(t);r.success?(er("중간고사 성적 ".concat(e.length,"명분을 저장했습니다. ").concat(r.message),"success"),eY([]),eJ(null)):er("저장 실패: ".concat(r.error),"error")}catch(e){console.error("Midterm upload error:",e),er("저장 중 오류가 발생했습니다.","error")}finally{ek(!1)}}},th=async e=>{eE(!0);try{let t=e.name.toLowerCase();if(t.endsWith(".xlsx")||t.endsWith(".xls")){let t=await e.arrayBuffer(),s=await Promise.all([r.e(1425),r.e(6919)]).then(r.bind(r,2093)),a=s.read(t,{type:"array"}),n=a.Sheets[a.SheetNames[0]],l=s.utils.sheet_to_json(n,{header:1,defval:""});for(let e=0;e<Math.min(10,l.length);e++){let t=(l[e]||[]).join(" ").trim();if(t.includes("교과학습발달상황"))throw Error("내신 성적 파일로 보입니다. '모의고사' 대신 '내신 성적' 탭에서 업로드해주세요.");if(t.includes("전과목 성적 일람표"))throw Error("중간고사 성적 일람표로 보입니다. '모의고사' 대신 '중간고사 성적' 탭에서 업로드해주세요.")}throw Error("모의고사 탭은 PDF 파일만 업로드 가능합니다.")}await new Promise(e=>setTimeout(e,1500));let s=new FormData;s.append("file",e);let a=await (0,A.Od)(s);a.success&&a.data?eK(a.data):er(a.error||"파일 분석에 실패했습니다.","error")}catch(e){console.error("Mock exam PDF processing error:",e),er((0,P.q)(e,"파일ì
1„ 분석하는 중 오류가 발생했습니다. 파일 형식을 확인해 주세요."),"error")}finally{eE(!1)}},tp=async e=>{eE(!0);try{await new Promise(e=>setTimeout(e,300)),await tf(e)}finally{eE(!1)}},tf=async function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=e||(null==e4?void 0:e4.file);if(!r)return;let s=X||(null==e4?void 0:e4.studentId);if(s&&X&&!t){let e=Y.find(e=>e.id===s);if(e)try{var a,n,l,i,d,c;let t=await new Promise((e,t)=>{let s=new FileReader;s.onload=()=>e(s.result.split(",")[1]),s.onerror=t,s.readAsDataURL(r)}),s=await (0,y.X)("checkLifeRecordStudentName",{fileBase64:t},es),o=null==s?void 0:null===(a=s.data)||void 0===a?void 0:a.name,x=null==s?void 0:null===(n=s.data)||void 0===n?void 0:n.number,u=null!==(i=null==o?void 0:o.normalize("NFC").trim())&&void 0!==i?i:null,m=null!==(d=null===(l=e.name)||void 0===l?void 0:l.normalize("NFC").trim())&&void 0!==d?d:"",h=u&&u===m&&null!==x&&null!==e.number&&x!==e.number;if(u&&u!==m||h){e8({extractedName:o,extractedNumber:x,selectedStudentName:e.name,selectedStudentNumber:null!==(c=e.number)&&void 0!==c?c:null,file:r});return}}catch(e){}}ek(!0);try{await te({file:r,studentId:s,onSuccess:e=>{var t;let r=(null==e?void 0:e.matchedNames)||[];r.length>0&&(null===(t=Y.find(e=>r.includes(e.name)))||void 0===t||t.id),v&&v()}}),e7(null)}catch(e){console.error("Record upload error:",e)}finally{ek(!1)}},tb=async()=>{if(eV){ek(!0);try{let e=await (0,A.Y6)(eV);e.success?(er("모의고사 성적 ".concat(eV.students.length,"명분을 저장했습니다."),"success"),eK(null)):er(e.error||"성적 저장에 실패했습니다.","error")}catch(e){console.error("Mock exam upload error:",e),er((0,P.q)(e,"모의고사 성적을 저장하는 중 오류가 발생했습니다. 잠시 후 다시 시도해 주세요."),"error")}finally{ek(!1)}}},tg=async()=>{if(eQ&&""!==eQ.gradeLevel&&""!==eQ.semester){e3(!0);try{var e,t;let r=await (0,y.X)("deleteGradeRecordsBulk",{gradeLevel:eQ.gradeLevel,semester:eQ.semester,examType:eQ.examType},es);if(!r.success){er(r.error||"삭제 중 오류가 발생했습니다.","error");return}let s=null!==(t=null===(e=r.data)||void 0===e?void 0:e.deletedCount)&&void 0!==t?t:0;er(s>0?"".concat(s,"ê±´ 삭제되었습니다."):"삭제할 성적이 없습니다.",s>0?"success":"info"),e0(null)}catch(e){console.error("Bulk delete grades error:",e),er("삭제 중 오류가 발생했습니다.","error")}finally{e3(!1)}}},tv=async()=>{if(e1&&""!==e1.year&&""!==e1.month){e3(!0);try{var e;let t=await (0,A.ln)(e1.year,e1.month);if(!t.success){er(t.error||"삭제 중 오류가 발생했습니다.","error");return}let r=null!==(e=t.deletedCount)&&void 0!==e?e:0;er(r>0?"".concat(r,"ê±´ 삭제되었습니다."):"삭제할 성적이 없습니다.",r>0?"success":"info"),e2(null)}catch(e){console.error("Bulk delete mock exams error:",e),er("삭제 중 오류가 발생했습니다.","error")}finally{e3(!1)}}},tj=async()=>{if(0!==eP.length){ek(!0);try{let e=eP.flatMap(e=>e.grades),t=(null==eR?void 0:eR.gradeClass)||"",r=await F(e,t,"school"===eX?"final":"mock");r.success?(er(r.message||"성적 저장이 완료되었습니다.","success"),eM([]),eT(null)):er(r.error||"성적 저장에 실패했습니다.","error")}catch(e){console.error("Grade upload error:",e),er((0,P.q)(e,"성적을 저장하는 중 오류가 발생했습니다. 잠시 후 다시 시도해 주세요."),"error")}finally{ek(!1)}}},tN=async e=>{eE(!0),await new Promise(e=>setTimeout(e,1500));try{let t=(await (0,M.DX)(e)).map(e=>({number:e.number,name:e.name,memo:e.memo,grade:e.grade,classNum:e.classNum,homeClassId:en,customClassIds:[],isValid:!0})).sort(tt);ev(t),eF(!1),e_(!0),eZ(!1)}catch(e){console.error(e),er("파일을 분석하는 중 오류가 발생했습니다.","error")}finally{eE(!1)}},tw=(0,a.useCallback)(e=>{e.preventDefault(),eN(!1);let t=e.dataTransfer.files[0];t&&tN(t)},[tN]),tk=(e,t,r)=>{ev(s=>{let a=[...s];return a[e]={...a[e],[t]:r},a}),eF(!0)},ty=async e=>{let t=eg[e];
1if(!t.name||!t.number){er("이름과 번호는 반드시 입력해야 합니다.","warning");return}try{let s=t.homeClassId||en,a={number:t.number,name:t.name,homeClassId:s,customClassIds:[],grade:t.grade||1,classNum:t.classNum||void 0,memo:t.memo};if(t.id)await ts.mutateAsync({id:t.id,...a}),er("학생 정보가 수정되었습니다.","success");else{let t=await tr.mutateAsync(a);if(t.success){var r;let s=(null===(r=t.data)||void 0===r?void 0:r.id)||t.id;s&&ev(t=>{let r=[...t];return r[e]={...r[e],id:s},r}),er("학생이 등록되었습니다.","success")}}eF(!1)}catch(e){console.error("Save error:",e),er("저장 중 오류가 발생했습니다.","error")}},tz=async e=>{var t,r;let s=eg[e];if(!(null==s?void 0:s.id)){ev(t=>t.filter((t,r)=>r!==e));return}let a=Y.find(e=>e.id===s.id),n=null!==(t=null==a?void 0:a.homeClassId)&&void 0!==t?t:null,l=null!==(r=null==a?void 0:a.customClassIds)&&void 0!==r?r:[],i=0===Array.from(new Set([n,...l].filter(e=>!!e))).filter(e=>e!==en).length;if(await ea(i?{title:"".concat(s.name," 학생을 삭제할까요?"),description:"이 학생은 다른 소속 학급이 없어 명단에서 완전히 사라집니다.",consequences:["성적 기록","출결 기록","상담 일지","세특\xb7행동특성","활동 기록","설문 응답"]}:{title:"'".concat(en,"' 학급에서 ").concat(s.name," 학생을 뺄까요?"),description:"다른 학급 소속은 그대로 유지됩니다.",confirmLabel:"학급에서 빼기",tone:"default"}))try{i?await ta.mutateAsync(s.id):await ts.mutateAsync({id:s.id,homeClassId:n===en?null:n,customClassIds:l.filter(e=>e!==en)}),ev(t=>t.filter((t,r)=>r!==e)),await ee(),er("학급에서 제거되었습니다.","success")}catch(e){console.error("Delete error:",e),er((0,P.q)(e,"삭제하는 중 오류가 발생했습니다. 잠시 후 다시 시도해 주세요."),"error")}};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:(0,N.cn)("w-full h-full bg-[#F7F7F5] [.dark_&]:bg-[#18181b] flex overflow-hidden",S&&"items-center justify-center p-8"),children:[(0,s.jsx)("input",{type:"file",ref:eB,accept:".xlsx,.xls,.csv",className:"hidden",onChange:e=>{var t;let r=null===(t=e.target.files)||void 0===t?void 0:t[0];r&&tN(r),e.target.value=""}}),!S&&!q&&(0,s.jsxs)("div",{className:"w-[240px] bg-[#F7F7F5] [.dark_&]:bg-[#18181b] border-r border-zinc-200 dark:border-[#27272a] flex flex-col shrink-0",children:[(0,s.jsx)("div",{className:"p-4 shrink-0",children:(0,s.jsx)("h2",{className:"text-[15px] font-bold text-white",children:"파일 업로드"})}),(0,s.jsxs)("div",{className:"px-2 flex flex-col gap-2",children:[(0,s.jsxs)("button",{onClick:()=>{K("student-list"),ev([]),e_(!1),eZ(!1)},className:(0,N.cn)("flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition text-left",R("student-list"===V)),children:[(0,s.jsx)(o.Z,{size:18}),"학생 명단"]}),(0,s.jsxs)("button",{onClick:()=>{K("grade-file"),ev([]),e_(!1),eZ(!1)},className:(0,N.cn)("flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition text-left",R("grade-file"===V)),children:[(0,s.jsx)(x.Z,{size:18}),"성적 파일"]})]})]}),!S&&"student-list"===V&&(0,s.jsxs)("div",{className:"w-[240px] bg-[#F7F7F5] [.dark_&]:bg-[#18181b] border-r border-zinc-200 dark:border-[#27272a] flex flex-col shrink-0 animate-in slide-in-from-left-5 duration-200",children:[(0,s.jsx)("div",{className:"p-4 flex items-center justify-between shrink-0",children:(0,s.jsxs)("h2",{className:"text-[15px] font-medium text-white flex items-center gap-2",children:[(0,s.jsx)(u.Z,{size:18}),"나의 교실"]})}),(0,s.jsxs)("div",{className:"flex-1 overflow-y-auto px-2 flex flex-col custom-scrollbar",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 mb-2 px-1",children:[(0,s.jsx)("p",{className:"text-[11px] font-medium text-zinc-400 dark:text-zinc-500 uppercase tracking-wide whitespace-nowrap",children:"담임 학급"}),(0,s.jsx)("div",{className:"flex-1 h-px bg-zinc-200 dark:bg-[#3f3f46]"})]}),U.filter(e=>"담임 학급"===e).map(e=>{let t=Y.filter(t=>{var r;return t.homeClassId===e||(null===(r=t.customClassIds)||void 0===r?void 0:r.includes(e))}).length,r=en===e;return(0,s.jsxs)("div",{className:(0,N.cn)("w-full flex items-center justify-between px-3 py-2.5 rounded-lg text-sm font-normal transition group cursor-pointer",R(r)),onClick:()=>
1{el(e),e_(!1),eZ(!1),ev(Y.filter(t=>{var r;return t.homeClassId===e||(null===(r=t.customClassIds)||void 0===r?void 0:r.includes(e))}).map(e=>({...e,isValid:!0})).sort(tt))},children:[(0,s.jsx)("span",{className:"truncate",children:e}),(0,s.jsxs)("span",{className:T(r),children:[t,"명"]})]},e)}),(0,s.jsxs)("div",{className:"flex items-center gap-2 my-2 px-1",children:[(0,s.jsx)("p",{className:"text-[11px] font-medium text-zinc-400 dark:text-zinc-500 uppercase tracking-wide whitespace-nowrap",children:"교과 학급"}),(0,s.jsx)("div",{className:"flex-1 h-px bg-zinc-200 dark:bg-[#3f3f46]"})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,s.jsx)(j.M,{axis:"y",values:ep,onReorder:e=>{ef(e),eb.current&&clearTimeout(eb.current),eb.current=setTimeout(async()=>{try{await et(e)}catch(e){console.error("Failed to update class order",e),er("순서 변경에 실패했습니다.","error")}},500)},className:"flex flex-col gap-1",children:ep.map(e=>{let t=Y.filter(t=>{var r;return t.homeClassId===e||(null===(r=t.customClassIds)||void 0===r?void 0:r.includes(e))}).length,r=en===e,a=ex===e;return(0,s.jsx)(W,{cls:e,isActive:r,isEditing:a,count:t,editClassInput:em,setEditClassInput:eh,setEditingClass:eu,handleRenameClass:to,onClick:()=>{el(e),e_(!1),eZ(!1),ev(Y.filter(t=>{var r;return t.homeClassId===e||(null===(r=t.customClassIds)||void 0===r?void 0:r.includes(e))}).map(e=>({...e,isValid:!0})).sort(tt))}},e)})}),ei?(0,s.jsx)("form",{onSubmit:e=>{e.preventDefault(),ec.trim()&&(H(ec.trim()),el(ec.trim()),ev([]),e_(!1),eZ(!1),eo(""),ed(!1))},className:"px-1 py-1",children:(0,s.jsx)("input",{autoFocus:!0,value:ec,onChange:e=>eo(e.target.value),placeholder:"반 이름 입력 후 Enter",className:"w-full px-2 py-1.5 text-sm bg-black/20 border border-[#3f3f46] rounded focus:outline-none focus:border-blue-500 text-white",onBlur:()=>!ec&&ed(!1)})}):(0,s.jsx)("div",{className:"px-1 py-1 mt-1",children:(0,s.jsxs)("button",{onClick:()=>ed(!0),className:"flex items-center justify-center gap-2 w-full py-2 rounded-full border border-dashed border-zinc-300 dark:border-[#3f3f46] text-zinc-500 dark:text-[#a1a1aa] hover:text-zinc-900 dark:hover:text-white hover:border-zinc-400 dark:hover:border-[#52525b] hover:bg-zinc-100 dark:hover:bg-[#202023] transition text-[13px] font-medium",children:[(0,s.jsx)(m.Z,{size:14}),(0,s.jsx)("span",{children:"교과 학급 추가"})]})})]})]})]}),!S&&"grade-file"===V&&(0,s.jsxs)("div",{className:"w-[240px] bg-[#F7F7F5] [.dark_&]:bg-[#18181b] border-r border-zinc-200 dark:border-[#27272a] flex flex-col shrink-0 animate-in slide-in-from-left-5 duration-200",children:[(0,s.jsx)("div",{className:"p-4 flex items-center justify-between shrink-0",children:(0,s.jsx)("h2",{className:"text-[15px] font-medium text-white flex items-center gap-2",children:"성적 종류(고등학교 전용)"})}),(0,s.jsxs)("div",{className:"flex-1 overflow-y-auto px-2 flex flex-col gap-2 custom-scrollbar",children:[(0,s.jsx)("button",{onClick:()=>eG("school"),className:(0,N.cn)("w-full flex items-center justify-between px-3 py-2.5 rounded-lg text-sm font-normal transition group",R("school"===eX)),children:(0,s.jsx)("span",{className:"truncate",children:"내신 성적"})}),(0,s.jsx)("button",{onClick:()=>eG("mock"),className:(0,N.cn)("w-full flex items-center justify-between px-3 py-2.5 rounded-lg text-sm font-normal transition group",R("mock"===eX)),children:(0,s.jsx)("span",{className:"truncate",children:"모의고사 성적"})}),(0,s.jsx)("button",{onClick:()=>eG("midterm"),className:(0,N.cn)("w-full flex items-center justify-between px-3 py-2.5 rounded-lg text-sm font-normal transition group",R("midterm"===eX)),children:(0,s.jsx)("span",{className:"truncate",children:"중간고사 성적"})}),(0,s.jsx)("button",{onClick:()=>eG("record"),className:(0,N.cn)("w-full flex items-center justify-between px-3 py-2.5 rounded-lg text-sm font-normal transition group",R("record"===eX)),children:(0,s.jsx)("span",{className:"truncate",children:"생활기록부"})})]})]}),(0,s.jsxs)("div",{className:(0,N.cn)("flex-1 flex flex-col relative bg-[#F7F7F5] [.dark_&]:bg-[#18181b] overflow-hidden",S&&"w-full  max-w-2xl h-[600px] border border-[#27272a] rounded-2xl flex-none shadow-2xl"),children:[v&&(0,s.jsx)("button",{"aria-label":"닫기",onClick:v,className:"absolute top-4 right-4 p-1.5 text-[#a1a1aa] hover:text-white hover:bg-[#
1EBEBEA] [.dark_&]:hover:bg-[#202023] rounded-lg transition-colors z-10",children:(0,s.jsx)(h.Z,{size:16})}),"student-list"===V&&(0,s.jsxs)("div",{className:"absolute top-4 right-14 flex items-center gap-2 z-10",children:[eA&&eg.length>0&&(0,s.jsx)("button",{onClick:()=>{ev([]),eF(!1),e_(!1),eZ(!0),eB.current&&(eB.current.value="")},disabled:ew,className:"px-3 py-1.5 text-xs text-zinc-500 dark:text-white/50 hover:text-zinc-900 dark:hover:text-white transition-colors disabled:opacity-50 disabled:cursor-not-allowed",children:"취소"}),eg.length>0&&(eS||eg.some(e=>!e.id))&&(0,s.jsxs)("button",{onClick:td,disabled:ew,className:"px-3 py-1.5 text-xs text-white bg-blue-600 hover:bg-blue-700 rounded-md transition-colors font-medium flex items-center gap-1.5 disabled:opacity-50 global-save-btn",children:[(0,s.jsx)(d.Z,{size:12}),(0,s.jsx)("span",{children:ew?(0,s.jsx)(z.W,{size:18,className:"text-white"}):"전체 저장"})]}),0===eg.length&&(0,s.jsxs)("button",{onClick:M.RM,className:"flex items-center gap-1.5 px-2 py-1.5 text-xs !text-white bg-green-600 hover:bg-green-700 rounded-md transition-colors font-medium",children:[(0,s.jsx)(p.Z,{size:13}),"양식 다운로드"]}),"담임 학급"!==en&&(0===eg.length||(null===(t=eg[0])||void 0===t?void 0:t.id))&&(0,s.jsxs)("button",{onClick:()=>{"담임 학급"!==en&&eI(en)},className:"px-2 py-1.5 text-xs text-white bg-red-600 hover:bg-red-700 rounded-md transition-colors font-medium flex items-center gap-1.5 delete-class-btn",children:[(0,s.jsx)("span",{children:"교실 삭제"}),(0,s.jsx)(c.Z,{size:12})]}),"담임 학급"===en&&eg.length>0&&(null===(l=eg[0])||void 0===l?void 0:l.id)&&(0,s.jsxs)("button",{onClick:()=>ez(!0),className:"px-2 py-1.5 text-xs text-white bg-red-600 hover:bg-red-700 rounded-md transition-colors font-medium flex items-center gap-1.5 delete-all-btn",children:[(0,s.jsx)("span",{children:ew?(0,s.jsx)(z.W,{size:18,className:"text-white"}):"전체 삭제"}),!ew&&(0,s.jsx)(c.Z,{size:12})]})]}),"grade-file"===V&&"school"===eX&&(0,s.jsxs)("div",{className:"absolute top-4 right-14 flex items-center gap-2 z-10",children:[(0,s.jsxs)("button",{onClick:()=>e0({examType:"final",gradeLevel:"",semester:""}),className:"px-3 py-1.5 text-xs text-red-500 hover:text-red-600 dark:text-red-400 dark:hover:text-red-300 transition-colors flex items-center gap-1.5",children:[(0,s.jsx)(c.Z,{size:12}),"이전 성적 삭제"]}),eP.length>0&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("button",{onClick:()=>{eM([]),eT(null)},className:"px-3 py-1.5 text-xs text-zinc-500 dark:text-white/50 hover:text-zinc-900 dark:hover:text-white transition-colors",children:"취소"}),(0,s.jsxs)("button",{onClick:tj,disabled:ew,className:"px-3 py-1.5 bg-[#007AFF] hover:bg-[#0069d9] text-white text-xs font-bold rounded-lg flex items-center gap-2 transition disabled:opacity-50 grade-upload-btn min-w-[100px] justify-center",children:[ew?(0,s.jsx)(z.W,{size:18,className:"text-white"}):"".concat(eP.filter(e=>e.studentId).length,"명 성적 저장"),!ew&&(0,s.jsx)(f.Z,{size:16})]})]})]}),"grade-file"===V&&"midterm"===eX&&(0,s.jsxs)("div",{className:"absolute top-4 right-14 flex items-center gap-2 z-10",children:[(0,s.jsxs)("button",{onClick:()=>e0({examType:"midterm",gradeLevel:"",semester:""}),className:"px-3 py-1.5 text-xs text-red-500 hover:text-red-600 dark:text-red-400 dark:hover:text-red-300 transition-colors flex items-center gap-1.5",children:[(0,s.jsx)(c.Z,{size:12}),"이전 성적 삭제"]}),eU.length>0&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("button",{onClick:()=>{eY([]),eJ(null)},className:"px-3 py-1.5 text-xs text-zinc-500 dark:text-white/50 hover:text-zinc-900 dark:hover:text-white transition-colors",children:"취소"}),(0,s.jsxs)("button",{onClick:tm,disabled:ew,className:"px-3 py-1.5 bg-[#007AFF] hover:bg-[#0069d9] text-white text-xs font-bold rounded-lg flex items-center gap-2 transition disabled:opacity-50 min-w-[100px] justify-center",children:[ew?(0,s.jsx)(z.W,{size:18,className:"text-white"}):"".concat(eU.filter(e=>e.studentId).length,"명 성적 저장"),!ew&&(0,s.jsx)(f.Z,{size:16})]})]})]}),"grade-file"===V&&"mock"===eX&&(0,s.jsxs)("div",{className:"absolute top-4 right-14 flex items-center gap-2 z-10",children:[(0,s.jsxs)("button",{onClick:()=>e2({year:"",month:""}),className:"px-3 py-1.5 text-xs text-red-500 hover:text-red-600 dark:text-red-400 dark:hover:text-red-300 transition-colors flex items-center gap-1.5",children:[(0,s.jsx)(c.Z,{size:12}),"이전 성적 삭제"]}),eV&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("button",{onClick:()=>eK(null),className:"px-3 py-1.5 text-xs text-zinc-500 dark:text-white/50 hover:text-zinc-900 dark:hover:text-white transition-colors",children:"취소"}),(0,s.jsxs)("button",{onClick:tb,disabled:ew,className:"px-3 py-1.5 bg-[#007AFF] hover:bg-[#0069d9] text-white text-xs font-bold rounded-lg flex items-center gap-2 transition disabled:opacity-50 mock-exam-upload-btn min-w-[100px] justify-center",children:[ew?(0,s.jsx)(z.W,{size:18,className:"text-white"}):"".concat(eV.students.length,"명 성적 저장"),!ew&&(0,s.jsx)(f.Z,{size:16})]})]})]}),(0,s.jsxs)("div",{className:"flex-1 p-4 flex flex-col overflow-hidden",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between mb-4 pr-12",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h3",{className:"text-[15px] font-medium text-zinc-900 dark:text-white",children:"student-list"===V?"".concat(en," 학생 등록"):"school"===eX?"내신 성적 파일 업로드":"mock"===eX?"모의고사 성적 파일 업로드":"midterm"===eX?"중간고사 성적 파일 업로드":"생활기록부 파일 업로드"}),"grade-file"===V&&(0,s.jsxs)(s.Fragment,{children:["school"===eX&&eR&&(0,s.jsxs)("p",{className:"text-xs text-zinc-500 dark:text-[#71717a] mt-1",children:[eR.gradeClass," \xb7 ",eR.totalRecords,"개 성적"]}),"mock"===eX&&eV&&(0,s.jsxs)("p",{className:"text-xs text-zinc-500 dark:text-[#71717a] mt-1",children:[(null===(i=eV.meta.test_date)||void 0===i?void 0:i.split("-")[0])||"2025","년 ",(null===(g=eV.meta.test_date)||void 0===g?void 0:g.split("-")[1])||"3","월 \xb7 ",eV.meta.grade,"학년 ",eV.meta.class_no?"".concat(eV.meta.class_no,"반"):""," \xb7 ",eV.students.length,"명"]}),"midterm"===eX&&eH&&(0,s.jsxs)("p",{className:"text-xs text-zinc-500 dark:text-[#71717a] mt-1",children:[eH.gradeClass," \xb7 전교 ",eH.totalStudents,"명 중 매칭 ",eU.filter(e=>e.studentId).length,"명 \xb7 ",eH.totalRecords,"개 성적"]})]})]}),"grade-file"===V&&"record"===eX&&e4&&(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("button",{onClick:()=>e7(null),className:"px-3 py-1.5 text-xs text-zinc-500 dark:text-white/50 hover:text-zinc-900 dark:hover:text-white transition-colors",children:"취소"}),(0,s.jsxs)("button",{onClick:()=>tf(),disabled:ew||eD,className:"px-3 py-1.5 bg-[#007AFF] hover:bg-[#0069d9] text-white text-xs font-bold rounded-lg flex items-center gap-2 transition disabled:opacity-50 record-upload-btn min-w-[120px] justify-center",children:[ew?(0,s.jsx)(z.W,{size:18,className:"text-white"}):"생활기록부 저장",!ew&&(0,s.jsx)(f.Z,{size:16})]})]})]}),"student-list"===V?0===eg.length?(0,s.jsx)(s.Fragment,{children:(0,s.jsxs)("div",{className:"flex-1 flex flex-col animate-in fade-in duration-300",children:[(0,s.jsxs)("div",{className:"text-[13px] text-zinc-500 dark:text-zinc-400 mb-3 leading-relaxed",children:["학번, 이름 열이 포함된 엑셀 파일ì
1„ 업로드하세요. ",(0,s.jsx)("br",{}),(0,s.jsx)("span",{className:"text-xs text-zinc-400",children:"필수 열: [학번, 이름] 또는 [학년, 반, 번호, 이름]"})]}),(0,s.jsx)("div",{className:(0,N.cn)("flex-1 border-2 border-dashed rounded-xl flex flex-col items-center justify-center gap-4 transition cursor-pointer group bg-zinc-50/50 dark:bg-[#202023]/30 outline-none",ej?"border-[#2883DE] bg-[#2883DE]/10":"border-[#3f3f46]/50 hover:border-[#71717a] hover:bg-[#EBEBEA] [.dark_&]:hover:bg-[#202023] focus:border-[#2883DE] focus:bg-[#2883DE]/5"),tabIndex:0,onPaste:e=>{e.preventDefault();let t="",r="";if("clipboardData"in e?(t=e.clipboardData.getData("text/html"),r=e.clipboardData.getData("text")):r=e.target.value,!r&&!t)return;let s=[],a=e=>{let t=e.map(e=>e.trim()).filter(e=>""!==e);if(0===t.length)return null;let r={number:0,name:"",grade:void 0,classNum:void 0,memo:"",isValid:!0,id:void 0};if(t.length>=4){let e=parseInt(t[0]),s=parseInt(t[1]),a=parseInt(t[2]);if(!isNaN(e)&&!isNaN(s)&&!isNaN(a))return r.grade=e,r.classNum=s,r.number=a,r.name=t[3],t[4]&&(r.memo=t.slice(4).join(" ")),r}if(2===t.length){let e=(0,L.T)(t[0]);if(e)return r.grade=e.grade,r.classNum=e.classNum,r.number=e.number,r.name=t[1],r}if(2===t.length){let e=parseInt(t[0]);if(!isNaN(e))return r.number=e,r.name=t[1],r}if(3===t.length){let e=parseInt(t[0]);if(!isNaN(e))return r.number=e,r.name=t[1],r.memo=t[2],r}return null},n=e=>{let t=a(e);return!!t&&(t.classNum||"담임 학급"===en||isNaN(parseInt(en))||(t.classNum=parseInt(en)),s.push(t),!0)};if(t){let e=new DOMParser().parseFromString(t,"text/html").querySelectorAll("tr");e.length>0&&e.forEach(e=>{n(Array.from(e.querySelectorAll("td, th")).map(e=>e.textContent||""))})}0===s.length&&r&&r.trim().split(/\r?\n/).forEach(e=>{if(!e.trim()||e.includes("	")&&n(e.split("	")))return;let t=e.trim().split(/\s+/);t.length>=2&&n(t)}),s.length>0?(ev(e=>[...e,...s].sort(tt)),er("".concat(s.length,"명을 붙여넣었습니다."),"success")):(t||r)&&er("붙여넣은 내용을 알아보지 못했습니다. [학번, 이름] 또는 [학년, 반, 번호, 이름] 순서인지 확인해 주세요.","warning")},onClick:()=>{var e;return!eD&&(null===(e=eB.current)||void 0===e?void 0:e.click())},onDragOver:e=>{e.preventDefault(),eD||eN(!0)},onDragLeave:()=>eN(!1),onDrop:tw,children:eD?(0,s.jsxs)("div",{className:"flex flex-col items-center gap-3 animate-in fade-in duration-300",children:[(0,s.jsx)(z.W,{size:48}),(0,s.jsx)("p",{className:"text-sm text-zinc-500 font-medium animate-pulse",children:"파일 확인 중..."})]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(C.w,{src:"/lordicons/wired-outline-92-file-upload-hover-swipe.json",size:40,target:".group",playOnMount:!0,className:(0,N.cn)("mb-2 transition-colors",ej?"text-[#2883DE]":"text-zinc-400 dark:text-zinc-500 group-hover:text-zinc-600 dark:group-hover:text-zinc-300")},"student-list-drop-".concat(V)),(0,s.jsxs)("div",{className:"text-center",children:[(0,s.jsx)("p",{className:"text-zinc-900 dark:text-white font-medium mb-1",children:"학생 명단 파일 업로드"}),(0,s.jsx)("p",{className:"text-sm text-zinc-400",children:"엑셀 파일(.xlsx) 업로드"})]})]})})]})}):(0,s.jsx)(s.Fragment,{children:(0,s.jsxs)("div",{className:"flex-1 flex flex-col overflow-hidden",children:[(0,s.jsx)("div",{className:"px-1 pt-0 pb-2 text-left shrink-0",children:(0,s.jsx)("p",{className:"text-xs text-zinc-400",children:"오류가 있다면 아래의 표에서 직접 수정할 수 있습니다."})}),(0,s.jsxs)("div",{className:"flex-1 overflow-auto bg-transparent dark:bg-[#18181b] relative",children:[(0,s.jsxs)("table",{className:"w-full text-sm",children:[(0,s.jsx)("thead",{className:"sticky top-0 bg-[#F7F7F5] [.dark_&]:bg-[#18181b] z-50 font-medium shadow-sm",children:(0,s.jsxs)("tr",{className:"text-zinc-500 dark:text-[#71717a] text-center border-b border-zinc-200 dark:border-[#27272a]",children:[(0,s.jsx)("th",{className:"py-2 px-1 w-[15%]",children:"학년"}),(0,s.jsx)("th",{className:"py-2 px-1 w-[15%]",children:"반"}),(0,s.jsx)("th",{className:"py-2 px-1 w-[15%]",children:"번호"}),(0,s.jsx)("th",{className:"py-2 px-1",children:"이름"}),(0,s.jsx)("th",{className:"py-2 px-1 w-[80px]"})]})}),(0,s.jsx)("tbody",{children:eg.map((e,t)=>(0,s.jsxs)("tr",{className:"border-b border-zinc-100 dark:border-[#27272a]/50 text-zinc-900 dark:text-white group/row hover:bg-amber-50/50 dark:hover:bg-[#202023]/30 transition-colors",children:[(0,s.jsx)("td",{className:"p-1",children:(0,s.jsx)("input",{type:"number",className:"w-full text-center bg-transparent focus:bg-white dark:focus:bg-[#27272a] rounded p-1.5 outline-none text-zinc-900 dark:text-zinc-200 focus:shadow-sm transition [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",value:e.grade||"",placeholder:"-",onChange:e=>tk(t,"grade",parseInt(e.target.value)||void 0)})}),(0,s.jsx)("td",{className:"p-1",children:(0,s.jsx)("input",{type:"number",className:"w-full text-center bg-transparent focus:bg-white dark:focus:bg-[#27272a] rounded p-1.5 outline-none text-zinc-900 dark:text-zinc-200 focus:shadow-sm transition [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",value:e.classNum||"",placeholder:"-",onChange:e=>tk(t,"classNum",parseInt(e.target.value)||void 0)})}),(0,s.jsx)("td",{className:"p-1",children:(0,s.jsx)("input",{type:"number",className:"w-full text-center bg-transparent focus:bg-white dark:focus:bg-[#27272a] rounded p-1.5 outline-none font-medium text-zinc-900 dark:text-zinc-200 focus:shadow-sm transition [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",value:e.number||"",onChange:e=>tk(t,"number",parseInt(e.target.value)||0)})}),(0,s.jsx)("td",{className:"p-1",children:(0,s.jsx)("input",{type:"text",className:"w-full text-center bg-transparent focus:bg-white dark:focus:bg-[#27272a] rounded p-1.5 outline-none text-zinc-900 dark:text-zinc-200 focus:shadow-sm transition",value:e.name,onChange:e=>tk(t,"name",e.target.value)})}),(0,s.jsx)("td",{className:"p-1 text-center",children:(0,s.jsxs)("div",{className:"flex items-center justify-center gap-1 opacity-0 group-hover/row:opacity-100 transition-opacity",children:[(0,s.jsx)("button",{onClick:()=>ty(t),className:"p-1.5 text-zinc-400 hover:text-emerald-500 hover:bg-emerald-50 dark:hover:bg-emerald-500/10 rounded transition",title:"저장",children:(0,s.jsx)(d.Z,{size:14})}),(0,s.jsx)("button",{onClick:()=>tz(t),className:"p-1.5 text-zinc-300 hover:text-red-500 hover:bg-red-50 dark:hover:bg-red-500/10 rounded transition",title:"삭제",children:(0,s.jsx)(c.Z,{size:14})})]})})]},t))})]}),(0,s.jsx)("div",{className:"p-2 border-t border-dashed border-zinc-200 dark:border-[#27272a] text-center",children:(0,s.jsx)("button",{onClick:()=>{ev(e=>[...e,{grade:void 0,classNum:void 0,number:0,name:"",memo:"",isValid:!0,id:void 0}]),eF(!0)},className:"w-full py-2 text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 hover:bg-zinc-50 dark:hover:bg-[#202023] rounded-lg border border-transparent hover:border-zinc-200 dark:hover:border-[#3f3f46] border-dashed transition",children:"+ 빈 행 추가하기"})})]})]})}):(()=>
1{if("midterm"===eX){if(eU.length>0){let e=eU.filter(e=>e.studentId),t=eU.filter(e=>!e.studentId);return(0,s.jsx)("div",{className:"flex-1 flex flex-col overflow-hidden",children:(0,s.jsx)("div",{className:"flex-1 overflow-auto bg-transparent relative custom-scrollbar",children:(0,s.jsxs)("table",{className:"w-full text-sm",children:[(0,s.jsx)("thead",{className:"sticky top-0 bg-[#F7F7F5] [.dark_&]:bg-[#18181b] z-50 font-medium shadow-sm",children:(0,s.jsxs)("tr",{className:"text-zinc-500 dark:text-[#71717a] text-center border-b border-zinc-200 dark:border-[#27272a]",children:[(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium w-12",children:"반"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium w-12",children:"번호"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium text-center",children:"이름"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium w-20 text-center",children:"과목수"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium w-20 text-center",children:"상태"})]})}),(0,s.jsxs)("tbody",{className:"text-xs",children:[e.map((e,t)=>(0,s.jsxs)("tr",{className:"border-b border-zinc-100 dark:border-[#27272a]/50 text-zinc-900 dark:text-white group/row hover:bg-amber-50/50 dark:hover:bg-[#202023]/30 transition-colors",children:[(0,s.jsx)("td",{className:"py-2.5 px-2 text-center text-zinc-500 dark:text-zinc-400",children:e.currentClass}),(0,s.jsx)("td",{className:"py-2.5 px-2 text-center text-zinc-500 dark:text-zinc-400",children:e.studentNumber}),(0,s.jsx)("td",{className:"py-2.5 px-2 font-medium text-center",children:e.studentName}),(0,s.jsx)("td",{className:"py-2.5 px-2 text-center text-zinc-500 dark:text-zinc-400",children:e.grades.length}),(0,s.jsx)("td",{className:"py-2.5 px-2 text-center",children:(0,s.jsx)("span",{className:"text-green-500 text-xs",children:"매칭됨"})})]},"m-".concat(t))),t.length>0&&(0,s.jsx)("tr",{className:"bg-zinc-50 dark:bg-white/[0.03]",children:(0,s.jsxs)("td",{colSpan:5,className:"py-2 px-3 text-xs text-zinc-400",children:["미매칭 학생 ",t.length,"명 (저장되지 않음)"]})})]})]})})})}return(0,s.jsxs)("div",{className:"flex-1 flex flex-col",children:[(0,s.jsxs)("div",{className:"text-[13px] text-zinc-900 dark:text-zinc-400 mb-3 flex flex-col gap-1 text-left leading-relaxed",children:[(0,s.jsx)("p",{children:"중간고사 성적 파일은 평가 담당 선생님께서 다운로드 가능합니다."}),(0,s.jsxs)("p",{children:["경로: 나이스 - 성적조회/통계 - 학기말 성적 조회 - 성적일람표 전과목/전학생 -",(0,s.jsx)("br",{}),(0,s.jsx)("span",{className:"ml-[30px]",children:"'한 페이지로 출력' 체크 - 저장 - XLS"})]})]}),(0,s.jsxs)("div",{className:(0,N.cn)("flex-1 border-2 border-dashed rounded-xl flex flex-col items-center justify-center gap-4 transition cursor-pointer group",ej?"border-[#2883DE] bg-[#2883DE]/10":"border-[#3f3f46] hover:border-[#71717a] hover:bg-[#EBEBEA] [.dark_&]:hover:bg-[#202023]"),onClick:()=>{var e;return!eD&&(null===(e=e$.current)||void 0===e?void 0:e.click())},onDragOver:e=>{e.preventDefault(),eD||eN(!0)},onDragLeave:()=>eN(!1),onDrop:e=>{var t;e.preventDefault(),eN(!1);let r=null===(t=e.dataTransfer.files)||void 0===t?void 0:t[0];r&&tu(r)},children:[eD?(0,s.jsxs)("div",{className:"flex flex-col items-center gap-3 animate-in fade-in duration-300",children:[(0,s.jsx)(z.W,{size:64}),(0,s.jsx)("p",{className:"text-sm text-zinc-500 font-medium animate-pulse",children:"파일 확인 중..."})]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(C.w,{src:"/lordicons/wired-outline-92-file-upload-hover-swipe.json",size:40,target:".group",playOnMount:!0,className:(0,N.cn)("mb-2 transition-colors",ej?"text-[#2883DE]":"text-zinc-400 dark:text-zinc-500 group-hover:text-zinc-600 dark:group-hover:text-zinc-300")},"midterm-drop-".concat(eX)),(0,s.jsx)("div",{className:"text-center",children:(0,s.jsxs)("p",{className:"text-zinc-900 dark:text-white font-medium mb-1",children:["중간고사 성적 일람표",(0,s.jsx)("br",{}),"엑셀(.xlsx) 업로드"]})})]}),(0,s.jsx)("input",{type:"file",ref:e$,accept:".xlsx,.xls",className:"hidden",onChange:e=>{var t;let r=null===(t=e.target.files)||void 0===t?void 0:t[0];r&&tu(r),e.target.value=""}})]})]})}return"mock"===eX?eV?(0,s.jsx)("div",{className:"flex-1 flex flex-col overflow-hidden",children:(0,s.jsx)("div",{className:"flex-1 overflow-auto bg-transparent relative custom-scrollbar",children:(0,s.jsxs)("table",{className:"w-full text-sm",children:[(0,s.jsx)("thead",{className:"sticky top-0 bg-[#F7F7F5] [.dark_&]:bg-[#18181b] z-50 font-medium shadow-sm",children:(0,s.jsxs)("tr",{className:"text-zinc-500 dark:text-[#71717a] text-center border-b border-zinc-200 dark:border-[#27272a]",children:[(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium w-16",children:"번호"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium text-center",children:"이름"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium text-center w-24",children:"과목수"})]})}),(0,s.jsx)("tbody",{className:"text-xs",children:eV.students.map((e,t)=>{let r=[e.kor_grade,e.math_grade,e.eng_grade,e.hist_grade,e.inq1_grade,e.inq2_grade].filter(e=>null!==e).length;return(0,s.jsxs)("tr",{className:"border-b border-zinc-100 dark:border-[#27272a]/50 text-zinc-900 dark:text-white group/row hover:bg-amber-50/50 dark:hover:bg-[#202023]/30 transition-colors",children:[(0,s.jsx)("td",{className:"py-2.5 px-2 text-center text-zinc-500 dark:text-zinc-400",children:e.student_no}),(0,s.jsx)("td",{className:"py-2.5 px-2 font-medium text-center",children:e.name}),(0,s.jsx)("td",{className:"py-2.5 px-2 text-center text-zinc-500 dark:text-zinc-400",children:r})]},t)})})]})})}):(0,s.jsxs)("div",{className:"flex-1 flex flex-col",children:[(0,s.jsx)("div",{className:"text-[13px] text-zinc-900 dark:text-zinc-400 mb-3 flex flex-col gap-1 text-left leading-relaxed",children:(0,s.jsx)("p",{children:"경로: 시험업무지원포털(www.csat.re.kr) - 성적출력 - 성적일람표"})}),(0,s.jsxs)("div",{className:(0,N.cn)("flex-1 border-2 border-dashed rounded-xl flex flex-col items-center justify-center gap-4 transition cursor-pointer group",ej?"border-[#2883DE] bg-[#2883DE]
1/10":"border-[#3f3f46] hover:border-[#71717a] hover:bg-[#EBEBEA] [.dark_&]:hover:bg-[#202023]"),onClick:()=>{var e;return!eD&&(null===(e=eO.current)||void 0===e?void 0:e.click())},onDragOver:e=>{e.preventDefault(),eD||eN(!0)},onDragLeave:()=>eN(!1),onDrop:e=>{var t;e.preventDefault(),eN(!1);let r=null===(t=e.dataTransfer.files)||void 0===t?void 0:t[0];r&&th(r)},children:[eD?(0,s.jsxs)("div",{className:"flex flex-col items-center gap-3 animate-in fade-in duration-300",children:[(0,s.jsx)(z.W,{size:64}),(0,s.jsx)("p",{className:"text-sm text-zinc-500 font-medium animate-pulse",children:"파일 확인 중..."})]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(C.w,{src:"/lordicons/wired-outline-92-file-upload-hover-swipe.json",size:40,target:".group",playOnMount:!0,className:(0,N.cn)("mb-2 transition-colors",ej?"text-[#2883DE]":"text-zinc-400 dark:text-zinc-500 group-hover:text-zinc-600 dark:group-hover:text-zinc-300")},"mock-drop-".concat(eX)),(0,s.jsx)("div",{className:"text-center",children:(0,s.jsxs)("p",{className:"text-zinc-900 dark:text-white font-medium mb-1",children:["모의고사 학급별 성적일람표",(0,s.jsx)("br",{}),"PDF 업로드"]})})]}),(0,s.jsx)("input",{type:"file",ref:eO,accept:".pdf",className:"hidden",onChange:e=>{var t;let r=null===(t=e.target.files)||void 0===t?void 0:t[0];r&&th(r),e.target.value=""}})]})]}):"record"===eX?ew?(0,s.jsxs)("div",{className:"flex-1 flex flex-col items-center justify-center gap-6 animate-in fade-in duration-500",children:[(0,s.jsx)(z.W,{size:80}),(0,s.jsxs)("div",{className:"text-center space-y-2",children:[(0,s.jsx)("p",{className:"text-zinc-900 dark:text-white font-semibold text-lg text-pretty",children:"AI가 열심히 분석중이에요."}),(0,s.jsx)("p",{className:"text-[13px] text-zinc-500 dark:text-zinc-400 leading-relaxed text-pretty",children:"창을 닫고 1~2분 뒤 학생 관리 페이지에서 확인해 보세요."})]})]}):e4?null:(0,s.jsxs)("div",{className:"flex-1 flex flex-col",children:[(0,s.jsx)("div",{className:"text-[13px] text-zinc-900 dark:text-zinc-400 mb-3 flex justify-start",children:(0,s.jsxs)("div",{className:"flex gap-1.5 text-left leading-relaxed",children:[(0,s.jsx)("span",{className:"shrink-0",children:"경로:"}),(0,s.jsxs)("div",{className:"flex flex-col",children:[(0,s.jsx)("span",{children:"나이스 - 학급담임 - 학교생활기록부 - 학생부 조회 및 출력 -"}),(0,s.jsx)("span",{children:"학생부II 선택 - PDF로 저장"})]})]})}),(0,s.jsxs)("div",{className:(0,N.cn)("flex-1 border-2 border-dashed rounded-xl flex flex-col items-center justify-center gap-4 transition cursor-pointer group",ej?"border-[#2883DE] bg-[#2883DE]/10":"border-[#3f3f46] hover:border-[#71717a] hover:bg-[#EBEBEA] [.dark_&]:hover:bg-[#202023]"),onClick:()=>{var e;return null===(e=eq.current)||void 0===e?void 0:e.click()},onDragOver:e=>{e.preventDefault(),eN(!0)},onDragLeave:()=>eN(!1),onDrop:e=>{var t;e.preventDefault(),eN(!1);let r=null===(t=e.dataTransfer.files)||void 0===t?void 0:t[0];r&&tp(r)},children:[eD?(0,s.jsxs)("div",{className:"flex flex-col items-center gap-3 animate-in fade-in duration-300",children:[(0,s.jsx)(z.W,{size:64}),(0,s.jsx)("p",{className:"text-sm text-zinc-500 font-medium animate-pulse",children:"파일 확인 중..."})]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(C.w,{src:"/lordicons/wired-outline-92-file-upload-hover-swipe.json",size:40,target:".group",playOnMount:!0,className:(0,N.cn)("mb-2 transition-colors",ej?"text-[#2883DE]":"text-zinc-400 dark:text-zinc-500 group-hover:text-zinc-600 dark:group-hover:text-zinc-300")},"record-drop-".concat(eX)),(0,s.jsx)("div",{className:"text-center",children:(0,s.jsxs)("p",{className:"text-zinc-900 dark:text-white font-medium mb-1",children:["학생 개인별",(0,s.jsx)("br",{}),"생활기록부 PDF 업로드"]})})]}),(0,s.jsx)("input",{type:"file",ref:eq,accept:".pdf",className:"hidden",onChange:async e=>{var t;let r=null===(t=e.target.files)||void 0===t?void 0:t[0];r&&tp(r),e.target.value=""}})]})]}):0===eP.length?(0,s.jsxs)("div",{className:"flex-1 flex flex-col",children:[(0,s.jsx)("div",{className:"text-[13px] text-zinc-900 dark:text-zinc-400 mb-3 flex justify-start",children:(0,s.jsxs)("div",{className:"flex gap-1.5 text-left leading-relaxed",children:[(0,s.jsx)("span",{className:"shrink-0",children:"경로:"}),(0,s.jsxs)("div",{className:"flex flex-col",children:[(0,s.jsx)("span",{children:"나이스 - 학급담임 - 학교생활기록부 -"}),(0,s.jsx)("span",{children:"학생부 항목별 조회 - 교과학습발달상황 - 저장 - XLS data"})]})]})}),(0,s.jsxs)("div",{className:(0,N.cn)("flex-1 border-2 border-dashed rounded-xl flex flex-col items-center justify-center gap-4 transition cursor-pointer group",ej?"border-[#2883DE] bg-[#2883DE]
1/10":"border-[#3f3f46] hover:border-[#71717a] hover:bg-[#EBEBEA] [.dark_&]:hover:bg-[#202023]"),onClick:()=>{var e;return!eD&&(null===(e=eW.current)||void 0===e?void 0:e.click())},onDragOver:e=>{e.preventDefault(),eD||eN(!0)},onDragLeave:()=>eN(!1),onDrop:e=>{var t;e.preventDefault(),eN(!1);let r=null===(t=e.dataTransfer.files)||void 0===t?void 0:t[0];r&&tx(r)},children:[eD?(0,s.jsxs)("div",{className:"flex flex-col items-center gap-3 animate-in fade-in duration-300",children:[(0,s.jsx)(z.W,{size:64}),(0,s.jsx)("p",{className:"text-sm text-zinc-500 font-medium animate-pulse",children:"파일 확인 중..."})]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(C.w,{src:"/lordicons/wired-outline-92-file-upload-hover-swipe.json",size:40,target:".group",playOnMount:!0,className:(0,N.cn)("mb-2 transition-colors",ej?"text-[#2883DE]":"text-zinc-400 dark:text-zinc-500 group-hover:text-zinc-600 dark:group-hover:text-zinc-300")},"school-drop-".concat(eX)),(0,s.jsxs)("div",{className:"text-center",children:[(0,s.jsx)("p",{className:"text-zinc-900 dark:text-white font-medium mb-1",children:"내신 성적 파일"}),(0,s.jsx)("p",{className:"text-sm text-zinc-900 dark:text-white",children:"XLS data 업로드"})]})]}),(0,s.jsx)("input",{type:"file",ref:eW,accept:".xlsx,.xls,.csv",className:"hidden",onChange:e=>{var t;let r=null===(t=e.target.files)||void 0===t?void 0:t[0];r&&tx(r),e.target.value=""}})]})]}):(0,s.jsx)("div",{className:"flex-1 flex flex-col overflow-hidden",children:(0,s.jsx)("div",{className:"flex-1 overflow-auto bg-transparent relative custom-scrollbar",children:(0,s.jsxs)("table",{className:"w-full text-sm",children:[(0,s.jsx)("thead",{className:"sticky top-0 bg-[#F7F7F5] [.dark_&]:bg-[#18181b] z-50 font-medium shadow-sm",children:(0,s.jsxs)("tr",{className:"text-zinc-500 dark:text-[#71717a] text-center border-b border-zinc-200 dark:border-[#27272a]",children:[(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium w-16 text-center",children:"번호"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium text-center",children:"학생"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium w-24 text-center",children:"과목수"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium w-24 text-center",children:"상태"})]})}),(0,s.jsx)("tbody",{className:"text-xs",children:eP.map((e,t)=>(0,s.jsxs)("tr",{className:"border-t border-zinc-100 dark:border-[#27272a] hover:bg-zinc-100 dark:hover:bg-[#202023]/50 transition-colors",children:[(0,s.jsx)("td",{className:"py-2 px-2 text-zinc-500 dark:text-zinc-400 text-center w-16",children:e.studentNumber}),(0,s.jsx)("td",{className:"py-2 px-2 text-zinc-900 dark:text-white text-center font-medium",children:e.studentName}),(0,s.jsx)("td",{className:"py-2 text-center text-zinc-500 dark:text-zinc-400",children:e.grades.length}),(0,s.jsx)("td",{className:"py-2 text-center",children:e.studentId?(0,s.jsx)("span",{className:"text-emerald-500",children:"매칭됨"}):(0,s.jsx)("span",{className:"text-red-500",children:"미매칭"})})]},t))})]})})})})()]})]})]}),e9&&(0,s.jsxs)("div",{className:"modal-viewport z-[99999] flex items-center justify-center p-4",children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-sm",onClick:()=>e8(null)}),(0,s.jsxs)("div",{role:"dialog","aria-modal":"true","aria-label":"생활기록부 이름 확인",onKeyDown:e=>{"Escape"===e.key&&e8(null)},className:"relative bg-white dark:bg-[#1c1c1e] rounded-2xl shadow-2xl p-6 max-w-sm w-full border border-zinc-200 dark:border-white/10 animate-in zoom-in-95 fade-in duration-200",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,s.jsx)(b.Z,{size:20,className:"flex-shrink-0 text-amber-600 dark:text-amber-400"}),(0,s.jsx)("h3",{className:"font-semibold text-zinc-900 dark:text-white text-[15px]",children:e9.extractedName===e9.selectedStudentName?"동명이인 가능성이 있습니다":"학생 이름이 다릅니다"})]}),(0,s.jsxs)("div",{className:"space-y-2 mb-5 text-sm",children:[(0,s.jsxs)("div",{className:"bg-zinc-50 dark:bg-white/5 rounded-xl p-3 space-y-3",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsx)("span",{className:"text-zinc-500 dark:text-zinc-400 text-xs",children:"선택된 학생"}),(0,s.jsxs)("span",{className:"font-semibold text-zinc-900 dark:text-white",children:[e9.selectedStudentName,null!==e9.selectedStudentNumber&&(0,s.jsxs)("span",{className:"ml-1.5 text-xs font-normal text-zinc-400",children:[e9.selectedStudentNumber,"번"]})]})]}),(0,s.jsx)("div",{className:"w-full h-px bg-zinc-200 dark:bg-white/10"}),(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsx)("span",{className:"text-zinc-500 dark:text-zinc-400 text-xs",children:"PDF 내 학생"}),(0,s.jsxs)("span",{className:"font-semibold text-amber-600 dar
1k:text-amber-400",children:[e9.extractedName,null!==e9.extractedNumber&&(0,s.jsxs)("span",{className:"ml-1.5 text-xs font-normal text-amber-400/70",children:[e9.extractedNumber,"번"]})]})]})]}),(0,s.jsxs)("p",{className:"text-xs text-zinc-500 dark:text-zinc-400 leading-relaxed",children:["업로드한 생기부가 ",(0,s.jsx)("span",{className:"font-medium text-zinc-700 dark:text-zinc-300",children:e9.selectedStudentName})," 학생의 것이 맞는지 확인해 주세요."]})]}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)("button",{onClick:()=>e8(null),className:"flex-1 px-4 py-2 text-sm font-medium text-zinc-700 dark:text-zinc-300 bg-zinc-100 dark:bg-white/10 hover:bg-zinc-200 dark:hover:bg-white/15 rounded-xl transition-colors",children:"취소"}),(0,s.jsx)("button",{onClick:()=>{let e=e9.file;e8(null),tf(e,!0)},className:"flex-1 px-4 py-2 text-sm font-bold text-white bg-amber-500 hover:bg-amber-600 rounded-xl transition-colors",children:"그래도 저장"})]})]})]}),eQ&&(0,s.jsxs)("div",{className:"modal-viewport z-[99999] flex items-center justify-center p-4",children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-sm",onClick:()=>!e5&&e0(null)}),(0,s.jsxs)("div",{role:"dialog","aria-modal":"true","aria-label":"성적 일괄 삭제 확인",onKeyDown:e=>{"Escape"!==e.key||e5||e0(null)},className:"relative bg-white dark:bg-[#1c1c1e] rounded-2xl shadow-2xl p-6 max-w-sm w-full border border-zinc-200 dark:border-white/10 animate-in zoom-in-95 fade-in duration-200",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,s.jsx)(c.Z,{size:18,className:"flex-shrink-0 text-red-600 dark:text-red-400"}),(0,s.jsxs)("h3",{className:"font-semibold text-zinc-900 dark:text-white text-[15px]",children:["midterm"===eQ.examType?"중간고사":"기말고사"," 성적 삭제"]})]}),(0,s.jsxs)("div",{className:"space-y-3 mb-5",children:[(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsxs)("select",{value:eQ.gradeLevel,onChange:e=>e0({...eQ,gradeLevel:e.target.value?Number(e.target.value):""}),className:"flex-1 px-3 py-2 text-sm rounded-lg border border-zinc-200 dark:border-white/10 bg-white dark:bg-white/5 text-zinc-900 dark:text-white",children:[(0,s.jsx)("option",{value:"",children:"학년 선택"}),(0,s.jsx)("option",{value:1,children:"1학년"}),(0,s.jsx)("option",{value:2,children:"2학년"}),(0,s.jsx)("option",{value:3,children:"3학년"})]}),(0,s.jsxs)("select",{value:eQ.semester,onChange:e=>e0({...eQ,semester:e.target.value?Number(e.target.value):""}),className:"flex-1 px-3 py-2 text-sm rounded-lg border border-zinc-200 dark:border-white/10 bg-white dark:bg-white/5 text-zinc-900 dark:text-white",children:[(0,s.jsx)("option",{value:"",children:"학기 선택"}),(0,s.jsx)("option",{value:1,children:"1학기"}),(0,s.jsx)("option",{value:2,children:"2학기"})]})]}),""!==eQ.gradeLevel&&""!==eQ.semester&&(0,s.jsxs)("p",{className:"text-xs text-red-500 dark:text-red-400 leading-relaxed",children:["담임 학급 학생 전체의 ",eQ.gradeLevel,"학년 ",eQ.semester,"학기 ","midterm"===eQ.examType?"중간고사":"기말고사"," 성적을 삭제합니다.",(0,s.jsx)("br",{}),"되돌릴 수 없습니다."]})]}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)("button",{onClick:()=>e0(null),disabled:e5,className:"flex-1 px-4 py-2 text-sm font-medium text-zinc-700 dark:text-zinc-300 bg-zinc-100 dark:bg-white/10 hover:bg-zinc-200 dark:hover:bg-white/15 rounded-xl transition-colors disabled:opacity-50",children:"취소"}),(0,s.jsx)("button",{onClick:tg,disabled:e5||""===eQ.gradeLevel||""===eQ.semester,className:"flex-1 px-4 py-2 text-sm font-bold !text-white bg-red-500 hover:bg-red-600 rounded-xl transition-colors disabled:opacity-50",children:e5?(0,s.jsx)(z.W,{size:18,className:"text-white mx-auto"}):"삭제"})]})]})]}),e1&&(0,s.jsxs)("div",{className:"modal-viewport z-[99999] flex items-center justify-center p-4",children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-sm",onClick:()=>!e5&&e2(null)}),(0,s.jsxs)("div",{role:"dialog","aria-modal":"true","aria-label":"모의고사 성적 삭제 확인",onKeyDown:e=>{"Escape"!==e.key||e5||e2(null)},className:"relative bg-white dark:bg-[#1c1c1e] rounded-2xl shadow-2xl p-6 max-w-sm w-full border border-zinc-200 dark:border-white/10 animate-in zoom-in-95 fade-in duration-200",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,s.jsx)(c.Z,{size:18,className:"flex-shrink-0 text-red-600 dark:text-red-400"}),(0,s.jsx)("h3",{className:"font-semibold text-zinc-900 dark:text-white text-[15px]",children:"모의고사 성적 삭제"})]}),(0,s.jsxs)("div",{className:"space-y-3 mb-5",children:[(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsxs)("select",{value:e1.year,onChange:e=>e2({...e1,year:e.target.value?Number(e.target.value):""}),className:"flex-1 px-3 py-2 text-sm rounded-lg border border-zinc-200 dark:border-white/10 bg-white dark:bg-white/5 text-zinc-900 dark:text-white",children:[(0,s.jsx)("option",{value:"",children:"연도 선택"}),(0,s.jsxs)("option",{value:2025,children:[2025,"년"]}),(0,s.jsxs)("option",{value:2026,children:[2026,"년"]}),(0,s.jsxs)("option",{value:2027,children:[2027,"년"]})]}),(0,s.jsxs)("select",{value:e1.month,onChange:e=>e2({...e1,month:e.target.value?Number(e.target.value):""}),className:"flex-1 px-3 py-2 text-sm rounded-lg border border-zinc-200 dark:border-white/10 bg-white dark:bg-white/5 text-zinc-900 dark:text-white",children:[(0,s.jsx)("option",{value:"",children:"월 선택"}),Array.from({length:12},(e,t)=>t+1).map(e=>(0,s.jsxs)("option",{value:e,children:[e,"월"]},e))]})]}),""!==e1.year&&""!==e1.month&&(0,s.jsxs)("p",{className:"text-xs text-red-500 dark:text-red-400 leading-relaxed",children:["담임 학급 학생 전체의 ",e1.year,"년 ",e1.month,"월 모의고사 성적을 삭제합니다.",(0,s.jsx)("br",{}),"되돌릴 수 없습니다."]})]}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)("button",{onClick:()=>e2(null),disabled:e5,className:"flex-1 px-4 py-2 text-sm font-medium text-zinc-700 dark:text-zinc-300 bg-zinc-100 dark:bg-white/10 hover:bg-zinc-200 dark:hover:bg-white/15 rounded-xl transition-colors disabled:opacity-50",children:"취소"}),(0,s.jsx)("button",{onClick:tv,disabled:e5||""===e1.year||""===e1.month,className:"flex-1 px-4 py-2 text-sm font-bold !text-white bg-red-500 hover:bg-red-600 rounded-xl transition-colors disabled:opacity-50",children:e5?(0,s.jsx)(z.W,{size:18,className:"text-white mx-auto"}):"삭제"})]})]})]}),(0,s.jsx)(B.Z,{open:ey,busy:ew,title:"학생 ".concat(eg.length,"명을 모두 삭제할까요?"),description:"담임 학급의 학생 명단이 비워집니다.",consequences:["학생별 성적 기록(내신\xb7모의고사)","출결 기록","상담 일지","세특\xb7행동특성 초안","자율\xb7진로 활동 기록과 첨부파일","설문 응답"],confirmLabel:"모두 삭제",onConfirm:tc,onCancel:()=>ez(!1)}),(0,s.jsx)(B.Z,{open:null!==eC,title:'"'.concat(eC,'" 교실을 삭제할까요?'),description:"이 교실에만 속한 학생은 명단에서 사라집니다. 담임 학급 학생은 그대로 남습니다.",consequences:["이 교실의 자리 배치와 짝 지정","이 교실 기준으로 작성한 평가 기록"],confirmLabel:"교실 삭제",onConfirm:()=>{eI(null),eC&&(J(eC),el("담임 학급"),ev([]),e_(!1),eZ(!1))},onCancel:()=>eI(null)})]})}},7888:function(e,t,r){r.d(t,{q:function(){return s}});function s(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"요청을 처리하지 못했습니다. 잠시 후 다시 시도해 주세요.",r=e instanceof Error?e.message:String(null!=e?e:""),s=r.toLowerCase();return s.trim()?/[가-힣]/.test(r)&&!/error|exception|prisma|econn|timeout|undefined|null|\bp\d{4}\b|stack|<|\bat\s/i.test(r)?r:s.includes("unauthorized")||s.includes("unauthenticated")||s.includes("로그인 세션")?"로그인이 필요하거나 세션이 만료되었습니다. 페이지를 새로고침한 뒤 다시 시도해 주세요.":s.includes("permission denied")||s.includes("forbidden")||s.includes("access denied")||s.includes(" 403")?"이 작업을 수행할 권한이 없습니다.":s.includes("not found")||s.includes("no such")||s.includes("does not exist")?"대상을 찾을 수 없습니다. 목록을 새로고침한 뒤 다시 시도해 주세요.":s.includes("transaction")&&(s.includes("closed")||s.includes("timeout")||s.includes("aborted")||s.includes("expired"))?"한 번에 처리할 양이 많아 시간이 ì´
1ˆê³¼ë˜ì—ˆìŠµë‹ˆë‹¤. 나눠서 다시 시도해 주세요.":s.includes("econnreset")||s.includes("econnrefused")||s.includes("fetch failed")||s.includes("socket hang up")||s.includes("enotfound")||s.includes("network")?"서버 연결이 불안정합니다. 잠시 후 다시 시도해 주세요.":s.includes("timeout")||s.includes("timed out")||s.includes("etimedout")?"서버 응답 시간이 초과되었습니다. 잠시 후 다시 시도해 주세요.":s.includes("unique constraint")||s.includes("p2002")||s.includes("duplicate key")?"이미 등록되어 있는 항목입니다.":s.includes("no file provided")||s.includes("file provided")?"파일이 첨부되지 않았습니다. 파일을 선택한 뒤 다시 시도해 주세요.":s.includes("prisma")||/\bp\d{4}\b/.test(s)||s.includes("database")||s.includes("column ")||s.includes("relation ")?"데이터를 저장하는 중 문제가 발생했습니다. 잠시 후 다시 시도해 주세요.":t:t}},60706:function(e,t,r){r.d(t,{T:function(){return s}});function s(e){let t=String(e).trim().replace(/[^0-9]/g,"");return/^\d{5}$/.test(t)?{grade:parseInt(t[0]),classNum:parseInt(t.slice(1,3)),number:parseInt(t.slice(3))}:/^\d{4}$/.test(t)?{grade:parseInt(t[0]),classNum:parseInt(t[1]),number:parseInt(t.slice(2))}:null}},74791:function(e,t,r){r.d(t,{DX:function(){return i},RM:function(){return n}});var s=r(60706);let a=["학년","반","번호","이름"];async function n(){let e=await Promise.all([r.e(1425),r.e(6919)]).then(r.bind(r,2093)),t=e.utils.book_new(),s=e.utils.aoa_to_sheet([a]);["A1","B1","C1","D1"].forEach(e=>{s[e]&&(s[e].s={alignment:{horizontal:"center"}})}),e.utils.book_append_sheet(t,s,"Sheet1"),e.writeFile(t,"내모_학생명단_양식.xlsx")}async function l(e){let t=await Promise.all([r.e(1425),r.e(6919)]).then(r.bind(r,2093)),a=t.read(new Uint8Array(e),{type:"array"}),n=a.SheetNames[0],l=a.Sheets[n],i=t.utils.sheet_to_json(l,{header:1}),d=-1,c={grade:-1,class:-1,number:-1,name:-1,memo:-1};for(let e=0;e<Math.min(i.length,5);e++){let t=i[e];if(Array.isArray(t)&&(t.forEach((e,t)=>{let r=String(e).trim();r.includes("학년")&&(c.grade=t),("반"===r||r.includes("학급")||r.includes("반"))&&(c.class=t),r.includes("번호")&&(c.number=t),(r.includes("이름")||r.includes("성명"))&&(c.name=t),(r.includes("비고")||r.includes("기록")||r.includes("메모"))&&(c.memo=t)}),-1!==c.number&&-1!==c.name)){d=e;break}}let o=[];return(-1!==d?i.slice(d+1):i).forEach(e=>{let t,r;if(!Array.isArray(e)||0===e.length)return;let a=0,n="",l="",i="number"==typeof e[2]||/^\d+$/.test(e[2])?parseInt(e[2]):NaN,x=e[3];if(-1===d&&e.length>=4&&!isNaN(i)&&"string"==typeof x&&/^[가-힣a-zA-Z\s]{2,20}$/.test(x.trim()))t=parseInt(String(e[0]).replace(/[^0-9]/g,""))||void 0,r=String(e[1]).replace(/[^0-9]/g,""),a=i,n=x.trim();else if(-1!==d&&-1!==c.number&&-1!==c.name){let s=e[c.number],i=e[c.name];s&&i&&(a=parseInt(String(s).replace(/[^0-9]/g,"")),n=String(i).trim(),-1!==c.grade&&(t=parseInt(String(e[c.grade]).replace(/[^0-9]/g,""))||void 0),-1!==c.class&&(r=String(e[c.class]).replace(/[^0-9]/g,"")),-1!==c.memo&&(l=String(e[c.memo])))}else if(-1===d&&e.length>=2){let l=String(e[0]).trim(),i=String(e[1]).trim(),d=(0,s.T)(l);d&&/^[가-힣a-zA-Z\s]{2,20}$/.test(i)&&(t=d.grade,r=String(d.classNum),a=d.number,n=i)}n||e.forEach(e=>{if("number"!=typeof e||a){if("string"==typeof e){let t=e.trim();!a&&/^\d+$/.test(t)?a=parseInt(t):!n&&/^[가-힣a-zA-Z\s]{2,20}$/.test(t)&&(n=t.trim())}}else a=e}),a&&n&&o.push({number:a,name:n,memo:l,grade:t,classNum:r?parseInt(r,10):void 0})}),o.sort((e,t)=>{let r=(Number(e.grade)||0)-(Number(t.grade)||0);if(0!==r)return r;let s=(Number(e.classNum)||0)-(Number(t.classNum)||0);return 0!==s?s:(Number(e.number)||0)-(Number(t.number)||0)})}async function i(e){return l(await e.arrayBuffer())}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.