From 48bf9c7088eefdf928b720bae556ace186af71ec Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Mon, 18 May 2026 23:50:24 +0200 Subject: [PATCH] =?UTF-8?q?Patch=20API=20URL=20in=20JS=20bundle:=20/api/v1?= =?UTF-8?q?=20=E2=86=92=20api.fahrschultermin.de/api/v1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- www/fahrschultermin.de/public/assets/assets/main-F76uNDS1.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/fahrschultermin.de/public/assets/assets/main-F76uNDS1.js b/www/fahrschultermin.de/public/assets/assets/main-F76uNDS1.js index 0310b69..4d6c1c0 100644 --- a/www/fahrschultermin.de/public/assets/assets/main-F76uNDS1.js +++ b/www/fahrschultermin.de/public/assets/assets/main-F76uNDS1.js @@ -38,7 +38,7 @@ function Zc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"d `).replace(Af,"")}function zr(e,t,n){if(t=qa(t),qa(e)!==t&&n)throw Error(k(425))}function ol(){}var Qi=null,Ki=null;function bi(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var qi=typeof setTimeout=="function"?setTimeout:void 0,Uf=typeof clearTimeout=="function"?clearTimeout:void 0,Ya=typeof Promise=="function"?Promise:void 0,Vf=typeof queueMicrotask=="function"?queueMicrotask:typeof Ya<"u"?function(e){return Ya.resolve(null).then(e).catch(Hf)}:qi;function Hf(e){setTimeout(function(){throw e})}function di(e,t){var n=t,r=0;do{var l=n.nextSibling;if(e.removeChild(n),l&&l.nodeType===8)if(n=l.data,n==="/$"){if(r===0){e.removeChild(l),rr(t);return}r--}else n!=="$"&&n!=="$?"&&n!=="$!"||r++;n=l}while(n);rr(t)}function Pt(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?")break;if(t==="/$")return null}}return e}function Xa(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var n=e.data;if(n==="$"||n==="$!"||n==="$?"){if(t===0)return e;t--}else n==="/$"&&t++}e=e.previousSibling}return null}var Mn=Math.random().toString(36).slice(2),nt="__reactFiber$"+Mn,or="__reactProps$"+Mn,ft="__reactContainer$"+Mn,Yi="__reactEvents$"+Mn,Wf="__reactListeners$"+Mn,Qf="__reactHandles$"+Mn;function Ut(e){var t=e[nt];if(t)return t;for(var n=e.parentNode;n;){if(t=n[ft]||n[nt]){if(n=t.alternate,t.child!==null||n!==null&&n.child!==null)for(e=Xa(e);e!==null;){if(n=e[nt])return n;e=Xa(e)}return t}e=n,n=e.parentNode}return null}function yr(e){return e=e[nt]||e[ft],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function sn(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(k(33))}function Tl(e){return e[or]||null}var Xi=[],an=-1;function Ot(e){return{current:e}}function Z(e){0>an||(e.current=Xi[an],Xi[an]=null,an--)}function X(e,t){an++,Xi[an]=e.current,e.current=t}var Rt={},Se=Ot(Rt),ze=Ot(!1),Kt=Rt;function wn(e,t){var n=e.type.contextTypes;if(!n)return Rt;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},i;for(i in n)l[i]=t[i];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function De(e){return e=e.childContextTypes,e!=null}function ul(){Z(ze),Z(Se)}function Ga(e,t,n){if(Se.current!==Rt)throw Error(k(168));X(Se,t),X(ze,n)}function Au(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(k(108,Md(e)||"Unknown",l));return re({},n,r)}function cl(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Rt,Kt=Se.current,X(Se,e),X(ze,ze.current),!0}function Za(e,t,n){var r=e.stateNode;if(!r)throw Error(k(169));n?(e=Au(e,t,Kt),r.__reactInternalMemoizedMergedChildContext=e,Z(ze),Z(Se),X(Se,e)):Z(ze),X(ze,n)}var at=null,zl=!1,fi=!1;function Uu(e){at===null?at=[e]:at.push(e)}function Kf(e){zl=!0,Uu(e)}function It(){if(!fi&&at!==null){fi=!0;var e=0,t=K;try{var n=at;for(K=1;e>=s,l-=s,ot=1<<32-Ge(t)+l|n<T?($=S,S=null):$=S.sibling;var L=m(f,S,p[T],y);if(L===null){S===null&&(S=$);break}e&&S&&L.alternate===null&&t(f,S),c=i(L,c,T),M===null?j=L:M.sibling=L,M=L,S=$}if(T===p.length)return n(f,S),ee&&Bt(f,T),j;if(S===null){for(;TT?($=S,S=null):$=S.sibling;var W=m(f,S,L.value,y);if(W===null){S===null&&(S=$);break}e&&S&&W.alternate===null&&t(f,S),c=i(W,c,T),M===null?j=W:M.sibling=W,M=W,S=$}if(L.done)return n(f,S),ee&&Bt(f,T),j;if(S===null){for(;!L.done;T++,L=p.next())L=h(f,L.value,y),L!==null&&(c=i(L,c,T),M===null?j=L:M.sibling=L,M=L);return ee&&Bt(f,T),j}for(S=r(f,S);!L.done;T++,L=p.next())L=x(S,f,T,L.value,y),L!==null&&(e&&L.alternate!==null&&S.delete(L.key===null?T:L.key),c=i(L,c,T),M===null?j=L:M.sibling=L,M=L);return e&&S.forEach(function(C){return t(f,C)}),ee&&Bt(f,T),j}function D(f,c,p,y){if(typeof p=="object"&&p!==null&&p.type===tn&&p.key===null&&(p=p.props.children),typeof p=="object"&&p!==null){switch(p.$$typeof){case _r:e:{for(var j=p.key,M=c;M!==null;){if(M.key===j){if(j=p.type,j===tn){if(M.tag===7){n(f,M.sibling),c=l(M,p.props.children),c.return=f,f=c;break e}}else if(M.elementType===j||typeof j=="object"&&j!==null&&j.$$typeof===yt&&to(j)===M.type){n(f,M.sibling),c=l(M,p.props),c.ref=Fn(f,M,p),c.return=f,f=c;break e}n(f,M);break}else t(f,M);M=M.sibling}p.type===tn?(c=Qt(p.props.children,f.mode,y,p.key),c.return=f,f=c):(y=Gr(p.type,p.key,p.props,null,f.mode,y),y.ref=Fn(f,c,p),y.return=f,f=y)}return s(f);case en:e:{for(M=p.key;c!==null;){if(c.key===M)if(c.tag===4&&c.stateNode.containerInfo===p.containerInfo&&c.stateNode.implementation===p.implementation){n(f,c.sibling),c=l(c,p.children||[]),c.return=f,f=c;break e}else{n(f,c);break}else t(f,c);c=c.sibling}c=wi(p,f.mode,y),c.return=f,f=c}return s(f);case yt:return M=p._init,D(f,c,M(p._payload),y)}if(In(p))return w(f,c,p,y);if(Pn(p))return v(f,c,p,y);Lr(f,p)}return typeof p=="string"&&p!==""||typeof p=="number"?(p=""+p,c!==null&&c.tag===6?(n(f,c.sibling),c=l(c,p),c.return=f,f=c):(n(f,c),c=xi(p,f.mode,y),c.return=f,f=c),s(f)):n(f,c)}return D}var _n=Qu(!0),Ku=Qu(!1),pl=Ot(null),ml=null,cn=null,Vs=null;function Hs(){Vs=cn=ml=null}function Ws(e){var t=pl.current;Z(pl),e._currentValue=t}function Ji(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function gn(e,t){ml=e,Vs=cn=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(Te=!0),e.firstContext=null)}function Qe(e){var t=e._currentValue;if(Vs!==e)if(e={context:e,memoizedValue:t,next:null},cn===null){if(ml===null)throw Error(k(308));cn=e,ml.dependencies={lanes:0,firstContext:e}}else cn=cn.next=e;return t}var Vt=null;function Qs(e){Vt===null?Vt=[e]:Vt.push(e)}function bu(e,t,n,r){var l=t.interleaved;return l===null?(n.next=n,Qs(t)):(n.next=l.next,l.next=n),t.interleaved=n,pt(e,r)}function pt(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var xt=!1;function Ks(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function qu(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function ct(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Tt(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,H&2){var l=r.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),r.pending=t,pt(e,n)}return l=r.interleaved,l===null?(t.next=t,Qs(r)):(t.next=l.next,l.next=t),r.interleaved=t,pt(e,n)}function Qr(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,zs(e,n)}}function no(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var l=null,i=null;if(n=n.firstBaseUpdate,n!==null){do{var s={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};i===null?l=i=s:i=i.next=s,n=n.next}while(n!==null);i===null?l=i=t:i=i.next=t}else l=i=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:i,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function hl(e,t,n,r){var l=e.updateQueue;xt=!1;var i=l.firstBaseUpdate,s=l.lastBaseUpdate,o=l.shared.pending;if(o!==null){l.shared.pending=null;var u=o,d=u.next;u.next=null,s===null?i=d:s.next=d,s=u;var g=e.alternate;g!==null&&(g=g.updateQueue,o=g.lastBaseUpdate,o!==s&&(o===null?g.firstBaseUpdate=d:o.next=d,g.lastBaseUpdate=u))}if(i!==null){var h=l.baseState;s=0,g=d=u=null,o=i;do{var m=o.lane,x=o.eventTime;if((r&m)===m){g!==null&&(g=g.next={eventTime:x,lane:0,tag:o.tag,payload:o.payload,callback:o.callback,next:null});e:{var w=e,v=o;switch(m=t,x=n,v.tag){case 1:if(w=v.payload,typeof w=="function"){h=w.call(x,h,m);break e}h=w;break e;case 3:w.flags=w.flags&-65537|128;case 0:if(w=v.payload,m=typeof w=="function"?w.call(x,h,m):w,m==null)break e;h=re({},h,m);break e;case 2:xt=!0}}o.callback!==null&&o.lane!==0&&(e.flags|=64,m=l.effects,m===null?l.effects=[o]:m.push(o))}else x={eventTime:x,lane:m,tag:o.tag,payload:o.payload,callback:o.callback,next:null},g===null?(d=g=x,u=h):g=g.next=x,s|=m;if(o=o.next,o===null){if(o=l.shared.pending,o===null)break;m=o,o=m.next,m.next=null,l.lastBaseUpdate=m,l.shared.pending=null}}while(!0);if(g===null&&(u=h),l.baseState=u,l.firstBaseUpdate=d,l.lastBaseUpdate=g,t=l.shared.interleaved,t!==null){l=t;do s|=l.lane,l=l.next;while(l!==t)}else i===null&&(l.shared.lanes=0);Yt|=s,e.lanes=s,e.memoizedState=h}}function ro(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=mi.transition;mi.transition={};try{e(!1),t()}finally{K=n,mi.transition=r}}function dc(){return Ke().memoizedState}function Xf(e,t,n){var r=Dt(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},fc(e))pc(t,n);else if(n=bu(e,t,n,r),n!==null){var l=je();Ze(n,e,r,l),mc(n,t,r)}}function Gf(e,t,n){var r=Dt(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(fc(e))pc(t,l);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var s=t.lastRenderedState,o=i(s,n);if(l.hasEagerState=!0,l.eagerState=o,Je(o,s)){var u=t.interleaved;u===null?(l.next=l,Qs(t)):(l.next=u.next,u.next=l),t.interleaved=l;return}}catch{}finally{}n=bu(e,t,l,r),n!==null&&(l=je(),Ze(n,e,r,l),mc(n,t,r))}}function fc(e){var t=e.alternate;return e===ne||t!==null&&t===ne}function pc(e,t){bn=gl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function mc(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,zs(e,n)}}var yl={readContext:Qe,useCallback:ve,useContext:ve,useEffect:ve,useImperativeHandle:ve,useInsertionEffect:ve,useLayoutEffect:ve,useMemo:ve,useReducer:ve,useRef:ve,useState:ve,useDebugValue:ve,useDeferredValue:ve,useTransition:ve,useMutableSource:ve,useSyncExternalStore:ve,useId:ve,unstable_isNewReconciler:!1},Zf={readContext:Qe,useCallback:function(e,t){return tt().memoizedState=[e,t===void 0?null:t],e},useContext:Qe,useEffect:io,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,br(4194308,4,sc.bind(null,t,e),n)},useLayoutEffect:function(e,t){return br(4194308,4,e,t)},useInsertionEffect:function(e,t){return br(4,2,e,t)},useMemo:function(e,t){var n=tt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=tt();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Xf.bind(null,ne,e),[r.memoizedState,e]},useRef:function(e){var t=tt();return e={current:e},t.memoizedState=e},useState:lo,useDebugValue:ea,useDeferredValue:function(e){return tt().memoizedState=e},useTransition:function(){var e=lo(!1),t=e[0];return e=Yf.bind(null,e[1]),tt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=ne,l=tt();if(ee){if(n===void 0)throw Error(k(407));n=n()}else{if(n=t(),ce===null)throw Error(k(349));qt&30||Zu(r,t,n)}l.memoizedState=n;var i={value:n,getSnapshot:t};return l.queue=i,io(ec.bind(null,r,i,e),[e]),r.flags|=2048,pr(9,Ju.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=tt(),t=ce.identifierPrefix;if(ee){var n=ut,r=ot;n=(r&~(1<<32-Ge(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=dr++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=s.createElement(n,{is:r.is}):(e=s.createElement(n),n==="select"&&(s=e,r.multiple?s.multiple=!0:r.size&&(s.size=r.size))):e=s.createElementNS(e,n),e[nt]=t,e[or]=r,Nc(e,t,!1,!1),t.stateNode=e;e:{switch(s=Ri(n,r),n){case"dialog":G("cancel",e),G("close",e),l=r;break;case"iframe":case"object":case"embed":G("load",e),l=r;break;case"video":case"audio":for(l=0;ljn&&(t.flags|=128,r=!0,Rn(i,!1),t.lanes=4194304)}else{if(!r)if(e=vl(s),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Rn(i,!0),i.tail===null&&i.tailMode==="hidden"&&!s.alternate&&!ee)return ge(t),null}else 2*ie()-i.renderingStartTime>jn&&n!==1073741824&&(t.flags|=128,r=!0,Rn(i,!1),t.lanes=4194304);i.isBackwards?(s.sibling=t.child,t.child=s):(n=i.last,n!==null?n.sibling=s:t.child=s,i.last=s)}return i.tail!==null?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=ie(),t.sibling=null,n=te.current,X(te,r?n&1|2:n&1),t):(ge(t),null);case 22:case 23:return sa(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?Re&1073741824&&(ge(t),t.subtreeFlags&6&&(t.flags|=8192)):ge(t),null;case 24:return null;case 25:return null}throw Error(k(156,t.tag))}function sp(e,t){switch(As(t),t.tag){case 1:return De(t.type)&&ul(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return kn(),Z(ze),Z(Se),Ys(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return qs(t),null;case 13:if(Z(te),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(k(340));Sn()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Z(te),null;case 4:return kn(),null;case 10:return Ws(t.type._context),null;case 22:case 23:return sa(),null;case 24:return null;default:return null}}var Rr=!1,we=!1,ap=typeof WeakSet=="function"?WeakSet:Set,z=null;function dn(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){le(e,t,r)}else n.current=null}function os(e,t,n){try{n()}catch(r){le(e,t,r)}}var go=!1;function op(e,t){if(Qi=il,e=zu(),Is(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch{n=null;break e}var s=0,o=-1,u=-1,d=0,g=0,h=e,m=null;t:for(;;){for(var x;h!==n||l!==0&&h.nodeType!==3||(o=s+l),h!==i||r!==0&&h.nodeType!==3||(u=s+r),h.nodeType===3&&(s+=h.nodeValue.length),(x=h.firstChild)!==null;)m=h,h=x;for(;;){if(h===e)break t;if(m===n&&++d===l&&(o=s),m===i&&++g===r&&(u=s),(x=h.nextSibling)!==null)break;h=m,m=h.parentNode}h=x}n=o===-1||u===-1?null:{start:o,end:u}}else n=null}n=n||{start:0,end:0}}else n=null;for(Ki={focusedElem:e,selectionRange:n},il=!1,z=t;z!==null;)if(t=z,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,z=e;else for(;z!==null;){t=z;try{var w=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(w!==null){var v=w.memoizedProps,D=w.memoizedState,f=t.stateNode,c=f.getSnapshotBeforeUpdate(t.elementType===t.type?v:qe(t.type,v),D);f.__reactInternalSnapshotBeforeUpdate=c}break;case 3:var p=t.stateNode.containerInfo;p.nodeType===1?p.textContent="":p.nodeType===9&&p.documentElement&&p.removeChild(p.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(k(163))}}catch(y){le(t,t.return,y)}if(e=t.sibling,e!==null){e.return=t.return,z=e;break}z=t.return}return w=go,go=!1,w}function qn(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var i=l.destroy;l.destroy=void 0,i!==void 0&&os(t,n,i)}l=l.next}while(l!==r)}}function Fl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function us(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Cc(e){var t=e.alternate;t!==null&&(e.alternate=null,Cc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[nt],delete t[or],delete t[Yi],delete t[Wf],delete t[Qf])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Mc(e){return e.tag===5||e.tag===3||e.tag===4}function yo(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Mc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function cs(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=ol));else if(r!==4&&(e=e.child,e!==null))for(cs(e,t,n),e=e.sibling;e!==null;)cs(e,t,n),e=e.sibling}function ds(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(ds(e,t,n),e=e.sibling;e!==null;)ds(e,t,n),e=e.sibling}var de=null,Ye=!1;function gt(e,t,n){for(n=n.child;n!==null;)Pc(e,t,n),n=n.sibling}function Pc(e,t,n){if(rt&&typeof rt.onCommitFiberUnmount=="function")try{rt.onCommitFiberUnmount(El,n)}catch{}switch(n.tag){case 5:we||dn(n,t);case 6:var r=de,l=Ye;de=null,gt(e,t,n),de=r,Ye=l,de!==null&&(Ye?(e=de,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):de.removeChild(n.stateNode));break;case 18:de!==null&&(Ye?(e=de,n=n.stateNode,e.nodeType===8?di(e.parentNode,n):e.nodeType===1&&di(e,n),rr(e)):di(de,n.stateNode));break;case 4:r=de,l=Ye,de=n.stateNode.containerInfo,Ye=!0,gt(e,t,n),de=r,Ye=l;break;case 0:case 11:case 14:case 15:if(!we&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var i=l,s=i.destroy;i=i.tag,s!==void 0&&(i&2||i&4)&&os(n,t,s),l=l.next}while(l!==r)}gt(e,t,n);break;case 1:if(!we&&(dn(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(o){le(n,t,o)}gt(e,t,n);break;case 21:gt(e,t,n);break;case 22:n.mode&1?(we=(r=we)||n.memoizedState!==null,gt(e,t,n),we=r):gt(e,t,n);break;default:gt(e,t,n)}}function xo(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new ap),t.forEach(function(r){var l=gp.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function be(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=s),r&=~i}if(r=l,r=ie()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*cp(r/1960))-r,10e?16:e,Nt===null)var r=!1;else{if(e=Nt,Nt=null,Sl=0,H&6)throw Error(k(331));var l=H;for(H|=4,z=e.current;z!==null;){var i=z,s=i.child;if(z.flags&16){var o=i.deletions;if(o!==null){for(var u=0;uie()-la?Wt(e,0):ra|=n),Le(e,t)}function Oc(e,t){t===0&&(e.mode&1?(t=Er,Er<<=1,!(Er&130023424)&&(Er=4194304)):t=1);var n=je();e=pt(e,t),e!==null&&(vr(e,t,n),Le(e,n))}function vp(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Oc(e,n)}function gp(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(k(314))}r!==null&&r.delete(t),Oc(e,n)}var Ic;Ic=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||ze.current)Te=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return Te=!1,lp(e,t,n);Te=!!(e.flags&131072)}else Te=!1,ee&&t.flags&1048576&&Vu(t,fl,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;qr(e,t),e=t.pendingProps;var l=wn(t,Se.current);gn(t,n),l=Gs(null,t,r,e,l,n);var i=Zs();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,De(r)?(i=!0,cl(t)):i=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Ks(t),l.updater=Ll,t.stateNode=l,l._reactInternals=t,ts(t,r,e,n),t=ls(null,t,r,!0,i,n)):(t.tag=0,ee&&i&&Bs(t),Ne(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(qr(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=xp(r),e=qe(r,e),l){case 0:t=rs(null,t,r,e,n);break e;case 1:t=mo(null,t,r,e,n);break e;case 11:t=fo(null,t,r,e,n);break e;case 14:t=po(null,t,r,qe(r.type,e),n);break e}throw Error(k(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:qe(r,l),rs(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:qe(r,l),mo(e,t,r,l,n);case 3:e:{if(Sc(t),e===null)throw Error(k(387));r=t.pendingProps,i=t.memoizedState,l=i.element,qu(e,t),hl(t,r,null,n);var s=t.memoizedState;if(r=s.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=i,t.memoizedState=i,t.flags&256){l=Nn(Error(k(423)),t),t=ho(e,t,r,n,l);break e}else if(r!==l){l=Nn(Error(k(424)),t),t=ho(e,t,r,n,l);break e}else for($e=Pt(t.stateNode.containerInfo.firstChild),Oe=t,ee=!0,Xe=null,n=Ku(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(Sn(),r===l){t=mt(e,t,n);break e}Ne(e,t,r,n)}t=t.child}return t;case 5:return Yu(t),e===null&&Zi(t),r=t.type,l=t.pendingProps,i=e!==null?e.memoizedProps:null,s=l.children,bi(r,l)?s=null:i!==null&&bi(r,i)&&(t.flags|=32),wc(e,t),Ne(e,t,s,n),t.child;case 6:return e===null&&Zi(t),null;case 13:return _c(e,t,n);case 4:return bs(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=_n(t,null,r,n):Ne(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:qe(r,l),fo(e,t,r,l,n);case 7:return Ne(e,t,t.pendingProps,n),t.child;case 8:return Ne(e,t,t.pendingProps.children,n),t.child;case 12:return Ne(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,i=t.memoizedProps,s=l.value,X(pl,r._currentValue),r._currentValue=s,i!==null)if(Je(i.value,s)){if(i.children===l.children&&!ze.current){t=mt(e,t,n);break e}}else for(i=t.child,i!==null&&(i.return=t);i!==null;){var o=i.dependencies;if(o!==null){s=i.child;for(var u=o.firstContext;u!==null;){if(u.context===r){if(i.tag===1){u=ct(-1,n&-n),u.tag=2;var d=i.updateQueue;if(d!==null){d=d.shared;var g=d.pending;g===null?u.next=u:(u.next=g.next,g.next=u),d.pending=u}}i.lanes|=n,u=i.alternate,u!==null&&(u.lanes|=n),Ji(i.return,n,t),o.lanes|=n;break}u=u.next}}else if(i.tag===10)s=i.type===t.type?null:i.child;else if(i.tag===18){if(s=i.return,s===null)throw Error(k(341));s.lanes|=n,o=s.alternate,o!==null&&(o.lanes|=n),Ji(s,n,t),s=i.sibling}else s=i.child;if(s!==null)s.return=i;else for(s=i;s!==null;){if(s===t){s=null;break}if(i=s.sibling,i!==null){i.return=s.return,s=i;break}s=s.return}i=s}Ne(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,gn(t,n),l=Qe(l),r=r(l),t.flags|=1,Ne(e,t,r,n),t.child;case 14:return r=t.type,l=qe(r,t.pendingProps),l=qe(r.type,l),po(e,t,r,l,n);case 15:return yc(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:qe(r,l),qr(e,t),t.tag=1,De(r)?(e=!0,cl(t)):e=!1,gn(t,n),hc(t,r,l),ts(t,r,l,n),ls(null,t,r,!0,e,n);case 19:return kc(e,t,n);case 22:return xc(e,t,n)}throw Error(k(156,t.tag))};function Bc(e,t){return fu(e,t)}function yp(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function He(e,t,n,r){return new yp(e,t,n,r)}function oa(e){return e=e.prototype,!(!e||!e.isReactComponent)}function xp(e){if(typeof e=="function")return oa(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Cs)return 11;if(e===Ms)return 14}return 2}function Lt(e,t){var n=e.alternate;return n===null?(n=He(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Gr(e,t,n,r,l,i){var s=2;if(r=e,typeof e=="function")oa(e)&&(s=1);else if(typeof e=="string")s=5;else e:switch(e){case tn:return Qt(n.children,l,i,t);case Es:s=8,l|=8;break;case ji:return e=He(12,n,t,l|2),e.elementType=ji,e.lanes=i,e;case Ei:return e=He(13,n,t,l),e.elementType=Ei,e.lanes=i,e;case Ci:return e=He(19,n,t,l),e.elementType=Ci,e.lanes=i,e;case Yo:return $l(n,l,i,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case bo:s=10;break e;case qo:s=9;break e;case Cs:s=11;break e;case Ms:s=14;break e;case yt:s=16,r=null;break e}throw Error(k(130,e==null?e:typeof e,""))}return t=He(s,n,t,l),t.elementType=e,t.type=r,t.lanes=i,t}function Qt(e,t,n,r){return e=He(7,e,r,t),e.lanes=n,e}function $l(e,t,n,r){return e=He(22,e,r,t),e.elementType=Yo,e.lanes=n,e.stateNode={isHidden:!1},e}function xi(e,t,n){return e=He(6,e,null,t),e.lanes=n,e}function wi(e,t,n){return t=He(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function wp(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=ei(0),this.expirationTimes=ei(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=ei(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function ua(e,t,n,r,l,i,s,o,u){return e=new wp(e,t,n,o,u),t===1?(t=1,i===!0&&(t|=8)):t=0,i=He(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ks(i),e}function Sp(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Hc)}catch(e){console.error(e)}}Hc(),Ho.exports=Be;var Ep=Ho.exports,Co=Ep;ki.createRoot=Co.createRoot,ki.hydrateRoot=Co.hydrateRoot;const Cp={"Content-Type":"application/json"};async function Ir(e,t={}){const n=await fetch(e,{credentials:"same-origin",headers:{...t.body?Cp:{},...t.headers||{}},...t});if(n.status===204)return null;const r=n.headers.get("content-type")||"",l=await n.text();let i=null;if(l!=="")if(r.includes("application/json"))try{i=JSON.parse(l)}catch{const s=new Error("Server lieferte ungueltiges JSON.");throw s.status=n.status,s.payload={raw:l},s}else i={raw:l};if(!n.ok){const s=(i==null?void 0:i.message)||(l===""?`Request failed with status ${n.status}`:"Server lieferte keine JSON-Antwort."),o=new Error(s);throw o.status=n.status,o.payload=i,o}return i}const ye={get:e=>Ir(e),post:(e,t)=>Ir(e,{method:"POST",body:JSON.stringify(t)}),patch:(e,t)=>Ir(e,{method:"PATCH",body:JSON.stringify(t)}),delete:e=>Ir(e,{method:"DELETE"})};function Mp(e){const t=()=>window.matchMedia(e).matches,[n,r]=F.useState(t);return F.useEffect(()=>{const l=window.matchMedia(e),i=s=>r(s.matches);return l.addEventListener("change",i),r(l.matches),()=>l.removeEventListener("change",i)},[e]),n}const Pp=[{id:"calendar",label:"Kalender",roles:["tenant_admin","dispatcher","instructor"]},{id:"students",label:"Fahrschueler",roles:["tenant_admin","dispatcher"]},{id:"templates",label:"Klassen",roles:["tenant_admin"]},{id:"lesson-types",label:"Stundenarten",roles:["tenant_admin"]},{id:"instructors",label:"Fahrlehrer",roles:["tenant_admin"]},{id:"tenant-profile",label:"Fahrschule",roles:["tenant_admin"]},{id:"users",label:"Benutzer",roles:["tenant_admin","superadmin"]},{id:"tenants",label:"Mandanten",roles:["superadmin"]}],Wc=[{value:"BW",label:"Baden-Wuerttemberg"},{value:"BY",label:"Bayern"},{value:"BE",label:"Berlin"},{value:"BB",label:"Brandenburg"},{value:"HB",label:"Bremen"},{value:"HH",label:"Hamburg"},{value:"HE",label:"Hessen"},{value:"MV",label:"Mecklenburg-Vorpommern"},{value:"NI",label:"Niedersachsen"},{value:"NW",label:"Nordrhein-Westfalen"},{value:"RP",label:"Rheinland-Pfalz"},{value:"SL",label:"Saarland"},{value:"SN",label:"Sachsen"},{value:"ST",label:"Sachsen-Anhalt"},{value:"SH",label:"Schleswig-Holstein"},{value:"TH",label:"Thueringen"}];function vs(e=new Date){const t=new Date(e),r=(t.getDay()+6)%7;return t.setDate(t.getDate()-r),t.setHours(0,0,0,0),t}function Gn(e,t){const n=new Date(e);return n.setDate(n.getDate()+t),n}function xe(e){const t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}-${n}-${r}`}function Tp(e,t){return xe(e)===xe(t)}function Qc(e,t){const n=new Date(e),r=new Date(t);return n.setHours(0,0,0,0),r.setHours(0,0,0,0),n0?l:r,s=Number((e==null?void 0:e.fixed_duration)||0)===1,o=s?1:Math.max(1,Math.round(i/r));return{baseDuration:r,duration:i,units:o,isFixed:s}}function _t(e,t=!1){return new Intl.DateTimeFormat("de-DE",{weekday:t?void 0:"short",day:"2-digit",month:"2-digit",hour:t?"2-digit":void 0,minute:t?"2-digit":void 0}).format(new Date(e))}function zp(e){return new Intl.DateTimeFormat("de-DE",{weekday:"long",day:"2-digit",month:"2-digit",year:"numeric"}).format(new Date(e))}function Po(e){return new Intl.DateTimeFormat("de-DE",{hour:"2-digit",minute:"2-digit"}).format(new Date(e))}function To(e){const t=Math.max(0,Number(e||0)),n=Math.floor(t/60),r=t%60;return`${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}`}function Dp(e){return e>9*60?45:e>6*60?30:0}function Lp(e,t){const n=new Date(t);n.setHours(0,0,0,0);const r=new Date(t);r.setHours(24,0,0,0);const l=(e||[]).filter(x=>{if(x.status==="cancelled")return!1;const w=new Date(x.start_at),v=new Date(x.end_at);return wn}).map(x=>{const w=new Date(x.start_at),v=new Date(x.end_at);return{...x,visibleStart:w>n?w:n,visibleEnd:vx.visibleEnd>x.visibleStart).sort((x,w)=>x.visibleStart-w.visibleStart),i=l.reduce((x,w)=>w.category!=="student"?x:x+Math.max(0,Number(w.units||0)),0);if(!l.length)return{taughtUnits:i,workSpanMinutes:0,breakMinutes:0,requiredBreakMinutes:0,breakStatus:"ok"};const s=[];for(const x of l){const w={start:x.visibleStart,end:x.visibleEnd},v=s[s.length-1];if(!v||w.start>v.end){s.push(w);continue}w.end>v.end&&(v.end=w.end)}let o=0,u=0;s.forEach((x,w)=>{if(o+=Math.max(0,Math.round((x.end.getTime()-x.start.getTime())/6e4)),w===0)return;const v=s[w-1];u+=Math.max(0,Math.round((x.start.getTime()-v.end.getTime())/6e4))});const d=s[0].start,g=s[s.length-1].end,h=Math.max(0,Math.round((g.getTime()-d.getTime())/6e4)),m=Dp(o);return{taughtUnits:i,workSpanMinutes:h,breakMinutes:u,requiredBreakMinutes:m,breakStatus:u>=m?"ok":"warning"}}function Fp(e){return String(e||"").replace(/[^\d+]/g,"").replace(/^\+/,"")}function Rp(e,t,n,r){if(!n||!r)return"";const l=e!=null&&e.first_name?` ${e.first_name}`:"",i=t?`${t.first_name} ${t.last_name}`.trim():"dein Fahrlehrer";return`Hi${l}, die Fahrstunde ist am ${zp(n)} um ${Po(n)} Uhr und geht voraussichtlich bis ${Po(r)} Uhr. Gruss ${i}`}function $p(e,t){const n=[0,1,2,3,4,5,6],r=new Date(e),l=Gn(e,7);return{start:r,end:l,days:n.map(i=>Gn(e,i))}}function Op(e){const t=[];for(const n of e.conflicts||[])t.push(`- ${n.message}`);for(const n of e.rest_period_warnings||[])t.push(`- ${n.message}`);return t.join(` -`)}function Ip(e){return Object.fromEntries(e.map(t=>[t.id,t.progress||[]]))}function Bp(e){return{...e,requirements:(e.requirements||[]).map((t,n)=>({...t,sort_order:n,required_units:Number(t.required_units||0),phase_label:t.phase_label||""}))}}function Ap(e,t){return e?`${e}::${t}`:t}function Kc(e){if(!Number(e==null?void 0:e.is_combination))return[""];const t=[...new Set((e.requirements||[]).map(n=>n.phase_label||"").filter(Boolean))];return t.length>0?t:["C","CE"]}function Zr(e,t){const n=new Set(e.lesson_type_ids&&e.lesson_type_ids.length>0?e.lesson_type_ids.map(s=>Number(s)):t.filter(s=>s.category==="student").map(s=>Number(s.id))),r=new Map((e.requirements||[]).map(s=>[s.requirement_key,s])),l=Kc(e),i=[];return t.filter(s=>s.category==="student"&&Number(s.is_counted)===1&&n.has(Number(s.id))).forEach((s,o)=>{const u=s.effective_requirement_key||s.requirement_key||`lesson_type_${s.id}`;l.forEach((d,g)=>{const h=Ap(d,u),m=r.get(h)||(g===0?r.get(u):null);i.push({requirement_key:h,phase_label:d,base_requirement_key:u,label:s.name,required_units:Number((m==null?void 0:m.required_units)||0),sort_order:o+g*1e3,lesson_type_id:Number(s.id),color:s.color})})}),i}function pa(e){const t=[];for(const n of e||[]){const r=n.phase_label||"";let l=t.find(i=>i.phase_label===r);l||(l={phase_label:r,rows:[]},t.push(l)),l.rows.push(n)}return t}function bc(e){const t=e.reduce((r,l)=>r+Number(l.required_units||0),0),n=e.reduce((r,l)=>r+Number(l.open_units||0),0);return{required:t,open:n,status:n>0?"missing":n<0?"over":"complete"}}function Jr(e){return Number(e)>0?{className:"is-missing",text:`${e} offen`}:Number(e)<0?{className:"is-over",text:`${Math.abs(e)} ueberplant`}:{className:"is-complete",text:"0 offen"}}function qc(e,t){return e.category!=="student"||!t?!0:(e.visible_template_ids||[]).includes(t)}function Up(e,t,n){if(!t)return e;const r=n.find(l=>Number(l.id)===Number(t));return r?e.filter(l=>l.category==="student"&&qc(l,Number(r.template_id))):e}function Yc(e){return{student:"Fahrschueler",private:"Privat",work:"Sonstige Arbeiten",theory:"Theorie",other:"Sonstiges",blocked:"Sperre"}[e]||e}function Vp(){var _,b;const e=Mp("(max-width: 960px)"),[t,n]=F.useState({user:null}),[r,l]=F.useState(null),[i,s]=F.useState(!0),[o,u]=F.useState("calendar"),[d,g]=F.useState(vs()),[h,m]=F.useState(null),[x,w]=F.useState("student"),[v,D]=F.useState(null),[f,c]=F.useState(null),[p,y]=F.useState(""),[j,M]=F.useState(()=>window.localStorage.getItem("calendar-theme")||"light"),S=F.useMemo(()=>$p(d),[d]);async function T(){try{const E=await ye.get("/api/v1/auth/me");return n(E),E.user&&await $(E.user,S.start,S.end),E}catch(E){return y(E.message),{user:null}}finally{s(!1)}}async function $(E=t.user,B=S.start,me=S.end){var he;if(!E)return;const ke=new URLSearchParams({from:B.toISOString(),to:me.toISOString()}),Me=await ye.get(`/api/v1/bootstrap?${ke.toString()}`);l(Me),!h&&((he=Me.students)!=null&&he.length)&&m(Me.students[0].id)}F.useEffect(()=>{T()},[]),F.useEffect(()=>{t.user&&t.user.role!=="superadmin"&&$(t.user,S.start,S.end).catch(E=>y(E.message))},[d]),F.useEffect(()=>{document.documentElement.setAttribute("data-theme",j),window.localStorage.setItem("calendar-theme",j)},[j]);const L=(r==null?void 0:r.students)||[],W=(r==null?void 0:r.lessonTypes)||[],C=(r==null?void 0:r.instructors)||[],R=(r==null?void 0:r.templates)||[],A=(r==null?void 0:r.users)||[],N=(r==null?void 0:r.tenants)||[],V=(r==null?void 0:r.appointments)||[],J=(r==null?void 0:r.nextAppointment)||null,P=(r==null?void 0:r.sunTimes)||{},O=(r==null?void 0:r.dayMeta)||{},I=L.find(E=>E.id===h)||null,q=Ip(L),Q=Pp.filter(E=>{var B;return E.roles.includes((B=t.user)==null?void 0:B.role)});F.useEffect(()=>{Q.length&&!Q.some(E=>E.id===o)&&u(Q[0].id)},[o,Q]);async function it(E){y("");try{await ye.post("/api/v1/auth/login",E);const B=await T();B!=null&&B.user||y("Login war erfolgreich, aber die Session konnte nicht geladen werden. Bitte Server-Session und Cookies pruefen.")}catch(B){y(B.message)}}async function Y(){await ye.post("/api/v1/auth/logout",{}),window.location.reload()}async function Fe(E,B,me=null){me?await ye.patch(`${E}/${me}`,B):await ye.post(E,B),await $(t.user,S.start,S.end)}async function _e(E,B){await ye.delete(`${E}/${B}`),await $(t.user,S.start,S.end)}async function vt(E,B){await ye.patch(`/api/v1/students/${E}/training`,{rows:B}),await $(t.user,S.start,S.end)}async function Wl(E){E.preventDefault();const B=W.find(Me=>Number(Me.id)===Number(v==null?void 0:v.lesson_type_id)),me=ys(B,v==null?void 0:v.start_at,v==null?void 0:v.end_at);if(!(v!=null&&v.start_at)||!(v!=null&&v.end_at)||Ul(v.start_at,v.end_at)<=0){y("Bitte eine gueltige Start- und Endzeit waehlen.");return}const ke={student_id:v.student_id?Number(v.student_id):null,lesson_type_id:Number(v.lesson_type_id),instructor_id:Number(v.instructor_id),start_at:new Date(v.start_at).toISOString(),end_at:new Date(v.end_at).toISOString(),units:me.units,notes:v.notes,status:v.status,requirement_phase:v.requirement_phase||"",warning_acknowledged:!1};try{f?await ye.patch(`/api/v1/appointments/${f}`,ke):await ye.post("/api/v1/appointments",ke),D(null),c(null),await $(t.user,S.start,S.end)}catch(Me){Me.status===409?window.confirm(`Warnungen beim Einplanen: +`)}function Ip(e){return Object.fromEntries(e.map(t=>[t.id,t.progress||[]]))}function Bp(e){return{...e,requirements:(e.requirements||[]).map((t,n)=>({...t,sort_order:n,required_units:Number(t.required_units||0),phase_label:t.phase_label||""}))}}function Ap(e,t){return e?`${e}::${t}`:t}function Kc(e){if(!Number(e==null?void 0:e.is_combination))return[""];const t=[...new Set((e.requirements||[]).map(n=>n.phase_label||"").filter(Boolean))];return t.length>0?t:["C","CE"]}function Zr(e,t){const n=new Set(e.lesson_type_ids&&e.lesson_type_ids.length>0?e.lesson_type_ids.map(s=>Number(s)):t.filter(s=>s.category==="student").map(s=>Number(s.id))),r=new Map((e.requirements||[]).map(s=>[s.requirement_key,s])),l=Kc(e),i=[];return t.filter(s=>s.category==="student"&&Number(s.is_counted)===1&&n.has(Number(s.id))).forEach((s,o)=>{const u=s.effective_requirement_key||s.requirement_key||`lesson_type_${s.id}`;l.forEach((d,g)=>{const h=Ap(d,u),m=r.get(h)||(g===0?r.get(u):null);i.push({requirement_key:h,phase_label:d,base_requirement_key:u,label:s.name,required_units:Number((m==null?void 0:m.required_units)||0),sort_order:o+g*1e3,lesson_type_id:Number(s.id),color:s.color})})}),i}function pa(e){const t=[];for(const n of e||[]){const r=n.phase_label||"";let l=t.find(i=>i.phase_label===r);l||(l={phase_label:r,rows:[]},t.push(l)),l.rows.push(n)}return t}function bc(e){const t=e.reduce((r,l)=>r+Number(l.required_units||0),0),n=e.reduce((r,l)=>r+Number(l.open_units||0),0);return{required:t,open:n,status:n>0?"missing":n<0?"over":"complete"}}function Jr(e){return Number(e)>0?{className:"is-missing",text:`${e} offen`}:Number(e)<0?{className:"is-over",text:`${Math.abs(e)} ueberplant`}:{className:"is-complete",text:"0 offen"}}function qc(e,t){return e.category!=="student"||!t?!0:(e.visible_template_ids||[]).includes(t)}function Up(e,t,n){if(!t)return e;const r=n.find(l=>Number(l.id)===Number(t));return r?e.filter(l=>l.category==="student"&&qc(l,Number(r.template_id))):e}function Yc(e){return{student:"Fahrschueler",private:"Privat",work:"Sonstige Arbeiten",theory:"Theorie",other:"Sonstiges",blocked:"Sperre"}[e]||e}function Vp(){var _,b;const e=Mp("(max-width: 960px)"),[t,n]=F.useState({user:null}),[r,l]=F.useState(null),[i,s]=F.useState(!0),[o,u]=F.useState("calendar"),[d,g]=F.useState(vs()),[h,m]=F.useState(null),[x,w]=F.useState("student"),[v,D]=F.useState(null),[f,c]=F.useState(null),[p,y]=F.useState(""),[j,M]=F.useState(()=>window.localStorage.getItem("calendar-theme")||"light"),S=F.useMemo(()=>$p(d),[d]);async function T(){try{const E=await ye.get("https://api.fahrschultermin.dehttps://api.fahrschultermin.de/api/v1/auth/me");return n(E),E.user&&await $(E.user,S.start,S.end),E}catch(E){return y(E.message),{user:null}}finally{s(!1)}}async function $(E=t.user,B=S.start,me=S.end){var he;if(!E)return;const ke=new URLSearchParams({from:B.toISOString(),to:me.toISOString()}),Me=await ye.get(`https://api.fahrschultermin.de/api/v1/bootstrap?${ke.toString()}`);l(Me),!h&&((he=Me.students)!=null&&he.length)&&m(Me.students[0].id)}F.useEffect(()=>{T()},[]),F.useEffect(()=>{t.user&&t.user.role!=="superadmin"&&$(t.user,S.start,S.end).catch(E=>y(E.message))},[d]),F.useEffect(()=>{document.documentElement.setAttribute("data-theme",j),window.localStorage.setItem("calendar-theme",j)},[j]);const L=(r==null?void 0:r.students)||[],W=(r==null?void 0:r.lessonTypes)||[],C=(r==null?void 0:r.instructors)||[],R=(r==null?void 0:r.templates)||[],A=(r==null?void 0:r.users)||[],N=(r==null?void 0:r.tenants)||[],V=(r==null?void 0:r.appointments)||[],J=(r==null?void 0:r.nextAppointment)||null,P=(r==null?void 0:r.sunTimes)||{},O=(r==null?void 0:r.dayMeta)||{},I=L.find(E=>E.id===h)||null,q=Ip(L),Q=Pp.filter(E=>{var B;return E.roles.includes((B=t.user)==null?void 0:B.role)});F.useEffect(()=>{Q.length&&!Q.some(E=>E.id===o)&&u(Q[0].id)},[o,Q]);async function it(E){y("");try{await ye.post("https://api.fahrschultermin.dehttps://api.fahrschultermin.de/api/v1/auth/login",E);const B=await T();B!=null&&B.user||y("Login war erfolgreich, aber die Session konnte nicht geladen werden. Bitte Server-Session und Cookies pruefen.")}catch(B){y(B.message)}}async function Y(){await ye.post("https://api.fahrschultermin.dehttps://api.fahrschultermin.de/api/v1/auth/logout",{}),window.location.reload()}async function Fe(E,B,me=null){me?await ye.patch(`${E}/${me}`,B):await ye.post(E,B),await $(t.user,S.start,S.end)}async function _e(E,B){await ye.delete(`${E}/${B}`),await $(t.user,S.start,S.end)}async function vt(E,B){await ye.patch(`https://api.fahrschultermin.de/api/v1/students/${E}/training`,{rows:B}),await $(t.user,S.start,S.end)}async function Wl(E){E.preventDefault();const B=W.find(Me=>Number(Me.id)===Number(v==null?void 0:v.lesson_type_id)),me=ys(B,v==null?void 0:v.start_at,v==null?void 0:v.end_at);if(!(v!=null&&v.start_at)||!(v!=null&&v.end_at)||Ul(v.start_at,v.end_at)<=0){y("Bitte eine gueltige Start- und Endzeit waehlen.");return}const ke={student_id:v.student_id?Number(v.student_id):null,lesson_type_id:Number(v.lesson_type_id),instructor_id:Number(v.instructor_id),start_at:new Date(v.start_at).toISOString(),end_at:new Date(v.end_at).toISOString(),units:me.units,notes:v.notes,status:v.status,requirement_phase:v.requirement_phase||"",warning_acknowledged:!1};try{f?await ye.patch(`https://api.fahrschultermin.de/api/v1/appointments/${f}`,ke):await ye.post("https://api.fahrschultermin.dehttps://api.fahrschultermin.de/api/v1/appointments",ke),D(null),c(null),await $(t.user,S.start,S.end)}catch(Me){Me.status===409?window.confirm(`Warnungen beim Einplanen: ${Op(Me.payload.warnings)} -Trotzdem speichern?`)&&(ke.warning_acknowledged=!0,f?await ye.patch(`/api/v1/appointments/${f}`,ke):await ye.post("/api/v1/appointments",ke),D(null),c(null),await $(t.user,S.start,S.end)):y(Me.message)}}async function Ql(){f&&window.confirm("Termin wirklich loeschen?")&&(await ye.delete(`/api/v1/appointments/${f}`),D(null),c(null),await $(t.user,S.start,S.end))}function wr({lessonTypeId:E,day:B,hour:me,minute:ke=0,instructorId:Me,appointment:he=null,startAt:Kl=null,endAt:ma=null}){var va,ga;if(he){c(he.id),D({student_id:he.student_id||"",lesson_type_id:he.lesson_type_id,instructor_id:he.instructor_id,start_at:Un(new Date(he.start_at)),end_at:Un(new Date(he.end_at)),units:he.units,notes:he.notes||"",status:he.status,requirement_phase:(he.counted_requirement_key||"").includes("::")?he.counted_requirement_key.split("::")[0]:""});return}const bl=Kl?new Date(Kl):new Date(B);Kl||bl.setHours(me,ke,0,0);const ha=E||((va=W[0])==null?void 0:va.id)||"",ql=W.find(Gc=>Number(Gc.id)===Number(ha)),Xc=ma?new Date(ma):new Date(bl.getTime()+Math.max(1,Number((ql==null?void 0:ql.default_duration)||45))*60*1e3);c(null),D({student_id:x==="student"&&h||"",lesson_type_id:ha,instructor_id:Me||((ga=C[0])==null?void 0:ga.id)||"",start_at:Un(bl),end_at:Un(Xc),units:1,notes:"",status:"planned",requirement_phase:""})}return i?a.jsx("div",{className:"app-shell",children:a.jsx("div",{className:"loading-panel",children:"Lade Anwendung ..."})}):t.user?a.jsxs("div",{className:"app-shell",children:[a.jsxs("header",{className:"topbar",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Fahrschul-Kalender"}),a.jsx("h1",{children:"DriveTime Planner"}),a.jsx("p",{className:"meta-line",children:t.user.role==="superadmin"?"Systemweit":`${(_=r==null?void 0:r.tenant)==null?void 0:_.name} · ${(b=r==null?void 0:r.tenant)==null?void 0:b.timezone}`})]}),a.jsxs("div",{className:"topbar-actions",children:[a.jsxs("span",{className:"badge",children:[t.user.first_name," ",t.user.last_name]}),a.jsx("button",{className:"ghost-button",onClick:()=>M(E=>E==="dark"?"light":"dark"),children:j==="dark"?"Hell":"Dunkel"}),a.jsx("button",{className:"ghost-button",onClick:Y,children:"Logout"})]})]}),p&&a.jsx("div",{className:"flash-error",children:p}),a.jsx("nav",{className:"tab-strip",children:Q.map(E=>a.jsx("button",{className:E.id===o?"tab-button active":"tab-button",onClick:()=>u(E.id),children:E.label},E.id))}),a.jsxs("main",{className:"content-grid",children:[o==="calendar"&&t.user.role!=="superadmin"&&a.jsx(Wp,{isMobile:e,weekStart:d,setWeekStart:g,range:S,instructors:C,students:L,lessonTypes:W,appointments:V,nextAppointment:J,sunTimes:P,dayMeta:O,selectedStudent:I,selectedStudentId:h,setSelectedStudentId:m,plannerMode:x,setPlannerMode:w,progress:I?q[I.id]||[]:[],onCreate:wr}),o==="students"&&t.user.role!=="superadmin"&&a.jsx(bp,{students:L,templates:R,onSave:(E,B)=>Fe("/api/v1/students",E,B),onSaveTraining:vt,onDelete:E=>_e("/api/v1/students",E)}),o==="lesson-types"&&t.user.role!=="superadmin"&&a.jsx(qp,{lessonTypes:W,templates:R,onSave:(E,B)=>Fe("/api/v1/lesson-types",E,B),onDelete:E=>_e("/api/v1/lesson-types",E),onReorder:async E=>{await ye.post("/api/v1/lesson-types/reorder",{lesson_type_ids:E}),await $(t.user,S.start,S.end)},onSaveMatrix:async E=>{await ye.post("/api/v1/lesson-types/visibility",{rows:E}),await $(t.user,S.start,S.end)}}),o==="templates"&&t.user.role!=="superadmin"&&a.jsx(Xp,{templates:R,lessonTypes:W,onSave:(E,B)=>Fe("/api/v1/license-class-templates",E,B)}),o==="instructors"&&t.user.role!=="superadmin"&&a.jsx(Yp,{instructors:C,onSave:(E,B)=>Fe("/api/v1/instructors",E,B)}),o==="users"&&a.jsx(Gp,{users:A,tenants:N,currentUser:t.user,onSave:(E,B)=>Fe("/api/v1/users",E,B)}),o==="tenant-profile"&&t.user.role==="tenant_admin"&&(r==null?void 0:r.tenant)&&a.jsx(Jp,{tenant:r.tenant,onSave:async E=>{await ye.patch("/api/v1/tenant/profile",E),await $(t.user,S.start,S.end)}}),o==="tenants"&&t.user.role==="superadmin"&&a.jsx(Zp,{tenants:N,onSave:(E,B)=>Fe("/api/v1/tenants",E,B)})]}),v&&a.jsx(tm,{draft:v,setDraft:D,lessonTypes:W,instructors:C,students:L,templates:R,onPickStudent:E=>{E&&(m(Number(E)),w("student"),D(null),c(null))},onSubmit:Wl,onDelete:Ql,onClose:()=>{D(null),c(null)},isEditing:!!f})]}):a.jsx(Hp,{onSubmit:it,error:p})}function Hp({onSubmit:e,error:t}){async function n(r){r.preventDefault();const l=new FormData(r.currentTarget);await e({email:l.get("email"),password:l.get("password")})}return a.jsx("div",{className:"login-shell",children:a.jsxs("div",{className:"login-card",children:[a.jsx("p",{className:"eyebrow",children:"Mandantenfaehig · Kalenderfokus"}),a.jsx("h1",{children:"Dispositionsfenster"}),a.jsx("p",{className:"login-copy",children:"Planung fuer Fahrstunden, Vorlagen und Ruhezeitwarnungen in einer kompakten Leitstelle."}),a.jsxs("form",{onSubmit:n,className:"stack-form",children:[a.jsxs("label",{children:["E-Mail",a.jsx("input",{name:"email",type:"email",defaultValue:"admin@nordring.test",required:!0})]}),a.jsxs("label",{children:["Passwort",a.jsx("input",{name:"password",type:"password",defaultValue:"secret123",required:!0})]}),t&&a.jsx("div",{className:"inline-error",children:t}),a.jsx("button",{className:"primary-button",type:"submit",children:"Einloggen"})]}),a.jsx("p",{className:"hint-line",children:"Demo: `admin@nordring.test` / `secret123` oder `superadmin@example.com` / `secret123`"})]})})}function Wp(e){var wr;const{isMobile:t,weekStart:n,setWeekStart:r,range:l,instructors:i,students:s,lessonTypes:o,appointments:u,nextAppointment:d,sunTimes:g,dayMeta:h,selectedStudent:m,selectedStudentId:x,setSelectedStudentId:w,plannerMode:v,setPlannerMode:D,progress:f,onCreate:c}=e,p=t?[new Date]:l.days,[y,j]=F.useState(()=>new Date),[M,S]=F.useState(""),[T,$]=F.useState(!1),[L,W]=F.useState(null),[C,R]=F.useState(((wr=i[0])==null?void 0:wr.id)||null),[A,N]=F.useState(()=>xe(new Date)),[V,J]=F.useState("08:00"),[P,O]=F.useState("10:00"),I=[{id:"student",label:"Fahrschueler"},{id:"private",label:"Privat"},{id:"work",label:"Sonstige Arbeiten"},{id:"theory",label:"Theorie"}],q=Array.from({length:96},(_,b)=>{const E=Math.floor(b/4),B=b%4*15;return{hour:E,minute:B,label:`${String(E).padStart(2,"0")}:${String(B).padStart(2,"0")}`,rowClass:B===0?"full-hour":""}}),Q=o.filter(_=>v==="student"?_.category==="student"&&qc(_,m==null?void 0:m.template_id):v==="private"?_.category==="private":v==="work"?_.category==="work"||_.category==="other"||_.category==="blocked":v==="theory"?_.category==="theory":!1),it=s.filter(_=>`${_.first_name} ${_.last_name} ${_.template_code}`.toLowerCase().includes(M.toLowerCase())).slice(0,8);F.useEffect(()=>{const _=window.setInterval(()=>{j(new Date)},6e4);return()=>window.clearInterval(_)},[]),F.useEffect(()=>{m&&S(`${m.first_name} ${m.last_name}`)},[x,m]),F.useEffect(()=>{if(!i.length){R(null);return}i.some(_=>_.id===C)||R(i[0].id)},[i,C]),F.useEffect(()=>{if(Q.length===0){W(null);return}Q.some(_=>_.id===L)||W(Q[0].id)},[L,Q]);const Y=i.find(_=>_.id===C)||i[0]||null;Q.find(_=>_.id===L);const Fe=A&&Ul(jt(A,V),jt(A,P))>0,_e=Y?u.filter(_=>_.instructor_id===Y.id):[],vt=Math.max(0,Number((Y==null?void 0:Y.pre_start_buffer_minutes)||0)),Wl=Array.from(_e.filter(_=>Number(_.is_rest_relevant)===1).reduce((_,b)=>{const E=new Date(b.end_at),B=`${E.getFullYear()}-${String(E.getMonth()+1).padStart(2,"0")}-${String(E.getDate()).padStart(2,"0")}`,me=_.get(B);return(!me||E>me.endAt)&&_.set(B,{endAt:E}),_},new Map).values()).map(({endAt:_})=>{const b=_,E=new Date(_.getTime()+11*60*60*1e3),B=_e.some(me=>{const ke=new Date(me.start_at);return ke>b&&ke_.start-b.start);function Ql(){!L||!(Y!=null&&Y.id)||!Fe||c({lessonTypeId:L,instructorId:Y.id,startAt:jt(A,V),endAt:jt(A,P)})}return a.jsxs(a.Fragment,{children:[a.jsxs("section",{className:"calendar-stage",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Einsatzfenster"}),a.jsxs("h2",{children:[_t(l.start)," - ",_t(Gn(l.end,-1))]})]}),a.jsxs("div",{className:"toolbar",children:[a.jsxs("label",{className:"calendar-filter",children:["Fahrlehrer",a.jsx("select",{value:C||"",onChange:_=>R(Number(_.target.value)),children:i.map(_=>a.jsxs("option",{value:_.id,children:[_.first_name," ",_.last_name]},_.id))})]}),a.jsx("button",{className:"ghost-button",onClick:()=>r(Gn(n,-7)),children:"Zurueck"}),a.jsx("button",{className:"ghost-button",onClick:()=>r(vs()),children:"Heute"}),d&&a.jsx("button",{className:"ghost-button",onClick:()=>r(vs(new Date(d.start_at))),children:"Naechster Termin"}),a.jsx("button",{className:"ghost-button",onClick:()=>r(Gn(n,7)),children:"Weiter"})]})]}),a.jsxs("div",{className:"calendar-grid",children:[a.jsx("div",{className:"calendar-head time-col",children:"Zeit"}),p.map(_=>(()=>{var E,B,me,ke,Me;const b=Lp(_e,_);return a.jsxs("div",{className:["calendar-head day-col",Qc(_,y)?"past-head":"",(E=h[xe(_)])!=null&&E.holidayName?"holiday-head":"",(B=h[xe(_)])!=null&&B.isSunday?"sunday-head":""].filter(Boolean).join(" "),children:[a.jsx("strong",{children:_t(_)}),a.jsxs("div",{className:"day-summary",children:[a.jsxs("span",{className:"day-summary-line",children:[a.jsxs("strong",{children:[b.taughtUnits," UE"]}),a.jsx("span",{children:"geschult"})]}),a.jsxs("span",{className:"day-summary-line",children:[a.jsx("strong",{children:To(b.workSpanMinutes)}),a.jsx("span",{children:"Arbeitszeit"})]}),a.jsxs("span",{className:`day-summary-line break-line ${b.breakStatus}`,children:[a.jsx("strong",{children:To(b.breakMinutes)}),a.jsxs("span",{children:["(Pause ",b.requiredBreakMinutes," min)"]})]})]}),((me=h[xe(_)])==null?void 0:me.holidayName)&&a.jsx("span",{className:"holiday-meta",children:h[xe(_)].holidayName}),((ke=g[xe(_)])==null?void 0:ke.sunrise)&&((Me=g[xe(_)])==null?void 0:Me.sunset)&&a.jsxs("span",{className:"sun-meta",children:["Auf ",g[xe(_)].sunrise," · Unter ",g[xe(_)].sunset]})]},_.toISOString())})()),a.jsx("div",{className:"time-grid",children:q.map(_=>a.jsx("div",{className:`slot-label ${_.rowClass}`,children:_.label},_.label))}),p.map(_=>a.jsx(Qp,{day:_,slots:q,instructor:Y,appointments:_e,preStartBufferMinutes:vt,restIntervals:Wl,sunInfo:g[xe(_)]||null,dayMeta:h[xe(_)]||null,now:y,armedLessonTypeId:L,onCreate:c},_.toISOString()))]})]}),a.jsxs("aside",{className:"planner-panel",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Planung"}),a.jsx("h2",{children:"Bausteine"})]}),t&&a.jsx("button",{className:"primary-button compact",onClick:()=>c({day:new Date,hour:8,minute:0,instructorId:Y==null?void 0:Y.id}),children:"+"})]}),a.jsx("div",{className:"mode-switch",children:I.map(_=>a.jsx("button",{className:v===_.id?"tab-button active":"tab-button",onClick:()=>D(_.id),children:_.label},_.id))}),v==="student"&&a.jsxs("label",{className:"stack-form",children:["Fahrschueler",a.jsxs("div",{className:"autocomplete-shell",children:[a.jsx("input",{type:"text",value:M,placeholder:"Name eingeben ...",onFocus:()=>$(!0),onChange:_=>{S(_.target.value),$(!0)},onBlur:()=>{window.setTimeout(()=>$(!1),120)}}),T&&it.length>0&&a.jsx("div",{className:"autocomplete-list",children:it.map(_=>a.jsxs("button",{type:"button",className:"autocomplete-option",onMouseDown:b=>{b.preventDefault(),w(_.id),S(`${_.first_name} ${_.last_name}`),$(!1)},children:[a.jsxs("strong",{children:[_.first_name," ",_.last_name]}),a.jsx("span",{children:_.template_code})]},_.id))})]})]}),a.jsx("div",{className:"block-bank",children:Q.map(_=>a.jsxs("div",{className:L===_.id?"lesson-chip active":"lesson-chip",draggable:!t,onDragStart:b=>{const E=JSON.stringify({lessonTypeId:_.id});b.dataTransfer.effectAllowed="move",b.dataTransfer.setData("application/json",E),b.dataTransfer.setData("text/plain",E)},onClick:()=>{W(_.id),t&&c({day:new Date,hour:8,minute:0,lessonTypeId:_.id,instructorId:Y==null?void 0:Y.id})},style:{"--chip-color":_.color},children:[a.jsx("strong",{children:_.name}),a.jsx("span",{children:_.fixed_duration?`${_.default_duration} min fix`:`${_.default_duration} min pro Einheit`})]},_.id))}),v==="private"&&L&&a.jsxs("div",{className:"quick-plan-panel",children:[a.jsx("div",{className:"section-head compact-head",children:a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Privat"}),a.jsx("h2",{children:"Schnell eintragen"})]})}),a.jsxs("label",{className:"stack-form",children:["Datum",a.jsx("input",{type:"date",value:A,onChange:_=>N(_.target.value)})]}),a.jsxs("div",{className:"time-editor-grid two-col",children:[a.jsx(Nl,{label:"Start",value:V,onChange:J}),a.jsx(Nl,{label:"Ende",value:P,onChange:O})]}),a.jsx("button",{type:"button",className:"primary-button",onClick:Ql,disabled:!Fe,children:"Privatblock anlegen"})]}),m&&a.jsxs("div",{className:"progress-panel",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Reststunden"}),a.jsxs("h2",{children:[m.first_name," ",m.last_name]})]}),a.jsx("span",{className:"badge",children:m.template_code})]}),pa(f).map(_=>{const b=bc(_.rows);return a.jsxs("div",{className:"progress-phase",children:[_.phase_label&&a.jsxs("div",{className:"phase-head",children:[a.jsx("strong",{children:_.phase_label}),a.jsx("span",{className:`phase-state ${b.status}`,children:Jr(b.open).text})]}),_.rows.map(E=>a.jsxs("div",{className:"progress-row",children:[a.jsxs("div",{children:[a.jsx("strong",{children:E.label}),a.jsxs("p",{children:["Soll ",E.required_units," · Geplant ",E.planned_units," · Erledigt ",E.completed_units]})]}),a.jsx("div",{className:`open-pill ${Jr(E.open_units).className}`,children:Jr(E.open_units).text})]},E.requirement_key))]},_.phase_label||"default")})]})]})]})}function Qp({day:e,slots:t,instructor:n,appointments:r,preStartBufferMinutes:l,restIntervals:i,sunInfo:s,dayMeta:o,now:u,armedLessonTypeId:d,onCreate:g}){const h=new Date(e);h.setHours(0,0,0,0);const m=new Date(e);m.setHours(24,0,0,0);const x=Tp(e,u),w=Qc(e,u),v=u.getHours()*60+u.getMinutes(),D=Math.min(96,Math.max(0,v/15)),f=Math.min(96,Math.max(0,Math.ceil(D))),c=r.filter(C=>{const R=new Date(C.start_at),A=new Date(C.end_at);return Rh}),p=r.filter(C=>{const R=new Date(C.start_at);return R>=h&&Rnew Date(C.start_at)-new Date(R.start_at))[0]||null,y=(()=>{if(!p||l<=0)return null;const C=new Date(p.start_at),R=new Date(Math.max(h.getTime(),C.getTime()-l*60*1e3)),A=C;if(A<=R)return null;const N=R.getHours()*60+R.getMinutes(),V=A.getHours()*60+A.getMinutes(),J=Math.max(0,Math.floor(N/15)),P=Math.max(1,Math.ceil((V-N)/15));return{startIndex:J,spanBlocks:Math.min(P,96-J),label:`Anfahrt ${l} min`}})(),j=i.map(C=>{const R=C.start>h?C.start:h,A=C.end=m?24*60:A.getHours()*60+A.getMinutes(),J=Math.max(0,Math.floor(N/15)),P=Math.max(1,Math.ceil((V-N)/15));return{key:`${C.start.toISOString()}-${C.end.toISOString()}-${e.toISOString()}`,startIndex:J,spanBlocks:Math.min(P,96-J),label:`Ruhezeit bis ${String(C.end.getHours()).padStart(2,"0")}:${String(C.end.getMinutes()).padStart(2,"0")}`,hasConflict:C.hasConflict}}).filter(Boolean),M=Mo(s==null?void 0:s.sunrise),S=Mo(s==null?void 0:s.sunset),T=[];if(M!==null&&M>0&&T.push({key:`night-before-${xe(e)}`,startIndex:0,spanBlocks:Math.max(1,Math.ceil(M/15)),label:`Nacht bis ${s.sunrise}`,align:"end"}),S!==null&&S<24*60){const C=Math.max(0,Math.floor(S/15));T.push({key:`night-after-${xe(e)}`,startIndex:C,spanBlocks:Math.max(1,Math.ceil((24*60-S)/15)),label:`Dunkel ab ${s.sunset}`,align:"start"})}function $(C){g({day:e,hour:C.hour,minute:C.minute,instructorId:n==null?void 0:n.id,lessonTypeId:d||void 0})}function L(C,R){C.preventDefault();const A=C.dataTransfer.getData("application/json")||C.dataTransfer.getData("text/plain");if(!A)return;const N=JSON.parse(A);g({lessonTypeId:N.lessonTypeId,day:e,hour:R.hour,minute:R.minute,instructorId:n==null?void 0:n.id})}function W(C,R){const A=C.currentTarget.getBoundingClientRect(),N=Math.max(0,Math.min(A.height-1,C.clientY-A.top)),V=Math.floor(N/28),J=Math.min(95,R.startIndex+V);return t[J]}return a.jsxs("div",{className:["day-grid",w?"past-column":"",o!=null&&o.holidayName?"holiday-column":"",o!=null&&o.isSunday?"sunday-column":""].filter(Boolean).join(" "),children:[w&&a.jsx("div",{className:"day-past-overlay",style:{gridRow:"1 / span 96"}}),x&&f>0&&a.jsx("div",{className:"current-time-past",style:{gridRow:`1 / span ${f}`},"aria-hidden":"true"}),x&&D>0&&D<96&&a.jsx("div",{className:"current-time-line",style:{top:`${D*28}px`},"aria-hidden":"true",children:a.jsx("span",{children:"Jetzt"})}),t.map((C,R)=>a.jsx("button",{type:"button",className:`slot-cell quarter-hour ${C.rowClass}`,style:{gridRow:R+1},onDragOver:A=>{A.preventDefault(),A.dataTransfer.dropEffect="move"},onDrop:A=>L(A,C),onClick:()=>$(C)},C.label)),T.map(C=>a.jsx("div",{className:`sun-band ${C.align==="end"?"top-band":"bottom-band"}`,style:{gridRow:`${C.startIndex+1} / span ${C.spanBlocks}`},children:a.jsx("span",{children:C.label})},C.key)),y&&a.jsx("div",{className:"pre-start-stripe",style:{gridRow:`${y.startIndex+1} / span ${y.spanBlocks}`},"aria-hidden":"true",children:a.jsx("span",{children:y.label})}),c.map(C=>{const R=new Date(C.start_at),A=new Date(C.end_at),N=R>h?R:h,V=A=m?24*60:V.getHours()*60+V.getMinutes(),O=Math.max(0,Math.floor(J/15)),I=Math.max(1,Math.min(96-O,Math.ceil((P-J)/15)));return a.jsx(Kp,{appointment:C,onOpen:()=>g({appointment:C}),compact:!0,spanBlocks:I,gridRowStart:O+1},`${C.id}-${xe(e)}`)}),j.map(C=>a.jsx("div",{className:C.hasConflict?"rest-stripe warning":"rest-stripe ok",style:{gridRow:`${C.startIndex+1} / span ${C.spanBlocks}`},onDragOver:R=>{R.preventDefault(),R.dataTransfer.dropEffect="move"},onDrop:R=>{const A=W(R,C);L(R,A)},onClick:R=>{const A=W(R,C);$(A)},children:a.jsx("span",{children:C.label})},C.key))]})}function Kp({appointment:e,onOpen:t,compact:n=!1,spanBlocks:r=1,gridRowStart:l=null}){const s=`${e.student_first_name||""} ${e.student_last_name||""}`.trim()||Yc(e.category),o=r>=3,u=Number(e.student_needs_glasses||0)===1;return a.jsx("button",{className:n?"appointment-card compact-card day-appointment":"appointment-card",onClick:d=>{d.stopPropagation(),t()},style:{"--appointment-color":e.lesson_type_color,"--span-blocks":r,...l?{gridRow:`${l} / span ${r}`}:{}},children:n?a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"appointment-top",children:[a.jsxs("strong",{className:"appointment-title-row",children:[a.jsx("span",{children:e.lesson_type_name}),u&&a.jsx("span",{className:"vision-badge",title:"Brille erforderlich",children:"[Br]"})]}),a.jsxs("span",{className:"appointment-student",children:[s,u&&a.jsx("span",{className:"vision-inline","aria-hidden":"true",children:" [Brille]"})]}),o&&a.jsxs("span",{className:"appointment-meta",children:[_t(e.start_at)," · ",_t(e.start_at,!0)]})]}),a.jsx("div",{className:"appointment-bottom",children:a.jsxs("span",{children:["bis ",_t(e.end_at,!0)]})})]}):a.jsxs(a.Fragment,{children:[a.jsxs("strong",{className:"appointment-title-row",children:[a.jsx("span",{children:e.lesson_type_name}),u&&a.jsx("span",{className:"vision-badge",title:"Brille erforderlich",children:"[Br]"})]}),a.jsxs("span",{children:[_t(e.start_at,!0)," - ",_t(e.end_at,!0)]}),a.jsxs("span",{children:[s,u&&a.jsx("span",{className:"vision-inline",children:" [Brille]"})]})]})})}function bp({students:e,templates:t,onSave:n,onSaveTraining:r,onDelete:l}){var g;const[i,s]=F.useState(null),[o,u]=F.useState("master"),d=e.find(h=>Number(h.id)===Number(i))||null;return i==="new"?a.jsx(zo,{student:{first_name:"",last_name:"",phone:"",email:"",needs_glasses:0,notes:"",template_id:(g=t[0])==null?void 0:g.id,status:"active",progress:[]},templates:t,activeTab:"master",setActiveTab:u,onBack:()=>s(null),onSave:async h=>{await n(h,null),s(null)},onSaveTraining:null,onDelete:null,isNew:!0}):d?a.jsx(zo,{student:d,templates:t,activeTab:o,setActiveTab:u,onBack:()=>{s(null),u("master")},onSave:async h=>{await n(h,d.id)},onSaveTraining:async h=>{await r(d.id,h)},onDelete:async()=>{window.confirm(`Fahrschueler ${d.first_name} ${d.last_name} wirklich loeschen? Termine bleiben erhalten, verlieren aber den Fahrschueler-Bezug.`)&&(await l(d.id),s(null),u("master"))}}):a.jsxs("section",{className:"list-panel student-page",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Verwaltung"}),a.jsx("h2",{children:"Fahrschueler"}),a.jsx("p",{className:"meta-line",children:"Klick oeffnet die eigene Fahrschueler-Seite mit Stammdaten und Ausbildung."})]}),a.jsx("button",{className:"primary-button",onClick:()=>{u("master"),s("new")},children:"Neu"})]}),a.jsx("div",{className:"entity-list",children:e.map(h=>a.jsxs("button",{className:"entity-item student-list-row",onClick:()=>s(h.id),children:[a.jsxs("strong",{children:[h.first_name," ",h.last_name]}),a.jsxs("span",{children:[h.template_code," · ",h.status]})]},h.id))})]})}function zo({student:e,templates:t,activeTab:n,setActiveTab:r,onBack:l,onSave:i,onSaveTraining:s,onDelete:o,isNew:u=!1}){const[d,g]=F.useState(e),[h,m]=F.useState(e.progress||[]),[x,w]=F.useState(!1);F.useEffect(()=>{g(e),m(e.progress||[])},[e]);async function v(f){f.preventDefault(),await i(d)}async function D(f){if(f.preventDefault(),!!s){w(!0);try{await s(h.map(c=>({requirement_key:c.requirement_key,phase_label:c.phase_label||"",prior_completed_units:Number(c.prior_completed_units||0)})))}finally{w(!1)}}}return a.jsxs("section",{className:"list-panel student-page student-detail-page",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Fahrschueler"}),a.jsx("h2",{children:u?"Neuer Fahrschueler":`${e.first_name} ${e.last_name}`}),a.jsx("p",{className:"meta-line",children:u?"Stammdaten anlegen.":`${e.template_name||e.template_code} · ${e.status}`})]}),a.jsx("button",{type:"button",className:"ghost-button",onClick:l,children:"Zurueck"})]}),!u&&a.jsxs("div",{className:"mode-switch detail-tabs",children:[a.jsx("button",{className:n==="master"?"tab-button active":"tab-button",onClick:()=>r("master"),children:"Stammdaten"}),a.jsx("button",{className:n==="training"?"tab-button active":"tab-button",onClick:()=>r("training"),children:"Ausbildung"})]}),(n==="master"||u)&&a.jsxs("form",{className:"stack-form",onSubmit:v,children:[a.jsxs("label",{children:["Vorname",a.jsx("input",{value:d.first_name||"",onChange:f=>g({...d,first_name:f.target.value}),required:!0})]}),a.jsxs("label",{children:["Nachname",a.jsx("input",{value:d.last_name||"",onChange:f=>g({...d,last_name:f.target.value}),required:!0})]}),a.jsxs("label",{children:["Telefon",a.jsx("input",{value:d.phone||"",onChange:f=>g({...d,phone:f.target.value})})]}),a.jsxs("label",{children:["E-Mail",a.jsx("input",{type:"email",value:d.email||"",onChange:f=>g({...d,email:f.target.value})})]}),a.jsxs("label",{className:"checkbox-row",children:[a.jsx("input",{type:"checkbox",checked:!!d.needs_glasses,onChange:f=>g({...d,needs_glasses:f.target.checked?1:0})}),a.jsx("span",{children:"Benoetigt Brille beim Fahren"})]}),a.jsxs("label",{children:["Fuehrerscheinklasse",a.jsx("select",{value:d.template_id||"",onChange:f=>g({...d,template_id:f.target.value}),children:t.map(f=>a.jsx("option",{value:f.id,children:f.name},f.id))})]}),a.jsxs("label",{children:["Status",a.jsxs("select",{value:d.status||"active",onChange:f=>g({...d,status:f.target.value}),children:[a.jsx("option",{value:"active",children:"aktiv"}),a.jsx("option",{value:"inactive",children:"inaktiv"})]})]}),a.jsxs("label",{children:["Notiz",a.jsx("textarea",{rows:"5",value:d.notes||"",onChange:f=>g({...d,notes:f.target.value})})]}),a.jsxs("div",{className:"modal-actions",children:[!u&&o&&a.jsx("button",{type:"button",className:"danger-button",onClick:o,children:"Fahrschueler loeschen"}),a.jsx("button",{className:"primary-button",type:"submit",children:"Speichern"})]})]}),!u&&n==="training"&&a.jsxs("form",{className:"training-panel",onSubmit:D,children:[(e.progress||[]).length===0&&a.jsx("p",{className:"meta-line",children:"Noch keine Ausbildungsvorgaben hinterlegt."}),pa(h).map(f=>{const c=bc(f.rows);return a.jsxs("div",{className:"training-phase",children:[f.phase_label&&a.jsxs("div",{className:"phase-head",children:[a.jsx("strong",{children:f.phase_label}),a.jsx("span",{className:`phase-state ${c.status}`,children:Jr(c.open).text})]}),f.rows.map(p=>{const y=h.findIndex(C=>C.requirement_key===p.requirement_key),j=Number(p.required_units||0),M=Number(p.completed_units||0),S=Number(p.prior_completed_units||0),T=Number(p.appointment_completed_units||0),$=Number(p.planned_units||0),L=M+$,W=j>0?Math.min(100,Math.round(L/j*100)):100;return a.jsxs("div",{className:"training-row",children:[a.jsxs("div",{className:"training-row-head",children:[a.jsxs("div",{children:[a.jsx("strong",{children:p.label}),a.jsxs("p",{children:["Altbestand ",S," · Termine erledigt ",T," · Geplant ",$," · Soll ",j," · Offen ",p.open_units]})]}),a.jsxs("label",{className:"training-import-field",children:["Schon erledigt",a.jsx("input",{type:"number",min:"0",step:"1",value:p.prior_completed_units??0,onChange:C=>{const R=[...h];R[y]={...p,prior_completed_units:C.target.value},m(R)}})]})]}),a.jsx("div",{className:"training-meter","aria-label":`${W} Prozent`,children:a.jsx("span",{style:{width:`${W}%`}})})]},p.requirement_key)})]},f.phase_label||"default")}),(e.progress||[]).length>0&&a.jsx("div",{className:"modal-actions",children:a.jsx("button",{className:"primary-button",type:"submit",disabled:x,children:x?"Speichert ...":"Ausbildung speichern"})})]})]})}function qp({lessonTypes:e,templates:t,onSave:n,onDelete:r,onReorder:l,onSaveMatrix:i}){const[s,o]=F.useState(null),[u,d]=F.useState([]),[g,h]=F.useState(!1),[m,x]=F.useState(e),w=e.filter(c=>c.category==="student");F.useEffect(()=>{d(t.map(c=>({template_id:c.id,lesson_type_ids:c.lesson_type_ids||[]})))},[t]),F.useEffect(()=>{x(e)},[e]);function v(c,p){d(y=>y.map(j=>{if(j.template_id!==c)return j;const M=j.lesson_type_ids.includes(p);return{...j,lesson_type_ids:M?j.lesson_type_ids.filter(S=>S!==p):[...j.lesson_type_ids,p]}}))}function D(c,p){const y=[...m];if(c<0||p<0||c>=y.length||p>=y.length)return y;const[j]=y.splice(c,1);return y.splice(p,0,j),y}async function f(c){x(c),await l(c.map(p=>p.id))}return a.jsxs(a.Fragment,{children:[a.jsxs(a.Fragment,{children:[a.jsxs("section",{className:"list-panel",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Verwaltung"}),a.jsx("h2",{children:"Stundenarten"}),a.jsx("p",{className:"meta-line",children:"Mit Hoch-/Runter-Knoepfen umsortieren. Farben, Dauer und Kategorie gelten mandantenweit."})]}),a.jsx("button",{className:"primary-button",onClick:()=>o({name:"",color:"#0E5D80",default_duration:45,category:"student",requirement_key:"",is_billable:1,is_counted:1,is_rest_relevant:1,fixed_duration:0,sort_order:m.length+1,system_key:""}),children:"Neu"})]}),a.jsx("div",{className:"entity-list lesson-type-list",children:m.map((c,p)=>a.jsxs("div",{className:"entity-item lesson-type-row",children:[a.jsxs("div",{className:"lesson-type-actions",children:[a.jsx("button",{type:"button",className:"ghost-button compact reorder-button",disabled:p===0,onClick:async y=>{y.stopPropagation(),await f(D(p,p-1))},children:"Hoch"}),a.jsx("button",{type:"button",className:"ghost-button compact reorder-button",disabled:p===m.length-1,onClick:async y=>{y.stopPropagation(),await f(D(p,p+1))},children:"Runter"})]}),a.jsx("span",{className:"color-dot",style:{"--dot-color":c.color||"#67625a"}}),a.jsxs("span",{className:"lesson-type-main",children:[a.jsx("strong",{children:c.name}),a.jsxs("span",{className:"meta-line",children:[c.default_duration," min · ",Yc(c.category)]})]}),a.jsx("button",{type:"button",className:"ghost-button compact",onClick:()=>o(c),children:"Bearbeiten"})]},c.id))})]}),s&&a.jsx(Hl,{title:"Stundenart",initial:s,onClose:()=>o(null),onSubmit:async c=>{c.category=c.category||s.category,c.default_duration=Number(c.default_duration),c.sort_order=Number(c.sort_order),await n(c,s.id),o(null)},onDelete:s.id&&s.system_key!=="private_block"?async()=>{window.confirm(`Stundenart "${s.name}" wirklich loeschen?`)&&(await r(s.id),o(null))}:null,fields:[{name:"name",label:"Bezeichnung"},{name:"color",label:"Farbe",type:"color"},{name:"default_duration",label:"Dauer in Minuten",type:"number"},{name:"category",label:"Kategorie",type:"select",disabled:s.system_key==="private_block",options:[{value:"student",label:"Fahrschueler"},{value:"private",label:"Privat"},{value:"work",label:"Sonstige Arbeiten"},{value:"theory",label:"Theorie"},{value:"blocked",label:"Sperre"}]},{name:"requirement_key",label:"Pflichtbaustein-Key"},{name:"sort_order",label:"Sortierung",type:"number"},{name:"is_billable",label:"Abrechenbar",type:"checkbox"},{name:"is_counted",label:"Zaehlt fuer Pflichtstunden",type:"checkbox"},{name:"is_rest_relevant",label:"Ruhezeit-relevant",type:"checkbox"},{name:"fixed_duration",label:"Feste Dauer",type:"checkbox"}]})]}),w.length>0&&t.length>0&&a.jsxs("section",{className:"list-panel",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Sichtbarkeit"}),a.jsx("h2",{children:"Klassenmatrix"}),a.jsx("p",{className:"meta-line",children:"Fuehrerscheinklassen stehen vertikal, schuelerbezogene Stundenarten horizontal."})]}),a.jsx("button",{className:"primary-button",onClick:async()=>{h(!0);try{await i(u)}finally{h(!1)}},disabled:g,children:g?"Speichert ...":"Matrix speichern"})]}),a.jsx("div",{className:"visibility-matrix-wrap",children:a.jsxs("table",{className:"visibility-matrix",children:[a.jsx("thead",{children:a.jsxs("tr",{children:[a.jsx("th",{children:"Fuehrerscheinklasse"}),w.map(c=>a.jsx("th",{children:c.name},c.id))]})}),a.jsx("tbody",{children:t.map(c=>{const p=u.find(y=>y.template_id===c.id)||{lesson_type_ids:[]};return a.jsxs("tr",{children:[a.jsx("th",{children:c.name}),w.map(y=>a.jsx("td",{children:a.jsx("input",{type:"checkbox",checked:p.lesson_type_ids.includes(y.id),onChange:()=>v(c.id,y.id)})},y.id))]},c.id)})})]})})]})]})}function Yp({instructors:e,onSave:t}){const[n,r]=F.useState(null);return a.jsx(Vl,{title:"Fahrlehrer",subtitle:"Mehrere Ressourcen werden direkt im Kalender abgebildet.",items:e,columns:l=>`${l.first_name} ${l.last_name} · ${l.is_active?"aktiv":"inaktiv"} · Anfahrt ${Number(l.pre_start_buffer_minutes||0)} min`,onEdit:l=>r(l),onCreate:()=>r({first_name:"",last_name:"",color:"#0E5D80",notes:"",is_active:1,pre_start_buffer_minutes:0}),form:n&&a.jsx(Hl,{title:"Fahrlehrer",initial:n,onClose:()=>r(null),onSubmit:async l=>{await t(l,n.id),r(null)},fields:[{name:"first_name",label:"Vorname"},{name:"last_name",label:"Nachname"},{name:"color",label:"Farbe",type:"color"},{name:"pre_start_buffer_minutes",label:"Anfahrtszeit vor erstem Termin (Minuten)",type:"number"},{name:"notes",label:"Notiz",type:"textarea"},{name:"is_active",label:"Aktiv",type:"checkbox"}]})})}function Xp({templates:e,lessonTypes:t,onSave:n}){const[r,l]=F.useState(null);return a.jsx(Vl,{title:"Klassenvorlagen",subtitle:"Kombinationen wie C + CE sind eigene Vorlagen mit festen Sollwerten.",items:e,columns:i=>`${i.code} · ${Zr(i,t).map(s=>`${s.label}: ${s.required_units}`).join(", ")||"keine Pflichtstunden"}`,onEdit:i=>{const s=Bp(i);l({...s,requirements:Zr(s,t)})},onCreate:()=>l({code:"",name:"",is_combination:0,lesson_type_ids:t.filter(i=>i.category==="student").map(i=>i.id),requirements:Zr({lesson_type_ids:t.filter(i=>i.category==="student").map(i=>i.id),requirements:[]},t)}),form:r&&a.jsx(em,{template:r,setTemplate:l,lessonTypes:t,onClose:()=>l(null),onSubmit:async()=>{await n(r,r.id),l(null)}})})}function Gp({users:e,tenants:t,currentUser:n,onSave:r}){const[l,i]=F.useState(null);return a.jsx(Vl,{title:"Benutzer",subtitle:"Rollen und Zugriff werden serverseitig geprueft.",items:e,columns:s=>`${s.first_name} ${s.last_name} · ${s.role} · ${s.email}${s.tenant_name?` · ${s.tenant_name}`:""}`,onEdit:s=>i(s),onCreate:()=>{var s;return i({tenant_id:n.tenant_id||((s=t[0])==null?void 0:s.id)||"",role:"dispatcher",email:"",password:"",first_name:"",last_name:"",is_active:1})},form:l&&a.jsx(Hl,{title:"Benutzer",initial:l,onClose:()=>i(null),onSubmit:async s=>{await r(s,l.id),i(null)},fields:[...n.role==="superadmin"?[{name:"tenant_id",label:"Mandant",type:"select",options:t.map(s=>({value:s.id,label:s.name}))}]:[],{name:"role",label:"Rolle",type:"select",options:[{value:"tenant_admin",label:"Mandanten-Admin"},{value:"dispatcher",label:"Disponent"},{value:"instructor",label:"Fahrlehrer"},...n.role==="superadmin"?[{value:"superadmin",label:"Superadmin"}]:[]]},{name:"email",label:"E-Mail"},{name:"password",label:"Passwort"},{name:"first_name",label:"Vorname"},{name:"last_name",label:"Nachname"},{name:"is_active",label:"Aktiv",type:"checkbox"}]})})}function Zp({tenants:e,onSave:t}){const[n,r]=F.useState(null);return a.jsx(Vl,{title:"Mandanten",subtitle:"Superadmin-Verwaltung fuer Mandantenstatus und Zeitzone.",items:e,columns:l=>`${l.name} · ${l.timezone} · ${l.is_active?"aktiv":"inaktiv"}`,onEdit:l=>r(l),onCreate:()=>r({name:"",timezone:"Europe/Berlin",is_active:1}),form:n&&a.jsx(Hl,{title:"Mandant",initial:n,onClose:()=>r(null),onSubmit:async l=>{await t(l,n.id),r(null)},fields:[{name:"name",label:"Name"},{name:"timezone",label:"Zeitzone"},{name:"federal_state",label:"Bundesland",type:"select",options:Wc},{name:"location_label",label:"Ort / Filiale"},{name:"latitude",label:"Breitengrad",type:"number"},{name:"longitude",label:"Laengengrad",type:"number"},{name:"is_active",label:"Aktiv",type:"checkbox"}]})})}function Jp({tenant:e,onSave:t}){const[n,r]=F.useState(e),[l,i]=F.useState((e==null?void 0:e.location_label)||""),[s,o]=F.useState([]),[u,d]=F.useState(!1),[g,h]=F.useState("");F.useEffect(()=>{r(e),i((e==null?void 0:e.location_label)||""),o([]),h("")},[e]);const m=Number(n==null?void 0:n.latitude),x=Number(n==null?void 0:n.longitude),w=Number.isFinite(m)&&Number.isFinite(x),v=.025,D=w?`https://www.openstreetmap.org/export/embed.html?bbox=${x-v}%2C${m-v}%2C${x+v}%2C${m+v}&layer=mapnik&marker=${m}%2C${x}`:"";async function f(){const c=l.trim();if(!c){o([]),h("Bitte einen Ort oder eine Adresse eingeben.");return}d(!0),h("");try{const p=await fetch(`https://nominatim.openstreetmap.org/search?format=jsonv2&limit=5&q=${encodeURIComponent(c)}`);if(!p.ok)throw new Error(`Ortssuche fehlgeschlagen (${p.status})`);const y=await p.json();o(y),y.length||h("Kein passender Ort gefunden.")}catch(p){h(p.message),o([])}finally{d(!1)}}return a.jsxs("section",{className:"list-panel",children:[a.jsx("div",{className:"section-head",children:a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Fahrschule"}),a.jsx("h2",{children:"Standort und Zeit"}),a.jsx("p",{className:"meta-line",children:"Ort, Bundesland und Zeitzone steuern Sonnenzeiten, Feiertage und die Hell-Dunkel-Markierung im Kalender."})]})}),a.jsxs("form",{className:"stack-form",onSubmit:async c=>{c.preventDefault(),await t(n)},children:[a.jsxs("label",{children:["Name",a.jsx("input",{value:n.name||"",onChange:c=>r({...n,name:c.target.value})})]}),a.jsxs("label",{children:["Zeitzone",a.jsx("input",{value:n.timezone||"",onChange:c=>r({...n,timezone:c.target.value})})]}),a.jsxs("label",{children:["Bundesland",a.jsx("select",{value:n.federal_state||"BE",onChange:c=>r({...n,federal_state:c.target.value}),children:Wc.map(c=>a.jsx("option",{value:c.value,children:c.label},c.value))})]}),a.jsxs("label",{children:["Ort / Filiale",a.jsxs("div",{className:"location-search",children:[a.jsx("input",{value:l,onChange:c=>{const p=c.target.value;i(p),r({...n,location_label:p})},placeholder:"z. B. Duisburg, Bahnhofstrasse 12"}),a.jsx("button",{type:"button",className:"ghost-button",onClick:f,disabled:u,children:u?"Suche...":"Ort suchen"})]})]}),g&&a.jsx("p",{className:"form-error",children:g}),s.length>0&&a.jsx("div",{className:"location-result-list",children:s.map(c=>a.jsxs("button",{type:"button",className:"location-result",onClick:()=>{r({...n,location_label:c.display_name,latitude:Number(c.lat),longitude:Number(c.lon)}),i(c.display_name),o([]),h("")},children:[a.jsx("strong",{children:c.display_name}),a.jsxs("span",{children:[Number(c.lat).toFixed(6)," / ",Number(c.lon).toFixed(6)]})]},`${c.place_id}-${c.lat}-${c.lon}`))}),a.jsxs("div",{className:"coordinate-grid",children:[a.jsxs("label",{children:["Breitengrad",a.jsx("input",{type:"number",step:"0.000001",value:n.latitude??"",onChange:c=>r({...n,latitude:c.target.value})})]}),a.jsxs("label",{children:["Laengengrad",a.jsx("input",{type:"number",step:"0.000001",value:n.longitude??"",onChange:c=>r({...n,longitude:c.target.value})})]})]}),w&&a.jsxs("div",{className:"map-preview",children:[a.jsx("iframe",{title:"Standortkarte",src:D,loading:"lazy",referrerPolicy:"no-referrer-when-downgrade"}),a.jsx("p",{className:"meta-line",children:"Karte zeigt den derzeit gespeicherten Standort."})]}),a.jsxs("div",{className:"location-hint",children:[a.jsx("strong",{children:"Hinweis"}),a.jsx("span",{children:"Feiertage richten sich nach dem Bundesland. Sonnenaufgang und Sonnenuntergang richten sich nach dem gespeicherten Standort."})]}),a.jsx("button",{className:"primary-button",type:"submit",children:"Speichern"})]})]})}function Vl({title:e,subtitle:t,items:n,columns:r,onEdit:l,onCreate:i,form:s}){return a.jsxs(a.Fragment,{children:[a.jsxs("section",{className:"list-panel",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Verwaltung"}),a.jsx("h2",{children:e}),a.jsx("p",{className:"meta-line",children:t})]}),a.jsx("button",{className:"primary-button",onClick:i,children:"Neu"})]}),a.jsx("div",{className:"entity-list",children:n.map(o=>a.jsx("button",{className:"entity-item",onClick:()=>l(o),children:r(o)},o.id))})]}),s]})}function Hl({title:e,initial:t,fields:n,onSubmit:r,onClose:l,onDelete:i=null}){async function s(o){o.preventDefault();const u=new FormData(o.currentTarget),d=Object.fromEntries(u.entries());for(const g of n)g.type==="checkbox"&&(d[g.name]=u.get(g.name)?1:0);await r(d)}return a.jsx("div",{className:"modal-shell",children:a.jsxs("form",{className:"modal-card stack-form",onSubmit:s,children:[a.jsxs("div",{className:"section-head",children:[a.jsx("h2",{children:e}),a.jsx("button",{type:"button",className:"ghost-button",onClick:l,children:"Schliessen"})]}),n.map(o=>a.jsxs("label",{children:[o.label,o.type==="textarea"?a.jsx("textarea",{name:o.name,defaultValue:t[o.name]||"",rows:"4",disabled:o.disabled}):o.type==="select"?a.jsx("select",{name:o.name,defaultValue:String(t[o.name]??""),disabled:o.disabled,children:o.options.map(u=>a.jsx("option",{value:u.value,children:u.label},u.value))}):o.type==="checkbox"?a.jsx("input",{name:o.name,type:"checkbox",defaultChecked:!!t[o.name],disabled:o.disabled}):a.jsx("input",{name:o.name,type:o.type||"text",defaultValue:t[o.name]||"",disabled:o.disabled})]},o.name)),a.jsxs("div",{className:"modal-actions",children:[i&&a.jsx("button",{type:"button",className:"danger-button",onClick:i,children:"Loeschen"}),a.jsx("button",{className:"primary-button",type:"submit",children:"Speichern"})]})]})})}function em({template:e,setTemplate:t,lessonTypes:n,onClose:r,onSubmit:l}){function i(s){const o={...e,is_combination:s?1:0};t({...o,requirements:Zr(o,n)})}return a.jsx("div",{className:"modal-shell",children:a.jsxs("form",{className:"modal-card stack-form",onSubmit:s=>{s.preventDefault(),l()},children:[a.jsxs("div",{className:"section-head",children:[a.jsx("h2",{children:"Klassenvorlage"}),a.jsx("button",{type:"button",className:"ghost-button",onClick:r,children:"Schliessen"})]}),a.jsxs("label",{children:["Code",a.jsx("input",{value:e.code,onChange:s=>t({...e,code:s.target.value})})]}),a.jsxs("label",{children:["Name",a.jsx("input",{value:e.name,onChange:s=>t({...e,name:s.target.value})})]}),a.jsxs("label",{children:["Kombination",a.jsx("input",{type:"checkbox",checked:!!e.is_combination,onChange:s=>i(s.target.checked)})]}),pa(e.requirements).map(s=>a.jsxs("div",{className:"requirement-phase",children:[s.phase_label&&a.jsx("h3",{children:s.phase_label}),a.jsx("div",{className:"requirements-grid",children:s.rows.map(o=>{const u=e.requirements.findIndex(d=>d.requirement_key===o.requirement_key);return a.jsxs("div",{className:"requirement-editor",children:[a.jsxs("strong",{className:"requirement-title",children:[a.jsx("span",{className:"color-dot",style:{"--dot-color":o.color||"#67625a"}}),o.label]}),a.jsx("input",{type:"number",min:"0",value:o.required_units,onChange:d=>{const g=[...e.requirements];g[u]={...g[u],required_units:Number(d.target.value)},t({...e,requirements:g})}})]},o.requirement_key)})})]},s.phase_label||"default")),a.jsx("button",{className:"primary-button",type:"submit",children:"Speichern"})]})})}function Nl({label:e,value:t,onChange:n}){const[r,l]=F.useState(!1),[i,s]=F.useState("hour"),o=Number((t||"00:00").split(":")[0]||0),u=Number((t||"00:00").split(":")[1]||0);F.useEffect(()=>{r&&s("hour")},[r]);const d=Array.from({length:12},(v,D)=>D),g=Array.from({length:12},(v,D)=>D+12),h=Array.from({length:12},(v,D)=>D*5);function m(v,D){const f=v/12*Math.PI*2-Math.PI/2,c=Math.cos(f)*D,p=Math.sin(f)*D;return{left:`calc(50% + ${c}px)`,top:`calc(50% + ${p}px)`}}function x(v){n(`${String(v).padStart(2,"0")}:${String(u).padStart(2,"0")}`),s("minute")}function w(v){n(`${String(o).padStart(2,"0")}:${String(v).padStart(2,"0")}`),l(!1)}return a.jsxs("div",{className:"time-dial-field",children:[a.jsxs("button",{type:"button",className:"time-dial-button",onClick:()=>l(v=>!v),children:[a.jsx("span",{children:e}),a.jsx("strong",{children:t})]}),r&&a.jsxs("div",{className:"time-dial-popover",children:[a.jsxs("div",{className:"time-dial-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Uhrzeit"}),a.jsx("strong",{children:t})]}),a.jsx("button",{type:"button",className:"ghost-button compact",onClick:()=>l(!1),children:"Schliessen"})]}),a.jsxs("div",{className:"mode-switch",children:[a.jsx("button",{type:"button",className:i==="hour"?"tab-button active compact":"tab-button compact",onClick:()=>s("hour"),children:"Stunde"}),a.jsx("button",{type:"button",className:i==="minute"?"tab-button active compact":"tab-button compact",onClick:()=>s("minute"),children:"Minute"})]}),a.jsxs("div",{className:"time-dial-face",children:[a.jsx("div",{className:"time-dial-center",children:i==="hour"?String(o).padStart(2,"0"):String(u).padStart(2,"0")}),i==="hour"?a.jsxs(a.Fragment,{children:[g.map((v,D)=>a.jsx("button",{type:"button",className:["time-dial-point","outer-ring",v===o?"active":""].filter(Boolean).join(" "),style:m(D,112),onClick:()=>x(v),children:String(v).padStart(2,"0")},`outer-${v}`)),d.map((v,D)=>a.jsx("button",{type:"button",className:["time-dial-point","inner-ring",v===o?"active":""].filter(Boolean).join(" "),style:m(D,72),onClick:()=>x(v),children:String(v).padStart(2,"0")},`inner-${v}`))]}):h.map((v,D)=>a.jsx("button",{type:"button",className:["time-dial-point",v===u?"active":""].filter(Boolean).join(" "),style:m(D,108),onClick:()=>w(v),children:String(v).padStart(2,"0")},`${i}-${v}`))]}),a.jsxs("label",{className:"stack-form",children:["Direkt eingeben",a.jsx("input",{type:"time",step:"300",value:t,onChange:v=>n(v.target.value)})]})]})]})}function tm({draft:e,setDraft:t,lessonTypes:n,instructors:r,students:l,templates:i,onPickStudent:s,onSubmit:o,onDelete:u,onClose:d,isEditing:g}){const h=Up(n,e.student_id,l),m=n.find(N=>Number(N.id)===Number(e.lesson_type_id)),x=h.some(N=>Number(N.id)===Number(e.lesson_type_id))?h:m?[m,...h]:h,w=l.find(N=>Number(N.id)===Number(e.student_id)),v=i.find(N=>Number(N.id)===Number(w==null?void 0:w.template_id)),D=r.find(N=>Number(N.id)===Number(e.instructor_id)),f=v&&Number(v.is_combination)?Kc(v):[],c=ys(m,e.start_at,e.end_at),p=Si(e.start_at),y=Br(e.start_at),j=Br(e.end_at),M=Rp(w,D,e.start_at,e.end_at),S=Fp(w==null?void 0:w.phone),T=S&&M?`https://wa.me/${S}?text=${encodeURIComponent(M)}`:"",$=S&&M?`sms:${S}?body=${encodeURIComponent(M)}`:"",L=w!=null&&w.email&&M?`mailto:${encodeURIComponent(w.email)}?subject=${encodeURIComponent("Fahrstunde")}&body=${encodeURIComponent(M)}`:"";F.useEffect(()=>{x.length&&(x.some(N=>Number(N.id)===Number(e.lesson_type_id))||t(N=>({...N,lesson_type_id:x[0].id})))},[e.lesson_type_id,x,t]),F.useEffect(()=>{e.end_at&&Ul(e.start_at,e.end_at)>0||t(N=>({...N,end_at:_i(N.start_at,Math.max(1,Number((m==null?void 0:m.default_duration)||45)))}))},[m==null?void 0:m.default_duration,e.end_at,e.start_at,t]);function W(N){N&&t(V=>({...V,start_at:jt(N,Br(V.start_at)),end_at:jt(N,Br(V.end_at))}))}function C(N){t(V=>{const J=jt(Si(V.start_at),N);return{...V,start_at:J,end_at:_i(J,ys(m,V.start_at,V.end_at).duration)}})}function R(N){t(V=>({...V,end_at:jt(Si(V.start_at),N)}))}function A(N){const V=Number((m==null?void 0:m.fixed_duration)||0)===1?Math.max(1,Number((m==null?void 0:m.default_duration)||45)):Math.max(1,Number((m==null?void 0:m.default_duration)||45))*N;t(J=>({...J,units:N,end_at:_i(J.start_at,V)}))}return a.jsx("div",{className:"modal-shell",children:a.jsxs("form",{className:"modal-card stack-form",onSubmit:o,children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Termin"}),a.jsx("h2",{children:g?"Termin bearbeiten":"Termin einplanen"})]}),a.jsx("button",{type:"button",className:"ghost-button",onClick:d,children:"Schliessen"})]}),a.jsxs("label",{children:["Fahrschueler",a.jsxs("select",{name:"student_id",value:e.student_id,onChange:N=>t({...e,student_id:N.target.value}),children:[a.jsx("option",{value:"",children:"Kein Fahrschueler"}),l.map(N=>a.jsxs("option",{value:N.id,children:[N.first_name," ",N.last_name]},N.id))]})]}),a.jsxs("label",{children:["Stundenart",a.jsx("select",{name:"lesson_type_id",value:e.lesson_type_id,onChange:N=>t({...e,lesson_type_id:N.target.value}),children:x.map(N=>a.jsx("option",{value:N.id,children:N.name},N.id))})]}),f.length>0&&a.jsxs("label",{children:["Ausbildungsteil",a.jsx("select",{name:"requirement_phase",value:e.requirement_phase||f[0],onChange:N=>t({...e,requirement_phase:N.target.value}),children:f.map(N=>a.jsx("option",{value:N,children:N},N))})]}),a.jsxs("label",{children:["Fahrlehrer",a.jsx("select",{name:"instructor_id",value:e.instructor_id,onChange:N=>t({...e,instructor_id:N.target.value}),children:r.map(N=>a.jsxs("option",{value:N.id,children:[N.first_name," ",N.last_name]},N.id))})]}),a.jsxs("div",{className:"time-editor-grid",children:[a.jsxs("label",{children:["Datum",a.jsx("input",{type:"date",value:p,onChange:N=>W(N.target.value)})]}),a.jsxs("div",{className:"stack-form",children:[a.jsx("span",{children:"Startzeit"}),a.jsx(Nl,{label:"Start",value:y,onChange:C})]}),a.jsxs("div",{className:"stack-form",children:[a.jsx("span",{children:"Endzeit"}),a.jsx(Nl,{label:"Ende",value:j,onChange:R})]})]}),a.jsxs("div",{className:"duration-preset-panel",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Dauer"}),a.jsx("h2",{children:"Fahrstunden"})]}),a.jsxs("span",{className:"badge",children:[c.duration," min · ",c.units," FS"]})]}),a.jsxs("div",{className:"duration-preset-row",children:[[1,2,3,4].map(N=>a.jsxs("button",{type:"button",className:c.units===N?"tab-button active compact":"tab-button compact",onClick:()=>A(N),children:[N," FS"]},N)),Number((m==null?void 0:m.fixed_duration)||0)===1&&a.jsxs("button",{type:"button",className:"ghost-button compact",onClick:()=>A(1),children:["Standard ",m==null?void 0:m.default_duration," min"]})]}),a.jsx("p",{className:"hint-line",children:"Start und Ende lassen sich direkt ueber die Uhr setzen. Die angerechneten Fahrstunden werden daraus automatisch berechnet."})]}),a.jsxs("div",{className:"share-panel",children:[a.jsx("div",{className:"section-head",children:a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Benachrichtigung"}),a.jsx("h2",{children:"Termin teilen"})]})}),a.jsxs("div",{className:"share-actions",children:[a.jsxs("a",{className:T?"share-button":"share-button disabled",href:T||void 0,target:"_blank",rel:"noreferrer","aria-disabled":!T,onClick:N=>{T||N.preventDefault()},children:[a.jsx("span",{className:"share-badge whatsapp",children:"WA"}),"WhatsApp"]}),a.jsxs("a",{className:$?"share-button":"share-button disabled",href:$||void 0,"aria-disabled":!$,onClick:N=>{$||N.preventDefault()},children:[a.jsx("span",{className:"share-badge sms",children:"SMS"}),"SMS"]}),a.jsxs("a",{className:L?"share-button":"share-button disabled",href:L||void 0,"aria-disabled":!L,onClick:N=>{L||N.preventDefault()},children:[a.jsx("span",{className:"share-badge email",children:"@"}),"E-Mail"]})]}),a.jsx("p",{className:"hint-line",children:w?"Die Nachricht wird mit Datum, Start- und Endzeit vorbefuellt.":"Fahrschueler waehlen, damit Kontakt-Buttons aktiv werden."})]}),a.jsxs("label",{children:["Status",a.jsxs("select",{name:"status",value:e.status,onChange:N=>t({...e,status:N.target.value}),children:[a.jsx("option",{value:"planned",children:"geplant"}),a.jsx("option",{value:"completed",children:"erledigt"}),a.jsx("option",{value:"cancelled",children:"abgesagt"})]})]}),a.jsxs("label",{children:["Notiz",a.jsx("textarea",{name:"notes",rows:"4",value:e.notes,onChange:N=>t({...e,notes:N.target.value})})]}),a.jsxs("div",{className:"modal-actions",children:[g&&a.jsx("button",{type:"button",className:"danger-button",onClick:u,children:"Termin loeschen"}),a.jsx("button",{type:"button",className:"ghost-button",onClick:()=>s==null?void 0:s(e.student_id),disabled:!e.student_id,children:"Fahrschueler waehlen"}),a.jsx("button",{className:"primary-button",type:"submit",children:"Speichern"})]})]})})}ki.createRoot(document.getElementById("root")).render(a.jsx(md.StrictMode,{children:a.jsx(Vp,{})})); +Trotzdem speichern?`)&&(ke.warning_acknowledged=!0,f?await ye.patch(`https://api.fahrschultermin.de/api/v1/appointments/${f}`,ke):await ye.post("https://api.fahrschultermin.dehttps://api.fahrschultermin.de/api/v1/appointments",ke),D(null),c(null),await $(t.user,S.start,S.end)):y(Me.message)}}async function Ql(){f&&window.confirm("Termin wirklich loeschen?")&&(await ye.delete(`https://api.fahrschultermin.de/api/v1/appointments/${f}`),D(null),c(null),await $(t.user,S.start,S.end))}function wr({lessonTypeId:E,day:B,hour:me,minute:ke=0,instructorId:Me,appointment:he=null,startAt:Kl=null,endAt:ma=null}){var va,ga;if(he){c(he.id),D({student_id:he.student_id||"",lesson_type_id:he.lesson_type_id,instructor_id:he.instructor_id,start_at:Un(new Date(he.start_at)),end_at:Un(new Date(he.end_at)),units:he.units,notes:he.notes||"",status:he.status,requirement_phase:(he.counted_requirement_key||"").includes("::")?he.counted_requirement_key.split("::")[0]:""});return}const bl=Kl?new Date(Kl):new Date(B);Kl||bl.setHours(me,ke,0,0);const ha=E||((va=W[0])==null?void 0:va.id)||"",ql=W.find(Gc=>Number(Gc.id)===Number(ha)),Xc=ma?new Date(ma):new Date(bl.getTime()+Math.max(1,Number((ql==null?void 0:ql.default_duration)||45))*60*1e3);c(null),D({student_id:x==="student"&&h||"",lesson_type_id:ha,instructor_id:Me||((ga=C[0])==null?void 0:ga.id)||"",start_at:Un(bl),end_at:Un(Xc),units:1,notes:"",status:"planned",requirement_phase:""})}return i?a.jsx("div",{className:"app-shell",children:a.jsx("div",{className:"loading-panel",children:"Lade Anwendung ..."})}):t.user?a.jsxs("div",{className:"app-shell",children:[a.jsxs("header",{className:"topbar",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Fahrschul-Kalender"}),a.jsx("h1",{children:"DriveTime Planner"}),a.jsx("p",{className:"meta-line",children:t.user.role==="superadmin"?"Systemweit":`${(_=r==null?void 0:r.tenant)==null?void 0:_.name} · ${(b=r==null?void 0:r.tenant)==null?void 0:b.timezone}`})]}),a.jsxs("div",{className:"topbar-actions",children:[a.jsxs("span",{className:"badge",children:[t.user.first_name," ",t.user.last_name]}),a.jsx("button",{className:"ghost-button",onClick:()=>M(E=>E==="dark"?"light":"dark"),children:j==="dark"?"Hell":"Dunkel"}),a.jsx("button",{className:"ghost-button",onClick:Y,children:"Logout"})]})]}),p&&a.jsx("div",{className:"flash-error",children:p}),a.jsx("nav",{className:"tab-strip",children:Q.map(E=>a.jsx("button",{className:E.id===o?"tab-button active":"tab-button",onClick:()=>u(E.id),children:E.label},E.id))}),a.jsxs("main",{className:"content-grid",children:[o==="calendar"&&t.user.role!=="superadmin"&&a.jsx(Wp,{isMobile:e,weekStart:d,setWeekStart:g,range:S,instructors:C,students:L,lessonTypes:W,appointments:V,nextAppointment:J,sunTimes:P,dayMeta:O,selectedStudent:I,selectedStudentId:h,setSelectedStudentId:m,plannerMode:x,setPlannerMode:w,progress:I?q[I.id]||[]:[],onCreate:wr}),o==="students"&&t.user.role!=="superadmin"&&a.jsx(bp,{students:L,templates:R,onSave:(E,B)=>Fe("https://api.fahrschultermin.dehttps://api.fahrschultermin.de/api/v1/students",E,B),onSaveTraining:vt,onDelete:E=>_e("https://api.fahrschultermin.dehttps://api.fahrschultermin.de/api/v1/students",E)}),o==="lesson-types"&&t.user.role!=="superadmin"&&a.jsx(qp,{lessonTypes:W,templates:R,onSave:(E,B)=>Fe("https://api.fahrschultermin.dehttps://api.fahrschultermin.de/api/v1/lesson-types",E,B),onDelete:E=>_e("https://api.fahrschultermin.dehttps://api.fahrschultermin.de/api/v1/lesson-types",E),onReorder:async E=>{await ye.post("https://api.fahrschultermin.dehttps://api.fahrschultermin.de/api/v1/lesson-types/reorder",{lesson_type_ids:E}),await $(t.user,S.start,S.end)},onSaveMatrix:async E=>{await ye.post("https://api.fahrschultermin.dehttps://api.fahrschultermin.de/api/v1/lesson-types/visibility",{rows:E}),await $(t.user,S.start,S.end)}}),o==="templates"&&t.user.role!=="superadmin"&&a.jsx(Xp,{templates:R,lessonTypes:W,onSave:(E,B)=>Fe("https://api.fahrschultermin.dehttps://api.fahrschultermin.de/api/v1/license-class-templates",E,B)}),o==="instructors"&&t.user.role!=="superadmin"&&a.jsx(Yp,{instructors:C,onSave:(E,B)=>Fe("https://api.fahrschultermin.dehttps://api.fahrschultermin.de/api/v1/instructors",E,B)}),o==="users"&&a.jsx(Gp,{users:A,tenants:N,currentUser:t.user,onSave:(E,B)=>Fe("https://api.fahrschultermin.dehttps://api.fahrschultermin.de/api/v1/users",E,B)}),o==="tenant-profile"&&t.user.role==="tenant_admin"&&(r==null?void 0:r.tenant)&&a.jsx(Jp,{tenant:r.tenant,onSave:async E=>{await ye.patch("https://api.fahrschultermin.dehttps://api.fahrschultermin.de/api/v1/tenant/profile",E),await $(t.user,S.start,S.end)}}),o==="tenants"&&t.user.role==="superadmin"&&a.jsx(Zp,{tenants:N,onSave:(E,B)=>Fe("https://api.fahrschultermin.dehttps://api.fahrschultermin.de/api/v1/tenants",E,B)})]}),v&&a.jsx(tm,{draft:v,setDraft:D,lessonTypes:W,instructors:C,students:L,templates:R,onPickStudent:E=>{E&&(m(Number(E)),w("student"),D(null),c(null))},onSubmit:Wl,onDelete:Ql,onClose:()=>{D(null),c(null)},isEditing:!!f})]}):a.jsx(Hp,{onSubmit:it,error:p})}function Hp({onSubmit:e,error:t}){async function n(r){r.preventDefault();const l=new FormData(r.currentTarget);await e({email:l.get("email"),password:l.get("password")})}return a.jsx("div",{className:"login-shell",children:a.jsxs("div",{className:"login-card",children:[a.jsx("p",{className:"eyebrow",children:"Mandantenfaehig · Kalenderfokus"}),a.jsx("h1",{children:"Dispositionsfenster"}),a.jsx("p",{className:"login-copy",children:"Planung fuer Fahrstunden, Vorlagen und Ruhezeitwarnungen in einer kompakten Leitstelle."}),a.jsxs("form",{onSubmit:n,className:"stack-form",children:[a.jsxs("label",{children:["E-Mail",a.jsx("input",{name:"email",type:"email",defaultValue:"admin@nordring.test",required:!0})]}),a.jsxs("label",{children:["Passwort",a.jsx("input",{name:"password",type:"password",defaultValue:"secret123",required:!0})]}),t&&a.jsx("div",{className:"inline-error",children:t}),a.jsx("button",{className:"primary-button",type:"submit",children:"Einloggen"})]}),a.jsx("p",{className:"hint-line",children:"Demo: `admin@nordring.test` / `secret123` oder `superadmin@example.com` / `secret123`"})]})})}function Wp(e){var wr;const{isMobile:t,weekStart:n,setWeekStart:r,range:l,instructors:i,students:s,lessonTypes:o,appointments:u,nextAppointment:d,sunTimes:g,dayMeta:h,selectedStudent:m,selectedStudentId:x,setSelectedStudentId:w,plannerMode:v,setPlannerMode:D,progress:f,onCreate:c}=e,p=t?[new Date]:l.days,[y,j]=F.useState(()=>new Date),[M,S]=F.useState(""),[T,$]=F.useState(!1),[L,W]=F.useState(null),[C,R]=F.useState(((wr=i[0])==null?void 0:wr.id)||null),[A,N]=F.useState(()=>xe(new Date)),[V,J]=F.useState("08:00"),[P,O]=F.useState("10:00"),I=[{id:"student",label:"Fahrschueler"},{id:"private",label:"Privat"},{id:"work",label:"Sonstige Arbeiten"},{id:"theory",label:"Theorie"}],q=Array.from({length:96},(_,b)=>{const E=Math.floor(b/4),B=b%4*15;return{hour:E,minute:B,label:`${String(E).padStart(2,"0")}:${String(B).padStart(2,"0")}`,rowClass:B===0?"full-hour":""}}),Q=o.filter(_=>v==="student"?_.category==="student"&&qc(_,m==null?void 0:m.template_id):v==="private"?_.category==="private":v==="work"?_.category==="work"||_.category==="other"||_.category==="blocked":v==="theory"?_.category==="theory":!1),it=s.filter(_=>`${_.first_name} ${_.last_name} ${_.template_code}`.toLowerCase().includes(M.toLowerCase())).slice(0,8);F.useEffect(()=>{const _=window.setInterval(()=>{j(new Date)},6e4);return()=>window.clearInterval(_)},[]),F.useEffect(()=>{m&&S(`${m.first_name} ${m.last_name}`)},[x,m]),F.useEffect(()=>{if(!i.length){R(null);return}i.some(_=>_.id===C)||R(i[0].id)},[i,C]),F.useEffect(()=>{if(Q.length===0){W(null);return}Q.some(_=>_.id===L)||W(Q[0].id)},[L,Q]);const Y=i.find(_=>_.id===C)||i[0]||null;Q.find(_=>_.id===L);const Fe=A&&Ul(jt(A,V),jt(A,P))>0,_e=Y?u.filter(_=>_.instructor_id===Y.id):[],vt=Math.max(0,Number((Y==null?void 0:Y.pre_start_buffer_minutes)||0)),Wl=Array.from(_e.filter(_=>Number(_.is_rest_relevant)===1).reduce((_,b)=>{const E=new Date(b.end_at),B=`${E.getFullYear()}-${String(E.getMonth()+1).padStart(2,"0")}-${String(E.getDate()).padStart(2,"0")}`,me=_.get(B);return(!me||E>me.endAt)&&_.set(B,{endAt:E}),_},new Map).values()).map(({endAt:_})=>{const b=_,E=new Date(_.getTime()+11*60*60*1e3),B=_e.some(me=>{const ke=new Date(me.start_at);return ke>b&&ke_.start-b.start);function Ql(){!L||!(Y!=null&&Y.id)||!Fe||c({lessonTypeId:L,instructorId:Y.id,startAt:jt(A,V),endAt:jt(A,P)})}return a.jsxs(a.Fragment,{children:[a.jsxs("section",{className:"calendar-stage",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Einsatzfenster"}),a.jsxs("h2",{children:[_t(l.start)," - ",_t(Gn(l.end,-1))]})]}),a.jsxs("div",{className:"toolbar",children:[a.jsxs("label",{className:"calendar-filter",children:["Fahrlehrer",a.jsx("select",{value:C||"",onChange:_=>R(Number(_.target.value)),children:i.map(_=>a.jsxs("option",{value:_.id,children:[_.first_name," ",_.last_name]},_.id))})]}),a.jsx("button",{className:"ghost-button",onClick:()=>r(Gn(n,-7)),children:"Zurueck"}),a.jsx("button",{className:"ghost-button",onClick:()=>r(vs()),children:"Heute"}),d&&a.jsx("button",{className:"ghost-button",onClick:()=>r(vs(new Date(d.start_at))),children:"Naechster Termin"}),a.jsx("button",{className:"ghost-button",onClick:()=>r(Gn(n,7)),children:"Weiter"})]})]}),a.jsxs("div",{className:"calendar-grid",children:[a.jsx("div",{className:"calendar-head time-col",children:"Zeit"}),p.map(_=>(()=>{var E,B,me,ke,Me;const b=Lp(_e,_);return a.jsxs("div",{className:["calendar-head day-col",Qc(_,y)?"past-head":"",(E=h[xe(_)])!=null&&E.holidayName?"holiday-head":"",(B=h[xe(_)])!=null&&B.isSunday?"sunday-head":""].filter(Boolean).join(" "),children:[a.jsx("strong",{children:_t(_)}),a.jsxs("div",{className:"day-summary",children:[a.jsxs("span",{className:"day-summary-line",children:[a.jsxs("strong",{children:[b.taughtUnits," UE"]}),a.jsx("span",{children:"geschult"})]}),a.jsxs("span",{className:"day-summary-line",children:[a.jsx("strong",{children:To(b.workSpanMinutes)}),a.jsx("span",{children:"Arbeitszeit"})]}),a.jsxs("span",{className:`day-summary-line break-line ${b.breakStatus}`,children:[a.jsx("strong",{children:To(b.breakMinutes)}),a.jsxs("span",{children:["(Pause ",b.requiredBreakMinutes," min)"]})]})]}),((me=h[xe(_)])==null?void 0:me.holidayName)&&a.jsx("span",{className:"holiday-meta",children:h[xe(_)].holidayName}),((ke=g[xe(_)])==null?void 0:ke.sunrise)&&((Me=g[xe(_)])==null?void 0:Me.sunset)&&a.jsxs("span",{className:"sun-meta",children:["Auf ",g[xe(_)].sunrise," · Unter ",g[xe(_)].sunset]})]},_.toISOString())})()),a.jsx("div",{className:"time-grid",children:q.map(_=>a.jsx("div",{className:`slot-label ${_.rowClass}`,children:_.label},_.label))}),p.map(_=>a.jsx(Qp,{day:_,slots:q,instructor:Y,appointments:_e,preStartBufferMinutes:vt,restIntervals:Wl,sunInfo:g[xe(_)]||null,dayMeta:h[xe(_)]||null,now:y,armedLessonTypeId:L,onCreate:c},_.toISOString()))]})]}),a.jsxs("aside",{className:"planner-panel",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Planung"}),a.jsx("h2",{children:"Bausteine"})]}),t&&a.jsx("button",{className:"primary-button compact",onClick:()=>c({day:new Date,hour:8,minute:0,instructorId:Y==null?void 0:Y.id}),children:"+"})]}),a.jsx("div",{className:"mode-switch",children:I.map(_=>a.jsx("button",{className:v===_.id?"tab-button active":"tab-button",onClick:()=>D(_.id),children:_.label},_.id))}),v==="student"&&a.jsxs("label",{className:"stack-form",children:["Fahrschueler",a.jsxs("div",{className:"autocomplete-shell",children:[a.jsx("input",{type:"text",value:M,placeholder:"Name eingeben ...",onFocus:()=>$(!0),onChange:_=>{S(_.target.value),$(!0)},onBlur:()=>{window.setTimeout(()=>$(!1),120)}}),T&&it.length>0&&a.jsx("div",{className:"autocomplete-list",children:it.map(_=>a.jsxs("button",{type:"button",className:"autocomplete-option",onMouseDown:b=>{b.preventDefault(),w(_.id),S(`${_.first_name} ${_.last_name}`),$(!1)},children:[a.jsxs("strong",{children:[_.first_name," ",_.last_name]}),a.jsx("span",{children:_.template_code})]},_.id))})]})]}),a.jsx("div",{className:"block-bank",children:Q.map(_=>a.jsxs("div",{className:L===_.id?"lesson-chip active":"lesson-chip",draggable:!t,onDragStart:b=>{const E=JSON.stringify({lessonTypeId:_.id});b.dataTransfer.effectAllowed="move",b.dataTransfer.setData("application/json",E),b.dataTransfer.setData("text/plain",E)},onClick:()=>{W(_.id),t&&c({day:new Date,hour:8,minute:0,lessonTypeId:_.id,instructorId:Y==null?void 0:Y.id})},style:{"--chip-color":_.color},children:[a.jsx("strong",{children:_.name}),a.jsx("span",{children:_.fixed_duration?`${_.default_duration} min fix`:`${_.default_duration} min pro Einheit`})]},_.id))}),v==="private"&&L&&a.jsxs("div",{className:"quick-plan-panel",children:[a.jsx("div",{className:"section-head compact-head",children:a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Privat"}),a.jsx("h2",{children:"Schnell eintragen"})]})}),a.jsxs("label",{className:"stack-form",children:["Datum",a.jsx("input",{type:"date",value:A,onChange:_=>N(_.target.value)})]}),a.jsxs("div",{className:"time-editor-grid two-col",children:[a.jsx(Nl,{label:"Start",value:V,onChange:J}),a.jsx(Nl,{label:"Ende",value:P,onChange:O})]}),a.jsx("button",{type:"button",className:"primary-button",onClick:Ql,disabled:!Fe,children:"Privatblock anlegen"})]}),m&&a.jsxs("div",{className:"progress-panel",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Reststunden"}),a.jsxs("h2",{children:[m.first_name," ",m.last_name]})]}),a.jsx("span",{className:"badge",children:m.template_code})]}),pa(f).map(_=>{const b=bc(_.rows);return a.jsxs("div",{className:"progress-phase",children:[_.phase_label&&a.jsxs("div",{className:"phase-head",children:[a.jsx("strong",{children:_.phase_label}),a.jsx("span",{className:`phase-state ${b.status}`,children:Jr(b.open).text})]}),_.rows.map(E=>a.jsxs("div",{className:"progress-row",children:[a.jsxs("div",{children:[a.jsx("strong",{children:E.label}),a.jsxs("p",{children:["Soll ",E.required_units," · Geplant ",E.planned_units," · Erledigt ",E.completed_units]})]}),a.jsx("div",{className:`open-pill ${Jr(E.open_units).className}`,children:Jr(E.open_units).text})]},E.requirement_key))]},_.phase_label||"default")})]})]})]})}function Qp({day:e,slots:t,instructor:n,appointments:r,preStartBufferMinutes:l,restIntervals:i,sunInfo:s,dayMeta:o,now:u,armedLessonTypeId:d,onCreate:g}){const h=new Date(e);h.setHours(0,0,0,0);const m=new Date(e);m.setHours(24,0,0,0);const x=Tp(e,u),w=Qc(e,u),v=u.getHours()*60+u.getMinutes(),D=Math.min(96,Math.max(0,v/15)),f=Math.min(96,Math.max(0,Math.ceil(D))),c=r.filter(C=>{const R=new Date(C.start_at),A=new Date(C.end_at);return Rh}),p=r.filter(C=>{const R=new Date(C.start_at);return R>=h&&Rnew Date(C.start_at)-new Date(R.start_at))[0]||null,y=(()=>{if(!p||l<=0)return null;const C=new Date(p.start_at),R=new Date(Math.max(h.getTime(),C.getTime()-l*60*1e3)),A=C;if(A<=R)return null;const N=R.getHours()*60+R.getMinutes(),V=A.getHours()*60+A.getMinutes(),J=Math.max(0,Math.floor(N/15)),P=Math.max(1,Math.ceil((V-N)/15));return{startIndex:J,spanBlocks:Math.min(P,96-J),label:`Anfahrt ${l} min`}})(),j=i.map(C=>{const R=C.start>h?C.start:h,A=C.end=m?24*60:A.getHours()*60+A.getMinutes(),J=Math.max(0,Math.floor(N/15)),P=Math.max(1,Math.ceil((V-N)/15));return{key:`${C.start.toISOString()}-${C.end.toISOString()}-${e.toISOString()}`,startIndex:J,spanBlocks:Math.min(P,96-J),label:`Ruhezeit bis ${String(C.end.getHours()).padStart(2,"0")}:${String(C.end.getMinutes()).padStart(2,"0")}`,hasConflict:C.hasConflict}}).filter(Boolean),M=Mo(s==null?void 0:s.sunrise),S=Mo(s==null?void 0:s.sunset),T=[];if(M!==null&&M>0&&T.push({key:`night-before-${xe(e)}`,startIndex:0,spanBlocks:Math.max(1,Math.ceil(M/15)),label:`Nacht bis ${s.sunrise}`,align:"end"}),S!==null&&S<24*60){const C=Math.max(0,Math.floor(S/15));T.push({key:`night-after-${xe(e)}`,startIndex:C,spanBlocks:Math.max(1,Math.ceil((24*60-S)/15)),label:`Dunkel ab ${s.sunset}`,align:"start"})}function $(C){g({day:e,hour:C.hour,minute:C.minute,instructorId:n==null?void 0:n.id,lessonTypeId:d||void 0})}function L(C,R){C.preventDefault();const A=C.dataTransfer.getData("application/json")||C.dataTransfer.getData("text/plain");if(!A)return;const N=JSON.parse(A);g({lessonTypeId:N.lessonTypeId,day:e,hour:R.hour,minute:R.minute,instructorId:n==null?void 0:n.id})}function W(C,R){const A=C.currentTarget.getBoundingClientRect(),N=Math.max(0,Math.min(A.height-1,C.clientY-A.top)),V=Math.floor(N/28),J=Math.min(95,R.startIndex+V);return t[J]}return a.jsxs("div",{className:["day-grid",w?"past-column":"",o!=null&&o.holidayName?"holiday-column":"",o!=null&&o.isSunday?"sunday-column":""].filter(Boolean).join(" "),children:[w&&a.jsx("div",{className:"day-past-overlay",style:{gridRow:"1 / span 96"}}),x&&f>0&&a.jsx("div",{className:"current-time-past",style:{gridRow:`1 / span ${f}`},"aria-hidden":"true"}),x&&D>0&&D<96&&a.jsx("div",{className:"current-time-line",style:{top:`${D*28}px`},"aria-hidden":"true",children:a.jsx("span",{children:"Jetzt"})}),t.map((C,R)=>a.jsx("button",{type:"button",className:`slot-cell quarter-hour ${C.rowClass}`,style:{gridRow:R+1},onDragOver:A=>{A.preventDefault(),A.dataTransfer.dropEffect="move"},onDrop:A=>L(A,C),onClick:()=>$(C)},C.label)),T.map(C=>a.jsx("div",{className:`sun-band ${C.align==="end"?"top-band":"bottom-band"}`,style:{gridRow:`${C.startIndex+1} / span ${C.spanBlocks}`},children:a.jsx("span",{children:C.label})},C.key)),y&&a.jsx("div",{className:"pre-start-stripe",style:{gridRow:`${y.startIndex+1} / span ${y.spanBlocks}`},"aria-hidden":"true",children:a.jsx("span",{children:y.label})}),c.map(C=>{const R=new Date(C.start_at),A=new Date(C.end_at),N=R>h?R:h,V=A=m?24*60:V.getHours()*60+V.getMinutes(),O=Math.max(0,Math.floor(J/15)),I=Math.max(1,Math.min(96-O,Math.ceil((P-J)/15)));return a.jsx(Kp,{appointment:C,onOpen:()=>g({appointment:C}),compact:!0,spanBlocks:I,gridRowStart:O+1},`${C.id}-${xe(e)}`)}),j.map(C=>a.jsx("div",{className:C.hasConflict?"rest-stripe warning":"rest-stripe ok",style:{gridRow:`${C.startIndex+1} / span ${C.spanBlocks}`},onDragOver:R=>{R.preventDefault(),R.dataTransfer.dropEffect="move"},onDrop:R=>{const A=W(R,C);L(R,A)},onClick:R=>{const A=W(R,C);$(A)},children:a.jsx("span",{children:C.label})},C.key))]})}function Kp({appointment:e,onOpen:t,compact:n=!1,spanBlocks:r=1,gridRowStart:l=null}){const s=`${e.student_first_name||""} ${e.student_last_name||""}`.trim()||Yc(e.category),o=r>=3,u=Number(e.student_needs_glasses||0)===1;return a.jsx("button",{className:n?"appointment-card compact-card day-appointment":"appointment-card",onClick:d=>{d.stopPropagation(),t()},style:{"--appointment-color":e.lesson_type_color,"--span-blocks":r,...l?{gridRow:`${l} / span ${r}`}:{}},children:n?a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"appointment-top",children:[a.jsxs("strong",{className:"appointment-title-row",children:[a.jsx("span",{children:e.lesson_type_name}),u&&a.jsx("span",{className:"vision-badge",title:"Brille erforderlich",children:"[Br]"})]}),a.jsxs("span",{className:"appointment-student",children:[s,u&&a.jsx("span",{className:"vision-inline","aria-hidden":"true",children:" [Brille]"})]}),o&&a.jsxs("span",{className:"appointment-meta",children:[_t(e.start_at)," · ",_t(e.start_at,!0)]})]}),a.jsx("div",{className:"appointment-bottom",children:a.jsxs("span",{children:["bis ",_t(e.end_at,!0)]})})]}):a.jsxs(a.Fragment,{children:[a.jsxs("strong",{className:"appointment-title-row",children:[a.jsx("span",{children:e.lesson_type_name}),u&&a.jsx("span",{className:"vision-badge",title:"Brille erforderlich",children:"[Br]"})]}),a.jsxs("span",{children:[_t(e.start_at,!0)," - ",_t(e.end_at,!0)]}),a.jsxs("span",{children:[s,u&&a.jsx("span",{className:"vision-inline",children:" [Brille]"})]})]})})}function bp({students:e,templates:t,onSave:n,onSaveTraining:r,onDelete:l}){var g;const[i,s]=F.useState(null),[o,u]=F.useState("master"),d=e.find(h=>Number(h.id)===Number(i))||null;return i==="new"?a.jsx(zo,{student:{first_name:"",last_name:"",phone:"",email:"",needs_glasses:0,notes:"",template_id:(g=t[0])==null?void 0:g.id,status:"active",progress:[]},templates:t,activeTab:"master",setActiveTab:u,onBack:()=>s(null),onSave:async h=>{await n(h,null),s(null)},onSaveTraining:null,onDelete:null,isNew:!0}):d?a.jsx(zo,{student:d,templates:t,activeTab:o,setActiveTab:u,onBack:()=>{s(null),u("master")},onSave:async h=>{await n(h,d.id)},onSaveTraining:async h=>{await r(d.id,h)},onDelete:async()=>{window.confirm(`Fahrschueler ${d.first_name} ${d.last_name} wirklich loeschen? Termine bleiben erhalten, verlieren aber den Fahrschueler-Bezug.`)&&(await l(d.id),s(null),u("master"))}}):a.jsxs("section",{className:"list-panel student-page",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Verwaltung"}),a.jsx("h2",{children:"Fahrschueler"}),a.jsx("p",{className:"meta-line",children:"Klick oeffnet die eigene Fahrschueler-Seite mit Stammdaten und Ausbildung."})]}),a.jsx("button",{className:"primary-button",onClick:()=>{u("master"),s("new")},children:"Neu"})]}),a.jsx("div",{className:"entity-list",children:e.map(h=>a.jsxs("button",{className:"entity-item student-list-row",onClick:()=>s(h.id),children:[a.jsxs("strong",{children:[h.first_name," ",h.last_name]}),a.jsxs("span",{children:[h.template_code," · ",h.status]})]},h.id))})]})}function zo({student:e,templates:t,activeTab:n,setActiveTab:r,onBack:l,onSave:i,onSaveTraining:s,onDelete:o,isNew:u=!1}){const[d,g]=F.useState(e),[h,m]=F.useState(e.progress||[]),[x,w]=F.useState(!1);F.useEffect(()=>{g(e),m(e.progress||[])},[e]);async function v(f){f.preventDefault(),await i(d)}async function D(f){if(f.preventDefault(),!!s){w(!0);try{await s(h.map(c=>({requirement_key:c.requirement_key,phase_label:c.phase_label||"",prior_completed_units:Number(c.prior_completed_units||0)})))}finally{w(!1)}}}return a.jsxs("section",{className:"list-panel student-page student-detail-page",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Fahrschueler"}),a.jsx("h2",{children:u?"Neuer Fahrschueler":`${e.first_name} ${e.last_name}`}),a.jsx("p",{className:"meta-line",children:u?"Stammdaten anlegen.":`${e.template_name||e.template_code} · ${e.status}`})]}),a.jsx("button",{type:"button",className:"ghost-button",onClick:l,children:"Zurueck"})]}),!u&&a.jsxs("div",{className:"mode-switch detail-tabs",children:[a.jsx("button",{className:n==="master"?"tab-button active":"tab-button",onClick:()=>r("master"),children:"Stammdaten"}),a.jsx("button",{className:n==="training"?"tab-button active":"tab-button",onClick:()=>r("training"),children:"Ausbildung"})]}),(n==="master"||u)&&a.jsxs("form",{className:"stack-form",onSubmit:v,children:[a.jsxs("label",{children:["Vorname",a.jsx("input",{value:d.first_name||"",onChange:f=>g({...d,first_name:f.target.value}),required:!0})]}),a.jsxs("label",{children:["Nachname",a.jsx("input",{value:d.last_name||"",onChange:f=>g({...d,last_name:f.target.value}),required:!0})]}),a.jsxs("label",{children:["Telefon",a.jsx("input",{value:d.phone||"",onChange:f=>g({...d,phone:f.target.value})})]}),a.jsxs("label",{children:["E-Mail",a.jsx("input",{type:"email",value:d.email||"",onChange:f=>g({...d,email:f.target.value})})]}),a.jsxs("label",{className:"checkbox-row",children:[a.jsx("input",{type:"checkbox",checked:!!d.needs_glasses,onChange:f=>g({...d,needs_glasses:f.target.checked?1:0})}),a.jsx("span",{children:"Benoetigt Brille beim Fahren"})]}),a.jsxs("label",{children:["Fuehrerscheinklasse",a.jsx("select",{value:d.template_id||"",onChange:f=>g({...d,template_id:f.target.value}),children:t.map(f=>a.jsx("option",{value:f.id,children:f.name},f.id))})]}),a.jsxs("label",{children:["Status",a.jsxs("select",{value:d.status||"active",onChange:f=>g({...d,status:f.target.value}),children:[a.jsx("option",{value:"active",children:"aktiv"}),a.jsx("option",{value:"inactive",children:"inaktiv"})]})]}),a.jsxs("label",{children:["Notiz",a.jsx("textarea",{rows:"5",value:d.notes||"",onChange:f=>g({...d,notes:f.target.value})})]}),a.jsxs("div",{className:"modal-actions",children:[!u&&o&&a.jsx("button",{type:"button",className:"danger-button",onClick:o,children:"Fahrschueler loeschen"}),a.jsx("button",{className:"primary-button",type:"submit",children:"Speichern"})]})]}),!u&&n==="training"&&a.jsxs("form",{className:"training-panel",onSubmit:D,children:[(e.progress||[]).length===0&&a.jsx("p",{className:"meta-line",children:"Noch keine Ausbildungsvorgaben hinterlegt."}),pa(h).map(f=>{const c=bc(f.rows);return a.jsxs("div",{className:"training-phase",children:[f.phase_label&&a.jsxs("div",{className:"phase-head",children:[a.jsx("strong",{children:f.phase_label}),a.jsx("span",{className:`phase-state ${c.status}`,children:Jr(c.open).text})]}),f.rows.map(p=>{const y=h.findIndex(C=>C.requirement_key===p.requirement_key),j=Number(p.required_units||0),M=Number(p.completed_units||0),S=Number(p.prior_completed_units||0),T=Number(p.appointment_completed_units||0),$=Number(p.planned_units||0),L=M+$,W=j>0?Math.min(100,Math.round(L/j*100)):100;return a.jsxs("div",{className:"training-row",children:[a.jsxs("div",{className:"training-row-head",children:[a.jsxs("div",{children:[a.jsx("strong",{children:p.label}),a.jsxs("p",{children:["Altbestand ",S," · Termine erledigt ",T," · Geplant ",$," · Soll ",j," · Offen ",p.open_units]})]}),a.jsxs("label",{className:"training-import-field",children:["Schon erledigt",a.jsx("input",{type:"number",min:"0",step:"1",value:p.prior_completed_units??0,onChange:C=>{const R=[...h];R[y]={...p,prior_completed_units:C.target.value},m(R)}})]})]}),a.jsx("div",{className:"training-meter","aria-label":`${W} Prozent`,children:a.jsx("span",{style:{width:`${W}%`}})})]},p.requirement_key)})]},f.phase_label||"default")}),(e.progress||[]).length>0&&a.jsx("div",{className:"modal-actions",children:a.jsx("button",{className:"primary-button",type:"submit",disabled:x,children:x?"Speichert ...":"Ausbildung speichern"})})]})]})}function qp({lessonTypes:e,templates:t,onSave:n,onDelete:r,onReorder:l,onSaveMatrix:i}){const[s,o]=F.useState(null),[u,d]=F.useState([]),[g,h]=F.useState(!1),[m,x]=F.useState(e),w=e.filter(c=>c.category==="student");F.useEffect(()=>{d(t.map(c=>({template_id:c.id,lesson_type_ids:c.lesson_type_ids||[]})))},[t]),F.useEffect(()=>{x(e)},[e]);function v(c,p){d(y=>y.map(j=>{if(j.template_id!==c)return j;const M=j.lesson_type_ids.includes(p);return{...j,lesson_type_ids:M?j.lesson_type_ids.filter(S=>S!==p):[...j.lesson_type_ids,p]}}))}function D(c,p){const y=[...m];if(c<0||p<0||c>=y.length||p>=y.length)return y;const[j]=y.splice(c,1);return y.splice(p,0,j),y}async function f(c){x(c),await l(c.map(p=>p.id))}return a.jsxs(a.Fragment,{children:[a.jsxs(a.Fragment,{children:[a.jsxs("section",{className:"list-panel",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Verwaltung"}),a.jsx("h2",{children:"Stundenarten"}),a.jsx("p",{className:"meta-line",children:"Mit Hoch-/Runter-Knoepfen umsortieren. Farben, Dauer und Kategorie gelten mandantenweit."})]}),a.jsx("button",{className:"primary-button",onClick:()=>o({name:"",color:"#0E5D80",default_duration:45,category:"student",requirement_key:"",is_billable:1,is_counted:1,is_rest_relevant:1,fixed_duration:0,sort_order:m.length+1,system_key:""}),children:"Neu"})]}),a.jsx("div",{className:"entity-list lesson-type-list",children:m.map((c,p)=>a.jsxs("div",{className:"entity-item lesson-type-row",children:[a.jsxs("div",{className:"lesson-type-actions",children:[a.jsx("button",{type:"button",className:"ghost-button compact reorder-button",disabled:p===0,onClick:async y=>{y.stopPropagation(),await f(D(p,p-1))},children:"Hoch"}),a.jsx("button",{type:"button",className:"ghost-button compact reorder-button",disabled:p===m.length-1,onClick:async y=>{y.stopPropagation(),await f(D(p,p+1))},children:"Runter"})]}),a.jsx("span",{className:"color-dot",style:{"--dot-color":c.color||"#67625a"}}),a.jsxs("span",{className:"lesson-type-main",children:[a.jsx("strong",{children:c.name}),a.jsxs("span",{className:"meta-line",children:[c.default_duration," min · ",Yc(c.category)]})]}),a.jsx("button",{type:"button",className:"ghost-button compact",onClick:()=>o(c),children:"Bearbeiten"})]},c.id))})]}),s&&a.jsx(Hl,{title:"Stundenart",initial:s,onClose:()=>o(null),onSubmit:async c=>{c.category=c.category||s.category,c.default_duration=Number(c.default_duration),c.sort_order=Number(c.sort_order),await n(c,s.id),o(null)},onDelete:s.id&&s.system_key!=="private_block"?async()=>{window.confirm(`Stundenart "${s.name}" wirklich loeschen?`)&&(await r(s.id),o(null))}:null,fields:[{name:"name",label:"Bezeichnung"},{name:"color",label:"Farbe",type:"color"},{name:"default_duration",label:"Dauer in Minuten",type:"number"},{name:"category",label:"Kategorie",type:"select",disabled:s.system_key==="private_block",options:[{value:"student",label:"Fahrschueler"},{value:"private",label:"Privat"},{value:"work",label:"Sonstige Arbeiten"},{value:"theory",label:"Theorie"},{value:"blocked",label:"Sperre"}]},{name:"requirement_key",label:"Pflichtbaustein-Key"},{name:"sort_order",label:"Sortierung",type:"number"},{name:"is_billable",label:"Abrechenbar",type:"checkbox"},{name:"is_counted",label:"Zaehlt fuer Pflichtstunden",type:"checkbox"},{name:"is_rest_relevant",label:"Ruhezeit-relevant",type:"checkbox"},{name:"fixed_duration",label:"Feste Dauer",type:"checkbox"}]})]}),w.length>0&&t.length>0&&a.jsxs("section",{className:"list-panel",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Sichtbarkeit"}),a.jsx("h2",{children:"Klassenmatrix"}),a.jsx("p",{className:"meta-line",children:"Fuehrerscheinklassen stehen vertikal, schuelerbezogene Stundenarten horizontal."})]}),a.jsx("button",{className:"primary-button",onClick:async()=>{h(!0);try{await i(u)}finally{h(!1)}},disabled:g,children:g?"Speichert ...":"Matrix speichern"})]}),a.jsx("div",{className:"visibility-matrix-wrap",children:a.jsxs("table",{className:"visibility-matrix",children:[a.jsx("thead",{children:a.jsxs("tr",{children:[a.jsx("th",{children:"Fuehrerscheinklasse"}),w.map(c=>a.jsx("th",{children:c.name},c.id))]})}),a.jsx("tbody",{children:t.map(c=>{const p=u.find(y=>y.template_id===c.id)||{lesson_type_ids:[]};return a.jsxs("tr",{children:[a.jsx("th",{children:c.name}),w.map(y=>a.jsx("td",{children:a.jsx("input",{type:"checkbox",checked:p.lesson_type_ids.includes(y.id),onChange:()=>v(c.id,y.id)})},y.id))]},c.id)})})]})})]})]})}function Yp({instructors:e,onSave:t}){const[n,r]=F.useState(null);return a.jsx(Vl,{title:"Fahrlehrer",subtitle:"Mehrere Ressourcen werden direkt im Kalender abgebildet.",items:e,columns:l=>`${l.first_name} ${l.last_name} · ${l.is_active?"aktiv":"inaktiv"} · Anfahrt ${Number(l.pre_start_buffer_minutes||0)} min`,onEdit:l=>r(l),onCreate:()=>r({first_name:"",last_name:"",color:"#0E5D80",notes:"",is_active:1,pre_start_buffer_minutes:0}),form:n&&a.jsx(Hl,{title:"Fahrlehrer",initial:n,onClose:()=>r(null),onSubmit:async l=>{await t(l,n.id),r(null)},fields:[{name:"first_name",label:"Vorname"},{name:"last_name",label:"Nachname"},{name:"color",label:"Farbe",type:"color"},{name:"pre_start_buffer_minutes",label:"Anfahrtszeit vor erstem Termin (Minuten)",type:"number"},{name:"notes",label:"Notiz",type:"textarea"},{name:"is_active",label:"Aktiv",type:"checkbox"}]})})}function Xp({templates:e,lessonTypes:t,onSave:n}){const[r,l]=F.useState(null);return a.jsx(Vl,{title:"Klassenvorlagen",subtitle:"Kombinationen wie C + CE sind eigene Vorlagen mit festen Sollwerten.",items:e,columns:i=>`${i.code} · ${Zr(i,t).map(s=>`${s.label}: ${s.required_units}`).join(", ")||"keine Pflichtstunden"}`,onEdit:i=>{const s=Bp(i);l({...s,requirements:Zr(s,t)})},onCreate:()=>l({code:"",name:"",is_combination:0,lesson_type_ids:t.filter(i=>i.category==="student").map(i=>i.id),requirements:Zr({lesson_type_ids:t.filter(i=>i.category==="student").map(i=>i.id),requirements:[]},t)}),form:r&&a.jsx(em,{template:r,setTemplate:l,lessonTypes:t,onClose:()=>l(null),onSubmit:async()=>{await n(r,r.id),l(null)}})})}function Gp({users:e,tenants:t,currentUser:n,onSave:r}){const[l,i]=F.useState(null);return a.jsx(Vl,{title:"Benutzer",subtitle:"Rollen und Zugriff werden serverseitig geprueft.",items:e,columns:s=>`${s.first_name} ${s.last_name} · ${s.role} · ${s.email}${s.tenant_name?` · ${s.tenant_name}`:""}`,onEdit:s=>i(s),onCreate:()=>{var s;return i({tenant_id:n.tenant_id||((s=t[0])==null?void 0:s.id)||"",role:"dispatcher",email:"",password:"",first_name:"",last_name:"",is_active:1})},form:l&&a.jsx(Hl,{title:"Benutzer",initial:l,onClose:()=>i(null),onSubmit:async s=>{await r(s,l.id),i(null)},fields:[...n.role==="superadmin"?[{name:"tenant_id",label:"Mandant",type:"select",options:t.map(s=>({value:s.id,label:s.name}))}]:[],{name:"role",label:"Rolle",type:"select",options:[{value:"tenant_admin",label:"Mandanten-Admin"},{value:"dispatcher",label:"Disponent"},{value:"instructor",label:"Fahrlehrer"},...n.role==="superadmin"?[{value:"superadmin",label:"Superadmin"}]:[]]},{name:"email",label:"E-Mail"},{name:"password",label:"Passwort"},{name:"first_name",label:"Vorname"},{name:"last_name",label:"Nachname"},{name:"is_active",label:"Aktiv",type:"checkbox"}]})})}function Zp({tenants:e,onSave:t}){const[n,r]=F.useState(null);return a.jsx(Vl,{title:"Mandanten",subtitle:"Superadmin-Verwaltung fuer Mandantenstatus und Zeitzone.",items:e,columns:l=>`${l.name} · ${l.timezone} · ${l.is_active?"aktiv":"inaktiv"}`,onEdit:l=>r(l),onCreate:()=>r({name:"",timezone:"Europe/Berlin",is_active:1}),form:n&&a.jsx(Hl,{title:"Mandant",initial:n,onClose:()=>r(null),onSubmit:async l=>{await t(l,n.id),r(null)},fields:[{name:"name",label:"Name"},{name:"timezone",label:"Zeitzone"},{name:"federal_state",label:"Bundesland",type:"select",options:Wc},{name:"location_label",label:"Ort / Filiale"},{name:"latitude",label:"Breitengrad",type:"number"},{name:"longitude",label:"Laengengrad",type:"number"},{name:"is_active",label:"Aktiv",type:"checkbox"}]})})}function Jp({tenant:e,onSave:t}){const[n,r]=F.useState(e),[l,i]=F.useState((e==null?void 0:e.location_label)||""),[s,o]=F.useState([]),[u,d]=F.useState(!1),[g,h]=F.useState("");F.useEffect(()=>{r(e),i((e==null?void 0:e.location_label)||""),o([]),h("")},[e]);const m=Number(n==null?void 0:n.latitude),x=Number(n==null?void 0:n.longitude),w=Number.isFinite(m)&&Number.isFinite(x),v=.025,D=w?`https://www.openstreetmap.org/export/embed.html?bbox=${x-v}%2C${m-v}%2C${x+v}%2C${m+v}&layer=mapnik&marker=${m}%2C${x}`:"";async function f(){const c=l.trim();if(!c){o([]),h("Bitte einen Ort oder eine Adresse eingeben.");return}d(!0),h("");try{const p=await fetch(`https://nominatim.openstreetmap.org/search?format=jsonv2&limit=5&q=${encodeURIComponent(c)}`);if(!p.ok)throw new Error(`Ortssuche fehlgeschlagen (${p.status})`);const y=await p.json();o(y),y.length||h("Kein passender Ort gefunden.")}catch(p){h(p.message),o([])}finally{d(!1)}}return a.jsxs("section",{className:"list-panel",children:[a.jsx("div",{className:"section-head",children:a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Fahrschule"}),a.jsx("h2",{children:"Standort und Zeit"}),a.jsx("p",{className:"meta-line",children:"Ort, Bundesland und Zeitzone steuern Sonnenzeiten, Feiertage und die Hell-Dunkel-Markierung im Kalender."})]})}),a.jsxs("form",{className:"stack-form",onSubmit:async c=>{c.preventDefault(),await t(n)},children:[a.jsxs("label",{children:["Name",a.jsx("input",{value:n.name||"",onChange:c=>r({...n,name:c.target.value})})]}),a.jsxs("label",{children:["Zeitzone",a.jsx("input",{value:n.timezone||"",onChange:c=>r({...n,timezone:c.target.value})})]}),a.jsxs("label",{children:["Bundesland",a.jsx("select",{value:n.federal_state||"BE",onChange:c=>r({...n,federal_state:c.target.value}),children:Wc.map(c=>a.jsx("option",{value:c.value,children:c.label},c.value))})]}),a.jsxs("label",{children:["Ort / Filiale",a.jsxs("div",{className:"location-search",children:[a.jsx("input",{value:l,onChange:c=>{const p=c.target.value;i(p),r({...n,location_label:p})},placeholder:"z. B. Duisburg, Bahnhofstrasse 12"}),a.jsx("button",{type:"button",className:"ghost-button",onClick:f,disabled:u,children:u?"Suche...":"Ort suchen"})]})]}),g&&a.jsx("p",{className:"form-error",children:g}),s.length>0&&a.jsx("div",{className:"location-result-list",children:s.map(c=>a.jsxs("button",{type:"button",className:"location-result",onClick:()=>{r({...n,location_label:c.display_name,latitude:Number(c.lat),longitude:Number(c.lon)}),i(c.display_name),o([]),h("")},children:[a.jsx("strong",{children:c.display_name}),a.jsxs("span",{children:[Number(c.lat).toFixed(6)," / ",Number(c.lon).toFixed(6)]})]},`${c.place_id}-${c.lat}-${c.lon}`))}),a.jsxs("div",{className:"coordinate-grid",children:[a.jsxs("label",{children:["Breitengrad",a.jsx("input",{type:"number",step:"0.000001",value:n.latitude??"",onChange:c=>r({...n,latitude:c.target.value})})]}),a.jsxs("label",{children:["Laengengrad",a.jsx("input",{type:"number",step:"0.000001",value:n.longitude??"",onChange:c=>r({...n,longitude:c.target.value})})]})]}),w&&a.jsxs("div",{className:"map-preview",children:[a.jsx("iframe",{title:"Standortkarte",src:D,loading:"lazy",referrerPolicy:"no-referrer-when-downgrade"}),a.jsx("p",{className:"meta-line",children:"Karte zeigt den derzeit gespeicherten Standort."})]}),a.jsxs("div",{className:"location-hint",children:[a.jsx("strong",{children:"Hinweis"}),a.jsx("span",{children:"Feiertage richten sich nach dem Bundesland. Sonnenaufgang und Sonnenuntergang richten sich nach dem gespeicherten Standort."})]}),a.jsx("button",{className:"primary-button",type:"submit",children:"Speichern"})]})]})}function Vl({title:e,subtitle:t,items:n,columns:r,onEdit:l,onCreate:i,form:s}){return a.jsxs(a.Fragment,{children:[a.jsxs("section",{className:"list-panel",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Verwaltung"}),a.jsx("h2",{children:e}),a.jsx("p",{className:"meta-line",children:t})]}),a.jsx("button",{className:"primary-button",onClick:i,children:"Neu"})]}),a.jsx("div",{className:"entity-list",children:n.map(o=>a.jsx("button",{className:"entity-item",onClick:()=>l(o),children:r(o)},o.id))})]}),s]})}function Hl({title:e,initial:t,fields:n,onSubmit:r,onClose:l,onDelete:i=null}){async function s(o){o.preventDefault();const u=new FormData(o.currentTarget),d=Object.fromEntries(u.entries());for(const g of n)g.type==="checkbox"&&(d[g.name]=u.get(g.name)?1:0);await r(d)}return a.jsx("div",{className:"modal-shell",children:a.jsxs("form",{className:"modal-card stack-form",onSubmit:s,children:[a.jsxs("div",{className:"section-head",children:[a.jsx("h2",{children:e}),a.jsx("button",{type:"button",className:"ghost-button",onClick:l,children:"Schliessen"})]}),n.map(o=>a.jsxs("label",{children:[o.label,o.type==="textarea"?a.jsx("textarea",{name:o.name,defaultValue:t[o.name]||"",rows:"4",disabled:o.disabled}):o.type==="select"?a.jsx("select",{name:o.name,defaultValue:String(t[o.name]??""),disabled:o.disabled,children:o.options.map(u=>a.jsx("option",{value:u.value,children:u.label},u.value))}):o.type==="checkbox"?a.jsx("input",{name:o.name,type:"checkbox",defaultChecked:!!t[o.name],disabled:o.disabled}):a.jsx("input",{name:o.name,type:o.type||"text",defaultValue:t[o.name]||"",disabled:o.disabled})]},o.name)),a.jsxs("div",{className:"modal-actions",children:[i&&a.jsx("button",{type:"button",className:"danger-button",onClick:i,children:"Loeschen"}),a.jsx("button",{className:"primary-button",type:"submit",children:"Speichern"})]})]})})}function em({template:e,setTemplate:t,lessonTypes:n,onClose:r,onSubmit:l}){function i(s){const o={...e,is_combination:s?1:0};t({...o,requirements:Zr(o,n)})}return a.jsx("div",{className:"modal-shell",children:a.jsxs("form",{className:"modal-card stack-form",onSubmit:s=>{s.preventDefault(),l()},children:[a.jsxs("div",{className:"section-head",children:[a.jsx("h2",{children:"Klassenvorlage"}),a.jsx("button",{type:"button",className:"ghost-button",onClick:r,children:"Schliessen"})]}),a.jsxs("label",{children:["Code",a.jsx("input",{value:e.code,onChange:s=>t({...e,code:s.target.value})})]}),a.jsxs("label",{children:["Name",a.jsx("input",{value:e.name,onChange:s=>t({...e,name:s.target.value})})]}),a.jsxs("label",{children:["Kombination",a.jsx("input",{type:"checkbox",checked:!!e.is_combination,onChange:s=>i(s.target.checked)})]}),pa(e.requirements).map(s=>a.jsxs("div",{className:"requirement-phase",children:[s.phase_label&&a.jsx("h3",{children:s.phase_label}),a.jsx("div",{className:"requirements-grid",children:s.rows.map(o=>{const u=e.requirements.findIndex(d=>d.requirement_key===o.requirement_key);return a.jsxs("div",{className:"requirement-editor",children:[a.jsxs("strong",{className:"requirement-title",children:[a.jsx("span",{className:"color-dot",style:{"--dot-color":o.color||"#67625a"}}),o.label]}),a.jsx("input",{type:"number",min:"0",value:o.required_units,onChange:d=>{const g=[...e.requirements];g[u]={...g[u],required_units:Number(d.target.value)},t({...e,requirements:g})}})]},o.requirement_key)})})]},s.phase_label||"default")),a.jsx("button",{className:"primary-button",type:"submit",children:"Speichern"})]})})}function Nl({label:e,value:t,onChange:n}){const[r,l]=F.useState(!1),[i,s]=F.useState("hour"),o=Number((t||"00:00").split(":")[0]||0),u=Number((t||"00:00").split(":")[1]||0);F.useEffect(()=>{r&&s("hour")},[r]);const d=Array.from({length:12},(v,D)=>D),g=Array.from({length:12},(v,D)=>D+12),h=Array.from({length:12},(v,D)=>D*5);function m(v,D){const f=v/12*Math.PI*2-Math.PI/2,c=Math.cos(f)*D,p=Math.sin(f)*D;return{left:`calc(50% + ${c}px)`,top:`calc(50% + ${p}px)`}}function x(v){n(`${String(v).padStart(2,"0")}:${String(u).padStart(2,"0")}`),s("minute")}function w(v){n(`${String(o).padStart(2,"0")}:${String(v).padStart(2,"0")}`),l(!1)}return a.jsxs("div",{className:"time-dial-field",children:[a.jsxs("button",{type:"button",className:"time-dial-button",onClick:()=>l(v=>!v),children:[a.jsx("span",{children:e}),a.jsx("strong",{children:t})]}),r&&a.jsxs("div",{className:"time-dial-popover",children:[a.jsxs("div",{className:"time-dial-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Uhrzeit"}),a.jsx("strong",{children:t})]}),a.jsx("button",{type:"button",className:"ghost-button compact",onClick:()=>l(!1),children:"Schliessen"})]}),a.jsxs("div",{className:"mode-switch",children:[a.jsx("button",{type:"button",className:i==="hour"?"tab-button active compact":"tab-button compact",onClick:()=>s("hour"),children:"Stunde"}),a.jsx("button",{type:"button",className:i==="minute"?"tab-button active compact":"tab-button compact",onClick:()=>s("minute"),children:"Minute"})]}),a.jsxs("div",{className:"time-dial-face",children:[a.jsx("div",{className:"time-dial-center",children:i==="hour"?String(o).padStart(2,"0"):String(u).padStart(2,"0")}),i==="hour"?a.jsxs(a.Fragment,{children:[g.map((v,D)=>a.jsx("button",{type:"button",className:["time-dial-point","outer-ring",v===o?"active":""].filter(Boolean).join(" "),style:m(D,112),onClick:()=>x(v),children:String(v).padStart(2,"0")},`outer-${v}`)),d.map((v,D)=>a.jsx("button",{type:"button",className:["time-dial-point","inner-ring",v===o?"active":""].filter(Boolean).join(" "),style:m(D,72),onClick:()=>x(v),children:String(v).padStart(2,"0")},`inner-${v}`))]}):h.map((v,D)=>a.jsx("button",{type:"button",className:["time-dial-point",v===u?"active":""].filter(Boolean).join(" "),style:m(D,108),onClick:()=>w(v),children:String(v).padStart(2,"0")},`${i}-${v}`))]}),a.jsxs("label",{className:"stack-form",children:["Direkt eingeben",a.jsx("input",{type:"time",step:"300",value:t,onChange:v=>n(v.target.value)})]})]})]})}function tm({draft:e,setDraft:t,lessonTypes:n,instructors:r,students:l,templates:i,onPickStudent:s,onSubmit:o,onDelete:u,onClose:d,isEditing:g}){const h=Up(n,e.student_id,l),m=n.find(N=>Number(N.id)===Number(e.lesson_type_id)),x=h.some(N=>Number(N.id)===Number(e.lesson_type_id))?h:m?[m,...h]:h,w=l.find(N=>Number(N.id)===Number(e.student_id)),v=i.find(N=>Number(N.id)===Number(w==null?void 0:w.template_id)),D=r.find(N=>Number(N.id)===Number(e.instructor_id)),f=v&&Number(v.is_combination)?Kc(v):[],c=ys(m,e.start_at,e.end_at),p=Si(e.start_at),y=Br(e.start_at),j=Br(e.end_at),M=Rp(w,D,e.start_at,e.end_at),S=Fp(w==null?void 0:w.phone),T=S&&M?`https://wa.me/${S}?text=${encodeURIComponent(M)}`:"",$=S&&M?`sms:${S}?body=${encodeURIComponent(M)}`:"",L=w!=null&&w.email&&M?`mailto:${encodeURIComponent(w.email)}?subject=${encodeURIComponent("Fahrstunde")}&body=${encodeURIComponent(M)}`:"";F.useEffect(()=>{x.length&&(x.some(N=>Number(N.id)===Number(e.lesson_type_id))||t(N=>({...N,lesson_type_id:x[0].id})))},[e.lesson_type_id,x,t]),F.useEffect(()=>{e.end_at&&Ul(e.start_at,e.end_at)>0||t(N=>({...N,end_at:_i(N.start_at,Math.max(1,Number((m==null?void 0:m.default_duration)||45)))}))},[m==null?void 0:m.default_duration,e.end_at,e.start_at,t]);function W(N){N&&t(V=>({...V,start_at:jt(N,Br(V.start_at)),end_at:jt(N,Br(V.end_at))}))}function C(N){t(V=>{const J=jt(Si(V.start_at),N);return{...V,start_at:J,end_at:_i(J,ys(m,V.start_at,V.end_at).duration)}})}function R(N){t(V=>({...V,end_at:jt(Si(V.start_at),N)}))}function A(N){const V=Number((m==null?void 0:m.fixed_duration)||0)===1?Math.max(1,Number((m==null?void 0:m.default_duration)||45)):Math.max(1,Number((m==null?void 0:m.default_duration)||45))*N;t(J=>({...J,units:N,end_at:_i(J.start_at,V)}))}return a.jsx("div",{className:"modal-shell",children:a.jsxs("form",{className:"modal-card stack-form",onSubmit:o,children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Termin"}),a.jsx("h2",{children:g?"Termin bearbeiten":"Termin einplanen"})]}),a.jsx("button",{type:"button",className:"ghost-button",onClick:d,children:"Schliessen"})]}),a.jsxs("label",{children:["Fahrschueler",a.jsxs("select",{name:"student_id",value:e.student_id,onChange:N=>t({...e,student_id:N.target.value}),children:[a.jsx("option",{value:"",children:"Kein Fahrschueler"}),l.map(N=>a.jsxs("option",{value:N.id,children:[N.first_name," ",N.last_name]},N.id))]})]}),a.jsxs("label",{children:["Stundenart",a.jsx("select",{name:"lesson_type_id",value:e.lesson_type_id,onChange:N=>t({...e,lesson_type_id:N.target.value}),children:x.map(N=>a.jsx("option",{value:N.id,children:N.name},N.id))})]}),f.length>0&&a.jsxs("label",{children:["Ausbildungsteil",a.jsx("select",{name:"requirement_phase",value:e.requirement_phase||f[0],onChange:N=>t({...e,requirement_phase:N.target.value}),children:f.map(N=>a.jsx("option",{value:N,children:N},N))})]}),a.jsxs("label",{children:["Fahrlehrer",a.jsx("select",{name:"instructor_id",value:e.instructor_id,onChange:N=>t({...e,instructor_id:N.target.value}),children:r.map(N=>a.jsxs("option",{value:N.id,children:[N.first_name," ",N.last_name]},N.id))})]}),a.jsxs("div",{className:"time-editor-grid",children:[a.jsxs("label",{children:["Datum",a.jsx("input",{type:"date",value:p,onChange:N=>W(N.target.value)})]}),a.jsxs("div",{className:"stack-form",children:[a.jsx("span",{children:"Startzeit"}),a.jsx(Nl,{label:"Start",value:y,onChange:C})]}),a.jsxs("div",{className:"stack-form",children:[a.jsx("span",{children:"Endzeit"}),a.jsx(Nl,{label:"Ende",value:j,onChange:R})]})]}),a.jsxs("div",{className:"duration-preset-panel",children:[a.jsxs("div",{className:"section-head",children:[a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Dauer"}),a.jsx("h2",{children:"Fahrstunden"})]}),a.jsxs("span",{className:"badge",children:[c.duration," min · ",c.units," FS"]})]}),a.jsxs("div",{className:"duration-preset-row",children:[[1,2,3,4].map(N=>a.jsxs("button",{type:"button",className:c.units===N?"tab-button active compact":"tab-button compact",onClick:()=>A(N),children:[N," FS"]},N)),Number((m==null?void 0:m.fixed_duration)||0)===1&&a.jsxs("button",{type:"button",className:"ghost-button compact",onClick:()=>A(1),children:["Standard ",m==null?void 0:m.default_duration," min"]})]}),a.jsx("p",{className:"hint-line",children:"Start und Ende lassen sich direkt ueber die Uhr setzen. Die angerechneten Fahrstunden werden daraus automatisch berechnet."})]}),a.jsxs("div",{className:"share-panel",children:[a.jsx("div",{className:"section-head",children:a.jsxs("div",{children:[a.jsx("p",{className:"eyebrow",children:"Benachrichtigung"}),a.jsx("h2",{children:"Termin teilen"})]})}),a.jsxs("div",{className:"share-actions",children:[a.jsxs("a",{className:T?"share-button":"share-button disabled",href:T||void 0,target:"_blank",rel:"noreferrer","aria-disabled":!T,onClick:N=>{T||N.preventDefault()},children:[a.jsx("span",{className:"share-badge whatsapp",children:"WA"}),"WhatsApp"]}),a.jsxs("a",{className:$?"share-button":"share-button disabled",href:$||void 0,"aria-disabled":!$,onClick:N=>{$||N.preventDefault()},children:[a.jsx("span",{className:"share-badge sms",children:"SMS"}),"SMS"]}),a.jsxs("a",{className:L?"share-button":"share-button disabled",href:L||void 0,"aria-disabled":!L,onClick:N=>{L||N.preventDefault()},children:[a.jsx("span",{className:"share-badge email",children:"@"}),"E-Mail"]})]}),a.jsx("p",{className:"hint-line",children:w?"Die Nachricht wird mit Datum, Start- und Endzeit vorbefuellt.":"Fahrschueler waehlen, damit Kontakt-Buttons aktiv werden."})]}),a.jsxs("label",{children:["Status",a.jsxs("select",{name:"status",value:e.status,onChange:N=>t({...e,status:N.target.value}),children:[a.jsx("option",{value:"planned",children:"geplant"}),a.jsx("option",{value:"completed",children:"erledigt"}),a.jsx("option",{value:"cancelled",children:"abgesagt"})]})]}),a.jsxs("label",{children:["Notiz",a.jsx("textarea",{name:"notes",rows:"4",value:e.notes,onChange:N=>t({...e,notes:N.target.value})})]}),a.jsxs("div",{className:"modal-actions",children:[g&&a.jsx("button",{type:"button",className:"danger-button",onClick:u,children:"Termin loeschen"}),a.jsx("button",{type:"button",className:"ghost-button",onClick:()=>s==null?void 0:s(e.student_id),disabled:!e.student_id,children:"Fahrschueler waehlen"}),a.jsx("button",{className:"primary-button",type:"submit",children:"Speichern"})]})]})})}ki.createRoot(document.getElementById("root")).render(a.jsx(md.StrictMode,{children:a.jsx(Vp,{})}));