1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4873],{31047:function(t,e,r){r.d(e,{Z:function(){return s}});let s=(0,r(79205).Z)("Calendar",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]])},92451:function(t,e,r){r.d(e,{Z:function(){return s}});let s=(0,r(79205).Z)("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]])},51817:function(t,e,r){r.d(e,{Z:function(){return s}});let s=(0,r(79205).Z)("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]])},99397:function(t,e,r){r.d(e,{Z:function(){return s}});let s=(0,r(79205).Z)("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]])},73247:function(t,e,r){r.d(e,{Z:function(){return s}});let s=(0,r(79205).Z)("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]])},82029:function(t,e,r){r.d(e,{Z:function(){return s}});let s=(0,r(79205).Z)("Table",[["path",{d:"M12 3v18",key:"108xh3"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M3 15h18",key:"5xshup"}]])},18930:function(t,e,r){r.d(e,{Z:function(){return s}});let s=(0,r(79205).Z)("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]])},17689:function(t,e,r){r.d(e,{Z:function(){return s}});let s=(0,r(79205).Z)("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]])},60850:function(t,e,r){r.d(e,{CZ:function(){return a},R2:function(){return i},T9:function(){return o},fk:function(){return n},mK:function(){return u}}),r(83079);var s=r(12119),a=(0,s.$)("489a0c9551b931e08d89f7f5f5c892c7b23fefff"),i=(0,s.$)("2a95e2f3f90e7fed938e495986951730a05744b5"),n=(0,s.$)("b4d076709ab489b493a50d11e39e0979ff1959b6"),o=(0,s.$)("b9f327ac565182d2647700118e1b3771a61f0997"),u=(0,s.$)("0fc61a8119cacee671e8cde298a46648317d4bef")},73348:function(t,e,r){r.d(e,{Z:function(){return o}});var s=r(57437),a=r(2265),i=r(76865),n=r(46977);function o(t){let{open:e,title:r,description:o,consequences:u,confirmLabel:c="ìì ",cancelLabel:l="ì·¨ì",tone:d="danger",busy:h=!1,onConfirm:m,onCancel:f}=t,p="danger"===d,y=(0,a.useRef)(null),b=(0,n.a)(e,()=>{h||f()});return((0,a.useEffect)(()=>{var t;e&&(null===(t=y.current)||void 0===t||t.focus())},[e]),e)?(0,s.jsx)("div",{className:"modal-viewport z-[200] flex items-center justify-center p-4 bg-black/50",onKeyDown:t=>{if("Tab"!==t.key||!b.current)return;let e=b.current.querySelectorAll('button:not([disabled]), [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');if(0===e.length)return;let r=e[0],s=e[e.length-1];t.shiftKey&&document.activeElement===r?(t.preventDefault(),s.focus()):t.shiftKey||document.activeElement!==s||(t.preventDefault(),r.focus())},children:(0,s.jsxs)("div",{ref:b,role:"dialog","aria-modal":"true","aria-labelledby":"danger-confirm-title",className:"w-full max-w-md rounded-2xl bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 shadow-xl p-5",children:[(0,s.jsxs)("div",{className:"flex items-start gap-2.5",children:[p&&(0,s.jsx)(i.Z,{size:18,className:"shrink-0 mt-[3px] text-red-600 dark:text-red-400","aria-hidden":"true"}),(0,s.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,s.jsx)("h2",{id:"danger-confirm-title",className:"text-[15px] font-bold text-zinc-900 dark:text-zinc-100 leading-snug break-keep",children:r}),o&&(0,s.jsx)("p",{className:"mt-1 text-[13px] text-zinc-600 dark:text-zinc-400 leading-relaxed break-keep",children:o})]})]}),u&&u.length>0&&(0,s.jsxs)("div",{className:"mt-4 rounded-xl bg-red-50 dark:bg-red-950/20 border border-red-200 dark:border-red-900/40 px-4 py-3",children:[(0,s.jsx)("p",{className:"text-[12px] font-semibold text-red-700 dark:text-red-300 mb-1.5",children:"í¨ê» ì¬ë¼ì§ë 기ë¡"}),(0,s.jsx)("ul",{className:"space-y-0.5",children:u.map(t=>(0,s.jsxs)("li",{className:"text-[13px] text-red-800 dark:text-red-200 break-keep",children:["\xb7 ",t]},t))}),(0,s.jsx)("p",{className:"mt-2 text-[12px] font-medium text-red-700 dark:text-red-300",children:"í ë² ìì íë©´ ëë릴 ì ììµëë¤."})]}),(0,s.jsxs)("div",{className:"mt-5 flex gap-2 justify-end",children:[(0,s.jsx)("button",{ref:y,type:"button",onClick:f,disabled:h,className:"px-4 py-2 rounded-xl text-[13px] font-semibold text-zinc-700 dark:text-zinc-300 bg-zinc-100 dark:bg-zinc-800 hover:bg-zinc-200 dark:hover:bg-zinc-700 transition disabled:opacity-50",children:l}),(0,s.jsx)("button",{type:"button",onClick:m,disabled:h,className:p?"px-4 py-2 rounded-xl text-[13px] font-semibold text-white bg-red-600 hover:bg-red-700 transition disabled:opacity-50":"btn-primary-solid px-4 py-2 rounded-xl text-[13px] font-semibold transition",children:h?"ì²ë¦¬íë ì¤â¦":c})]})]})}):null}},78529:function(t,e,r){r.d(e,{A:function(){return a}});var s=r(57437);function a(t){let{message:e,onRetry:r}=t;return(0,s.jsxs)("div",{role:"alert",className:"p-4 text-sm text-red-700 dark:text-red-300",children:[(0,s.jsx)("p",{children:e}),(0,s.jsx)("button",{type:"button",onClick:r,className:"mt-2 min-h-11 rounded-lg border border-current px-3 font-medium focus-visible:outline focus-visible:outline-2",children:"ë¤ì ë¶ë¬ì¤ê¸°"})]})}},10136:function(t,e,r){r.d(e,{N:function(){return o},W:function(){return u}});var s=r(57437),a=r(2265),i=r(73348);let n=(0,a.createContext)(null);function o(){let t=(0,a.useContext)(n);if(!t)throw Error("useConfirmì ConfirmProvider ìììë§ ì¸ ì ììµëë¤.");return t}function u(t){var e,r;let{children:o}=t,[u,c]=(0,a.useState)(null),l=(0,a.useRef)(null),d=(0,a.useCallback)(t=>{var e;return null===(e=l.current)||void 0===e||e.call(l,!1),c(t),new Promise(t=>{l.current=t})},[]),h=(0,a.useCallback)(t=>{let e=l.current;l.current=null,c(null),null==e||e(t)},[]),m=null!==(e=null==u?void 0:u.tone)&&void 0!==e?e:"danger";return(0,s.jsxs)(n.Provider,{value:d,children:[o,u&&(0,s.jsx)(i.Z,{open:!0,title:u.title,de
1scription:u.description,consequences:"danger"===m?u.consequences:void 0,confirmLabel:null!==(r=u.confirmLabel)&&void 0!==r?r:"danger"===m?"ìì ":"íì¸",cancelLabel:u.cancelLabel,tone:m,onConfirm:()=>h(!0),onCancel:()=>h(!1)})]})}},4908:function(t,e,r){r.d(e,{Pl:function(){return p},fc:function(){return b},AF:function(){return y}});var s=r(57437),a=r(98319),i=r(2265),n=r(73369),o=r(29827),u=r(71632),c=r(83008),l=r(67920),d=r(27526),h=r(54696);function m(t){let{reloadStudents:e}=t,{data:r}=(0,d.kP)(),{createStudent:s}=(0,n.N)(),{addClass:a}=(0,n.Kw)(),o=(0,i.useRef)(!1);return(0,i.useEffect)(()=>{(null==r?void 0:r.user)&&!o.current&&(async()=>{o.current=!0;let t=!1,i={user:{id:r.user.id,name:r.user.name||"User",role:"admin"}};try{let e=localStorage.getItem("saemo-guest-classes");if(e){let r=JSON.parse(e).filter(t=>"ë´ì íê¸"!==t&&"ë´ìíê¸"!==t);if(r.length>0)for(let e of r)try{await a.mutateAsync(e),t=!0}catch(t){}localStorage.removeItem("saemo-guest-classes")}let r=localStorage.getItem("saemo-guest-students");if(r){let e=JSON.parse(r);if(Array.isArray(e)&&e.length>0)for(let r of e)try{var n;await s.mutateAsync({number:r.number,name:r.name,memo:r.memo,homeClassId:null!==(n=r.homeClassId)&&void 0!==n?n:r.classId,customClassIds:r.customClassIds||[],grade:r.grade,classNum:r.classNum}),t=!0}catch(t){}localStorage.removeItem("saemo-guest-students")}let o=localStorage.getItem("saemo-guest-dashboard-memo"),u=localStorage.getItem("dashboard-memo"),l=o||u;if(l){let e=await (0,c.X)("getDashboardMemo",{},i);e.success&&e.data||(await (0,c.X)("saveDashboardMemo",{content:l},i),t=!0),localStorage.removeItem("saemo-guest-dashboard-memo"),localStorage.removeItem("dashboard-memo")}let d=localStorage.getItem("teacher-timetable")||localStorage.getItem("saemo-guest-timetable-my");if(d){let e=JSON.parse(d),r=await (0,c.X)("getTimetable",{type:"teacher"},i);r.success&&r.data&&0!==Object.keys(r.data).length||(await (0,c.X)("saveTimetable",{type:"teacher",data:e},i),t=!0),localStorage.removeItem("teacher-timetable"),localStorage.removeItem("saemo-guest-timetable-my")}let h=localStorage.getItem("class-timetable")||localStorage.getItem("saemo-guest-timetable-class");if(h){let e=JSON.parse(h),r=await (0,c.X)("getTimetable",{type:"class"},i);r.success&&r.data&&0!==Object.keys(r.data).length||(await (0,c.X)("saveTimetable",{type:"class",data:e},i),t=!0),localStorage.removeItem("class-timetable"),localStorage.removeItem("saemo-guest-timetable-class")}}catch(t){console.error("Guest migration error:",t)}finally{t&&e(),o.current=!1}})()},[r,s,a,e]),null}let f=(0,i.createContext)(void 0);function p(t){let{children:e}=t,r=(0,n.wh)(),u=(0,n.tH)(),c=(0,n.N)(),l=(0,n.Kw)(),p=(0,o.NL)(),{showToast:y}=(0,a.pm)(),{status:b}=(0,d.kP)(),v=(0,h.Dv)(),x=(0,i.useRef)(b);(0,i.useEffect)(()=>{if(("loading"===x.current||"unauthenticated"===x.current)&&"authenticated"===b){let t=setTimeout(()=>{console.log("[StudentProvider] Session transition detected:",x.current,"â authenticated. Invalidating queries."),p.invalidateQueries({queryKey:n.bs.all}),p.invalidateQueries({queryKey:n.ic.all})},300);return x.current=b,()=>clearTimeout(t)}x.current=b},[b,p]),(0,i.useEffect)(()=>{if("authenticated"!==b||!r.isError&&!u.isError)return;console.warn("[StudentProvider] Self-healing: Query in error state while authenticated. Scheduling retry...");let t=setTimeout(()=>{console.log("[StudentProvider] Self-healing: Retrying failed queries."),p.invalidateQueries({queryKey:n.bs.all}),p.invalidateQueries({queryKey:n.ic.all})},2e3);return()=>clearTimeout(t)},[b,r.isError,u.isError,p]);let g=(0,i.useMemo)(()=>{var t;return null!==(t=r.data)&&void 0!==t?t:[]},[r.data]),k=(0,i.useMemo)(()=>{var t;return null!==(t=u.data)&&void 0!==t?t:["ë´ì íê¸"]},[u.data]),w=(0,i.useMemo)(()=>!!v||r.isSuccess&&u.isSuccess||r.isFetched&&void 0!==r.data,[v,r.isSuccess,u.isSuccess,r.isFetched,r.data]),C=r.isLoading||u.isLoading,S=r.isError||u.isError?r.error||u.error:null,M=l.addClass.mutateAsync,j=l.removeClass.mutateAsync,N=l.renameClass.mutateAsync,P=l.updateClassOrder.mutateAsync,R=c.createStudent.mutateAsync,E=c.deleteStudent.mutateAsync,O=c.updateStudent.mutateAsync,I=c.bulkCreateStudents.mutateAsync,Z=(0,i.useCallback)(async t=>{k.includes(t)||await M(t)},[k,M]),A=(0,i.useCallback)(async t=>{"ë´ì íê¸"!==t&&"ë´ìíê¸"!==t&&await j(t)},[j]),K=(0,i.useCallback)(async(t,e)=>{"ë´ì íê¸"!==t&&"ë´ìíê¸"!==t&&e.trim()&&t!==e&&await N({oldName:t,newName:e.trim()})},[N]),z=(0,i.useCallback)(async t=>{await P(t)},[P]),T=(0,i.useCallback)(async t=>{try{return await R(t),!0}catch(t){return console.error("Failed to add student:",t),y(t.message||"ìì²ì ì²ë¦¬íì§ ëª»íìµëë¤.","error"),!1}},[R,y]),L=(0,i.useCallback)(async t=>{try{return await E(t),!0}catch(t){return console.error("Failed to remove student:",t),!1}},[E]),q=(0,i.useCallback)(async(t,e)=>{try{return await O({id:t,...e}),!0}catch(t){return console.error("Failed to update student:",t),!1}},[O]),F=(0,i.useCallback)(async t=>{let e=g.length>0?Math.max(...g.map(t=>t.number)):0,r=t.map((t,r)=>({name:t,number:e+1+r}));await I({students:r})},[g,I]),D=r.refetch,X=(0,i.useCallback)(async()=>{await D()},[D]);(0,i.useEffect)(()=>{let t=()=>{p.invalidateQueries()};return window.addEventListener("refresh-active-view",t),()=>window.removeEventListener("refresh-active-view",t)},[p]);let G=(0,i.useMemo)(()=>({students:g,classes:k,addClass:Z,removeClass:A,renameClass:K,updateClassOrder:z,addStudent:T,removeStudent:L,updateStudent:q,bulkAddStudents:F,reloadStudents:X,isLoaded:w,isLoading:C,error:S}),[g,k,Z,A,K,z,T,L,q,F,X,w,C,S]);return(0,s.jsxs)(f.Provider,{value:G,children:[(0,s.jsx)(m,{reloadStudents:X}),e]})}function y(){let t=(0,i.useContext)(f);if(!t)throw Error("useStudents must be used within a StudentProvider");return t}function b(){var t;let{students:e,isLoaded:r}=y(),{data:s,status:a}=(0,d.kP)(),i=(0,l.XC)(),o=(0,h.Dv)(),m=r&&e.length>0,{data:f}=(0,u.a)({queryKey:[...n.bs.all,"has-roster",null==s?void 0:null===(t=s.user)||void 0===t?void 0:t.id],enabled:r&&!m&&!o&&"authenticated"===a,staleTime:6e5,queryFn:async()=>{var t;let e=await (0,c.X)("hasStudentRoster",{},i);return!!(e.success&&(null===(t=e.data)||void 0===t?void 0:t.hasRoster))}});return m||!0===f}}
1,2894:function(t,e,r){r.d(e,{R:function(){return o},m:function(){return n}});var s=r(18238),a=r(7989),i=r(11255),n=class extends a.F{#t;#e;#r;#s;constructor(t){super(),this.#t=t.client,this.mutationId=t.mutationId,this.#r=t.mutationCache,this.#e=[],this.state=t.state||o(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){this.#e.includes(t)||(this.#e.push(t),this.clearGcTimeout(),this.#r.notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){this.#e=this.#e.filter(e=>e!==t),this.scheduleGc(),this.#r.notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){this.#e.length||("pending"===this.state.status?this.scheduleGc():this.#r.remove(this))}continue(){return this.#s?.continue()??this.execute(this.state.variables)}async execute(t){let e=()=>{this.#a({type:"continue"})},r={client:this.#t,meta:this.options.meta,mutationKey:this.options.mutationKey};this.#s=(0,i.Mz)({fn:()=>this.options.mutationFn?this.options.mutationFn(t,r):Promise.reject(Error("No mutationFn found")),onFail:(t,e)=>{this.#a({type:"failed",failureCount:t,error:e})},onPause:()=>{this.#a({type:"pause"})},onContinue:e,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#r.canRun(this)});let s="pending"===this.state.status,a=!this.#s.canStart();try{if(s)e();else{this.#a({type:"pending",variables:t,isPaused:a}),this.#r.config.onMutate&&await this.#r.config.onMutate(t,this,r);let e=await this.options.onMutate?.(t,r);e!==this.state.context&&this.#a({type:"pending",context:e,variables:t,isPaused:a})}let i=await this.#s.start();return await this.#r.config.onSuccess?.(i,t,this.state.context,this,r),await this.options.onSuccess?.(i,t,this.state.context,r),await this.#r.config.onSettled?.(i,null,this.state.variables,this.state.context,this,r),await this.options.onSettled?.(i,null,t,this.state.context,r),this.#a({type:"success",data:i}),i}catch(e){try{await this.#r.config.onError?.(e,t,this.state.context,this,r)}catch(t){Promise.reject(t)}try{await this.options.onError?.(e,t,this.state.context,r)}catch(t){Promise.reject(t)}try{await this.#r.config.onSettled?.(void 0,e,this.state.variables,this.state.context,this,r)}catch(t){Promise.reject(t)}try{await this.options.onSettled?.(void 0,e,t,this.state.context,r)}catch(t){Promise.reject(t)}throw this.#a({type:"error",error:e}),e}finally{this.#r.runNext(this)}}#a(t){this.state=(e=>{switch(t.type){case"failed":return{...e,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...e,isPaused:!0};case"continue":return{...e,isPaused:!1};case"pending":return{...e,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...e,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...e,data:void 0,error:t.error,failureCount:e.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}})(this.state),s.Vr.batch(()=>{this.#e.forEach(e=>{e.onMutationUpdate(t)}),this.#r.notify({mutation:this,type:"updated",action:t})})}};function o(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}},21770:function(t,e,r){r.d(e,{D:function(){return l}});var s=r(2265),a=r(2894),i=r(18238),n=r(24112),o=r(45345),u=class extends n.l{#t;#i=void 0;#n;#o;constructor(t,e){super(),this.#t=t,this.setOptions(e),this.bindMethods(),this.#u()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(t){let e=this.options;this.options=this.#t.defaultMutationOptions(t),(0,o.VS)(this.options,e)||this.#t.getMutationCache().notify({type:"observerOptionsUpdated",mutation:this.#n,observer:this}),e?.mutationKey&&this.options.mutationKey&&(0,o.Ym)(e.mutationKey)!==(0,o.Ym)(this.options.mutationKey)?this.reset():this.#n?.state.status==="pending"&&this.#n.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(t){this.#u(),this.#c(t)}getCurrentResult(){return this.#i}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#u(),this.#c()}mutate(t,e){return this.#o=e,this.#n?.removeObserver(this),this.#n=this.#t.getMutationCache().build(this.#t,this.options),this.#n.addObserver(this),this.#n.execute(t)}#u(){let t=this.#n?.state??(0,a.R)();this.#i={...t,isPending:"pending"===t.status,isSuccess:"success"===t.status,isError:"error"===t.status,isIdle:"idle"===t.status,mutate:this.mutate,reset:this.reset}}#c(t){i.Vr.batch(()=>
1{if(this.#o&&this.hasListeners()){let e=this.#i.variables,r=this.#i.context,s={client:this.#t,meta:this.options.meta,mutationKey:this.options.mutationKey};if(t?.type==="success"){try{this.#o.onSuccess?.(t.data,e,r,s)}catch(t){Promise.reject(t)}try{this.#o.onSettled?.(t.data,null,e,r,s)}catch(t){Promise.reject(t)}}else if(t?.type==="error"){try{this.#o.onError?.(t.error,e,r,s)}catch(t){Promise.reject(t)}try{this.#o.onSettled?.(void 0,t.error,e,r,s)}catch(t){Promise.reject(t)}}}this.listeners.forEach(t=>{t(this.#i)})})}},c=r(29827);function l(t,e){let r=(0,c.NL)(e),[a]=s.useState(()=>new u(r,t));s.useEffect(()=>{a.setOptions(t)},[a,t]);let n=s.useSyncExternalStore(s.useCallback(t=>a.subscribe(i.Vr.batchCalls(t)),[a]),()=>a.getCurrentResult(),()=>a.getCurrentResult()),l=s.useCallback((t,e)=>{a.mutate(t,e).catch(o.ZT)},[a]);if(n.error&&(0,o.L3)(a.options.throwOnError,[n.error]))throw n.error;return{...n,mutate:l,mutateAsync:n.mutate}}},71632:function(t,e,r){r.d(e,{a:function(){return i}});var s=r(86900),a=r(68873);function i(t,e){return(0,a.r)(t,s.z,e)}},52345:function(t,e,r){r.d(e,{J:function(){return n}});var s=r(47435),a=r(4662),i=r(2265);function n(){s.O.current||(0,a.Ad)();let[t]=(0,i.useState)(s.n.current);return t}}}]);
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.