PageSourceSearch

https://dgf.de/assets/AdminShowroomTemplates-BKVVablM.js

js dgf.de collected 2026-10-01 03:58:45 UTC 15,031 bytes, 6 lines download raw bytes

1import{j as e}from"./ui-B-jAfBIu.js";import{r as c,e as R}from"./vendor-DFDkvaNg.js";import{c as X,a6 as m,B as h,W as I,F as Z,X as J,L as Y,S as M,i as O,j as V,k as H,m as F,s as p,I as ee,D as se,C as re,ac as te,ad as ae,ae as ne,an as ie}from"./index-BCsAUAr3.js";import{C as K,a as le,b as ce,d as oe,c as de}from"./card-FDTNR4GW.js";import{B as G}from"./badge-Dm4sUQsj.js";import{C as me}from"./checkbox-BFphnnuY.js";import{P as he}from"./progress-DaSDJPFo.js";import{U as Q}from"./upload-CLVy7zpO.js";import{C as xe}from"./circle-check-D03ZvCsy.js";import{C as ue}from"./circle-alert-D0uUIXsZ.js";import{A as pe}from"./arrow-left-AER8uK4l.js";import{S as ge}from"./search-EEELfpZ7.js";import{D as fe}from"./download-DOJM3_zC.js";import{T as je}from"./trash-2-LJxfaF-d.js";import"./supabase-DM3UDwCf.js";import"./query-BNFXhbss.js";/**
2 * @license lucide-react v0.546.0 - ISC
3 *
4 * This source code is licensed under the ISC license.
5 * See the LICENSE file in the root directory of this source tree.
6 */const ve=[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",key:"1cjeqo"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",key:"19qd67"}]],we=X("link",ve);function Ne({categories:x,onUploadComplete:_}){const[C,D]=c.useState(!1),[g,o]=c.useState([]),[S,v]=c.useState(!1),E=c.useCallback(s=>{s.preventDefault(),D(!0)},[]),w=c.useCallback(s=>{s.preventDefault(),D(!1)},[]),$=c.useCallback(s=>{s.preventDefault(),D(!1);const t=Array.from(s.dataTransfer.files).filter(a=>["application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.presentationml.presentation"].includes(a.type));if(t.length===0){m.error("Nur PDF, Word, Excel und PowerPoint Dateien sind erlaubt");return}const l=t.map(a=>({id:crypto.randomUUID(),file:a,category:x[0]||"Sonstiges",progress:0,status:"pending"}));o(a=>[...a,...l])},[x]),k=c.useCallback(s=>{const l=Array.from(s.target.files||[]).map(a=>({id:crypto.randomUUID(),file:a,category:x[0]||"Sonstiges",progress:0,status:"pending"}));o(a=>[...a,...l]),s.target.value=""},[x]),T=c.useCallback(s=>{o(t=>t.filter(l=>l.id!==s))},[]),P=c.useCallback((s,t)=>{o(l=>l.map(a=>a.id===s?{...a,category:t}:a))},[]),y=async s=>{try{o(u=>u.map(i=>i.id===s.id?{...i,status:"uploading",progress:0}:i));const t=s.file.name.split(".").pop(),a=`templates/${`${crypto.randomUUID()}.${t}`}`,z=setInterval(()=>{o(u=>u.map(i=>i.id===s.id&&i.progress<90?{...i,progress:i.progress+10}:i))},200),{error:A}=await p.storage.from("showroom-documents").upload(a,s.file);if(clearInterval(z),A)throw A;o(u=>u.map(i=>i.id===s.id?{...i,progress:90}:i));const{data:B}=p.storage.from("showroom-documents").getPublicUrl(a),{error:L}=await p.from("showroom_document_templates").insert({file_name:s.file.name,file_type:s.file.type,file_url:B.publicUrl,category:s.category,file_size:s.file.size});if(L)throw L;o(u=>u.map(i=>i.id===s.id?{...i,status:"success",progress:100}:i))}catch(t){console.error("Upload error:",t),o(l=>l.map(a=>a.id===s.id?{...a,status:"error",error:t.message||"Upload fehlgeschlagen"}:a))}},j=async()=>{const s=g.filter(t=>t.status==="pending"||t.status==="error");
6if(s.length===0){m.info("Keine Dateien zum Hochladen");return}v(!0);try{for(const l of s)await y(l);const t=g.filter(l=>l.status==="success").length;m.success(`${t} Dokument(e) erfolgreich hochgeladen`),_&&_(),setTimeout(()=>{o(l=>l.filter(a=>a.status!=="success"))},2e3)}catch{m.error("Fehler beim Upload")}finally{v(!1)}},U=()=>{o([])},d=g.filter(s=>s.status==="pending").length,N=g.filter(s=>s.status==="success").length,b=g.filter(s=>s.status==="error").length;return e.jsxs("div",{className:"space-y-4",children:[e.jsx(K,{className:`border-2 border-dashed transition-all ${C?"border-primary bg-primary/5 scale-[1.02]":"border-border hover:border-primary/50"}`,onDragOver:E,onDragLeave:w,onDrop:$,children:e.jsxs("div",{className:"p-12 text-center",children:[e.jsx("div",{className:`inline-flex items-center justify-center w-16 h-16 rounded-full mb-4 transition-colors ${C?"bg-primary text-primary-foreground":"bg-muted"}`,children:e.jsx(Q,{className:"h-8 w-8"})}),e.jsx("h3",{className:"text-lg font-semibold mb-2",children:C?"Dateien jetzt loslassen":"Dokumente hochladen"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:"Ziehen Sie Dateien hierher oder klicken Sie zum Auswählen"}),e.jsx("input",{type:"file",id:"file-upload",className:"hidden",multiple:!0,accept:".pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx",onChange:k}),e.jsx("label",{htmlFor:"file-upload",children:e.jsx(h,{variant:"outline",asChild:!0,children:e.jsx("span",{children:"Dateien auswählen"})})}),e.jsx("p",{className:"text-xs text-muted-foreground mt-3",children:"PDF, Word, Excel, PowerPoint • Max. 20MB pro Datei"})]})}),g.length>0&&e.jsxs(K,{children:[e.jsx("div",{className:"p-4 border-b",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold",children:"Upload-Warteschlange"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:[d>0&&`${d} ausstehend`,d>0&&N>0&&" • ",N>0&&`${N} erfolgreich`,b>0&&` • ${b} fehlgeschlagen`]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(h,{variant:"outline",size:"sm",onClick:U,disabled:S,children:"Alle entfernen"}),e.jsx(h,{size:"sm",onClick:j,disabled:S||d===0,children:S?e.jsxs(e.Fragment,{children:[e.jsx(I,{className:"h-4 w-4 mr-2 animate-spin"}),"Lädt hoch..."]}):`${d} Hochladen`})]})]})}),e.jsx("div",{className:"p-4 space-y-3 max-h-96 overflow-y-auto",children:g.map(s=>e.jsx("div",{className:"border rounded-lg p-4 space-y-3",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:`h-10 w-10 rounded flex items-center justify-center flex-shrink-0 ${s.status==="success"?"bg-green-500/10":s.status==="error"?"bg-destructive/10":s.status==="uploading"?"bg-primary/10":"bg-muted"}`,children:s.status==="success"?e.jsx(xe,{className:"h-5 w-5 text-green-600"}):s.status==="error"?e.jsx(ue,{className:"h-5 w-5 text-destructive"}):s.status==="uploading"?e.jsx(I,{className:"h-5 w-5 text-primary animate-spin"}):e.jsx(Z,{className:"h-5 w-5"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 mb-1",children:[e.jsx("p",{className:"font-medium text-sm truncate",children:s.file.name}),s.status==="pending"&&e.jsx(h,{variant:"ghost",size:"sm",className:"h-6 w-6 p-0",onClick:()=>T(s.id),children:e.jsx(J,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground mb-2",children:[e.jsxs("span",{children:[(s.file.size/1024/1024).toFixed(2)," MB"]}),e.jsx("span",{children:"•"}),e.jsx(G,{variant:"outline",className:"text-xs",children:s.category})]}),s.status==="pending"&&e.jsxs("div",{className:"space-y-1",children:[e.jsx(Y,{className:"text-xs",children:"Kategorie"}),e.jsxs(M,{value:s.category,onValueChange:t=>P(s.id,t),children:[e.jsx(O,{className:"h-8 text-xs",children:e.jsx(V,{})}),e.jsx(H,{children:x.map(t=>e.jsx(F,{value:t,children:t},t))})]})]}),s.status==="uploading"&&e.jsxs("div",{className:"space-y-1",children:[e.jsx(he,{value:s.progress,className:"h-1"}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[s.progress,"% hochgeladen"]})]}),s.status==="success"&&e.jsx("p",{className:"text-xs text-green-600",children:"Erfolgreich hochgeladen"}),s.status==="error"&&e.jsx("p",{className:"text-xs text-destructive",children:s.error||"Upload fehlgeschlagen"})]})]})},s.id))})]})]})}const q=["Planung","Bau","Finanzierung","Energie","ESG","Förderung","Sonstiges"];function Ie(){const x=R(),[_,C]=c.useState(!0),[D,g]=c.useState([]),[o,S]=c.useState([]),[v,E]=c.useState(""),[w,$]=c.useState("all"),[k,T]=c.useState(!1),[P,y]=c.useState(!1),[j,U]=c.useState(null),[d,N]=c.useState([]),[b,s]=c.useState(!1);c.useEffect(()=>{t()},[]);const t=async()=>{try{const{data:{session:r}}=await p.auth.getSession();if(!r){x("/auth");return}const{data:n}=await p.from("user_roles").select("role").eq("user_id",r.user.id);if(!(n==null?void 0:n.some(W=>W.role==="admin"))){m.error("Nur Admins haben Zugriff auf Template-Verwaltung"),x("/admin/showroom");return}await Promise.all([l(),a()])}catch(r){console.error("Access check error:",r),m.error("Zugriffsfehler"),x("/admin/showroom")}},l=async()=>{try{const{data:r,error:n}=await p.from("showroom_document_templates").select("*").order("created_at",{ascending:!1});if(n)throw n;g(r||[])}catch(r){console.error("Error loading templates:",r),m.error("Fehler beim Laden der Templates")}
6finally{C(!1)}},a=async()=>{try{const{data:r,error:n}=await p.from("showroom_companies").select("id, name, status").eq("status","active").order("name");if(n)throw n;S(r||[])}catch(r){console.error("Error loading companies:",r)}},z=()=>{l(),T(!1)},A=async()=>{if(!j||d.length===0){m.error("Bitte wählen Sie mindestens eine Firma");return}s(!0);try{const r=d.map(f=>({company_id:f,template_id:j.id,is_visible:!0,custom_name:j.file_name})),{error:n}=await p.from("showroom_company_documents").insert(r);if(n)throw n;m.success(`Template ${d.length} Firmen zugewiesen`),y(!1),U(null),N([])}catch(r){console.error("Assign error:",r),m.error("Fehler beim Zuweisen")}finally{s(!1)}},B=async r=>{if(confirm(`Template "${r.file_name}" wirklich löschen?`))try{const{data:n}=await p.from("showroom_company_documents").select("id").eq("template_id",r.id);if(n&&n.length>0&&!confirm(`Dieses Template ist ${n.length} Firmen zugewiesen. Wirklich löschen?`))return;const{error:f}=await p.from("showroom_document_templates").delete().eq("id",r.id);if(f)throw f;m.success("Template gelöscht"),l()}catch(n){console.error("Delete error:",n),m.error("Fehler beim Löschen")}},L=r=>{U(r),N([]),y(!0)},u=r=>{N(n=>n.includes(r)?n.filter(f=>f!==r):[...n,r])},i=D.filter(r=>{const n=r.file_name.toLowerCase().includes(v.toLowerCase()),f=w==="all"||r.category===w;return n&&f});return _?e.jsx("div",{className:"min-h-screen flex items-center justify-center",children:e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"animate-spin rounded-full h-12 w-12 border-b-2 border-primary mx-auto mb-4"}),e.jsx("p",{className:"text-muted-foreground",children:"Lade Templates..."})]})}):e.jsxs("div",{className:"min-h-screen bg-background",children:[e.jsx("div",{className:"border-b bg-card",children:e.jsx("div",{className:"container mx-auto px-4 py-6",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx(h,{variant:"ghost",size:"icon",onClick:()=>x("/admin/showroom"),children:e.jsx(pe,{className:"h-5 w-5"})}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-bold",children:"Template-Verwaltung"}),e.jsx("p",{className:"text-muted-foreground",children:"Zentrale Dokument-Templates für alle Firmen"})]})]}),e.jsxs(h,{onClick:()=>T(!k),children:[e.jsx(Q,{className:"h-4 w-4 mr-2"}),k?"Upload-Zone schließen":"Templates hochladen"]})]})})}),e.jsxs("div",{className:"container mx-auto px-4 py-8",children:[k&&e.jsx("div",{className:"mb-8",children:e.jsx(Ne,{categories:q,onUploadComplete:z})}),e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(ge,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(ee,{placeholder:"Templates suchen...",value:v,onChange:r=>E(r.target.value),className:"pl-10"})]}),e.jsxs(M,{value:w,onValueChange:$,children:[e.jsx(O,{className:"w-48",children:e.jsx(V,{placeholder:"Kategorie"})}
6),e.jsxs(H,{children:[e.jsx(F,{value:"all",children:"Alle Kategorien"}),q.map(r=>e.jsx(F,{value:r,children:r},r))]})]})]}),e.jsxs(K,{children:[e.jsxs(le,{children:[e.jsxs(ce,{children:["Templates (",i.length,")"]}),e.jsx(oe,{children:'Klicken Sie auf "Zuweisen" um ein Template mehreren Firmen zuzuweisen'})]}),e.jsx(de,{children:i.length===0?e.jsxs("div",{className:"text-center py-12 text-muted-foreground",children:[e.jsx(Z,{className:"h-16 w-16 mx-auto mb-4 opacity-50"}),e.jsx("p",{className:"text-lg font-medium mb-2",children:v||w!=="all"?"Keine Templates gefunden":"Noch keine Templates"}),e.jsx("p",{className:"text-sm mb-4",children:v||w!=="all"?"Versuchen Sie einen anderen Filter":"Laden Sie das erste Template hoch"})]}):e.jsx("div",{className:"space-y-3",children:i.map(r=>e.jsxs("div",{className:"flex items-center justify-between p-4 border rounded-lg hover:bg-accent transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-3 flex-1",children:[e.jsx("div",{className:"h-10 w-10 rounded bg-primary/10 flex items-center justify-center",children:e.jsx(Z,{className:"h-5 w-5 text-primary"})}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"font-medium",children:r.file_name}),e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:[e.jsx(G,{variant:"outline",className:"text-xs",children:r.category}),e.jsx("span",{children:"•"}),e.jsxs("span",{children:[(r.file_size/1024/1024).toFixed(2)," MB"]}),e.jsx("span",{children:"•"}),e.jsx("span",{children:new Date(r.created_at).toLocaleDateString("de-DE")})]})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(h,{variant:"outline",size:"sm",onClick:()=>L(r),children:[e.jsx(we,{className:"h-4 w-4 mr-2"}),"Zuweisen"]}),e.jsx(h,{variant:"ghost",size:"sm",onClick:()=>window.open(r.file_url,"_blank"),children:e.jsx(fe,{className:"h-4 w-4"})}),e.jsx(h,{variant:"ghost",size:"sm",onClick:()=>B(r),children:e.jsx(je,{className:"h-4 w-4 text-destructive"})})]})]},r.id))})})]})]}),e.jsx(se,{open:P,onOpenChange:y,children:e.jsxs(re,{className:"max-w-2xl",children:[e.jsxs(te,{children:[e.jsx(ae,{children:"Template zuweisen"}),e.jsxs(ne,{children:['Wählen Sie die Firmen aus, denen Sie "',j==null?void 0:j.file_name,'" zuweisen möchten']})]}),e.jsx("div",{className:"py-4",children:o.length===0?e.jsx("p",{className:"text-center text-muted-foreground py-8",children:"Keine aktiven Firmen vorhanden"}):e.jsx("div",{className:"space-y-2 max-h-96 overflow-y-auto",children:o.map(r=>e.jsxs("div",{className:"flex items-center space-x-3 p-3 border rounded-lg hover:bg-accent cursor-pointer",onClick:()=>u(r.id),children:[e.jsx(me,{checked:d.includes(r.id),onCheckedChange:()=>u(r.id)}),e.jsx("div",{className:"flex-1",children:e.jsx("p",{className:"font-medium",children:r.name})})]},r.id))})}),e.jsxs(ie,{children:[e.jsx(h,{variant:"outline",onClick:()=>y(!1),disabled:b,children:"Abbrechen"}),e.jsx(h,{onClick:A,disabled:b||d.length===0,children:b?e.jsxs(e.Fragment,{children:[e.jsx(I,{className:"h-4 w-4 mr-2 animate-spin"}),"Weise zu..."]}):`${d.length} ${d.length===1?"Firma":"Firmen"} zuweisen`})]})]})})]})}export{Ie 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.