PageSourceSearch

https://webhostlist.de/assets/OfferManagement-D6LewB9a.js

js webhostlist.de collected 2026-10-02 17:54:17 UTC 12,747 bytes, 13 lines download raw bytes

1import{W as Y,d as ee,u as se,r as o,s as x,j as e,P as A,h as g,i as f,F as ie,q as n,L as te,B as j,H as ae,V as z,a3 as re,z as E,t as _,v as k,w as ne,K as v,I as S,a5 as le,Q as M}from"./index-Cew4R4zJ.js";import{T as ce}from"./textarea-DPesHxu1.js";import{D as de,a as oe,b as me,c as he,d as ue,e as xe}from"./dialog-CWzllWZF.js";import{C as ge}from"./calendar-Dq0_tax7.js";import{E as O}from"./euro-B8VoH7YC.js";import{M as fe}from"./map-pin-DOVXuruF.js";import{M as C}from"./message-square-CRF7R3Jt.js";import{P as pe}from"./plus-DXz3uaPP.js";const ke=()=>{const{listingId:h}=Y(),{user:l}=ee(),{toast:c}=se(),[t,B]=o.useState(null),[d,F]=o.useState([]),[b,R]=o.useState(null),[T,I]=o.useState(!0),[N,D]=o.useState(!1),[q,w]=o.useState(!1),[r,m]=o.useState({message:"",price:"",delivery_time:"",reference_links:[""]});o.useEffect(()=>{h&&(U(),y(),$())},[h,l]);const U=async()=>{try{const{data:s,error:i}=await x.from("listings").select(`
2          *,
3          profiles (
4            name,
5            company
6          )
7        `).eq("id",h).single();if(i)throw i;B(s)}catch{c({title:"Ausschreibung nicht gefunden",description:"Die gewünschte Ausschreibung konnte nicht geladen werden.",variant:"destructive"})}},y=async()=>{try{const{data:s,error:i}=await x.from("offers").select(`
8          *,
9          providers (
10            company_name,
11            location
12          )
13        `).eq("listing_id",h).order("created_at",{ascending:!1});if(i)throw i;F(s||[])}catch{c({title:"Fehler beim Laden der Angebote",description:"Bitte versuchen Sie es später erneut.",variant:"destructive"})}finally{I(!1)}},$=async()=>{if(l)try{const{data:s,error:i}=await x.from("providers").select("*").eq("user_id",l.id).single();if(i&&i.code!=="PGRST116")throw i;R(s)}catch{}},H=async()=>{if(!l||!b){c({title:"Provider-Profil erforderlich",description:"Sie müssen ein Provider-Profil haben, um Angebote abzugeben.",variant:"destructive"});return}if(!r.message.trim()){c({title:"Nachricht erforderlich",description:"Bitte beschreiben Sie Ihr Angebot.",variant:"destructive"});return}D(!0);try{const{error:s}=await x.from("offers").insert({listing_id:h,provider_id:b.id,user_id:l.id,message:r.message.trim(),price:r.price?parseFloat(r.price):null,currency:"EUR",delivery_time:r.delivery_time?parseInt(r.delivery_time):null,reference_links:r.reference_links.filter(i=>i.trim()),status:"pending"});if(s)throw s;await x.from("listings").update({offers_count:d.length+1}).eq("id",h),c({title:"Angebot eingereicht",description:"Ihr Angebot wurde erfolgreich eingereicht!"}),m({message:"",price:"",delivery_time:"",reference_links:[""]}),w(!1),y()}catch(s){c({title:"Fehler beim Einreichen",description:s.message||"Das Angebot konnte nicht eingereicht werden.",variant:"destructive"})}finally{D(!1)}},L=async(s,i)=>{try{const{error:a}=await x.from("offers").update({status:i}).eq("id",s);if(a)throw a;c({title:"Status aktualisiert",description:`Angebot wurde ${i==="accepted"?"angenommen":"abgelehnt"}.`}),y()}catch(a){c({title:"Fehler beim Aktualisieren",description:a.message||"Status konnte nicht aktualisiert werden.",variant:"destructive"})}},W=()=>{m(s=>({...s,reference_links:[...s.reference_links,""]}))},K=(s,i)=>{m(a=>({...a,reference_links:a.reference_links.map((u,p)=>p===s?i:u)}))},V=s=>{m(i=>({...i,reference_links:i.reference_links.filter((a,u)=>u!==s)}))},Z=s=>({hosting:"Shared Hosting",managed:"Managed Services",cloud:"Cloud & VPS",saas:"SaaS",ai:"KI & ML",domain:"Domain & SSL",security:"Sicherheit"})[s]||s,G=s=>({pending:{label:"Ausstehend",variant:"secondary"},accepted:{label:"Angenommen",variant:"default"},rejected:{label:"Abgelehnt",variant:"destructive"},withdrawn:{label:"Zurückgezogen",variant:"outline"}})[s]||{label:s,variant:"secondary"},P=t&&l&&t.user_id===l.id,Q=b&&t&&t.status==="active"&&!d.some(s=>s.user_id===(l==null?void 0:l.id));if(T)return e.jsx(A,{children:e.jsx("div",{className:"max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 py-8",children:e.jsxs("div",{className:"animate-pulse space-y-6",children:[e.jsx("div",{className:"h-48 bg-muted rounded-lg"}),e.jsx("div",{className:"h-96 bg-muted rounded-lg"})]})})});if(!t)return e.jsx(A,{children:e.jsx("div",{className:"max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 py-8",children:e.jsx(g,{children:e.jsxs(f,{className:"p-12 text-center",children:[e.jsx(ie,{className:"h-12 w-12 text-muted-foreground mx-auto mb-4"}),e.jsx("h1",{className:"text-2xl font-bold text-foreground mb-2",children:"Ausschreibung nicht gefunden"}),e.jsx("p",{className:"text-muted-foreground mb-6",children:"Die gewünschte Ausschreibung konnte nicht gefunden werden oder ist nicht verfügbar."}),e.jsx(n,{asChild:!0,children:e.jsx(te,{to:"/listings",children:"Zurück zu den Ausschreibungen"})})]})})})});const J=(s,i,a="EUR")=>!s&&!i?"Budget auf Anfrage":s?i?`${s}€ - ${i}€/Monat`:`ab ${s}€/Monat`:`bis ${i}€/Monat`;return e.jsx(A,{children:e.jsxs("div",{className:"max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 py-8",children:[e.jsx(g,{className:"mb-8",children:e.jsxs(f,{className:"p-6",children:[e.jsx("div",{className:"flex items-start justify-between mb-4",children:e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx("h1",{className:"text-2xl font-bold text-foreground",children:t.title}),e.jsx(j,{variant:"outline",children:Z(t.category)}),e.jsx(j,{variant:t.status==="active"?"default":"secondary",children:t.status==="active"?"Aktiv":t.status})]}),e.jsxs("div",{className:"flex items-center gap-4 text-muted-foreground mb-3",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(ae,{className:"h-4 w-4"}),t.profiles.name,t.profiles.company&&` • ${t.profiles.company}`]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(ge,{className:"h-4 w-4"}),z(new Date(t.created_at),{addSuffix:!0,locale:M})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(re,{className:"h-4 w-4"}),t.views_count," Aufrufe"]})]})]})}),e.jsx("p",{className:"text-muted-foreground mb-4",children:t.description}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-4 text-sm",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(O,{className:"h-4 w-4"}),J(t.budget_min,t.budget_max,t.currency)]}),t.location&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(fe,{className:"h-4 w-4"}),t.location]}),t.deadline&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(E,{className:"h-4 w-4"}),"Frist: ",new Date(t.deadline).toLocaleDateString("de-DE")]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(C,{className:"h-4 w-4"}),d.length," Angebote"]})]})]})}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-8",children:[e.jsx("div",{className:"lg:col-span-2",children:e.jsxs(g,{children:[e.jsx(_,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(k,{children:"Eingegangene Angebote"}),e.jsxs(ne,{children:[d.length," ",d.length===1?"Angebot":"Angebote"," für diese Ausschreibung"]})]}),Q&&e.jsxs(de,{open:q,onOpenChange:w,children:[e.jsx(oe,{asChild:!0,children:e.jsxs(n,{children:[e.jsx(pe,{className:"h-4 w-4 mr-2"}),"Angebot abgeben"]})}),e.jsxs(me,{className:"sm:max-w-[625px]",children:[e.jsxs(he,{children:[e.jsxs(ue,{children:['Angebot für "',t.title,'"']}),e.jsx(xe,{children:"Erstellen Sie ein detailliertes Angebot für diese Ausschreibung."})]}),e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(v,{htmlFor:"message",children:"Angebotsbeschreibung *"}),e.jsx(ce,{id:"message",placeholder:"Beschreiben Sie Ihr Angebot, Ihre Leistungen und warum Sie der richtige Partner sind...",value:r.message,onChange:s=>m(i=>({...i,message:s.target.value})),rows:6,required:!0})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(v,{htmlFor:"price",children:"Preis (€/Monat)"}),e.jsx(S,{id:"price",type:"number",placeholder:"299",value:r.price,onChange:s=>m(i=>({...i,price:s.target.value}))})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(v,{htmlFor:"delivery_time",children:"Umsetzungszeit (Tage)"}),e.jsx(S,{id:"delivery_time",type:"number",placeholder:"14",value:r.delivery_time,onChange:s=>m(i=>({...i,delivery_time:s.target.value}))})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(v,{children:"Referenzen & Links"}),r.reference_links.map((s,i)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx(S,{placeholder:"https://beispiel.de",value:s,onChange:a=>K(i,a.target.value)}),r.reference_links.length>1&&e.jsx(n,{type:"button",variant:"outline",size:"sm",onClick:()=>V(i),children:"Entfernen"})]},i)),e.jsx(n,{type:"button",variant:"outline",size:"sm",onClick:W,children:"+ Weitere Referenz hinzufügen"})]}),e.jsxs("div",{className:"flex justify-end gap-3",children:[e.jsx(n,{variant:"outline",onClick:()=>w(!1),disabled:N,children:"Abbrechen"}),e.jsxs(n,{onClick:H,disabled:N,children:[e.jsx(le,{className:"h-4 w-4 mr-2"}),N?"Wird eingereicht...":"Angebot einreichen"]})]})]})]})]})]})}),e.jsx(f,{children:d.length===0?e.jsxs("div",{className:"text-center py-8",children:[e.jsx(C,{className:"h-12 w-12 text-muted-foreground mx-auto mb-4"}),e.jsx("p",{className:"text-muted-foreground",children:"Noch keine Angebote eingegangen."})]}):e.jsx("div",{className:"space-y-6",children:d.map(s=>{var a,u;const i=G(s.status);return e.jsxs("div",{className:"border rounded-lg p-6",children:[e.jsxs("div",{className:"flex items-start justify-between mb-4",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx("h4",{className:"font-semibold text-foreground",children:((a=s.providers)==null?void 0:a.company_name)||"Anbieter"}),e.jsx(j,{variant:i.variant,children:i.label})]}),e.jsxs("div",{className:"flex items-center gap-4 text-sm text-muted-foreground",children:[((u=s.providers)==null?void 0:u.location)&&e.jsx("span",{children:s.providers.location}),e.jsx("span",{children:z(new Date(s.created_at),{addSuffix:!0,locale:M})})]})]}),P&&s.status==="pending"&&e.jsxs("div",{className:"flex gap-2",children:[e.jsx(n,{size:"sm",onClick:()=>
13L(s.id,"accepted"),children:"Annehmen"}),e.jsx(n,{size:"sm",variant:"outline",onClick:()=>L(s.id,"rejected"),children:"Ablehnen"})]})]}),e.jsx("p",{className:"text-muted-foreground mb-4 whitespace-pre-wrap",children:s.message}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4 text-sm",children:[s.price&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(O,{className:"h-4 w-4"}),s.price,"€/Monat"]}),s.delivery_time&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(E,{className:"h-4 w-4"}),s.delivery_time," Tage Umsetzung"]})]}),s.reference_links.length>0&&e.jsxs("div",{className:"mt-4",children:[e.jsx("h5",{className:"text-sm font-medium mb-2",children:"Referenzen:"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:s.reference_links.map((p,X)=>e.jsx("a",{href:p,target:"_blank",rel:"noopener noreferrer",className:"text-sm text-primary hover:underline",children:p},X))})]})]},s.id)})})})]})}),e.jsxs("div",{className:"space-y-6",children:[e.jsxs(g,{children:[e.jsx(_,{children:e.jsx(k,{children:"Ausschreibungsstatus"})}),e.jsx(f,{children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:"Status:"}),e.jsx(j,{variant:t.status==="active"?"default":"secondary",children:t.status==="active"?"Aktiv":t.status})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:"Angebote:"}),e.jsx("span",{className:"font-medium",children:d.length})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:"Aufrufe:"}),e.jsx("span",{className:"font-medium",children:t.views_count})]}),t.deadline&&e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:"Frist:"}),e.jsx("span",{className:"font-medium",children:new Date(t.deadline).toLocaleDateString("de-DE")})]})]})})]}),P&&e.jsxs(g,{children:[e.jsx(_,{children:e.jsx(k,{children:"Aktionen"})}),e.jsx(f,{children:e.jsxs("div",{className:"space-y-3",children:[e.jsx(n,{className:"w-full",variant:"outline",children:"Ausschreibung bearbeiten"}),e.jsx(n,{className:"w-full",variant:"outline",children:"Ausschreibung schließen"}),e.jsxs(n,{className:"w-full",variant:"outline",children:[e.jsx(C,{className:"h-4 w-4 mr-2"}),"Alle kontaktieren"]})]})})]})]})]})]})})};export{ke 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.