PageSourceSearch

https://teacherss.kr/assets/TryBehaviorPage-mVpGhO9p.js

js teacherss.kr collected 2026-10-02 02:01:21 UTC 7,681 bytes, 1 lines download raw bytes

1import{r as l,j as t}from"./vendor-react-D4NFYCVY.js";import{B as h,h as T,bf as A,C as P,am as U,T as X,t as d,aU as J}from"./index-Bo7vBx4r.js";import{n as W}from"./evaluationComments-BMKqDQbo.js";import{C as V,b as Y}from"./neisAutofillPayload-Cgs2KaME.js";import{e as q,p as Q,a as Z}from"./behaviorCommentExport-lHogX4rW.js";import{C as O}from"./ConversionBanner-CICNx5Ak.js";import{c as ee,d as w}from"./demoLimits-C0sGsMbz.js";import{r as te,w as se}from"./behaviorStore-8AbtiiNv.js";import{t as re,D as ae}from"./tryBehaviorGenerate-bmOOGbKQ.js";import{D as ne}from"./download-2uolYGOU.js";import"./vendor-data-DiuZHwsT.js";import"./vendor-state-mPENyaSF.js";import"./vendor-firebase-BXtaSaVx.js";import"./vendor-ui-DW-ZtMoV.js";import"./vendor-utils-CBGDym6X.js";import"./vendor-motion-LReuCgk7.js";import"./vendor-tiptap-DOlczfgE.js";function oe(c=new Date){const o=c.getMonth()+1;return o>=3&&o<=8?1:2}const F=[{key:"learning",label:"학습·태도"},{key:"character",label:"인성·행동"},{key:"peer",label:"교우관계"},{key:"talent",label:"특기·진로"},{key:"etc",label:"기타"}],le=[{value:"short",label:"짧게"},{value:"normal",label:"보통"},{value:"long",label:"길게"}],g=c=>
1({num:c,name:"",keywords:q(),comment:"",confirmed:!1}),L=c=>F.reduce((o,b)=>{var i;return o+(((i=c[b.key])==null?void 0:i.length)??0)},0);function Ce(){const c=l.useRef(te()).current,[o,b]=l.useState((c==null?void 0:c.grade)??ee),i=l.useRef({}),[,_]=l.useState(0),[N,v]=l.useState({}),x=l.useRef({}),[y,C]=l.useState(!1),[u,G]=l.useState("normal"),[I,S]=l.useState(!1),[R,D]=l.useState(null),f=l.useRef(o),p=l.useRef(u);if(Object.keys(i.current).length===0){const e={};((c==null?void 0:c.rows)??[]).forEach(s=>{s.num&&(e[s.num]={...g(s.num),...s})});for(let s=1;s<=w;s++)e[s]||(e[s]=g(s));i.current=e}const m=[];for(let e=1;e<=w;e++)m.push(i.current[e]??g(e));const $=W(m.map(e=>e.comment??"")),E=m.filter(e=>(e.comment??"").trim()).length;f.current=o,p.current=u,l.useEffect(()=>{se({grade:o,rows:m})});const k=(e,s)=>{i.current[e]={...i.current[e]??g(e),...s},_(r=>r+1)},z=e=>Object.values(i.current).filter(s=>s.num!==e&&(s.comment??"").trim()).map(s=>s.comment.trim()),B=async e=>{const s=i.current[e];if(!s)return"ok";if(L(s.keywords)===0)return d.error(`${e}번: 키워드를 입력하세요`),"ok";if(x.current[e])return"ok";const r={comment:(s.comment??"").trim(),keywords:JSON.stringify(s.keywords),grade:o,length:u};x.current[e]=!0,v(a=>({...a,[e]:!0}));try{const{text:a}=await re({grade:o,keywords:s.keywords,length:u,avoid:z(e)}),n=i.current[e];return((n==null?void 0:n.comment)??"").trim()!==r.comment||JSON.stringify(n==null?void 0:n.keywords)!==r.keywords||f.current!==r.grade||p.current!==r.length?(d.info(`${e}번은 그 사이 내용이 바뀌어 새 문장을 넣지 않았어요`),"ok"):(k(e,{comment:a}),D(null),"ok")}catch(a){return a instanceof ae?(D(a.message),"limit"):(d.error(`${e}번 생성 실패: ${a instanceof Error?a.message:String(a)}`),"failed")}finally{x.current[e]=!1,v(a=>({...a,[e]:!1}))}},M=async()=>{var a;const e=m.filter(n=>L(n.keywords)>0&&!(n.comment??"").trim()).map(n=>n.num);if(e.length===0){d.error("키워드를 입력한 빈 학생이 없습니다");return}const s={grade:o,length:u};let r=0;C(!0);try{for(const n of e){if((((a=i.current[n])==null?void 0:a.comment)??"").trim()||x.current[n])continue;if(f.current!==s.grade||p.current!==s.length){d.info("설정이 바뀌어 전체 생성을 멈췄어요. 다시 눌러 주세요.");break}const j=await B(n);if(j==="limit")break;if(r=j==="failed"?r+1:0,r>=2){d.error("연속으로 실패해 전체 생성을 멈췄어요. 잠시 뒤 다시 시도해 주세요.");break}}}finally{C(!1)}},H=async()=>{const e=Y(m.map(s=>({num:s.num,comment:s.comment??""})));try{await navigator.clipboard.writeText(e),S(!0),setTimeout(()=>S(!1),2e3),d.success("복사됐어요. NEIS 화면에서 Alt+S 를 누르세요.")}catch{d.error("복사에 실패했습니다")}},K=()=>{Z({year:J(),semester:oe(),grade:o,classNum:1,rows:m})};return t.jsx("div",{className:"px-4 py-6 sm:p-8",children:t.jsxs("div",{className:"mx-auto max-w-4xl space-y-5",children:[t.jsxs("div",{children:[t.jsx("h1",{className:"text-xl font-bold tracking-tight sm:text-2xl",children:"행동특성 및 종합의견"}),t.jsx("p",{className:"mt-2 break-keep text-sm text-muted-foreground",children:"키워드를 쉼표로 적고 생성을 눌러보세요. 앞 학생들 문장은 피해서 쓰고, 그래도 비슷해지면 표시해 둡니다."})]}),t.jsxs("div",{className:"flex flex-wrap items-center gap-2 rounded-xl border bg-card p-3",children:[t.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[t.jsx("span",{className:"text-muted-foreground",children:"학년"}),t.jsx("select",{value:o,onChange:e=>{f.current=Number(e.target.value),b(Number(e.target.value))},className:"h-8 rounded-md border bg-background px-2 text-sm",children:[1,2,3,4,5,6].map(e=>t.jsxs("option",{value:e,children:[e,"학년"]},e))})]}),t.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[t.jsx("span",{className:"text-muted-foreground",children:"길이"}),t.jsx("select",{value:u,onChange:e=>{p.current=e.target.value,G(e.target.value)},className:"h-8 rounded-md border bg-background px-2 text-sm",children:le.map(e=>t.jsx("option",{value:e.value,children:e.label},e.value))})]}),t.jsx("div",{className:"flex-1"}),t.jsxs(h,{size:"sm",onClick:M,disabled:y,children:[y?t.jsx(T,{className:"mr-1.5 h-4 w-4 animate-spin"}):t.jsx(A,{className:"mr-1.5 h-4 w-4"}),"전체 생성"]}),t.jsxs(h,{size:"sm",variant:"outline",onClick:H,disabled:E===0,children:[I?t.jsx(P,{className:"mr-1.5 h-4 w-4"}):t.jsx(V,{className:"mr-1.5 h-4 w-4"}),"NEIS 복사"]}),t.jsxs(h,{size:"sm",variant:"outline",onClick:K,disabled:E===0,children:[t.jsx(ne,{className:"mr-1.5 h-4 w-4"}),"엑셀"]})]}),R&&t.jsx(O,{title:R,description:"학교를 등록하시면 학생 수도 횟수도 안 막힙니다."}),t.jsx("div",{className:"space-y-3",children:m.map((e,s)=>t.jsxs("div",{className:"rounded-xl border bg-card p-4",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-sub/10 text-xs font-bold text-sub",children:e.num}
1),$[s]&&t.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full border border-warn/50 bg-warn/20 px-2 py-0.5 text-[11px] font-medium text-warn-foreground",children:[t.jsx(U,{className:"h-3 w-3"}),"다른 학생과 비슷함"]}),t.jsx("div",{className:"flex-1"}),t.jsxs(h,{size:"sm",variant:"ghost",onClick:()=>B(e.num),disabled:!!N[e.num]||y,children:[N[e.num]?t.jsx(T,{className:"mr-1.5 h-3.5 w-3.5 animate-spin"}):t.jsx(A,{className:"mr-1.5 h-3.5 w-3.5"}),"생성"]})]}),t.jsx("div",{className:"mt-3 grid gap-2 sm:grid-cols-2 lg:grid-cols-3",children:F.map(r=>t.jsxs("label",{className:"min-w-0",children:[t.jsx("span",{className:"mb-1 block text-[11px] font-medium text-muted-foreground",children:r.label}),t.jsx("input",{defaultValue:(e.keywords[r.key]??[]).join(", "),onChange:a=>k(e.num,{keywords:{...e.keywords,[r.key]:Q(a.target.value)}}),placeholder:"쉼표로 구분",className:"h-8 w-full rounded-md border bg-background px-2 text-sm"})]},r.key))}),t.jsx(X,{value:e.comment??"",onChange:r=>k(e.num,{comment:r.target.value}),placeholder:"생성을 누르거나 직접 쓰셔도 됩니다",className:"mt-3 min-h-[92px] text-sm"})]},e.num))}),t.jsx(O,{title:`체험은 ${w}명까지만 됩니다`,description:"한 반이면 보통 스물몇 명이죠. 학교를 등록하시면 반 전체를 한 판에서 하고, 중복 확인도 반 전체로 봅니다."})]})})}export{Ce as default};

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.