PageSourceSearch

https://portal.safeos.de/assets/Users-DXJ1vacl.js

js safeos.de collected 2026-09-25 03:43:28 UTC 35,979 bytes, 1 lines download raw bytes

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