PageSourceSearch

https://naemo.ai/_next/static/chunks/9804-465f26e01659c61c.js

js naemo.ai collected 2026-10-02 01:12:40 UTC 47,344 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9804],{29804:function(e,t,n){n.d(t,{V:function(){return M}});var l=n(57437),r=n(2265),a=n(51817),i=n(76858),s=n(18930),c=n(73247),o=n(92451),d=n(45007),u=n(93448),x=n(84519),m=n(73369),h=n(4908),p=n(25997),f=n(60850),b=n(83008),g=n(67920),v=n(74791);function z(e){let t=e.toLowerCase();return/\.(xlsx|xls|xlsm|csv)$/.test(t)?"excel":/\.hwpx$/.test(t)?"hwpx":/\.(txt|tsv)$/.test(t)?"text":"unknown"}async function k(e){let t=await Promise.all([n.e(1425),n.e(6919)]).then(n.bind(n,2093)),l=t.read(new Uint8Array(e),{type:"array"}),r=[];for(let e of l.SheetNames.slice(0,20)){let n=l.Sheets[e];if(!n)continue;let a=t.utils.sheet_to_csv(n,{FS:"	",blankrows:!1});a.trim()&&r.push("[시트: ".concat(e,"]\n").concat(a))}return r.join("\n\n")}async function N(e){let t=(await Promise.all([n.e(2957),n.e(7635)]).then(n.t.bind(n,57635,23))).default,l=await t.loadAsync(e),r=Object.keys(l.files).filter(e=>/Contents\/section\d*\.xml$/i.test(e)).sort();if(0===r.length)throw Error("hwpx 안에서 본문을 찾지 못했습니다.");let a=[];for(let e of r){let t=await l.files[e].async("string");a.push(t.replace(/<(?:\w+:)?linesegarray[\s\S]*?<\/(?:\w+:)?linesegarray>/g,"").replace(/<\/(?:\w+:)?p>\s*<\/(?:\w+:)?tc>/g,"	").replace(/<\/(?:\w+:)?tc>/g,"	").replace(/<\/(?:\w+:)?tr>/g,"\n").replace(/<\/(?:\w+:)?p>/g,"\n").replace(/<[^>]+>/g,"").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&apos;/g,"'").replace(/&amp;/g,"&").split("\n").map(e=>e.replace(/ {2,}/g,"	").replace(/\t+/g,"	").replace(/^\t|\t$/g,"").trim()).filter(e=>e.length>0).join("\n"))}return a.join("\n")}async function w(e){let t;let n=z(e.name),l=await e.arrayBuffer();switch(n){case"excel":t=await k(l);break;case"hwpx":t=await N(l);break;case"text":t=new TextDecoder("utf-8").decode(l);break;default:throw Error("'".concat(e.name,"': 엑셀(.xlsx, .xls, .csv) 또는 한글(.hwpx) 파일ì
1„ 올려주세요."))}let r=t.trim();if(!r)throw Error("'".concat(e.name,"': 파일에서 글자를 찾지 못했습니다."));return r}async function j(e){if(!e.length)throw Error("선택된 파일이 없습니다.");let t=[];for(let n of e){let e=await w(n);t.push("[파일: ".concat(n.name,"]\n").concat(e))}return t.join("\n\n---\n\n").trim().slice(0,6e4)}var y=n(9244),C=n(15563);let S=new Set(["번호","이름","성명","학생","학생명","성별","비고","no","name"]);function I(e){return e.length>0&&e.every(e=>S.has(e.toLowerCase()))}var _=n(58819);let A=0,E=()=>String(++A);function D(e){let{children:t,onClick:n,disabled:r=!1,className:a=""}=e;return(0,l.jsx)("button",{onClick:n,disabled:r,className:(0,u.cn)("wizard-primary inline-flex items-center gap-2 whitespace-nowrap px-4 sm:px-7 py-2.5 rounded-xl text-[14px] font-bold transition-colors duration-150",a),children:t})}function M(e){var t,n,k,N,w,A,M,T,Z,$,L,P,F,R,H,B,X,O,Q,Y,U,q,G,V,W,J,K,ee,et,en;let{onClose:el,onComplete:er,onDeferToPc:ea,previewSeed:ei}=e,es=!!ei,ec=(0,_.d)(),eo=null!==(n=null==ei?void 0:ei.phone)&&void 0!==n?n:ec,[ed,eu]=(0,r.useState)((null==ei?void 0:ei.pasteText)!==void 0),[ex,em]=(0,r.useState)(null!==(k=null==ei?void 0:ei.pasteText)&&void 0!==k?k:""),eh=(0,r.useMemo)(()=>(function(e){let t=[],n=0;for(let l of function(e){let t=e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);return 1===t.length&&/[,,、]/.test(t[0])&&!/\t/.test(t[0])?t[0].split(/[,,、]/).map(e=>e.trim()).filter(Boolean):t}(e)){let e=function(e){var t;let n=e.split("	").map(e=>e.trim()).filter(Boolean);if(0===n.length||I(n)||I(e.split(/\s+/)))return null;if(n.length>1){let e=n[0].match(/^(\d{1,3})(번|\.)?$/);return e?{number:Number(e[1]),name:n[1]}:{number:null,name:n[0]}}let l=null!==(t=e.match(/^(\d{1,3})\s*(?:번|\.|\)|:|-)?\s+(.+)$/))&&void 0!==t?t:e.match(/^(\d{1,3})(?:번|\.|\))(.+)$/);return l?{number:Number(l[1]),name:l[2].trim()}:{number:null,name:e}}(l);if(!e)continue;let r=e.name.replace(/\s+/g," ").trim();if(!r||r.length>20||/^\d+$/.test(r)||S.has(r.toLowerCase()))continue;let a=e.number&&e.number>0?e.number:n+1;n=a,t.push({number:a,name:r})}return t})(ex),[ex]),[ep]=(0,r.useState)(()=>ei?null:(0,C.Ys)()),[ef,eb]=(0,r.useState)(null!==(N=null==ei?void 0:ei.step)&&void 0!==N?N:ep?(0,C.QY)(ep):1),[eg,ev]=(0,r.useState)(()=>{var e;return(null!==(e=null==ei?void 0:ei.roster)&&void 0!==e?e:[]).map(e=>({...e,_id:E()}))}),[ez,ek]=(0,r.useState)(null!==(w=null==ei?void 0:ei.uploadError)&&void 0!==w?w:null),[eN,ew]=(0,r.useState)(null!==(A=null==ei?void 0:ei.isDragging)&&void 0!==A&&A),[ej,ey]=(0,r.useState)(null!==(M=null==ei?void 0:ei.isParsing)&&void 0!==M&&M),[eC,eS]=(0,r.useState)(null!==(T=null==ei?void 0:ei.usedAi)&&void 0!==T&&T),[eI,e_]=(0,r.useState)(null!==(Z=null==ei?void 0:ei.isSaving)&&void 0!==Z&&Z),[eA,eE]=(0,r.useState)(null!==($=null==ei?void 0:ei.saveError)&&void 0!==$?$:null),[eD,eM]=(0,r.useState)(null!==(P=null!==(L=null==ei?void 0:ei.savedCount)&&void 0!==L?L:null==ep?void 0:ep.savedCount)&&void 0!==P?P:0),[eT,eZ]=(0,r.useState)(null!==(R=null!==(F=null==ei?void 0:ei.gradeInput)&&void 0!==F?F:null==ep?void 0:ep.gradeInput)&&void 0!==R?R:""),[e$,eL]=(0,r.useState)(null!==(B=null!==(H=null==ei?void 0:ei.classInput)&&void 0!==H?H:null==ep?void 0:ep.classInput)&&void 0!==B?B:""),[eP,eF]=(0,r.useState)(null===(O=null!==(X=null==ei?void 0:ei.isHomeroom)&&void 0!==X?X:null==ep?void 0:ep.isHomeroom)||void 0===O||O),[eR,eH]=(0,r.useState)(!1),[eB,eX]=(0,r.useState)(null!==(Q=null==ep?void 0:ep.hasSubjectAdded)&&void 0!==Q&&Q),eO=!eP||eR,[eQ,eY]=(0,r.useState)(""),[eU,eq]=(0,r.useState)("all"),eG=(0,r.useRef)(null),eV=(0,r.useRef)(null),{bulkCreateStudents:eW}=(0,m.N)(),{reloadStudents:eJ,addClass:eK,classes:e0}=(0,h.AF)(),[e1,e2]=(0,r.useState)(""),[e5,e4]=(0,r.useState)([]),{openSettings:e3}=(0,p.Y)(),e9=(0,g.XC)(),[e8,e7]=(0,r.useState)(null!==(Y=null==ei?void 0:ei.neisSchool)&&void 0!==Y?Y:null),e6=(0,r.useRef)(!!((null==ei?void 0:ei.schoolQuery)||(null==ei?void 0:ei.neisSchool))),[te,tt]=(0,r.useState)(null!==(U=null==ei?void 0:ei.schoolQuery)&&void 0!==U?U:""),[tn,tl]=(0,r.useState)(null!==(q=null==ei?void 0:ei.schoolResults)&&void 0!==q?q:[]),[tr,ta]=(0,r.useState)(null!==(G=null==ei?void 0:ei.isSearchingSchool)&&void 0!==G&&G),[ti,ts]=(0,r.useState)(null!==(V=null==ei?void 0:ei.isLoadingSavedSchool)&&void 0!==V&&V),[tc,to]=(0,r.useState)(null!==(W=null==ei?void 0:ei.preview)&&void 0!==W?W:null),[td,tu]=(0,r.useState)(new Set),[tx,tm]=(0,r.useState)(null!==(J=null==ei?void 0:ei.isPreviewing)&&void 0!==J&&J),[th,tp]=(0,r.useState)(null!==(K=null==ei?void 0:ei.isImporting)&&void 0!==K&&K),[tf,tb]=(0,r.useState)(null!==(ee=null==ei?void 0:ei.scheduleError)&&void 0!==ee?ee:null),[tg,tv]=(0,r.useState)(null!==(et=null==ei?void 0:ei.importedCount)&&void 0!==et?et:null),tz=(0,r.useRef)(null),tk=(0,r.useCallback)(e=>{let t=!eO&&eT?parseInt(eT):void 0,n=!eO&&e$?parseInt(e$):void 0,l=e.map(e=>{var l,r;return{number:e.number,name:e.name,grade:null!==(l=e.grade)&&void 0!==l?l:t,classNum:null!==(r=e.classNum)&&void 0!==r?r:n,className:"className"in e&&e.className?e.className:void 0,_id:E()}}).sort((e,t)=>
1{var n,l;let r=(null!==(n=e.className)&&void 0!==n?n:"").localeCompare(null!==(l=t.className)&&void 0!==l?l:"","ko");if(0!==r)return r;let a=(Number(e.grade)||0)-(Number(t.grade)||0);if(0!==a)return a;let i=(Number(e.classNum)||0)-(Number(t.classNum)||0);return 0!==i?i:(Number(e.number)||0)-(Number(t.number)||0)});if(eO&&l.every(e=>!e.className)){let e=new Set(l.map(e=>{var t,n;return"".concat(null!==(t=e.grade)&&void 0!==t?t:0,"-").concat(null!==(n=e.classNum)&&void 0!==n?n:0)})),[t]=l;1===e.size&&(null==t?void 0:t.grade)&&(null==t?void 0:t.classNum)&&e2(e=>e||"".concat(t.grade,"학년 ").concat(t.classNum,"반"))}ev(l),eq("all"),eb(4)},[eO,eT,e$]),tN=(0,r.useCallback)(async e=>{var t,n,l;if(!e.length)return;let r=e[0];if(eY(1===e.length?r.name:"".concat(r.name," 외 ").concat(e.length-1,"개")),e2(1===e.length?r.name.replace(/ 외 \d+개$/,"").replace(/\.[^.]+$/,"").replace(/[_\-]+/g," ").replace(/(명렬표|명렬|명단|출석부|학생)/g," ").replace(/\s+/g," ").trim():""),es){tk((null!==(t=null==ei?void 0:ei.roster)&&void 0!==t?t:[]).filter(e=>"number"==typeof e.number&&e.name.trim()).map(e=>({number:e.number,name:e.name,grade:e.grade,classNum:e.classNum,className:e.className})));return}ey(!0),ek(null),eS(!1);try{if(1===e.length&&"excel"===z(r.name))try{let e=await (0,v.DX)(r);if(e.length>0){tk(e);return}}catch(e){}let t=await j(e),a=await (0,b.X)("parseRosterWithAI",{text:t,...!eO&&eT?{fallbackGrade:parseInt(eT)}:{},...!eO&&e$?{fallbackClassNum:parseInt(e$)}:{}},e9,{timeout:9e4});if(!a.success||!(null===(l=a.data)||void 0===l?void 0:null===(n=l.students)||void 0===n?void 0:n.length)){ek(a.error||"명단을 인식하지 못했습니다.\n다른 파일로 시도하거나 직접 입력해주세요.");return}eS(!0),tk(a.data.students)}catch(e){ek(e instanceof Error&&e.message?e.message:"파일을 여는 중 문제가 발생했습니다. 엑셀(.xlsx) 또는 한글(.hwpx) 파일인지 확인해 주세요.")}finally{ey(!1)}},[tk,e9,eO,eT,e$,es,ei]),tw=(0,r.useCallback)(e=>{e.preventDefault(),ew(!1);let t=Array.from(e.dataTransfer.files);t.length>0&&tN(t)},[tN]),tj=()=>{eY(""),e2(""),ev([{number:"",name:"",_id:E()}]),eq("all"),eb(4)},ty=(e,t,n)=>{ev(l=>l.map(l=>l._id===e?{...l,[t]:"number"===t?parseInt(n)||"":n}:l))},tC=(0,r.useMemo)(()=>!(!eO||0===eg.length||eg.some(e=>{var t;return null===(t=e.className)||void 0===t?void 0:t.trim()}))&&new Set(eg.map(e=>{var t,n;return"".concat(null!==(t=e.grade)&&void 0!==t?t:0,"-").concat(null!==(n=e.classNum)&&void 0!==n?n:0)})).size<=1,[eO,eg]),tS=e1.trim(),tI=(0,r.useCallback)(e=>{var t;let n=eO?"number"==typeof e.grade&&e.grade>0?e.grade:0:"number"==typeof e.grade&&e.grade>0?e.grade:eT?parseInt(eT):0,l=eO?"number"==typeof e.classNum&&e.classNum>0?e.classNum:0:"number"==typeof e.classNum&&e.classNum>0?e.classNum:e$?parseInt(e$):0;return{className:eO?(null===(t=e.className)||void 0===t?void 0:t.trim())||tC&&tS||(n&&l?"".concat(n,"학년 ").concat(l,"반"):"교과 학급"):"담임 학급",grade:n,classNum:l}},[eO,eT,e$,tC,tS]),t_=(0,r.useCallback)(e=>tI(e).className,[tI]),tA=(0,r.useCallback)(e=>{let{className:t,grade:n,classNum:l}=tI(e);return"".concat(t,"__g").concat(n,"__c").concat(l)},[tI]),tE=(0,r.useMemo)(()=>{if(!eO)return["담임 학급"];let e=new Set;for(let t of eg){let n=t_(t);e.add(n)}return Array.from(e)},[eO,eg,t_]);(0,r.useEffect)(()=>{"all"===eU||tE.includes(eU)||eq("all")},[tE,eU]);let tD=e=>ev(t=>t.filter(t=>t._id!==e)),tM=()=>{let e,t,n;if(eO&&"all"!==eU){n=eU;let l=eg.find(e=>t_(e)===eU);l&&(e=l.grade,t=l.classNum)}else{let l=eg[eg.length-1];e=null==l?void 0:l.grade,t=null==l?void 0:l.classNum,n=null==l?void 0:l.className}ev(l=>[...l,{number:"",name:"",grade:e,classNum:t,className:n,_id:E()}]),setTimeout(()=>{eV.current&&eV.current.scrollTo({top:eV.current.scrollHeight,behavior:"smooth"})},50)},tT=(0,r.useMemo)(()=>{let e=new Map;for(let n of eg){var t;if("number"!=typeof n.number||0===n.number)continue;let l=tA(n),r=e.get(l);r||(r=new Map,e.set(l,r)),r.set(n.number,(null!==(t=r.get(n.number))&&void 0!==t?t:0)+1)}let n=new Map;for(let[t,l]of Array.from(e.entries())){let e=new Set;for(let[t,n]of Array.from(l.entries()))n>1&&e.add(t);e.size>0&&n.set(t,e)}return n},[eg,tA]),tZ=eg.filter(e=>""!==e.number&&e.name.trim()),t$=(0,r.useMemo)(()=>new Set(["담임 학급",...es?[]:e0,...e5]),[es,e0,e5]),tL=eO&&tC?tS?t$.has(tS)?"이미 있는 학급 이름이에요. 다른 이름을 적어 주세요.":null:"학급 이름을 적어 주세요.":null,tP=(0,r.useMemo)(()=>{let e=new Map;if(!eO||tC)return e;let t=new Set(t$);for(let n of tE){let l=function(e,t){if(!t.has(e))return e;let n=2;
1for(;t.has("".concat(e," ").concat(n));)n+=1;return"".concat(e," ").concat(n)}(n,t);t.add(l),l!==n&&e.set(n,l)}return e},[eO,tC,t$,tE]),tF=(0,r.useMemo)(()=>{let e=new Map;for(let t of tE)e.set(t,{count:0,hasDup:!1});for(let l of eg){let r=t_(l),a=e.get(r);if(a){var t,n;""!==l.number&&l.name.trim()&&(a.count+=1);let e=tA(l);"number"==typeof l.number&&0!==l.number&&null!==(n=null===(t=tT.get(e))||void 0===t?void 0:t.has(l.number))&&void 0!==n&&n&&(a.hasDup=!0)}}return e},[tE,eg,t_,tA,tT]),tR=(0,r.useMemo)(()=>eO&&"all"!==eU?eg.filter(e=>t_(e)===eU):eg,[eO,eU,eg,t_]),tH=(0,r.useMemo)(()=>{if(!eO)return"48px";if(tE.length<=1)return"52px";let e=0;for(let n of tR){var t;let l=(null===(t=n.className)||void 0===t?void 0:t.trim())||(n.classNum?"".concat(n.classNum,"반"):"");l.length>e&&(e=l.length)}if(0===e)for(let t of tE)t.length>e&&(e=t.length);let n=Math.max(60,Math.min(170,13*e+22));return"".concat(n,"px")},[eO,tE,tR]),tB=async()=>{if(0===tZ.length){eE("등록할 학생이 없습니다.");return}if(tL){eE(tL);return}if(es){if(eO){let e=tZ.map(e=>{var t;let{className:n}=tI(e);return null!==(t=tP.get(n))&&void 0!==t?t:n});e4(t=>Array.from(new Set([...t,...e])))}eM(e=>e+tZ.length),eR&&(eX(!0),eH(!1)),eb(5);return}e_(!0),eE(null);try{if(eO){let t=e=>{var t;let{className:n}=tI(e);return null!==(t=tP.get(n))&&void 0!==t?t:n},n=new Map;for(let l of tZ){var e;let r=t(l),a=null!==(e=n.get(r))&&void 0!==e?e:[];a.push(l),n.set(r,a)}for(let e of Array.from(n.keys()))try{await eK(e)}catch(e){}await eW.mutateAsync({students:tZ.map(e=>{let{grade:n,classNum:l}=tI(e),r=t(e);return{number:e.number,name:e.name.trim(),homeClassId:r,customClassIds:[r],grade:n,classNum:l}})});let l=Array.from(n.keys());e4(e=>Array.from(new Set([...e,...l])))}else await eW.mutateAsync({students:tZ.map(e=>{let{grade:t,classNum:n}=tI(e);return{number:e.number,name:e.name.trim(),homeClassId:"담임 학급",customClassIds:[],grade:t,classNum:n}})});await eJ(),eM(e=>e+tZ.length),eR&&(eX(!0),eH(!1)),eb(5)}catch(e){eE(e instanceof Error?e.message:"저장 중 오류가 발생했습니다.")}finally{e_(!1)}},tX=(0,r.useCallback)(async e=>{if(es){var t;to(null!==(t=null==ei?void 0:ei.preview)&&void 0!==t?t:null);return}tm(!0),to(null),tb(null);try{let t=await (0,b.X)("previewAcademicScheduleImport",{schoolCode:e.schoolCode,officeCode:e.officeCode,schoolName:e.schoolName},e9,{timeout:9e4});t.success&&t.data?(to(t.data),tu(new Set)):tb(t.error||"미리보기를 불러오지 못했어요.")}finally{tm(!1)}},[e9,es,ei]),tO=(0,r.useCallback)(async e=>{e6.current=!0,e7(e),tt(e.schoolName),tl([]),to(null),tu(new Set),tb(null),tv(null),es||(0,f.fk)(e.schoolCode,e.officeCode).then(e=>{e.success&&window.dispatchEvent(new CustomEvent("school-settings-updated"))}).catch(()=>{}),await tX(e)},[tX,es]),tQ=(0,r.useCallback)(async()=>{if(tc&&e8){if(es){tv(tc.items.filter(e=>"new"===e.status&&!td.has(e.externalId)).length);return}tp(!0),tb(null);try{let e=await (0,b.X)("commitAcademicScheduleImport",{schoolCode:e8.schoolCode,officeCode:e8.officeCode,schoolName:e8.schoolName,startDate:tc.summary.startDate,endDate:tc.summary.endDate,excludedExternalIds:Array.from(td)},e9,{timeout:9e4});e.success&&e.data?tv(e.data.createdCount):tb(e.error||"학사일정을 가져오지 못했어요.")}finally{tp(!1)}}},[tc,e8,td,e9,es]),tY=e=>{tu(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})};(0,r.useEffect)(()=>{if(2!==ef)return;let e=!1;return ts(!0),(0,f.T9)().then(t=>{if(e||e6.current)return;let n=t.success?t.data:null;if((null==n?void 0:n.neisSchoolCode)&&(null==n?void 0:n.neisOfficeCode)){let e={schoolName:n.schoolName||"저장된 학교",schoolCode:n.neisSchoolCode,officeCode:n.neisOfficeCode};e7(e),tt(e.schoolName),tX(e)}else setTimeout(()=>{var e;return null===(e=tz.current)||void 0===e?void 0:e.focus()},80)}).finally(()=>{e||ts(!1)}),()=>{e=!0}},[ef,tX]),(0,r.useEffect)(()=>{if(2!==ef)return;let e=te.trim();if(e.length<2||e8&&e===e8.schoolName){tl([]);return}let t=setTimeout(async()=>{ta(!0);try{let t=await (0,f.R2)(e);tl(t.success?t.data:[])}finally{ta(!1)}},300);return()=>clearTimeout(t)},[ef,te,e8,es]),(0,r.useEffect)(()=>
1{if(es&&!(null==ei?void 0:ei.autoAdvance)||null===tg)return;let e=setTimeout(()=>eb(3),1200);return()=>clearTimeout(e)},[tg,es,ei]),(0,r.useEffect)(()=>{!es&&((0,y.Ig)()||(0,C.Nx)({step:ef,savedCount:eD,isHomeroom:eP,hasSubjectAdded:eB,gradeInput:eT,classInput:e$}))},[es,ef,eD,eP,eB,eT,e$]);let tU=null!==tg||eD>0,tq=null!==(en=null==tc?void 0:tc.items.filter(e=>"new"===e.status))&&void 0!==en?en:[],tG=tq.filter(e=>!td.has(e.externalId)).length,tV=(()=>{switch(ef){case 1:return{icon:"/lordicons/wizard/wand.json",stepLabel:"STEP 1 / 5",title:"어떤 역할이신가요?"};case 2:if(null!==tg)return{icon:"/lordicons/wizard/check.json",stepLabel:"STEP 2 / 5",title:"학사일정 가져오기 완료!"};return{icon:"/lordicons/wizard/calendar.json",stepLabel:"STEP 2 / 5",title:"학사일정 불러오기"};case 3:if(ej)return{icon:"/lordicons/wizard/magnifier.json",stepLabel:eR?"교과 학급":"STEP 3 / 5",title:"명단 꼼꼼히\n분석 중..."};return{icon:"/lordicons/wizard/sheet.json",stepLabel:eR?"교과 학급":"STEP 3 / 5",title:eO?"쓰시던 교과 학급 명단을\n그대로 올려주세요":"쓰시던 담임 학생 명단을\n그대로 올려주세요"};case 4:return{icon:"/lordicons/wizard/students.json",stepLabel:eR?"교과 학급":"STEP 4 / 5",title:eO?"등록할 교과 명단이에요":"등록할 명단이에요"};case 5:return{icon:"/lordicons/wizard/balloons.json",stepLabel:"완료",title:eD>0?eB&&eP?"담임\xb7교과 ".concat(eD,"명 완료!"):!eP&&tE.length>1?"".concat(tE.length,"개 학급 \xb7 ").concat(eD,"명 완료!"):"".concat(eD,"명 등록 완료!"):"시작 준비 완료!"}}})(),tW=3===ef&&eo?ed?"명단 붙여넣기":eO?"교과 학급 명단 등록":"학생 명단 등록":tV.title.replace(/\n/g," "),tJ=eo&&3===ef&&!ed&&!eR&&!!ea;return(0,y.Ig)()?null:(0,l.jsx)(l.Fragment,{children:(0,l.jsx)("div",{className:"modal-viewport bg-black/40 backdrop-blur-sm flex items-center justify-center z-[110000] p-4",children:(0,l.jsxs)("div",{className:"bg-white dark:bg-zinc-900 rounded-2xl w-full max-w-[760px] h-[min(600px,calc(100dvh-2rem))] sm:h-[min(520px,calc(100dvh-2rem))] max-h-full flex flex-col sm:flex-row min-w-0 border border-zinc-200 dark:border-zinc-800 shadow-2xl overflow-hidden animate-in zoom-in-95 duration-200",children:[(0,l.jsxs)("div",{className:"hidden sm:flex w-[280px] shrink-0 bg-zinc-50/80 dark:bg-zinc-950/40 border-r border-zinc-100 dark:border-zinc-800/80 flex-col p-7 select-none",children:[(0,l.jsxs)("div",{className:"space-y-3",children:[(0,l.jsx)("span",{className:"inline-flex items-center px-2.5 py-1 rounded-full text-[11px] font-bold tracking-wider uppercase bg-zinc-200/60 dark:bg-zinc-800 text-zinc-600 dark:text-zinc-400",children:tV.stepLabel}),(0,l.jsx)("h2",{className:"text-[20px] font-black tracking-tight leading-snug text-zinc-900 dark:text-white whitespace-pre-line",children:tV.title})]}),(0,l.jsx)("div",{className:"flex-1 flex items-center justify-center",children:(0,l.jsx)("div",{className:"w-32 h-32 flex items-center justify-center relative",children:(0,l.jsx)(d.w,{src:tV.icon,size:116,originalColors:!0,trigger:"loop"},tV.icon)})})]}),(0,l.jsxs)("div",{className:"flex-1 flex flex-col min-w-0 min-h-0 bg-white dark:bg-zinc-900",children:[(0,l.jsxs)("div",{className:"sm:hidden shrink-0 px-5 pt-5",children:[(0,l.jsx)("p",{className:"text-[11px] font-bold tracking-wider uppercase text-zinc-400 dark:text-zinc-500",children:tV.stepLabel}),(0,l.jsx)("h2",{className:"mt-0.5 text-[18px] font-black tracking-tight leading-snug text-zinc-900 dark:text-white",children:tW})]}),(0,l.jsxs)("div",{className:"flex-1 overflow-y-auto px-5 sm:px-7 pt-4 sm:pt-6 pb-6",children:[1===ef&&(0,l.jsxs)("div",{className:"flex flex-col gap-4 pt-1 animate-in fade-in duration-300",children:[(0,l.jsx)("div",{className:"space-y-2.5",children:[{label:"담임교사",value:!0},{label:"비담임교사",value:!1}].map(e=>{let{label:t,value:n}=e;return(0,l.jsxs)("button",{onClick:()=>eF(n),className:(0,u.cn)("w-full flex items-center gap-4 px-5 py-4 rounded-2xl border-2 text-left transition duration-150",eP===n?"border-zinc-900 dark:border-zinc-300 bg-white dark:bg-zinc-800":"border-zinc-200 dark:border-zinc-700 bg-white dark:bg-zinc-800/30 hover:border-zinc-300 dark:hover:border-zinc-600"),children:[(0,l.jsx)("div",{className:(0,u.cn)("w-5 h-5 rounded-full border-2 flex items-center justify-center shrink-0 transition",eP===n?"border-zinc-900 dark:border-zinc-300":"border-zinc-300 dark:border-zinc-600"),children:eP===n&&(0,l.jsx)("div",{className:"w-2 h-2 rounded-full bg-zinc-900 dark:bg-zinc-300"})}),(0,l.jsx)("span",{className:(0,u.cn)("text-[15px] font-bold transition-colors",eP===n?"text-zinc-900 dark:text-white":"text-zinc-400 dark:text-zinc-500"),children:t})]},t)})}),(0,l.jsxs)("div",{className:(0,u.cn)("space-y-2.5 transition-opacity duration-200",eP?"opacity-100":"opacity-0 pointer-events-none"),children:[(0,l.jsx)("p",{className:"text-[13px] font-semibold text-zinc-500 dark:text-zinc-400",children:"담임 학급이 어디인가요?"}),(0,l.jsx)("div",{className:"flex gap-3",children:[{value:eT,onChange:eZ,label:"학년",max:6},{value:e$,onChange:eL,label:"반",max:30}].map(e=>{let{value:t,onChange:n,label:r,max:a}=e;return(0,l.jsxs)("div",{className:"flex-1 relative",children:[(0,l.jsx)("input",{type:"number",value:t,onChange:e=>n(e.target.value),placeholder:"—",min:1,max:a,className:"w-full text-center text-4xl font-black rounded-2xl border-2 border-zinc-200 dark:border-zinc-700 bg-white dark:bg-zinc-800/60 text-zinc-900 dark:text-white pt-4 pb-7 outline-none focus:border-zinc-900 dark:focus:border-zinc-400 transition-colors [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none placeholder:text-zinc-200 dark:placeholder:text-zinc-700"}),(0,l.jsx)("span",{className:"absolute bottom-2.5 inset-x-0 text-center text-[11px] font-bold tracking-widest uppercase text-zinc-400 dark:text-zinc-500 pointer-events-none",children:r})]},r)})})]})]}),3===ef&&(0,l.jsx)("input",{type:"file",ref:eG,multiple:!0,accept:".xlsx,.xls,.xlsm,.csv,.hwpx",className:"hidden",onChange:e=>{let t=e.target.files?Array.from(e.target.files):[];t.length>0&&tN(t),e.target.value=""}}),3===ef&&!eo&&(0,l.jsxs)("div",{className:"h-full flex flex-col gap-3 pt-1 animate-in fade-in slide-in-from-right-4 duration-300",children:[(0,l.jsx)("div",{className:"shrink-0",children:(0,l.jsx)("p",{className:"text-[13px] text-zinc-500 dark:text-zinc-400 leading-relaxed",children:eO?"학교에서 쓰시던 교과 명렬표를 그대로 올려주시면 번호와 이름을 자동으로 찾아 드려요.":"학교에서 쓰시던 명렬표를 그대로 올려주시면 번호와 이름을 자동으로 찾아 드려요."})}),(0,l.jsx)("div",{onClick:()=>{var e;return!ej&&(null===(e=eG.current)||void 0===e?void 0:e.click())},onDragOver:e=>{e.preventDefault(),ej||ew(!0)},onDragLeave:()=>ew(!1),onDrop:tw,className:(0,u.cn)("flex-1 min-h-[260px] rounded-2xl border-2 border-dashed flex flex-col items-center justify-center gap-3 cursor-pointer outline-none transition select-none p-6 text-center",ej?"border-zinc-200 dark:border-zinc-700 bg-zinc-50/60 dark:bg-zinc-800/30":eN?"border-zinc-900 dark:border-zinc-300 bg-zinc-100/70 dark:bg-zinc-800/60 scale-[0.99]":"border-zinc-200 dark:border-zinc-700/80 bg-zinc-50/30 dark:bg-zinc-800/10 hover:border-zinc-400 dark:hover:border-zinc-500 hover:bg-zinc-50/70 dark:hover:bg-zinc-800/30"),children:ej?(0,l.jsx)("div",{className:"py-4",children:(0,l.jsx)("p",{className:"text-[15px] font-bold text-zinc-800 dark:text-zinc-200",children:"명단을 읽는 중이에요"})}):(0,l.jsxs)("div",{className:"space-y-2 py-4",children:[(0,l.jsx)("p",{className:(0,u.cn)("text-[15px] font-bold transition-colors",eN?"text-zinc-900 dark:text-white":"text-zinc-800 dark:text-zinc-200"),children:"클릭하거나 파일ì
1„ 이곳에 끌어다 놓아주세요"}),(0,l.jsx)("p",{className:"text-[12px] text-zinc-400 dark:text-zinc-500",children:eO?"여러 파일 동시 업로드 가능 \xb7 엑셀 (.xlsx) \xb7 한글 (.hwpx)":"엑셀 (.xlsx, .xls, .csv) \xb7 한글 (.hwpx)"})]})}),ez&&(0,l.jsx)(x.H,{className:"shrink-0",children:ez})]}),3===ef&&eo&&!ed&&(0,l.jsxs)("div",{className:"flex flex-col gap-4 animate-in fade-in duration-300",children:[ej?(0,l.jsxs)("div",{className:"py-16 flex flex-col items-center gap-2 text-center",children:[(0,l.jsx)(a.Z,{className:"w-5 h-5 text-zinc-400 animate-spin"}),(0,l.jsx)("p",{className:"text-[15px] font-bold text-zinc-800 dark:text-zinc-200",children:"명단을 읽는 중이에요"})]}):(0,l.jsxs)(l.Fragment,{children:[!eR&&(0,l.jsxs)("div",{className:"rounded-2xl border border-zinc-200 dark:border-zinc-800 bg-zinc-50 dark:bg-zinc-800/40 px-4 py-4",children:[(0,l.jsx)("p",{className:"text-[15px] font-bold text-zinc-900 dark:text-white",children:"명렬표 파일은 PC에서 올리는 게 편해요"}),(0,l.jsxs)("p",{className:"mt-1 text-[13px] leading-relaxed text-zinc-500 dark:text-zinc-400",children:["PC에서 naemo.ai에 로그인하면 명단 등록을 이어서 할 수 있어요.",null!==tg&&tg>0&&" 가져온 학사일정은 그대로 남아 있어요."]})]}),(0,l.jsxs)("div",{className:"space-y-1.5",children:[!eR&&(0,l.jsx)("p",{className:"text-[11px] font-bold tracking-widest text-zinc-400 dark:text-zinc-500 px-1 pb-0.5",children:"폰에서 바로 하려면"}),[{label:"이름 붙여넣기",desc:"카톡\xb7메모에 있는 명단",onClick:()=>eu(!0)},{label:"파일 고르기",desc:"폰에 명렬표 파일이 있다면",onClick:()=>{var e;return null===(e=eG.current)||void 0===e?void 0:e.click()}},{label:"직접 입력하기",desc:"한 명씩 적어요",onClick:tj}].map(e=>{let{label:t,desc:n,onClick:r}=e;return(0,l.jsxs)("button",{type:"button",onClick:r,className:"w-full flex items-center gap-2.5 px-4 py-3 rounded-xl bg-white dark:bg-zinc-800/50 border border-zinc-200 dark:border-zinc-800 hover:bg-zinc-50 dark:hover:bg-zinc-800 transition-colors text-left",children:[(0,l.jsx)(i.Z,{size:13,className:"text-zinc-400 dark:text-zinc-500 shrink-0"}),(0,l.jsx)("span",{className:"text-[14px] font-semibold text-zinc-800 dark:text-zinc-200 shrink-0",children:t}),(0,l.jsx)("span",{className:"text-[12px] text-zinc-400 dark:text-zinc-500 truncate",children:n})]},t)})]})]}),ez&&(0,l.jsx)(x.H,{className:"shrink-0",children:ez})]}),3===ef&&eo&&ed&&(0,l.jsxs)("div",{className:"h-full flex flex-col gap-2 animate-in fade-in duration-300",children:[(0,l.jsx)("p",{className:"shrink-0 text-[13px] leading-relaxed text-zinc-500 dark:text-zinc-400",children:"한 줄에 한 명씩 붙여넣어 주세요. 번호가 없으면 차례대로 붙여 드려요."}),(0,l.jsx)("textarea",{value:ex,onChange:e=>em(e.target.value),placeholder:"1 김하나\n2 이두리\n3 박세나","aria-label":"명단 붙여넣기",className:"flex-1 min-h-[160px] w-full resize-none rounded-xl border-2 border-zinc-200 dark:border-zinc-700 bg-white dark:bg-zinc-800/60 px-3 py-2.5 text-[16px] leading-relaxed text-zinc-900 dark:text-white placeholder:text-zinc-300 dark:placeholder:text-zinc-600 outline-none focus:border-zinc-900 dark:focus:border-zinc-400 transition-colors"}),(0,l.jsx)("p",{className:"shrink-0 h-4 text-[12px] font-medium text-zinc-500 dark:text-zinc-400",children:eh.length>0?"".concat(eh.length,"명을 찾았어요"):""})]}),4===ef&&(0,l.jsxs)("div",{className:"h-full flex flex-col gap-2 pt-1 animate-in fade-in slide-in-from-right-4 duration-300",children:[eO&&tC&&(0,l.jsxs)("div",{className:"shrink-0 space-y-1 pb-1",children:[(0,l.jsxs)("div",{className:"flex items-center gap-3",children:[(0,l.jsx)("label",{htmlFor:"wizard-subject-class-name",className:"shrink-0 text-[13px] font-semibold text-zinc-500 dark:text-zinc-400",children:"학급 이름"}),(0,l.jsx)("input",{id:"wizard-subject-class-name",type:"text",value:e1,onChange:e=>{e2(e.target.value),eE(null)},placeholder:"예: 2학년 수학",maxLength:40,className:"flex-1 min-w-0 h-9 px-3 rounded-xl border-2 border-zinc-200 dark:border-zinc-700 bg-white dark:bg-zinc-800/60 text-[14px] text-zinc-900 dark:text-white placeholder:text-zinc-400 dark:placeholder:text-zinc-600 outline-none focus:border-zinc-900 dark:focus:border-zinc-400 transition-colors"})]}),tL&&tS&&(0,l.jsx)("p",{className:"text-[12px] font-medium text-[#d97757]",children:tL})]}),eO&&tP.size>0&&(0,l.jsxs)("p",{className:"shrink-0 text-[12px] text-zinc-500 dark:text-zinc-400",children:["이미 같은 이름의 학급이 있어"," ",Array.from(tP.values()).map(e=>"'".concat(e,"'")).join(", "),"(으)로 새로 만들어요."]}),(0,l.jsxs)("div",{className:"shrink-0 flex items-center justify-between gap-3 px-0.5 pb-0.5",children:[(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsxs)("span",{className:"text-[13px] font-semibold text-zinc-900 dark:text-white",children:[eO?"인식된 ".concat(tZ.length,"명"):"인식된 담임 학생 ".concat(tZ.length,"명"),eO&&tE.length>1&&(0,l.jsxs)("span",{className:"ml-1.5 text-[12px] text-zinc-400 dark:text-zinc-500 font-normal",children:["\xb7 ",tE.length,"개 교과 학급"]}
1)]}),tT.size>0&&(0,l.jsxs)("span",{className:"text-[12px] font-medium text-[#d97757]",children:["\xb7 ","all"===eU||(null===(t=tF.get(eU))||void 0===t?void 0:t.hasDup)?"중복된 번호가 있어요":"다른 학급에 중복된 번호가 있어요"]})]}),(0,l.jsx)("button",{type:"button",onClick:tM,className:"text-[13px] font-medium text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 transition-colors",children:"+ 학생 추가"})]}),eO&&tE.length>1&&(0,l.jsxs)("div",{className:"shrink-0 flex items-center gap-1.5 overflow-x-auto py-1 scrollbar-none border-b border-zinc-100 dark:border-zinc-800/80",children:[(0,l.jsxs)("button",{type:"button",onClick:()=>eq("all"),className:(0,u.cn)("px-2.5 py-1 rounded-lg text-[12px] transition-all whitespace-nowrap shrink-0 flex items-center gap-1.5","all"===eU?"wizard-tab-active bg-zinc-900 text-white dark:bg-zinc-100 dark:text-zinc-900 hover:bg-zinc-800 dark:hover:bg-zinc-200 font-semibold shadow-xs":"text-zinc-500 dark:text-zinc-400 hover:text-zinc-800 dark:hover:text-zinc-200 hover:bg-zinc-100 dark:hover:bg-zinc-800/60 font-medium"),children:[(0,l.jsx)("span",{children:"전체"}),(0,l.jsx)("span",{className:(0,u.cn)("text-[11px] tabular-nums","all"===eU?"text-white dark:text-zinc-900 font-bold":"text-zinc-400 dark:text-zinc-500 font-medium"),children:tZ.length})]}),tE.map(e=>{var t;let n=tF.get(e),r=eU===e;return(0,l.jsxs)("button",{type:"button",onClick:()=>eq(e),className:(0,u.cn)("px-2.5 py-1 rounded-lg text-[12px] transition-all whitespace-nowrap shrink-0 flex items-center gap-1.5",r?"wizard-tab-active bg-zinc-900 text-white dark:bg-zinc-100 dark:text-zinc-900 hover:bg-zinc-800 dark:hover:bg-zinc-200 font-semibold shadow-xs":"text-zinc-500 dark:text-zinc-400 hover:text-zinc-800 dark:hover:text-zinc-200 hover:bg-zinc-100 dark:hover:bg-zinc-800/60 font-medium"),children:[(0,l.jsx)("span",{children:e}),(0,l.jsx)("span",{className:(0,u.cn)("text-[11px] tabular-nums",r?"text-white dark:text-zinc-900 font-bold":"text-zinc-400 dark:text-zinc-500 font-medium"),children:null!==(t=null==n?void 0:n.count)&&void 0!==t?t:0}),(null==n?void 0:n.hasDup)&&(0,l.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-[#d97757]",title:"중복된 번호가 있습니다"})]},e)})]}),(0,l.jsx)("div",{className:"flex-1 min-h-0 border-y border-zinc-200 dark:border-zinc-800 bg-transparent flex flex-col overflow-hidden",children:(0,l.jsx)("div",{ref:eV,className:"flex-1 min-h-0 overflow-y-auto",children:0===tR.length?(0,l.jsxs)("div",{className:"h-full flex flex-col items-center justify-center py-12 text-center",children:[(0,l.jsx)("p",{className:"text-[13px] text-zinc-400 dark:text-zinc-500",children:"all"===eU?"등록된 학생이 없어요":"".concat(eU,"에 등록된 학생이 없어요")}),(0,l.jsx)("button",{type:"button",onClick:tM,className:"mt-2 text-[12px] font-medium text-blue-600 dark:text-blue-400 hover:underline",children:"+ 학생 추가하기"})]}):(0,l.jsxs)("table",{className:"w-full table-fixed text-center border-collapse",children:[(0,l.jsxs)("colgroup",{children:[(0,l.jsx)("col",{style:{width:"44px"}}),(0,l.jsx)("col",{style:{width:tH}}),(0,l.jsx)("col",{style:{width:"56px"}}),(0,l.jsx)("col",{}),(0,l.jsx)("col",{style:{width:"36px"}})]}),(0,l.jsx)("thead",{className:"sticky top-0 bg-white/95 dark:bg-zinc-900/95 backdrop-blur-xs border-b border-zinc-100 dark:border-zinc-800 z-10 text-[11px] font-medium text-zinc-400 dark:text-zinc-500",children:(0,l.jsxs)("tr",{children:[(0,l.jsx)("th",{className:"py-2.5 text-center font-medium",children:"학년"}),(0,l.jsx)("th",{className:"py-2.5 text-center font-medium",children:eO&&tE.length>1?"학급":"반"}),(0,l.jsx)("th",{className:"py-2.5 text-center font-medium",children:"번호"}),(0,l.jsx)("th",{className:"py-2.5 text-center font-medium",children:"이름"}),(0,l.jsx)("th",{className:"py-2.5 pr-2"})]})}),(0,l.jsx)("tbody",{className:"divide-y divide-zinc-100 dark:divide-zinc-800/60",children:tR.map(e=>{var t,n;let r=tA(e),a="number"==typeof e.number&&0!==e.number&&null!==(n=null===(t=tT.get(r))||void 0===t?void 0:t.has(e.number))&&void 0!==n&&n,{grade:i,classNum:c,className:o}=tI(e),d=i>0?i:null,x=eO&&tE.length>1?o:c>0?c:e.className||null;return(0,l.jsxs)("tr",{className:"group transition-colors h-10 hover:bg-zinc-50/60 dark:hover:bg-zinc-800/30",children:[(0,l.jsx)("td",{className:"py-1 text-center text-[13px] font-normal text-zinc-500 dark:text-zinc-400 tabular-nums",children:null!=d?d:"—"}),(0,l.jsx)("td",{className:"py-1 text-center text-[13px] font-normal text-zinc-500 dark:text-zinc-400 tabular-nums truncate px-1.5 whitespace-nowrap",title:String(null!=x?x:""),children:null!=x?x:"—"}),(0,l.jsx)("td",{className:"py-1 px-1 text-center",children:(0,l.jsx)("input",{type:"number",value:""===e.number?"":e.number,onChange:t=>ty(e._id,"number",t.target.value),placeholder:"—",className:(0,u.cn)("w-9 h-7 mx-auto text-center rounded-md text-[13px] tabular-nums outline-none transition","[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",a?"text-[#d97757] font-semibold bg-[#d97757]/10 dark:bg-[#d97757]/15 ring-1 ring-[#d97757]/40":"bg-transparent font-medium text-zinc-800 dark:text-zinc-200 hover:bg-zinc-100/70 dark:hover:bg-zinc-800/60 focus:bg-white dark:focus:bg-zinc-800 focus:ring-1 focus:ring-zinc-400 dark:focus:ring-zinc-500")})}),(0,l.jsx)("td",{className:"py-1 px-2 text-center",children:(0,l.jsx)("input",{type:"text",value:e.name,onChange:t=>ty(e._id,"name",t.target.value),placeholder:"이름 입력",className:"w-full max-w-[220px] mx-auto h-7 px-2 text-center rounded-md text-[13px] font-medium text-zinc-900 dark:text-zinc-100 bg-transparent hover:bg-zinc-100/70 dark:hover:bg-zinc-800/60 focus:bg-white dark:focus:bg-zinc-800 focus:ring-1 focus:ring-zinc-400 dark:focus:ring-zinc-500 outline-none transition placeholder:text-zinc-300 dark:placeholder:text-zinc-600 placeholder:text-center"})}),(0,l.jsx)("td",{className:"py-1 pr-2 text-right",children:(0,l.jsx)("button",{type:"button","aria-label":"행 삭제",onClick:()=>
1tD(e._id),className:"w-7 h-7 inline-flex items-center justify-center rounded-md text-zinc-300 dark:text-zinc-500 hover:text-zinc-600 dark:hover:text-zinc-300 hover:bg-zinc-100 dark:hover:bg-zinc-800 transition opacity-0 group-hover:opacity-100",children:(0,l.jsx)(s.Z,{size:13})})})]},e._id)})})]})})}),eA&&(0,l.jsx)(x.H,{className:"shrink-0",children:eA})]}),2===ef&&(0,l.jsx)("div",{className:"h-full flex flex-col gap-3 pt-1 animate-in fade-in slide-in-from-right-4 duration-300",children:null!==tg?(0,l.jsxs)("div",{className:"flex-1 flex flex-col items-center justify-center gap-3 animate-in fade-in zoom-in-95 duration-300 text-center py-8",children:[(0,l.jsxs)("p",{className:"text-[20px] font-black tracking-tight text-zinc-900 dark:text-white",children:["신규 ",tg,"개 일정을 가져왔어요"]}),(0,l.jsxs)("div",{className:"flex items-center gap-2 text-zinc-400 dark:text-zinc-500 text-[12px] pt-2 font-medium",children:[(0,l.jsx)(a.Z,{className:"w-3.5 h-3.5 animate-spin"}),"다음 단계로 이동하는 중..."]})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)("div",{className:"shrink-0 relative",children:[(0,l.jsx)(c.Z,{size:15,className:"absolute left-3.5 top-1/2 -translate-y-1/2 text-zinc-400 pointer-events-none"}),(0,l.jsx)("input",{ref:tz,type:"text",value:te,onChange:e=>{e6.current=!0,tt(e.target.value),e7(null),to(null),tu(new Set),tb(null)},placeholder:ti?"저장된 학교를 확인하는 중...":"학교 이름을 입력하세요",className:"w-full pl-9 pr-9 py-2.5 rounded-xl border-2 border-zinc-200 dark:border-zinc-700 bg-white dark:bg-zinc-800/60 text-[14px] text-zinc-900 dark:text-white placeholder:text-zinc-400 dark:placeholder:text-zinc-600 outline-none focus:border-zinc-900 dark:focus:border-zinc-400 transition-colors"}),(tr||ti)&&(0,l.jsx)(a.Z,{size:13,className:"absolute right-3.5 top-1/2 -translate-y-1/2 text-zinc-400 animate-spin"})]}),tn.length>0&&!e8&&(0,l.jsx)("div",{className:"flex-1 min-h-0 max-h-[320px] rounded-2xl border border-zinc-200 dark:border-zinc-700 overflow-y-auto divide-y divide-zinc-100 dark:divide-zinc-800/80 animate-in fade-in slide-in-from-top-1 duration-200 shadow-xs",children:tn.map(e=>(0,l.jsxs)("button",{onMouseDown:t=>{t.preventDefault(),tO(e)},className:"w-full text-left px-4 py-3 hover:bg-zinc-50 dark:hover:bg-zinc-800/60 transition-colors group",children:[(0,l.jsx)("p",{className:"text-[13px] font-semibold text-zinc-900 dark:text-white",children:e.schoolName}),e.address&&(0,l.jsx)("p",{className:"text-[11px] text-zinc-400 dark:text-zinc-500 mt-0.5 leading-normal",children:e.address})]},"".concat(e.officeCode,"-").concat(e.schoolCode)))}),e8&&(0,l.jsx)("div",{className:"flex-1 min-h-0 rounded-2xl border border-zinc-200 dark:border-zinc-700 overflow-hidden flex flex-col",children:tx?(0,l.jsxs)("div",{className:"flex-1 flex flex-col items-center justify-center gap-2",children:[(0,l.jsx)(a.Z,{className:"w-5 h-5 text-zinc-400 animate-spin"}),(0,l.jsx)("p",{className:"text-[12px] text-zinc-500 dark:text-zinc-400",children:"학사일정을 가져오는 중..."})]}):tc?(0,l.jsx)("div",{className:"flex-1 overflow-y-auto",children:0===tq.length?(0,l.jsx)("p",{className:"py-8 text-center text-[13px] text-zinc-500 dark:text-zinc-400",children:tc.summary.duplicateCount>0?"학사일정은 이미 가져왔어요":"이번 학기에 새로 가져올 일정이 없어요"}):tq.map(e=>{let t=td.has(e.externalId);return(0,l.jsxs)("label",{className:"grid grid-cols-[5.5rem_minmax(0,1fr)_2rem] items-center gap-2 px-4 py-2 text-[13px] hover:bg-zinc-50 dark:hover:bg-zinc-800/30 cursor-pointer",children:[(0,l.jsxs)("span",{className:(0,u.cn)("text-[11px] text-zinc-500 dark:text-zinc-400 tabular-nums",t&&"opacity-40"),children:[e.date,e.endDate&&e.endDate!==e.date&&" ~".concat(e.endDate.slice(5))]}),(0,l.jsx)("span",{className:(0,u.cn)("truncate font-medium text-zinc-800 dark:text-zinc-200",t&&"opacity-40"),children:e.title}),(0,l.jsx)("input",{type:"checkbox",checked:!t,onChange:()=>tY(e.externalId),className:"justify-self-center h-4 w-4 rounded border-zinc-300 accent-zinc-900 dark:accent-white"})]},e.externalId)})}):(0,l.jsx)("div",{className:"flex-1 flex items-center justify-center",children:(0,l.jsx)("p",{className:"text-[13px] text-zinc-500 dark:text-zinc-400",children:"학교를 선택해 주세요"})})}),tf&&(0,l.jsx)(x.H,{className:"shrink-0",children:tf})]})}),5===ef&&(0,l.jsxs)("div",{className:"flex flex-col gap-4 pt-1 animate-in fade-in zoom-in-95 duration-300",children:[(0,l.jsx)("div",{className:"space-y-1",children:(0,l.jsx)("p",{className:"text-[14px] font-medium text-zinc-600 dark:text-zinc-300 leading-relaxed",children:"선생님의 빠른 퇴근을 항상 응원합니다."})}),(0,l.jsxs)("div",{className:"w-full space-y-1.5",children:[(0,l.jsx)("p",{className:"text-[11px] font-bold tracking-widest uppercase text-zinc-400 dark:text-zinc-500 px-1 pb-0.5",children:"이런 것도 해보세요"}),[...eP&&!eB?[{label:"교과 학급 추가",desc:"담임 외 수업 반도 함께 관리해요",onClick:()=>{eH(!0),ev([]),eY(""),e2(""),ek(null),eE(null),eq("all"),eb(3)}}]:[{label:"교과 학급 더 추가하기",desc:"새로운 수업 반을 추가로 등록해요",onClick:()=>{eH(!0),ev([]),eY(""),e2(""),ek(null),eE(null),eq("all"),eb(3)}}],{label:"시간표 세팅",desc:"오늘 수업을 대시보드에서 바로 확인해요",onClick:()=>{er(),e3("timetable")}},{label:"대시보드 위젯 꾸미기",desc:"급식\xb7자리배치 등 위젯을 배치해요",onClick:()=>{er(),e3("dashboard-layout")}}].map(e=>{let{label:t,desc:n,onClick:r}=e;return(0,l.jsxs)("button",{onClick:r,className:"w-full flex items-center gap-2.5 px-4 py-2.5 rounded-xl bg-zinc-50 dark:bg-zinc-800/50 border border-zinc-100 dark:border-zinc-800 hover:bg-zinc-100 dark:hover:bg-zinc-800 hover:border-zinc-200 dark:hover:border-zinc-700 transition-colors text-left",children:[(0,l.jsx)(i.Z,{size:13,className:"text-zinc-400 dark:text-zinc-500 shrink-0"}),(0,l.jsxs)("div",{className:"flex items-center gap-2 min-w-0 overflow-hidden whitespace-nowrap",children:[(0,l.jsx)("span",{className:"text-[13px] font-semibold text-zinc-700 dark:text-zinc-300 shrink-0 whitespace-nowrap",children:t}),(0,l.jsx)("span",{className:"text-[12px] text-zinc-400 dark:text-zinc-500 truncate whitespace-nowrap",children:n})]})]},t)})]})]})]}),(0,l.jsx)("div",{className:"shrink-0 px-4 sm:px-7 pt-2 pb-5 bg-white dark:bg-zinc-900 flex items-center justify-between gap-1",children:ef<5?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)("button",{onClick:tU?er:el,disabled:2===ef&&null!==tg,className:"shrink-0 whitespace-nowrap text-[13px] font-medium text-zinc-400 dark:text-zinc-500 hover:text-zinc-700 dark:hover:text-zinc-300 transition-colors px-1 disabled:opacity-40",children:["나중에",(0,l.jsx)("span",{className:"hidden sm:inline",children:" 할게요"})]}),(0,l.jsxs)("div",{className:"flex items-center gap-1 sm:gap-2",children:[ef>1&&!(2===ef&&null!==tg)&&(0,l.jsxs)("button",{onClick:3===ef&&ed?()=>eu(!1):()=>
1{if(eR){if(3===ef){eH(!1),ev([]),eY(""),ek(null),eE(null),eb(5);return}if(4===ef){eb(3);return}}eb(e=>{let t=e-1;return 2===t&&tv(null),t})},className:"inline-flex items-center gap-1.5 whitespace-nowrap px-2 sm:px-3 py-2 rounded-xl text-[13px] font-semibold text-zinc-500 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-zinc-100 hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors",children:[(0,l.jsx)(o.Z,{size:14,className:"hidden sm:block"}),"이전"]}),2===ef&&null===tg&&!(tc&&0===tq.length)&&(0,l.jsx)("button",{onClick:()=>eb(3),disabled:th,className:"inline-flex items-center gap-1.5 whitespace-nowrap px-2 sm:px-3 py-2 rounded-xl text-[13px] font-semibold text-zinc-500 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-zinc-100 hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors disabled:opacity-40",children:"건너뛰기"}),1===ef&&(0,l.jsxs)(D,{onClick:()=>eb(2),disabled:eP&&(!eT||!e$),children:["시작하기",(0,l.jsx)(i.Z,{size:14})]}),tJ&&(0,l.jsx)(D,{onClick:ea,children:"PC에서 이어서 할게요"}),3===ef&&eo&&ed&&(0,l.jsxs)(D,{onClick:()=>{0!==eh.length&&(eY(""),e2(""),eS(!1),ek(null),tk(eh),eu(!1))},disabled:0===eh.length,children:[eh.length>0?"".concat(eh.length,"명 확인하기"):"확인하기",(0,l.jsx)(i.Z,{size:14})]}),3===ef&&!eo&&(0,l.jsxs)("button",{onClick:tj,className:"inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-[13px] font-semibold text-zinc-500 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-zinc-100 hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors",children:["직접 입력하기",(0,l.jsx)(i.Z,{size:14})]}),4===ef&&(0,l.jsxs)(D,{onClick:tB,disabled:eI||0===tZ.length||tT.size>0||!!tL,children:[eI&&(0,l.jsx)(a.Z,{size:13,className:"animate-spin"}),eI?"등록 중...":"".concat(tZ.length,"명 등록하기")]}),2===ef&&(null!==tg?(0,l.jsxs)(D,{disabled:!0,children:[(0,l.jsx)(a.Z,{size:13,className:"animate-spin"}),"잠시만요..."]}):tc&&0===tq.length?(0,l.jsxs)(D,{onClick:()=>eb(3),children:["다음",(0,l.jsx)(i.Z,{size:14})]}):(0,l.jsxs)(D,{onClick:tQ,disabled:!tc||th||tx||0===tG,children:[th&&(0,l.jsx)(a.Z,{size:13,className:"animate-spin"}
1),th?"가져오는 중...":tc?"".concat(tG,"개 가져오기"):"가져오기"]}))]})]}):(0,l.jsxs)(D,{onClick:er,className:"w-full justify-center",children:["내모 시작하기",(0,l.jsx)(i.Z,{size:14})]})})]})]})})})}},60706:function(e,t,n){n.d(t,{T:function(){return l}});function l(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,n){n.d(t,{DX:function(){return s},RM:function(){return a}});var l=n(60706);let r=["학년","반","번호","이름"];async function a(){let e=await Promise.all([n.e(1425),n.e(6919)]).then(n.bind(n,2093)),t=e.utils.book_new(),l=e.utils.aoa_to_sheet([r]);["A1","B1","C1","D1"].forEach(e=>{l[e]&&(l[e].s={alignment:{horizontal:"center"}})}),e.utils.book_append_sheet(t,l,"Sheet1"),e.writeFile(t,"내모_학생명단_양식.xlsx")}async function i(e){let t=await Promise.all([n.e(1425),n.e(6919)]).then(n.bind(n,2093)),r=t.read(new Uint8Array(e),{type:"array"}),a=r.SheetNames[0],i=r.Sheets[a],s=t.utils.sheet_to_json(i,{header:1}),c=-1,o={grade:-1,class:-1,number:-1,name:-1,memo:-1};for(let e=0;e<Math.min(s.length,5);e++){let t=s[e];if(Array.isArray(t)&&(t.forEach((e,t)=>{let n=String(e).trim();n.includes("학년")&&(o.grade=t),("반"===n||n.includes("학급")||n.includes("반"))&&(o.class=t),n.includes("번호")&&(o.number=t),(n.includes("이름")||n.includes("성명"))&&(o.name=t),(n.includes("비고")||n.includes("기록")||n.includes("메모"))&&(o.memo=t)}),-1!==o.number&&-1!==o.name)){c=e;break}}let d=[];
1return(-1!==c?s.slice(c+1):s).forEach(e=>{let t,n;if(!Array.isArray(e)||0===e.length)return;let r=0,a="",i="",s="number"==typeof e[2]||/^\d+$/.test(e[2])?parseInt(e[2]):NaN,u=e[3];if(-1===c&&e.length>=4&&!isNaN(s)&&"string"==typeof u&&/^[가-힣a-zA-Z\s]{2,20}$/.test(u.trim()))t=parseInt(String(e[0]).replace(/[^0-9]/g,""))||void 0,n=String(e[1]).replace(/[^0-9]/g,""),r=s,a=u.trim();else if(-1!==c&&-1!==o.number&&-1!==o.name){let l=e[o.number],s=e[o.name];l&&s&&(r=parseInt(String(l).replace(/[^0-9]/g,"")),a=String(s).trim(),-1!==o.grade&&(t=parseInt(String(e[o.grade]).replace(/[^0-9]/g,""))||void 0),-1!==o.class&&(n=String(e[o.class]).replace(/[^0-9]/g,"")),-1!==o.memo&&(i=String(e[o.memo])))}else if(-1===c&&e.length>=2){let i=String(e[0]).trim(),s=String(e[1]).trim(),c=(0,l.T)(i);c&&/^[가-힣a-zA-Z\s]{2,20}$/.test(s)&&(t=c.grade,n=String(c.classNum),r=c.number,a=s)}a||e.forEach(e=>{if("number"!=typeof e||r){if("string"==typeof e){let t=e.trim();!r&&/^\d+$/.test(t)?r=parseInt(t):!a&&/^[가-힣a-zA-Z\s]{2,20}$/.test(t)&&(a=t.trim())}}else r=e}),r&&a&&d.push({number:r,name:a,memo:i,grade:t,classNum:n?parseInt(n,10):void 0})}),d.sort((e,t)=>{let n=(Number(e.grade)||0)-(Number(t.grade)||0);if(0!==n)return n;let l=(Number(e.classNum)||0)-(Number(t.classNum)||0);return 0!==l?l:(Number(e.number)||0)-(Number(t.number)||0)})}async function s(e){return i(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.