Dashboard: - Neuer Endpoint GET /api/stats/dashboard mit allen Kennzahlen - Klickbare Kacheln: Vorlagen nach Typ, Ketten nach Status → navigieren zu Filterlisten - Umsetzungsquote als horizontaler Balken mit klickbaren Segmenten Abstimmungen: - Stimmverhalten-Tabelle klickbar: Fraktion oder Ja/Nein/Enthaltung → filtert - Neuer Endpoint GET /api/abstimmungen/details (?fraktion=&stimme=) mit Pagination - Neuer Endpoint GET /api/abstimmungen/vergleich (?f1=&f2=) für Koalitionsmatrix-Drill-Down - Koalitionsmatrix-Zellen klickbar → zeigt Abstimmungsvergleich beider Fraktionen Fraktions-Normalisierung: - fraktionen_mapping.py: 40+ DB-Varianten → kanonische Namen - 'Bündnis 90 / Die Grünen' / 'Bündnis 90/Die Grünen' / 'Grüne' → 'Grüne' - 'Die Linke' / 'Die Linke.' / 'Linke' → 'Linke' - BfHo-Varianten, Hagen Aktiv, Einzelvertreter etc. normalisiert - Mapping in allen Abstimmungs-Endpoints aktiv - ist_ratsfraktion Flag in Fraktionen-Response Closes #14
3 lines
11 KiB
JavaScript
3 lines
11 KiB
JavaScript
import{a as n,t as G,f as l,d as Re,c as Te,b as ue}from"../chunks/B89f14j0.js";import{o as qe}from"../chunks/DrzKg1h1.js";import{p as ye,b as o,h as s,g as e,r as t,t as f,u as X,c as we,f as be,H as Ge,d as h,$ as Je,s as H,I as Ne}from"../chunks/reyx9_7L.js";import{s as x}from"../chunks/BwTTNG21.js";import{s as Ue,a as We}from"../chunks/CvtDgobB.js";import{i as p}from"../chunks/Do7Yo2YN.js";import{e as pe,i as me,h as Ze}from"../chunks/D5EBvEcH.js";import{s as ke}from"../chunks/B-WTs0fq.js";import{s as Ce}from"../chunks/DnBxR3jh.js";import{b as Oe}from"../chunks/DUDgQzMC.js";import{p as Qe}from"../chunks/wNiDNfGw.js";import{c as he,e as Xe,d as Ye}from"../chunks/nhOotKLT.js";import{t as ze,f as Y,s as $e}from"../chunks/utcFFRIM.js";import{S as er}from"../chunks/Cm2grUT-.js";import{s as rr}from"../chunks/C7sCDBjT.js";var tr=l('<span class="font-mono text-sm font-medium text-gray-900"> </span>'),ar=l('<span class="text-xs text-gray-400"> </span>'),sr=l('<p class="mt-1 text-sm text-gray-700 line-clamp-2"> </p>'),nr=l('<div class="relative flex items-start group"><div class="flex-shrink-0 relative z-10"><div><!></div></div> <a class="ml-4 flex-1 bg-white rounded-lg border border-gray-200 p-4 hover:shadow-md transition-shadow"><div class="flex items-center justify-between"><div class="flex items-center space-x-2"><!> <span class="text-xs px-2 py-0.5 rounded bg-gray-100 text-gray-600"> </span> <!></div> <span class="text-xs text-gray-500"> </span></div> <!></a></div>'),or=l('<div class="relative"><div class="absolute left-6 top-0 bottom-0 w-0.5 bg-gray-200"></div> <div class="space-y-6"></div></div>');function ir($,E){ye(E,!0);const ee=X(()=>$e(E.status));var M=or(),J=o(s(M),2);pe(J,21,()=>E.glieder,me,(i,y,S)=>{const F=X(()=>S===0),k=X(()=>S===E.glieder.length-1);var A=nr(),R=s(A),P=s(R),re=s(P);{var te=v=>{var c=G();f(()=>x(c,e(ee).emoji)),n(v,c)},ae=v=>{var c=G("📄");n(v,c)},se=v=>{var c=G("📊");n(v,c)},m=v=>{var c=G("📎");n(v,c)};p(re,v=>{e(F)?v(te):e(y).rolle==="stellungnahme"?v(ae,1):e(y).rolle==="bericht"?v(se,2):v(m,-1)})}t(P),t(R);var w=o(R,2),z=s(w),I=s(z),V=s(I);{var T=v=>{var c=tr(),B=s(c,!0);t(c),f(()=>x(B,e(y).vorlage.aktenzeichen)),n(v,c)};p(V,v=>{e(y).vorlage.aktenzeichen&&v(T)})}var D=o(V,2),ne=s(D,!0);t(D);var N=o(D,2);{var oe=v=>{var c=ar(),B=s(c,!0);t(c),f(()=>x(B,e(y).rolle)),n(v,c)};p(N,v=>{e(y).rolle&&v(oe)})}t(I);var U=o(I,2),ie=s(U,!0);t(U),t(z);var ve=o(z,2);{var W=v=>{var c=sr(),B=s(c,!0);t(c),f(()=>x(B,e(y).vorlage.betreff)),n(v,c)};p(ve,v=>{e(y).vorlage.betreff&&v(W)})}t(w),t(A),f((v,c)=>{rr(P,1,`w-12 h-12 rounded-full flex items-center justify-center text-lg
|
|
${e(F)?"bg-green-100 ring-2 ring-green-500":e(k)?"bg-blue-100 ring-2 ring-blue-500":"bg-white ring-2 ring-gray-300"}`),ke(w,"href",`/vorlagen/${e(y).vorlage.id??""}`),x(ne,v),x(ie,c)},[()=>ze(e(y).vorlage.typ),()=>Y(e(y).vorlage.datum_eingang)]),n(i,A)}),t(J),t(M),n($,M),we()}var vr=l('<div class="bg-red-50 text-red-700 p-4 rounded-lg"> </div>'),lr=l('<div class="flex justify-center py-20"><div class="animate-spin rounded-full h-12 w-12 border-b-2 border-green-600"></div></div>'),dr=l('<h1 class="text-2xl font-bold text-gray-900 font-mono"> </h1>'),gr=l('<span class="text-sm px-2 py-0.5 rounded bg-gray-100 text-gray-600 capitalize"> </span>'),cr=l('<p class="text-gray-700"> </p>'),ur=l("<div>Status seit: <strong> </strong></div>"),pr=l("<div>Letzte Aktivität: <strong> </strong></div>"),mr=l('<div class="text-amber-600">Vertagungen: <strong> </strong></div>'),_r=l('<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium"> </span>'),fr=l('<div class="mt-4 flex items-center space-x-2"><span class="text-sm text-gray-500">Antragsteller:</span> <!></div>'),xr=l('<div class="mt-4 p-3 rounded-lg bg-gray-50 border border-gray-200"><span class="text-xs font-medium text-gray-500 uppercase">Klassifikation</span> <p class="text-sm text-gray-700 mt-1"> </p></div>'),br=l('<button class="text-sm text-green-600 hover:text-green-800 font-medium flex items-center gap-1.5"><span>🔄</span> Kette neu bewerten lassen</button>'),hr=l('<span class="inline-flex items-center gap-2"><span class="animate-spin h-4 w-4 border-2 border-white border-t-transparent rounded-full"></span> KI bewertet…</span>'),yr=l('<button class="text-sm text-gray-500 hover:text-gray-700">Abbrechen</button>'),wr=l('<p class="mt-2 text-sm text-green-700 font-medium">✅ Bewertung aktualisiert!</p>'),kr=l('<p class="mt-2 text-sm text-red-600"> </p>'),zr=l(`<div class="p-4 rounded-lg border border-green-200 bg-green-50"><h3 class="text-sm font-semibold text-gray-900 mb-2">KI-Neubewertung der Kette</h3> <textarea placeholder="Anmerkungen für die KI (optional) — z.B. 'Der Antrag wurde mündlich im Ausschuss behandelt' oder 'Bitte Wortprotokoll stärker gewichten'" class="w-full border border-gray-300 rounded-lg px-3 py-2 text-sm mb-3 h-20 resize-y focus:ring-2 focus:ring-green-500 focus:border-green-500"></textarea> <div class="flex gap-2 items-center"><button class="bg-green-600 text-white px-4 py-2 rounded-lg text-sm font-medium hover:bg-green-700 disabled:opacity-50 disabled:cursor-wait transition-colors"><!></button> <!></div> <!> <!></div>`),Kr=l('<p class="text-gray-500 text-sm">Keine Glieder in dieser Kette.</p>'),jr=l('<span class="font-mono text-sm font-medium text-green-700"> </span>'),Ar=l('<span class="text-xs px-2 py-0.5 rounded bg-gray-100 text-gray-600 capitalize"> </span>'),Ir=l('<span class="text-sm text-gray-600 truncate"> </span>'),Br=l('<a class="flex flex-col sm:flex-row sm:items-center sm:justify-between p-3 rounded-lg border border-gray-100 hover:bg-gray-50 transition-colors gap-2"><div class="flex flex-wrap items-center gap-2 sm:gap-3 min-w-0"><!> <!> <!></div> <span class="text-xs text-gray-500"> </span></a>'),Sr=l('<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6"><h2 class="text-lg font-semibold text-gray-900 mb-4">Verknüpfte Vorlagen</h2> <div class="space-y-2"></div></div>'),Fr=l('<a href="/ketten" class="text-sm text-gray-500 hover:text-gray-700 mb-4 inline-block">← Zurück zur Liste</a> <div class="bg-white rounded-xl shadow-sm border border-gray-200 p-4 sm:p-6 mb-6"><div class="flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4"><div class="min-w-0"><div class="flex flex-wrap items-center gap-2 sm:gap-3 mb-2"><!> <!> <!></div> <!></div> <div class="text-left sm:text-right text-sm text-gray-500 space-y-1 shrink-0"><!> <!> <!></div></div> <!> <!> <div class="mt-4"><!></div></div> <div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6 mb-6"><h2 class="text-lg font-semibold text-gray-900 mb-6">Perlenschnur</h2> <!></div> <!>',1);function Zr($,E){ye(E,!0);const ee=()=>We(Qe,"$page",M),[M,J]=Ue();let i=H(null),y=H(null),S=H(!1),F=H(""),k=H("idle"),A=H("");async function R(){if(e(i)){h(k,"running"),h(A,"");try{const{job_id:m}=await Xe(e(i).id,e(F));for(let w=0;w<60;w++){await new Promise(I=>setTimeout(I,3e3));const z=await Ye(m);if(z.status==="done"){h(k,"done"),h(i,await he(e(i).id),!0),h(S,!1),h(F,"");return}if(z.status==="error"){h(k,"error"),h(A,z.error||"Unbekannter Fehler",!0);return}}h(k,"error"),h(A,"Timeout nach 3 Minuten")}catch(m){h(k,"error"),h(A,m instanceof Error?m.message:"Fehler",!0)}}}qe(async()=>{try{const m=parseInt(ee().params.id);h(i,await he(m),!0)}catch(m){h(y,m instanceof Error?m.message:"Fehler",!0)}});var P=Te();Ze("18iqj8",m=>{Ge(()=>{Je.title=`${(e(i)?.ursprung?.aktenzeichen||"Kette")??""} - Antragstracker Hagen`})});var re=be(P);{var te=m=>{var w=vr(),z=s(w,!0);t(w),f(()=>x(z,e(y))),n(m,w)},ae=m=>{var w=lr();n(m,w)},se=m=>{var w=Fr(),z=o(be(w),2),I=s(z),V=s(I),T=s(V),D=s(T);{var ne=r=>{var a=dr(),d=s(a,!0);t(a),f(()=>x(d,e(i).ursprung.aktenzeichen)),n(r,a)};p(D,r=>{e(i).ursprung?.aktenzeichen&&r(ne)})}var N=o(D,2);er(N,{get status(){return e(i).status}});var oe=o(N,2);{var U=r=>{var a=gr(),d=s(a,!0);t(a),f(b=>x(d,b),[()=>ze(e(i).typ)]),n(r,a)};p(oe,r=>{e(i).typ&&r(U)})}t(T);var ie=o(T,2);{var ve=r=>{var a=cr(),d=s(a,!0);t(a),f(()=>x(d,e(i).thema)),n(r,a)};p(ie,r=>{e(i).thema&&r(ve)})}t(V);var W=o(V,2),v=s(W);{var c=r=>{var a=ur(),d=o(s(a)),b=s(d,!0);t(d),t(a),f(u=>x(b,u),[()=>Y(e(i).status_seit)]),n(r,a)};p(v,r=>{e(i).status_seit&&r(c)})}var B=o(v,2);{var Ke=r=>{var a=pr(),d=o(s(a)),b=s(d,!0);t(d),t(a),f(u=>x(b,u),[()=>Y(e(i).letzte_aktivitaet)]),n(r,a)};p(B,r=>{e(i).letzte_aktivitaet&&r(Ke)})}var je=o(B,2);{var Ae=r=>{var a=mr(),d=o(s(a)),b=s(d,!0);t(d),t(a),f(()=>x(b,e(i).vertagungen_count)),n(r,a)};p(je,r=>{e(i).vertagungen_count>0&&r(Ae)})}t(W),t(I);var _e=o(I,2);{var Ie=r=>{var a=fr(),d=o(s(a),2);pe(d,17,()=>e(i).antragsteller,me,(b,u)=>{var j=_r(),L=s(j,!0);t(j),f(()=>{Ce(j,`background-color: ${(e(u).farbe||"#e5e7eb")??""}20; color: ${(e(u).farbe||"#4b5563")??""}; border: 1px solid ${(e(u).farbe||"#d1d5db")??""}`),x(L,e(u).kuerzel)}),n(b,j)}),t(a),n(r,a)};p(_e,r=>{e(i).antragsteller.length>0&&r(Ie)})}var fe=o(_e,2);{var Be=r=>{var a=xr(),d=o(s(a),2),b=s(d,!0);t(d),t(a),f(()=>x(b,e(i).begruendung)),n(r,a)};p(fe,r=>{e(i).begruendung&&r(Be)})}var xe=o(fe,2),Se=s(xe);{var Fe=r=>{var a=br();ue("click",a,()=>h(S,!0)),n(r,a)},Le=r=>{var a=zr(),d=o(s(a),2);Ne(d);var b=o(d,2),u=s(b),j=s(u);{var L=_=>{var g=hr();n(_,g)},Z=_=>{var g=G("Bewertung starten");n(_,g)};p(j,_=>{e(k)==="running"?_(L):_(Z,-1)})}t(u);var de=o(u,2);{var C=_=>{var g=yr();ue("click",g,()=>{h(S,!1),h(k,"idle")}),n(_,g)};p(de,_=>{e(k)!=="running"&&_(C)})}t(b);var O=o(b,2);{var ge=_=>{var g=wr();n(_,g)};p(O,_=>{e(k)==="done"&&_(ge)})}var ce=o(O,2);{var Q=_=>{var g=kr(),K=s(g);t(g),f(()=>x(K,`❌ ${e(A)??""}`)),n(_,g)};p(ce,_=>{e(k)==="error"&&_(Q)})}t(a),f(()=>{d.disabled=e(k)==="running",u.disabled=e(k)==="running"}),Oe(d,()=>e(F),_=>h(F,_)),ue("click",u,R),n(r,a)};p(Se,r=>{e(S)?r(Le,-1):r(Fe)})}t(xe),t(z);var le=o(z,2),Ee=o(s(le),2);{var Pe=r=>{ir(r,{get glieder(){return e(i).glieder},get status(){return e(i).status}})},Ve=r=>{var a=Kr();n(r,a)};p(Ee,r=>{e(i).glieder.length>0?r(Pe):r(Ve,-1)})}t(le);var De=o(le,2);{var He=r=>{var a=Sr(),d=o(s(a),2);pe(d,21,()=>e(i).graph.nodes.filter(b=>b.extern),me,(b,u)=>{var j=Br(),L=s(j),Z=s(L);{var de=g=>{var K=jr(),q=s(K,!0);t(K),f(()=>x(q,e(u).aktenzeichen)),n(g,K)};p(Z,g=>{e(u).aktenzeichen&&g(de)})}var C=o(Z,2);{var O=g=>{var K=Ar(),q=s(K,!0);t(K),f(()=>x(q,e(u).typ)),n(g,K)};p(C,g=>{e(u).typ&&g(O)})}var ge=o(C,2);{var ce=g=>{var K=Ir(),q=s(K,!0);t(K),f(()=>x(q,e(u).betreff)),n(g,K)};p(ge,g=>{e(u).betreff&&g(ce)})}t(L);var Q=o(L,2),_=s(Q,!0);t(Q),t(j),f(g=>{ke(j,"href",`/vorlagen/${e(u).id??""}`),x(_,g)},[()=>Y(e(u).datum_eingang)]),n(b,j)}),t(d),t(a),n(r,a)},Me=X(()=>e(i).graph&&e(i).graph.nodes.filter(r=>r.extern).length>0);p(De,r=>{e(Me)&&r(He)})}n(m,w)};p(re,m=>{e(y)?m(te):e(i)?m(se,-1):m(ae,1)})}n($,P),we(),J()}Re(["click"]);export{Zr as component};
|