@velkayolanda/app_subjects 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -45925,8 +45925,8 @@ const XE = ({ item: a, children: i, title: c = null }) => (c || (c = /* @__PURE_
45925
45925
  semesterOrder: null
45926
45926
  });
45927
45927
  }, []), j = R.useCallback((k) => {
45928
- const q = d.filter((G) => G.id !== k);
45929
- p(q), c(q), v({
45928
+ const G = d.filter((P) => P.id !== k).sort((P, $) => (parseInt(P.order, 10) || 0) - (parseInt($.order, 10) || 0)).map((P, $) => ({ ...P, order: $ + 1 }));
45929
+ p(G), c(G), v({
45930
45930
  show: !1,
45931
45931
  semesterId: null,
45932
45932
  semesterOrder: null
@@ -1019,4 +1019,4 @@ mutation semesterDeleteMutation($id: UUID!, $lastchange: DateTime!) {
1019
1019
  }
1020
1020
  }
1021
1021
  }
1022
- `),VD=Ia(I5),Z5=(a=[],i=[])=>{const c=new Map;return a.forEach(s=>(s==null?void 0:s.id)!=null&&c.set(s.id,s)),i.forEach(s=>(s==null?void 0:s.id)!=null&&c.set(s.id,s)),Array.from(c.values())},J5=a=>{const i={...a,skip:(a.skip||0)+(a.limit||10),limit:a.limit||10};return console.log("newFilter",i),i},F5=a=>{const i=a!=null&&a.data?a.data:a,c=i?Object.values(i):[];let s=c==null?void 0:c[0];return Array.isArray(s)||(s=c.find(d=>Array.isArray(d)),Array.isArray(s))?s:[]},K5=a=>{if(!a)return!1;const i=a.getBoundingClientRect();return i.top<window.innerHeight&&i.bottom>0},P5=()=>null,W5=({preloadedItems:a,actionParams:i,asyncAction:c,calculateNewFilter:s=J5,reset:d=0,onAll:p=P5,enabled:y=!0,autoload:v=!0}={})=>{const T=ss(),b=Xu();if(typeof c!="function")throw Error("useInfiniteScroll.asyncAction must be a function, typically pageRead");const _=R.useMemo(()=>({...i||{}}),[i]),[O,C]=R.useState(()=>({filter:_,loading:!1,hasMore:!0,error:null,items:a,result:null})),w=R.useRef(0),j=R.useRef(!1),B=R.useRef(O);R.useEffect(()=>{B.current=O},[O]);const U=R.useRef(_);R.useEffect(()=>{U.current=O.filter},[O.filter]);const k=R.useRef(y);R.useEffect(()=>{k.current=y},[y]),R.useEffect(()=>{C(F=>({...F,items:a}))},[a]),R.useEffect(()=>{C(F=>({...F,filter:{...i||{}},loading:!1,hasMore:!0,error:null,items:[]}))},[d]);const q=R.useCallback(async()=>{if(!k.current||j.current)return null;j.current=!0;const F=w.current;try{const I=B.current;if(I.loading||!I.hasMore)return null;C(je=>({...je,loading:!0,error:null}));const V=U.current,ye=await T(c(V,b)),ce=F5(ye);return w.current!==F?null:(C(je=>{const xe=Z5(je.items,ce),Be=ce.length,$e=(V&&V.limit!=null?V.limit:void 0)??(je.filter&&je.filter.limit!=null?je.filter.limit:void 0),Ge=$e==null?Be>0:Be===$e;Ge||p();const Y=Ge?(()=>{const se={fetched:ce,fetchedCount:Be,limit:$e,params:V,result:ye};return(s.length>=2?s(je.filter,se):s(je.filter))??je.filter})():je.filter;return U.current=Y,{...je,items:xe,filter:Y,hasMore:Ge,loading:!1,result:ye}}),ye)}catch(I){return w.current===F&&C(V=>({...V,loading:!1,hasMore:!1,error:I})),null}finally{j.current=!1}},[T,c,b,p,s]),G=R.useCallback(async(F={})=>{w.current+=1,j.current=!1;const I={...F||{}};return U.current=I,C(V=>({...V,filter:I,loading:!1,hasMore:!0,error:null,items:[],result:null})),await new Promise(V=>requestAnimationFrame(V)),q()},[q]),W=R.useRef(null),$=R.useCallback(F=>{W.current=F},[]);return R.useEffect(()=>{const F=W.current;if(!y||!F)return;const I=new IntersectionObserver(([ce])=>{ce.isIntersecting&&k.current&&q()});I.observe(F);let V=!1;return(async()=>{if(v)for(await new Promise(ce=>requestAnimationFrame(ce)),await new Promise(ce=>setTimeout(ce,0));!V&&k.current;){const ce=B.current;if(ce.loading||!ce.hasMore||!K5(F))break;await q(),await new Promise(je=>requestAnimationFrame(je))}})(),()=>{V=!0,I.disconnect()}},[y,v,q,d]),{items:O.items,loading:O.loading,error:O.error,hasMore:O.hasMore,filter:O.filter,result:O.result,loadMore:q,restart:G,sentinelRef:$}},Ex=a=>String(a??"").replace(/^\/+|\/+$/g,""),qD=({app:a="_",model:i="_",action:c="view",withId:s=!1,idParam:d=":id"}={})=>{const p={app:Ex(a),model:Ex(i),action:Ex(c),withId:!!s,idParam:String(d).startsWith(":")?String(d):`:${String(d)}`},y=`/${p.app}/${p.model}/${p.action}`.replace(/\/+/g,"/"),v=p.withId?`${y}/${p.idParam}`:y,T={path:v,segments:p,toString(){return v},valueOf(){return v},[Symbol.toPrimitive](){return v},change(b={}){return qD({...p,...b})},app(b){return T.change({app:b})},model(b){return T.change({model:b})},action(b){return T.change({action:b})},id(b=!0){return T.change({withId:b})},idParam(b=":id"){return T.change({idParam:b})}};return T},$D="/subject";qD({app:$D});const Iy=`${$D}/SubjectGQLModel`,Tx=`${Iy}/list/`,eB=`${Iy}/create/`,tB=`${Iy}/view/`,nB=`${Iy}/edit/`,aB=`${Iy}/delete/`,YD=tB,xx=Tx,_x=":id",Zy=`${YD}${_x}`,GD=`${nB}${_x}`,lB=`${aB}${_x}`,Jy=({item:a,LinkURI:i=YD,action:c="view",children:s,...d})=>{const p=i.replace("view",c);return x.jsx(Ih,{to:p+(a==null?void 0:a.id),...d,children:s||(a==null?void 0:a.fullname)||(a==null?void 0:a.name)||(a==null?void 0:a.id)||"Nevim"})};I4("SubjectGQLModel",Jy);const Zb=({item:a,children:i,title:c=null})=>(c||(c=x.jsxs(x.Fragment,{children:[x.jsx(gD,{})," ",x.jsx(Jy,{item:a})]})),x.jsx(gl,{title:c,children:i})),QD=({item:a,children:i})=>{var c,s,d,p,y,v,T,b,_;return console.log("item",a),x.jsxs(x.Fragment,{children:[(a==null?void 0:a.name)&&x.jsx(Hl,{label:"Název",children:x.jsx(Jy,{item:a})}),(a==null?void 0:a.nameEn)&&x.jsx(Hl,{label:"Anglický název",children:a.nameEn}),(a==null?void 0:a.description)&&x.jsx(Hl,{label:"Popis",children:a.description}),(a==null?void 0:a.descriptionEn)&&x.jsx(Hl,{label:"Anglický popis",children:a.descriptionEn}),(((c=a==null?void 0:a.program)==null?void 0:c.name)||((s=a==null?void 0:a.program)==null?void 0:s.id))&&x.jsx(Hl,{label:"Program",children:x.jsx("a",{href:`/program/ProgramGQLModel/${(d=a==null?void 0:a.program)==null?void 0:d.id}`,children:((p=a==null?void 0:a.program)==null?void 0:p.name)||((y=a==null?void 0:a.program)==null?void 0:y.id)})}),((T=(v=a==null?void 0:a.rbacobject)==null?void 0:v.currentUserRoles)==null?void 0:T.length)>0&&x.jsx(Hl,{label:"Moje role",children:a.rbacobject.currentUserRoles.map(O=>{var C;return x.jsx("span",{className:"badge bg-secondary me-1",children:(C=O.roletype)==null?void 0:C.name},O.id)})}),x.jsx("hr",{}),((b=a==null?void 0:a.createdby)==null?void 0:b.fullname)&&x.jsx(Hl,{label:"Vytvořil",children:a.createdby.fullname}),(a==null?void 0:a.created)&&x.jsx(Hl,{label:"Vytvořeno",children:kb(a.created)}),(a==null?void 0:a.lastchange)&&x.jsx(Hl,{label:"Změněno",children:kb(a.lastchange)}),((_=a==null?void 0:a.changedby)==null?void 0:_.fullname)&&x.jsx(Hl,{label:"Změnil",children:a.changedby.fullname}),i]})},Ox=a=>x.jsx(Rx,{...a}),XD=BD,Jb={oneOfRoles:["administrátor"],mode:"absolute"},rB={name:"Nový"},iB=({readItemURI:a=Zy,rbacitem:i,item:c=rB,children:s,...d})=>{const[p,y]=R.useState(!1),v=tu(),T=R.useCallback(()=>y(!0),[]),b=R.useCallback(()=>y(!1),[]),_=R.useCallback(C=>{b(),a&&(C!=null&&C.id)&&v(a.replace(":id",C.id))},[b,v,a]),O=R.useCallback(()=>{b()},[b]);return x.jsxs(tp,{oneOfRoles:Jb.oneOfRoles,mode:Jb.mode,item:i,children:[x.jsx("button",{...d,onClick:T,children:s||"Vytvořit nový"}),p&&x.jsx(oB,{onOk:_,onCancel:O,item:c})]})},oB=({title:a="Nový předmět",onOk:i,onCancel:c,item:s,...d})=>{const p=ss(),y=Xu(),[v,T]=R.useState(()=>({id:crypto.randomUUID(),name:"Nový",semesters:[],...s})),[b,_]=R.useState(!1),[O,C]=R.useState(null),w=R.useCallback(q=>{var $,F,I;const G=(($=q==null?void 0:q.target)==null?void 0:$.id)||((F=q==null?void 0:q.target)==null?void 0:F.name),W=(I=q==null?void 0:q.target)==null?void 0:I.value;if(!G){console.warn("CreateDialog.handleChange: no field id",q);return}T(V=>({...V,[G]:W}))},[]),j=R.useCallback(q=>{w(q)},[w]),B=R.useCallback(q=>{T(G=>({...G,semesters:q}))},[]),U=R.useCallback(async()=>{var q,G,W,$;if(!v.programId){C(new Error("Musíte vybrat program"));return}_(!0),C(null);try{const F=await p(BD(v,y)),I=((q=F==null?void 0:F.data)==null?void 0:q.subjectInsert)||(F==null?void 0:F.subjectInsert)||F;if((I==null?void 0:I.failed)===!0||(G=I==null?void 0:I.__typename)!=null&&G.includes("Error"))throw new Error((I==null?void 0:I.msg)||"Nepodařilo se vytvořit předmět");const V=(I==null?void 0:I.id)||v.id,ye=(v.semesters||[]).filter(ce=>ce._action==="create");for(const ce of ye){const je=await p(Sx({id:ce.id,subjectId:V,order:ce.order},y)),xe=((W=je==null?void 0:je.data)==null?void 0:W.semesterInsert)||(je==null?void 0:je.semesterInsert)||je;((xe==null?void 0:xe.failed)===!0||($=xe==null?void 0:xe.__typename)!=null&&$.includes("Error"))&&console.error("Failed to create semester:",xe==null?void 0:xe.msg)}i&&i({...v,id:V})}catch(F){C(F)}finally{_(!1)}},[v,p,y,i]),k=b||!v.programId;return x.jsxs(Qb,{title:a,oklabel:b?"Ukládám...":"Ok",cancellabel:"Zrušit",onCancel:c,onOk:U,okDisabled:k,...d,children:[x.jsx(Ox,{item:v,onChange:w,onBlur:j,onSemestersChange:B}),!v.programId&&x.jsx("div",{className:"alert alert-warning mt-2",children:"Pro vytvoření předmětu musíte vybrat program."}),O&&x.jsx("div",{className:"alert alert-danger mt-2",children:(O==null?void 0:O.message)||"Chyba při ukládání"})]})},uB=({mutationAsyncAction:a=XD,DefaultContent:i=Ox,readItemURI:c=Zy,rbacitem:s,onOk:d,onCancel:p,...y})=>x.jsx(tp,{oneOfRoles:Jb.oneOfRoles,mode:Jb.mode,item:s,children:x.jsx(cB,{mutationAsyncAction:a,DefaultContent:i,readItemURI:c,onOk:d,onCancel:p,...y})}),cB=({mutationAsyncAction:a=XD,DefaultContent:i=Ox,readItemURI:c=Zy,onOk:s,onCancel:d,...p})=>{const y=tu(),v=ss(),T=Xu(),b=R.useMemo(()=>({id:crypto.randomUUID(),name:"Nový",semesters:[]}),[]),[_,O]=R.useState(b),[C,w]=R.useState(!1),[j,B]=R.useState(null),U=R.useCallback($=>{const F=$.target.name||$.target.id,I=$.target.value;O(V=>({...V,[F]:I}))},[]),k=R.useCallback(()=>{},[]),q=R.useCallback($=>{O(F=>({...F,semesters:$}))},[]),G=R.useCallback(async()=>{if(d){await d();return}y(-1)},[y,d]),W=R.useCallback(async()=>{var $,F,I,V;w(!0),B(null),console.log("CreateBodyWithSemesters: handleConfirm called"),console.log("CreateBodyWithSemesters: draft =",_),console.log("CreateBodyWithSemesters: draft.semesters =",_.semesters);try{const ye=await v(a(_,T)),ce=(($=ye==null?void 0:ye.data)==null?void 0:$.subjectInsert)||(ye==null?void 0:ye.subjectInsert)||ye;if(console.log("CreateBodyWithSemesters: subjectResponse =",ye),console.log("CreateBodyWithSemesters: subjectResult =",ce),(ce==null?void 0:ce.failed)===!0||(F=ce==null?void 0:ce.__typename)!=null&&F.includes("Error"))throw new Error((ce==null?void 0:ce.msg)||"Nepodařilo se vytvořit předmět");const je=(ce==null?void 0:ce.id)||_.id;console.log("CreateBodyWithSemesters: subjectId =",je);const xe=(_.semesters||[]).filter(Be=>Be._action==="create");console.log("CreateBodyWithSemesters: semestersToCreate =",xe);for(const Be of xe){console.log("CreateBodyWithSemesters: Creating semester =",Be);const $e=await v(Sx({id:Be.id,subjectId:je,order:Be.order},T));console.log("CreateBodyWithSemesters: semesterResponse =",$e);const Ge=((I=$e==null?void 0:$e.data)==null?void 0:I.semesterInsert)||($e==null?void 0:$e.semesterInsert)||$e;((Ge==null?void 0:Ge.failed)===!0||(V=Ge==null?void 0:Ge.__typename)!=null&&V.includes("Error"))&&console.error("Failed to create semester:",Ge==null?void 0:Ge.msg)}return s?await s(ce,_):c&&y&&y(c.replace(":id",je),{replace:!0}),ce}catch(ye){return B(ye),null}finally{w(!1)}},[v,_,T,a,y,s,c]);return x.jsx(x.Fragment,{children:x.jsxs(i,{item:_,onChange:U,onBlur:k,onSemestersChange:q,...p,children:[x.jsx(Pu,{error:j,loading:C}),x.jsx("button",{className:"btn btn-warning form-control",onClick:G,disabled:C,children:"Zrušit změny"}),x.jsx("button",{className:"btn btn-primary form-control",onClick:W,disabled:C,children:C?x.jsxs(x.Fragment,{children:[x.jsx("span",{className:"spinner-border spinner-border-sm me-2",role:"status","aria-hidden":"true"}),"Ukládám..."]}):"Uložit změny"})]})})},ID=a=>x.jsx(Rx,{...a}),ZD=HD,Ax={oneOfRoles:["administrátor"],mode:"absolute"},JD=({uriPattern:a=GD,...i})=>x.jsx(xD,{...i,uriPattern:a,...Ax}),sB=({DefaultContent:a=ID,mutationAsyncAction:i=ZD,...c})=>x.jsx(AD,{...c,DefaultContent:a,mutationAsyncAction:i,...Ax}),fB=({DefaultContent:a=ID,Dialog:i=sB,mutationAsyncAction:c=ZD,...s})=>x.jsx(OD,{...s,DefaultContent:a,Dialog:i,mutationAsyncAction:c,...Ax}),dB=({children:a})=>{const{item:i}=Wh();return i?x.jsx(xB,{item:i,children:a}):x.jsx(x.Fragment,{children:"Načítání..."})},hB=QD,pB=kD,Cx={oneOfRoles:["administrátor"],mode:"absolute"},FD=({vectorItemsURI:a=Tx,item:i,rbacitem:c,onOk:s,children:d,...p})=>{const[y,v]=R.useState(!1),T=tu(),b=R.useCallback(()=>v(!0),[]),_=R.useCallback(()=>v(!1),[]),O=R.useCallback(()=>{_(),s?s():a&&T(a)},[_,T,s,a]),C=R.useCallback(()=>{_()},[_]);return x.jsxs(tp,{oneOfRoles:Cx.oneOfRoles,mode:Cx.mode,item:c,children:[x.jsx("button",{...p,onClick:b,children:d||"Smazat"}),y&&x.jsx(mB,{item:i,onOk:O,onCancel:C,vectorItemsURI:a})]})},mB=({item:a,onOk:i,onCancel:c,...s})=>{var C;const d=ss(),p=Xu(),[y,v]=R.useState(!1),[T,b]=R.useState(null),_=((C=a==null?void 0:a.semesters)==null?void 0:C.length)||0,O=R.useCallback(async()=>{var w,j,B,U,k;v(!0),b(null);try{const q=(a==null?void 0:a.semesters)||[];for(const $ of q){if(!$.lastchange){console.warn("Semester missing lastchange, skipping:",$.id);continue}const F=await d(VD({id:$.id,lastchange:$.lastchange},p)),I=((w=F==null?void 0:F.data)==null?void 0:w.semesterDelete)||(F==null?void 0:F.semesterDelete)||F;if((I==null?void 0:I.failed)===!0)throw(j=I==null?void 0:I.msg)!=null&&j.includes("ForeignKey")||(B=I==null?void 0:I.msg)!=null&&B.includes("foreign key")||(U=I==null?void 0:I.msg)!=null&&U.includes("still referenced")?new Error(`Nelze smazat semestr #${$.order} - obsahuje klasifikace nebo jiná data. Nejdříve odstraňte všechna data ze semestru.`):new Error((I==null?void 0:I.msg)||"Nepodařilo se smazat semestr")}const G=await d(kD({id:a.id,lastchange:a.lastchange},p)),W=((k=G==null?void 0:G.data)==null?void 0:k.subjectDelete)||(G==null?void 0:G.subjectDelete)||G;if((W==null?void 0:W.failed)===!0)throw new Error((W==null?void 0:W.msg)||"Nepodařilo se smazat předmět");i&&i()}catch(q){b(q)}finally{v(!1)}},[d,p,a,i]);return x.jsxs(Qb,{title:"Smazat předmět",oklabel:y?"Mažu...":"Smazat",cancellabel:"Zrušit",onOk:O,onCancel:c,okDisabled:y,...s,children:[x.jsxs("div",{className:"mb-3",children:[x.jsxs("p",{children:["Opravdu chcete smazat předmět ",x.jsx("strong",{children:a==null?void 0:a.name}),"?"]}),_>0&&x.jsxs("div",{className:"alert alert-warning",children:[x.jsx("strong",{children:"Upozornění:"})," Tento předmět obsahuje ",_," ",_===1?"semestr":_<5?"semestry":"semestrů","."," ","Všechny semestry budou také smazány.",x.jsx("div",{className:"mt-2 small",children:"Pokud některý semestr obsahuje klasifikace nebo jiná data, smazání se nepodaří."})]})]}),T&&x.jsx("div",{className:"alert alert-danger",children:(T==null?void 0:T.message)||"Chyba při mazání"})]})},yB=({mutationAsyncAction:a=pB,DefaultContent:i=hB,vectorItemsURI:c=Tx,...s})=>x.jsx(u5,{...s,DefaultContent:i,mutationAsyncAction:a,vectorItemsURI:c,...Cx}),gB=({children:a,preserveHash:i=!0,preserveSearch:c=!0,...s})=>x.jsx(Ih,{to:xx,preserveHash:i,preserveSearch:c,...s,children:a}),vB=({item:a})=>x.jsxs(Zb,{item:a,title:"Nástroje",children:[x.jsx(gB,{className:"btn btn-outline-success",children:"Stránka"}),x.jsx(JD,{className:"btn btn-outline-success",item:a,children:"Upravit"}),x.jsx(fB,{className:"btn btn-outline-success",item:a,children:"Upravit Dialog"}),x.jsx(iB,{className:"btn btn-outline-success",rbacitem:{},children:"Vytvořit nový"}),x.jsx(FD,{className:"btn btn-outline-danger",item:a,children:"Odstranit"})]}),bB=({item:a,children:i,CardCapsule:c=Zb,MediumContent:s=QD})=>x.jsx(c,{item:a,children:x.jsxs(Qr,{children:[x.jsxs(SL,{children:[x.jsx(c,{item:a,title:"Detail",children:x.jsx(s,{item:a})}),x.jsx(vB,{item:a})]}),x.jsx(EL,{children:i})]})}),SB=({value:a,onChange:i,skip:c=0,limit:s=100,...d})=>{const[p,y]=R.useState([]),[v,T]=R.useState(!0),b=ss(),_=Xu();R.useEffect(()=>{(async()=>{try{T(!0);const w=await b(Y5({skip:c,limit:s},_)),j=w==null?void 0:w.data;j!=null&&j.programPage?y(j.programPage):console.warn("ProgramSelect: No programs found in response",w)}catch(w){console.error("ProgramSelect: Error fetching programs:",w)}finally{T(!1)}})()},[b,_,c,s]);const O=C=>{i&&i(C.target.value)};return v?x.jsx("select",{className:"form-select",disabled:!0,...d,children:x.jsx("option",{children:"Načítání programů..."})}):x.jsxs("select",{className:"form-select",onChange:O,value:a||"",...d,children:[x.jsx("option",{value:"",children:"-- Vyberte program --"}),p.map(C=>x.jsx("option",{value:C.id,children:C.name||C.nameEn||C.id},C.id))]})},EB=a=>{const i=parseInt(a,10)||0,c=Math.ceil(i/2),s=i%2===1;return`${c}. ročník ${s?"zimní":"letní"}`},TB=({semesters:a=[],subjectId:i,onSemestersChange:c=()=>null,disabled:s=!1})=>{const[d,p]=R.useState([]),[y,v]=R.useState({show:!1,semesterId:null,semesterOrder:null});R.useEffect(()=>{p([...a||[]])},[JSON.stringify(a)]);const T=[...d].sort((k,q)=>{const G=parseInt(k.order,10)||0,W=parseInt(q.order,10)||0;return G-W}),b=T.reduce((k,q)=>Math.max(k,q.order||0),0),_=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(k){const q=Math.random()*16|0;return(k==="x"?q:q&3|8).toString(16)}),O=R.useCallback(()=>{const k={id:_(),order:b+1,subjectId:i,_action:"create"},q=[...d,k];p(q),c(q)},[d,b,i,c]),C=R.useCallback(k=>{const q=d.find(G=>G.id===k);v({show:!0,semesterId:k,semesterOrder:q==null?void 0:q.order})},[d]),w=R.useCallback(()=>{v({show:!1,semesterId:null,semesterOrder:null})},[]),j=R.useCallback(k=>{const q=d.filter(G=>G.id!==k);p(q),c(q),v({show:!1,semesterId:null,semesterOrder:null})},[d,c]),B=R.useCallback(k=>{if(k<=0)return;const q=[...T],G=q[k].order,W=q[k-1].order;q[k]={...q[k],order:W},q[k-1]={...q[k-1],order:G},p(q),c(q)},[T,c]),U=R.useCallback(k=>{if(k>=T.length-1)return;const q=[...T],G=q[k].order,W=q[k+1].order;q[k]={...q[k],order:W},q[k+1]={...q[k+1],order:G},p(q),c(q)},[T,c]);return x.jsxs("div",{className:"mb-3",children:[x.jsxs(Xy,{id:"semesters",title:"Semestry",children:[T.length>0?x.jsx("div",{className:"mb-3",children:x.jsxs("table",{className:"table table-sm table-bordered",children:[x.jsx("thead",{className:"table-light",children:x.jsxs("tr",{children:[x.jsx("th",{style:{width:"70px"},children:"Pořadí"}),x.jsx("th",{style:{width:"140px"},children:"Název"}),x.jsx("th",{children:"ID"}),x.jsx("th",{style:{width:"120px"},children:"Akce"})]})}),x.jsx("tbody",{children:T.map((k,q)=>x.jsxs("tr",{children:[x.jsx("td",{children:k.order}),x.jsx("td",{children:EB(k.order)}),x.jsx("td",{children:x.jsx("small",{className:"text-muted",children:k.id})}),x.jsx("td",{children:x.jsxs("div",{className:"btn-group btn-group-sm",children:[x.jsx("button",{type:"button",className:"btn btn-outline-secondary",onClick:()=>B(q),disabled:s||q===0,title:"Posunout nahoru",children:"↑"}),x.jsx("button",{type:"button",className:"btn btn-outline-secondary",onClick:()=>U(q),disabled:s||q===T.length-1,title:"Posunout dolů",children:"↓"}),x.jsx("button",{type:"button",className:"btn btn-outline-danger",onClick:()=>C(k.id),disabled:s,title:"Odebrat semestr",children:"✕"})]})})]},k.id))})]})}):x.jsx("div",{className:"text-muted mb-3",children:"Žádné semestry"}),x.jsxs("button",{type:"button",className:"btn btn-sm btn-success",onClick:O,disabled:s,children:["+ Přidat nový semestr (pořadí: ",b+1,")"]})]}),y.show&&x.jsx("div",{className:"modal fade show d-block",tabIndex:"-1",style:{backgroundColor:"rgba(0,0,0,0.5)"},children:x.jsx("div",{className:"modal-dialog modal-dialog-centered",children:x.jsxs("div",{className:"modal-content",children:[x.jsxs("div",{className:"modal-header",children:[x.jsx("h5",{className:"modal-title",children:"Potvrzení smazání"}),x.jsx("button",{type:"button",className:"btn-close",onClick:w,"aria-label":"Zavřít"})]}),x.jsxs("div",{className:"modal-body",children:[x.jsxs("p",{children:["Opravdu chcete smazat semestr ",x.jsxs("strong",{children:["#",y.semesterOrder]}),"?"]}),x.jsxs("div",{className:"alert alert-warning mb-0",children:[x.jsx("strong",{children:"Upozornění:"})," Pokud semestr obsahuje klasifikace nebo jiná data, smazání se nepodaří a bude nutné nejprve odstranit všechna související data."]})]}),x.jsxs("div",{className:"modal-footer",children:[x.jsx("button",{type:"button",className:"btn btn-secondary",onClick:w,children:"Zrušit"}),x.jsx("button",{type:"button",className:"btn btn-danger",onClick:()=>j(y.semesterId),children:"Smazat semestr"})]})]})})})]})},Rx=({item:a,onChange:i=p=>null,onBlur:c=p=>null,onSemestersChange:s=p=>null,children:d})=>{const p=y=>{i({target:{id:"programId",value:y}})};return x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:"mb-3",label:"Program",children:[x.jsx("label",{htmlFor:"programId",className:"form-label",children:"Program"}),x.jsx(SB,{id:"programId",value:(a==null?void 0:a.programId)||"",onChange:p})]}),x.jsx(To,{id:"name",label:"Název",className:"form-control",value:(a==null?void 0:a.name)||"",onChange:i,onBlur:c}),x.jsx(To,{id:"nameEn",label:"Anglický název",className:"form-control",value:(a==null?void 0:a.nameEn)||"",onChange:i,onBlur:c}),x.jsx(Xy,{id:"description",title:"Popis",children:x.jsx("textarea",{id:"description",className:"form-control",rows:4,value:(a==null?void 0:a.description)||"",onChange:i,onBlur:c})}),x.jsx(Xy,{id:"descriptionEn",title:"Anglický popis",children:x.jsx("textarea",{id:"descriptionEn",className:"form-control",rows:4,value:(a==null?void 0:a.descriptionEn)||"",onChange:i,onBlur:c})}),x.jsx(TB,{semesters:a==null?void 0:a.semesters,subjectId:a==null?void 0:a.id,onSemestersChange:s}),d]})},xB=({item:a,children:i,mutationAsyncAction:c=HD,DefaultContent:s=Rx})=>{const{onChange:d}=Wh(),p=ss(),y=Xu(),[v,T]=R.useState((a==null?void 0:a.semesters)||[]),[b,_]=R.useState((a==null?void 0:a.semesters)||[]),[O,C]=R.useState(!1),[w,j]=R.useState(null),B=R.useRef(null),U=R.useRef(v);R.useEffect(()=>{U.current=v},[v]),R.useEffect(()=>{T((a==null?void 0:a.semesters)||[]),_((a==null?void 0:a.semesters)||[])},[a==null?void 0:a.id,a==null?void 0:a.semesters]);const{draft:k,setDraft:q,dirty:G,loading:W,error:$,autoSaveEnabled:F,toggleAutoSave:I,effectiveMode:V,onChange:ye,onBlur:ce,onCancel:je,onConfirm:xe}=SD(c,a,{mode:"live",defaultAutoSave:!0}),Be=R.useCallback(()=>{if(v.length!==b.length)return!0;const N=new Set(v.map(re=>re.id)),Z=new Set(b.map(re=>re.id));for(const re of Z)if(!N.has(re))return!0;for(const re of N)if(!Z.has(re))return!0;for(const re of b){const le=v.find(Te=>Te.id===re.id);if(le&&le.order!==re.order)return!0}return!1},[v,b]),$e=G||Be(),Ge=R.useCallback(async N=>{var re,le,Te,Ae,Me,Ke,Xe,rt;C(!0),j(null);const Z=[];try{const Le=U.current,Ve=new Map(Le.map(ot=>[ot.id,ot])),Ot=new Map(N.map(ot=>[ot.id,ot])),Qt=new Map(Le.map(ot=>[ot.id,ot.lastchange])),Rt=N.filter(ot=>ot._action==="create"),zt=Le.filter(ot=>!Ot.has(ot.id)&&!ot._action),rn=N.filter(ot=>{if(ot._action==="create")return!1;const He=Ve.get(ot.id);return He&&He.order!==ot.order});for(const ot of Rt){const He=await p(Sx({id:ot.id,subjectId:a.id,order:ot.order},y)),Zt=((re=He==null?void 0:He.data)==null?void 0:re.semesterInsert)||(He==null?void 0:He.semesterInsert)||He;Zt!=null&&Zt.id&&Qt.set(Zt.id,Zt.lastchange)}for(const ot of zt){const He=Qt.get(ot.id)||ot.lastchange;if(!He){console.error("Cannot delete semester - missing lastchange:",ot.id),Z.push(ot);continue}const Zt=await p(VD({id:ot.id,lastchange:He},y)),At=((le=Zt==null?void 0:Zt.data)==null?void 0:le.semesterDelete)||(Zt==null?void 0:Zt.semesterDelete)||Zt;if((At==null?void 0:At.failed)===!0){if((Te=At==null?void 0:At.msg)!=null&&Te.includes("ForeignKey")||(Ae=At==null?void 0:At.msg)!=null&&Ae.includes("foreign key")||(Me=At==null?void 0:At.msg)!=null&&Me.includes("still referenced")){Z.push(ot);continue}Z.push(ot);continue}}for(const ot of rn){const He=Qt.get(ot.id)||ot.lastchange||((Ke=Ve.get(ot.id))==null?void 0:Ke.lastchange);if(!He)throw console.error("Cannot update semester - missing lastchange:",ot.id),new Error("Nepodařilo se aktualizovat semestr - chybí lastchange");const Zt=await p(X5({id:ot.id,lastchange:He,subjectId:a.id,order:ot.order},y)),At=((Xe=Zt==null?void 0:Zt.data)==null?void 0:Xe.semesterUpdate)||(Zt==null?void 0:Zt.semesterUpdate)||Zt;if((rt=At==null?void 0:At.__typename)!=null&&rt.includes("Error")||(At==null?void 0:At.failed)===!0)throw new Error((At==null?void 0:At.msg)||"Nepodařilo se aktualizovat pořadí semestru");At!=null&&At.lastchange&&Qt.set(ot.id,At.lastchange)}let Sa=N.map(ot=>{const{_action:He,...Zt}=ot,At=Qt.get(ot.id);return At?{...Zt,lastchange:At}:Zt});for(const ot of Z)Sa.some(He=>He.id===ot.id)||Sa.push(ot);return Sa=Sa.sort((ot,He)=>(ot.order||0)-(He.order||0)),T(Sa),_(Sa),q(ot=>({...ot,semesters:Sa})),Z.length>0?(j(new Error("Nelze smazat semestr - obsahuje klasifikace nebo jiná data")),!1):!0}catch(Le){return _(U.current),q(Ve=>({...Ve,semesters:U.current})),j(Le),!1}finally{C(!1)}},[p,y,a==null?void 0:a.id,q]),Y=R.useCallback(N=>{_(N),q(Z=>({...Z,semesters:N})),V==="live"&&(B.current&&clearTimeout(B.current),B.current=setTimeout(()=>{Ge(N)},600))},[V,q,Ge]);R.useEffect(()=>()=>{B.current&&clearTimeout(B.current)},[]);const se=R.useCallback(async()=>{if(Be()&&!await Ge(b))return null;const N=await xe();return N&&await d({target:{value:N}}),N},[xe,d,Be,Ge,b]),Ee=R.useCallback(()=>{_(v),q(N=>({...N,semesters:v})),je()},[je,v,q]),Ne=W||O,fe=$||w;return x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:"d-flex justify-content-end align-items-center mb-3 p-2 bg-light rounded",children:[x.jsxs("div",{className:"form-check form-switch m-0 me-3",children:[x.jsx("input",{className:"form-check-input",type:"checkbox",role:"switch",id:"autoSaveSwitch",checked:F,onChange:I}),x.jsx("label",{className:"form-check-label",htmlFor:"autoSaveSwitch",children:"Automatické ukládání"})]}),V==="live"&&Ne&&x.jsxs("span",{className:"text-muted small",children:[x.jsx("span",{className:"spinner-border spinner-border-sm me-1",role:"status","aria-hidden":"true"}),"Ukládám..."]})]}),x.jsx(s,{item:{...k,semesters:b},onChange:ye,onBlur:ce,onSemestersChange:Y,children:i}),V==="confirm"&&x.jsxs("div",{className:"d-flex gap-2 mt-3",children:[x.jsx("button",{className:"btn btn-outline-secondary flex-grow-1",onClick:Ee,disabled:!$e||Ne,children:"Zrušit změny"}),x.jsx("button",{className:"btn btn-primary flex-grow-1",onClick:se,disabled:!$e||Ne,children:Ne?x.jsxs(x.Fragment,{children:[x.jsx("span",{className:"spinner-border spinner-border-sm me-2",role:"status","aria-hidden":"true"}),"Ukládám..."]}):"Uložit změny"})]}),fe&&x.jsx("div",{className:"alert alert-danger mt-2",children:(fe==null?void 0:fe.message)||"Chyba při ukládání"})]})},Fb=({queryAsyncAction:a=k5,PageNavbar:i=()=>null,ItemLayout:c=bB,SubPage:s=null,...d})=>x.jsx(E5,{queryAsyncAction:a,PageNavbar:i,ItemLayout:c,SubPage:s,...d}),_B=({children:a,PageNavbar:i=()=>null})=>x.jsxs(x.Fragment,{children:[x.jsx(i,{}),a]}),OB=({column:a,sortConfig:i,onSort:c})=>{const s=i.column===a,d=s?i.direction:null,p=()=>!s||d===null?"↕":d==="asc"?"↑":"↓",y=()=>!s||d===null?"Seřadit vzestupně":d==="asc"?"Seřadit sestupně":"Zrušit řazení";return x.jsx("button",{type:"button",className:`btn btn-sm ${s?"btn-primary":"btn-outline-secondary"} ms-1`,onClick:()=>c(a),title:y(),style:{padding:"0.1rem 0.3rem",fontSize:"0.75rem"},children:p()})},AB=({tableDef:a,sortConfig:i,onSort:c})=>{const s=["name","nameEn","program","semesters","lastchange"];return x.jsx("thead",{children:x.jsx("tr",{children:Object.entries(a).map(([d,{label:p}])=>x.jsxs("th",{children:[p,s.includes(d)&&x.jsx(OB,{column:d,sortConfig:i,onSort:c})]},d))})})},KD=(a,i)=>{var c,s;switch(i){case"name":return(a==null?void 0:a.name)||"";case"nameEn":return(a==null?void 0:a.nameEn)||"";case"program":return((c=a==null?void 0:a.program)==null?void 0:c.name)||(a==null?void 0:a.programId)||"";case"semesters":return((s=a==null?void 0:a.semesters)==null?void 0:s.length)||0;case"lastchange":return(a==null?void 0:a.lastchange)||"";default:return""}},CB=(a,i,c)=>{if(typeof a=="number"&&typeof i=="number")return c==="asc"?a-i:i-a;const s=String(a).toLowerCase(),d=String(i).toLowerCase(),p=parseFloat(s),y=parseFloat(d);return!isNaN(p)&&!isNaN(y)?c==="asc"?p-y:y-p:c==="asc"?s.localeCompare(d,"cs"):d.localeCompare(s,"cs")},RB=a=>!a||a.length===0?{}:{name:{label:"Název",component:({row:i})=>x.jsx("td",{children:x.jsx(Jy,{item:i,children:(i==null?void 0:i.name)||"Bez názvu"})})},nameEn:{label:"Anglický název",component:({row:i})=>x.jsx("td",{children:(i==null?void 0:i.nameEn)||""})},program:{label:"Program",component:({row:i})=>{var c;return x.jsx("td",{children:((c=i==null?void 0:i.program)==null?void 0:c.name)||(i==null?void 0:i.programId)||""})}},semesters:{label:"Semestrů",component:({row:i})=>{var c;return x.jsx("td",{children:((c=i==null?void 0:i.semesters)==null?void 0:c.length)||0})}},lastchange:{label:"Změněno",component:({row:i})=>x.jsx("td",{children:i==null?void 0:i.lastchange})},tools:{label:"Nástroje",component:({row:i})=>x.jsx("td",{children:x.jsx(RD,{actions:[{children:x.jsx(Jy,{className:"btn btn-sm btn-outline-secondary border-0 text-start w-100",item:i,children:"Detail"})},{children:x.jsx(JD,{className:"btn btn-sm btn-outline-secondary border-0 text-start w-100",item:i,action:"edit",children:"Editovat"})},{children:x.jsx(FD,{className:"btn btn-sm btn-outline-danger border-0 text-start w-100",item:i,rbacitem:i==null?void 0:i.rbacobject,children:"Smazat"})}]})})}},DB=({data:a})=>{const[i,c]=R.useState({column:null,direction:null}),s=R.useMemo(()=>RB(a),[a]),d=y=>{c(v=>v.column!==y?{column:y,direction:"asc"}:v.direction==="asc"?{column:y,direction:"desc"}:{column:null,direction:null})},p=R.useMemo(()=>!a||!i.column||!i.direction?a:[...a].sort((y,v)=>{const T=KD(y,i.column),b=KD(v,i.column);return CB(T,b,i.direction)}),[a,i]);return!a||a.length===0?null:x.jsx("div",{className:"table-responsive",children:x.jsxs("table",{className:"table table-stripped",children:[x.jsx(AB,{tableDef:s,sortConfig:i,onSort:d}),x.jsx(DD,{data:p,table_def:s})]})})},PD=R.createContext(null),np=()=>R.useContext(PD);function wB(a,i){if(!a||typeof a!="object"||Array.isArray(a))return!1;const c=Object.keys(a);return c.length===1&&c[0]===i&&Array.isArray(a[i])}function MB(a,i=[]){const c=i.filter(Boolean).filter(d=>Object.keys(d).length>0),s=[];for(const d of c)wB(d,a)?s.push(...d[a]):s.push(d);return s.length===0?{}:s.length===1?s[0]:{[a]:s}}const NB=({id:a,label:i,resetKey:c,join:s="_and",onChange:d=()=>null,children:p})=>{const y=np(),[v,T]=R.useState({}),[b,_]=R.useState(s),O=R.useCallback($=>{const{id:F,value:I}=$.target;T(V=>({...V,[F]:I}))},[]),C=R.useMemo(()=>Object.values(v).filter(Boolean).map(F=>!Array.isArray(F)||F.length===0?null:F.length===1?F[0]:{_and:F}).filter(Boolean),[v]),w=C.length>1,j=R.useMemo(()=>MB(b,C),[b,C]),B=R.useMemo(()=>a?{[a]:j}:j,[a,j]);R.useEffect(()=>{d({where:B})},[B,d]),R.useEffect(()=>{if(!(y!=null&&y.handleChange))return;const $=!B||typeof B=="object"&&Object.keys(B).length===0;return y.handleChange({target:{id:a??"__root__",value:$?null:[B]}}),()=>{y.handleChange({target:{id:a??"__root__",value:null}})}},[y,B,a]);const U=R.useCallback($=>{_($.target.value)},[]),k=R.useCallback(()=>B,[B]),[q,G]=R.useState(0),W=R.useCallback(()=>{T({}),_(s),G($=>$+1)},[s]);return x.jsx(PD.Provider,{value:{handleChange:O,readFilter:k,resetFilter:W},children:x.jsxs(au,{title:i||a||"where",children:[w&&x.jsxs(Qr,{children:[x.jsx(dn,{children:x.jsxs("label",{children:[x.jsx("input",{type:"radio",name:`join-${a??"root"}`,value:"_and",checked:b==="_and",onChange:U}),"_and"]})}),x.jsx(dn,{children:x.jsxs("label",{children:[x.jsx("input",{type:"radio",name:`join-${a??"root"}`,value:"_or",checked:b==="_or",onChange:U}),"_or"]})})]}),x.jsx("div",{children:p},c??q)]})})};function jB(a){return!a||typeof a!="object"?!0:Array.isArray(a)?a.length===0:Object.keys(a).length===0}function zB(a){return JSON.stringify(a)}const UB=({onClick:a,paramName:i="where",replace:c=!0,...s})=>{const d=np(),[p,y]=Y1(),v=R.useCallback(()=>{if(!(d!=null&&d.readFilter))throw Error("<FilterButton /> must be placed inside <Filter />");const T=new URLSearchParams(p);T.delete(i),a&&a({where:{}}),d.resetFilter&&d.resetFilter(),y(T,{replace:c})},[d,a,p,y,i,c]);return x.jsx("button",{...s,onClick:v})},LB=({onClick:a,paramName:i="where",replace:c=!0,...s})=>{const d=np(),[p,y]=Y1(),v=R.useCallback(()=>{if(!(d!=null&&d.readFilter))throw Error("<FilterButton /> must be placed inside <Filter />");const T=d.readFilter(),b={where:T};if(a)return a(b);const _=new URLSearchParams(p);jB(T)?_.delete(i):_.set(i,zB(T)),y(_,{replace:c})},[d,a,p,y,i,c]);return x.jsx("button",{...s,onClick:v})},BB=({id:a,label:i,initialValue:c="",initialOp:s="_ilike"})=>{const d=np();if(!d)throw Error("<StringFilter /> must be placed inside <Filter />");const[p,y]=R.useState(s),[v,T]=R.useState(c),[b,_]=R.useState(""),[O,C]=R.useState(""),w=R.useCallback(F=>{d.handleChange({target:{id:a,value:F}})},[d,a]),j=R.useCallback((F,I)=>{if(!I)return null;let V=I;return F==="_ilike"&&(V=I.includes("%")?I:`%${I}%`),[{[a]:{[F]:V}}]},[a]),B=R.useCallback((F,I)=>{const V=[];return F&&V.push({[a]:{_gt:F}}),I&&V.push({[a]:{_lt:I}}),V.length?V:null},[a]),U=R.useCallback(({nextOp:F=p,nextText:I=v,nextFrom:V=b,nextTo:ye=O})=>{w(F==="_between"?B(V,ye):j(F,I))},[p,v,b,O,w,j,B]),k=R.useCallback(F=>{const I=F.target.value;I!==p&&(y(I),U(I==="_between"?{nextOp:I}:{nextOp:I}))},[p,U]),q=R.useCallback(F=>{const I=F.target.value;I!==v&&(T(I),p!=="_between"&&U({nextText:I}))},[p,v,U]),G=R.useCallback(F=>{const I=F.target.value;I!==b&&(_(I),p==="_between"&&U({nextFrom:I}))},[p,b,U]),W=R.useCallback(F=>{const I=F.target.value;I!==O&&(C(I),p==="_between"&&U({nextTo:I}))},[p,O,U]),$=p==="_between";return x.jsx(au,{title:i||a,children:x.jsxs(Qr,{children:[x.jsx(dn,{children:x.jsxs("select",{className:"form-control",value:p,onChange:k,children:[x.jsx("option",{value:"Obsahuje",children:"_ilike"}),x.jsx("option",{value:"Začíná na",children:"_startswith"}),x.jsx("option",{value:"Končí na",children:"_endswith"}),x.jsx("option",{value:"Je rovno",children:"_eq"}),x.jsx("option",{value:"Je větší než",children:"_gt"}),x.jsx("option",{value:"Je menší než",children:"_lt"}),x.jsx("option",{value:"Mezi",children:"_between"})]})}),$?x.jsxs(x.Fragment,{children:[x.jsx(dn,{children:x.jsx(To,{className:"form-control",value:b,onChange:G,placeholder:"from…"})}),x.jsx(dn,{children:p==="_between"&&x.jsx(To,{className:"form-control",value:O,onChange:W,placeholder:"to…"})})]}):x.jsx(dn,{children:x.jsx(To,{className:"form-control",value:v,onChange:q})})]})})};function HB(a){const i=new Date(a);return Number.isNaN(i.getTime())?null:i.toISOString()}const kB=({id:a,label:i,initialOp:c="_gte",initialValue:s="",emitUtcIso:d=!0})=>{const p=np();if(!p)throw Error("<DateTimeFilter /> must be placed inside <Filter />");const[y,v]=R.useState(c),[T,b]=R.useState(s),[_,O]=R.useState(""),[C,w]=R.useState(""),j=R.useCallback(V=>V?d?HB(V):V:null,[d]),B=R.useCallback(V=>{p.handleChange({target:{id:a,value:V}})},[p,a]),U=R.useCallback((V,ye)=>{const ce=j(ye);return ce?[{[a]:{[V]:ce}}]:null},[a,j]),k=R.useCallback((V,ye)=>{const ce=[],je=j(V),xe=j(ye);return je&&ce.push({[a]:{_gt:je}}),xe&&ce.push({[a]:{_lt:xe}}),ce.length?ce:null},[a,j]),q=R.useCallback(({nextOp:V=y,nextText:ye=T,nextFrom:ce=_,nextTo:je=C})=>{B(V==="_between"?k(ce,je):U(V,ye))},[y,T,_,C,B,U,k]),G=R.useCallback(V=>{const ye=V.target.value;ye!==y&&(v(ye),q({nextOp:ye}))},[y,q]),W=R.useCallback(V=>{const ye=V.target.value;ye!==T&&(b(ye),y!=="_between"&&q({nextText:ye}))},[y,T,q]),$=R.useCallback(V=>{const ye=V.target.value;ye!==_&&(O(ye),y==="_between"&&q({nextFrom:ye}))},[y,_,q]),F=R.useCallback(V=>{const ye=V.target.value;ye!==C&&(w(ye),y==="_between"&&q({nextTo:ye}))},[y,C,q]),I=y==="_between";return x.jsx(au,{title:i||a,children:x.jsxs(Qr,{children:[x.jsx(dn,{children:x.jsxs("select",{className:"form-control",value:y,onChange:G,children:[x.jsx("option",{value:"_eq",children:"_eq"}),x.jsx("option",{value:"_gt",children:"_gt"}),x.jsx("option",{value:"_gte",children:"_gte"}),x.jsx("option",{value:"_lt",children:"_lt"}),x.jsx("option",{value:"_lte",children:"_lte"}),x.jsx("option",{value:"_between",children:"_between"})]})}),I?x.jsxs(x.Fragment,{children:[x.jsx(dn,{children:x.jsx(To,{className:"form-control",type:"datetime-local",value:_,onChange:$,placeholder:"from…"})}),x.jsx(dn,{children:x.jsx(To,{className:"form-control",type:"datetime-local",value:C,onChange:F,placeholder:"to…"})})]}):x.jsx(dn,{children:x.jsx(To,{className:"form-control",type:"datetime-local",value:T,onChange:W})})]})})},WD=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,VB=({id:a,label:i,initialValue:c=""})=>{const s=np();if(!s)throw Error("<UUIDFilter /> must be placed inside <Filter />");const[d,p]=R.useState(c),y=R.useMemo(()=>(d??"").trim(),[d]),T=y.length===0?!0:WD.test(y),b=R.useCallback(C=>{s.handleChange({target:{id:a,value:C}})},[s,a]),_=R.useCallback(C=>{const w=(C??"").trim();if(!w){b(null);return}if(!WD.test(w)){b(null);return}b([{[a]:{_eq:w}}])},[a,b]),O=R.useCallback(C=>{const w=C.target.value;w!==d&&(p(w),_(w))},[d,_]);return x.jsx(au,{title:i||a,children:x.jsxs(Qr,{children:[x.jsx(dn,{style:{minWidth:80},children:x.jsx("span",{style:{opacity:.7},children:"(_eq)"})}),x.jsxs(dn,{children:[x.jsx(To,{className:`form-control ${T?"":"is-invalid"}`,value:d,onChange:O,placeholder:"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}),!T&&x.jsx("div",{className:"invalid-feedback",style:{display:"block"},children:"Neplatné UUID. Očekávám formát 8-4-4-4-12 hex (např. 550e8400-e29b-41d4-a716-446655440000)."})]})]})})},qB=({id:a,onChange:i,children:c})=>x.jsxs(NB,{id:a,onChange:i,children:[x.jsx(VB,{id:"id"}),x.jsx(BB,{id:"name"}),x.jsx(kB,{id:"created",emitUtcIso:!1}),c]}),$B=({collapsed:a=!0,children:i,buttonLabel:c,buttonLabelCollapsed:s="Zobrazit",buttonLabelExpanded:d="Skrýt",onToggle:p,...y})=>{const[v,T]=R.useState(a);R.useEffect(()=>{T(a)},[a]);const b=R.useCallback(()=>{T(O=>{const C=!O;return p==null||p(C),C})},[p]),_=c??(v?s:d);return x.jsxs(x.Fragment,{children:[x.jsx("div",{hidden:v,"aria-hidden":v,children:i}),x.jsx("button",{type:"button",...y,onClick:b,"aria-expanded":!v,children:_})]})};function YB(a,i="where"){const c=a.get(i);if(!c)return null;try{const s=JSON.parse(c);return s&&typeof s=="object"?s:null}catch{return null}}const Dx="gr_where",e2=({children:a,queryAsyncAction:i=q5})=>{const[c]=Y1(),s=R.useMemo(()=>YB(c,Dx),[c.toString()]),{items:d,loading:p,error:y,hasMore:v,sentinelRef:T,loadMore:b,restart:_}=W5({asyncAction:i,actionParams:{skip:0,limit:25,where:s}});return R.useEffect(()=>{_({skip:0,limit:25,where:s})},[s]),x.jsxs(_B,{children:[x.jsx($B,{className:"form-control btn btn-outline-primary",buttonLabelCollapsed:"Zobrazit filtr",buttonLabelExpanded:"Skrýt filtr",children:x.jsxs(qB,{children:[x.jsx(LB,{className:"form-control btn btn-outline-success",paramName:Dx,children:"Filtrovat"}),x.jsx(UB,{className:"form-control btn btn-warning",paramName:Dx,children:"Vymazat filtr"})]})}),x.jsx(DB,{data:d}),x.jsx(Pu,{error:y,loading:p,text:"Nahrávám další..."}),v&&x.jsx("div",{ref:T,style:{height:80,backgroundColor:"lightgray"}}),v&&x.jsx("button",{className:"btn btn-success form-control",onClick:()=>b(),children:"Více"})]})},GB=({SubPage:a=dB,...i})=>x.jsx(Fb,{SubPage:a,...i}),QB=({...a})=>x.jsxs(Qr,{children:[x.jsx(o6,{}),x.jsx(C6,{children:x.jsx(uB,{...a})})]}),XB=({SubPage:a=QB,...i})=>x.jsx(Fb,{SubPage:a,...i}),IB=a=>{const i=parseInt(a,10)||0,c=Math.ceil(i/2),s=i%2===1;return`${c}. ročník ${s?"zimní":"letní"}`},ZB=({item:a})=>{var i,c,s;return x.jsxs(x.Fragment,{children:[x.jsxs(Zb,{item:a,title:"Program",children:[x.jsx(Hl,{label:"Název",children:(i=a==null?void 0:a.program)==null?void 0:i.name}),x.jsx(Hl,{label:"ID",children:x.jsx("a",{href:`/program/ProgramGQLModel/${(c=a==null?void 0:a.program)==null?void 0:c.id}`,children:(s=a==null?void 0:a.program)==null?void 0:s.id})})]}),x.jsx(Zb,{title:"Semestry",children:x.jsxs("table",{className:"table table-sm",children:[x.jsx("thead",{children:x.jsxs("tr",{children:[x.jsx("th",{children:"Pořadí"}),x.jsx("th",{children:"Název"}),x.jsx("th",{children:"ID"}),x.jsx("th",{children:"Last change"})]})}),x.jsx("tbody",{children:[...a.semesters].sort((d,p)=>(parseInt(d.order,10)||0)-(parseInt(p.order,10)||0)).map(d=>x.jsxs("tr",{children:[x.jsx("td",{children:d.order}),x.jsx("td",{children:IB(d.order)}),x.jsx("td",{children:x.jsx("a",{href:`/semestr/SemesterGQLModel/${d.id}`,children:d.id})}),x.jsx("td",{children:a.lastchange})]},d.id))})]})})]})},t2=({SubPage:a=ZB,...i})=>x.jsx(Fb,{SubPage:a,...i}),JB=({SubPage:a=yB,...i})=>x.jsx(Fb,{SubPage:a,...i}),FB=[{path:eB,element:x.jsx(XB,{})},{path:xx,element:x.jsx(e2,{})},{path:Zy,element:x.jsx(t2,{})},{path:GD,element:x.jsx(GB,{})},{path:lB,element:x.jsx(JB,{})},{path:xx.replace("list",":any"),element:x.jsx(e2,{})},{path:Zy.replace("view",":any"),element:x.jsx(t2,{})}],wx=()=>null,KB=({indexUrl:a,item:i,children:c,handleSearchChange:s,HomeButton:d=wx,PersonButton:p=wx,SearchBox:y=wx})=>x.jsxs(Ub,{bg:"light",expand:"lg",children:[x.jsx(Ub.Toggle,{"aria-controls":"basic-navbar-nav"}),x.jsx(Ub.Collapse,{id:"basic-navbar-nav",children:x.jsxs(j4,{variant:"tabs",className:"align-items-center w-100 flex-column flex-lg-row",children:[x.jsx(d,{indexURL:a}),x.jsx("div",{className:"mx-auto d-flex align-items-center flex-column flex-lg-row mb-0",children:c}),x.jsx("div",{className:"d-flex flex-column flex-lg-row align-items-center ml-lg-auto",children:x.jsx(y,{handleSearchChange:s})}),x.jsx(p,{item:i})]})})]}),PB=()=>{const{id:a}=Yf(),i=Z1(c=>bT(c,a))||{};return x.jsx(KB,{item:i})},WB=()=>x.jsxs(G4,{children:[x.jsx(PB,{}),x.jsx(X4,{}),x.jsx(yj,{})]}),e8=[{path:"/",element:x.jsx(WB,{}),children:[...FB,...A5]}],t8=$j(e8),n8=()=>x.jsx(ez,{router:t8}),a8="/api/gql",l8=({GQLENDPOINT:a=a8})=>x.jsx(FU,{clientOptions:{endpoint:a},children:x.jsx(n8,{})});function n2(a,i={}){if(!a)throw new Error("MyApp.mount: missing mount element");console.log("inside mount, doing to render"),AM.createRoot(a).render(x.jsx(l8,{...i})),console.log("inside mount, render finished")}return typeof window<"u"&&(window.MyApp={mount:n2}),g1.mount=n2,Object.defineProperty(g1,Symbol.toStringTag,{value:"Module"}),g1})({});
1022
+ `),VD=Ia(I5),Z5=(a=[],i=[])=>{const c=new Map;return a.forEach(s=>(s==null?void 0:s.id)!=null&&c.set(s.id,s)),i.forEach(s=>(s==null?void 0:s.id)!=null&&c.set(s.id,s)),Array.from(c.values())},J5=a=>{const i={...a,skip:(a.skip||0)+(a.limit||10),limit:a.limit||10};return console.log("newFilter",i),i},F5=a=>{const i=a!=null&&a.data?a.data:a,c=i?Object.values(i):[];let s=c==null?void 0:c[0];return Array.isArray(s)||(s=c.find(d=>Array.isArray(d)),Array.isArray(s))?s:[]},K5=a=>{if(!a)return!1;const i=a.getBoundingClientRect();return i.top<window.innerHeight&&i.bottom>0},P5=()=>null,W5=({preloadedItems:a,actionParams:i,asyncAction:c,calculateNewFilter:s=J5,reset:d=0,onAll:p=P5,enabled:y=!0,autoload:v=!0}={})=>{const T=ss(),b=Xu();if(typeof c!="function")throw Error("useInfiniteScroll.asyncAction must be a function, typically pageRead");const _=R.useMemo(()=>({...i||{}}),[i]),[O,C]=R.useState(()=>({filter:_,loading:!1,hasMore:!0,error:null,items:a,result:null})),w=R.useRef(0),j=R.useRef(!1),B=R.useRef(O);R.useEffect(()=>{B.current=O},[O]);const U=R.useRef(_);R.useEffect(()=>{U.current=O.filter},[O.filter]);const k=R.useRef(y);R.useEffect(()=>{k.current=y},[y]),R.useEffect(()=>{C(F=>({...F,items:a}))},[a]),R.useEffect(()=>{C(F=>({...F,filter:{...i||{}},loading:!1,hasMore:!0,error:null,items:[]}))},[d]);const q=R.useCallback(async()=>{if(!k.current||j.current)return null;j.current=!0;const F=w.current;try{const I=B.current;if(I.loading||!I.hasMore)return null;C(je=>({...je,loading:!0,error:null}));const V=U.current,ye=await T(c(V,b)),ce=F5(ye);return w.current!==F?null:(C(je=>{const xe=Z5(je.items,ce),Be=ce.length,$e=(V&&V.limit!=null?V.limit:void 0)??(je.filter&&je.filter.limit!=null?je.filter.limit:void 0),Ge=$e==null?Be>0:Be===$e;Ge||p();const Y=Ge?(()=>{const se={fetched:ce,fetchedCount:Be,limit:$e,params:V,result:ye};return(s.length>=2?s(je.filter,se):s(je.filter))??je.filter})():je.filter;return U.current=Y,{...je,items:xe,filter:Y,hasMore:Ge,loading:!1,result:ye}}),ye)}catch(I){return w.current===F&&C(V=>({...V,loading:!1,hasMore:!1,error:I})),null}finally{j.current=!1}},[T,c,b,p,s]),G=R.useCallback(async(F={})=>{w.current+=1,j.current=!1;const I={...F||{}};return U.current=I,C(V=>({...V,filter:I,loading:!1,hasMore:!0,error:null,items:[],result:null})),await new Promise(V=>requestAnimationFrame(V)),q()},[q]),W=R.useRef(null),$=R.useCallback(F=>{W.current=F},[]);return R.useEffect(()=>{const F=W.current;if(!y||!F)return;const I=new IntersectionObserver(([ce])=>{ce.isIntersecting&&k.current&&q()});I.observe(F);let V=!1;return(async()=>{if(v)for(await new Promise(ce=>requestAnimationFrame(ce)),await new Promise(ce=>setTimeout(ce,0));!V&&k.current;){const ce=B.current;if(ce.loading||!ce.hasMore||!K5(F))break;await q(),await new Promise(je=>requestAnimationFrame(je))}})(),()=>{V=!0,I.disconnect()}},[y,v,q,d]),{items:O.items,loading:O.loading,error:O.error,hasMore:O.hasMore,filter:O.filter,result:O.result,loadMore:q,restart:G,sentinelRef:$}},Ex=a=>String(a??"").replace(/^\/+|\/+$/g,""),qD=({app:a="_",model:i="_",action:c="view",withId:s=!1,idParam:d=":id"}={})=>{const p={app:Ex(a),model:Ex(i),action:Ex(c),withId:!!s,idParam:String(d).startsWith(":")?String(d):`:${String(d)}`},y=`/${p.app}/${p.model}/${p.action}`.replace(/\/+/g,"/"),v=p.withId?`${y}/${p.idParam}`:y,T={path:v,segments:p,toString(){return v},valueOf(){return v},[Symbol.toPrimitive](){return v},change(b={}){return qD({...p,...b})},app(b){return T.change({app:b})},model(b){return T.change({model:b})},action(b){return T.change({action:b})},id(b=!0){return T.change({withId:b})},idParam(b=":id"){return T.change({idParam:b})}};return T},$D="/subject";qD({app:$D});const Iy=`${$D}/SubjectGQLModel`,Tx=`${Iy}/list/`,eB=`${Iy}/create/`,tB=`${Iy}/view/`,nB=`${Iy}/edit/`,aB=`${Iy}/delete/`,YD=tB,xx=Tx,_x=":id",Zy=`${YD}${_x}`,GD=`${nB}${_x}`,lB=`${aB}${_x}`,Jy=({item:a,LinkURI:i=YD,action:c="view",children:s,...d})=>{const p=i.replace("view",c);return x.jsx(Ih,{to:p+(a==null?void 0:a.id),...d,children:s||(a==null?void 0:a.fullname)||(a==null?void 0:a.name)||(a==null?void 0:a.id)||"Nevim"})};I4("SubjectGQLModel",Jy);const Zb=({item:a,children:i,title:c=null})=>(c||(c=x.jsxs(x.Fragment,{children:[x.jsx(gD,{})," ",x.jsx(Jy,{item:a})]})),x.jsx(gl,{title:c,children:i})),QD=({item:a,children:i})=>{var c,s,d,p,y,v,T,b,_;return console.log("item",a),x.jsxs(x.Fragment,{children:[(a==null?void 0:a.name)&&x.jsx(Hl,{label:"Název",children:x.jsx(Jy,{item:a})}),(a==null?void 0:a.nameEn)&&x.jsx(Hl,{label:"Anglický název",children:a.nameEn}),(a==null?void 0:a.description)&&x.jsx(Hl,{label:"Popis",children:a.description}),(a==null?void 0:a.descriptionEn)&&x.jsx(Hl,{label:"Anglický popis",children:a.descriptionEn}),(((c=a==null?void 0:a.program)==null?void 0:c.name)||((s=a==null?void 0:a.program)==null?void 0:s.id))&&x.jsx(Hl,{label:"Program",children:x.jsx("a",{href:`/program/ProgramGQLModel/${(d=a==null?void 0:a.program)==null?void 0:d.id}`,children:((p=a==null?void 0:a.program)==null?void 0:p.name)||((y=a==null?void 0:a.program)==null?void 0:y.id)})}),((T=(v=a==null?void 0:a.rbacobject)==null?void 0:v.currentUserRoles)==null?void 0:T.length)>0&&x.jsx(Hl,{label:"Moje role",children:a.rbacobject.currentUserRoles.map(O=>{var C;return x.jsx("span",{className:"badge bg-secondary me-1",children:(C=O.roletype)==null?void 0:C.name},O.id)})}),x.jsx("hr",{}),((b=a==null?void 0:a.createdby)==null?void 0:b.fullname)&&x.jsx(Hl,{label:"Vytvořil",children:a.createdby.fullname}),(a==null?void 0:a.created)&&x.jsx(Hl,{label:"Vytvořeno",children:kb(a.created)}),(a==null?void 0:a.lastchange)&&x.jsx(Hl,{label:"Změněno",children:kb(a.lastchange)}),((_=a==null?void 0:a.changedby)==null?void 0:_.fullname)&&x.jsx(Hl,{label:"Změnil",children:a.changedby.fullname}),i]})},Ox=a=>x.jsx(Rx,{...a}),XD=BD,Jb={oneOfRoles:["administrátor"],mode:"absolute"},rB={name:"Nový"},iB=({readItemURI:a=Zy,rbacitem:i,item:c=rB,children:s,...d})=>{const[p,y]=R.useState(!1),v=tu(),T=R.useCallback(()=>y(!0),[]),b=R.useCallback(()=>y(!1),[]),_=R.useCallback(C=>{b(),a&&(C!=null&&C.id)&&v(a.replace(":id",C.id))},[b,v,a]),O=R.useCallback(()=>{b()},[b]);return x.jsxs(tp,{oneOfRoles:Jb.oneOfRoles,mode:Jb.mode,item:i,children:[x.jsx("button",{...d,onClick:T,children:s||"Vytvořit nový"}),p&&x.jsx(oB,{onOk:_,onCancel:O,item:c})]})},oB=({title:a="Nový předmět",onOk:i,onCancel:c,item:s,...d})=>{const p=ss(),y=Xu(),[v,T]=R.useState(()=>({id:crypto.randomUUID(),name:"Nový",semesters:[],...s})),[b,_]=R.useState(!1),[O,C]=R.useState(null),w=R.useCallback(q=>{var $,F,I;const G=(($=q==null?void 0:q.target)==null?void 0:$.id)||((F=q==null?void 0:q.target)==null?void 0:F.name),W=(I=q==null?void 0:q.target)==null?void 0:I.value;if(!G){console.warn("CreateDialog.handleChange: no field id",q);return}T(V=>({...V,[G]:W}))},[]),j=R.useCallback(q=>{w(q)},[w]),B=R.useCallback(q=>{T(G=>({...G,semesters:q}))},[]),U=R.useCallback(async()=>{var q,G,W,$;if(!v.programId){C(new Error("Musíte vybrat program"));return}_(!0),C(null);try{const F=await p(BD(v,y)),I=((q=F==null?void 0:F.data)==null?void 0:q.subjectInsert)||(F==null?void 0:F.subjectInsert)||F;if((I==null?void 0:I.failed)===!0||(G=I==null?void 0:I.__typename)!=null&&G.includes("Error"))throw new Error((I==null?void 0:I.msg)||"Nepodařilo se vytvořit předmět");const V=(I==null?void 0:I.id)||v.id,ye=(v.semesters||[]).filter(ce=>ce._action==="create");for(const ce of ye){const je=await p(Sx({id:ce.id,subjectId:V,order:ce.order},y)),xe=((W=je==null?void 0:je.data)==null?void 0:W.semesterInsert)||(je==null?void 0:je.semesterInsert)||je;((xe==null?void 0:xe.failed)===!0||($=xe==null?void 0:xe.__typename)!=null&&$.includes("Error"))&&console.error("Failed to create semester:",xe==null?void 0:xe.msg)}i&&i({...v,id:V})}catch(F){C(F)}finally{_(!1)}},[v,p,y,i]),k=b||!v.programId;return x.jsxs(Qb,{title:a,oklabel:b?"Ukládám...":"Ok",cancellabel:"Zrušit",onCancel:c,onOk:U,okDisabled:k,...d,children:[x.jsx(Ox,{item:v,onChange:w,onBlur:j,onSemestersChange:B}),!v.programId&&x.jsx("div",{className:"alert alert-warning mt-2",children:"Pro vytvoření předmětu musíte vybrat program."}),O&&x.jsx("div",{className:"alert alert-danger mt-2",children:(O==null?void 0:O.message)||"Chyba při ukládání"})]})},uB=({mutationAsyncAction:a=XD,DefaultContent:i=Ox,readItemURI:c=Zy,rbacitem:s,onOk:d,onCancel:p,...y})=>x.jsx(tp,{oneOfRoles:Jb.oneOfRoles,mode:Jb.mode,item:s,children:x.jsx(cB,{mutationAsyncAction:a,DefaultContent:i,readItemURI:c,onOk:d,onCancel:p,...y})}),cB=({mutationAsyncAction:a=XD,DefaultContent:i=Ox,readItemURI:c=Zy,onOk:s,onCancel:d,...p})=>{const y=tu(),v=ss(),T=Xu(),b=R.useMemo(()=>({id:crypto.randomUUID(),name:"Nový",semesters:[]}),[]),[_,O]=R.useState(b),[C,w]=R.useState(!1),[j,B]=R.useState(null),U=R.useCallback($=>{const F=$.target.name||$.target.id,I=$.target.value;O(V=>({...V,[F]:I}))},[]),k=R.useCallback(()=>{},[]),q=R.useCallback($=>{O(F=>({...F,semesters:$}))},[]),G=R.useCallback(async()=>{if(d){await d();return}y(-1)},[y,d]),W=R.useCallback(async()=>{var $,F,I,V;w(!0),B(null),console.log("CreateBodyWithSemesters: handleConfirm called"),console.log("CreateBodyWithSemesters: draft =",_),console.log("CreateBodyWithSemesters: draft.semesters =",_.semesters);try{const ye=await v(a(_,T)),ce=(($=ye==null?void 0:ye.data)==null?void 0:$.subjectInsert)||(ye==null?void 0:ye.subjectInsert)||ye;if(console.log("CreateBodyWithSemesters: subjectResponse =",ye),console.log("CreateBodyWithSemesters: subjectResult =",ce),(ce==null?void 0:ce.failed)===!0||(F=ce==null?void 0:ce.__typename)!=null&&F.includes("Error"))throw new Error((ce==null?void 0:ce.msg)||"Nepodařilo se vytvořit předmět");const je=(ce==null?void 0:ce.id)||_.id;console.log("CreateBodyWithSemesters: subjectId =",je);const xe=(_.semesters||[]).filter(Be=>Be._action==="create");console.log("CreateBodyWithSemesters: semestersToCreate =",xe);for(const Be of xe){console.log("CreateBodyWithSemesters: Creating semester =",Be);const $e=await v(Sx({id:Be.id,subjectId:je,order:Be.order},T));console.log("CreateBodyWithSemesters: semesterResponse =",$e);const Ge=((I=$e==null?void 0:$e.data)==null?void 0:I.semesterInsert)||($e==null?void 0:$e.semesterInsert)||$e;((Ge==null?void 0:Ge.failed)===!0||(V=Ge==null?void 0:Ge.__typename)!=null&&V.includes("Error"))&&console.error("Failed to create semester:",Ge==null?void 0:Ge.msg)}return s?await s(ce,_):c&&y&&y(c.replace(":id",je),{replace:!0}),ce}catch(ye){return B(ye),null}finally{w(!1)}},[v,_,T,a,y,s,c]);return x.jsx(x.Fragment,{children:x.jsxs(i,{item:_,onChange:U,onBlur:k,onSemestersChange:q,...p,children:[x.jsx(Pu,{error:j,loading:C}),x.jsx("button",{className:"btn btn-warning form-control",onClick:G,disabled:C,children:"Zrušit změny"}),x.jsx("button",{className:"btn btn-primary form-control",onClick:W,disabled:C,children:C?x.jsxs(x.Fragment,{children:[x.jsx("span",{className:"spinner-border spinner-border-sm me-2",role:"status","aria-hidden":"true"}),"Ukládám..."]}):"Uložit změny"})]})})},ID=a=>x.jsx(Rx,{...a}),ZD=HD,Ax={oneOfRoles:["administrátor"],mode:"absolute"},JD=({uriPattern:a=GD,...i})=>x.jsx(xD,{...i,uriPattern:a,...Ax}),sB=({DefaultContent:a=ID,mutationAsyncAction:i=ZD,...c})=>x.jsx(AD,{...c,DefaultContent:a,mutationAsyncAction:i,...Ax}),fB=({DefaultContent:a=ID,Dialog:i=sB,mutationAsyncAction:c=ZD,...s})=>x.jsx(OD,{...s,DefaultContent:a,Dialog:i,mutationAsyncAction:c,...Ax}),dB=({children:a})=>{const{item:i}=Wh();return i?x.jsx(xB,{item:i,children:a}):x.jsx(x.Fragment,{children:"Načítání..."})},hB=QD,pB=kD,Cx={oneOfRoles:["administrátor"],mode:"absolute"},FD=({vectorItemsURI:a=Tx,item:i,rbacitem:c,onOk:s,children:d,...p})=>{const[y,v]=R.useState(!1),T=tu(),b=R.useCallback(()=>v(!0),[]),_=R.useCallback(()=>v(!1),[]),O=R.useCallback(()=>{_(),s?s():a&&T(a)},[_,T,s,a]),C=R.useCallback(()=>{_()},[_]);return x.jsxs(tp,{oneOfRoles:Cx.oneOfRoles,mode:Cx.mode,item:c,children:[x.jsx("button",{...p,onClick:b,children:d||"Smazat"}),y&&x.jsx(mB,{item:i,onOk:O,onCancel:C,vectorItemsURI:a})]})},mB=({item:a,onOk:i,onCancel:c,...s})=>{var C;const d=ss(),p=Xu(),[y,v]=R.useState(!1),[T,b]=R.useState(null),_=((C=a==null?void 0:a.semesters)==null?void 0:C.length)||0,O=R.useCallback(async()=>{var w,j,B,U,k;v(!0),b(null);try{const q=(a==null?void 0:a.semesters)||[];for(const $ of q){if(!$.lastchange){console.warn("Semester missing lastchange, skipping:",$.id);continue}const F=await d(VD({id:$.id,lastchange:$.lastchange},p)),I=((w=F==null?void 0:F.data)==null?void 0:w.semesterDelete)||(F==null?void 0:F.semesterDelete)||F;if((I==null?void 0:I.failed)===!0)throw(j=I==null?void 0:I.msg)!=null&&j.includes("ForeignKey")||(B=I==null?void 0:I.msg)!=null&&B.includes("foreign key")||(U=I==null?void 0:I.msg)!=null&&U.includes("still referenced")?new Error(`Nelze smazat semestr #${$.order} - obsahuje klasifikace nebo jiná data. Nejdříve odstraňte všechna data ze semestru.`):new Error((I==null?void 0:I.msg)||"Nepodařilo se smazat semestr")}const G=await d(kD({id:a.id,lastchange:a.lastchange},p)),W=((k=G==null?void 0:G.data)==null?void 0:k.subjectDelete)||(G==null?void 0:G.subjectDelete)||G;if((W==null?void 0:W.failed)===!0)throw new Error((W==null?void 0:W.msg)||"Nepodařilo se smazat předmět");i&&i()}catch(q){b(q)}finally{v(!1)}},[d,p,a,i]);return x.jsxs(Qb,{title:"Smazat předmět",oklabel:y?"Mažu...":"Smazat",cancellabel:"Zrušit",onOk:O,onCancel:c,okDisabled:y,...s,children:[x.jsxs("div",{className:"mb-3",children:[x.jsxs("p",{children:["Opravdu chcete smazat předmět ",x.jsx("strong",{children:a==null?void 0:a.name}),"?"]}),_>0&&x.jsxs("div",{className:"alert alert-warning",children:[x.jsx("strong",{children:"Upozornění:"})," Tento předmět obsahuje ",_," ",_===1?"semestr":_<5?"semestry":"semestrů","."," ","Všechny semestry budou také smazány.",x.jsx("div",{className:"mt-2 small",children:"Pokud některý semestr obsahuje klasifikace nebo jiná data, smazání se nepodaří."})]})]}),T&&x.jsx("div",{className:"alert alert-danger",children:(T==null?void 0:T.message)||"Chyba při mazání"})]})},yB=({mutationAsyncAction:a=pB,DefaultContent:i=hB,vectorItemsURI:c=Tx,...s})=>x.jsx(u5,{...s,DefaultContent:i,mutationAsyncAction:a,vectorItemsURI:c,...Cx}),gB=({children:a,preserveHash:i=!0,preserveSearch:c=!0,...s})=>x.jsx(Ih,{to:xx,preserveHash:i,preserveSearch:c,...s,children:a}),vB=({item:a})=>x.jsxs(Zb,{item:a,title:"Nástroje",children:[x.jsx(gB,{className:"btn btn-outline-success",children:"Stránka"}),x.jsx(JD,{className:"btn btn-outline-success",item:a,children:"Upravit"}),x.jsx(fB,{className:"btn btn-outline-success",item:a,children:"Upravit Dialog"}),x.jsx(iB,{className:"btn btn-outline-success",rbacitem:{},children:"Vytvořit nový"}),x.jsx(FD,{className:"btn btn-outline-danger",item:a,children:"Odstranit"})]}),bB=({item:a,children:i,CardCapsule:c=Zb,MediumContent:s=QD})=>x.jsx(c,{item:a,children:x.jsxs(Qr,{children:[x.jsxs(SL,{children:[x.jsx(c,{item:a,title:"Detail",children:x.jsx(s,{item:a})}),x.jsx(vB,{item:a})]}),x.jsx(EL,{children:i})]})}),SB=({value:a,onChange:i,skip:c=0,limit:s=100,...d})=>{const[p,y]=R.useState([]),[v,T]=R.useState(!0),b=ss(),_=Xu();R.useEffect(()=>{(async()=>{try{T(!0);const w=await b(Y5({skip:c,limit:s},_)),j=w==null?void 0:w.data;j!=null&&j.programPage?y(j.programPage):console.warn("ProgramSelect: No programs found in response",w)}catch(w){console.error("ProgramSelect: Error fetching programs:",w)}finally{T(!1)}})()},[b,_,c,s]);const O=C=>{i&&i(C.target.value)};return v?x.jsx("select",{className:"form-select",disabled:!0,...d,children:x.jsx("option",{children:"Načítání programů..."})}):x.jsxs("select",{className:"form-select",onChange:O,value:a||"",...d,children:[x.jsx("option",{value:"",children:"-- Vyberte program --"}),p.map(C=>x.jsx("option",{value:C.id,children:C.name||C.nameEn||C.id},C.id))]})},EB=a=>{const i=parseInt(a,10)||0,c=Math.ceil(i/2),s=i%2===1;return`${c}. ročník ${s?"zimní":"letní"}`},TB=({semesters:a=[],subjectId:i,onSemestersChange:c=()=>null,disabled:s=!1})=>{const[d,p]=R.useState([]),[y,v]=R.useState({show:!1,semesterId:null,semesterOrder:null});R.useEffect(()=>{p([...a||[]])},[JSON.stringify(a)]);const T=[...d].sort((k,q)=>{const G=parseInt(k.order,10)||0,W=parseInt(q.order,10)||0;return G-W}),b=T.reduce((k,q)=>Math.max(k,q.order||0),0),_=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(k){const q=Math.random()*16|0;return(k==="x"?q:q&3|8).toString(16)}),O=R.useCallback(()=>{const k={id:_(),order:b+1,subjectId:i,_action:"create"},q=[...d,k];p(q),c(q)},[d,b,i,c]),C=R.useCallback(k=>{const q=d.find(G=>G.id===k);v({show:!0,semesterId:k,semesterOrder:q==null?void 0:q.order})},[d]),w=R.useCallback(()=>{v({show:!1,semesterId:null,semesterOrder:null})},[]),j=R.useCallback(k=>{const G=d.filter(W=>W.id!==k).sort((W,$)=>(parseInt(W.order,10)||0)-(parseInt($.order,10)||0)).map((W,$)=>({...W,order:$+1}));p(G),c(G),v({show:!1,semesterId:null,semesterOrder:null})},[d,c]),B=R.useCallback(k=>{if(k<=0)return;const q=[...T],G=q[k].order,W=q[k-1].order;q[k]={...q[k],order:W},q[k-1]={...q[k-1],order:G},p(q),c(q)},[T,c]),U=R.useCallback(k=>{if(k>=T.length-1)return;const q=[...T],G=q[k].order,W=q[k+1].order;q[k]={...q[k],order:W},q[k+1]={...q[k+1],order:G},p(q),c(q)},[T,c]);return x.jsxs("div",{className:"mb-3",children:[x.jsxs(Xy,{id:"semesters",title:"Semestry",children:[T.length>0?x.jsx("div",{className:"mb-3",children:x.jsxs("table",{className:"table table-sm table-bordered",children:[x.jsx("thead",{className:"table-light",children:x.jsxs("tr",{children:[x.jsx("th",{style:{width:"70px"},children:"Pořadí"}),x.jsx("th",{style:{width:"140px"},children:"Název"}),x.jsx("th",{children:"ID"}),x.jsx("th",{style:{width:"120px"},children:"Akce"})]})}),x.jsx("tbody",{children:T.map((k,q)=>x.jsxs("tr",{children:[x.jsx("td",{children:k.order}),x.jsx("td",{children:EB(k.order)}),x.jsx("td",{children:x.jsx("small",{className:"text-muted",children:k.id})}),x.jsx("td",{children:x.jsxs("div",{className:"btn-group btn-group-sm",children:[x.jsx("button",{type:"button",className:"btn btn-outline-secondary",onClick:()=>B(q),disabled:s||q===0,title:"Posunout nahoru",children:"↑"}),x.jsx("button",{type:"button",className:"btn btn-outline-secondary",onClick:()=>U(q),disabled:s||q===T.length-1,title:"Posunout dolů",children:"↓"}),x.jsx("button",{type:"button",className:"btn btn-outline-danger",onClick:()=>C(k.id),disabled:s,title:"Odebrat semestr",children:"✕"})]})})]},k.id))})]})}):x.jsx("div",{className:"text-muted mb-3",children:"Žádné semestry"}),x.jsxs("button",{type:"button",className:"btn btn-sm btn-success",onClick:O,disabled:s,children:["+ Přidat nový semestr (pořadí: ",b+1,")"]})]}),y.show&&x.jsx("div",{className:"modal fade show d-block",tabIndex:"-1",style:{backgroundColor:"rgba(0,0,0,0.5)"},children:x.jsx("div",{className:"modal-dialog modal-dialog-centered",children:x.jsxs("div",{className:"modal-content",children:[x.jsxs("div",{className:"modal-header",children:[x.jsx("h5",{className:"modal-title",children:"Potvrzení smazání"}),x.jsx("button",{type:"button",className:"btn-close",onClick:w,"aria-label":"Zavřít"})]}),x.jsxs("div",{className:"modal-body",children:[x.jsxs("p",{children:["Opravdu chcete smazat semestr ",x.jsxs("strong",{children:["#",y.semesterOrder]}),"?"]}),x.jsxs("div",{className:"alert alert-warning mb-0",children:[x.jsx("strong",{children:"Upozornění:"})," Pokud semestr obsahuje klasifikace nebo jiná data, smazání se nepodaří a bude nutné nejprve odstranit všechna související data."]})]}),x.jsxs("div",{className:"modal-footer",children:[x.jsx("button",{type:"button",className:"btn btn-secondary",onClick:w,children:"Zrušit"}),x.jsx("button",{type:"button",className:"btn btn-danger",onClick:()=>j(y.semesterId),children:"Smazat semestr"})]})]})})})]})},Rx=({item:a,onChange:i=p=>null,onBlur:c=p=>null,onSemestersChange:s=p=>null,children:d})=>{const p=y=>{i({target:{id:"programId",value:y}})};return x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:"mb-3",label:"Program",children:[x.jsx("label",{htmlFor:"programId",className:"form-label",children:"Program"}),x.jsx(SB,{id:"programId",value:(a==null?void 0:a.programId)||"",onChange:p})]}),x.jsx(To,{id:"name",label:"Název",className:"form-control",value:(a==null?void 0:a.name)||"",onChange:i,onBlur:c}),x.jsx(To,{id:"nameEn",label:"Anglický název",className:"form-control",value:(a==null?void 0:a.nameEn)||"",onChange:i,onBlur:c}),x.jsx(Xy,{id:"description",title:"Popis",children:x.jsx("textarea",{id:"description",className:"form-control",rows:4,value:(a==null?void 0:a.description)||"",onChange:i,onBlur:c})}),x.jsx(Xy,{id:"descriptionEn",title:"Anglický popis",children:x.jsx("textarea",{id:"descriptionEn",className:"form-control",rows:4,value:(a==null?void 0:a.descriptionEn)||"",onChange:i,onBlur:c})}),x.jsx(TB,{semesters:a==null?void 0:a.semesters,subjectId:a==null?void 0:a.id,onSemestersChange:s}),d]})},xB=({item:a,children:i,mutationAsyncAction:c=HD,DefaultContent:s=Rx})=>{const{onChange:d}=Wh(),p=ss(),y=Xu(),[v,T]=R.useState((a==null?void 0:a.semesters)||[]),[b,_]=R.useState((a==null?void 0:a.semesters)||[]),[O,C]=R.useState(!1),[w,j]=R.useState(null),B=R.useRef(null),U=R.useRef(v);R.useEffect(()=>{U.current=v},[v]),R.useEffect(()=>{T((a==null?void 0:a.semesters)||[]),_((a==null?void 0:a.semesters)||[])},[a==null?void 0:a.id,a==null?void 0:a.semesters]);const{draft:k,setDraft:q,dirty:G,loading:W,error:$,autoSaveEnabled:F,toggleAutoSave:I,effectiveMode:V,onChange:ye,onBlur:ce,onCancel:je,onConfirm:xe}=SD(c,a,{mode:"live",defaultAutoSave:!0}),Be=R.useCallback(()=>{if(v.length!==b.length)return!0;const N=new Set(v.map(re=>re.id)),Z=new Set(b.map(re=>re.id));for(const re of Z)if(!N.has(re))return!0;for(const re of N)if(!Z.has(re))return!0;for(const re of b){const le=v.find(Te=>Te.id===re.id);if(le&&le.order!==re.order)return!0}return!1},[v,b]),$e=G||Be(),Ge=R.useCallback(async N=>{var re,le,Te,Ae,Me,Ke,Xe,rt;C(!0),j(null);const Z=[];try{const Le=U.current,Ve=new Map(Le.map(ot=>[ot.id,ot])),Ot=new Map(N.map(ot=>[ot.id,ot])),Qt=new Map(Le.map(ot=>[ot.id,ot.lastchange])),Rt=N.filter(ot=>ot._action==="create"),zt=Le.filter(ot=>!Ot.has(ot.id)&&!ot._action),rn=N.filter(ot=>{if(ot._action==="create")return!1;const He=Ve.get(ot.id);return He&&He.order!==ot.order});for(const ot of Rt){const He=await p(Sx({id:ot.id,subjectId:a.id,order:ot.order},y)),Zt=((re=He==null?void 0:He.data)==null?void 0:re.semesterInsert)||(He==null?void 0:He.semesterInsert)||He;Zt!=null&&Zt.id&&Qt.set(Zt.id,Zt.lastchange)}for(const ot of zt){const He=Qt.get(ot.id)||ot.lastchange;if(!He){console.error("Cannot delete semester - missing lastchange:",ot.id),Z.push(ot);continue}const Zt=await p(VD({id:ot.id,lastchange:He},y)),At=((le=Zt==null?void 0:Zt.data)==null?void 0:le.semesterDelete)||(Zt==null?void 0:Zt.semesterDelete)||Zt;if((At==null?void 0:At.failed)===!0){if((Te=At==null?void 0:At.msg)!=null&&Te.includes("ForeignKey")||(Ae=At==null?void 0:At.msg)!=null&&Ae.includes("foreign key")||(Me=At==null?void 0:At.msg)!=null&&Me.includes("still referenced")){Z.push(ot);continue}Z.push(ot);continue}}for(const ot of rn){const He=Qt.get(ot.id)||ot.lastchange||((Ke=Ve.get(ot.id))==null?void 0:Ke.lastchange);if(!He)throw console.error("Cannot update semester - missing lastchange:",ot.id),new Error("Nepodařilo se aktualizovat semestr - chybí lastchange");const Zt=await p(X5({id:ot.id,lastchange:He,subjectId:a.id,order:ot.order},y)),At=((Xe=Zt==null?void 0:Zt.data)==null?void 0:Xe.semesterUpdate)||(Zt==null?void 0:Zt.semesterUpdate)||Zt;if((rt=At==null?void 0:At.__typename)!=null&&rt.includes("Error")||(At==null?void 0:At.failed)===!0)throw new Error((At==null?void 0:At.msg)||"Nepodařilo se aktualizovat pořadí semestru");At!=null&&At.lastchange&&Qt.set(ot.id,At.lastchange)}let Sa=N.map(ot=>{const{_action:He,...Zt}=ot,At=Qt.get(ot.id);return At?{...Zt,lastchange:At}:Zt});for(const ot of Z)Sa.some(He=>He.id===ot.id)||Sa.push(ot);return Sa=Sa.sort((ot,He)=>(ot.order||0)-(He.order||0)),T(Sa),_(Sa),q(ot=>({...ot,semesters:Sa})),Z.length>0?(j(new Error("Nelze smazat semestr - obsahuje klasifikace nebo jiná data")),!1):!0}catch(Le){return _(U.current),q(Ve=>({...Ve,semesters:U.current})),j(Le),!1}finally{C(!1)}},[p,y,a==null?void 0:a.id,q]),Y=R.useCallback(N=>{_(N),q(Z=>({...Z,semesters:N})),V==="live"&&(B.current&&clearTimeout(B.current),B.current=setTimeout(()=>{Ge(N)},600))},[V,q,Ge]);R.useEffect(()=>()=>{B.current&&clearTimeout(B.current)},[]);const se=R.useCallback(async()=>{if(Be()&&!await Ge(b))return null;const N=await xe();return N&&await d({target:{value:N}}),N},[xe,d,Be,Ge,b]),Ee=R.useCallback(()=>{_(v),q(N=>({...N,semesters:v})),je()},[je,v,q]),Ne=W||O,fe=$||w;return x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:"d-flex justify-content-end align-items-center mb-3 p-2 bg-light rounded",children:[x.jsxs("div",{className:"form-check form-switch m-0 me-3",children:[x.jsx("input",{className:"form-check-input",type:"checkbox",role:"switch",id:"autoSaveSwitch",checked:F,onChange:I}),x.jsx("label",{className:"form-check-label",htmlFor:"autoSaveSwitch",children:"Automatické ukládání"})]}),V==="live"&&Ne&&x.jsxs("span",{className:"text-muted small",children:[x.jsx("span",{className:"spinner-border spinner-border-sm me-1",role:"status","aria-hidden":"true"}),"Ukládám..."]})]}),x.jsx(s,{item:{...k,semesters:b},onChange:ye,onBlur:ce,onSemestersChange:Y,children:i}),V==="confirm"&&x.jsxs("div",{className:"d-flex gap-2 mt-3",children:[x.jsx("button",{className:"btn btn-outline-secondary flex-grow-1",onClick:Ee,disabled:!$e||Ne,children:"Zrušit změny"}),x.jsx("button",{className:"btn btn-primary flex-grow-1",onClick:se,disabled:!$e||Ne,children:Ne?x.jsxs(x.Fragment,{children:[x.jsx("span",{className:"spinner-border spinner-border-sm me-2",role:"status","aria-hidden":"true"}),"Ukládám..."]}):"Uložit změny"})]}),fe&&x.jsx("div",{className:"alert alert-danger mt-2",children:(fe==null?void 0:fe.message)||"Chyba při ukládání"})]})},Fb=({queryAsyncAction:a=k5,PageNavbar:i=()=>null,ItemLayout:c=bB,SubPage:s=null,...d})=>x.jsx(E5,{queryAsyncAction:a,PageNavbar:i,ItemLayout:c,SubPage:s,...d}),_B=({children:a,PageNavbar:i=()=>null})=>x.jsxs(x.Fragment,{children:[x.jsx(i,{}),a]}),OB=({column:a,sortConfig:i,onSort:c})=>{const s=i.column===a,d=s?i.direction:null,p=()=>!s||d===null?"↕":d==="asc"?"↑":"↓",y=()=>!s||d===null?"Seřadit vzestupně":d==="asc"?"Seřadit sestupně":"Zrušit řazení";return x.jsx("button",{type:"button",className:`btn btn-sm ${s?"btn-primary":"btn-outline-secondary"} ms-1`,onClick:()=>c(a),title:y(),style:{padding:"0.1rem 0.3rem",fontSize:"0.75rem"},children:p()})},AB=({tableDef:a,sortConfig:i,onSort:c})=>{const s=["name","nameEn","program","semesters","lastchange"];return x.jsx("thead",{children:x.jsx("tr",{children:Object.entries(a).map(([d,{label:p}])=>x.jsxs("th",{children:[p,s.includes(d)&&x.jsx(OB,{column:d,sortConfig:i,onSort:c})]},d))})})},KD=(a,i)=>{var c,s;switch(i){case"name":return(a==null?void 0:a.name)||"";case"nameEn":return(a==null?void 0:a.nameEn)||"";case"program":return((c=a==null?void 0:a.program)==null?void 0:c.name)||(a==null?void 0:a.programId)||"";case"semesters":return((s=a==null?void 0:a.semesters)==null?void 0:s.length)||0;case"lastchange":return(a==null?void 0:a.lastchange)||"";default:return""}},CB=(a,i,c)=>{if(typeof a=="number"&&typeof i=="number")return c==="asc"?a-i:i-a;const s=String(a).toLowerCase(),d=String(i).toLowerCase(),p=parseFloat(s),y=parseFloat(d);return!isNaN(p)&&!isNaN(y)?c==="asc"?p-y:y-p:c==="asc"?s.localeCompare(d,"cs"):d.localeCompare(s,"cs")},RB=a=>!a||a.length===0?{}:{name:{label:"Název",component:({row:i})=>x.jsx("td",{children:x.jsx(Jy,{item:i,children:(i==null?void 0:i.name)||"Bez názvu"})})},nameEn:{label:"Anglický název",component:({row:i})=>x.jsx("td",{children:(i==null?void 0:i.nameEn)||""})},program:{label:"Program",component:({row:i})=>{var c;return x.jsx("td",{children:((c=i==null?void 0:i.program)==null?void 0:c.name)||(i==null?void 0:i.programId)||""})}},semesters:{label:"Semestrů",component:({row:i})=>{var c;return x.jsx("td",{children:((c=i==null?void 0:i.semesters)==null?void 0:c.length)||0})}},lastchange:{label:"Změněno",component:({row:i})=>x.jsx("td",{children:i==null?void 0:i.lastchange})},tools:{label:"Nástroje",component:({row:i})=>x.jsx("td",{children:x.jsx(RD,{actions:[{children:x.jsx(Jy,{className:"btn btn-sm btn-outline-secondary border-0 text-start w-100",item:i,children:"Detail"})},{children:x.jsx(JD,{className:"btn btn-sm btn-outline-secondary border-0 text-start w-100",item:i,action:"edit",children:"Editovat"})},{children:x.jsx(FD,{className:"btn btn-sm btn-outline-danger border-0 text-start w-100",item:i,rbacitem:i==null?void 0:i.rbacobject,children:"Smazat"})}]})})}},DB=({data:a})=>{const[i,c]=R.useState({column:null,direction:null}),s=R.useMemo(()=>RB(a),[a]),d=y=>{c(v=>v.column!==y?{column:y,direction:"asc"}:v.direction==="asc"?{column:y,direction:"desc"}:{column:null,direction:null})},p=R.useMemo(()=>!a||!i.column||!i.direction?a:[...a].sort((y,v)=>{const T=KD(y,i.column),b=KD(v,i.column);return CB(T,b,i.direction)}),[a,i]);return!a||a.length===0?null:x.jsx("div",{className:"table-responsive",children:x.jsxs("table",{className:"table table-stripped",children:[x.jsx(AB,{tableDef:s,sortConfig:i,onSort:d}),x.jsx(DD,{data:p,table_def:s})]})})},PD=R.createContext(null),np=()=>R.useContext(PD);function wB(a,i){if(!a||typeof a!="object"||Array.isArray(a))return!1;const c=Object.keys(a);return c.length===1&&c[0]===i&&Array.isArray(a[i])}function MB(a,i=[]){const c=i.filter(Boolean).filter(d=>Object.keys(d).length>0),s=[];for(const d of c)wB(d,a)?s.push(...d[a]):s.push(d);return s.length===0?{}:s.length===1?s[0]:{[a]:s}}const NB=({id:a,label:i,resetKey:c,join:s="_and",onChange:d=()=>null,children:p})=>{const y=np(),[v,T]=R.useState({}),[b,_]=R.useState(s),O=R.useCallback($=>{const{id:F,value:I}=$.target;T(V=>({...V,[F]:I}))},[]),C=R.useMemo(()=>Object.values(v).filter(Boolean).map(F=>!Array.isArray(F)||F.length===0?null:F.length===1?F[0]:{_and:F}).filter(Boolean),[v]),w=C.length>1,j=R.useMemo(()=>MB(b,C),[b,C]),B=R.useMemo(()=>a?{[a]:j}:j,[a,j]);R.useEffect(()=>{d({where:B})},[B,d]),R.useEffect(()=>{if(!(y!=null&&y.handleChange))return;const $=!B||typeof B=="object"&&Object.keys(B).length===0;return y.handleChange({target:{id:a??"__root__",value:$?null:[B]}}),()=>{y.handleChange({target:{id:a??"__root__",value:null}})}},[y,B,a]);const U=R.useCallback($=>{_($.target.value)},[]),k=R.useCallback(()=>B,[B]),[q,G]=R.useState(0),W=R.useCallback(()=>{T({}),_(s),G($=>$+1)},[s]);return x.jsx(PD.Provider,{value:{handleChange:O,readFilter:k,resetFilter:W},children:x.jsxs(au,{title:i||a||"where",children:[w&&x.jsxs(Qr,{children:[x.jsx(dn,{children:x.jsxs("label",{children:[x.jsx("input",{type:"radio",name:`join-${a??"root"}`,value:"_and",checked:b==="_and",onChange:U}),"_and"]})}),x.jsx(dn,{children:x.jsxs("label",{children:[x.jsx("input",{type:"radio",name:`join-${a??"root"}`,value:"_or",checked:b==="_or",onChange:U}),"_or"]})})]}),x.jsx("div",{children:p},c??q)]})})};function jB(a){return!a||typeof a!="object"?!0:Array.isArray(a)?a.length===0:Object.keys(a).length===0}function zB(a){return JSON.stringify(a)}const UB=({onClick:a,paramName:i="where",replace:c=!0,...s})=>{const d=np(),[p,y]=Y1(),v=R.useCallback(()=>{if(!(d!=null&&d.readFilter))throw Error("<FilterButton /> must be placed inside <Filter />");const T=new URLSearchParams(p);T.delete(i),a&&a({where:{}}),d.resetFilter&&d.resetFilter(),y(T,{replace:c})},[d,a,p,y,i,c]);return x.jsx("button",{...s,onClick:v})},LB=({onClick:a,paramName:i="where",replace:c=!0,...s})=>{const d=np(),[p,y]=Y1(),v=R.useCallback(()=>{if(!(d!=null&&d.readFilter))throw Error("<FilterButton /> must be placed inside <Filter />");const T=d.readFilter(),b={where:T};if(a)return a(b);const _=new URLSearchParams(p);jB(T)?_.delete(i):_.set(i,zB(T)),y(_,{replace:c})},[d,a,p,y,i,c]);return x.jsx("button",{...s,onClick:v})},BB=({id:a,label:i,initialValue:c="",initialOp:s="_ilike"})=>{const d=np();if(!d)throw Error("<StringFilter /> must be placed inside <Filter />");const[p,y]=R.useState(s),[v,T]=R.useState(c),[b,_]=R.useState(""),[O,C]=R.useState(""),w=R.useCallback(F=>{d.handleChange({target:{id:a,value:F}})},[d,a]),j=R.useCallback((F,I)=>{if(!I)return null;let V=I;return F==="_ilike"&&(V=I.includes("%")?I:`%${I}%`),[{[a]:{[F]:V}}]},[a]),B=R.useCallback((F,I)=>{const V=[];return F&&V.push({[a]:{_gt:F}}),I&&V.push({[a]:{_lt:I}}),V.length?V:null},[a]),U=R.useCallback(({nextOp:F=p,nextText:I=v,nextFrom:V=b,nextTo:ye=O})=>{w(F==="_between"?B(V,ye):j(F,I))},[p,v,b,O,w,j,B]),k=R.useCallback(F=>{const I=F.target.value;I!==p&&(y(I),U(I==="_between"?{nextOp:I}:{nextOp:I}))},[p,U]),q=R.useCallback(F=>{const I=F.target.value;I!==v&&(T(I),p!=="_between"&&U({nextText:I}))},[p,v,U]),G=R.useCallback(F=>{const I=F.target.value;I!==b&&(_(I),p==="_between"&&U({nextFrom:I}))},[p,b,U]),W=R.useCallback(F=>{const I=F.target.value;I!==O&&(C(I),p==="_between"&&U({nextTo:I}))},[p,O,U]),$=p==="_between";return x.jsx(au,{title:i||a,children:x.jsxs(Qr,{children:[x.jsx(dn,{children:x.jsxs("select",{className:"form-control",value:p,onChange:k,children:[x.jsx("option",{value:"Obsahuje",children:"_ilike"}),x.jsx("option",{value:"Začíná na",children:"_startswith"}),x.jsx("option",{value:"Končí na",children:"_endswith"}),x.jsx("option",{value:"Je rovno",children:"_eq"}),x.jsx("option",{value:"Je větší než",children:"_gt"}),x.jsx("option",{value:"Je menší než",children:"_lt"}),x.jsx("option",{value:"Mezi",children:"_between"})]})}),$?x.jsxs(x.Fragment,{children:[x.jsx(dn,{children:x.jsx(To,{className:"form-control",value:b,onChange:G,placeholder:"from…"})}),x.jsx(dn,{children:p==="_between"&&x.jsx(To,{className:"form-control",value:O,onChange:W,placeholder:"to…"})})]}):x.jsx(dn,{children:x.jsx(To,{className:"form-control",value:v,onChange:q})})]})})};function HB(a){const i=new Date(a);return Number.isNaN(i.getTime())?null:i.toISOString()}const kB=({id:a,label:i,initialOp:c="_gte",initialValue:s="",emitUtcIso:d=!0})=>{const p=np();if(!p)throw Error("<DateTimeFilter /> must be placed inside <Filter />");const[y,v]=R.useState(c),[T,b]=R.useState(s),[_,O]=R.useState(""),[C,w]=R.useState(""),j=R.useCallback(V=>V?d?HB(V):V:null,[d]),B=R.useCallback(V=>{p.handleChange({target:{id:a,value:V}})},[p,a]),U=R.useCallback((V,ye)=>{const ce=j(ye);return ce?[{[a]:{[V]:ce}}]:null},[a,j]),k=R.useCallback((V,ye)=>{const ce=[],je=j(V),xe=j(ye);return je&&ce.push({[a]:{_gt:je}}),xe&&ce.push({[a]:{_lt:xe}}),ce.length?ce:null},[a,j]),q=R.useCallback(({nextOp:V=y,nextText:ye=T,nextFrom:ce=_,nextTo:je=C})=>{B(V==="_between"?k(ce,je):U(V,ye))},[y,T,_,C,B,U,k]),G=R.useCallback(V=>{const ye=V.target.value;ye!==y&&(v(ye),q({nextOp:ye}))},[y,q]),W=R.useCallback(V=>{const ye=V.target.value;ye!==T&&(b(ye),y!=="_between"&&q({nextText:ye}))},[y,T,q]),$=R.useCallback(V=>{const ye=V.target.value;ye!==_&&(O(ye),y==="_between"&&q({nextFrom:ye}))},[y,_,q]),F=R.useCallback(V=>{const ye=V.target.value;ye!==C&&(w(ye),y==="_between"&&q({nextTo:ye}))},[y,C,q]),I=y==="_between";return x.jsx(au,{title:i||a,children:x.jsxs(Qr,{children:[x.jsx(dn,{children:x.jsxs("select",{className:"form-control",value:y,onChange:G,children:[x.jsx("option",{value:"_eq",children:"_eq"}),x.jsx("option",{value:"_gt",children:"_gt"}),x.jsx("option",{value:"_gte",children:"_gte"}),x.jsx("option",{value:"_lt",children:"_lt"}),x.jsx("option",{value:"_lte",children:"_lte"}),x.jsx("option",{value:"_between",children:"_between"})]})}),I?x.jsxs(x.Fragment,{children:[x.jsx(dn,{children:x.jsx(To,{className:"form-control",type:"datetime-local",value:_,onChange:$,placeholder:"from…"})}),x.jsx(dn,{children:x.jsx(To,{className:"form-control",type:"datetime-local",value:C,onChange:F,placeholder:"to…"})})]}):x.jsx(dn,{children:x.jsx(To,{className:"form-control",type:"datetime-local",value:T,onChange:W})})]})})},WD=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,VB=({id:a,label:i,initialValue:c=""})=>{const s=np();if(!s)throw Error("<UUIDFilter /> must be placed inside <Filter />");const[d,p]=R.useState(c),y=R.useMemo(()=>(d??"").trim(),[d]),T=y.length===0?!0:WD.test(y),b=R.useCallback(C=>{s.handleChange({target:{id:a,value:C}})},[s,a]),_=R.useCallback(C=>{const w=(C??"").trim();if(!w){b(null);return}if(!WD.test(w)){b(null);return}b([{[a]:{_eq:w}}])},[a,b]),O=R.useCallback(C=>{const w=C.target.value;w!==d&&(p(w),_(w))},[d,_]);return x.jsx(au,{title:i||a,children:x.jsxs(Qr,{children:[x.jsx(dn,{style:{minWidth:80},children:x.jsx("span",{style:{opacity:.7},children:"(_eq)"})}),x.jsxs(dn,{children:[x.jsx(To,{className:`form-control ${T?"":"is-invalid"}`,value:d,onChange:O,placeholder:"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}),!T&&x.jsx("div",{className:"invalid-feedback",style:{display:"block"},children:"Neplatné UUID. Očekávám formát 8-4-4-4-12 hex (např. 550e8400-e29b-41d4-a716-446655440000)."})]})]})})},qB=({id:a,onChange:i,children:c})=>x.jsxs(NB,{id:a,onChange:i,children:[x.jsx(VB,{id:"id"}),x.jsx(BB,{id:"name"}),x.jsx(kB,{id:"created",emitUtcIso:!1}),c]}),$B=({collapsed:a=!0,children:i,buttonLabel:c,buttonLabelCollapsed:s="Zobrazit",buttonLabelExpanded:d="Skrýt",onToggle:p,...y})=>{const[v,T]=R.useState(a);R.useEffect(()=>{T(a)},[a]);const b=R.useCallback(()=>{T(O=>{const C=!O;return p==null||p(C),C})},[p]),_=c??(v?s:d);return x.jsxs(x.Fragment,{children:[x.jsx("div",{hidden:v,"aria-hidden":v,children:i}),x.jsx("button",{type:"button",...y,onClick:b,"aria-expanded":!v,children:_})]})};function YB(a,i="where"){const c=a.get(i);if(!c)return null;try{const s=JSON.parse(c);return s&&typeof s=="object"?s:null}catch{return null}}const Dx="gr_where",e2=({children:a,queryAsyncAction:i=q5})=>{const[c]=Y1(),s=R.useMemo(()=>YB(c,Dx),[c.toString()]),{items:d,loading:p,error:y,hasMore:v,sentinelRef:T,loadMore:b,restart:_}=W5({asyncAction:i,actionParams:{skip:0,limit:25,where:s}});return R.useEffect(()=>{_({skip:0,limit:25,where:s})},[s]),x.jsxs(_B,{children:[x.jsx($B,{className:"form-control btn btn-outline-primary",buttonLabelCollapsed:"Zobrazit filtr",buttonLabelExpanded:"Skrýt filtr",children:x.jsxs(qB,{children:[x.jsx(LB,{className:"form-control btn btn-outline-success",paramName:Dx,children:"Filtrovat"}),x.jsx(UB,{className:"form-control btn btn-warning",paramName:Dx,children:"Vymazat filtr"})]})}),x.jsx(DB,{data:d}),x.jsx(Pu,{error:y,loading:p,text:"Nahrávám další..."}),v&&x.jsx("div",{ref:T,style:{height:80,backgroundColor:"lightgray"}}),v&&x.jsx("button",{className:"btn btn-success form-control",onClick:()=>b(),children:"Více"})]})},GB=({SubPage:a=dB,...i})=>x.jsx(Fb,{SubPage:a,...i}),QB=({...a})=>x.jsxs(Qr,{children:[x.jsx(o6,{}),x.jsx(C6,{children:x.jsx(uB,{...a})})]}),XB=({SubPage:a=QB,...i})=>x.jsx(Fb,{SubPage:a,...i}),IB=a=>{const i=parseInt(a,10)||0,c=Math.ceil(i/2),s=i%2===1;return`${c}. ročník ${s?"zimní":"letní"}`},ZB=({item:a})=>{var i,c,s;return x.jsxs(x.Fragment,{children:[x.jsxs(Zb,{item:a,title:"Program",children:[x.jsx(Hl,{label:"Název",children:(i=a==null?void 0:a.program)==null?void 0:i.name}),x.jsx(Hl,{label:"ID",children:x.jsx("a",{href:`/program/ProgramGQLModel/${(c=a==null?void 0:a.program)==null?void 0:c.id}`,children:(s=a==null?void 0:a.program)==null?void 0:s.id})})]}),x.jsx(Zb,{title:"Semestry",children:x.jsxs("table",{className:"table table-sm",children:[x.jsx("thead",{children:x.jsxs("tr",{children:[x.jsx("th",{children:"Pořadí"}),x.jsx("th",{children:"Název"}),x.jsx("th",{children:"ID"}),x.jsx("th",{children:"Last change"})]})}),x.jsx("tbody",{children:[...a.semesters].sort((d,p)=>(parseInt(d.order,10)||0)-(parseInt(p.order,10)||0)).map(d=>x.jsxs("tr",{children:[x.jsx("td",{children:d.order}),x.jsx("td",{children:IB(d.order)}),x.jsx("td",{children:x.jsx("a",{href:`/semestr/SemesterGQLModel/${d.id}`,children:d.id})}),x.jsx("td",{children:a.lastchange})]},d.id))})]})})]})},t2=({SubPage:a=ZB,...i})=>x.jsx(Fb,{SubPage:a,...i}),JB=({SubPage:a=yB,...i})=>x.jsx(Fb,{SubPage:a,...i}),FB=[{path:eB,element:x.jsx(XB,{})},{path:xx,element:x.jsx(e2,{})},{path:Zy,element:x.jsx(t2,{})},{path:GD,element:x.jsx(GB,{})},{path:lB,element:x.jsx(JB,{})},{path:xx.replace("list",":any"),element:x.jsx(e2,{})},{path:Zy.replace("view",":any"),element:x.jsx(t2,{})}],wx=()=>null,KB=({indexUrl:a,item:i,children:c,handleSearchChange:s,HomeButton:d=wx,PersonButton:p=wx,SearchBox:y=wx})=>x.jsxs(Ub,{bg:"light",expand:"lg",children:[x.jsx(Ub.Toggle,{"aria-controls":"basic-navbar-nav"}),x.jsx(Ub.Collapse,{id:"basic-navbar-nav",children:x.jsxs(j4,{variant:"tabs",className:"align-items-center w-100 flex-column flex-lg-row",children:[x.jsx(d,{indexURL:a}),x.jsx("div",{className:"mx-auto d-flex align-items-center flex-column flex-lg-row mb-0",children:c}),x.jsx("div",{className:"d-flex flex-column flex-lg-row align-items-center ml-lg-auto",children:x.jsx(y,{handleSearchChange:s})}),x.jsx(p,{item:i})]})})]}),PB=()=>{const{id:a}=Yf(),i=Z1(c=>bT(c,a))||{};return x.jsx(KB,{item:i})},WB=()=>x.jsxs(G4,{children:[x.jsx(PB,{}),x.jsx(X4,{}),x.jsx(yj,{})]}),e8=[{path:"/",element:x.jsx(WB,{}),children:[...FB,...A5]}],t8=$j(e8),n8=()=>x.jsx(ez,{router:t8}),a8="/api/gql",l8=({GQLENDPOINT:a=a8})=>x.jsx(FU,{clientOptions:{endpoint:a},children:x.jsx(n8,{})});function n2(a,i={}){if(!a)throw new Error("MyApp.mount: missing mount element");console.log("inside mount, doing to render"),AM.createRoot(a).render(x.jsx(l8,{...i})),console.log("inside mount, render finished")}return typeof window<"u"&&(window.MyApp={mount:n2}),g1.mount=n2,Object.defineProperty(g1,Symbol.toStringTag,{value:"Module"}),g1})({});
@@ -1019,4 +1019,4 @@ mutation semesterDeleteMutation($id: UUID!, $lastchange: DateTime!) {
1019
1019
  }
1020
1020
  }
1021
1021
  }
1022
- `),qD=Ia(I5),Z5=(a=[],i=[])=>{const c=new Map;return a.forEach(s=>(s==null?void 0:s.id)!=null&&c.set(s.id,s)),i.forEach(s=>(s==null?void 0:s.id)!=null&&c.set(s.id,s)),Array.from(c.values())},J5=a=>{const i={...a,skip:(a.skip||0)+(a.limit||10),limit:a.limit||10};return console.log("newFilter",i),i},F5=a=>{const i=a!=null&&a.data?a.data:a,c=i?Object.values(i):[];let s=c==null?void 0:c[0];return Array.isArray(s)||(s=c.find(d=>Array.isArray(d)),Array.isArray(s))?s:[]},K5=a=>{if(!a)return!1;const i=a.getBoundingClientRect();return i.top<window.innerHeight&&i.bottom>0},P5=()=>null,W5=({preloadedItems:a,actionParams:i,asyncAction:c,calculateNewFilter:s=J5,reset:d=0,onAll:p=P5,enabled:y=!0,autoload:v=!0}={})=>{const T=ss(),b=Xu();if(typeof c!="function")throw Error("useInfiniteScroll.asyncAction must be a function, typically pageRead");const _=R.useMemo(()=>({...i||{}}),[i]),[O,C]=R.useState(()=>({filter:_,loading:!1,hasMore:!0,error:null,items:a,result:null})),w=R.useRef(0),j=R.useRef(!1),B=R.useRef(O);R.useEffect(()=>{B.current=O},[O]);const U=R.useRef(_);R.useEffect(()=>{U.current=O.filter},[O.filter]);const k=R.useRef(y);R.useEffect(()=>{k.current=y},[y]),R.useEffect(()=>{C(F=>({...F,items:a}))},[a]),R.useEffect(()=>{C(F=>({...F,filter:{...i||{}},loading:!1,hasMore:!0,error:null,items:[]}))},[d]);const q=R.useCallback(async()=>{if(!k.current||j.current)return null;j.current=!0;const F=w.current;try{const I=B.current;if(I.loading||!I.hasMore)return null;C(je=>({...je,loading:!0,error:null}));const V=U.current,ye=await T(c(V,b)),ce=F5(ye);return w.current!==F?null:(C(je=>{const xe=Z5(je.items,ce),Be=ce.length,$e=(V&&V.limit!=null?V.limit:void 0)??(je.filter&&je.filter.limit!=null?je.filter.limit:void 0),Ge=$e==null?Be>0:Be===$e;Ge||p();const Y=Ge?(()=>{const se={fetched:ce,fetchedCount:Be,limit:$e,params:V,result:ye};return(s.length>=2?s(je.filter,se):s(je.filter))??je.filter})():je.filter;return U.current=Y,{...je,items:xe,filter:Y,hasMore:Ge,loading:!1,result:ye}}),ye)}catch(I){return w.current===F&&C(V=>({...V,loading:!1,hasMore:!1,error:I})),null}finally{j.current=!1}},[T,c,b,p,s]),G=R.useCallback(async(F={})=>{w.current+=1,j.current=!1;const I={...F||{}};return U.current=I,C(V=>({...V,filter:I,loading:!1,hasMore:!0,error:null,items:[],result:null})),await new Promise(V=>requestAnimationFrame(V)),q()},[q]),W=R.useRef(null),$=R.useCallback(F=>{W.current=F},[]);return R.useEffect(()=>{const F=W.current;if(!y||!F)return;const I=new IntersectionObserver(([ce])=>{ce.isIntersecting&&k.current&&q()});I.observe(F);let V=!1;return(async()=>{if(v)for(await new Promise(ce=>requestAnimationFrame(ce)),await new Promise(ce=>setTimeout(ce,0));!V&&k.current;){const ce=B.current;if(ce.loading||!ce.hasMore||!K5(F))break;await q(),await new Promise(je=>requestAnimationFrame(je))}})(),()=>{V=!0,I.disconnect()}},[y,v,q,d]),{items:O.items,loading:O.loading,error:O.error,hasMore:O.hasMore,filter:O.filter,result:O.result,loadMore:q,restart:G,sentinelRef:$}},Tx=a=>String(a??"").replace(/^\/+|\/+$/g,""),$D=({app:a="_",model:i="_",action:c="view",withId:s=!1,idParam:d=":id"}={})=>{const p={app:Tx(a),model:Tx(i),action:Tx(c),withId:!!s,idParam:String(d).startsWith(":")?String(d):`:${String(d)}`},y=`/${p.app}/${p.model}/${p.action}`.replace(/\/+/g,"/"),v=p.withId?`${y}/${p.idParam}`:y,T={path:v,segments:p,toString(){return v},valueOf(){return v},[Symbol.toPrimitive](){return v},change(b={}){return $D({...p,...b})},app(b){return T.change({app:b})},model(b){return T.change({model:b})},action(b){return T.change({action:b})},id(b=!0){return T.change({withId:b})},idParam(b=":id"){return T.change({idParam:b})}};return T},YD="/subject";$D({app:YD});const Jy=`${YD}/SubjectGQLModel`,xx=`${Jy}/list/`,eB=`${Jy}/create/`,tB=`${Jy}/view/`,nB=`${Jy}/edit/`,aB=`${Jy}/delete/`,GD=tB,_x=xx,Ox=":id",Fy=`${GD}${Ox}`,QD=`${nB}${Ox}`,lB=`${aB}${Ox}`,Ky=({item:a,LinkURI:i=GD,action:c="view",children:s,...d})=>{const p=i.replace("view",c);return x.jsx(Zh,{to:p+(a==null?void 0:a.id),...d,children:s||(a==null?void 0:a.fullname)||(a==null?void 0:a.name)||(a==null?void 0:a.id)||"Nevim"})};I4("SubjectGQLModel",Ky);const Fb=({item:a,children:i,title:c=null})=>(c||(c=x.jsxs(x.Fragment,{children:[x.jsx(vD,{})," ",x.jsx(Ky,{item:a})]})),x.jsx(gl,{title:c,children:i})),XD=({item:a,children:i})=>{var c,s,d,p,y,v,T,b,_;return console.log("item",a),x.jsxs(x.Fragment,{children:[(a==null?void 0:a.name)&&x.jsx(Hl,{label:"Název",children:x.jsx(Ky,{item:a})}),(a==null?void 0:a.nameEn)&&x.jsx(Hl,{label:"Anglický název",children:a.nameEn}),(a==null?void 0:a.description)&&x.jsx(Hl,{label:"Popis",children:a.description}),(a==null?void 0:a.descriptionEn)&&x.jsx(Hl,{label:"Anglický popis",children:a.descriptionEn}),(((c=a==null?void 0:a.program)==null?void 0:c.name)||((s=a==null?void 0:a.program)==null?void 0:s.id))&&x.jsx(Hl,{label:"Program",children:x.jsx("a",{href:`/program/ProgramGQLModel/${(d=a==null?void 0:a.program)==null?void 0:d.id}`,children:((p=a==null?void 0:a.program)==null?void 0:p.name)||((y=a==null?void 0:a.program)==null?void 0:y.id)})}),((T=(v=a==null?void 0:a.rbacobject)==null?void 0:v.currentUserRoles)==null?void 0:T.length)>0&&x.jsx(Hl,{label:"Moje role",children:a.rbacobject.currentUserRoles.map(O=>{var C;return x.jsx("span",{className:"badge bg-secondary me-1",children:(C=O.roletype)==null?void 0:C.name},O.id)})}),x.jsx("hr",{}),((b=a==null?void 0:a.createdby)==null?void 0:b.fullname)&&x.jsx(Hl,{label:"Vytvořil",children:a.createdby.fullname}),(a==null?void 0:a.created)&&x.jsx(Hl,{label:"Vytvořeno",children:qb(a.created)}),(a==null?void 0:a.lastchange)&&x.jsx(Hl,{label:"Změněno",children:qb(a.lastchange)}),((_=a==null?void 0:a.changedby)==null?void 0:_.fullname)&&x.jsx(Hl,{label:"Změnil",children:a.changedby.fullname}),i]})},Ax=a=>x.jsx(Dx,{...a}),ID=HD,Kb={oneOfRoles:["administrátor"],mode:"absolute"},rB={name:"Nový"},iB=({readItemURI:a=Fy,rbacitem:i,item:c=rB,children:s,...d})=>{const[p,y]=R.useState(!1),v=tu(),T=R.useCallback(()=>y(!0),[]),b=R.useCallback(()=>y(!1),[]),_=R.useCallback(C=>{b(),a&&(C!=null&&C.id)&&v(a.replace(":id",C.id))},[b,v,a]),O=R.useCallback(()=>{b()},[b]);return x.jsxs(np,{oneOfRoles:Kb.oneOfRoles,mode:Kb.mode,item:i,children:[x.jsx("button",{...d,onClick:T,children:s||"Vytvořit nový"}),p&&x.jsx(oB,{onOk:_,onCancel:O,item:c})]})},oB=({title:a="Nový předmět",onOk:i,onCancel:c,item:s,...d})=>{const p=ss(),y=Xu(),[v,T]=R.useState(()=>({id:crypto.randomUUID(),name:"Nový",semesters:[],...s})),[b,_]=R.useState(!1),[O,C]=R.useState(null),w=R.useCallback(q=>{var $,F,I;const G=(($=q==null?void 0:q.target)==null?void 0:$.id)||((F=q==null?void 0:q.target)==null?void 0:F.name),W=(I=q==null?void 0:q.target)==null?void 0:I.value;if(!G){console.warn("CreateDialog.handleChange: no field id",q);return}T(V=>({...V,[G]:W}))},[]),j=R.useCallback(q=>{w(q)},[w]),B=R.useCallback(q=>{T(G=>({...G,semesters:q}))},[]),U=R.useCallback(async()=>{var q,G,W,$;if(!v.programId){C(new Error("Musíte vybrat program"));return}_(!0),C(null);try{const F=await p(HD(v,y)),I=((q=F==null?void 0:F.data)==null?void 0:q.subjectInsert)||(F==null?void 0:F.subjectInsert)||F;if((I==null?void 0:I.failed)===!0||(G=I==null?void 0:I.__typename)!=null&&G.includes("Error"))throw new Error((I==null?void 0:I.msg)||"Nepodařilo se vytvořit předmět");const V=(I==null?void 0:I.id)||v.id,ye=(v.semesters||[]).filter(ce=>ce._action==="create");for(const ce of ye){const je=await p(Ex({id:ce.id,subjectId:V,order:ce.order},y)),xe=((W=je==null?void 0:je.data)==null?void 0:W.semesterInsert)||(je==null?void 0:je.semesterInsert)||je;((xe==null?void 0:xe.failed)===!0||($=xe==null?void 0:xe.__typename)!=null&&$.includes("Error"))&&console.error("Failed to create semester:",xe==null?void 0:xe.msg)}i&&i({...v,id:V})}catch(F){C(F)}finally{_(!1)}},[v,p,y,i]),k=b||!v.programId;return x.jsxs(Ib,{title:a,oklabel:b?"Ukládám...":"Ok",cancellabel:"Zrušit",onCancel:c,onOk:U,okDisabled:k,...d,children:[x.jsx(Ax,{item:v,onChange:w,onBlur:j,onSemestersChange:B}),!v.programId&&x.jsx("div",{className:"alert alert-warning mt-2",children:"Pro vytvoření předmětu musíte vybrat program."}),O&&x.jsx("div",{className:"alert alert-danger mt-2",children:(O==null?void 0:O.message)||"Chyba při ukládání"})]})},uB=({mutationAsyncAction:a=ID,DefaultContent:i=Ax,readItemURI:c=Fy,rbacitem:s,onOk:d,onCancel:p,...y})=>x.jsx(np,{oneOfRoles:Kb.oneOfRoles,mode:Kb.mode,item:s,children:x.jsx(cB,{mutationAsyncAction:a,DefaultContent:i,readItemURI:c,onOk:d,onCancel:p,...y})}),cB=({mutationAsyncAction:a=ID,DefaultContent:i=Ax,readItemURI:c=Fy,onOk:s,onCancel:d,...p})=>{const y=tu(),v=ss(),T=Xu(),b=R.useMemo(()=>({id:crypto.randomUUID(),name:"Nový",semesters:[]}),[]),[_,O]=R.useState(b),[C,w]=R.useState(!1),[j,B]=R.useState(null),U=R.useCallback($=>{const F=$.target.name||$.target.id,I=$.target.value;O(V=>({...V,[F]:I}))},[]),k=R.useCallback(()=>{},[]),q=R.useCallback($=>{O(F=>({...F,semesters:$}))},[]),G=R.useCallback(async()=>{if(d){await d();return}y(-1)},[y,d]),W=R.useCallback(async()=>{var $,F,I,V;w(!0),B(null),console.log("CreateBodyWithSemesters: handleConfirm called"),console.log("CreateBodyWithSemesters: draft =",_),console.log("CreateBodyWithSemesters: draft.semesters =",_.semesters);try{const ye=await v(a(_,T)),ce=(($=ye==null?void 0:ye.data)==null?void 0:$.subjectInsert)||(ye==null?void 0:ye.subjectInsert)||ye;if(console.log("CreateBodyWithSemesters: subjectResponse =",ye),console.log("CreateBodyWithSemesters: subjectResult =",ce),(ce==null?void 0:ce.failed)===!0||(F=ce==null?void 0:ce.__typename)!=null&&F.includes("Error"))throw new Error((ce==null?void 0:ce.msg)||"Nepodařilo se vytvořit předmět");const je=(ce==null?void 0:ce.id)||_.id;console.log("CreateBodyWithSemesters: subjectId =",je);const xe=(_.semesters||[]).filter(Be=>Be._action==="create");console.log("CreateBodyWithSemesters: semestersToCreate =",xe);for(const Be of xe){console.log("CreateBodyWithSemesters: Creating semester =",Be);const $e=await v(Ex({id:Be.id,subjectId:je,order:Be.order},T));console.log("CreateBodyWithSemesters: semesterResponse =",$e);const Ge=((I=$e==null?void 0:$e.data)==null?void 0:I.semesterInsert)||($e==null?void 0:$e.semesterInsert)||$e;((Ge==null?void 0:Ge.failed)===!0||(V=Ge==null?void 0:Ge.__typename)!=null&&V.includes("Error"))&&console.error("Failed to create semester:",Ge==null?void 0:Ge.msg)}return s?await s(ce,_):c&&y&&y(c.replace(":id",je),{replace:!0}),ce}catch(ye){return B(ye),null}finally{w(!1)}},[v,_,T,a,y,s,c]);return x.jsx(x.Fragment,{children:x.jsxs(i,{item:_,onChange:U,onBlur:k,onSemestersChange:q,...p,children:[x.jsx(Pu,{error:j,loading:C}),x.jsx("button",{className:"btn btn-warning form-control",onClick:G,disabled:C,children:"Zrušit změny"}),x.jsx("button",{className:"btn btn-primary form-control",onClick:W,disabled:C,children:C?x.jsxs(x.Fragment,{children:[x.jsx("span",{className:"spinner-border spinner-border-sm me-2",role:"status","aria-hidden":"true"}),"Ukládám..."]}):"Uložit změny"})]})})},ZD=a=>x.jsx(Dx,{...a}),JD=kD,Cx={oneOfRoles:["administrátor"],mode:"absolute"},FD=({uriPattern:a=QD,...i})=>x.jsx(_D,{...i,uriPattern:a,...Cx}),sB=({DefaultContent:a=ZD,mutationAsyncAction:i=JD,...c})=>x.jsx(CD,{...c,DefaultContent:a,mutationAsyncAction:i,...Cx}),fB=({DefaultContent:a=ZD,Dialog:i=sB,mutationAsyncAction:c=JD,...s})=>x.jsx(AD,{...s,DefaultContent:a,Dialog:i,mutationAsyncAction:c,...Cx}),dB=({children:a})=>{const{item:i}=ep();return i?x.jsx(xB,{item:i,children:a}):x.jsx(x.Fragment,{children:"Načítání..."})},hB=XD,pB=VD,Rx={oneOfRoles:["administrátor"],mode:"absolute"},KD=({vectorItemsURI:a=xx,item:i,rbacitem:c,onOk:s,children:d,...p})=>{const[y,v]=R.useState(!1),T=tu(),b=R.useCallback(()=>v(!0),[]),_=R.useCallback(()=>v(!1),[]),O=R.useCallback(()=>{_(),s?s():a&&T(a)},[_,T,s,a]),C=R.useCallback(()=>{_()},[_]);return x.jsxs(np,{oneOfRoles:Rx.oneOfRoles,mode:Rx.mode,item:c,children:[x.jsx("button",{...p,onClick:b,children:d||"Smazat"}),y&&x.jsx(mB,{item:i,onOk:O,onCancel:C,vectorItemsURI:a})]})},mB=({item:a,onOk:i,onCancel:c,...s})=>{var C;const d=ss(),p=Xu(),[y,v]=R.useState(!1),[T,b]=R.useState(null),_=((C=a==null?void 0:a.semesters)==null?void 0:C.length)||0,O=R.useCallback(async()=>{var w,j,B,U,k;v(!0),b(null);try{const q=(a==null?void 0:a.semesters)||[];for(const $ of q){if(!$.lastchange){console.warn("Semester missing lastchange, skipping:",$.id);continue}const F=await d(qD({id:$.id,lastchange:$.lastchange},p)),I=((w=F==null?void 0:F.data)==null?void 0:w.semesterDelete)||(F==null?void 0:F.semesterDelete)||F;if((I==null?void 0:I.failed)===!0)throw(j=I==null?void 0:I.msg)!=null&&j.includes("ForeignKey")||(B=I==null?void 0:I.msg)!=null&&B.includes("foreign key")||(U=I==null?void 0:I.msg)!=null&&U.includes("still referenced")?new Error(`Nelze smazat semestr #${$.order} - obsahuje klasifikace nebo jiná data. Nejdříve odstraňte všechna data ze semestru.`):new Error((I==null?void 0:I.msg)||"Nepodařilo se smazat semestr")}const G=await d(VD({id:a.id,lastchange:a.lastchange},p)),W=((k=G==null?void 0:G.data)==null?void 0:k.subjectDelete)||(G==null?void 0:G.subjectDelete)||G;if((W==null?void 0:W.failed)===!0)throw new Error((W==null?void 0:W.msg)||"Nepodařilo se smazat předmět");i&&i()}catch(q){b(q)}finally{v(!1)}},[d,p,a,i]);return x.jsxs(Ib,{title:"Smazat předmět",oklabel:y?"Mažu...":"Smazat",cancellabel:"Zrušit",onOk:O,onCancel:c,okDisabled:y,...s,children:[x.jsxs("div",{className:"mb-3",children:[x.jsxs("p",{children:["Opravdu chcete smazat předmět ",x.jsx("strong",{children:a==null?void 0:a.name}),"?"]}),_>0&&x.jsxs("div",{className:"alert alert-warning",children:[x.jsx("strong",{children:"Upozornění:"})," Tento předmět obsahuje ",_," ",_===1?"semestr":_<5?"semestry":"semestrů","."," ","Všechny semestry budou také smazány.",x.jsx("div",{className:"mt-2 small",children:"Pokud některý semestr obsahuje klasifikace nebo jiná data, smazání se nepodaří."})]})]}),T&&x.jsx("div",{className:"alert alert-danger",children:(T==null?void 0:T.message)||"Chyba při mazání"})]})},yB=({mutationAsyncAction:a=pB,DefaultContent:i=hB,vectorItemsURI:c=xx,...s})=>x.jsx(u5,{...s,DefaultContent:i,mutationAsyncAction:a,vectorItemsURI:c,...Rx}),gB=({children:a,preserveHash:i=!0,preserveSearch:c=!0,...s})=>x.jsx(Zh,{to:_x,preserveHash:i,preserveSearch:c,...s,children:a}),vB=({item:a})=>x.jsxs(Fb,{item:a,title:"Nástroje",children:[x.jsx(gB,{className:"btn btn-outline-success",children:"Stránka"}),x.jsx(FD,{className:"btn btn-outline-success",item:a,children:"Upravit"}),x.jsx(fB,{className:"btn btn-outline-success",item:a,children:"Upravit Dialog"}),x.jsx(iB,{className:"btn btn-outline-success",rbacitem:{},children:"Vytvořit nový"}),x.jsx(KD,{className:"btn btn-outline-danger",item:a,children:"Odstranit"})]}),bB=({item:a,children:i,CardCapsule:c=Fb,MediumContent:s=XD})=>x.jsx(c,{item:a,children:x.jsxs(Qr,{children:[x.jsxs(SL,{children:[x.jsx(c,{item:a,title:"Detail",children:x.jsx(s,{item:a})}),x.jsx(vB,{item:a})]}),x.jsx(EL,{children:i})]})}),SB=({value:a,onChange:i,skip:c=0,limit:s=100,...d})=>{const[p,y]=R.useState([]),[v,T]=R.useState(!0),b=ss(),_=Xu();R.useEffect(()=>{(async()=>{try{T(!0);const w=await b(Y5({skip:c,limit:s},_)),j=w==null?void 0:w.data;j!=null&&j.programPage?y(j.programPage):console.warn("ProgramSelect: No programs found in response",w)}catch(w){console.error("ProgramSelect: Error fetching programs:",w)}finally{T(!1)}})()},[b,_,c,s]);const O=C=>{i&&i(C.target.value)};return v?x.jsx("select",{className:"form-select",disabled:!0,...d,children:x.jsx("option",{children:"Načítání programů..."})}):x.jsxs("select",{className:"form-select",onChange:O,value:a||"",...d,children:[x.jsx("option",{value:"",children:"-- Vyberte program --"}),p.map(C=>x.jsx("option",{value:C.id,children:C.name||C.nameEn||C.id},C.id))]})},EB=a=>{const i=parseInt(a,10)||0,c=Math.ceil(i/2),s=i%2===1;return`${c}. ročník ${s?"zimní":"letní"}`},TB=({semesters:a=[],subjectId:i,onSemestersChange:c=()=>null,disabled:s=!1})=>{const[d,p]=R.useState([]),[y,v]=R.useState({show:!1,semesterId:null,semesterOrder:null});R.useEffect(()=>{p([...a||[]])},[JSON.stringify(a)]);const T=[...d].sort((k,q)=>{const G=parseInt(k.order,10)||0,W=parseInt(q.order,10)||0;return G-W}),b=T.reduce((k,q)=>Math.max(k,q.order||0),0),_=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(k){const q=Math.random()*16|0;return(k==="x"?q:q&3|8).toString(16)}),O=R.useCallback(()=>{const k={id:_(),order:b+1,subjectId:i,_action:"create"},q=[...d,k];p(q),c(q)},[d,b,i,c]),C=R.useCallback(k=>{const q=d.find(G=>G.id===k);v({show:!0,semesterId:k,semesterOrder:q==null?void 0:q.order})},[d]),w=R.useCallback(()=>{v({show:!1,semesterId:null,semesterOrder:null})},[]),j=R.useCallback(k=>{const q=d.filter(G=>G.id!==k);p(q),c(q),v({show:!1,semesterId:null,semesterOrder:null})},[d,c]),B=R.useCallback(k=>{if(k<=0)return;const q=[...T],G=q[k].order,W=q[k-1].order;q[k]={...q[k],order:W},q[k-1]={...q[k-1],order:G},p(q),c(q)},[T,c]),U=R.useCallback(k=>{if(k>=T.length-1)return;const q=[...T],G=q[k].order,W=q[k+1].order;q[k]={...q[k],order:W},q[k+1]={...q[k+1],order:G},p(q),c(q)},[T,c]);return x.jsxs("div",{className:"mb-3",children:[x.jsxs(Zy,{id:"semesters",title:"Semestry",children:[T.length>0?x.jsx("div",{className:"mb-3",children:x.jsxs("table",{className:"table table-sm table-bordered",children:[x.jsx("thead",{className:"table-light",children:x.jsxs("tr",{children:[x.jsx("th",{style:{width:"70px"},children:"Pořadí"}),x.jsx("th",{style:{width:"140px"},children:"Název"}),x.jsx("th",{children:"ID"}),x.jsx("th",{style:{width:"120px"},children:"Akce"})]})}),x.jsx("tbody",{children:T.map((k,q)=>x.jsxs("tr",{children:[x.jsx("td",{children:k.order}),x.jsx("td",{children:EB(k.order)}),x.jsx("td",{children:x.jsx("small",{className:"text-muted",children:k.id})}),x.jsx("td",{children:x.jsxs("div",{className:"btn-group btn-group-sm",children:[x.jsx("button",{type:"button",className:"btn btn-outline-secondary",onClick:()=>B(q),disabled:s||q===0,title:"Posunout nahoru",children:"↑"}),x.jsx("button",{type:"button",className:"btn btn-outline-secondary",onClick:()=>U(q),disabled:s||q===T.length-1,title:"Posunout dolů",children:"↓"}),x.jsx("button",{type:"button",className:"btn btn-outline-danger",onClick:()=>C(k.id),disabled:s,title:"Odebrat semestr",children:"✕"})]})})]},k.id))})]})}):x.jsx("div",{className:"text-muted mb-3",children:"Žádné semestry"}),x.jsxs("button",{type:"button",className:"btn btn-sm btn-success",onClick:O,disabled:s,children:["+ Přidat nový semestr (pořadí: ",b+1,")"]})]}),y.show&&x.jsx("div",{className:"modal fade show d-block",tabIndex:"-1",style:{backgroundColor:"rgba(0,0,0,0.5)"},children:x.jsx("div",{className:"modal-dialog modal-dialog-centered",children:x.jsxs("div",{className:"modal-content",children:[x.jsxs("div",{className:"modal-header",children:[x.jsx("h5",{className:"modal-title",children:"Potvrzení smazání"}),x.jsx("button",{type:"button",className:"btn-close",onClick:w,"aria-label":"Zavřít"})]}),x.jsxs("div",{className:"modal-body",children:[x.jsxs("p",{children:["Opravdu chcete smazat semestr ",x.jsxs("strong",{children:["#",y.semesterOrder]}),"?"]}),x.jsxs("div",{className:"alert alert-warning mb-0",children:[x.jsx("strong",{children:"Upozornění:"})," Pokud semestr obsahuje klasifikace nebo jiná data, smazání se nepodaří a bude nutné nejprve odstranit všechna související data."]})]}),x.jsxs("div",{className:"modal-footer",children:[x.jsx("button",{type:"button",className:"btn btn-secondary",onClick:w,children:"Zrušit"}),x.jsx("button",{type:"button",className:"btn btn-danger",onClick:()=>j(y.semesterId),children:"Smazat semestr"})]})]})})})]})},Dx=({item:a,onChange:i=p=>null,onBlur:c=p=>null,onSemestersChange:s=p=>null,children:d})=>{const p=y=>{i({target:{id:"programId",value:y}})};return x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:"mb-3",label:"Program",children:[x.jsx("label",{htmlFor:"programId",className:"form-label",children:"Program"}),x.jsx(SB,{id:"programId",value:(a==null?void 0:a.programId)||"",onChange:p})]}),x.jsx(To,{id:"name",label:"Název",className:"form-control",value:(a==null?void 0:a.name)||"",onChange:i,onBlur:c}),x.jsx(To,{id:"nameEn",label:"Anglický název",className:"form-control",value:(a==null?void 0:a.nameEn)||"",onChange:i,onBlur:c}),x.jsx(Zy,{id:"description",title:"Popis",children:x.jsx("textarea",{id:"description",className:"form-control",rows:4,value:(a==null?void 0:a.description)||"",onChange:i,onBlur:c})}),x.jsx(Zy,{id:"descriptionEn",title:"Anglický popis",children:x.jsx("textarea",{id:"descriptionEn",className:"form-control",rows:4,value:(a==null?void 0:a.descriptionEn)||"",onChange:i,onBlur:c})}),x.jsx(TB,{semesters:a==null?void 0:a.semesters,subjectId:a==null?void 0:a.id,onSemestersChange:s}),d]})},xB=({item:a,children:i,mutationAsyncAction:c=kD,DefaultContent:s=Dx})=>{const{onChange:d}=ep(),p=ss(),y=Xu(),[v,T]=R.useState((a==null?void 0:a.semesters)||[]),[b,_]=R.useState((a==null?void 0:a.semesters)||[]),[O,C]=R.useState(!1),[w,j]=R.useState(null),B=R.useRef(null),U=R.useRef(v);R.useEffect(()=>{U.current=v},[v]),R.useEffect(()=>{T((a==null?void 0:a.semesters)||[]),_((a==null?void 0:a.semesters)||[])},[a==null?void 0:a.id,a==null?void 0:a.semesters]);const{draft:k,setDraft:q,dirty:G,loading:W,error:$,autoSaveEnabled:F,toggleAutoSave:I,effectiveMode:V,onChange:ye,onBlur:ce,onCancel:je,onConfirm:xe}=ED(c,a,{mode:"live",defaultAutoSave:!0}),Be=R.useCallback(()=>{if(v.length!==b.length)return!0;const N=new Set(v.map(re=>re.id)),Z=new Set(b.map(re=>re.id));for(const re of Z)if(!N.has(re))return!0;for(const re of N)if(!Z.has(re))return!0;for(const re of b){const le=v.find(Te=>Te.id===re.id);if(le&&le.order!==re.order)return!0}return!1},[v,b]),$e=G||Be(),Ge=R.useCallback(async N=>{var re,le,Te,Ae,Me,Ke,Xe,rt;C(!0),j(null);const Z=[];try{const Le=U.current,Ve=new Map(Le.map(ot=>[ot.id,ot])),Ot=new Map(N.map(ot=>[ot.id,ot])),Qt=new Map(Le.map(ot=>[ot.id,ot.lastchange])),Rt=N.filter(ot=>ot._action==="create"),zt=Le.filter(ot=>!Ot.has(ot.id)&&!ot._action),rn=N.filter(ot=>{if(ot._action==="create")return!1;const He=Ve.get(ot.id);return He&&He.order!==ot.order});for(const ot of Rt){const He=await p(Ex({id:ot.id,subjectId:a.id,order:ot.order},y)),Zt=((re=He==null?void 0:He.data)==null?void 0:re.semesterInsert)||(He==null?void 0:He.semesterInsert)||He;Zt!=null&&Zt.id&&Qt.set(Zt.id,Zt.lastchange)}for(const ot of zt){const He=Qt.get(ot.id)||ot.lastchange;if(!He){console.error("Cannot delete semester - missing lastchange:",ot.id),Z.push(ot);continue}const Zt=await p(qD({id:ot.id,lastchange:He},y)),At=((le=Zt==null?void 0:Zt.data)==null?void 0:le.semesterDelete)||(Zt==null?void 0:Zt.semesterDelete)||Zt;if((At==null?void 0:At.failed)===!0){if((Te=At==null?void 0:At.msg)!=null&&Te.includes("ForeignKey")||(Ae=At==null?void 0:At.msg)!=null&&Ae.includes("foreign key")||(Me=At==null?void 0:At.msg)!=null&&Me.includes("still referenced")){Z.push(ot);continue}Z.push(ot);continue}}for(const ot of rn){const He=Qt.get(ot.id)||ot.lastchange||((Ke=Ve.get(ot.id))==null?void 0:Ke.lastchange);if(!He)throw console.error("Cannot update semester - missing lastchange:",ot.id),new Error("Nepodařilo se aktualizovat semestr - chybí lastchange");const Zt=await p(X5({id:ot.id,lastchange:He,subjectId:a.id,order:ot.order},y)),At=((Xe=Zt==null?void 0:Zt.data)==null?void 0:Xe.semesterUpdate)||(Zt==null?void 0:Zt.semesterUpdate)||Zt;if((rt=At==null?void 0:At.__typename)!=null&&rt.includes("Error")||(At==null?void 0:At.failed)===!0)throw new Error((At==null?void 0:At.msg)||"Nepodařilo se aktualizovat pořadí semestru");At!=null&&At.lastchange&&Qt.set(ot.id,At.lastchange)}let Sa=N.map(ot=>{const{_action:He,...Zt}=ot,At=Qt.get(ot.id);return At?{...Zt,lastchange:At}:Zt});for(const ot of Z)Sa.some(He=>He.id===ot.id)||Sa.push(ot);return Sa=Sa.sort((ot,He)=>(ot.order||0)-(He.order||0)),T(Sa),_(Sa),q(ot=>({...ot,semesters:Sa})),Z.length>0?(j(new Error("Nelze smazat semestr - obsahuje klasifikace nebo jiná data")),!1):!0}catch(Le){return _(U.current),q(Ve=>({...Ve,semesters:U.current})),j(Le),!1}finally{C(!1)}},[p,y,a==null?void 0:a.id,q]),Y=R.useCallback(N=>{_(N),q(Z=>({...Z,semesters:N})),V==="live"&&(B.current&&clearTimeout(B.current),B.current=setTimeout(()=>{Ge(N)},600))},[V,q,Ge]);R.useEffect(()=>()=>{B.current&&clearTimeout(B.current)},[]);const se=R.useCallback(async()=>{if(Be()&&!await Ge(b))return null;const N=await xe();return N&&await d({target:{value:N}}),N},[xe,d,Be,Ge,b]),Ee=R.useCallback(()=>{_(v),q(N=>({...N,semesters:v})),je()},[je,v,q]),Ne=W||O,fe=$||w;return x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:"d-flex justify-content-end align-items-center mb-3 p-2 bg-light rounded",children:[x.jsxs("div",{className:"form-check form-switch m-0 me-3",children:[x.jsx("input",{className:"form-check-input",type:"checkbox",role:"switch",id:"autoSaveSwitch",checked:F,onChange:I}),x.jsx("label",{className:"form-check-label",htmlFor:"autoSaveSwitch",children:"Automatické ukládání"})]}),V==="live"&&Ne&&x.jsxs("span",{className:"text-muted small",children:[x.jsx("span",{className:"spinner-border spinner-border-sm me-1",role:"status","aria-hidden":"true"}),"Ukládám..."]})]}),x.jsx(s,{item:{...k,semesters:b},onChange:ye,onBlur:ce,onSemestersChange:Y,children:i}),V==="confirm"&&x.jsxs("div",{className:"d-flex gap-2 mt-3",children:[x.jsx("button",{className:"btn btn-outline-secondary flex-grow-1",onClick:Ee,disabled:!$e||Ne,children:"Zrušit změny"}),x.jsx("button",{className:"btn btn-primary flex-grow-1",onClick:se,disabled:!$e||Ne,children:Ne?x.jsxs(x.Fragment,{children:[x.jsx("span",{className:"spinner-border spinner-border-sm me-2",role:"status","aria-hidden":"true"}),"Ukládám..."]}):"Uložit změny"})]}),fe&&x.jsx("div",{className:"alert alert-danger mt-2",children:(fe==null?void 0:fe.message)||"Chyba při ukládání"})]})},Pb=({queryAsyncAction:a=k5,PageNavbar:i=()=>null,ItemLayout:c=bB,SubPage:s=null,...d})=>x.jsx(E5,{queryAsyncAction:a,PageNavbar:i,ItemLayout:c,SubPage:s,...d}),_B=({children:a,PageNavbar:i=()=>null})=>x.jsxs(x.Fragment,{children:[x.jsx(i,{}),a]}),OB=({column:a,sortConfig:i,onSort:c})=>{const s=i.column===a,d=s?i.direction:null,p=()=>!s||d===null?"↕":d==="asc"?"↑":"↓",y=()=>!s||d===null?"Seřadit vzestupně":d==="asc"?"Seřadit sestupně":"Zrušit řazení";return x.jsx("button",{type:"button",className:`btn btn-sm ${s?"btn-primary":"btn-outline-secondary"} ms-1`,onClick:()=>c(a),title:y(),style:{padding:"0.1rem 0.3rem",fontSize:"0.75rem"},children:p()})},AB=({tableDef:a,sortConfig:i,onSort:c})=>{const s=["name","nameEn","program","semesters","lastchange"];return x.jsx("thead",{children:x.jsx("tr",{children:Object.entries(a).map(([d,{label:p}])=>x.jsxs("th",{children:[p,s.includes(d)&&x.jsx(OB,{column:d,sortConfig:i,onSort:c})]},d))})})},PD=(a,i)=>{var c,s;switch(i){case"name":return(a==null?void 0:a.name)||"";case"nameEn":return(a==null?void 0:a.nameEn)||"";case"program":return((c=a==null?void 0:a.program)==null?void 0:c.name)||(a==null?void 0:a.programId)||"";case"semesters":return((s=a==null?void 0:a.semesters)==null?void 0:s.length)||0;case"lastchange":return(a==null?void 0:a.lastchange)||"";default:return""}},CB=(a,i,c)=>{if(typeof a=="number"&&typeof i=="number")return c==="asc"?a-i:i-a;const s=String(a).toLowerCase(),d=String(i).toLowerCase(),p=parseFloat(s),y=parseFloat(d);return!isNaN(p)&&!isNaN(y)?c==="asc"?p-y:y-p:c==="asc"?s.localeCompare(d,"cs"):d.localeCompare(s,"cs")},RB=a=>!a||a.length===0?{}:{name:{label:"Název",component:({row:i})=>x.jsx("td",{children:x.jsx(Ky,{item:i,children:(i==null?void 0:i.name)||"Bez názvu"})})},nameEn:{label:"Anglický název",component:({row:i})=>x.jsx("td",{children:(i==null?void 0:i.nameEn)||""})},program:{label:"Program",component:({row:i})=>{var c;return x.jsx("td",{children:((c=i==null?void 0:i.program)==null?void 0:c.name)||(i==null?void 0:i.programId)||""})}},semesters:{label:"Semestrů",component:({row:i})=>{var c;return x.jsx("td",{children:((c=i==null?void 0:i.semesters)==null?void 0:c.length)||0})}},lastchange:{label:"Změněno",component:({row:i})=>x.jsx("td",{children:i==null?void 0:i.lastchange})},tools:{label:"Nástroje",component:({row:i})=>x.jsx("td",{children:x.jsx(DD,{actions:[{children:x.jsx(Ky,{className:"btn btn-sm btn-outline-secondary border-0 text-start w-100",item:i,children:"Detail"})},{children:x.jsx(FD,{className:"btn btn-sm btn-outline-secondary border-0 text-start w-100",item:i,action:"edit",children:"Editovat"})},{children:x.jsx(KD,{className:"btn btn-sm btn-outline-danger border-0 text-start w-100",item:i,rbacitem:i==null?void 0:i.rbacobject,children:"Smazat"})}]})})}},DB=({data:a})=>{const[i,c]=R.useState({column:null,direction:null}),s=R.useMemo(()=>RB(a),[a]),d=y=>{c(v=>v.column!==y?{column:y,direction:"asc"}:v.direction==="asc"?{column:y,direction:"desc"}:{column:null,direction:null})},p=R.useMemo(()=>!a||!i.column||!i.direction?a:[...a].sort((y,v)=>{const T=PD(y,i.column),b=PD(v,i.column);return CB(T,b,i.direction)}),[a,i]);return!a||a.length===0?null:x.jsx("div",{className:"table-responsive",children:x.jsxs("table",{className:"table table-stripped",children:[x.jsx(AB,{tableDef:s,sortConfig:i,onSort:d}),x.jsx(wD,{data:p,table_def:s})]})})},WD=R.createContext(null),ap=()=>R.useContext(WD);function wB(a,i){if(!a||typeof a!="object"||Array.isArray(a))return!1;const c=Object.keys(a);return c.length===1&&c[0]===i&&Array.isArray(a[i])}function MB(a,i=[]){const c=i.filter(Boolean).filter(d=>Object.keys(d).length>0),s=[];for(const d of c)wB(d,a)?s.push(...d[a]):s.push(d);return s.length===0?{}:s.length===1?s[0]:{[a]:s}}const NB=({id:a,label:i,resetKey:c,join:s="_and",onChange:d=()=>null,children:p})=>{const y=ap(),[v,T]=R.useState({}),[b,_]=R.useState(s),O=R.useCallback($=>{const{id:F,value:I}=$.target;T(V=>({...V,[F]:I}))},[]),C=R.useMemo(()=>Object.values(v).filter(Boolean).map(F=>!Array.isArray(F)||F.length===0?null:F.length===1?F[0]:{_and:F}).filter(Boolean),[v]),w=C.length>1,j=R.useMemo(()=>MB(b,C),[b,C]),B=R.useMemo(()=>a?{[a]:j}:j,[a,j]);R.useEffect(()=>{d({where:B})},[B,d]),R.useEffect(()=>{if(!(y!=null&&y.handleChange))return;const $=!B||typeof B=="object"&&Object.keys(B).length===0;return y.handleChange({target:{id:a??"__root__",value:$?null:[B]}}),()=>{y.handleChange({target:{id:a??"__root__",value:null}})}},[y,B,a]);const U=R.useCallback($=>{_($.target.value)},[]),k=R.useCallback(()=>B,[B]),[q,G]=R.useState(0),W=R.useCallback(()=>{T({}),_(s),G($=>$+1)},[s]);return x.jsx(WD.Provider,{value:{handleChange:O,readFilter:k,resetFilter:W},children:x.jsxs(au,{title:i||a||"where",children:[w&&x.jsxs(Qr,{children:[x.jsx(dn,{children:x.jsxs("label",{children:[x.jsx("input",{type:"radio",name:`join-${a??"root"}`,value:"_and",checked:b==="_and",onChange:U}),"_and"]})}),x.jsx(dn,{children:x.jsxs("label",{children:[x.jsx("input",{type:"radio",name:`join-${a??"root"}`,value:"_or",checked:b==="_or",onChange:U}),"_or"]})})]}),x.jsx("div",{children:p},c??q)]})})};function jB(a){return!a||typeof a!="object"?!0:Array.isArray(a)?a.length===0:Object.keys(a).length===0}function zB(a){return JSON.stringify(a)}const UB=({onClick:a,paramName:i="where",replace:c=!0,...s})=>{const d=ap(),[p,y]=G1(),v=R.useCallback(()=>{if(!(d!=null&&d.readFilter))throw Error("<FilterButton /> must be placed inside <Filter />");const T=new URLSearchParams(p);T.delete(i),a&&a({where:{}}),d.resetFilter&&d.resetFilter(),y(T,{replace:c})},[d,a,p,y,i,c]);return x.jsx("button",{...s,onClick:v})},LB=({onClick:a,paramName:i="where",replace:c=!0,...s})=>{const d=ap(),[p,y]=G1(),v=R.useCallback(()=>{if(!(d!=null&&d.readFilter))throw Error("<FilterButton /> must be placed inside <Filter />");const T=d.readFilter(),b={where:T};if(a)return a(b);const _=new URLSearchParams(p);jB(T)?_.delete(i):_.set(i,zB(T)),y(_,{replace:c})},[d,a,p,y,i,c]);return x.jsx("button",{...s,onClick:v})},BB=({id:a,label:i,initialValue:c="",initialOp:s="_ilike"})=>{const d=ap();if(!d)throw Error("<StringFilter /> must be placed inside <Filter />");const[p,y]=R.useState(s),[v,T]=R.useState(c),[b,_]=R.useState(""),[O,C]=R.useState(""),w=R.useCallback(F=>{d.handleChange({target:{id:a,value:F}})},[d,a]),j=R.useCallback((F,I)=>{if(!I)return null;let V=I;return F==="_ilike"&&(V=I.includes("%")?I:`%${I}%`),[{[a]:{[F]:V}}]},[a]),B=R.useCallback((F,I)=>{const V=[];return F&&V.push({[a]:{_gt:F}}),I&&V.push({[a]:{_lt:I}}),V.length?V:null},[a]),U=R.useCallback(({nextOp:F=p,nextText:I=v,nextFrom:V=b,nextTo:ye=O})=>{w(F==="_between"?B(V,ye):j(F,I))},[p,v,b,O,w,j,B]),k=R.useCallback(F=>{const I=F.target.value;I!==p&&(y(I),U(I==="_between"?{nextOp:I}:{nextOp:I}))},[p,U]),q=R.useCallback(F=>{const I=F.target.value;I!==v&&(T(I),p!=="_between"&&U({nextText:I}))},[p,v,U]),G=R.useCallback(F=>{const I=F.target.value;I!==b&&(_(I),p==="_between"&&U({nextFrom:I}))},[p,b,U]),W=R.useCallback(F=>{const I=F.target.value;I!==O&&(C(I),p==="_between"&&U({nextTo:I}))},[p,O,U]),$=p==="_between";return x.jsx(au,{title:i||a,children:x.jsxs(Qr,{children:[x.jsx(dn,{children:x.jsxs("select",{className:"form-control",value:p,onChange:k,children:[x.jsx("option",{value:"Obsahuje",children:"_ilike"}),x.jsx("option",{value:"Začíná na",children:"_startswith"}),x.jsx("option",{value:"Končí na",children:"_endswith"}),x.jsx("option",{value:"Je rovno",children:"_eq"}),x.jsx("option",{value:"Je větší než",children:"_gt"}),x.jsx("option",{value:"Je menší než",children:"_lt"}),x.jsx("option",{value:"Mezi",children:"_between"})]})}),$?x.jsxs(x.Fragment,{children:[x.jsx(dn,{children:x.jsx(To,{className:"form-control",value:b,onChange:G,placeholder:"from…"})}),x.jsx(dn,{children:p==="_between"&&x.jsx(To,{className:"form-control",value:O,onChange:W,placeholder:"to…"})})]}):x.jsx(dn,{children:x.jsx(To,{className:"form-control",value:v,onChange:q})})]})})};function HB(a){const i=new Date(a);return Number.isNaN(i.getTime())?null:i.toISOString()}const kB=({id:a,label:i,initialOp:c="_gte",initialValue:s="",emitUtcIso:d=!0})=>{const p=ap();if(!p)throw Error("<DateTimeFilter /> must be placed inside <Filter />");const[y,v]=R.useState(c),[T,b]=R.useState(s),[_,O]=R.useState(""),[C,w]=R.useState(""),j=R.useCallback(V=>V?d?HB(V):V:null,[d]),B=R.useCallback(V=>{p.handleChange({target:{id:a,value:V}})},[p,a]),U=R.useCallback((V,ye)=>{const ce=j(ye);return ce?[{[a]:{[V]:ce}}]:null},[a,j]),k=R.useCallback((V,ye)=>{const ce=[],je=j(V),xe=j(ye);return je&&ce.push({[a]:{_gt:je}}),xe&&ce.push({[a]:{_lt:xe}}),ce.length?ce:null},[a,j]),q=R.useCallback(({nextOp:V=y,nextText:ye=T,nextFrom:ce=_,nextTo:je=C})=>{B(V==="_between"?k(ce,je):U(V,ye))},[y,T,_,C,B,U,k]),G=R.useCallback(V=>{const ye=V.target.value;ye!==y&&(v(ye),q({nextOp:ye}))},[y,q]),W=R.useCallback(V=>{const ye=V.target.value;ye!==T&&(b(ye),y!=="_between"&&q({nextText:ye}))},[y,T,q]),$=R.useCallback(V=>{const ye=V.target.value;ye!==_&&(O(ye),y==="_between"&&q({nextFrom:ye}))},[y,_,q]),F=R.useCallback(V=>{const ye=V.target.value;ye!==C&&(w(ye),y==="_between"&&q({nextTo:ye}))},[y,C,q]),I=y==="_between";return x.jsx(au,{title:i||a,children:x.jsxs(Qr,{children:[x.jsx(dn,{children:x.jsxs("select",{className:"form-control",value:y,onChange:G,children:[x.jsx("option",{value:"_eq",children:"_eq"}),x.jsx("option",{value:"_gt",children:"_gt"}),x.jsx("option",{value:"_gte",children:"_gte"}),x.jsx("option",{value:"_lt",children:"_lt"}),x.jsx("option",{value:"_lte",children:"_lte"}),x.jsx("option",{value:"_between",children:"_between"})]})}),I?x.jsxs(x.Fragment,{children:[x.jsx(dn,{children:x.jsx(To,{className:"form-control",type:"datetime-local",value:_,onChange:$,placeholder:"from…"})}),x.jsx(dn,{children:x.jsx(To,{className:"form-control",type:"datetime-local",value:C,onChange:F,placeholder:"to…"})})]}):x.jsx(dn,{children:x.jsx(To,{className:"form-control",type:"datetime-local",value:T,onChange:W})})]})})},e2=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,VB=({id:a,label:i,initialValue:c=""})=>{const s=ap();if(!s)throw Error("<UUIDFilter /> must be placed inside <Filter />");const[d,p]=R.useState(c),y=R.useMemo(()=>(d??"").trim(),[d]),T=y.length===0?!0:e2.test(y),b=R.useCallback(C=>{s.handleChange({target:{id:a,value:C}})},[s,a]),_=R.useCallback(C=>{const w=(C??"").trim();if(!w){b(null);return}if(!e2.test(w)){b(null);return}b([{[a]:{_eq:w}}])},[a,b]),O=R.useCallback(C=>{const w=C.target.value;w!==d&&(p(w),_(w))},[d,_]);return x.jsx(au,{title:i||a,children:x.jsxs(Qr,{children:[x.jsx(dn,{style:{minWidth:80},children:x.jsx("span",{style:{opacity:.7},children:"(_eq)"})}),x.jsxs(dn,{children:[x.jsx(To,{className:`form-control ${T?"":"is-invalid"}`,value:d,onChange:O,placeholder:"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}),!T&&x.jsx("div",{className:"invalid-feedback",style:{display:"block"},children:"Neplatné UUID. Očekávám formát 8-4-4-4-12 hex (např. 550e8400-e29b-41d4-a716-446655440000)."})]})]})})},qB=({id:a,onChange:i,children:c})=>x.jsxs(NB,{id:a,onChange:i,children:[x.jsx(VB,{id:"id"}),x.jsx(BB,{id:"name"}),x.jsx(kB,{id:"created",emitUtcIso:!1}),c]}),$B=({collapsed:a=!0,children:i,buttonLabel:c,buttonLabelCollapsed:s="Zobrazit",buttonLabelExpanded:d="Skrýt",onToggle:p,...y})=>{const[v,T]=R.useState(a);R.useEffect(()=>{T(a)},[a]);const b=R.useCallback(()=>{T(O=>{const C=!O;return p==null||p(C),C})},[p]),_=c??(v?s:d);return x.jsxs(x.Fragment,{children:[x.jsx("div",{hidden:v,"aria-hidden":v,children:i}),x.jsx("button",{type:"button",...y,onClick:b,"aria-expanded":!v,children:_})]})};function YB(a,i="where"){const c=a.get(i);if(!c)return null;try{const s=JSON.parse(c);return s&&typeof s=="object"?s:null}catch{return null}}const wx="gr_where",t2=({children:a,queryAsyncAction:i=q5})=>{const[c]=G1(),s=R.useMemo(()=>YB(c,wx),[c.toString()]),{items:d,loading:p,error:y,hasMore:v,sentinelRef:T,loadMore:b,restart:_}=W5({asyncAction:i,actionParams:{skip:0,limit:25,where:s}});return R.useEffect(()=>{_({skip:0,limit:25,where:s})},[s]),x.jsxs(_B,{children:[x.jsx($B,{className:"form-control btn btn-outline-primary",buttonLabelCollapsed:"Zobrazit filtr",buttonLabelExpanded:"Skrýt filtr",children:x.jsxs(qB,{children:[x.jsx(LB,{className:"form-control btn btn-outline-success",paramName:wx,children:"Filtrovat"}),x.jsx(UB,{className:"form-control btn btn-warning",paramName:wx,children:"Vymazat filtr"})]})}),x.jsx(DB,{data:d}),x.jsx(Pu,{error:y,loading:p,text:"Nahrávám další..."}),v&&x.jsx("div",{ref:T,style:{height:80,backgroundColor:"lightgray"}}),v&&x.jsx("button",{className:"btn btn-success form-control",onClick:()=>b(),children:"Více"})]})},GB=({SubPage:a=dB,...i})=>x.jsx(Pb,{SubPage:a,...i}),QB=({...a})=>x.jsxs(Qr,{children:[x.jsx(o6,{}),x.jsx(C6,{children:x.jsx(uB,{...a})})]}),XB=({SubPage:a=QB,...i})=>x.jsx(Pb,{SubPage:a,...i}),IB=a=>{const i=parseInt(a,10)||0,c=Math.ceil(i/2),s=i%2===1;return`${c}. ročník ${s?"zimní":"letní"}`},ZB=({item:a})=>{var i,c,s;return x.jsxs(x.Fragment,{children:[x.jsxs(Fb,{item:a,title:"Program",children:[x.jsx(Hl,{label:"Název",children:(i=a==null?void 0:a.program)==null?void 0:i.name}),x.jsx(Hl,{label:"ID",children:x.jsx("a",{href:`/program/ProgramGQLModel/${(c=a==null?void 0:a.program)==null?void 0:c.id}`,children:(s=a==null?void 0:a.program)==null?void 0:s.id})})]}),x.jsx(Fb,{title:"Semestry",children:x.jsxs("table",{className:"table table-sm",children:[x.jsx("thead",{children:x.jsxs("tr",{children:[x.jsx("th",{children:"Pořadí"}),x.jsx("th",{children:"Název"}),x.jsx("th",{children:"ID"}),x.jsx("th",{children:"Last change"})]})}),x.jsx("tbody",{children:[...a.semesters].sort((d,p)=>(parseInt(d.order,10)||0)-(parseInt(p.order,10)||0)).map(d=>x.jsxs("tr",{children:[x.jsx("td",{children:d.order}),x.jsx("td",{children:IB(d.order)}),x.jsx("td",{children:x.jsx("a",{href:`/semestr/SemesterGQLModel/${d.id}`,children:d.id})}),x.jsx("td",{children:a.lastchange})]},d.id))})]})})]})},n2=({SubPage:a=ZB,...i})=>x.jsx(Pb,{SubPage:a,...i}),JB=({SubPage:a=yB,...i})=>x.jsx(Pb,{SubPage:a,...i}),FB=[{path:eB,element:x.jsx(XB,{})},{path:_x,element:x.jsx(t2,{})},{path:Fy,element:x.jsx(n2,{})},{path:QD,element:x.jsx(GB,{})},{path:lB,element:x.jsx(JB,{})},{path:_x.replace("list",":any"),element:x.jsx(t2,{})},{path:Fy.replace("view",":any"),element:x.jsx(n2,{})}],Mx=()=>null,KB=({indexUrl:a,item:i,children:c,handleSearchChange:s,HomeButton:d=Mx,PersonButton:p=Mx,SearchBox:y=Mx})=>x.jsxs(Bb,{bg:"light",expand:"lg",children:[x.jsx(Bb.Toggle,{"aria-controls":"basic-navbar-nav"}),x.jsx(Bb.Collapse,{id:"basic-navbar-nav",children:x.jsxs(j4,{variant:"tabs",className:"align-items-center w-100 flex-column flex-lg-row",children:[x.jsx(d,{indexURL:a}),x.jsx("div",{className:"mx-auto d-flex align-items-center flex-column flex-lg-row mb-0",children:c}),x.jsx("div",{className:"d-flex flex-column flex-lg-row align-items-center ml-lg-auto",children:x.jsx(y,{handleSearchChange:s})}),x.jsx(p,{item:i})]})})]}),PB=()=>{const{id:a}=Yf(),i=J1(c=>ST(c,a))||{};return x.jsx(KB,{item:i})},WB=()=>x.jsxs(G4,{children:[x.jsx(PB,{}),x.jsx(X4,{}),x.jsx(yj,{})]}),e8=[{path:"/",element:x.jsx(WB,{}),children:[...FB,...A5]}],t8=$j(e8),n8=()=>x.jsx(ez,{router:t8}),a8="/api/gql",l8=({GQLENDPOINT:a=a8})=>x.jsx(FU,{clientOptions:{endpoint:a},children:x.jsx(n8,{})});function a2(a,i={}){if(!a)throw new Error("MyApp.mount: missing mount element");console.log("inside mount, doing to render"),AM.createRoot(a).render(x.jsx(l8,{...i})),console.log("inside mount, render finished")}typeof window<"u"&&(window.MyApp={mount:a2}),zh.mount=a2,Object.defineProperty(zh,Symbol.toStringTag,{value:"Module"})}));
1022
+ `),qD=Ia(I5),Z5=(a=[],i=[])=>{const c=new Map;return a.forEach(s=>(s==null?void 0:s.id)!=null&&c.set(s.id,s)),i.forEach(s=>(s==null?void 0:s.id)!=null&&c.set(s.id,s)),Array.from(c.values())},J5=a=>{const i={...a,skip:(a.skip||0)+(a.limit||10),limit:a.limit||10};return console.log("newFilter",i),i},F5=a=>{const i=a!=null&&a.data?a.data:a,c=i?Object.values(i):[];let s=c==null?void 0:c[0];return Array.isArray(s)||(s=c.find(d=>Array.isArray(d)),Array.isArray(s))?s:[]},K5=a=>{if(!a)return!1;const i=a.getBoundingClientRect();return i.top<window.innerHeight&&i.bottom>0},P5=()=>null,W5=({preloadedItems:a,actionParams:i,asyncAction:c,calculateNewFilter:s=J5,reset:d=0,onAll:p=P5,enabled:y=!0,autoload:v=!0}={})=>{const T=ss(),b=Xu();if(typeof c!="function")throw Error("useInfiniteScroll.asyncAction must be a function, typically pageRead");const _=R.useMemo(()=>({...i||{}}),[i]),[O,C]=R.useState(()=>({filter:_,loading:!1,hasMore:!0,error:null,items:a,result:null})),w=R.useRef(0),j=R.useRef(!1),B=R.useRef(O);R.useEffect(()=>{B.current=O},[O]);const U=R.useRef(_);R.useEffect(()=>{U.current=O.filter},[O.filter]);const k=R.useRef(y);R.useEffect(()=>{k.current=y},[y]),R.useEffect(()=>{C(F=>({...F,items:a}))},[a]),R.useEffect(()=>{C(F=>({...F,filter:{...i||{}},loading:!1,hasMore:!0,error:null,items:[]}))},[d]);const q=R.useCallback(async()=>{if(!k.current||j.current)return null;j.current=!0;const F=w.current;try{const I=B.current;if(I.loading||!I.hasMore)return null;C(je=>({...je,loading:!0,error:null}));const V=U.current,ye=await T(c(V,b)),ce=F5(ye);return w.current!==F?null:(C(je=>{const xe=Z5(je.items,ce),Be=ce.length,$e=(V&&V.limit!=null?V.limit:void 0)??(je.filter&&je.filter.limit!=null?je.filter.limit:void 0),Ge=$e==null?Be>0:Be===$e;Ge||p();const Y=Ge?(()=>{const se={fetched:ce,fetchedCount:Be,limit:$e,params:V,result:ye};return(s.length>=2?s(je.filter,se):s(je.filter))??je.filter})():je.filter;return U.current=Y,{...je,items:xe,filter:Y,hasMore:Ge,loading:!1,result:ye}}),ye)}catch(I){return w.current===F&&C(V=>({...V,loading:!1,hasMore:!1,error:I})),null}finally{j.current=!1}},[T,c,b,p,s]),G=R.useCallback(async(F={})=>{w.current+=1,j.current=!1;const I={...F||{}};return U.current=I,C(V=>({...V,filter:I,loading:!1,hasMore:!0,error:null,items:[],result:null})),await new Promise(V=>requestAnimationFrame(V)),q()},[q]),W=R.useRef(null),$=R.useCallback(F=>{W.current=F},[]);return R.useEffect(()=>{const F=W.current;if(!y||!F)return;const I=new IntersectionObserver(([ce])=>{ce.isIntersecting&&k.current&&q()});I.observe(F);let V=!1;return(async()=>{if(v)for(await new Promise(ce=>requestAnimationFrame(ce)),await new Promise(ce=>setTimeout(ce,0));!V&&k.current;){const ce=B.current;if(ce.loading||!ce.hasMore||!K5(F))break;await q(),await new Promise(je=>requestAnimationFrame(je))}})(),()=>{V=!0,I.disconnect()}},[y,v,q,d]),{items:O.items,loading:O.loading,error:O.error,hasMore:O.hasMore,filter:O.filter,result:O.result,loadMore:q,restart:G,sentinelRef:$}},Tx=a=>String(a??"").replace(/^\/+|\/+$/g,""),$D=({app:a="_",model:i="_",action:c="view",withId:s=!1,idParam:d=":id"}={})=>{const p={app:Tx(a),model:Tx(i),action:Tx(c),withId:!!s,idParam:String(d).startsWith(":")?String(d):`:${String(d)}`},y=`/${p.app}/${p.model}/${p.action}`.replace(/\/+/g,"/"),v=p.withId?`${y}/${p.idParam}`:y,T={path:v,segments:p,toString(){return v},valueOf(){return v},[Symbol.toPrimitive](){return v},change(b={}){return $D({...p,...b})},app(b){return T.change({app:b})},model(b){return T.change({model:b})},action(b){return T.change({action:b})},id(b=!0){return T.change({withId:b})},idParam(b=":id"){return T.change({idParam:b})}};return T},YD="/subject";$D({app:YD});const Jy=`${YD}/SubjectGQLModel`,xx=`${Jy}/list/`,eB=`${Jy}/create/`,tB=`${Jy}/view/`,nB=`${Jy}/edit/`,aB=`${Jy}/delete/`,GD=tB,_x=xx,Ox=":id",Fy=`${GD}${Ox}`,QD=`${nB}${Ox}`,lB=`${aB}${Ox}`,Ky=({item:a,LinkURI:i=GD,action:c="view",children:s,...d})=>{const p=i.replace("view",c);return x.jsx(Zh,{to:p+(a==null?void 0:a.id),...d,children:s||(a==null?void 0:a.fullname)||(a==null?void 0:a.name)||(a==null?void 0:a.id)||"Nevim"})};I4("SubjectGQLModel",Ky);const Fb=({item:a,children:i,title:c=null})=>(c||(c=x.jsxs(x.Fragment,{children:[x.jsx(vD,{})," ",x.jsx(Ky,{item:a})]})),x.jsx(gl,{title:c,children:i})),XD=({item:a,children:i})=>{var c,s,d,p,y,v,T,b,_;return console.log("item",a),x.jsxs(x.Fragment,{children:[(a==null?void 0:a.name)&&x.jsx(Hl,{label:"Název",children:x.jsx(Ky,{item:a})}),(a==null?void 0:a.nameEn)&&x.jsx(Hl,{label:"Anglický název",children:a.nameEn}),(a==null?void 0:a.description)&&x.jsx(Hl,{label:"Popis",children:a.description}),(a==null?void 0:a.descriptionEn)&&x.jsx(Hl,{label:"Anglický popis",children:a.descriptionEn}),(((c=a==null?void 0:a.program)==null?void 0:c.name)||((s=a==null?void 0:a.program)==null?void 0:s.id))&&x.jsx(Hl,{label:"Program",children:x.jsx("a",{href:`/program/ProgramGQLModel/${(d=a==null?void 0:a.program)==null?void 0:d.id}`,children:((p=a==null?void 0:a.program)==null?void 0:p.name)||((y=a==null?void 0:a.program)==null?void 0:y.id)})}),((T=(v=a==null?void 0:a.rbacobject)==null?void 0:v.currentUserRoles)==null?void 0:T.length)>0&&x.jsx(Hl,{label:"Moje role",children:a.rbacobject.currentUserRoles.map(O=>{var C;return x.jsx("span",{className:"badge bg-secondary me-1",children:(C=O.roletype)==null?void 0:C.name},O.id)})}),x.jsx("hr",{}),((b=a==null?void 0:a.createdby)==null?void 0:b.fullname)&&x.jsx(Hl,{label:"Vytvořil",children:a.createdby.fullname}),(a==null?void 0:a.created)&&x.jsx(Hl,{label:"Vytvořeno",children:qb(a.created)}),(a==null?void 0:a.lastchange)&&x.jsx(Hl,{label:"Změněno",children:qb(a.lastchange)}),((_=a==null?void 0:a.changedby)==null?void 0:_.fullname)&&x.jsx(Hl,{label:"Změnil",children:a.changedby.fullname}),i]})},Ax=a=>x.jsx(Dx,{...a}),ID=HD,Kb={oneOfRoles:["administrátor"],mode:"absolute"},rB={name:"Nový"},iB=({readItemURI:a=Fy,rbacitem:i,item:c=rB,children:s,...d})=>{const[p,y]=R.useState(!1),v=tu(),T=R.useCallback(()=>y(!0),[]),b=R.useCallback(()=>y(!1),[]),_=R.useCallback(C=>{b(),a&&(C!=null&&C.id)&&v(a.replace(":id",C.id))},[b,v,a]),O=R.useCallback(()=>{b()},[b]);return x.jsxs(np,{oneOfRoles:Kb.oneOfRoles,mode:Kb.mode,item:i,children:[x.jsx("button",{...d,onClick:T,children:s||"Vytvořit nový"}),p&&x.jsx(oB,{onOk:_,onCancel:O,item:c})]})},oB=({title:a="Nový předmět",onOk:i,onCancel:c,item:s,...d})=>{const p=ss(),y=Xu(),[v,T]=R.useState(()=>({id:crypto.randomUUID(),name:"Nový",semesters:[],...s})),[b,_]=R.useState(!1),[O,C]=R.useState(null),w=R.useCallback(q=>{var $,F,I;const G=(($=q==null?void 0:q.target)==null?void 0:$.id)||((F=q==null?void 0:q.target)==null?void 0:F.name),W=(I=q==null?void 0:q.target)==null?void 0:I.value;if(!G){console.warn("CreateDialog.handleChange: no field id",q);return}T(V=>({...V,[G]:W}))},[]),j=R.useCallback(q=>{w(q)},[w]),B=R.useCallback(q=>{T(G=>({...G,semesters:q}))},[]),U=R.useCallback(async()=>{var q,G,W,$;if(!v.programId){C(new Error("Musíte vybrat program"));return}_(!0),C(null);try{const F=await p(HD(v,y)),I=((q=F==null?void 0:F.data)==null?void 0:q.subjectInsert)||(F==null?void 0:F.subjectInsert)||F;if((I==null?void 0:I.failed)===!0||(G=I==null?void 0:I.__typename)!=null&&G.includes("Error"))throw new Error((I==null?void 0:I.msg)||"Nepodařilo se vytvořit předmět");const V=(I==null?void 0:I.id)||v.id,ye=(v.semesters||[]).filter(ce=>ce._action==="create");for(const ce of ye){const je=await p(Ex({id:ce.id,subjectId:V,order:ce.order},y)),xe=((W=je==null?void 0:je.data)==null?void 0:W.semesterInsert)||(je==null?void 0:je.semesterInsert)||je;((xe==null?void 0:xe.failed)===!0||($=xe==null?void 0:xe.__typename)!=null&&$.includes("Error"))&&console.error("Failed to create semester:",xe==null?void 0:xe.msg)}i&&i({...v,id:V})}catch(F){C(F)}finally{_(!1)}},[v,p,y,i]),k=b||!v.programId;return x.jsxs(Ib,{title:a,oklabel:b?"Ukládám...":"Ok",cancellabel:"Zrušit",onCancel:c,onOk:U,okDisabled:k,...d,children:[x.jsx(Ax,{item:v,onChange:w,onBlur:j,onSemestersChange:B}),!v.programId&&x.jsx("div",{className:"alert alert-warning mt-2",children:"Pro vytvoření předmětu musíte vybrat program."}),O&&x.jsx("div",{className:"alert alert-danger mt-2",children:(O==null?void 0:O.message)||"Chyba při ukládání"})]})},uB=({mutationAsyncAction:a=ID,DefaultContent:i=Ax,readItemURI:c=Fy,rbacitem:s,onOk:d,onCancel:p,...y})=>x.jsx(np,{oneOfRoles:Kb.oneOfRoles,mode:Kb.mode,item:s,children:x.jsx(cB,{mutationAsyncAction:a,DefaultContent:i,readItemURI:c,onOk:d,onCancel:p,...y})}),cB=({mutationAsyncAction:a=ID,DefaultContent:i=Ax,readItemURI:c=Fy,onOk:s,onCancel:d,...p})=>{const y=tu(),v=ss(),T=Xu(),b=R.useMemo(()=>({id:crypto.randomUUID(),name:"Nový",semesters:[]}),[]),[_,O]=R.useState(b),[C,w]=R.useState(!1),[j,B]=R.useState(null),U=R.useCallback($=>{const F=$.target.name||$.target.id,I=$.target.value;O(V=>({...V,[F]:I}))},[]),k=R.useCallback(()=>{},[]),q=R.useCallback($=>{O(F=>({...F,semesters:$}))},[]),G=R.useCallback(async()=>{if(d){await d();return}y(-1)},[y,d]),W=R.useCallback(async()=>{var $,F,I,V;w(!0),B(null),console.log("CreateBodyWithSemesters: handleConfirm called"),console.log("CreateBodyWithSemesters: draft =",_),console.log("CreateBodyWithSemesters: draft.semesters =",_.semesters);try{const ye=await v(a(_,T)),ce=(($=ye==null?void 0:ye.data)==null?void 0:$.subjectInsert)||(ye==null?void 0:ye.subjectInsert)||ye;if(console.log("CreateBodyWithSemesters: subjectResponse =",ye),console.log("CreateBodyWithSemesters: subjectResult =",ce),(ce==null?void 0:ce.failed)===!0||(F=ce==null?void 0:ce.__typename)!=null&&F.includes("Error"))throw new Error((ce==null?void 0:ce.msg)||"Nepodařilo se vytvořit předmět");const je=(ce==null?void 0:ce.id)||_.id;console.log("CreateBodyWithSemesters: subjectId =",je);const xe=(_.semesters||[]).filter(Be=>Be._action==="create");console.log("CreateBodyWithSemesters: semestersToCreate =",xe);for(const Be of xe){console.log("CreateBodyWithSemesters: Creating semester =",Be);const $e=await v(Ex({id:Be.id,subjectId:je,order:Be.order},T));console.log("CreateBodyWithSemesters: semesterResponse =",$e);const Ge=((I=$e==null?void 0:$e.data)==null?void 0:I.semesterInsert)||($e==null?void 0:$e.semesterInsert)||$e;((Ge==null?void 0:Ge.failed)===!0||(V=Ge==null?void 0:Ge.__typename)!=null&&V.includes("Error"))&&console.error("Failed to create semester:",Ge==null?void 0:Ge.msg)}return s?await s(ce,_):c&&y&&y(c.replace(":id",je),{replace:!0}),ce}catch(ye){return B(ye),null}finally{w(!1)}},[v,_,T,a,y,s,c]);return x.jsx(x.Fragment,{children:x.jsxs(i,{item:_,onChange:U,onBlur:k,onSemestersChange:q,...p,children:[x.jsx(Pu,{error:j,loading:C}),x.jsx("button",{className:"btn btn-warning form-control",onClick:G,disabled:C,children:"Zrušit změny"}),x.jsx("button",{className:"btn btn-primary form-control",onClick:W,disabled:C,children:C?x.jsxs(x.Fragment,{children:[x.jsx("span",{className:"spinner-border spinner-border-sm me-2",role:"status","aria-hidden":"true"}),"Ukládám..."]}):"Uložit změny"})]})})},ZD=a=>x.jsx(Dx,{...a}),JD=kD,Cx={oneOfRoles:["administrátor"],mode:"absolute"},FD=({uriPattern:a=QD,...i})=>x.jsx(_D,{...i,uriPattern:a,...Cx}),sB=({DefaultContent:a=ZD,mutationAsyncAction:i=JD,...c})=>x.jsx(CD,{...c,DefaultContent:a,mutationAsyncAction:i,...Cx}),fB=({DefaultContent:a=ZD,Dialog:i=sB,mutationAsyncAction:c=JD,...s})=>x.jsx(AD,{...s,DefaultContent:a,Dialog:i,mutationAsyncAction:c,...Cx}),dB=({children:a})=>{const{item:i}=ep();return i?x.jsx(xB,{item:i,children:a}):x.jsx(x.Fragment,{children:"Načítání..."})},hB=XD,pB=VD,Rx={oneOfRoles:["administrátor"],mode:"absolute"},KD=({vectorItemsURI:a=xx,item:i,rbacitem:c,onOk:s,children:d,...p})=>{const[y,v]=R.useState(!1),T=tu(),b=R.useCallback(()=>v(!0),[]),_=R.useCallback(()=>v(!1),[]),O=R.useCallback(()=>{_(),s?s():a&&T(a)},[_,T,s,a]),C=R.useCallback(()=>{_()},[_]);return x.jsxs(np,{oneOfRoles:Rx.oneOfRoles,mode:Rx.mode,item:c,children:[x.jsx("button",{...p,onClick:b,children:d||"Smazat"}),y&&x.jsx(mB,{item:i,onOk:O,onCancel:C,vectorItemsURI:a})]})},mB=({item:a,onOk:i,onCancel:c,...s})=>{var C;const d=ss(),p=Xu(),[y,v]=R.useState(!1),[T,b]=R.useState(null),_=((C=a==null?void 0:a.semesters)==null?void 0:C.length)||0,O=R.useCallback(async()=>{var w,j,B,U,k;v(!0),b(null);try{const q=(a==null?void 0:a.semesters)||[];for(const $ of q){if(!$.lastchange){console.warn("Semester missing lastchange, skipping:",$.id);continue}const F=await d(qD({id:$.id,lastchange:$.lastchange},p)),I=((w=F==null?void 0:F.data)==null?void 0:w.semesterDelete)||(F==null?void 0:F.semesterDelete)||F;if((I==null?void 0:I.failed)===!0)throw(j=I==null?void 0:I.msg)!=null&&j.includes("ForeignKey")||(B=I==null?void 0:I.msg)!=null&&B.includes("foreign key")||(U=I==null?void 0:I.msg)!=null&&U.includes("still referenced")?new Error(`Nelze smazat semestr #${$.order} - obsahuje klasifikace nebo jiná data. Nejdříve odstraňte všechna data ze semestru.`):new Error((I==null?void 0:I.msg)||"Nepodařilo se smazat semestr")}const G=await d(VD({id:a.id,lastchange:a.lastchange},p)),W=((k=G==null?void 0:G.data)==null?void 0:k.subjectDelete)||(G==null?void 0:G.subjectDelete)||G;if((W==null?void 0:W.failed)===!0)throw new Error((W==null?void 0:W.msg)||"Nepodařilo se smazat předmět");i&&i()}catch(q){b(q)}finally{v(!1)}},[d,p,a,i]);return x.jsxs(Ib,{title:"Smazat předmět",oklabel:y?"Mažu...":"Smazat",cancellabel:"Zrušit",onOk:O,onCancel:c,okDisabled:y,...s,children:[x.jsxs("div",{className:"mb-3",children:[x.jsxs("p",{children:["Opravdu chcete smazat předmět ",x.jsx("strong",{children:a==null?void 0:a.name}),"?"]}),_>0&&x.jsxs("div",{className:"alert alert-warning",children:[x.jsx("strong",{children:"Upozornění:"})," Tento předmět obsahuje ",_," ",_===1?"semestr":_<5?"semestry":"semestrů","."," ","Všechny semestry budou také smazány.",x.jsx("div",{className:"mt-2 small",children:"Pokud některý semestr obsahuje klasifikace nebo jiná data, smazání se nepodaří."})]})]}),T&&x.jsx("div",{className:"alert alert-danger",children:(T==null?void 0:T.message)||"Chyba při mazání"})]})},yB=({mutationAsyncAction:a=pB,DefaultContent:i=hB,vectorItemsURI:c=xx,...s})=>x.jsx(u5,{...s,DefaultContent:i,mutationAsyncAction:a,vectorItemsURI:c,...Rx}),gB=({children:a,preserveHash:i=!0,preserveSearch:c=!0,...s})=>x.jsx(Zh,{to:_x,preserveHash:i,preserveSearch:c,...s,children:a}),vB=({item:a})=>x.jsxs(Fb,{item:a,title:"Nástroje",children:[x.jsx(gB,{className:"btn btn-outline-success",children:"Stránka"}),x.jsx(FD,{className:"btn btn-outline-success",item:a,children:"Upravit"}),x.jsx(fB,{className:"btn btn-outline-success",item:a,children:"Upravit Dialog"}),x.jsx(iB,{className:"btn btn-outline-success",rbacitem:{},children:"Vytvořit nový"}),x.jsx(KD,{className:"btn btn-outline-danger",item:a,children:"Odstranit"})]}),bB=({item:a,children:i,CardCapsule:c=Fb,MediumContent:s=XD})=>x.jsx(c,{item:a,children:x.jsxs(Qr,{children:[x.jsxs(SL,{children:[x.jsx(c,{item:a,title:"Detail",children:x.jsx(s,{item:a})}),x.jsx(vB,{item:a})]}),x.jsx(EL,{children:i})]})}),SB=({value:a,onChange:i,skip:c=0,limit:s=100,...d})=>{const[p,y]=R.useState([]),[v,T]=R.useState(!0),b=ss(),_=Xu();R.useEffect(()=>{(async()=>{try{T(!0);const w=await b(Y5({skip:c,limit:s},_)),j=w==null?void 0:w.data;j!=null&&j.programPage?y(j.programPage):console.warn("ProgramSelect: No programs found in response",w)}catch(w){console.error("ProgramSelect: Error fetching programs:",w)}finally{T(!1)}})()},[b,_,c,s]);const O=C=>{i&&i(C.target.value)};return v?x.jsx("select",{className:"form-select",disabled:!0,...d,children:x.jsx("option",{children:"Načítání programů..."})}):x.jsxs("select",{className:"form-select",onChange:O,value:a||"",...d,children:[x.jsx("option",{value:"",children:"-- Vyberte program --"}),p.map(C=>x.jsx("option",{value:C.id,children:C.name||C.nameEn||C.id},C.id))]})},EB=a=>{const i=parseInt(a,10)||0,c=Math.ceil(i/2),s=i%2===1;return`${c}. ročník ${s?"zimní":"letní"}`},TB=({semesters:a=[],subjectId:i,onSemestersChange:c=()=>null,disabled:s=!1})=>{const[d,p]=R.useState([]),[y,v]=R.useState({show:!1,semesterId:null,semesterOrder:null});R.useEffect(()=>{p([...a||[]])},[JSON.stringify(a)]);const T=[...d].sort((k,q)=>{const G=parseInt(k.order,10)||0,W=parseInt(q.order,10)||0;return G-W}),b=T.reduce((k,q)=>Math.max(k,q.order||0),0),_=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(k){const q=Math.random()*16|0;return(k==="x"?q:q&3|8).toString(16)}),O=R.useCallback(()=>{const k={id:_(),order:b+1,subjectId:i,_action:"create"},q=[...d,k];p(q),c(q)},[d,b,i,c]),C=R.useCallback(k=>{const q=d.find(G=>G.id===k);v({show:!0,semesterId:k,semesterOrder:q==null?void 0:q.order})},[d]),w=R.useCallback(()=>{v({show:!1,semesterId:null,semesterOrder:null})},[]),j=R.useCallback(k=>{const G=d.filter(W=>W.id!==k).sort((W,$)=>(parseInt(W.order,10)||0)-(parseInt($.order,10)||0)).map((W,$)=>({...W,order:$+1}));p(G),c(G),v({show:!1,semesterId:null,semesterOrder:null})},[d,c]),B=R.useCallback(k=>{if(k<=0)return;const q=[...T],G=q[k].order,W=q[k-1].order;q[k]={...q[k],order:W},q[k-1]={...q[k-1],order:G},p(q),c(q)},[T,c]),U=R.useCallback(k=>{if(k>=T.length-1)return;const q=[...T],G=q[k].order,W=q[k+1].order;q[k]={...q[k],order:W},q[k+1]={...q[k+1],order:G},p(q),c(q)},[T,c]);return x.jsxs("div",{className:"mb-3",children:[x.jsxs(Zy,{id:"semesters",title:"Semestry",children:[T.length>0?x.jsx("div",{className:"mb-3",children:x.jsxs("table",{className:"table table-sm table-bordered",children:[x.jsx("thead",{className:"table-light",children:x.jsxs("tr",{children:[x.jsx("th",{style:{width:"70px"},children:"Pořadí"}),x.jsx("th",{style:{width:"140px"},children:"Název"}),x.jsx("th",{children:"ID"}),x.jsx("th",{style:{width:"120px"},children:"Akce"})]})}),x.jsx("tbody",{children:T.map((k,q)=>x.jsxs("tr",{children:[x.jsx("td",{children:k.order}),x.jsx("td",{children:EB(k.order)}),x.jsx("td",{children:x.jsx("small",{className:"text-muted",children:k.id})}),x.jsx("td",{children:x.jsxs("div",{className:"btn-group btn-group-sm",children:[x.jsx("button",{type:"button",className:"btn btn-outline-secondary",onClick:()=>B(q),disabled:s||q===0,title:"Posunout nahoru",children:"↑"}),x.jsx("button",{type:"button",className:"btn btn-outline-secondary",onClick:()=>U(q),disabled:s||q===T.length-1,title:"Posunout dolů",children:"↓"}),x.jsx("button",{type:"button",className:"btn btn-outline-danger",onClick:()=>C(k.id),disabled:s,title:"Odebrat semestr",children:"✕"})]})})]},k.id))})]})}):x.jsx("div",{className:"text-muted mb-3",children:"Žádné semestry"}),x.jsxs("button",{type:"button",className:"btn btn-sm btn-success",onClick:O,disabled:s,children:["+ Přidat nový semestr (pořadí: ",b+1,")"]})]}),y.show&&x.jsx("div",{className:"modal fade show d-block",tabIndex:"-1",style:{backgroundColor:"rgba(0,0,0,0.5)"},children:x.jsx("div",{className:"modal-dialog modal-dialog-centered",children:x.jsxs("div",{className:"modal-content",children:[x.jsxs("div",{className:"modal-header",children:[x.jsx("h5",{className:"modal-title",children:"Potvrzení smazání"}),x.jsx("button",{type:"button",className:"btn-close",onClick:w,"aria-label":"Zavřít"})]}),x.jsxs("div",{className:"modal-body",children:[x.jsxs("p",{children:["Opravdu chcete smazat semestr ",x.jsxs("strong",{children:["#",y.semesterOrder]}),"?"]}),x.jsxs("div",{className:"alert alert-warning mb-0",children:[x.jsx("strong",{children:"Upozornění:"})," Pokud semestr obsahuje klasifikace nebo jiná data, smazání se nepodaří a bude nutné nejprve odstranit všechna související data."]})]}),x.jsxs("div",{className:"modal-footer",children:[x.jsx("button",{type:"button",className:"btn btn-secondary",onClick:w,children:"Zrušit"}),x.jsx("button",{type:"button",className:"btn btn-danger",onClick:()=>j(y.semesterId),children:"Smazat semestr"})]})]})})})]})},Dx=({item:a,onChange:i=p=>null,onBlur:c=p=>null,onSemestersChange:s=p=>null,children:d})=>{const p=y=>{i({target:{id:"programId",value:y}})};return x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:"mb-3",label:"Program",children:[x.jsx("label",{htmlFor:"programId",className:"form-label",children:"Program"}),x.jsx(SB,{id:"programId",value:(a==null?void 0:a.programId)||"",onChange:p})]}),x.jsx(To,{id:"name",label:"Název",className:"form-control",value:(a==null?void 0:a.name)||"",onChange:i,onBlur:c}),x.jsx(To,{id:"nameEn",label:"Anglický název",className:"form-control",value:(a==null?void 0:a.nameEn)||"",onChange:i,onBlur:c}),x.jsx(Zy,{id:"description",title:"Popis",children:x.jsx("textarea",{id:"description",className:"form-control",rows:4,value:(a==null?void 0:a.description)||"",onChange:i,onBlur:c})}),x.jsx(Zy,{id:"descriptionEn",title:"Anglický popis",children:x.jsx("textarea",{id:"descriptionEn",className:"form-control",rows:4,value:(a==null?void 0:a.descriptionEn)||"",onChange:i,onBlur:c})}),x.jsx(TB,{semesters:a==null?void 0:a.semesters,subjectId:a==null?void 0:a.id,onSemestersChange:s}),d]})},xB=({item:a,children:i,mutationAsyncAction:c=kD,DefaultContent:s=Dx})=>{const{onChange:d}=ep(),p=ss(),y=Xu(),[v,T]=R.useState((a==null?void 0:a.semesters)||[]),[b,_]=R.useState((a==null?void 0:a.semesters)||[]),[O,C]=R.useState(!1),[w,j]=R.useState(null),B=R.useRef(null),U=R.useRef(v);R.useEffect(()=>{U.current=v},[v]),R.useEffect(()=>{T((a==null?void 0:a.semesters)||[]),_((a==null?void 0:a.semesters)||[])},[a==null?void 0:a.id,a==null?void 0:a.semesters]);const{draft:k,setDraft:q,dirty:G,loading:W,error:$,autoSaveEnabled:F,toggleAutoSave:I,effectiveMode:V,onChange:ye,onBlur:ce,onCancel:je,onConfirm:xe}=ED(c,a,{mode:"live",defaultAutoSave:!0}),Be=R.useCallback(()=>{if(v.length!==b.length)return!0;const N=new Set(v.map(re=>re.id)),Z=new Set(b.map(re=>re.id));for(const re of Z)if(!N.has(re))return!0;for(const re of N)if(!Z.has(re))return!0;for(const re of b){const le=v.find(Te=>Te.id===re.id);if(le&&le.order!==re.order)return!0}return!1},[v,b]),$e=G||Be(),Ge=R.useCallback(async N=>{var re,le,Te,Ae,Me,Ke,Xe,rt;C(!0),j(null);const Z=[];try{const Le=U.current,Ve=new Map(Le.map(ot=>[ot.id,ot])),Ot=new Map(N.map(ot=>[ot.id,ot])),Qt=new Map(Le.map(ot=>[ot.id,ot.lastchange])),Rt=N.filter(ot=>ot._action==="create"),zt=Le.filter(ot=>!Ot.has(ot.id)&&!ot._action),rn=N.filter(ot=>{if(ot._action==="create")return!1;const He=Ve.get(ot.id);return He&&He.order!==ot.order});for(const ot of Rt){const He=await p(Ex({id:ot.id,subjectId:a.id,order:ot.order},y)),Zt=((re=He==null?void 0:He.data)==null?void 0:re.semesterInsert)||(He==null?void 0:He.semesterInsert)||He;Zt!=null&&Zt.id&&Qt.set(Zt.id,Zt.lastchange)}for(const ot of zt){const He=Qt.get(ot.id)||ot.lastchange;if(!He){console.error("Cannot delete semester - missing lastchange:",ot.id),Z.push(ot);continue}const Zt=await p(qD({id:ot.id,lastchange:He},y)),At=((le=Zt==null?void 0:Zt.data)==null?void 0:le.semesterDelete)||(Zt==null?void 0:Zt.semesterDelete)||Zt;if((At==null?void 0:At.failed)===!0){if((Te=At==null?void 0:At.msg)!=null&&Te.includes("ForeignKey")||(Ae=At==null?void 0:At.msg)!=null&&Ae.includes("foreign key")||(Me=At==null?void 0:At.msg)!=null&&Me.includes("still referenced")){Z.push(ot);continue}Z.push(ot);continue}}for(const ot of rn){const He=Qt.get(ot.id)||ot.lastchange||((Ke=Ve.get(ot.id))==null?void 0:Ke.lastchange);if(!He)throw console.error("Cannot update semester - missing lastchange:",ot.id),new Error("Nepodařilo se aktualizovat semestr - chybí lastchange");const Zt=await p(X5({id:ot.id,lastchange:He,subjectId:a.id,order:ot.order},y)),At=((Xe=Zt==null?void 0:Zt.data)==null?void 0:Xe.semesterUpdate)||(Zt==null?void 0:Zt.semesterUpdate)||Zt;if((rt=At==null?void 0:At.__typename)!=null&&rt.includes("Error")||(At==null?void 0:At.failed)===!0)throw new Error((At==null?void 0:At.msg)||"Nepodařilo se aktualizovat pořadí semestru");At!=null&&At.lastchange&&Qt.set(ot.id,At.lastchange)}let Sa=N.map(ot=>{const{_action:He,...Zt}=ot,At=Qt.get(ot.id);return At?{...Zt,lastchange:At}:Zt});for(const ot of Z)Sa.some(He=>He.id===ot.id)||Sa.push(ot);return Sa=Sa.sort((ot,He)=>(ot.order||0)-(He.order||0)),T(Sa),_(Sa),q(ot=>({...ot,semesters:Sa})),Z.length>0?(j(new Error("Nelze smazat semestr - obsahuje klasifikace nebo jiná data")),!1):!0}catch(Le){return _(U.current),q(Ve=>({...Ve,semesters:U.current})),j(Le),!1}finally{C(!1)}},[p,y,a==null?void 0:a.id,q]),Y=R.useCallback(N=>{_(N),q(Z=>({...Z,semesters:N})),V==="live"&&(B.current&&clearTimeout(B.current),B.current=setTimeout(()=>{Ge(N)},600))},[V,q,Ge]);R.useEffect(()=>()=>{B.current&&clearTimeout(B.current)},[]);const se=R.useCallback(async()=>{if(Be()&&!await Ge(b))return null;const N=await xe();return N&&await d({target:{value:N}}),N},[xe,d,Be,Ge,b]),Ee=R.useCallback(()=>{_(v),q(N=>({...N,semesters:v})),je()},[je,v,q]),Ne=W||O,fe=$||w;return x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:"d-flex justify-content-end align-items-center mb-3 p-2 bg-light rounded",children:[x.jsxs("div",{className:"form-check form-switch m-0 me-3",children:[x.jsx("input",{className:"form-check-input",type:"checkbox",role:"switch",id:"autoSaveSwitch",checked:F,onChange:I}),x.jsx("label",{className:"form-check-label",htmlFor:"autoSaveSwitch",children:"Automatické ukládání"})]}),V==="live"&&Ne&&x.jsxs("span",{className:"text-muted small",children:[x.jsx("span",{className:"spinner-border spinner-border-sm me-1",role:"status","aria-hidden":"true"}),"Ukládám..."]})]}),x.jsx(s,{item:{...k,semesters:b},onChange:ye,onBlur:ce,onSemestersChange:Y,children:i}),V==="confirm"&&x.jsxs("div",{className:"d-flex gap-2 mt-3",children:[x.jsx("button",{className:"btn btn-outline-secondary flex-grow-1",onClick:Ee,disabled:!$e||Ne,children:"Zrušit změny"}),x.jsx("button",{className:"btn btn-primary flex-grow-1",onClick:se,disabled:!$e||Ne,children:Ne?x.jsxs(x.Fragment,{children:[x.jsx("span",{className:"spinner-border spinner-border-sm me-2",role:"status","aria-hidden":"true"}),"Ukládám..."]}):"Uložit změny"})]}),fe&&x.jsx("div",{className:"alert alert-danger mt-2",children:(fe==null?void 0:fe.message)||"Chyba při ukládání"})]})},Pb=({queryAsyncAction:a=k5,PageNavbar:i=()=>null,ItemLayout:c=bB,SubPage:s=null,...d})=>x.jsx(E5,{queryAsyncAction:a,PageNavbar:i,ItemLayout:c,SubPage:s,...d}),_B=({children:a,PageNavbar:i=()=>null})=>x.jsxs(x.Fragment,{children:[x.jsx(i,{}),a]}),OB=({column:a,sortConfig:i,onSort:c})=>{const s=i.column===a,d=s?i.direction:null,p=()=>!s||d===null?"↕":d==="asc"?"↑":"↓",y=()=>!s||d===null?"Seřadit vzestupně":d==="asc"?"Seřadit sestupně":"Zrušit řazení";return x.jsx("button",{type:"button",className:`btn btn-sm ${s?"btn-primary":"btn-outline-secondary"} ms-1`,onClick:()=>c(a),title:y(),style:{padding:"0.1rem 0.3rem",fontSize:"0.75rem"},children:p()})},AB=({tableDef:a,sortConfig:i,onSort:c})=>{const s=["name","nameEn","program","semesters","lastchange"];return x.jsx("thead",{children:x.jsx("tr",{children:Object.entries(a).map(([d,{label:p}])=>x.jsxs("th",{children:[p,s.includes(d)&&x.jsx(OB,{column:d,sortConfig:i,onSort:c})]},d))})})},PD=(a,i)=>{var c,s;switch(i){case"name":return(a==null?void 0:a.name)||"";case"nameEn":return(a==null?void 0:a.nameEn)||"";case"program":return((c=a==null?void 0:a.program)==null?void 0:c.name)||(a==null?void 0:a.programId)||"";case"semesters":return((s=a==null?void 0:a.semesters)==null?void 0:s.length)||0;case"lastchange":return(a==null?void 0:a.lastchange)||"";default:return""}},CB=(a,i,c)=>{if(typeof a=="number"&&typeof i=="number")return c==="asc"?a-i:i-a;const s=String(a).toLowerCase(),d=String(i).toLowerCase(),p=parseFloat(s),y=parseFloat(d);return!isNaN(p)&&!isNaN(y)?c==="asc"?p-y:y-p:c==="asc"?s.localeCompare(d,"cs"):d.localeCompare(s,"cs")},RB=a=>!a||a.length===0?{}:{name:{label:"Název",component:({row:i})=>x.jsx("td",{children:x.jsx(Ky,{item:i,children:(i==null?void 0:i.name)||"Bez názvu"})})},nameEn:{label:"Anglický název",component:({row:i})=>x.jsx("td",{children:(i==null?void 0:i.nameEn)||""})},program:{label:"Program",component:({row:i})=>{var c;return x.jsx("td",{children:((c=i==null?void 0:i.program)==null?void 0:c.name)||(i==null?void 0:i.programId)||""})}},semesters:{label:"Semestrů",component:({row:i})=>{var c;return x.jsx("td",{children:((c=i==null?void 0:i.semesters)==null?void 0:c.length)||0})}},lastchange:{label:"Změněno",component:({row:i})=>x.jsx("td",{children:i==null?void 0:i.lastchange})},tools:{label:"Nástroje",component:({row:i})=>x.jsx("td",{children:x.jsx(DD,{actions:[{children:x.jsx(Ky,{className:"btn btn-sm btn-outline-secondary border-0 text-start w-100",item:i,children:"Detail"})},{children:x.jsx(FD,{className:"btn btn-sm btn-outline-secondary border-0 text-start w-100",item:i,action:"edit",children:"Editovat"})},{children:x.jsx(KD,{className:"btn btn-sm btn-outline-danger border-0 text-start w-100",item:i,rbacitem:i==null?void 0:i.rbacobject,children:"Smazat"})}]})})}},DB=({data:a})=>{const[i,c]=R.useState({column:null,direction:null}),s=R.useMemo(()=>RB(a),[a]),d=y=>{c(v=>v.column!==y?{column:y,direction:"asc"}:v.direction==="asc"?{column:y,direction:"desc"}:{column:null,direction:null})},p=R.useMemo(()=>!a||!i.column||!i.direction?a:[...a].sort((y,v)=>{const T=PD(y,i.column),b=PD(v,i.column);return CB(T,b,i.direction)}),[a,i]);return!a||a.length===0?null:x.jsx("div",{className:"table-responsive",children:x.jsxs("table",{className:"table table-stripped",children:[x.jsx(AB,{tableDef:s,sortConfig:i,onSort:d}),x.jsx(wD,{data:p,table_def:s})]})})},WD=R.createContext(null),ap=()=>R.useContext(WD);function wB(a,i){if(!a||typeof a!="object"||Array.isArray(a))return!1;const c=Object.keys(a);return c.length===1&&c[0]===i&&Array.isArray(a[i])}function MB(a,i=[]){const c=i.filter(Boolean).filter(d=>Object.keys(d).length>0),s=[];for(const d of c)wB(d,a)?s.push(...d[a]):s.push(d);return s.length===0?{}:s.length===1?s[0]:{[a]:s}}const NB=({id:a,label:i,resetKey:c,join:s="_and",onChange:d=()=>null,children:p})=>{const y=ap(),[v,T]=R.useState({}),[b,_]=R.useState(s),O=R.useCallback($=>{const{id:F,value:I}=$.target;T(V=>({...V,[F]:I}))},[]),C=R.useMemo(()=>Object.values(v).filter(Boolean).map(F=>!Array.isArray(F)||F.length===0?null:F.length===1?F[0]:{_and:F}).filter(Boolean),[v]),w=C.length>1,j=R.useMemo(()=>MB(b,C),[b,C]),B=R.useMemo(()=>a?{[a]:j}:j,[a,j]);R.useEffect(()=>{d({where:B})},[B,d]),R.useEffect(()=>{if(!(y!=null&&y.handleChange))return;const $=!B||typeof B=="object"&&Object.keys(B).length===0;return y.handleChange({target:{id:a??"__root__",value:$?null:[B]}}),()=>{y.handleChange({target:{id:a??"__root__",value:null}})}},[y,B,a]);const U=R.useCallback($=>{_($.target.value)},[]),k=R.useCallback(()=>B,[B]),[q,G]=R.useState(0),W=R.useCallback(()=>{T({}),_(s),G($=>$+1)},[s]);return x.jsx(WD.Provider,{value:{handleChange:O,readFilter:k,resetFilter:W},children:x.jsxs(au,{title:i||a||"where",children:[w&&x.jsxs(Qr,{children:[x.jsx(dn,{children:x.jsxs("label",{children:[x.jsx("input",{type:"radio",name:`join-${a??"root"}`,value:"_and",checked:b==="_and",onChange:U}),"_and"]})}),x.jsx(dn,{children:x.jsxs("label",{children:[x.jsx("input",{type:"radio",name:`join-${a??"root"}`,value:"_or",checked:b==="_or",onChange:U}),"_or"]})})]}),x.jsx("div",{children:p},c??q)]})})};function jB(a){return!a||typeof a!="object"?!0:Array.isArray(a)?a.length===0:Object.keys(a).length===0}function zB(a){return JSON.stringify(a)}const UB=({onClick:a,paramName:i="where",replace:c=!0,...s})=>{const d=ap(),[p,y]=G1(),v=R.useCallback(()=>{if(!(d!=null&&d.readFilter))throw Error("<FilterButton /> must be placed inside <Filter />");const T=new URLSearchParams(p);T.delete(i),a&&a({where:{}}),d.resetFilter&&d.resetFilter(),y(T,{replace:c})},[d,a,p,y,i,c]);return x.jsx("button",{...s,onClick:v})},LB=({onClick:a,paramName:i="where",replace:c=!0,...s})=>{const d=ap(),[p,y]=G1(),v=R.useCallback(()=>{if(!(d!=null&&d.readFilter))throw Error("<FilterButton /> must be placed inside <Filter />");const T=d.readFilter(),b={where:T};if(a)return a(b);const _=new URLSearchParams(p);jB(T)?_.delete(i):_.set(i,zB(T)),y(_,{replace:c})},[d,a,p,y,i,c]);return x.jsx("button",{...s,onClick:v})},BB=({id:a,label:i,initialValue:c="",initialOp:s="_ilike"})=>{const d=ap();if(!d)throw Error("<StringFilter /> must be placed inside <Filter />");const[p,y]=R.useState(s),[v,T]=R.useState(c),[b,_]=R.useState(""),[O,C]=R.useState(""),w=R.useCallback(F=>{d.handleChange({target:{id:a,value:F}})},[d,a]),j=R.useCallback((F,I)=>{if(!I)return null;let V=I;return F==="_ilike"&&(V=I.includes("%")?I:`%${I}%`),[{[a]:{[F]:V}}]},[a]),B=R.useCallback((F,I)=>{const V=[];return F&&V.push({[a]:{_gt:F}}),I&&V.push({[a]:{_lt:I}}),V.length?V:null},[a]),U=R.useCallback(({nextOp:F=p,nextText:I=v,nextFrom:V=b,nextTo:ye=O})=>{w(F==="_between"?B(V,ye):j(F,I))},[p,v,b,O,w,j,B]),k=R.useCallback(F=>{const I=F.target.value;I!==p&&(y(I),U(I==="_between"?{nextOp:I}:{nextOp:I}))},[p,U]),q=R.useCallback(F=>{const I=F.target.value;I!==v&&(T(I),p!=="_between"&&U({nextText:I}))},[p,v,U]),G=R.useCallback(F=>{const I=F.target.value;I!==b&&(_(I),p==="_between"&&U({nextFrom:I}))},[p,b,U]),W=R.useCallback(F=>{const I=F.target.value;I!==O&&(C(I),p==="_between"&&U({nextTo:I}))},[p,O,U]),$=p==="_between";return x.jsx(au,{title:i||a,children:x.jsxs(Qr,{children:[x.jsx(dn,{children:x.jsxs("select",{className:"form-control",value:p,onChange:k,children:[x.jsx("option",{value:"Obsahuje",children:"_ilike"}),x.jsx("option",{value:"Začíná na",children:"_startswith"}),x.jsx("option",{value:"Končí na",children:"_endswith"}),x.jsx("option",{value:"Je rovno",children:"_eq"}),x.jsx("option",{value:"Je větší než",children:"_gt"}),x.jsx("option",{value:"Je menší než",children:"_lt"}),x.jsx("option",{value:"Mezi",children:"_between"})]})}),$?x.jsxs(x.Fragment,{children:[x.jsx(dn,{children:x.jsx(To,{className:"form-control",value:b,onChange:G,placeholder:"from…"})}),x.jsx(dn,{children:p==="_between"&&x.jsx(To,{className:"form-control",value:O,onChange:W,placeholder:"to…"})})]}):x.jsx(dn,{children:x.jsx(To,{className:"form-control",value:v,onChange:q})})]})})};function HB(a){const i=new Date(a);return Number.isNaN(i.getTime())?null:i.toISOString()}const kB=({id:a,label:i,initialOp:c="_gte",initialValue:s="",emitUtcIso:d=!0})=>{const p=ap();if(!p)throw Error("<DateTimeFilter /> must be placed inside <Filter />");const[y,v]=R.useState(c),[T,b]=R.useState(s),[_,O]=R.useState(""),[C,w]=R.useState(""),j=R.useCallback(V=>V?d?HB(V):V:null,[d]),B=R.useCallback(V=>{p.handleChange({target:{id:a,value:V}})},[p,a]),U=R.useCallback((V,ye)=>{const ce=j(ye);return ce?[{[a]:{[V]:ce}}]:null},[a,j]),k=R.useCallback((V,ye)=>{const ce=[],je=j(V),xe=j(ye);return je&&ce.push({[a]:{_gt:je}}),xe&&ce.push({[a]:{_lt:xe}}),ce.length?ce:null},[a,j]),q=R.useCallback(({nextOp:V=y,nextText:ye=T,nextFrom:ce=_,nextTo:je=C})=>{B(V==="_between"?k(ce,je):U(V,ye))},[y,T,_,C,B,U,k]),G=R.useCallback(V=>{const ye=V.target.value;ye!==y&&(v(ye),q({nextOp:ye}))},[y,q]),W=R.useCallback(V=>{const ye=V.target.value;ye!==T&&(b(ye),y!=="_between"&&q({nextText:ye}))},[y,T,q]),$=R.useCallback(V=>{const ye=V.target.value;ye!==_&&(O(ye),y==="_between"&&q({nextFrom:ye}))},[y,_,q]),F=R.useCallback(V=>{const ye=V.target.value;ye!==C&&(w(ye),y==="_between"&&q({nextTo:ye}))},[y,C,q]),I=y==="_between";return x.jsx(au,{title:i||a,children:x.jsxs(Qr,{children:[x.jsx(dn,{children:x.jsxs("select",{className:"form-control",value:y,onChange:G,children:[x.jsx("option",{value:"_eq",children:"_eq"}),x.jsx("option",{value:"_gt",children:"_gt"}),x.jsx("option",{value:"_gte",children:"_gte"}),x.jsx("option",{value:"_lt",children:"_lt"}),x.jsx("option",{value:"_lte",children:"_lte"}),x.jsx("option",{value:"_between",children:"_between"})]})}),I?x.jsxs(x.Fragment,{children:[x.jsx(dn,{children:x.jsx(To,{className:"form-control",type:"datetime-local",value:_,onChange:$,placeholder:"from…"})}),x.jsx(dn,{children:x.jsx(To,{className:"form-control",type:"datetime-local",value:C,onChange:F,placeholder:"to…"})})]}):x.jsx(dn,{children:x.jsx(To,{className:"form-control",type:"datetime-local",value:T,onChange:W})})]})})},e2=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,VB=({id:a,label:i,initialValue:c=""})=>{const s=ap();if(!s)throw Error("<UUIDFilter /> must be placed inside <Filter />");const[d,p]=R.useState(c),y=R.useMemo(()=>(d??"").trim(),[d]),T=y.length===0?!0:e2.test(y),b=R.useCallback(C=>{s.handleChange({target:{id:a,value:C}})},[s,a]),_=R.useCallback(C=>{const w=(C??"").trim();if(!w){b(null);return}if(!e2.test(w)){b(null);return}b([{[a]:{_eq:w}}])},[a,b]),O=R.useCallback(C=>{const w=C.target.value;w!==d&&(p(w),_(w))},[d,_]);return x.jsx(au,{title:i||a,children:x.jsxs(Qr,{children:[x.jsx(dn,{style:{minWidth:80},children:x.jsx("span",{style:{opacity:.7},children:"(_eq)"})}),x.jsxs(dn,{children:[x.jsx(To,{className:`form-control ${T?"":"is-invalid"}`,value:d,onChange:O,placeholder:"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}),!T&&x.jsx("div",{className:"invalid-feedback",style:{display:"block"},children:"Neplatné UUID. Očekávám formát 8-4-4-4-12 hex (např. 550e8400-e29b-41d4-a716-446655440000)."})]})]})})},qB=({id:a,onChange:i,children:c})=>x.jsxs(NB,{id:a,onChange:i,children:[x.jsx(VB,{id:"id"}),x.jsx(BB,{id:"name"}),x.jsx(kB,{id:"created",emitUtcIso:!1}),c]}),$B=({collapsed:a=!0,children:i,buttonLabel:c,buttonLabelCollapsed:s="Zobrazit",buttonLabelExpanded:d="Skrýt",onToggle:p,...y})=>{const[v,T]=R.useState(a);R.useEffect(()=>{T(a)},[a]);const b=R.useCallback(()=>{T(O=>{const C=!O;return p==null||p(C),C})},[p]),_=c??(v?s:d);return x.jsxs(x.Fragment,{children:[x.jsx("div",{hidden:v,"aria-hidden":v,children:i}),x.jsx("button",{type:"button",...y,onClick:b,"aria-expanded":!v,children:_})]})};function YB(a,i="where"){const c=a.get(i);if(!c)return null;try{const s=JSON.parse(c);return s&&typeof s=="object"?s:null}catch{return null}}const wx="gr_where",t2=({children:a,queryAsyncAction:i=q5})=>{const[c]=G1(),s=R.useMemo(()=>YB(c,wx),[c.toString()]),{items:d,loading:p,error:y,hasMore:v,sentinelRef:T,loadMore:b,restart:_}=W5({asyncAction:i,actionParams:{skip:0,limit:25,where:s}});return R.useEffect(()=>{_({skip:0,limit:25,where:s})},[s]),x.jsxs(_B,{children:[x.jsx($B,{className:"form-control btn btn-outline-primary",buttonLabelCollapsed:"Zobrazit filtr",buttonLabelExpanded:"Skrýt filtr",children:x.jsxs(qB,{children:[x.jsx(LB,{className:"form-control btn btn-outline-success",paramName:wx,children:"Filtrovat"}),x.jsx(UB,{className:"form-control btn btn-warning",paramName:wx,children:"Vymazat filtr"})]})}),x.jsx(DB,{data:d}),x.jsx(Pu,{error:y,loading:p,text:"Nahrávám další..."}),v&&x.jsx("div",{ref:T,style:{height:80,backgroundColor:"lightgray"}}),v&&x.jsx("button",{className:"btn btn-success form-control",onClick:()=>b(),children:"Více"})]})},GB=({SubPage:a=dB,...i})=>x.jsx(Pb,{SubPage:a,...i}),QB=({...a})=>x.jsxs(Qr,{children:[x.jsx(o6,{}),x.jsx(C6,{children:x.jsx(uB,{...a})})]}),XB=({SubPage:a=QB,...i})=>x.jsx(Pb,{SubPage:a,...i}),IB=a=>{const i=parseInt(a,10)||0,c=Math.ceil(i/2),s=i%2===1;return`${c}. ročník ${s?"zimní":"letní"}`},ZB=({item:a})=>{var i,c,s;return x.jsxs(x.Fragment,{children:[x.jsxs(Fb,{item:a,title:"Program",children:[x.jsx(Hl,{label:"Název",children:(i=a==null?void 0:a.program)==null?void 0:i.name}),x.jsx(Hl,{label:"ID",children:x.jsx("a",{href:`/program/ProgramGQLModel/${(c=a==null?void 0:a.program)==null?void 0:c.id}`,children:(s=a==null?void 0:a.program)==null?void 0:s.id})})]}),x.jsx(Fb,{title:"Semestry",children:x.jsxs("table",{className:"table table-sm",children:[x.jsx("thead",{children:x.jsxs("tr",{children:[x.jsx("th",{children:"Pořadí"}),x.jsx("th",{children:"Název"}),x.jsx("th",{children:"ID"}),x.jsx("th",{children:"Last change"})]})}),x.jsx("tbody",{children:[...a.semesters].sort((d,p)=>(parseInt(d.order,10)||0)-(parseInt(p.order,10)||0)).map(d=>x.jsxs("tr",{children:[x.jsx("td",{children:d.order}),x.jsx("td",{children:IB(d.order)}),x.jsx("td",{children:x.jsx("a",{href:`/semestr/SemesterGQLModel/${d.id}`,children:d.id})}),x.jsx("td",{children:a.lastchange})]},d.id))})]})})]})},n2=({SubPage:a=ZB,...i})=>x.jsx(Pb,{SubPage:a,...i}),JB=({SubPage:a=yB,...i})=>x.jsx(Pb,{SubPage:a,...i}),FB=[{path:eB,element:x.jsx(XB,{})},{path:_x,element:x.jsx(t2,{})},{path:Fy,element:x.jsx(n2,{})},{path:QD,element:x.jsx(GB,{})},{path:lB,element:x.jsx(JB,{})},{path:_x.replace("list",":any"),element:x.jsx(t2,{})},{path:Fy.replace("view",":any"),element:x.jsx(n2,{})}],Mx=()=>null,KB=({indexUrl:a,item:i,children:c,handleSearchChange:s,HomeButton:d=Mx,PersonButton:p=Mx,SearchBox:y=Mx})=>x.jsxs(Bb,{bg:"light",expand:"lg",children:[x.jsx(Bb.Toggle,{"aria-controls":"basic-navbar-nav"}),x.jsx(Bb.Collapse,{id:"basic-navbar-nav",children:x.jsxs(j4,{variant:"tabs",className:"align-items-center w-100 flex-column flex-lg-row",children:[x.jsx(d,{indexURL:a}),x.jsx("div",{className:"mx-auto d-flex align-items-center flex-column flex-lg-row mb-0",children:c}),x.jsx("div",{className:"d-flex flex-column flex-lg-row align-items-center ml-lg-auto",children:x.jsx(y,{handleSearchChange:s})}),x.jsx(p,{item:i})]})})]}),PB=()=>{const{id:a}=Yf(),i=J1(c=>ST(c,a))||{};return x.jsx(KB,{item:i})},WB=()=>x.jsxs(G4,{children:[x.jsx(PB,{}),x.jsx(X4,{}),x.jsx(yj,{})]}),e8=[{path:"/",element:x.jsx(WB,{}),children:[...FB,...A5]}],t8=$j(e8),n8=()=>x.jsx(ez,{router:t8}),a8="/api/gql",l8=({GQLENDPOINT:a=a8})=>x.jsx(FU,{clientOptions:{endpoint:a},children:x.jsx(n8,{})});function a2(a,i={}){if(!a)throw new Error("MyApp.mount: missing mount element");console.log("inside mount, doing to render"),AM.createRoot(a).render(x.jsx(l8,{...i})),console.log("inside mount, render finished")}typeof window<"u"&&(window.MyApp={mount:a2}),zh.mount=a2,Object.defineProperty(zh,Symbol.toStringTag,{value:"Module"})}));
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@velkayolanda/app_subjects",
3
3
  "private": false,
4
- "version": "0.0.4",
4
+ "version": "0.0.5",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist",