Files
at-mintel/packages/cms-infra/extensions/customer-manager/index.js
Marc Mintel 9e4e296e3b
Some checks failed
Monorepo Pipeline / 🧪 Quality Assurance (push) Failing after 11s
Monorepo Pipeline / 🚀 Release (push) Has been skipped
Monorepo Pipeline / 🐳 Build Directus (Base) (push) Has been skipped
Monorepo Pipeline / 🐳 Build Gatekeeper (Product) (push) Has been skipped
Monorepo Pipeline / 🐳 Build Build-Base (push) Has been skipped
Monorepo Pipeline / 🐳 Build Production Runtime (push) Has been skipped
feat: adds aquisition extension to cms
2026-02-10 21:30:23 +01:00

2 lines
12 KiB
JavaScript

import{useApi as e,defineModule as a}from"@directus/extensions-sdk";import{defineComponent as t,ref as l,computed as n,onMounted as i,resolveComponent as s,resolveDirective as r,openBlock as o,createBlock as d,withCtx as u,createVNode as c,createElementBlock as m,Fragment as v,renderList as p,createTextVNode as f,toDisplayString as g,createCommentVNode as y,createElementVNode as _,withDirectives as b,nextTick as h}from"vue";const x={class:"content-wrapper"},w={key:0,class:"empty-state"},k={class:"header"},V={class:"header-left"},C={class:"title"},M={class:"subtitle"},F={class:"header-right"},N={class:"user-cell"},z={class:"user-name"},E={key:0,class:"status-date"},U={key:0,class:"drawer-content"},Z={class:"form-section"},$={class:"field"},P={class:"drawer-actions"},S={key:0,class:"drawer-content"},A={class:"form-section"},T={class:"field"},j={class:"field"},D={class:"field"},K={class:"field"},O={key:1,class:"field"},W={class:"drawer-actions"};var q=t({__name:"module",setup(a){const t=e(),q=l([]),B=l(null),L=l([]),G=l([]),I=l(!1),H=l(!1),J=l(null),Q=l(null),R=n(()=>G.value.map(e=>({text:`${e.first_name} ${e.last_name} (${e.company||"Keine Firma"})`,value:e.id}))),X=l(!1),Y=l(!1),ee=l({id:"",name:""}),ae=l(!1),te=l(!1),le=l({id:"",first_name:"",last_name:"",email:"",contact_person:null,temporary_password:""}),ne=[{text:"Name",value:"name",sortable:!0},{text:"E-Mail",value:"email",sortable:!0},{text:"Zuletzt eingeladen",value:"last_invited",sortable:!0}];async function ie(){const[e,a]=await Promise.all([t.get("/items/companies",{params:{fields:["id","name"],sort:"name"}}),t.get("/items/people",{params:{sort:"last_name"}})]);q.value=e.data.data,G.value=a.data.data}async function se(e){B.value=e,I.value=!0;try{const a=await t.get("/items/client_users",{params:{filter:{company:{_eq:e.id}},fields:["*"],sort:"first_name"}});L.value=a.data.data}finally{I.value=!1}}function re(){Y.value=!1,ee.value={id:"",name:""},X.value=!0}async function oe(){B.value&&(ee.value={id:B.value.id,name:B.value.name},Y.value=!0,await h(),X.value=!0)}async function de(){var e;if(ee.value.name){H.value=!0;try{Y.value?(await t.patch(`/items/companies/${ee.value.id}`,{name:ee.value.name}),Q.value={type:"success",message:"Firma aktualisiert!"}):(await t.post("/items/companies",{name:ee.value.name}),Q.value={type:"success",message:"Firma angelegt!"}),X.value=!1,await ie(),(null==(e=B.value)?void 0:e.id)===ee.value.id&&(B.value.name=ee.value.name)}catch(e){Q.value={type:"danger",message:e.message}}finally{H.value=!1}}}function ue(){te.value=!1,le.value={id:"",first_name:"",last_name:"",email:"",contact_person:null,temporary_password:""},ae.value=!0}async function ce(){if(le.value.email&&B.value){H.value=!0;try{te.value?(await t.patch(`/items/client_users/${le.value.id}`,{first_name:le.value.first_name,last_name:le.value.last_name,email:le.value.email,contact_person:le.value.contact_person}),Q.value={type:"success",message:"Mitarbeiter aktualisiert!"}):(await t.post("/items/client_users",{first_name:le.value.first_name,last_name:le.value.last_name,email:le.value.email,company:B.value.id,contact_person:le.value.contact_person}),Q.value={type:"success",message:"Mitarbeiter angelegt!"}),ae.value=!1,await se(B.value)}catch(e){Q.value={type:"danger",message:e.message}}finally{H.value=!1}}}function me(e){const a=(null==e?void 0:e.item)||e;a&&a.id&&async function(e){le.value={id:e.id||"",first_name:e.first_name||"",last_name:e.last_name||"",email:e.email||"",contact_person:e.contact_person||null,temporary_password:e.temporary_password||""},te.value=!0,await h(),ae.value=!0}(a)}return i(()=>{ie()}),(e,a)=>{const l=s("v-icon"),n=s("v-list-item-icon"),i=s("v-text-overflow"),h=s("v-list-item-content"),G=s("v-list-item"),ie=s("v-divider"),ve=s("v-list"),pe=s("v-notice"),fe=s("v-button"),ge=s("v-info"),ye=s("v-avatar"),_e=s("v-chip"),be=s("v-table"),he=s("v-input"),xe=s("v-drawer"),we=s("v-select"),ke=s("private-view"),Ve=r("tooltip");return o(),d(ke,{title:"Customer Manager"},{navigation:u(()=>[c(ve,{nav:""},{default:u(()=>[c(G,{onClick:re,clickable:""},{default:u(()=>[c(n,null,{default:u(()=>[c(l,{name:"add",color:"var(--theme--primary)"})]),_:1}),c(h,null,{default:u(()=>[c(i,{text:"Neue Firma anlegen"})]),_:1})]),_:1}),c(ie),(o(!0),m(v,null,p(q.value,e=>{var a;return o(),d(G,{key:e.id,active:(null==(a=B.value)?void 0:a.id)===e.id,class:"company-item",clickable:"",onClick:a=>se(e)},{default:u(()=>[c(n,null,{default:u(()=>[c(l,{name:"business"})]),_:1}),c(h,null,{default:u(()=>[c(i,{text:e.name},null,8,["text"])]),_:2},1024)]),_:2},1032,["active","onClick"])}),128))]),_:1})]),"title-outer:after":u(()=>[Q.value?(o(),d(pe,{key:0,type:Q.value.type,onClose:a[0]||(a[0]=e=>Q.value=null),dismissible:""},{default:u(()=>[f(g(Q.value.message),1)]),_:1},8,["type"])):y("v-if",!0)]),default:u(()=>[_("div",x,[B.value?(o(),m(v,{key:1},[_("header",k,[_("div",V,[_("h1",C,g(B.value.name),1),_("p",M,g(L.value.length)+" Kunden-Mitarbeiter",1)]),_("div",F,[b((o(),d(fe,{secondary:"",rounded:"",icon:"",onClick:oe},{default:u(()=>[c(l,{name:"edit"})]),_:1})),[[Ve,"Firma bearbeiten",void 0,{bottom:!0}]]),c(fe,{primary:"",onClick:ue},{default:u(()=>[...a[15]||(a[15]=[f(" Mitarbeiter hinzufügen ",-1)])]),_:1})])]),c(be,{headers:ne,items:L.value,loading:I.value,class:"clickable-table","fixed-header":"","onClick:row":me},{"item.name":u(({item:e})=>[_("div",N,[c(ye,{name:e.first_name,"x-small":""},null,8,["name"]),_("span",z,g(e.first_name)+" "+g(e.last_name),1)])]),"item.last_invited":u(({item:e})=>{return[e.last_invited?(o(),m("span",E,g((t=e.last_invited,new Date(t).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit"}))),1)):(o(),d(_e,{key:1,"x-small":""},{default:u(()=>[...a[16]||(a[16]=[f("Noch nie",-1)])]),_:1}))];var t}),_:2},1032,["items","loading"])],64)):(o(),m("div",w,[c(ge,{title:"Firmen auswählen",icon:"business",center:""},{default:u(()=>[a[13]||(a[13]=f(" Wähle eine Firma in der Navigation aus oder ",-1)),c(fe,{"x-small":"",onClick:re},{default:u(()=>[...a[12]||(a[12]=[f("erstelle eine neue Firma",-1)])]),_:1}),a[14]||(a[14]=f(". ",-1))]),_:1})]))]),c(xe,{modelValue:X.value,"onUpdate:modelValue":a[2]||(a[2]=e=>X.value=e),title:Y.value?"Firma bearbeiten":"Neue Firma anlegen",icon:"business",onCancel:a[3]||(a[3]=e=>X.value=!1)},{default:u(()=>[X.value?(o(),m("div",U,[_("div",Z,[_("div",$,[a[17]||(a[17]=_("span",{class:"label"},"Firmenname",-1)),c(he,{modelValue:ee.value.name,"onUpdate:modelValue":a[1]||(a[1]=e=>ee.value.name=e),placeholder:"z.B. KLZ Cables",autofocus:""},null,8,["modelValue"])])]),_("div",P,[c(fe,{primary:"",block:"",loading:H.value,onClick:de},{default:u(()=>[...a[18]||(a[18]=[f("Speichern",-1)])]),_:1},8,["loading"])])])):y("v-if",!0)]),_:1},8,["modelValue","title"]),c(xe,{modelValue:ae.value,"onUpdate:modelValue":a[10]||(a[10]=e=>ae.value=e),title:te.value?"Mitarbeiter bearbeiten":"Neuen Mitarbeiter anlegen",icon:"person",onCancel:a[11]||(a[11]=e=>ae.value=!1)},{default:u(()=>[ae.value?(o(),m("div",S,[_("div",A,[_("div",T,[a[19]||(a[19]=_("span",{class:"label"},"Vorname",-1)),c(he,{modelValue:le.value.first_name,"onUpdate:modelValue":a[4]||(a[4]=e=>le.value.first_name=e),placeholder:"Vorname",autofocus:""},null,8,["modelValue"])]),_("div",j,[a[20]||(a[20]=_("span",{class:"label"},"Nachname",-1)),c(he,{modelValue:le.value.last_name,"onUpdate:modelValue":a[5]||(a[5]=e=>le.value.last_name=e),placeholder:"Nachname"},null,8,["modelValue"])]),_("div",D,[a[21]||(a[21]=_("span",{class:"label"},"E-Mail",-1)),c(he,{modelValue:le.value.email,"onUpdate:modelValue":a[6]||(a[6]=e=>le.value.email=e),placeholder:"E-Mail Adresse",type:"email"},null,8,["modelValue"])]),_("div",K,[a[22]||(a[22]=_("span",{class:"label"},"Zugehörige Person (Zentral)",-1)),c(we,{modelValue:le.value.contact_person,"onUpdate:modelValue":a[7]||(a[7]=e=>le.value.contact_person=e),items:R.value,placeholder:"Zentrale Person auswählen...","show-deselect":""},null,8,["modelValue","items"]),a[23]||(a[23]=_("p",{class:"field-note"},"Verknüpft diesen Mitarbeiter mit dem globalen Personen-Verzeichnis.",-1))]),te.value?(o(),d(ie,{key:0})):y("v-if",!0),te.value?(o(),m("div",O,[a[24]||(a[24]=_("span",{class:"label"},"Temporäres Passwort",-1)),c(he,{modelValue:le.value.temporary_password,"onUpdate:modelValue":a[8]||(a[8]=e=>le.value.temporary_password=e),readonly:"",class:"password-input"},null,8,["modelValue"]),a[25]||(a[25]=_("p",{class:"field-note"},"Wird beim Senden der Zugangsdaten automatisch generiert.",-1))])):y("v-if",!0)]),_("div",W,[c(fe,{primary:"",block:"",loading:H.value,onClick:ce},{default:u(()=>[...a[26]||(a[26]=[f("Daten speichern",-1)])]),_:1},8,["loading"]),te.value?(o(),m(v,{key:0},[c(ie),b((o(),d(fe,{secondary:"",block:"",loading:J.value===le.value.id,onClick:a[9]||(a[9]=e=>async function(e){J.value=e.id;try{if(await t.post("/flows/trigger/33443f6b-cec7-4668-9607-f33ea674d501",[e.id]),Q.value={type:"success",message:`Zugangsdaten für ${e.first_name} versendet. 📧`},await se(B.value),ae.value&&le.value.id===e.id){const a=L.value.find(a=>a.id===e.id);a&&(le.value.temporary_password=a.temporary_password)}}catch(e){Q.value={type:"danger",message:`Fehler: ${e.message}`}}finally{J.value=null}}(le.value))},{default:u(()=>[c(l,{name:"send",left:""}),a[27]||(a[27]=f(" Zugangsdaten senden ",-1))]),_:1},8,["loading"])),[[Ve,"Generiert PW, speichert es und sendet E-Mail",void 0,{bottom:!0}]])],64)):y("v-if",!0)])])):y("v-if",!0)]),_:1},8,["modelValue","title"])]),_:1})}}}),B=[],L=[];!function(e,a){if(e&&"undefined"!=typeof document){var t,l=!0===a.prepend?"prepend":"append",n=!0===a.singleTag,i="string"==typeof a.container?document.querySelector(a.container):document.getElementsByTagName("head")[0];if(n){var s=B.indexOf(i);-1===s&&(s=B.push(i)-1,L[s]={}),t=L[s]&&L[s][l]?L[s][l]:L[s][l]=r()}else t=r();65279===e.charCodeAt(0)&&(e=e.substring(1)),t.styleSheet?t.styleSheet.cssText+=e:t.appendChild(document.createTextNode(e))}function r(){var e=document.createElement("style");if(e.setAttribute("type","text/css"),a.attributes)for(var t=Object.keys(a.attributes),n=0;n<t.length;n++)e.setAttribute(t[n],a.attributes[t[n]]);var s="prepend"===l?"afterbegin":"beforeend";return i.insertAdjacentElement(s,e),e}}("\n.content-wrapper[data-v-c6391edc] { padding: 32px; height: 100%; display: flex; flex-direction: column;\n}\n.company-item[data-v-c6391edc] { cursor: pointer;\n}\n.header[data-v-c6391edc] { margin-bottom: 24px; display: flex; justify-content: space-between; align-items: flex-end;\n}\n.header-right[data-v-c6391edc] { display: flex; gap: 12px;\n}\n.title[data-v-c6391edc] { font-size: 24px; font-weight: 800; margin-bottom: 4px;\n}\n.subtitle[data-v-c6391edc] { color: var(--theme--foreground-subdued); font-size: 14px;\n}\n.empty-state[data-v-c6391edc] { height: 100%; display: flex; align-items: center; justify-content: center;\n}\n.user-cell[data-v-c6391edc] { display: flex; align-items: center; gap: 12px;\n}\n.user-name[data-v-c6391edc] { font-weight: 600;\n}\n.status-date[data-v-c6391edc] { font-size: 12px; color: var(--theme--foreground-subdued);\n}\n.drawer-content[data-v-c6391edc] { padding: 24px; display: flex; flex-direction: column; gap: 32px;\n}\n.form-section[data-v-c6391edc] { display: flex; flex-direction: column; gap: 20px;\n}\n.field[data-v-c6391edc] { display: flex; flex-direction: column; gap: 8px;\n}\n.label[data-v-c6391edc] { font-size: 12px; font-weight: 700; text-transform: uppercase; color: var(--theme--foreground-subdued); letter-spacing: 0.5px;\n}\n.field-note[data-v-c6391edc] { font-size: 11px; color: var(--theme--foreground-subdued); margin-top: 4px;\n}\n.drawer-actions[data-v-c6391edc] { margin-top: 24px; display: flex; flex-direction: column; gap: 12px;\n}\n.password-input[data-v-c6391edc] textarea {\n\tfont-family: var(--family-monospace);\n\tfont-weight: 800;\n\tcolor: var(--theme--primary) !important;\n\tbackground: var(--theme--background-subdued) !important;\n}\n.clickable-table[data-v-c6391edc] tbody tr { cursor: pointer; transition: background-color 0.2s ease;\n}\n.clickable-table[data-v-c6391edc] tbody tr:hover { background-color: var(--theme--background-subdued) !important;\n}\n[data-v-c6391edc] .v-list-item { cursor: pointer !important;\n}\n",{});var G=a({id:"customer-manager",name:"Customer Manager",icon:"supervisor_account",routes:[{path:"",component:((e,a)=>{const t=e.__vccOpts||e;for(const[e,l]of a)t[e]=l;return t})(q,[["__scopeId","data-v-c6391edc"],["__file","module.vue"]])}]});export{G as default};