1import{n as e}from"./rolldown-runtime-DF2fYuay.js";import{D as t,Ft as n,P as r,R as i,fn as a,i as o,o as ee,p as s,sn as te,yn as c}from"./lucide-FiUllUuf.js";import{d as ne,u as re}from"./react-vendor-DkRFjetv.js";import{U as l}from"./radix-DA0TVB9t.js";import{i as ie,n as u,t as d}from"./tanstack-CXE1wJKK.js";import{t as f}from"./client-CgQ6iHoJ.js";import{t as ae}from"./useSession-BdcD8JJU.js";import{t as p}from"./spinner-DBN64AJ6.js";import{t as m}from"./button-DWibT-Lh.js";import{t as h}from"./label-Cmbd6Sco.js";import{i as g,n as _}from"./errors-BVF_zu8c.js";import{t as v}from"./select-2FJm2fXs.js";import{t as y}from"./input-DMUCdaa7.js";import{a as b,n as x,o as S,r as C,t as w}from"./card-BS9mZtL8.js";import{t as T}from"./badge-DpGSl0Ur.js";import{t as E}from"./confirm-BHXvXeJy.js";import{t as oe}from"./page-header-DzvZ5Pog.js";import{n as se,t as ce}from"./RemoveMemberDialog-macVEIBv.js";var D=e(c(),1),O=l(),le=[{key:`classes`,label:`Klassen`},{key:`learning_goals`,label:`Lernziele`},{key:`observation_templates`,label:`Beobachtungsvorlagen`},{key:`lesson_plans`,label:`Stundenpläne`},{key:`generated_materials`,label:`Materialien`},{key:`documents`,label:`Dokumente`}];function ue(){let{orgId:e}=ne(),c=re(),l=ie(),{session:ue}=ae(),M=u({queryKey:[`admin`,`org`,e],enabled:!!e,queryFn:async()=>{let{data:t,error:n}=await f.from(`lp_organizations`).select(`*`).eq(`id`,e).maybeSingle();if(n)throw n;return t??null}}),N=u({queryKey:[`admin`,`org_stats`,e],enabled:!!e,queryFn:async()=>{let{data:t}=await f.rpc(`lp_org_stats`,{p_org:e});return t}}),P=u({queryKey:[`admin`,`org_sub`,e],enabled:!!e,queryFn:async()=>{let{data:t}=await f.from(`lp_subscriptions`).select(`id, status, billing_interval, plan:lp_plans(name), seats_licensed, seats_used, trial_ends_at, current_period_end, monthly_amount_cents, payment_method`).eq(`organization_id`,e).order(`created_at`,{ascending:!1}).limit(1).maybeSingle();return t}}),F=u({queryKey:[`admin`,`org_members`,e],enabled:!!e,queryFn:async()=>{let{data:t,error:n}=await f.from(`lp_organization_memberships`).select(`organization_id, teacher_id, role, created_at`).eq(`organization_id`,e).order(`created_at`);if(n)throw n;let r=t??[];if(r.length===0)return[];let i=Array.from(new Set(r.map(e=>e.teacher_id))),{data:a}=await f.from(`lp_teacher_profiles`).select(`id, email, display_name`).in(`id`,i),o=new Map((a??[]).map(e=>[e.id,e]));return r.map(e=>({organization_id:e.organization_id,teacher_id:e.teacher_id,role:e.role,email:o.get(e.teacher_id)?.email??``,display_name:o.get(e.teacher_id)?.display_name??null}))}}),I=u({queryKey:[`admin`,`org_sharing`,e],enabled:!!e,queryFn:async()=>{let{data:t}=await f.from(`lp_org_sharing_policy`).select(`*`).eq(`organization_id`,e).maybeSingle();return t}}),L=d({mutationFn:async t=>{let{error:n}=await f.from(`lp_organizations`).update({...t,updated_at:new Date().toISOString()}).eq(`id`,e);if(n)throw n},onSuccess:()=>
1{g(`Stammdaten gespeichert`),l.invalidateQueries({queryKey:[`admin`,`org`,e]}),l.invalidateQueries({queryKey:[`admin`,`organizations`]})},onError:e=>_(e,`Stammdaten speichern`)}),R=d({mutationFn:async t=>{let{data:n,error:r}=await f.rpc(`lp_invite_org_member`,{p_org:e,p_email:t.email,p_role:t.role}).single();if(r)throw r;let i=n?.invitation_id;i&&await f.functions.invoke(`lp-notify-org-invite`,{body:{invitation_id:i}}).catch(()=>{})},onSuccess:()=>{g(`Einladung versendet`),X(``),l.invalidateQueries({queryKey:[`admin`,`org_invitations`,e]})},onError:e=>_(e,`Einladung`)}),z=d({mutationFn:async t=>{let{error:n}=await f.from(`lp_organization_memberships`).update({role:t.role}).eq(`organization_id`,e).eq(`teacher_id`,t.teacher_id);if(n)throw n},onSuccess:()=>{g(`Rolle aktualisiert`),l.invalidateQueries({queryKey:[`admin`,`org_members`,e]})},onError:e=>_(e,`Rolle`)}),B=d({mutationFn:async e=>{let{data:t,error:n}=await f.rpc(`lp_remove_org_member_v2`,{p_member_id:e.teacher_id,p_transfer_classes_to:e.transferClassesTo});if(n)throw n;return t},onSuccess:t=>{g(t.classes_moved>0?`Mitglied entfernt â ${t.classes_moved} Klassen übertragen.`:`Mitglied entfernt`),l.invalidateQueries({queryKey:[`admin`,`org_members`,e]}),l.invalidateQueries({queryKey:[`admin`,`org_sub`,e]})},onError:e=>_(e,`Entfernen`)}),V=d({mutationFn:async t=>{let{error:n}=await f.rpc(`lp_transfer_org_owner`,{p_org:e,p_new_owner:t});if(n)throw n},onSuccess:()=>{g(`Owner übertragen`),l.invalidateQueries({queryKey:[`admin`,`org_members`,e]})},onError:e=>_(e,`Owner-Transfer`)}),H=d({mutationFn:async t=>{let{error:n}=await f.from(`lp_org_sharing_policy`).upsert({organization_id:e,...t,updated_by:ue?.user.id,updated_at:new Date().toISOString()},{onConflict:`organization_id`});if(n)throw n},onSuccess:()=>
1{g(`Sharing aktualisiert`),l.invalidateQueries({queryKey:[`admin`,`org_sharing`,e]})},onError:e=>_(e,`Sharing`)}),U=M.data,[W,G]=(0,D.useState)(null),K=W??U;function q(e,t){G({...K??{},[e]:t})}let J=W!=null&&U!=null&&Object.keys(W).some(e=>W[e]!==U[e]),[Y,X]=(0,D.useState)(``),[Z,de]=(0,D.useState)(`teacher`),[Q,$]=(0,D.useState)(null);return M.isLoading?(0,O.jsx)(p,{}):!U||!K?(0,O.jsx)(`p`,{className:`text-muted-foreground`,children:`Organisation nicht gefunden.`}):(0,O.jsxs)(`div`,{className:`space-y-6`,children:[(0,O.jsx)(oe,{title:U.name,description:`Slug: ${U.slug} · Code: ${U.invite_code} · seit ${new Date(U.created_at).toLocaleDateString(`de-DE`)}`,icon:te,breadcrumbs:[{label:`Organisationen`,href:`/admin/organizations`},{label:U.name}]}),(0,O.jsx)(`div`,{className:`grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4`,children:N.data&&(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(k,{label:`Mitglieder`,value:N.data.teachers??0}),(0,O.jsx)(k,{label:`Klassen`,value:N.data.classes??0}),(0,O.jsx)(k,{label:`Stunden`,value:N.data.plans??0}),(0,O.jsx)(k,{label:`AI-Calls/Monat`,value:N.data.ai_calls_this_month??0,sub:N.data.ai_cost_this_month_cents==null?void 0:`${(N.data.ai_cost_this_month_cents/100).toFixed(2)} â¬`})]})}),(0,O.jsxs)(w,{children:[(0,O.jsxs)(b,{children:[(0,O.jsx)(S,{className:`text-lg`,children:`Stammdaten`}),(0,O.jsx)(C,{children:`Vollständige Organisations-Details. Ãnderungen gehen sofort an die Datenbank.`})]}),(0,O.jsxs)(x,{className:`space-y-4`,children:[(0,O.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,O.jsx)(A,{label:`Name *`,value:K.name??``,onChange:e=>q(`name`,e)}),(0,O.jsx)(A,{label:`Slug *`,value:K.slug??``,onChange:e=>q(`slug`,e)}),(0,O.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,O.jsx)(h,{children:`Typ`}),(0,O.jsxs)(v,{value:K.org_type??`school`,onChange:e=>q(`org_type`,e.target.value),children:[(0,O.jsx)(`option`,{value:`school`,children:`Schule`}),(0,O.jsx)(`option`,{value:`district`,children:`Schul-Bezirk`}),(0,O.jsx)(`option`,{value:`private`,children:`Privat / Träger`})]})]}),(0,O.jsx)(A,{label:`Bundesland`,value:K.bundesland??``,onChange:e=>q(`bundesland`,e||null)}),(0,O.jsx)(A,{label:`Kontakt-E-Mail`,value:K.contact_email??``,onChange:e=>q(`contact_email`,e||null)}),(0,O.jsx)(A,{label:`USt-ID`,value:K.ust_id??``,onChange:e=>q(`ust_id`,e||null)})]}),(0,O.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,O.jsx)(A,{label:`Adresse Zeile 1`,value:K.address_line1??``,onChange:e=>q(`address_line1`,e||null)}),(0,O.jsx)(A,{label:`Adresse Zeile 2`,value:K.address_line2??``,onChange:e=>q(`address_line2`,e||null)}),(0,O.jsx)(A,{label:`PLZ`,value:K.postal_code??``,onChange:e=>q(`postal_code`,e||null)}),(0,O.jsx)(A,{label:`Ort`,value:K.city??``,onChange:e=>q(`city`,e||null)}),(0,O.jsx)(A,{label:`Land`,value:K.country??`DE`,onChange:e=>q(`country`,e||`DE`)})]}),(0,O.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,O.jsx)(m,{variant:`ghost`,onClick:()=>G(null),disabled:!J,children:`Abbrechen`}),(0,O.jsxs)(m,{onClick:()=>W&&L.mutate(W),disabled:!J||L.isPending,children:[L.isPending?(0,O.jsx)(p,{className:`mr-2`}):(0,O.jsx)(r,{className:`mr-2 h-4 w-4`}),`Speichern`]})]})]})]}),(0,O.jsxs)(w,{children:[(0,O.jsx)(b,{children:(0,O.jsx)(S,{className:`text-lg`,children:`Abonnement`})}),(0,O.jsx)(x,{children:P.isLoading?(0,O.jsx)(p,{}):P.data?(0,O.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2 text-sm`,children:[(0,O.jsx)(j,{label:`Plan`,value:P.data.plan?.name??`â`}),(0,O.jsx)(j,{label:`Status`,value:(0,O.jsx)(T,{variant:P.data.status===`trial`?`default`:P.data.status===`active`?`success`:`destructive`,children:P.data.status})}),(0,O.jsx)(j,{label:`Lizenzen`,value:`${P.data.seats_used} / ${P.data.seats_licensed}`}),(0,O.jsx)(j,{label:`Abrechnung`,value:P.data.billing_interval}),(0,O.jsx)(j,{label:`Trial bis`,value:P.data.trial_ends_at?new Date(P.data.trial_ends_at).toLocaleDateString(`de-DE`):`â`}),(0,O.jsx)(j,{label:`Periode bis`,value:P.data.current_period_end?new Date(P.data.current_period_end).toLocaleDateString(`de-DE`):`â`}),(0,O.jsx)(j,{label:`Monatlich`,value:`${(P.data.monthly_amount_cents/100).toFixed(2)} â¬`}),(0,O.jsx)(j,{label:`Bezahlmethode`,value:P.data.payment_method??`â`})]}):(0,O.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Keine aktive Subscription.`})})]}),(0,O.jsxs)(w,{children:[(0,O.jsxs)(b,{children:[(0,O.jsxs)(S,{className:`flex items-center gap-2 text-lg`,children:[(0,O.jsx)(o,{className:`h-4 w-4`}),` Mitglieder`]}),(0,O.jsxs)(C,{children:[F.data?.length??0,` Personen â alle Schul-Admin-Aktionen sind hier verfügbar.`]})]}),(0,O.jsxs)(x,{className:`space-y-4`,children:[(0,O.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),Y.trim()&&R.mutate({email:Y,role:Z})},className:`flex flex-wrap items-end gap-2 rounded-md border border-dashed p-3`,children:[(0,O.jsxs)(`div`,{className:`space-y-1.5 min-w-[220px] flex-1`,children:[(0,O.jsx)(h,{children:`E-Mail`}),(0,O.jsx)(y,{type:`email`,value:Y,onChange:e=>X(e.target.value),placeholder:`[email protected]`})]}),(0,O.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,O.jsx)(h,{children:`Rolle`}),(0,O.jsxs)(v,{value:Z,onChange:e=>de(e.target.value),className:`flex h-10 rounded-md border border-input bg-background px-3 text-sm`,children:[(0,O.jsx)(`option`,{value:`teacher`,children:`Lehrkraft`}
1),(0,O.jsx)(`option`,{value:`schuladmin`,children:`Schul-Admin`})]})]}),(0,O.jsxs)(m,{type:`submit`,disabled:R.isPending||!Y.trim(),children:[R.isPending?(0,O.jsx)(p,{className:`mr-2`}):(0,O.jsx)(ee,{className:`mr-2 h-4 w-4`}),`Einladen`]})]}),F.isLoading?(0,O.jsx)(p,{}):(F.data?.length??0)===0?(0,O.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Noch keine Mitglieder.`}):(0,O.jsx)(`ul`,{className:`divide-y`,children:F.data?.map(e=>(0,O.jsxs)(`li`,{className:`flex flex-wrap items-center justify-between gap-2 py-3`,children:[(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[e.role===`owner`&&(0,O.jsx)(n,{className:`h-4 w-4 text-yellow-600`}),e.role===`schuladmin`&&(0,O.jsx)(t,{className:`h-4 w-4 text-primary`}),(0,O.jsxs)(`div`,{children:[(0,O.jsx)(`div`,{className:`font-medium`,children:e.display_name||e.email}),(0,O.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:e.email})]}),(0,O.jsx)(T,{variant:e.role===`owner`?`default`:e.role===`schuladmin`?`secondary`:`outline`,children:e.role})]}),(0,O.jsxs)(`div`,{className:`flex flex-wrap gap-1`,children:[e.role===`teacher`&&(0,O.jsx)(m,{variant:`outline`,size:`sm`,onClick:()=>z.mutate({teacher_id:e.teacher_id,role:`schuladmin`}),children:`Zu Schuladmin`}),e.role===`schuladmin`&&(0,O.jsx)(m,{variant:`outline`,size:`sm`,onClick:()=>z.mutate({teacher_id:e.teacher_id,role:`teacher`}),children:`Zu Lehrer`}),e.role!==`owner`&&(0,O.jsxs)(m,{variant:`outline`,size:`sm`,onClick:async()=>{await E({title:`Owner übertragen?`,body:`Owner-Rolle endgültig an ${e.display_name||e.email} übertragen?`,confirmLabel:`Ãbertragen`})&&V.mutate(e.teacher_id)},disabled:V.isPending,children:[(0,O.jsx)(a,{className:`mr-1 h-3 w-3`}),` Zu Owner`]}),e.role!==`owner`&&(0,O.jsx)(m,{variant:`ghost`,size:`sm`,className:`text-destructive hover:text-destructive`,onClick:()=>$(e),disabled:B.isPending,children:(0,O.jsx)(s,{className:`h-3 w-3`})})]})]},e.teacher_id))})]})]}),e&&(0,O.jsx)(se,{orgId:e,onInvited:()=>{l.invalidateQueries({queryKey:[`admin`,`org_members`,e]}),l.invalidateQueries({queryKey:[`admin`,`org_invitations`,e]})}}),(0,O.jsxs)(w,{children:[(0,O.jsxs)(b,{children:[(0,O.jsx)(S,{className:`text-lg`,children:`Sharing-Policy`}),(0,O.jsx)(C,{children:`Welche Ressourcen sind innerhalb der Org sichtbar/editierbar? (Schul-Admins sehen IMMER alles ihrer Mitglieder.)`})]}),(0,O.jsx)(x,{className:`space-y-3`,children:I.isLoading?(0,O.jsx)(p,{}):le.map(e=>{let t=I.data?.[e.key]??`private`;return(0,O.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 rounded-md border p-2`,children:[(0,O.jsx)(`span`,{className:`text-sm font-medium`,children:e.label}),(0,O.jsxs)(v,{value:t,onChange:t=>H.mutate({[e.key]:t.target.value}),className:`flex h-9 rounded-md border border-input bg-background px-3 text-sm`,disabled:H.isPending,children:[(0,O.jsx)(`option`,{value:`private`,children:`privat (nur Owner)`}),(0,O.jsx)(`option`,{value:`org_visible`,children:`org-weit lesbar`}),(0,O.jsx)(`option`,{value:`org_editable`,children:`org-weit editierbar`})]})]},e.key)})})]}),(0,O.jsxs)(w,{children:[(0,O.jsx)(b,{children:(0,O.jsx)(S,{className:`text-base`,children:`Aktionen`})}),(0,O.jsxs)(x,{className:`flex flex-wrap gap-2`,children:[(0,O.jsxs)(m,{variant:`outline`,size:`sm`,onClick:()=>{l.invalidateQueries({queryKey:[`admin`,`org_stats`,e]}),l.invalidateQueries({queryKey:[`admin`,`org_sub`,e]}),l.invalidateQueries({queryKey:[`admin`,`org_members`,e]})},children:[(0,O.jsx)(i,{className:`mr-2 h-4 w-4`}),` Stats neu laden`]}),(0,O.jsx)(m,{variant:`outline`,size:`sm`,onClick:()=>
1{navigator.clipboard?.writeText(U.invite_code),g(`Code kopiert`)},children:`Invite-Code kopieren`}),(0,O.jsxs)(m,{variant:`ghost`,size:`sm`,className:`text-destructive hover:text-destructive ml-auto`,onClick:async()=>{if(!await E({title:`Organisation löschen?`,body:`â${U.name}" endgültig löschen? Alle Mitglieder, Klassen, Subs gehen verloren!`,destructive:!0,confirmLabel:`Löschen`}))return;let{error:e}=await f.from(`lp_organizations`).delete().eq(`id`,U.id);if(e){_(e,`Löschen`);return}g(`Organisation gelöscht`),c(`/admin/organizations`,{replace:!0})},children:[(0,O.jsx)(s,{className:`mr-2 h-4 w-4`}),` Organisation löschen`]})]})]}),Q&&e&&(0,O.jsx)(ce,{open:!!Q,onOpenChange:e=>{e||$(null)},orgId:e,member:{teacher_id:Q.teacher_id,email:Q.email,display_name:Q.display_name},otherMembers:(F.data??[]).filter(e=>e.teacher_id!==Q.teacher_id).map(e=>({teacher_id:e.teacher_id,email:e.email,display_name:e.display_name})),isPending:B.isPending,onConfirm:e=>{B.mutate({teacher_id:Q.teacher_id,transferClassesTo:e},{onSettled:()=>$(null)})}})]})}function k({label:e,value:t,sub:n}){return(0,O.jsx)(w,{children:(0,O.jsxs)(x,{className:`py-4`,children:[(0,O.jsx)(`div`,{className:`text-xs uppercase tracking-wider text-muted-foreground`,children:e}),(0,O.jsx)(`div`,{className:`mt-1 text-2xl font-semibold`,children:t}),n&&(0,O.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:n})]})})}function A({label:e,value:t,onChange:n}){return(0,O.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,O.jsx)(h,{children:e}),(0,O.jsx)(y,{value:t,onChange:e=>n(e.target.value)})]})}function j({label:e,value:t}){return(0,O.jsxs)(`div`,{children:[(0,O.jsx)(`div`,{className:`text-xs uppercase tracking-wider text-muted-foreground`,children:e}),(0,O.jsx)(`div`,{className:`mt-1`,children:t})]})}export{ue 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.