PageSourceSearch

https://www.studya.ai/_nuxt/DiBqLJHt.js

js studya.ai collected 2026-10-05 12:42:45 UTC 21,397 bytes, 1 lines download raw bytes

1import e from"./CcSJ0Upf.js";import{s as l}from"./C7tq67sn.js";import a from"./gIjRX4rO.js";import s from"./DOrXk6Dq.js";import t from"./Blc5gokf.js";import i from"./C8U0btqv.js";import o from"./YId3CyWU.js";import r from"./BvE5O8II.js";import{aK as n,bc as d,aO as u,aP as m,aS as c,aX as p,a_ as v,b8 as b,bj as x,aY as y,b9 as g,a$ as f,b7 as w,b0 as h,bH as k,bb as C,b4 as j,bC as V,b5 as P,dh as U,bu as S,b2 as $,cP as L,cQ as _,b3 as A,bE as I,aJ as T}from"./CL-6WCz_.js";import{u as B}from"./cCJj8zNr.js";import"./Caffg4K8.js";import"./BAO1_uDO.js";import"./D7245S_0.js";import"./D7f94y9u.js";import"./ULvOwOUz.js";import"./DcskNUCL.js";import"./Bm4SH_AC.js";import"./BAy3Cbtk.js";import"./BEG4Y0jn.js";import"./BROowPGS.js";import"./DVHFM21D.js";import"./BQ4MxQiT.js";const E=["for"],q=["id"],F=["id"],D={key:0,class:"text-sm text-red-600"},K={key:1,class:"text-sm text-red-600"},O={class:"flex justify-end gap-2"},R=n({__name:"UserCreateDialog",props:{visible:{type:Boolean},loading:{type:Boolean}},emits:["update:visible","submit","cancel"],setup(l,{emit:s}){const t=l,i=s,o=k({username:"",password:"",email:"",nickname:""}),n=k({email:"",required:""});d(()=>t.visible,e=>{e||(o.username="",o.password="",o.email="",o.nickname="",n.email="",n.required="")});const C=()=>{i("cancel"),i("update:visible",!1)},j=()=>{n.required="",n.email="",o.username.trim()&&o.password&&o.email.trim()&&o.nickname.trim()?/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(o.email.trim())?i("submit",{username:o.username.trim(),password:o.password,email:o.email.trim(),nickname:o.nickname.trim()}):n.email="올바른 이메일을 입력해 주세요.":n.required="모든 필드를 입력해 주세요."};return(s,t)=>{const d=a,k=e,V=r;return c(),u(V,{visible:l.visible,modal:"",header:"사용자 생성",closable:!l.loading,style:{width:"32rem",maxWidth:"90vw"},"onUpdate:visible":t[0]||(t[0]=e=>i("update:visible",e))},{default:m(()=>[p("form",{class:"space-y-4",onSubmit:h(j,["prevent"])},[(c(),v(w,null,b(["username","password","email","nickname"],e=>p("div",{key:e,class:"space-y-1"},[p("label",{for:`create-${e}`,class:"block text-sm font-medium text-slate-900"},[x(y({username:"아이디",password:"비밀번호",email:"이메일",nickname:"닉네임"}[e])+" ",1),t[1]||(t[1]=p("span",{class:"ml-0.5 text-red-600","aria-hidden":"true"},"*",-1)),t[2]||(t[2]=p("span",{class:"sr-only"},"(필수)",-1))],8,E),g(d,{id:`create-${e}`,modelValue:o[e],"onUpdate:modelValue":l=>o[e]=l,type:"password"===e?"password":"email"===e?"email":"text",disabled:l.loading,"aria-describedby":"username"===e||"password"===e?`create-${e}-help`:void 0,"aria-required":"true",class:"w-full"},null,8,["id","modelValue","onUpdate:modelValue","type","disabled","aria-describedby"]),"username"===e?(c(),v("p",{key:0,id:`create-${e}-help`,class:"text-xs text-slate-500"},[...t[3]||(t[3]=[p("span",{class:"block"},"로그인 아이디입니다. 영문/숫자 또는 이메일 형식",-1),p("span",{class:"block"},"예) bluesky 혹은 [email protected]",-1)])],8,q)):"password"===e?(c(),v("p",{key:1,id:`create-${e}-help`,class:"text-xs text-slate-500"}," 로그인 비밀번호입니다. ",8,F)):f("",!0)])),64)),n.required?(c(),v("p",D,y(n.required),1)):f("",!0),n.email?(c(),v("p",K,y(n.email),1)):f("",!0),p("div",O,[g(k,{type:"button",label:"취소",severity:"secondary",disabled:l.loading,onClick:C},null,8,["disabled"]),g(k,{type:"submit",label:"생성",loading:l.loading,disabled:l.loading},null,8,["loading","disabled"])])],32)]),_:1},8,["visible","closable"])}}}),z={key:0,class:"space-y-4"},J={class:"grid grid-cols-[5rem_1fr] gap-2 text-sm"},W={class:"flex justify-end gap-2"},N=n({__name:"UserExitConfirmDialog",props:{visible:{type:Boolean},loading:{type:Boolean},user:{}},emits:["update:visible","confirm","cancel"],setup(l,{emit:a}){const s=a,t=()=>{s("cancel"),s("update:visible",!1)};return(a,i)=>{const o=e,n=r;return c(),u(n,{visible:l.visible,modal:"",header:"사용자 탈퇴",closable:!l.loading,style:{width:"30rem",maxWidth:"90vw"},"onUpdate:visible":i[1]||(i[1]=e=>s("update:visible",e))},{default:m(()=>[l.user?(c(),v("div",z,[i[5]||(i[5]=p("p",{class:"rounded bg-red-50 px-3 py-2 text-sm text-red-800"}," 탈퇴하면 계정 정보가 익명화되며 되돌릴 수 없습니다. ",-1)),p("dl",J,[i[2]||(i[2]=p("dt",{class:"font-medium"},"아이디",-1)),p("dd",null,y(l.user.username),1),i[3]||(i[3]=p("dt",{class:"font-medium"},"닉네임",-1)),p("dd",null,y(l.user.nickname??"-"),1),i[4]||(i[4]=p("dt",{class:"font-medium"},"이메일",-1)),p("dd",null,y(l.user.email),1)]),p("div",W,[g(o,{label:"취소",severity:"secondary",disabled:l.loading,onClick:t},null,8,["disabled"]),g(o,{label:"탈퇴",severity:"danger",loading:l.loading,disabled:l.loading,onClick:i[0]||(i[0]=e=>s("confirm"))},null,8,["loading","disabled"])])])):f("",!0)]),_:1},8,["visible","closable"])}}}),Z={class:"grid grid-cols-[5rem_1fr] gap-2 text-sm"},M={class:"space-y-1"},X={key:0,id:"admin-user-password-error",class:"text-sm text-red-600",role:"alert"},Y={class:"space-y-1"},H={key:0,id:"admin-user-password-confirm-error",class:"text-sm text-red-600",role:"alert"},Q={class:"flex justify-end gap-2"},G="~!@#$%^&*()_+-=[]{}\\|;:'\",<.>/?",ee=n({__name:"UserPasswordChangeDialog",props:{visible:{type:Boolean},loading:{type:Boolean},user:{}},emits:["update:visible","submit","cancel"],setup(l,{emit:s}){const t=l,i=s,o=k({password:"",passwordConfirm:""}),n=k({password:"",passwordConfirm:""}),b=()=>{o.password="",o.passwordConfirm="",n.password="",n.passwordConfirm=""};d(()=>t.visible,e=>{e||b()});const x=e=>{!e&&t.loading||i("update:visible",e)},w=()=>{t.loading||(b(),i("cancel"),i("update:visible",!1))},C=()=>{var e;(n.password="",n.passwordConfirm="",o.password.length<4||o.password.length>30)?n.password="비밀번호는 4~30자로 입력해 주세요.":(e=o.password,[...e].every(e=>/^[A-Za-z0-9]$/.test(e)||G.includes(e))?o.password===o.passwordConfirm?i("submit",o.password):n.passwordConfirm="비밀번호가 일치하지 않습니다.":n.password="비밀번호에 허용되지 않은 문자가 포함되어 있습니다.")};return(s,t)=>{const i=a,d=e,b=r;return c(),u(b,{visible:l.visible,modal:"",header:"비밀번호 변경",closable:!l.loading,style:{width:"32rem",maxWidth:"90vw"},"onUpdate:visible":x},{default:m(()=>[l.user?(c(),v("form",{key:0,class:"space-y-4",onSubmit:h(C,["prevent"])},[p("dl",Z,[t[2]||(t[2]=p("dt",{class:"font-medium"},"아이디",-1)),p("dd",null,y(l.user.username),1),t[3]||(t[3]=p("dt",{class:"font-medium"},"닉네임",-1)),p("dd",null,y(l.user.nickname??"-"),1),t[4]||(t[4]=p("dt",{class:"font-medium"},"이메일",-1)),p("dd",null,y(l.user.email),1)]),p("div",M,[t[5]||(t[5]=p("label",{for:"admin-user-password",class:"block text-sm font-medium text-slate-900"}," 새 비밀번호 ",-1)),g(i,{id:"admin-user-password",modelValue:o.password,"onUpdate:modelValue":t[0]||(t[0]=e=>o.password=e),type:"password",autocomplete:"new-password",disabled:l.loading,invali
1d:Boolean(n.password),"aria-describedby":"admin-user-password-help admin-user-password-error",class:"w-full"},null,8,["modelValue","disabled","invalid"]),t[6]||(t[6]=p("p",{id:"admin-user-password-help",class:"text-xs text-slate-500"}," 영문, 숫자와 허용된 특수문자를 사용해 4~30자로 입력해 주세요. ",-1)),n.password?(c(),v("p",X,y(n.password),1)):f("",!0)]),p("div",Y,[t[7]||(t[7]=p("label",{for:"admin-user-password-confirm",class:"block text-sm font-medium text-slate-900"}," 새 비밀번호 확인 ",-1)),g(i,{id:"admin-user-password-confirm",modelValue:o.passwordConfirm,"onUpdate:modelValue":t[1]||(t[1]=e=>o.passwordConfirm=e),type:"password",autocomplete:"new-password",disabled:l.loading,invalid:Boolean(n.passwordConfirm),"aria-describedby":"admin-user-password-confirm-error",class:"w-full"},null,8,["modelValue","disabled","invalid"]),n.passwordConfirm?(c(),v("p",H,y(n.passwordConfirm),1)):f("",!0)]),p("div",Q,[g(d,{type:"button",label:"취소",severity:"secondary",disabled:l.loading,onClick:w},null,8,["disabled"]),g(d,{type:"submit",label:"변경",loading:l.loading,disabled:l.loading},null,8,["loading","disabled"])])],32)):f("",!0)]),_:1},8,["visible","closable"])}}}),le={class:"w-full h-[calc(100vh-var(--size-header-height))]"},ae={class:"p-4 bg-slate-200 h-full overflow-y-auto space-y-2"},se={class:"rounded-lg border border-slate-200 bg-white p-5 shadow-sm"},te={class:"mb-4 flex items-center justify-between gap-3"},ie={class:"grid grid-cols-1 gap-3 md:grid-cols-2"},oe={class:"flex flex-col gap-2 md:col-span-2"},re={class:"flex min-h-10 flex-wrap items-center gap-x-4 gap-y-2"},ne={class:"flex items-center gap-2"},de=["for"],ue={class:"flex flex-col gap-2"},me={class:"flex flex-col gap-2"},ce={class:"flex flex-col gap-2"},pe={class:"flex items-center gap-2"},ve={class:"flex flex-col gap-2"},be={class:"flex items-center gap-2"},xe={class:"mt-5 flex justify-end gap-2"},ye={class:"border border-b-2 border-slate-300 bg-white rounded-lg px-4 py-5 sm:px-6"},ge={class:"min-w-full divide-y divide-slate-300 border-b border-slate-200"},fe={key:0},we={key:1},he={class:"px-3 py-4 text-slate-900"},ke={class:"px-3 py-4 text-slate-900 whitespace-pre-line"},Ce={class:"px-3 py-4 text-center text-slate-900 whitespace-pre-line"},je={class:"px-3 py-4 text-right text-slate-900 whitespace-pre-line"},Ve={class:"px-3 py-4 text-right text-slate-900 whitespace-pre-line"},Pe={class:"px-3 py-4 text-center text-slate-900"},Ue={class:"flex flex-col items-center gap-2"},Se=["onClick"],$e={key:1,class:"btn btn-sm btn-danger w-16 disabled cursor-default","aria-label":"접속 불가"},Le={class:"space-y-4"},_e={class:"text-sm text-slate-700"},Ae={class:"space-y-2"},Ie=["value"],Te={class:"flex flex-wrap justify-end gap-2"},Be=n({__name:"UserManager",setup(n){C("pageTitle").value="회원 관리";const{getUsers:E,getRoles:q,createUser:F,exitUser:D,changeUserPassword:K,issueImpersonateTicket:O}=B(),z=j(),J=$([]),W=$(0),Z=$(15),M=$(0),X=$(0),Y=$(!1),H=$(null),Q=$(!1),G=$(!1),Be=$(!1),Ee=$(!1),qe=$(!1),Fe=$(!1),De=$(!1),Ke=$(null),Oe=$(null),Re=$(""),ze=$(""),Je=$([]),We=A(()=>new Map(Je.value.map(e=>[e.code,e.label]))),Ne=V(),Ze=[{label:"전체",value:"TOTAL"},{label:"이번달",value:"CURRENT"},{label:"지난달",value:"PREVIOUS"}],Me=$([]),Xe=async(e=0,l=15)=>{Y.value=!0,H.value=null;try{const a=await E(U(el),e,l);J.value=a.content,W.value=a.page.totalElements,X.value=a.page.number,M.value=a.page.number*Z.value}catch(a){L().error(_(a)),H.value="회원 목록 조회 실패"}finally{Y.value=!1}},Ye=e=>{Z.value=e.rows,Xe(e.page,e.rows)};P(async()=>{await(async()=>{try{Je.value=await q(),Me.value=Je.value.map(e=>e.code)}catch(e){L().error(_(e)),H.value="권한 목록 조회 실패"}})(),Xe(X.value,Z.value)});const He=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Seoul",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hourCycle:"h23"}),Qe=e=>`${e.correctCount.toLocaleString()} / ${e.totalCount.toLocaleString()} (${e.correctPercentage}%)`,Ge=e=>{if(!e)return"-";const l=Object.fromEntries(He.formatToParts(new Date(e)).map(({type:e,value:l})=>[e,l]));return`${l.year}-${l.month}-${l.day}
1 ${l.hour}:${l.minute}:${l.second}`},el=k({email:"",nickname:"",roles:U(Me.value),problemSolvingPeriod:null,minimumProblemSolvingCount:null,llmCallPeriod:null,minimumLlmCallCount:null});d(Me,e=>{e.length===Je.value.length?el.roles=[]:el.roles=U(e)},{deep:!0,immediate:!0});const ll=async e=>{qe.value=!0;try{await F(e),G.value=!1,X.value=0,M.value=0,await Xe(0,Z.value),Ne.add({severity:"success",summary:"사용자 생성 완료",detail:"사용자를 생성했습니다.",life:3e3})}catch(l){L().error(_(l)),Ne.add({severity:"error",summary:"사용자 생성 실패",detail:"아이디 또는 이메일 중복 여부를 확인해 주세요.",life:3e3})}finally{qe.value=!1}},al=e=>!e.roles.some(e=>"EXIT"===e.toUpperCase())&&e.email!==z.email,sl=e=>"APPLICATION"===e.provider&&e.roles.includes("USER"),tl=e=>{!e&&De.value||(Ee.value=e,e||(Oe.value=null))},il=async e=>{if(Oe.value&&!De.value){De.value=!0;try{await K(Oe.value.id,{password:e}),Ee.value=!1,Oe.value=null,Ne.add({severity:"success",summary:"비밀번호 변경 완료",detail
1:"사용자 비밀번호를 변경했습니다.",life:3e3})}catch(l){I(l,"사용자 비밀번호 변경 실패")}finally{De.value=!1}}},ol=async()=>{if(Ke.value){Fe.value=!0;try{await D(Ke.value.id);const e=1===J.value.length&&X.value>0?X.value-1:X.value;Be.value=!1,Ke.value=null,await Xe(e,Z.value),Ne.add({severity:"success",summary:"사용자 탈퇴 완료",detail:"사용자를 탈퇴 처리했습니다.",life:3e3})}catch(e){I(e,"사용자 탈퇴 실패")}finally{Fe.value=!1}}},rl=async()=>{if(Re.value)try{await navigator.clipboard.writeText(Re.value),Ne.add({severity:"success",summary:"링크 복사 완료",detail:"사용자 전환 링크를 클립보드에 복사했습니다.",life:3e3})}catch(e){L().error(_(e)),Ne.add({severity:"error",summary:"링크 복사 실패",detail:"브라우저에서 클립보드 복사를 허용하지 않았습니다.",life:3e3})}},nl=()=>{Re.value&&window.open(Re.value,"_blank")},dl=A({get:()=>Je.value.length>0&&Je.value.length===Me.value.length,set:e=>{Me.value=e?Je.value.map(e=>e.code):[]}}),ul=()=>{el.email="",el.nickname="",el.problemSolvingPeriod=null,el.minimumProblemSolvingCount=null,el.llmCallPeriod=null,el.minimumLlmCallCount=null,Me.value=Je.value.map(e=>e.code),X.value=0,M.value=0,Xe(0,Z.value)},ml=()=>{X.value=0,M.value=0,Xe(0,Z.value)};return(n,d)=>{const k=e,C=l,j=a,V=s,P=t,U=i,$=o,A=r;return c(),v("div",le,[p("div",ae,[p("section",se,[p("div",te,[d[12]||(d[12]=p("h2",{class:"text-lg font-semibold text-slate-900"},"회원 검색 필터",-1)),g(k,{label:"사용자 생성",onClick:d[0]||(d[0]=e=>G.value=!0)})]),p("div",ie,[p("div",oe,[d[14]||(d[14]=p("span",{class:"text-sm font-medium text-slate-900"},"권한",-1)),p("div",re,[p("div",ne,[g(C,{modelValue:dl.value,"onUpdate:modelValue":d[1]||(d[1]=e=>dl.value=e),"input-id":"roles-all",binary:""},null,8,["modelValue"]),d[13]||(d[13]=p("label",{for:"roles-all",class:"text-sm text-slate-700 hover:cursor-pointer"}," 전체 ",-1))]),(c(!0),v(w,null,b(Je.value,e=>(c(),v("div",{key:e.code,class:"flex items-center gap-2"},[g(C,{id:e.code,modelValue:Me.value,"onUpdate:modelValue":d[2]||(d[2]=e=>Me.value=e),value:e.code,"input-id":e.code,onItemSelect:ml},null,8,["id","modelValue","value","input-id"]),p("label",{for:e.code,class:"text-sm text-slate-700 hover:cursor-pointer"},y(e.label),9,de)]))),128))])]),p("div",ue,[d[15]||(d[15]=p("label",{for:"emailFilter",class:"text-sm font-medium text-slate-900"}," 이메일 ",-1)),g(j,{id:"emailFilter",modelValue:el.email,"onUpdate:modelValue":d[3]||(d[3]=e=>el.email=e),placeholder:"이메일을 입력하세요",class:"w-full",onKeyup:S(ml,["enter"])},null,8,["modelValue"])]),p("div",me,[d[16]||(d[16]=p("label",{for:"nicknameFilter",class:"text-sm font-medium text-slate-900"}," 닉네임 ",-1)),g(j,{id:"nicknameFilter",modelValue:el.nickname,"onUpdate:modelValue":d[4]||(d[4]=e=>el.nickname=e),placeholder:"닉네임을 입력하세요",class:"w-full",onKeyup:S(ml,["enter"])},null,8,["modelValue"])]),p("div",ce,[d[18]||(d[18]=p("label",{for:"minimumProblemSolvingCount",class:"text-sm font-medium text-slate-900"}," 풀이수 ",-1)),p("div",pe,[g(V,{modelValue:el.problemSolvingPeriod,"onUpdate:modelValue":d[5]||(d[5]=e=>el.problemSolvingPeriod=e),options:Ze,"option-label":"label","option-value":"value",placeholder:"기간","show-clear":"",class:"w-32"},null,8,["modelValue"]),g(P,{id:"minimumProblemSolvingCount",modelValue:el.minimumProblemSolvingCount,"onUpdate:modelValue":d[6]||(d[6]=e=>el.minimumProblemSolvingCount=e),min:0,"use-grouping":!1,placeholder:"건수",class:"min-w-0 flex-1",onKeyup:S(ml,["enter"])},null,8,["modelValue"]),d[17]||(d[17]=p("span",{class:"text-sm text-slate-700"},"이상",-1))])]),p("div",ve,[d[20]||(d[20]=p("label",{for:"minimumLlmCallCount",class:"text-sm font-medium text-slate-900"}," AI API 호출수 ",-1)),p("div",be,[g(V,{modelValue:el.llmCallPeriod,"onUpdate:modelValue":d[7]||(d[7]=e=>el.llmCallPeriod=e),options:Ze,"option-label":"label","option-value":"value",placeholder:"기간","show-clear":"",class:"w-32"},null,8,["modelValue"]),g(P,{id:"minimumLlmCallCount",modelValue:el.minimumLlmCallCount,"onUpdate:modelValue":d[8]||(d[8]=e=>el.minimumLlmCallCount=e),min:0,"use-grouping":!1,placeholder:"건수",class:"min-w-0 flex-1",onKeyup:S(ml,["enter"])},null,8,["modelValue"]),d[19]||(d[19]=p("span",{class:"text-sm text-slate-700"},"이상",-1))])])]),p("div",xe,[g(k,{label:"초기화",severity:"secondary",outlined:"",onClick:ul}),g(k,{onClick:ml},{default:m(()=>[g(U,{name:"hugeicons:search-02",class:"mr-2 text-base"}),d[21]||(d[21]=p("span",null,"검색",-1))]),_:1})])]),p("div",ye,[p("table",ge,[d[24]||(d[24]=p("thead",null,[p("tr",null,[p("th",{scope:"col",class:"px-3 py-3.5 text-center text-sm font-semibold text-slate-900"}," 권한 "),p("th",{scope:"col",class:"px-3 py-3.5 text-center text-sm font-semibold text-slate-900"}," 아이디 / 닉네임 / 이메일 "),p("th",{scope:"col",class:"px-3 py-3.5 text-center text-sm font-semibold text-slate-900"}," 활동일 / 생성일 / 수정일 "),p("th",{scope:"col",class:"px-3 py-3.5 text-center text-sm font-semibold text-slate-900"},[x(" 정답수 / 풀이수 (정답률) "),p("span",{class:"block text-xs font-normal text-slate-600"}," 전체 / 이번달 / 지난달 ")]),p("th",{scope:"col",class:"px-3 py-3.5 text-center text-sm font-semibold text-slate-900"},[x(" AI API 호출수 "),p("span",{class:"block text-xs font-normal text-slate-600"}," 전체 / 이번달 / 지난달 ")]),p("th",{scope:"col",class:"px-3 py-3.5 text-center text-sm font-semibold text-slate-900"}
1," 관리 ")])],-1)),p("tbody",null,[Y.value?(c(),v("tr",fe,[...d[22]||(d[22]=[p("td",{colspan:"6",class:"px-3 py-4 text-center text-slate-900"}," 데이터를 불러오는 중입니다... ",-1)])])):0===J.value.length?(c(),v("tr",we,[...d[23]||(d[23]=[p("td",{colspan:"6",class:"px-3 py-4 text-center text-slate-900"}," 결과가 없습니다. ",-1)])])):(c(!0),v(w,{key:2},b(J.value,e=>{return c(),v("tr",{key:e.email,class:"border-b"},[p("td",he,y((a=e.roles,a.map(e=>We.value.get(e)??e).join(", "))),1),p("td",ke,y([e.username,e.nickname??"-",e.email].join("\n")),1),p("td",Ce,y([Ge(e.lastActivityAt),Ge(e.createdAt),Ge(e.updatedAt)].join("\n")),1),p("td",je,y([Qe(e.problemSolvingStatistics.total),Qe(e.problemSolvingStatistics.current),Qe(e.problemSolvingStatistics.previous)].join("\n")),1),p("td",Ve,y((l=e.llmCallStatistics,[l.totalCount,l.currentCount,l.previousCount].map(e=>e.toLocaleString()).join("\n"))),1),p("td",Pe,[p("div",Ue,[Array.isArray(e.roles)&&e.roles.some(e=>"user"===e.toLowerCase())?(c(),v("button",{key:0,class:"btn btn-sm w-16 border-red-700 bg-red-600 text-white hover:bg-red-700",onClick:h(l=>(async(e,l)=>{try{const a=await O(e),s=T().public.uris.authorization;Re.value=`${s}/login/impersonate?ticket=${encodeURIComponent(a.ticket)}`,ze.value=l,Q.value=!0}catch(a){L().error(_(a)),alert("사용자 전환 티켓 발급에 실패했습니다. 다시 시도해 주세요.")}})(e.id,e.email),["stop"])}," 접속 ",8,Se)):(c(),v("button",$e," 접속 ")),sl(e)?(c(),u(k,{key:2,label:"비밀번호 변경",class:"w-28",severity:"secondary",size:"small",outlined:"",onClick:l=>(e=>{sl(e)&&(Oe.value=e,Ee.value=!0)})(e)},null,8,["onClick"])):f("",!0),al(e)?(c(),u(k,{key:3,label:"탈퇴",class:"w-16",severity:"danger",size:"small",outlined:"",onClick:l=>(e=>{Ke.value=e,Be.value=!0})(e)},null,8,["onClick"])):f("",!0)])])]);var l,a}),128))])]),g($,{first:M.value,rows:Z.value,"total-records":W.value,template:{default:"FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink JumpToPageDropdown JumpToPageInput"},class:"mt-8",onPage:Ye},null,8,["first","rows","total-records"])])]),g(R,{visible:G.value,"onUpdate:visible":d[9]||(d[9]=e=>G.value=e),loading:qe.value,onSubmit:ll},null,8,["visible","loading"]),g(N,{visible:Be.value,"onUpdate:visible":d[10]||(d[10]=e=>Be.value=e),loading:Fe.value,user:Ke.value,onConfirm:ol},null,8,["visible","loading","user"]),g(ee,{visible:Ee.value,loading:De.value,user:Oe.value,"onUpdate:visible":tl,onSubmit:il},null,8,["visible","loading","user"]),g(A,{visible:Q.value,"onUpdate:visible":d[11]||(d[11]=e=>Q.value=e),modal:"",header:"사용자 전환 링크",style:{width:"48rem",maxWidth:"90vw"}},{default:m(()=>[p("div",Le,[p("p",_e,y(ze.value)+" 계정으로 전환할 수 있는 링크입니다. 시크릿 브라우저에서 열어 관리자 로그인 상태와 분리해서 사용할 수 있습니다. ",1),d[26]||(d[26]=p("p",{class:"rounded bg-amber-50 px-3 py-2 text-sm text-amber-800"}," 직접 열기를 선택하면 현재 브라우저의 관리자 로그인 상태를 잃을 수 있습니다. 관리자 세션을 유지하려면 링크 복사 후 시크릿 창에서 여는 방식을 권장합니다. ",-1)),p("div",Ae,[d[25]||(d[25]=p("label",{class:"block text-sm font-semibold text-slate-900"}," 전환 링크 ",-1)),p("textarea",{value:Re.value,readonly:"",rows:"4",class:"w-full rounded border border-slate-300 bg-slate-50 px-3 py-2 text-sm text-slate-900"},null,8,Ie)]),p("div",Te,[g(k,{label:"새 탭에서 열기",severity:"secondary",onClick:nl}),g(k,{label:"링크 복사",onClick:rl})])])]),_:1},8,["visible"])])}}});export{Be 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.