1import{h as ke,c as w,K as $,_ as N,a4 as E,n as a,L as I,a0 as m,$ as r,a1 as x,F as he,a6 as xe,M as d,r as es,f as n,W as ye,w as ae,a7 as ss,U as as,u as c,aa as vs,O as Te,D as fs,R as ts,v as gs,x as ys,af as bs,q as Us}from"./vue-datepicker-CpIdsRIT.js";import{u as Ee,V as As}from"./filter-By8nmMDA.js";import{_ as Ce}from"./CardContainer.vue_vue_type_script_setup_true_lang-BKfUFWAw.js";import{_ as hs}from"./EntityCountKpis.vue_vue_type_script_setup_true_lang-CI-QJyCT.js";import{b as we,t as We,w as Ne,a as Ie,u as ks,q as je,a0 as Ke,v as Re,W as ls,aQ as Be,D as Oe,aR as Pe,C as He,aS as qe,aT as ie,V as Z,n as ze,a$ as rs,e as ws,m as Qe,d as Vs,bt as fe,aK as Gs,ad as $s,bv as Ds,b1 as os,av as Ss,aw as _e,ax as Me,bG as Rs,aj as is,bn as ns,c as xs,bH as Cs,o as Es,l as Is,a8 as Fs,bI as Ls}from"./index-c2PABjuS.js";import{r as T}from"./ResolveErrorCode-_CDAcugR.js";import{V as us,r as Ae,e as Ns}from"./VForm-fG7fwhIC.js";import{_ as Ts}from"./VuetifyDatePicker.vue_vue_type_script_setup_true_lang-B9W9tuUi.js";import{u as Bs}from"./LocalizedTextComposable-BT_MHYJB.js";import{f as ds,a as ps}from"./RelativeTime-DF4vKMVT.js";import{V as Os,a as Xe}from"./VRadioGroup-jmNQlkKx.js";import{V as me}from"./VTextField-CzBtTN-C.js";import{V as ge}from"./VAutocomplete-Cxtz8Npr.js";import{s as cs}from"./DataTableSorting-DDcS9sCQ.js";import{u as Ps}from"./InfiniteListComposable-D1mDhAIs.js";import{V as ms}from"./VDataTableServer-sfveKKYy.js";import{V as qs,b as Ms,a as Je,c as Ye}from"./VTabs-Ddd2B7iH.js";import{V as De}from"./VChip-zxhclFBY.js";import{V as Ws}from"./VCheckbox-B94IcOod.js";import"./datefns-BAflKSlV.js";import"./KpiHint.vue_vue_type_script_setup_true_lang-DMkRINi8.js";import"./catalogStore-DWOHXgj6.js";import"./workItemStore-B0n58MtF.js";import"./lmraStore-UC2pyfkM.js";import"./VSheet-Bi2ZFpX8.js";import"./VCheckboxBtn-CaDiUy2q.js";import"./VSelect-DnH6Hc5K.js";import"./VDataTable-CzpP61RX.js";import"./VTable-CzfeRkJJ.js";const js={key:0,class:"flex items-center gap-2 text-sm text-light-text"},Ks={key:2,class:"flex flex-col gap-3"},zs={class:"font-semibold mb-2"},Hs={key:0,class:"mb-2 text-sm"},Qs={class:"list-disc pl-5"},_s={key:0,class:"pl-5"},Xs={key:1,class:"mb-2 text-sm"},Js={class:"list-disc pl-5"},Ys={key:0,class:"whitespace-nowrap"},Zs={key:0,class:"pl-5"},ea={class:"text-sm"},sa={key:2,class:"text-sm"},Se=5,Ze=ke({__name:"UserResponsibilitiesWarning",props:{responsibilities:{type:Object,default:null},loading:{type:Boolean,default:!1},error:{type:Boolean,default:!1},mode:{type:String,required:!0},date:{type:Date,default:void 0}},setup(f){const F=f,{t:l,locale:C}=we(),{localText:o}=Bs(),A=p=>new Date(p).toLocaleDateString(C.value||"de-DE"),q=w(()=>!!F.responsibilities&&(F.responsibilities.supervisedGroups.length>0||F.responsibilities.delegations.length>0)),U=w(()=>F.mode==="delete"?l("App.User.UserResponsibilities.headlineDelete"):F.mode==="disableAt"?F.date?l("App.User.UserResponsibilities.headlineDisableAt",{date:A(F.date)}):l("App.User.UserResponsibilities.headlineDisableAtNoDate"):l("App.User.UserResponsibilities.headlineDisableNow")),Q=w(()=>F.responsibilities?.supervisedGroups.slice(0,Se)??[]),j=w(()=>Math.max((F.responsibilities?.supervisedGroups.length??0)-Se,0)),B=w(()=>F.responsibilities?.delegations.slice(0,Se)??[]),O=w(()=>Math.max((F.responsibilities?.delegations.length??0)-Se,0)),V=(p,D=60)=>p.length>D?`${p.slice(0,D-1)}â¦`:p,_=p=>{const D=p.question;return D&&(o(D)||D.de||Object.values(D).find(S=>!!S))||null},R=p=>{const D=[];p.number&&D.push(p.number);const S=_(p);S?D.push(V(S)):p.type==="analysis"&&D.push(l("App.User.UserResponsibilities.analysisDelegation"));const K=D.join(" â ")||l("App.User.UserResponsibilities.unnamedDelegation");return p.workAreaName?`${K} (${p.workAreaName})`:K};return(p,D)=>f.loading?(d(),$("div",js,[a(We,{indeterminate:"",size:"16",width:"2",color:"secondary"}),I("span",null,m(p.$t("App.User.UserResponsibilities.loading")),1)])):f.error?(d(),N(Ne,{key:1,type:"warning",variant:"tonal",density:"compact"},{default:r(()=>[x(m(p.$t("App.User.UserResponsibilities.loadError")),1)]),_:1})):f.responsibilities?(d(),$("div",Ks,[q.value?(d(),N(Ne,{key:0,t
1ype:"warning",variant:"tonal",density:"compact"},{default:r(()=>[I("p",zs,m(U.value),1),f.responsibilities.supervisedGroups.length?(d(),$("div",Hs,[I("p",null,m(p.$t("App.User.UserResponsibilities.supervisedGroups",{count:f.responsibilities.supervisedGroups.length})),1),I("ul",Qs,[(d(!0),$(he,null,xe(Q.value,S=>(d(),$("li",{key:S.id},m(S.name),1))),128))]),j.value?(d(),$("p",_s,m(p.$t("App.User.UserResponsibilities.more",{count:j.value})),1)):E("",!0)])):E("",!0),f.responsibilities.delegations.length?(d(),$("div",Xs,[I("p",null,m(p.$t("App.User.UserResponsibilities.delegations",{count:f.responsibilities.delegations.length})),1),I("ul",Js,[(d(!0),$(he,null,xe(B.value,S=>(d(),$("li",{key:S.analysisQuestionId??S.analysisId},[x(m(R(S))+" ",1),S.dueDate?(d(),$("span",Ys," · "+m(p.$t("App.User.UserResponsibilities.dueDate",{date:A(S.dueDate)})),1)):E("",!0)]))),128))]),O.value?(d(),$("p",Zs,m(p.$t("App.User.UserResponsibilities.more",{count:O.value})),1)):E("",!0)])):E("",!0),I("p",ea,m(p.$t("App.User.UserResponsibilities.handoverHint")),1),f.mode!=="delete"?(d(),$("p",sa,m(p.$t("App.User.UserResponsibilities.notRestoredHint")),1)):E("",!0)]),_:1})):E("",!0),f.responsibilities.isCompanyOwner?(d(),N(Ne,{key:1,type:"error",variant:"tonal",density:"compact"},{default:r(()=>[x(m(p.$t("App.User.UserResponsibilities.companyOwner")),1)]),_:1})):E("",!0)])):E("",!0)}}),aa={class:"flex justify-between items-center border-b px-2 py-3 mb-5"},ta={class:"flex items-center gap-5"},la=I("br",null,null,-1),ra={class:"flex flex-col gap-2 px-1 pt-2 text-sm text-light-text"},oa={class:"flex items-center gap-2"},ia=["title"],na={key:1},ua={key:0,class:"flex items-center gap-2 text-warning"},da=ke({__name:"UserForm",props:{user:{type:Object},assignedGroups:{type:Array},assignedWorkAreas:{type:Array},canEditEmployee:{type:Boolean,default:!0},canDeleteEmployee:{type:Boolean,default:!0},canDisableEmployee:{type:Boolean,default:!0}},emits:["update:user","cancel","deleted"],setup(f,{emit:F}){const l=f,C=F,o=Ee(),{notifyError:A,notifySuccess:q}=Ie(),{t:U,locale:Q}=we(),j=ks(),B=je(),O=Ke(),V=es({email:l.user?.email??"",firstName:l.user?.firstName??"",lastName:l.user?.lastName??"",phone:l.user?.phone??"",roleId:l.user?.roleId??""}),_=n(!1),R=n(!1),p=n(!1),D=w(()=>!l.user?.id),S=w(()=>!!l.user?.id&&l.user.id===j.currentUserId),K=w(()=>o.roles?.map(e=>({value:e.id,title:U(`General.${e.name}`)}))),G=n(!1),W=n(null),z=n(null),ee=w(()=>(O.roles??[]).map(e=>({value:e.id,title:e.name}))),le=()=>{be.value=pe.value,ve.value=ne.value},J=async()=>{if(V){R.value=!0;try{let e;l.user?.id?e=await o.updateUser({...l.user,...V}):e=await o.createUser(V),l.user?.id===j.currentUserId&&await j.refreshAuth();try{await Fe(e)}catch(b){console.error("Failed to sync dynamic role assignment",b)}await de(e);const i=pe.value.map(b=>o.groups?.find(Le=>Le.id===b)).filter(b=>!!b),oe=ne.value.map(b=>o.workAreas?.find(Le=>Le.id===b)).filter(b=>!!b);G.value&&(e.groups=i),e.workAreas=oe,le(),C("update:user",e),q(U("App.User.UserForm.saveSuccess"))}catch(e){A(U(T(e,"App.User.UserForm.genericSaveError")))}R.value=!1}},se=async()=>{if(l.user?.id){if(S.value&&l.user?.enabled){A(U("App.User.UserForm.cannotDisableSelf"));return}if(l.user?.enabled){g.value="now",h.value=l.user.disableAt?new Date(l.user.disableAt):void 0,l.user.disableAt&&(g.value="date"),t.value=!0,P();return}R.value=!0,await o.enableUser(l.user).then(()=>q(U("App.User.UserForm.enableSuccess"))).catch(e=>A(U(T(e,"App.User.UserForm.genericEnableError")))),R.value=!1}},te=n(null),v=n(!1),L=n(!1),P=async()=>{if(l.user?.id){te.value=null,L.value=!1,v.value=!0;try{te.value=await o.fetchUserResponsibilities(l.user.id)}catch(e){console.error("Failed loading user responsibilities",e),L.value=!0}finally{v.value=!1}}},H=e=>e&&(e.supervisedGroups>0||e.delegations>0)?" "+U("App.User.UserResponsibilities.releasedSummary",{groups:e.supervisedGroups,delegations:e.delegations}):"",t=n(!1),g=n("now"),h=n(void 0),re=w(()=>{const e=new Date;return e.setDate(e.getDate()+1),e.setHours(0,0,0,0),e}),ue=e=>new Date(e).toLocaleDateString(Q.value||"de-DE"),k=async()=>
1{if(l.user?.id){R.value=!0;try{if(g.value==="date"&&h.value){const e=new Date(h.value);e.setHours(0,0,0,0),await o.disableUser(l.user,e.toISOString()),q(U("App.User.UserForm.scheduleDisableSuccess",{date:ue(e.toISOString())}))}else{const e=await o.disableUser(l.user);q(U("App.User.UserForm.disableSuccess")+H(e))}t.value=!1}catch(e){A(U(T(e,"App.User.UserForm.genericDisableError")))}R.value=!1}},Y=async()=>{if(l.user?.id){R.value=!0;try{await o.cancelScheduledDisable(l.user),q(U("App.User.UserForm.cancelScheduledDisableSuccess"))}catch(e){A(U(T(e,"App.User.UserForm.genericDisableError")))}R.value=!1}},de=async e=>Promise.all([...G.value?Ue.value.map(i=>o.addUserToGroup(i,e)):[],...G.value?Ge.value.map(i=>o.removeUserFromGroup(i,e)):[],...ce.value.map(i=>o.addUserToWorkArea(i,e)),...s.value.map(i=>o.removeUserFromWorkArea(i,e))]),pe=n(l.assignedGroups?.map(e=>e.id)??[]),be=n(l.assignedGroups?.map(e=>e.id)??[]),Ve=w(()=>o.groups?.map(e=>({title:e.name,value:e.id}))??[]),Ue=w(()=>pe.value.filter(e=>!be.value.includes(e)).map(e=>o.groups.find(i=>i.id===e))),Ge=w(()=>be.value.filter(e=>!pe.value.includes(e)).map(e=>o.groups.find(i=>i.id===e))),ne=n(l.assignedWorkAreas?.map(e=>e.id)??[]),ve=n(l.assignedWorkAreas?.map(e=>e.id)??[]),$e=w(()=>o.workAreas?.map(e=>({title:e.name,value:e.id}))??[]),ce=w(()=>ne.value.filter(e=>!ve.value.includes(e)).map(e=>o.workAreas.find(i=>i.id===e))),s=w(()=>ve.value.filter(e=>!ne.value.includes(e)).map(e=>o.workAreas.find(i=>i.id===e))),u=n(!1),y=()=>{u.value=!0,P()},M=()=>u.value=!1,X=async()=>{if(S.value){A(U("App.User.UserForm.cannotDeleteSelf")),M();return}p.value=!0;try{const e=await o.deleteUser(l.user);q(U("App.User.UserForm.deleteSuccess")+H(e)),C("deleted",l.user)}catch(e){console.error(e),A(U(T(e,"App.User.UserForm.genericDeleteError")))}finally{p.value=!1,M()}};ye(async()=>{try{const e=await B.getLicenseKey();if(G.value=e==="enterprise",G.value&&(await O.fetchRoles(),l.user?.id)){const i=await O.getUserRoles(l.user.id),oe=i.length?i[0].id:null;W.value=oe,z.value=oe}}catch(e){console.error("Failed loading dynamic roles",e)}}),ae(()=>G.value,async e=>{if(e)try{await O.fetchRoles()}catch(i){console.error("Failed loading dynamic roles after license change",i)}});const Fe=async e=>{if(!G.value||!e?.id)return;const i=W.value,oe=z.value;oe!==i&&(oe&&await O.deleteUserRole(e.id,oe),i&&await O.addUserRole(e.id,i),z.value=i)};return(e,i)=>{const oe=vs("permission-guarded-container");return d(),N(us,{modelValue:_.value,"onUpdate:modelValue":i[14]||(i[14]=b=>_.value=b),class:"flex flex-col gap-3",onSubmit:ss(J,["prevent"])},{default:r(()=>[I("div",aa,[as((d(),$("i",{class:"p-1 rounded-full cursor-pointer",onClick:i[0]||(i[0]=b=>e.$emit("cancel"))},[a(Re,{"svg-path":c(ls),class:"text-error"},null,8,["svg-path"])])),[[os]]),I("div",ta,[a(oe,null,{default:r(()=>[!D.value&&f.user?(d(),N(Be,{key:0,modelValue:u.value,"onUpdate:modelValue":i[1]||(i[1]=b=>u.value=b),"max-width":"500px"},{activator:r(({props:b})=>[a(Z,{loading:p.value,variant:"text",onClick:y,disabled:!f.canDeleteEmployee||R.value||S.value},{default:r(()=>[a(ze,{icon:c(rs),color:"error"},null,8,["icon"])]),_:1},8,["loading","disabled"])]),default:r(()=>[a(Oe,null,{default:r(()=>[a(Pe,{class:"text-h5 text-wrap"},{default:r(()=>[x(m(e.$t("App.User.UserForm.deleteConfirmText"))+" ",1),la,x(" "+m(e.$t("App.User.UserForm.deleteUserDataWarning")),1)]),_:1}),a(He,null,{default:r(()=>[a(Ze,{mode:"delete",responsibilities:te.value,loading:v.value,error:L.value},null,8,["responsibilities","loading","error"])]),_:1}),a(qe,null,{default:r(()=>[a(ie),a(Z,{variant:"text",onClick:M},{default:r(()=>[x(m(e.$t("General.cancel")),1)]),_:1}),a(Z,{color:"error",loading:p.value,disabled:v.value,onClick:X},{default:r(()=>[x(m(e.$t("General.confirm")),1)]),_:1},8,["loading","disabled"]),a(ie)]),_:1})]),_:1})]),_:1},8,["modelValue"])):E("",!0)]),_:1}),f.user?.id?(d(),N(Z,{key:0,color:f.user?.enabled?"error":"info",loading:R.value,disabled:!f.canDisableEmployee||R.value||S.value&&!!f.user?.enabled,onClick:se},{default:r(()=>[x(m(e.$t(f.user?.enabled?"App.User.UserForm.disable":"App.User.UserForm.enable")),1)]),_:1},8,["color","loading","disabled"])):E("",!0),a(Be,{modelValue:t.value,"onUpdate:modelValue":i[5]||(i[5]=b=>t.value=b),"max-width":"500px"},{default:r(()=>[a(Oe,null,{default:r(()=>[a(Pe,{class:"text-h5 text-wrap"},{default:r(()=>[x(m(e.$t("App.User.UserForm.disableDialogTitle")),1)]),_:1}),a(He,{class:"flex flex-col gap-4"},{default:r(()=>[a(Os,{modelValue:g.value,"onUpdate:modelValue":i[2]||(i[2]=b=>g.value=b),"hide-details":"",color:"secondary"},{default:r(()=>[a(Xe,{label:e.$t("App.User.UserForm.disableNow"),value:"now"},null,8,["label"]),a(Xe,{label:e.$t("App.User.UserForm.disableAtDate"),value:"date"},null,8,["label"])]),_:1},8,["modelValue"]),g.value==="date"?(d(),N(Ts,{key:0,modelValue:h.value,"onUpdate:modelValue":i[3]||(i[3]=b=>h.value=b),label:e.$t("App.User.UserForm.disableAtDateLabel"),min:re.value},null,8,["modelValue","label","min"])):E("",!0),a(Ze,{mode:g.value==="date"?"disableAt":"disableNow",date:h.value,responsibilities:te.value,loading:v.value,error:L.value},null,8,["mode","date","responsibilities","loading","error"])]),_:1}),a(qe,null,{default:r(()=>[a(ie),a(Z,{variant:"text",onClick:i[4]||(i[4]=b=>t.value=!1)},{default:r(()=>[x(m(e.$t("General.cancel")),1)]),_:1}),a(Z,{color:"error",loading:R.value,disabled:g.value==="date"&&!h.value||v.value,onClick:k},{default:r(()=>[x(m(e.$t("General.confirm")),1)]),_:1},8,["loading","disabled"]),a(ie)]),_:1})]),_:1})]),_:1},8,["modelValue"]),a(Z,{color:"success",loading:R.value,disabled:!f.canEditEmployee||!_.value,type:"submit"},{default:r(()=>[x(m(e.$t(f.user?.id?"General.save":"General.create")),1)]),_:1},8,["loading","disabled"])])]),a(me,{modelValue:V.email,"onUpdate:modelValue":i[6]||(i[6]=b=>V.email=b),label:e.$t("Auth.Register.email"),disabled:!f.canEditEmployee,type:"email",color:"secondary","prepe
1nd-inner-icon":c(ws),rules:[c(Ae),c(Ns)],variant:"outlined","hide-details":"auto",required:""},null,8,["modelValue","label","disabled","prepend-inner-icon","rules"]),a(me,{modelValue:V.firstName,"onUpdate:modelValue":i[7]||(i[7]=b=>V.firstName=b),label:e.$t("Auth.Register.firstName"),type:"text",color:"secondary","prepend-inner-icon":c(Qe),rules:[c(Ae)],variant:"outlined","hide-details":"auto",required:""},null,8,["modelValue","label","prepend-inner-icon","rules"]),a(me,{modelValue:V.lastName,"onUpdate:modelValue":i[8]||(i[8]=b=>V.lastName=b),label:e.$t("Auth.Register.lastName"),type:"text",color:"secondary","prepend-inner-icon":c(Qe),rules:[c(Ae)],variant:"outlined","hide-details":"auto",required:""},null,8,["modelValue","label","prepend-inner-icon","rules"]),a(me,{modelValue:V.phone,"onUpdate:modelValue":i[9]||(i[9]=b=>V.phone=b),label:e.$t("Auth.Register.phone"),type:"text",color:"secondary","prepend-inner-icon":c(Vs),variant:"outlined","hide-details":"auto",required:""},null,8,["modelValue","label","prepend-inner-icon"]),a(ge,{modelValue:V.roleId,"onUpdate:modelValue":i[10]||(i[10]=b=>V.roleId=b),items:K.value,label:e.$t("App.User.UserForm.roleLabel"),placeholder:e.$t("App.User.UserForm.roleLabel"),color:"secondary","prepend-inner-icon":c(fe),rules:[c(Ae)],variant:"outlined","hide-details":"auto",required:""},null,8,["modelValue","items","label","placeholder","prepend-inner-icon","rules"]),G.value&&ee.value.length?(d(),N(ge,{key:0,modelValue:W.value,"onUpdate:modelValue":i[11]||(i[11]=b=>W.value=b),items:ee.value,label:e.$t("General.customRole"),color:"secondary","prepend-inner-icon":c(fe),variant:"outlined","hide-details":"auto",clearable:""},null,8,["modelValue","items","label","prepend-inner-icon"])):E("",!0),G.value?(d(),N(ge,{key:1,modelValue:pe.value,"onUpdate:modelValue":i[12]||(i[12]=b=>pe.value=b),items:Ve.value,label:e.$t("App.Group.GroupList.title"),color:"secondary","prepend-inner-icon":c(fe),variant:"outlined","hide-details":"auto",multiple:""},null,8,["modelValue","items","label","prepend-inner-icon"])):E("",!0),a(ge,{modelValue:ne.value,"onUpdate:modelValue":i[13]||(i[13]=b=>ne.value=b),items:$e.value,label:e.$t("App.WorkArea.WorkAreaList.title"),color:"secondary","prepend-inner-icon":c(fe),variant:"outlined","hide-details":"auto",multiple:""},null,8,["modelValue","items","label","prepend-inner-icon"]),f.user?.id?(d(),$(he,{key:2},[a(ie,{class:"mt-4"}),a(Gs),I("div",ra,[I("div",oa,[a(Re,{"svg-path":c($s),class:"h-4 w-4"},null,8,["svg-path"]),I("span",null,m(e.$t("App.User.UserList.lastActive"))+":",1),f.user.lastActiveAt?(d(),$("span",{key:0,title:c(ds)(f.user.lastActiveAt,c(Q))},m(c(ps)(f.user.lastActiveAt,c(Q))),9,ia)):(d(),$("span",na,m(e.$t("App.User.UserList.neverActive")),1))]),f.user.enabled&&f.user.disableAt?(d(),$("div",ua,[a(Re,{"svg-path":c(Ds),class:"h-4 w-4"},null,8,["svg-path"]),I("span",null,m(e.$t("App.User.UserForm.scheduledDisableInfo",{date:ue(f.user.disableAt)})),1),f.canDisableEmployee?(d(),N(Z,{key:0,variant:"text",size:"x-small",color:"secondary",loading:R.value,onClick:Y},{default:r(()=>[x(m(e.$t("App.User.UserForm.cancelScheduledDisable")),1)]),_:1},8,["loading"])):E("",!0)])):E("",!0)])],64)):E("",!0)]),_:1},8,["modelValue"])}}}),pa=()=>({name:"",supervisors:[],users:[]}),ca={class:"flex justify-between items-center border-b px-2 py-3 mb-5"},ma={class:"flex items-center gap-5"},va={key:0,class:"flex flex-col gap-3 mt-5"},fa=ke({__name:"GroupForm",props:{group:{type:Object,required:!0},assignedUsers:{type:Array},canEditGroup:{type:Boolean,default:!0},canDeleteGroup:{type:Boolean,default:!0}},emits:["cancel","update:assignedUsers","update:group"],setup(f,{emit:F}){const l=f,C=F,o=Ee(),A=Ke(),{notifyError:q,notifySuccess:U}=Ie(),{t:Q,locale:j}=we(),B=es({name:l.group?.name??""}),O=w(()=>A.employeeSortBy),V=(t,g)=>Ss(t,g,O.value,j.value),_=w(()=>{const t=new Map;for(const g of o.groups??[])if(g.name)for(const h of g.users??[]){if(!h.id)continue;const re=t.get(h.id)??[];re.push(g.name),t.set(h.id,re)}for(const[,g]of t)g.sort((h,re)=>h.localeCompare(re,j.value,{sensitivity:"base"}));return t}),R=w(()=>(o.users??[]).filter(t=>t.enabled||p.value.includes(t.id)).slice().sort(V).map(t=>{const g=t.id&&_.value.get(t.id)?.length?` (${_.value.get(t.id).join(", ")})`:"";return{title:`${_e(t,O.value)}${g}`,value:t.id}})),p=n(l.assignedUsers?.map(t=>
1t.id)??[]),D=n(l.assignedUsers?.map(t=>t.id)??[]),S=w(()=>o.roles?.filter(t=>t.name===Me.ADMIN||t.name===Me.OPERATIONAL_SUPERVISOR)??[]),K=w(()=>o.users?.filter(t=>S.value?.some(g=>g.id===t.roleId)&&t.enabled||z.value.includes(t.id))??[]),G=t=>Q(`General.${o.getRoleById(t)?.name}`),W=w(()=>K.value.slice().sort(V).map(t=>({title:_e(t,O.value)+" ("+G(t.roleId)+")",value:t.id}))??[]),z=n(l.group?.supervisors?.map(t=>t.id)??[]),ee=n(l.group?.supervisors?.map(t=>t.id)??[]),le=n(!1),J=n(!1),se=()=>{D.value=p.value,ee.value=z.value},te=async()=>{if(B){J.value=!0;try{let t;if(!l.group?.id)t=await o.createGroup(B);else{t=await o.updateGroup({...l.group,...B});try{const g=p.value.filter(k=>!D.value.includes(k)).map(k=>o.users.find(Y=>Y.id===k)).map(k=>o.addUserToGroup(l.group,k)),h=D.value.filter(k=>!p.value.includes(k)).map(k=>o.users.find(Y=>Y.id===k)).map(k=>o.removeUserFromGroup(l.group,k)),re=z.value.filter(k=>!ee.value.includes(k)).map(k=>o.users.find(Y=>Y.id===k)).map(k=>o.addSupervisorToGroup(l.group,k)),ue=ee.value.filter(k=>!z.value.includes(k)).map(k=>o.users.find(Y=>Y.id===k)).map(k=>o.removeSupervisorFromGroup(l.group,k));await Promise.all([...g,...h,...re,...ue]),C("update:assignedUsers",p.value.map(k=>o.users?.find(Y=>Y.id===k)))}catch(g){q(Q(T(g,"App.Group.GroupForm.assignmentGenericError")))}}se(),C("update:group",t),U(Q("App.Group.GroupForm.saveSuccess"))}catch(t){q(Q(T(t,"App.Group.GroupForm.genericSaveError")))}J.value=!1}},v=n(!1),L=()=>v.value=!0,P=()=>v.value=!1,H=async()=>{J.value=!0;try{await o.deleteGroup(l.group),U(Q("App.Group.GroupForm.deleteSuccess")),C("cancel")}catch(t){q(Q(T(t,"App.Group.GroupForm.genericDeleteError")))}J.value=!1,P()};return(t,g)=>(d(),N(us,{modelValue:le.value,"onUpdate:modelValue":g[5]||(g[5]=h=>le.value=h),class:"flex flex-col gap-3",onSubmit:ss(te,["prevent"])},{default:r(()=>[I("div",ca,[as((d(),$("i",{class:"p-1 rounded-full cursor-pointer",onClick:g[0]||(g[0]=h=>t.$emit("cancel"))},[a(Re,{"svg-path":c(ls),class:"text-error"},null,8,["svg-path"])])),[[os]]),I("div",ma,[f.group?.id?(d(),N(Be,{key:0,modelValue:v.value,"onUpdate:modelValue":g[1]||(g[1]=h=>v.value=h),"max-width":"500px"},{activator:r(({props:h})=>[a(Z,{loading:J.value,variant:"text",disabled:!f.canDeleteGroup},{default:r(()=>[a(ze,{icon:c(rs),color:"error",onClick:L},null,8,["icon"])]),_:1},8,["loading","disabled"])]),default:r(()=>[a(Oe,null,{default:r(()=>[a(Pe,{class:"text-h5 text-wrap"},{default:r(()=>[x(m(t.$t("App.Group.GroupForm.deleteConfirmText")),1)]),_:1}),a(qe,null,{default:r(()=>[a(ie),a(Z,{variant:"text",onClick:P},{default:r(()=>[x(m(t.$t("General.cancel")),1)]),_:1}),a(Z,{color:"error",onClick:H},{default:r(()=>[x(m(t.$t("General.confirm")),1)]),_:1}),a(ie)]),_:1})]),_:1})]),_:1},8,["modelValue"])):E("",!0),a(Z,{color:"success",loading:J.value,disabled:!f.canEditGroup||!le.value,type:"submit"},{default:r(()=>[x(m(t.$t(f.group?.id?"General.save":"General.create")),1)]),_:1},8,["loading","disabled"])])]),a(me,{modelValue:B.name,"onUpdate:modelValue":g[2]||(g[2]=h=>B.name=h),label:t.$t("General.name"),type:"text",color:"secondary","prepend-inner-icon":c(Rs),rules:[c(Ae)],variant:"outlined","hide-details":"auto",required:""},null,8,["modelValue","label","prepend-inner-icon","rules"]),f.group?.id?(d(),$("div",va,[a(ge,{modelValue:p.value,"onUpdate:modelValue":g[3]||(g[3]=h=>p.value=h),items:R.value,label:t.$t("App.Group.GroupForm.assignedUsers"),color:"secondary","prepend-inner-icon":c(fe),variant:"outlined","hide-details":"auto",multiple:""},null,8,["modelValue","items","label","prepend-inner-icon"]),a(ge,{modelValue:z.value,"onUpdate:modelValue":g[4]||(g[4]=h=>z.value=h),items:W.value,label:t.$t("App.Group.GroupForm.assignedSuperVisors"),color:"secondary","prepend-inner-icon":c(fe),variant:"outlined","hide-details":"auto",multiple:""},null,8,["modelValue","items","label","prepend-inner-icon"])])):E("",!0)]),_:1},8,["modelValue"]))}}),ga={class:"flex items-center justify-between border-b px-2 py-3 mb-2"},ya={key:0,class:"flex justify-center py-3"},ba={key:1,class:"text-center py-2 text-xs text-gray-400"},Ua=ke({__name:"Groups",setup(f){const F=je(),l=Ee(),{notifyError:C}=Ie(),{t:o,locale:A}=we(),q=n([]),{items:U,total:Q,loading:j,isLoadingMore:B,hasMore:O,search:V,sentinel:_,reset:R}=Ps(v=>l.fetchGroupsPage(v)),p=w(()=>[{title:o("General.name"),align:"start",key:"name"},{title:o("App.Group.GroupList.numberOfAssignedUsers"),align:"start",key:"numberOfUsers"}]),D=n(new Map),S=w(()=>cs(U.value,q.value)),K=n(null),G=n(null);ae(K,async v=>{const L=v?.[0];if(!L){G.value=null;return}const P=U.value.find(H=>H.id===L)??null;if(!P){G.value=null;return}try{const[H,t]=await Promise.all([l.fetchGroupUsers(P),l.fetchGroupSupervisors(P)]);D.value.set(L,H),G.value={...P,supervisors:t}}catch(H){C(o(T(H,"App.Group.GroupList.tableLoadingError"))),G.value={...P}}});const W=n(!1);ae(G,v=>setTimeout(()=>W.value=!!v,v?0:300));const z=()=>G.value=pa(),ee=async v=>{G.value=v;try{await R(),v?.id&&(K.value=[v.id])}catch(L){C(o(T(L,"App.Group.GroupList.tableLoadingError")))}},le=async()=>{K.value=null;try{await R()}catch(v){C(o(T(v,"App.Group.GroupList.tableLoadingError")))}};ye(async()=>{try{await Promise.all([R(),l.fetchUsers(),l.assertRoles()])}catch(v){C(o(T(v,"App.Group.GroupList.tableLoadingError")))}});const J=n(!1),se=n(!1),te=n(!1);return ye(async()=>{try{J.value=await F.hasPermission("enterprise","can_create_groups","operational supervisor")}catch(v){C(o(T(v,"App.rolesRights.permissionCheckError")))}try{se.value=await F.hasPermission("enterprise","can_edit_groups","operational supervisor")}catch(v){C(o(T(v,"App.rolesRights.permissionCheckError")))}try{te.value=await F.hasPermission("enterprise","can_delete_groups","operational supervisor")}catch(v){C(o(T(v,"App.rolesRights.permissionCheckError")))}}),(v,L)=>(d(),$("div",{class:Te(["grid grid-cols-1 gap-4",{"md:grid-cols-2":W.value}])},[a(Ce,null,{default:r(()=>
1[(d(),N(ms,{headers:p.value,items:S.value,"items-length":c(Q),loading:c(j),"sort-by":q.value,"onUpdate:sortBy":L[1]||(L[1]=P=>q.value=P),"item-value":"id","loading-text":v.$t("App.Group.GroupList.tableLoadingText"),hover:!0,"no-data-text":v.$t("App.Group.GroupList.tableNoDataText"),"show-select":"","select-strategy":"single",modelValue:K.value,"onUpdate:modelValue":L[2]||(L[2]=P=>K.value=P),key:c(A),"hide-default-footer":""},{top:r(()=>[I("div",ga,[a(Z,{color:"secondary","prepend-icon":c(is),variant:"elevated",style:{"background-image":"linear-gradient(45deg,#d73625,#F78361)!important"},"data-tour":"groups-new",onClick:z,disabled:!J.value},{default:r(()=>[x(m(v.$t("App.Group.GroupList.new")),1)]),_:1},8,["prepend-icon","disabled"]),a(ie),a(me,{modelValue:c(V),"onUpdate:modelValue":L[0]||(L[0]=P=>fs(V)?V.value=P:null),label:v.$t("General.search"),"prepend-inner-icon":c(ns),variant:"outlined",density:"compact",color:"secondary",flat:"","hide-details":""},null,8,["modelValue","label","prepend-inner-icon"])])]),bottom:r(()=>[I("div",{ref_key:"sentinel",ref:_,class:"h-1"},null,512),c(B)?(d(),$("div",ya,[a(We,{indeterminate:"",size:"24",color:"primary"})])):!c(O)&&c(U).length>0?(d(),$("div",ba,m(v.$t("General.allLoaded")),1)):E("",!0)]),_:1},8,["headers","items","items-length","loading","sort-by","loading-text","no-data-text","modelValue"]))]),_:1}),a(ts,{"enter-from-class":"opacity-0 transform translate-x-10","enter-active-class":"transition-all duration-300 ease-in","enter-to-class":"opacity-100","leave-active-class":"transition-all translate-x-10 duration-300 ease-out","leave-to-class":"opacity-0"},{default:r(()=>[G.value?(d(),N(Ce,{key:0,class:"p-3 sticky top-16 self-start"},{default:r(()=>[(d(),N(fa,{group:G.value,"onUpdate:group":ee,"assigned-users":G.value?.id?D.value?.get(G.value.id):void 0,"onUpdate:assignedUsers":L[3]||(L[3]=P=>G.value?.id?D.value?.set(G.value.id,P):null),key:G.value?.id,onCancel:le,"can-edit-group":se.value,"can-delete-group":te.value},null,8,["group","assigned-users","can-edit-group","can-delete-group"]))]),_:1})):E("",!0)]),_:1})],2))}}),Aa={class:"flex items-center justify-between border-b px-2 py-3 mb-2"},ha={class:"py-2"},ka={class:"py-2"},wa={key:1,class:"text-sm text-light-text"},Va={key:0,class:"flex justify-center py-3"},Ga={key:1,class:"text-center py-2 text-xs text-gray-400"},st=ke({__name:"Users",setup(f){const F=Ke(),l=Ee(),C=je(),{notifyError:o}=Ie(),{t:A,locale:q}=we(),U=xs(),Q=Es(),j=n(!0),B=n("users"),O=n(!1);ye(async()=>{try{O.value=await C.hasPermission("enterprise","can_view_groups","admin")}catch(s){o(A(T(s,"App.rolesRights.permissionCheckError")))}O.value&&U.query.tab==="groups"&&(B.value="groups")}),ae(()=>U.query.tab,s=>{U.name==="users"&&(s==="groups"&&O.value?B.value="groups":s||(B.value="users"))}),ae(B,s=>{if(U.name!=="users")return;const u={...U.query};s==="groups"?u.tab="groups":delete u.tab,Q.replace({query:u})});const V=n(""),_=n(Cs()??!0),R=n(25),p=n([]),D=n(0);let S=null,K=!1;const G=w(()=>F.employeeSortBy),W=n([]),z=n(1),ee=n(!1),le=w(()=>W.value.length<D.value),J=n(null);let se=null;function te(s){const u=Array.isArray(s?.groups)?s.groups:[],y=Array.isArray(s?.workAreas)?s.workAreas:[],M=Array.isArray(s?.customRoles)?s.customRoles:[];return{...s,role:s?.roleName??l.getRoleById(s.roleId)?.name,groupNames:Array.isArray(s?.groupNames)?s.groupNames:u.map(X=>X?.name).filter(Boolean).sort(),workAreaNames:Array.isArray(s?.workAreaNames)?s.workAreaNames:y.map(X=>X?.name).filter(Boolean).sort(),customRole:s?.customRole??(M.length?M.map(X=>X?.name).filter(Boolean).join(", "):null)}}const v=w(()=>{const s=[{title:A("General.active"),align:"start",key:"enabled"},{title:A("General.firstName"),align:"start",key:"firstName"},{title:A("General.lastName"),align:"start",key:"lastName"},{title:A("App.User.UserList.workArea"),align:"start",key:"workAreaNames"},{title:A("App.User.UserList.groups"),align:"start",key:"groupNames"},{title:A("General.email"),align:"start",key:"email"},{title:A("General.role"),align:"start",key:"role"},{title:A("App.User.UserList.lastActive"),align:"start",key:"lastActiveAt"}];return ce.value&&s.push({title:A("General.customRole"),align:"start",key:"customRole"}),s}),L=w(()=>cs(W.value,p.value));ae(G,s=>{const u=p.value?.[0]?.key;(!u||u==="firstName"||u==="lastName")&&(p.value=[{key:s,order:"asc"}])},{immediate:!0});const P=async s=>{t.value=s;try{await de(),s.id&&(H.value=[s.id])}catch(u){console.error(`Failed to refresh user ${s.id}:`,u)}},H=n([]),t=n(null);ae(J,s=>{se?.disconnect(),se=null,s&&(se=new IntersectionObserver(u=>{u[0]?.isIntersecting&&pe()},{rootMargin:"200px",threshold:0}),se.observe(s))}),gs(()=>{se?.disconnect()});const g=(s,u)=>{if(s?.target?.closest?.("button, a, input, .v-selection-control"))return;const M=u?.item?.id??u?.item?.raw?.id??u?.internalItem?.raw?.id??u?.raw?.id??u?.value??u?.internalItem?.value;M&&(H.value=[String(M)])};ae(H,s=>{const u=s?.[0];t.value=u?W.value.find(y=>y.id===u)??null:null});const h=n(!1);ae(t,s=>setTimeout(()=>h.value=!!s,s?0:300));const re=()=>{t.value={email:"",firstName:"",lastName:"",roleId:"",phone:"",workAreas:[],groups:[]}},ue=()=>{H.value=[],t.value=null},k=async()=>{ue();try{await de()}catch(s){console.error("Failed to refresh user table after delete",s)}},Y=async()=>{await Promise.all([l.fetchUsersPage({page:z.value,pageSize:R.value,search:V.value,onlyActive:_.value}).then(s=>{D.value=s.total??0;const u=(l.users??[]).map(te);z.value===1?W.value=u:W.value=[...W.value,...u]}),l.assertRoles()])},de=async()=>{z.value=1,await Y()},pe=async()=>
1{if(!(!le.value||ee.value||j.value)){ee.value=!0,z.value++;try{await Y()}catch(s){z.value--,console.error("Failed to load more users",s)}finally{ee.value=!1}}},be=async()=>{if(await C.getLicenseKey()!=="enterprise"){ce.value=!1;return}try{await F.fetchRoles(),ce.value=(F.roles??[]).length>0}catch(u){console.error("Failed loading dynamic roles for custom role column",u),ce.value=!1}};ye(async()=>await Promise.all([l.fetchGroups(),l.fetchWorkAreas(),de()]).then(()=>j.value=!1).then(()=>Ve()).catch(s=>o(A(T(s,"App.User.UserList.tableLoadingError")))));const Ve=async()=>{const s=typeof U.query.userId=="string"?U.query.userId:"";if(!s||U.name!=="users")return;const{userId:u,...y}=U.query;Q.replace({query:y}),B.value="users";let M=W.value.find(X=>X.id===s);if(!M)try{const X=await l.fetchUser(s);K=!0,V.value=X.email||`${X.firstName??""} ${X.lastName??""}`.trim(),X.enabled===!1&&(_.value=!1),await ys(),K=!1,j.value=!0,await de(),M=W.value.find(Fe=>Fe.id===s)}catch(X){K=!1,o(A(T(X,"App.User.UserList.tableLoadingError")))}finally{j.value=!1}M&&(H.value=[String(M.id)])};ae(()=>U.query.userId,s=>{s&&!j.value&&Ve()}),ye(async()=>{be();try{Ue.value=await C.hasPermission("basic","can_create_employees","staff"),Ue.value&&($e.value=await C.isLimitReached("employee"))}catch(s){o(A(T(s,"App.rolesRights.permissionCheckError")))}try{Ge.value=await C.hasPermission("basic","can_edit_employees","staff")}catch(s){o(A(T(s,"App.rolesRights.permissionCheckError")))}try{ne.value=await C.hasPermission("basic","can_delete_employees","staff")}catch(s){o(A(T(s,"App.rolesRights.permissionCheckError")))}try{ve.value=await C.hasPermission("basic","can_disable_employees","staff")}catch(s){o(A(T(s,"App.rolesRights.permissionCheckError")))}}),ae(V,()=>{K||(S&&(clearTimeout(S),S=null),S=setTimeout(async()=>{try{await de()}catch(s){console.error("Failed to search users",s)}},350))}),ae(_,async s=>{if(!K){Ls(s),ue();try{await de()}catch(u){console.error("Failed to reload users after active filter change",u)}}});const Ue=n(!0),Ge=n(!0),ne=n(!1),ve=n(!1),$e=n(!1),ce=n(!1);return(s,u)=>(d(),$("div",null,[a(hs,{class:"mb-4"}),O.value?(d(),N(qs,{key:0,modelValue:B.value,"onUpdate:modelValue":u[0]||(u[0]=y=>B.value=y),color:"secondary","data-tour":"users-tabs"},{default:r(()=>[a(Je,{value:"users"},{default:r(()=>[x(m(s.$t("App.User.UserList.title")),1)]),_:1}),a(Je,{value:"groups","data-tour":"users-tab-groups"},{default:r(()=>[x(m(s.$t("App.Group.GroupList.title")),1)]),_:1})]),_:1},8,["modelValue"])):E("",!0),a(Ms,{modelValue:B.value,"onUpdate:modelValue":u[6]||(u[6]=y=>B.value=y),class:Te({"mt-4":O.value})},{default:r(()=>[a(Ye,{value:"users"},{default:r(()=>[I("div",{class:Te(["grid grid-cols-1 gap-4",{"md:grid-cols-2":h.value}])},[a(Ce,{"data-tour":"users-table"},{default:r(()=>[(d(),N(ms,{headers:v.value,items:L.value,"items-length":D.value,loading:j.value,"items-per-page":R.value,"onUpdate:itemsPerPage":u[3]||(u[3]=y=>R.value=y),"sort-by":p.value,"onUpdate:sortBy":u[4]||(u[4]=y=>p.value=y),"loading-text":s.$t("App.User.UserList.tableLoadingText"),hover:!0,"no-data-text":s.$t("App.User.UserList.tableNoDataText"),"show-select":"","select-strategy":"single","item-value":"id",modelValue:H.value,"onUpdate:modelValue":u[5]||(u[5]=y=>H.value=y),key:c(q),"onClick:row":g,"hide-default-footer":""},bs({top:r(()=>[I("div",Aa,[a(Z,{color:"secondary","prepend-icon":c(is),onClick:re,variant:"elevated",style:{"background-image":"linear-gradient(45deg,#d73625,#F78361)!important"},"data-tour":"users-new",disabled:!Ue.value||!!$e.value||!!t.value},{default:r(()=>[x(m(s.$t("App.User.UserList.new")),1)]),_:1},8,["prepend-icon","disabled"]),a(ie),a(Ws,{modelValue:_.value,"onUpdate:modelValue":u[1]||(u[1]=y=>_.value=y),label:s.$t("App.User.UserList.onlyActive"),color:"secondary",density:"compact","hide-details":"",class:"mr-4 flex-none"},null,8,["modelValue","label"]),a(me,{modelValue:V.value,"onUpdate:modelValue":u[2]||(u[2]=y=>V.value=y),label:s.$t("General.search"),"prepend-inner-icon":c(ns),variant:"outlined",density:"compact",color:"secondary",flat:"","hide-details":""},null,8,["modelValue","label","prepend-inner-icon"])]),a(ie)]),"item.workAreaNames":r(({item:y}
1)=>[I("div",ha,[(d(!0),$(he,null,xe(y.workAreaNames,M=>(d(),N(De,{color:"text",class:"m-1"},{default:r(()=>[x(m(M),1)]),_:2},1024))),256))])]),"item.groupNames":r(({item:y})=>[I("div",ka,[(d(!0),$(he,null,xe(y.groupNames,M=>(d(),N(De,{color:"text",class:"m-1"},{default:r(()=>[x(m(M),1)]),_:2},1024))),256))])]),"item.role":r(({item:y})=>[a(De,{color:y.role===c(Me).ADMIN?"success":"info"},{default:r(()=>[x(m(s.$t(`General.${y.role}`)),1)]),_:2},1032,["color"])]),"item.enabled":r(({item:y})=>[a(ze,{icon:y.enabled?c(Is):c(Fs),color:y.enabled?"success":"error"},null,8,["icon","color"])]),"item.lastActiveAt":r(({item:y})=>[y.lastActiveAt?(d(),N(As,{key:0,text:c(ds)(y.lastActiveAt,c(q))},{activator:r(({props:M})=>[I("span",Us(M,{class:"text-sm"}),m(c(ps)(y.lastActiveAt,c(q))),17)]),_:2},1032,["text"])):(d(),$("span",wa,m(s.$t("App.User.UserList.neverActive")),1))]),bottom:r(()=>[I("div",{ref_key:"infiniteScrollSentinel",ref:J,class:"h-1"},null,512),ee.value?(d(),$("div",Va,[a(We,{indeterminate:"",size:"24",color:"primary"})])):!le.value&&W.value.length>0?(d(),$("div",Ga,m(s.$t("General.allLoaded")||"Alle Mitarbeiter geladen"),1)):E("",!0)]),_:2},[ce.value?{name:"item.customRole",fn:r(({item:y})=>[a(De,{color:"info"},{default:r(()=>[x(m(y.customRole),1)]),_:2},1024)]),key:"0"}:void 0]),1032,["headers","items","items-length","loading","items-per-page","sort-by","loading-text","no-data-text","modelValue"]))]),_:1}),a(ts,{"enter-from-class":"opacity-0 transform translate-x-10","enter-active-class":"transition-all duration-300 ease-in","enter-to-class":"opacity-100","leave-active-class":"transition-all translate-x-10 duration-300 ease-out","leave-to-class":"opacity-0"},{default:r(()=>[t.value?(d(),N(Ce,{key:0,class:"p-3 sticky top-16 self-start"},{default:r(()=>[(d(),N(da,{user:t.value,"assigned-groups":t.value.groups,"assigned-work-areas":t.value.workAreas,"onUpdate:user":P,key:t.value.id,onCancel:ue,onDeleted:k,"can-edit-employee":Ge.value,"can-delete-employee":ne.value,"can-disable-employee":ve.value},null,8,["user","assigned-groups","assigned-work-areas","can-edit-employee","can-delete-employee","can-disable-employee"]))]),_:1})):E("",!0)]),_:1})],2)]),_:1}),a(Ye,{value:"groups"},{default:r(()=>[a(Ua)]),_:1})]),_:1},8,["modelValue","class"])]))}});export{st 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.