Files
at-mintel/directus/extensions/acquisition-manager/index.js
Marc Mintel 81deaf447f fix(acquisition): standardize bundling and externalize React/PDF dependencies
- Added JSX support to esbuild configuration.
- Externalized react, react-dom, and @react-pdf/renderer to avoid redundant bundling.
- Updated acquisition-library exports for modular PDF generation.
2026-02-12 21:24:15 +01:00

2 lines
14 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 o,openBlock as d,createBlock as r,withCtx as u,createVNode as c,createElementBlock as v,Fragment as p,renderList as m,createTextVNode as f,toDisplayString as g,createCommentVNode as y,createElementVNode as b,withDirectives as h}from"vue";var _=Object.defineProperty,x=Object.getOwnPropertySymbols,w=Object.prototype.hasOwnProperty,k=Object.prototype.propertyIsEnumerable,V=(e,a,t)=>a in e?_(e,a,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[a]=t;const A={class:"content-wrapper"},C={key:0,class:"empty-state"},$={class:"header"},U={class:"header-left"},F={class:"title"},O={class:"subtitle"},P=["href"],E={class:"header-right"},S={class:"sections"},j={class:"main-info"},L={class:"form-grid"},z={class:"field"},q={key:1,class:"value text-subdued"},B={class:"field"},N={class:"value"},D={class:"field full"},M={class:"value text-block"},I={key:0,class:"ai-observations"},T={class:"metrics"},K={class:"page-title"},G={class:"page-url"},R={class:"drawer-content"},W={class:"form-section"},H={class:"field"},J={class:"field"},Q={class:"field"},X={class:"field"},Y={class:"field"},Z={class:"field"},ee={class:"drawer-actions"};var ae=t({__name:"module",setup(a){const t=e(),_=l([]),ae=l(null),te=l(!1),le=l(!1),ne=l(!1),ie=l(!1),se=l(!1),oe=l(null),de=l({company_name:"",website_url:"",contact_name:"",contact_email:"",contact_person:null,briefing:"",status:"new"}),re=l([]),ue=n(()=>re.value.map(e=>({text:`${e.first_name} ${e.last_name}`,value:e.id})));function ce(e){const a=re.value.find(a=>a.id===e);return a?`${a.first_name} ${a.last_name}`:e}const ve=n(()=>_.value.find(e=>e.id===ae.value));async function pe(){const[e,a]=await Promise.all([t.get("/items/leads",{params:{sort:"-date_created"}}),t.get("/items/people",{params:{sort:"last_name"}})]);_.value=e.data.data,re.value=a.data.data,!ae.value&&_.value.length>0&&(ae.value=_.value[0].id)}async function me(){if(ae.value){te.value=!0;try{await t.post(`/acquisition/audit/${ae.value}`),oe.value={type:"success",message:"Audit erfolgreich gestartet!"},await pe()}catch(e){oe.value={type:"danger",message:`Fehler beim Audit: ${e.message}`}}finally{te.value=!1}}}async function fe(){if(ae.value){ne.value=!0;try{await t.post(`/acquisition/audit-email/${ae.value}`),oe.value={type:"success",message:"Audit E-Mail versendet!"},await pe()}catch(e){oe.value={type:"danger",message:`Fehler beim Versenden: ${e.message}`}}finally{ne.value=!1}}}async function ge(){if(ae.value){le.value=!0;try{await t.post(`/acquisition/estimate/${ae.value}`),oe.value={type:"success",message:"Angebot (PDF) wurde generiert!"},await pe()}catch(e){oe.value={type:"danger",message:`Fehler bei PDF Generierung: ${e.message}`}}finally{le.value=!1}}}async function ye(){if(ae.value){ne.value=!0;try{await t.post(`/acquisition/estimate-email/${ae.value}`),oe.value={type:"success",message:"Angebot erfolgreich versendet!"},await pe()}catch(e){oe.value={type:"danger",message:`Fehler beim Versenden: ${e.message}`}}finally{ne.value=!1}}}function be(){var e;(null==(e=ve.value)?void 0:e.audit_pdf_path)&&window.open(`${window.location.origin}/assets/${ve.value.audit_pdf_path}`,"_blank")}async function he(){if(de.value.company_name){se.value=!0;try{const e=((e,a)=>{for(var t in a||(a={}))w.call(a,t)&&V(e,t,a[t]);if(x)for(var t of x(a))k.call(a,t)&&V(e,t,a[t]);return e})({id:crypto.randomUUID()},de.value);await t.post("/items/leads",e),oe.value={type:"success",message:"Lead erfolgreich registriert!"},ie.value=!1,await pe(),ae.value=e.id,de.value={company_name:"",website_url:"",contact_name:"",contact_email:"",contact_person:null,briefing:"",status:"new"}}catch(e){oe.value={type:"danger",message:`Fehler beim Speichern: ${e.message}`}}finally{se.value=!1}}}function _e(e){switch(e){case"new":return"fiber_new";case"auditing":return"hourglass_empty";case"audit_ready":return"check_circle";case"contacted":return"mail_outline";default:return"help_outline"}}function xe(e){switch(e){case"new":return"var(--theme--primary)";case"auditing":return"var(--theme--warning)";case"audit_ready":return"var(--theme--success)";case"contacted":return"var(--theme--secondary)";default:return"var(--theme--foreground-subdued)"}}return i(pe),(e,a)=>{const t=s("v-icon"),l=s("v-list-item-icon"),n=s("v-text-overflow"),i=s("v-list-item-content"),x=s("v-list-item"),w=s("v-divider"),k=s("v-list"),V=s("v-notice"),re=s("v-button"),pe=s("v-info"),we=s("v-table"),ke=s("v-input"),Ve=s("v-textarea"),Ae=s("v-select"),Ce=s("v-drawer"),$e=s("private-view"),Ue=o("tooltip");return d(),r($e,{title:"Acquisition Manager"},{navigation:u(()=>[c(k,{nav:""},{default:u(()=>[c(x,{onClick:a[0]||(a[0]=e=>ie.value=!0),clickable:""},{default:u(()=>[c(l,null,{default:u(()=>[c(t,{name:"add",color:"var(--theme--primary)"})]),_:1}),c(i,null,{default:u(()=>[c(n,{text:"Neuen Lead anlegen"})]),_:1})]),_:1}),c(w),(d(!0),v(p,null,m(_.value,e=>(d(),r(x,{key:e.id,active:ae.value===e.id,class:"lead-item",clickable:"",onClick:a=>{return t=e.id,void(ae.value=t);var t}},{default:u(()=>[c(l,null,{default:u(()=>[c(t,{name:_e(e.status),color:xe(e.status)},null,8,["name","color"])]),_:2},1024),c(i,null,{default:u(()=>[c(n,{text:e.company_name},null,8,["text"])]),_:2},1024)]),_:2},1032,["active","onClick"]))),128))]),_:1})]),"title-outer:after":u(()=>[oe.value?(d(),r(V,{key:0,type:oe.value.type,onClose:a[1]||(a[1]=e=>oe.value=null),dismissible:""},{default:u(()=>[f(g(oe.value.message),1)]),_:1},8,["type"])):y("v-if",!0)]),default:u(()=>{var e;return[b("div",A,[c(V,{type:"success",style:{"margin-bottom":"16px"}},{default:u(()=>[f(" DEBUG: Module Version 1.1.0 - Native Build - "+g((new Date).toISOString()),1)]),_:1}),ve.value?(d(),v(p,{key:1},[b("header",$,[b("div",U,[b("h1",F,g(ve.value.company_name),1),b("p",O,[c(t,{name:"language","x-small":""}),b("a",{href:ve.value.website_url,target:"_blank",class:"url-link"},g(ve.value.website_url.replace(/^https?:\/\//,"")),9,P),f(" · Status: "+g(ve.value.status.toUpperCase()),1)])]),b("div",E,["new"===ve.value.status?(d(),r(re,{key:0,secondary:"",loading:te.value,onClick:me},{default:u(()=>[c(t,{name:"settings_suggest",left:""}),a[15]||(a[15]=f(" Audit starten ",-1))]),_:1},8,["loading"])):y("v-if",!0),"audit_ready"===ve.value.status?(d(),v(p,{key:1},[c(re,{secondary:"",loading:ne.value,onClick:fe},{default:u(()=>[c(t,{name:"mail",left:""}),a[16]||(a[16]=f(" Audit E-Mail ",-1))]),_:1},8,["loading"]),c(re,{loading:le.value,onClick:ge},{default:u(()=>[c(t,{name:"picture_as_pdf",left:""}),a[17]||(a[17]=f(" PDF Erstellen ",-1))]),_:1},8,["loading"])],64)):y("v-if",!0),ve.value.audit_pdf_path?h((d(),r(re,{key:2,secondary:"",icon:"",onClick:be},{default:u(()=>[c(t,{name:"open_in_new"})]),_:1})),[[Ue,"PDF öffnen",void 0,{bottom:!0}]]):y("v-if",!0),ve.value.audit_pdf_path?(d(),r(re,{key:3,primary:"",loading:ne.value,onClick:ye},{default:u(()=>[c(t,{name:"send",left:""}),a[18]||(a[18]=f(" Angebot senden ",-1))]),_:1},8,["loading"])):y("v-if",!0)])]),b("div",S,[b("div",j,[b("div",L,[b("div",z,[a[19]||(a[19]=b("span",{class:"label"},"Kontaktperson",-1)),ve.value.contact_person?(d(),v("div",{key:0,class:"value person-link",onClick:a[3]||(a[3]=e=>{return a=ve.value.contact_person,void(oe.value={type:"info",message:`Navigiere zu Person: ${a}`});var a})},g(ce(ve.value.contact_person)),1)):(d(),v("div",q,"Keine Person verknüpft"))]),b("div",B,[a[20]||(a[20]=b("span",{class:"label"},"E-Mail (Legacy)",-1)),b("div",N,g(ve.value.contact_email||"—"),1)]),b("div",D,[a[21]||(a[21]=b("span",{class:"label"},"Briefing / Fokus",-1)),b("div",M,g(ve.value.briefing||"Kein Briefing hinterlegt."),1)])])]),c(w),ve.value.ai_state?(d(),v("div",I,[a[22]||(a[22]=b("h3",{class:"section-title"},"AI Observations & Estimation",-1)),b("div",T,[c(pe,{label:"Projekt-Modus",value:ve.value.ai_state.projectType||"Unbekannt"},null,8,["value"]),c(pe,{label:"Seitenanzahl",value:(null==(e=ve.value.ai_state.sitemap)?void 0:e.length)||"0"},null,8,["value"])]),ve.value.ai_state.sitemap?(d(),r(we,{key:0,headers:[{text:"Seite",value:"title"},{text:"URL",value:"url"}],items:ve.value.ai_state.sitemap,class:"observation-table"},{"item.title":u(({item:e})=>[b("span",K,g(e.title),1)]),"item.url":u(({item:e})=>[b("span",G,g(e.url),1)]),_:2},1032,["items"])):y("v-if",!0)])):y("v-if",!0)])],64)):(d(),v("div",C,[c(pe,{title:"Lead auswählen",icon:"auto_awesome",center:""},{default:u(()=>[a[13]||(a[13]=f(" Wähle einen Lead in der Navigation aus oder ",-1)),c(re,{"x-small":"",onClick:a[2]||(a[2]=e=>ie.value=!0)},{default:u(()=>[...a[12]||(a[12]=[f("registriere einen neuen Lead",-1)])]),_:1}),a[14]||(a[14]=f(". ",-1))]),_:1})]))]),c(Ce,{modelValue:ie.value,"onUpdate:modelValue":a[10]||(a[10]=e=>ie.value=e),title:"Neuen Lead registrieren",icon:"person_add",onCancel:a[11]||(a[11]=e=>ie.value=!1)},{default:u(()=>[b("div",R,[b("div",W,[b("div",H,[a[23]||(a[23]=b("span",{class:"label"},"Firma",-1)),c(ke,{modelValue:de.value.company_name,"onUpdate:modelValue":a[4]||(a[4]=e=>de.value.company_name=e),placeholder:"z.B. Schmidt GmbH",autofocus:""},null,8,["modelValue"])]),b("div",J,[a[24]||(a[24]=b("span",{class:"label"},"Website URL",-1)),c(ke,{modelValue:de.value.website_url,"onUpdate:modelValue":a[5]||(a[5]=e=>de.value.website_url=e),placeholder:"https://..."},null,8,["modelValue"])]),b("div",Q,[a[25]||(a[25]=b("span",{class:"label"},"Ansprechpartner",-1)),c(ke,{modelValue:de.value.contact_name,"onUpdate:modelValue":a[6]||(a[6]=e=>de.value.contact_name=e),placeholder:"Vorname Nachname"},null,8,["modelValue"])]),b("div",X,[a[26]||(a[26]=b("span",{class:"label"},"E-Mail Adresse",-1)),c(ke,{modelValue:de.value.contact_email,"onUpdate:modelValue":a[7]||(a[7]=e=>de.value.contact_email=e),placeholder:"email@beispiel.de",type:"email"},null,8,["modelValue"])]),b("div",Y,[a[27]||(a[27]=b("span",{class:"label"},"Briefing / Fokus",-1)),c(Ve,{modelValue:de.value.briefing,"onUpdate:modelValue":a[8]||(a[8]=e=>de.value.briefing=e),placeholder:"Besonderheiten für das Audit..."},null,8,["modelValue"])]),b("div",Z,[a[28]||(a[28]=b("span",{class:"label"},"Kontaktperson (Optional)",-1)),c(Ae,{modelValue:de.value.contact_person,"onUpdate:modelValue":a[9]||(a[9]=e=>de.value.contact_person=e),items:ue.value,placeholder:"Person auswählen..."},null,8,["modelValue","items"])])]),b("div",ee,[c(re,{primary:"",block:"",loading:se.value,onClick:he},{default:u(()=>[...a[29]||(a[29]=[f("Lead speichern",-1)])]),_:1},8,["loading"])])])]),_:1},8,["modelValue"])]}),_:1})}}}),te=[],le=[];!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=te.indexOf(i);-1===s&&(s=te.push(i)-1,le[s]={}),t=le[s]&&le[s][l]?le[s][l]:le[s][l]=o()}else t=o();65279===e.charCodeAt(0)&&(e=e.substring(1)),t.styleSheet?t.styleSheet.cssText+=e:t.appendChild(document.createTextNode(e))}function o(){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-6a55edd7] { padding: 32px; height: 100%; display: flex; flex-direction: column; overflow-y: auto;\n}\n.lead-item[data-v-6a55edd7] { cursor: pointer;\n}\n.header[data-v-6a55edd7] { margin-bottom: 24px; display: flex; justify-content: space-between; align-items: flex-end;\n}\n.header-right[data-v-6a55edd7] { display: flex; gap: 12px;\n}\n.title[data-v-6a55edd7] { font-size: 24px; font-weight: 800; margin-bottom: 4px; color: var(--theme--foreground);\n}\n.subtitle[data-v-6a55edd7] { color: var(--theme--foreground-subdued); font-size: 14px; display: flex; align-items: center; gap: 8px;\n}\n.url-link[data-v-6a55edd7] { color: inherit; text-decoration: none; border-bottom: 1px solid transparent;\n}\n.url-link[data-v-6a55edd7]:hover { border-bottom-color: currentColor;\n}\n.empty-state[data-v-6a55edd7] { height: 100%; display: flex; align-items: center; justify-content: center;\n}\n.sections[data-v-6a55edd7] { display: flex; flex-direction: column; gap: 32px;\n}\n.form-grid[data-v-6a55edd7] { display: grid; grid-template-columns: 1fr 1fr; gap: 24px;\n}\n.field[data-v-6a55edd7] { display: flex; flex-direction: column; gap: 8px;\n}\n.field.full[data-v-6a55edd7] { grid-column: span 2;\n}\n.label[data-v-6a55edd7] { font-size: 11px; font-weight: 700; text-transform: uppercase; color: var(--theme--foreground-subdued); letter-spacing: 0.5px;\n}\n.value[data-v-6a55edd7] { font-size: 15px; color: var(--theme--foreground);\n}\n.text-block[data-v-6a55edd7] { line-height: 1.6; white-space: pre-wrap; background: var(--theme--background-subdued); padding: 16px; border-radius: 8px;\n}\n.ai-observations[data-v-6a55edd7] { display: flex; flex-direction: column; gap: 16px;\n}\n.section-title[data-v-6a55edd7] { font-size: 16px; font-weight: 700; color: var(--theme--foreground); margin-bottom: 8px;\n}\n.metrics[data-v-6a55edd7] { display: flex; gap: 32px; margin-bottom: 16px;\n}\n.observation-table[data-v-6a55edd7] { border: 1px solid var(--theme--border); border-radius: 8px; overflow: hidden;\n}\n.page-title[data-v-6a55edd7] { font-weight: 600;\n}\n.page-url[data-v-6a55edd7] { font-family: var(--family-monospace); font-size: 12px; color: var(--theme--foreground-subdued);\n}\n.drawer-content[data-v-6a55edd7] { padding: 24px; display: flex; flex-direction: column; gap: 32px;\n}\n.form-section[data-v-6a55edd7] { display: flex; flex-direction: column; gap: 20px;\n}\n.drawer-actions[data-v-6a55edd7] { margin-top: 24px; display: flex; flex-direction: column; gap: 12px;\n}\n[data-v-6a55edd7] .v-list-item { cursor: pointer !important;\n}\n",{});var ne=((e,a)=>{const t=e.__vccOpts||e;for(const[e,l]of a)t[e]=l;return t})(ae,[["__scopeId","data-v-6a55edd7"],["__file","module.vue"]]),ie=a({id:"acquisition-manager",name:"Acquisition",icon:"auto_awesome",routes:[{path:"",component:ne},{path:":id",component:ne,props:!0}]});export{ie as default};