PageSourceSearch

https://paideia-heureka-demo.web.app/assets/Materialverzeichnis-CYmwEnlI.js

js paideia-heureka-demo.web.app collected 2026-10-04 12:34:57 UTC 10,547 bytes, 1 lines download raw bytes

1import{r as u,j as n}from"./react-C_oDh_9Q.js";import{q as _,bp as V,aY as H,i as O,aD as J,aE as q,b0 as $,aC as D,aI as c,aK as Y,aJ as I}from"./index-D4wjbVLh.js";import"./_commonjsHelpers-CqkleIqs.js";import"./vorlade-helfer-BXl3LOEh.js";import"./firebase-CZ1-EOTx.js";import"./medien-freigaben-DbcdxLi9.js";async function Z(){return(await _("/lernmaterialien")).materialien}async function Q(a){return(await _("/lernmaterialien",{method:"POST",body:JSON.stringify(a)})).material}async function X(a,t){return(await _(`/lernmaterialien/${encodeURIComponent(a)}`,{method:"POST",body:JSON.stringify(t)})).material}const ee=new Set(["wo","ist","sind","die","der","das","den","dem","des","ein","eine","einen","einem","einer","haben","hat","wir","ich","man","es","irgendwas","irgendwie","etwas","was","welche","welches","welcher","gibt","und","oder","zum","zur","zu","fuer","für","mit","von","im","in","am","an","auf","bei","kann","koennen","können","brauche","brauchen","suche","suchen","finde","finden","bitte","mal","denn","noch","auch","nicht","hey"]);function k(a){return String(a||"").toLowerCase().replace(/ä/g,"ae").replace(/ö/g,"oe").replace(/ü/g,"ue").replace(/ß/g,"ss").normalize("NFD").replace(/[̀-ͯ]/g,"").replace(/[^a-z0-9]+/g," ").trim()}function W(a){const t=k(a).split(" ").filter(Boolean),r=t.filter(i=>i.length>1&&!ee.has(i));return r.length>0?r:t}const ne={name:10,raum:6,wofuer:4,einsatz:2,stufe:3};function te(a,t,r){return a?a===t?r*2:a.split(" ").includes(t)?r:t.length>=4&&a.includes(t)?Math.round(r/2):0:0}function ae(a,t){const r=W(t);if(r.length===0)return a.map(s=>({material:s,punkte:0,grund:"name"}));const i=[];for(const s of a){const d={name:k(s.name),raum:k(s.raum),wofuer:k(s.wofuer),einsatz:k(s.einsatz),stufe:(s.stufen||[]).map(b=>`${b} stufe schulstufe`).join(" ")};let j=0,o="name",p=0;for(const b of r)for(const g of["name","raum","wofuer","einsatz","stufe"]){const x=te(d[g],b,ne[g]);j+=x,x>p&&(p=x,o=g)}j>0&&i.push({material:s,punkte:j,grund:o})}return i.sort((s,d)=>d.punkte-s.punkte||s.material.name.localeCompare(d.material.name,"de-AT"))}function ie(a,t){if(W(a).length===0)return"";if(t.length===0)return"Dazu steht noch nichts im Verzeichnis. Wer das Material kennt, trägt es unten ein.";const r=t[0].material,i=r.raum?`steht im Raum ${r.raum}`:"hat noch keinen Raum eingetragen";if(t.length===1)return`${r.name} ${i}.`;const s=t.length-1;return`${r.name} ${i}. Dazu ${V(s,"passt","passen")} ${H(s,"weiterer Eintrag","weitere Einträge")}.`}function T(){return{name:"",raum:"",bildPfad:"",wofuer:"",einsatz:"",fragAn:"",einheitIds:[],stufen:[],videoUrl:""}}function U(){return[{id:"demo-hunderterplatten",name:"Montessori-Hunderterplatten",raum:"Mathematikraum",bildPfad:"",wofuer:"Mengen begreifen, später Prozentrechnen",einsatz:"Erst legen lassen, dann benennen, dann rechnen. Für Prozente eine Platte als das Ganze setzen.",fragAn:"Können wir das mit der Hunderterplatte legen?",einheitIds:["mathematik1-mengen","mathematik6-prozent"],stufen:[1,2,6],videoUrl:""},{id:"demo-bruchkreise",name:"Geteilte Kreise für Brüche",raum:"Mathematikraum",bildPfad:"",wofuer:"Brüche sehen und aussprechen, bevor gerechnet wird",einsatz:"Ein Kind legt drei von acht Teilen und sagt den Bruch laut, bevor er geschrieben wird.",fragAn:"Haben wir etwas zum Brüche verstehen?",einheitIds:["mathematik4-brueche"],stufen:[3,4,5],videoUrl:""},{id:"demo-gitarre",name:"Gitarre",raum:"Musikraum",bildPfad:"",wofuer:"Begleitung im Morgenkreis",einsatz:"Nach dem Spielen zurück in den Ständer neben dem Fenster.",fragAn:"Dürfen wir im Morgenkreis Gitarre spielen?",einheitIds:[],stufen:[],videoUrl:""}]}function R(a){return a.split(/[,\s]+/).map(t=>t.trim()).filter(Boolean)}function re(a){const t=[];for(const r of R(a)){const i=Number.parseInt(r,10);Number.isInteger(i)&&i>=1&&i<=13&&!t.includes(i)&&t.push(i)}return t.sort((r,i)=>r-i)}function he({vorschauRolle:a}){const t=O(),r=t.lokal?a:t.konto?.rolle??a,[i,s]=u.useState(()=>t.lokal?U():[]),[d,j]=u.useState(""),[o,p]=u.useState(()=>T()),[b,g]=u.useState(""),[x,S]=u.useState(""),[h,y]=u.useState(""),[E,B]=u.useState(!1),[L,w]=u.useState(""),[P,z]=u.useState(""),N=u.useRef(null);u.useEffect(()=>{if(t.lokal){s(U());return}let e=!0;return w(""),Z().then(l=>e&&s(l)).catch(()=>e&&w("Das Materialverzeichnis konnte nicht geladen werden.")),()=>{e=!1}},[t.lokal]);const M=u.useMemo(()=>ae(i,d),[i,d]),C=u.useMemo(()=>ie(d,M),[d,M]),F=u.useMemo(()=>[...new Set(i.map(e=>
1e.raum).filter(Boolean))].sort((e,l)=>e.localeCompare(l,"de-AT")),[i]),f=(e,l)=>{p(m=>({...m,[e]:l}))},A=()=>{p(T()),g(""),S(""),y("")},G=e=>{y(e.id),p({name:e.name,raum:e.raum,bildPfad:e.bildPfad,wofuer:e.wofuer,einsatz:e.einsatz,fragAn:e.fragAn,einheitIds:e.einheitIds??[],stufen:e.stufen??[],videoUrl:e.videoUrl}),g((e.einheitIds??[]).join(", ")),S((e.stufen??[]).join(", ")),z(""),N.current?.focus()},K=async()=>{if(o.name.trim().length<2){w("Bitte einen Namen für das Material eintragen."),N.current?.focus();return}if(o.raum.trim().length<1){w("Bitte den Raum eintragen, sonst findet es später niemand.");return}const e={...o,einheitIds:R(b),stufen:re(x)};B(!0),w(""),z("");try{if(t.lokal){const l={id:h||`demo-${Date.now()}`,...e};s(m=>h?m.map(v=>v.id===h?l:v):[...m,l]),z(`„${l.name}“ ist gespeichert.`)}else if(h){const l=await X(h,e);s(m=>m.map(v=>v.id===h?l:v)),z(`„${l.name}“ ist geändert.`)}else{const l=await Q(e);s(m=>[...m,l]),z(`„${l.name}“ ist aufgenommen.`)}A(),N.current?.focus()}catch(l){w(l instanceof Error?l.message:"Das Material konnte nicht gespeichert werden.")}finally{B(!1)}};return n.jsxs(J,{className:"materialverzeichnis-page adult-report-page",density:"wide",children:[n.jsx(q,{eyebrow:"Physische Lernmaterialien",title:"Materialverzeichnis",intro:n.jsx("p",{children:"Was haben wir im Haus, wo steht es, und wozu ist es gut? Frag hier ganz normal, zum Beispiel „wo ist die Gitarre“ oder „haben wir etwas zum Brüche verstehen“."}),compact:!0}),L&&n.jsx($,{label:"Hinweis",value:L,tone:"gold"}),P&&n.jsx($,{label:"Gespeichert",value:P,tone:"petrol"}),n.jsxs(D,{tone:"petrol",eyebrow:`${i.length} Materialien in ${F.length} Räumen`,title:"Frag das Verzeichnis",children:[n.jsx(c,{label:"Deine Frage",className:"field--wide",hint:"Zum Beispiel: wo ist die Gitarre",children:n.jsx("input",{type:"search",value:d,onChange:e=>j(e.target.value),placeholder:"wo ist die Gitarre"})}),C&&n.jsx("p",{className:"material-antwort","aria-live":"polite",children:C}),M.length===0?n.jsx(Y,{title:"Dazu steht noch nichts im Verzeichnis",children:n.jsx("p",{children:"Wer das Material kennt, trägt es unten ein. Ein Name und ein Raum genügen."})}):n.jsx("ul",{className:"material-liste",children:M.map(({material:e})=>n.jsxs("li",{className:"material-eintrag",children:[n.jsx("div",{className:"material-eintrag__bild",children:e.bildPfad?n.jsx("img",{src:e.bildPfad,alt:`Foto von ${e.name}`,loading:"lazy",width:"160",height:"120"}):n.jsx("span",{className:"material-eintrag__ohne-bild",children:"Foto folgt"})}),n.jsxs("div",{className:"material-eintrag__text",children:[n.jsxs("div",{className:"material-eintrag__kopf",children:[n.jsx("h3",{children:e.name}),n.jsx("span",{className:"material-eintrag__raum",children:e.raum})]}),e.wofuer&&n.jsx("p",{className:"material-eintrag__wofuer",children:e.wofuer}),e.einsatz&&n.jsx("p",{className:"material-eintrag__einsatz",children:e.einsatz}),e.fragAn&&n.jsx("p",{className:"material-eintrag__fragan",children:e.fragAn}),n.jsxs("p",{className:"material-eintrag__zuordnung",children:[e.stufen?.length?`Stufen ${e.stufen.join(", ")}`:"Noch keiner Stufe zugeordnet"," · ",e.einheitIds?.length?H(e.einheitIds.length,"Lerneinheit","Lerneinheiten"):"Noch keiner Lerneinheit zugeordnet"]}),e.videoUrl?n.jsx("p",{className:"material-eintrag__video",children:n.jsx("a",{href:e.videoUrl,children:"Video zur Handhabung"})}):n.jsx("p",{className:"material-eintrag__video material-eintrag__video--leer",children:"Video zur Handhabung folgt"}),n.jsx(I,{children:n.jsx("button",{className:"leise-taste",type:"button",onClick:()=>G(e),children:"Eintrag bearbeiten"})})]})]},e.id))})]}),n.jsxs(D,{eyebrow:r==="leitung"?"Leitung und Mentor":"Beim Einräumen, direkt am Handy",title:h?"Eintrag bearbeiten":"Material aufnehmen",children:[n.jsxs("div",{className:"material-form",children:[n.jsx(c,{label:"Name",hint:"Wie das Ding im Haus genannt wird",children:n.jsx("input",{ref:N,value:o.name,maxLength:120,onChange:e=>f("name",e.target.value)})}),n.jsxs(c,{label:"Raum",hint:"Ohne Raum findet es später niemand",children:[n.jsx("input",{value:o.raum,maxLength:80,list:"material-raeume",onCh
1ange:e=>f("raum",e.target.value)}),n.jsx("datalist",{id:"material-raeume",children:F.map(e=>n.jsx("option",{value:e},e))})]}),n.jsx(c,{label:"Wofür ist es gut?",className:"field--wide",hint:"Darf leer bleiben",children:n.jsx("textarea",{rows:2,maxLength:600,value:o.wofuer,onChange:e=>f("wofuer",e.target.value)})}),n.jsx(c,{label:"Wie setzt man es ein?",className:"field--wide",hint:"Darf leer bleiben",children:n.jsx("textarea",{rows:3,maxLength:1200,value:o.einsatz,onChange:e=>f("einsatz",e.target.value)})}),n.jsx(c,{label:"Was kann ein Kind fragen?",className:"field--wide",hint:"Der fertige Satz, den ein Kind vorliest; er erscheint später an der Lerneinheit",children:n.jsx("input",{value:o.fragAn,maxLength:300,onChange:e=>f("fragAn",e.target.value)})}),n.jsx(c,{label:"Schulstufen",hint:"Mehrere möglich, zum Beispiel 1, 2, 6",children:n.jsx("input",{value:x,inputMode:"numeric",onChange:e=>S(e.target.value)})}),n.jsx(c,{label:"Lerneinheiten",hint:"Kennungen, mehrere möglich, durch Komma getrennt",children:n.jsx("input",{value:b,onChange:e=>g(e.target.value)})}),n.jsx(c,{label:"Foto",className:"field--wide",hint:"Die Fotos entstehen am Ende der Umbauwochen; das Feld darf bis dahin leer bleiben",children:n.jsx("input",{value:o.bildPfad,maxLength:400,placeholder:"Noch kein Foto",onChange:e=>f("bildPfad",e.target.value)})}),n.jsx(c,{label:"Video zur Handhabung",className:"field--wide",hint:"Bleibt leer, bis die Videos da sind",children:n.jsx("input",{value:o.videoUrl,maxLength:400,placeholder:"Noch kein Video",onChange:e=>f("videoUrl",e.target.value)})})]}),n.jsxs(I,{children:[n.jsx("button",{className:"taste gross-taste",type:"button",onClick:()=>{K()},disabled:E,children:E?"Wird gespeichert …":h?"Änderung speichern":"Material aufnehmen"}),h&&n.jsx("button",{className:"leise-taste",type:"button",onClick:A,children:"Bearbeitung abbrechen"})]})]})]})}export{he as Materialverzeichnis};

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.