From bf4c0ce4b1f56ac0ff742828b80e8eb0121daf76 Mon Sep 17 00:00:00 2001 From: cedrick2711 Date: Thu, 23 Jul 2026 18:37:06 -0400 Subject: [PATCH] =?UTF-8?q?R=C3=A9gler=20probl=C3=A8mes=20d'affichage=20de?= =?UTF-8?q?s=20matchs=20r=C3=A9cents:=20Ajout=20des=20match=20qui=20arrive?= =?UTF-8?q?nt=20pour=20les=20coach,=20president=20et=20manager=20L=C3=A9g?= =?UTF-8?q?=C3=A8rement=20all=C3=A9ger=20la=20quantit=C3=A9=20de=20pages?= =?UTF-8?q?=20(merge=20certaines=20ensembles)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/models.cpython-313.pyc | Bin 45623 -> 46380 bytes instance/team_tryouts.db | Bin 172032 -> 172032 bytes models.py | 17 +- routes/__pycache__/main.cpython-313.pyc | Bin 9651 -> 12652 bytes routes/__pycache__/matches.cpython-313.pyc | Bin 34675 -> 34655 bytes routes/__pycache__/tryouts.cpython-313.pyc | Bin 26952 -> 28549 bytes routes/__pycache__/users.cpython-313.pyc | Bin 78330 -> 78320 bytes routes/main.py | 102 ++- routes/matches.py | 14 +- routes/tryouts.py | 22 +- routes/users.py | 15 +- templates/pages/add_note.html | 152 ++++ templates/pages/add_note_from_match.html | 63 -- templates/pages/add_note_from_tryout.html | 63 -- templates/pages/add_personal_note.html | 80 -- templates/pages/create_match.html | 848 ------------------ templates/pages/create_tryout.html | 64 -- templates/pages/dashboard.html | 52 ++ templates/pages/edit_tryout.html | 66 -- .../{edit_match.html => match_form.html} | 196 +++- templates/pages/tryout_form.html | 104 +++ templates/pages/view_tryout.html | 8 + 22 files changed, 579 insertions(+), 1287 deletions(-) create mode 100644 templates/pages/add_note.html delete mode 100644 templates/pages/add_note_from_match.html delete mode 100644 templates/pages/add_note_from_tryout.html delete mode 100644 templates/pages/add_personal_note.html delete mode 100644 templates/pages/create_match.html delete mode 100644 templates/pages/create_tryout.html delete mode 100644 templates/pages/edit_tryout.html rename templates/pages/{edit_match.html => match_form.html} (83%) create mode 100644 templates/pages/tryout_form.html diff --git a/__pycache__/models.cpython-313.pyc b/__pycache__/models.cpython-313.pyc index 4fae20ea3aabecef60943e2fcc59890b60c53b8f..42c0d3c9218575c1679cf7f7a733b183446cc5a7 100644 GIT binary patch delta 4918 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 delta 4507 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 diff --git a/models.py b/models.py index d2863de..e076b32 100644 --- a/models.py +++ b/models.py @@ -156,8 +156,9 @@ class User(UserMixin, db.Model): def can_manage_this_tryout(self, tryout): """Check if user can manage a specific tryout. - Presidents can manage all tryouts. Managers can manage their own tryouts. - Coaches can manage tryouts targeting their coached team. + Presidents can manage all tryouts. Managers can manage their own tryouts + or tryouts where they are assigned as manager. Coaches can manage tryouts + targeting their coached team or where they are assigned as coach. Args: tryout: The Tryout object to check permissions for. @@ -167,12 +168,14 @@ class User(UserMixin, db.Model): """ if self.role == 'president': return True - if self.role == 'manager' and tryout.created_by == self.id: + if self.role == 'manager' and (tryout.created_by == self.id or tryout.manager_id == self.id): return True if self.role == 'coach': org_team = OrgTeam.query.filter_by(coach_id=self.id).first() if org_team and tryout.target_org_team_id == org_team.id: return True + if tryout.coach_id == self.id: + return True return False def can_manage_this_org_team(self, org_team): @@ -392,6 +395,8 @@ class Tryout(db.Model): max_players: Maximum number of players allowed. created_by: Foreign key to the creating manager/president. target_org_team_id: Foreign key to target organization team. + manager_id: Foreign key to the assigned manager. + coach_id: Foreign key to the assigned coach. created_at: Timestamp of creation. """ __tablename__ = 'tryouts' @@ -405,9 +410,13 @@ class Tryout(db.Model): max_players = db.Column(db.Integer, nullable=True) created_by = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) target_org_team_id = db.Column(db.Integer, db.ForeignKey('org_teams.id'), nullable=True) + manager_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True) + coach_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True) created_at = db.Column(db.DateTime, default=datetime.utcnow) - creator = db.relationship('User', backref='created_tryouts') + creator = db.relationship('User', foreign_keys=[created_by], backref='created_tryouts') + manager = db.relationship('User', foreign_keys=[manager_id], backref='managed_tryouts') + coach = db.relationship('User', foreign_keys=[coach_id], backref='coached_tryouts') registrations = db.relationship('TryoutRegistration', backref='tryout', lazy='dynamic') evaluations = db.relationship('Evaluation', backref='tryout', lazy='dynamic') teams = db.relationship('Team', backref='tryout', lazy='dynamic') diff --git a/routes/__pycache__/main.cpython-313.pyc b/routes/__pycache__/main.cpython-313.pyc index a0e47769acf73ffa5885ae757f24cd20a181a020..60e5fbdbb261e48d564db60752d78e42f9ac4372 100644 GIT binary patch delta 4335 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 ZryU&xK7g;NFv5ri=RI|9fwx1e{|7^@UfTcw delta 2385 zcmah~ZA@F&89w*J*Y@@G7uSxBzp$|}F@}I)q`?iOB_lx7)UEGslf}`T+xSw9;No06 zFfu7<{~A@=!p!97C2ml!YnkY(Xd%{)Bf8X-Jz)6;GDb|XrYOs-dtc+<*T_hnl# zFT;hR8nQ z!{|O)nDd3H4rKSNr32k>nnPS6YlO-lhHiThe&Gx8oXDXD`~%Uo3sJ=(+Vf*DVn5dUS{J|L5Q_93&DAQK#a_O&7k7 zYLX%B2-AyGWQ6z#nV*DiCXiQLqHF&icf&(;7@88oIPsw#IAkRF_^Y@@w`k73kH}%W z+sMw6pT-1VVnw@XGf*VdI?*QhaR+mRkPx~KP{x2oK@|1$1OtGrCD~fisqYF&eY%L; z+s1TRyZ2tqI)20Ou9JsAY-?I$Da^7Tpb72468ffElR8yIjc+T^ z`aFIUSA}SUG1ikbLMpt-8zs^UIIO$(VE0xToqVBy4*C+?@@Ft*A`Nea!lMYhwS?YN zgwQuaCD3z^qCbV2F(lKMlJiL^bzplk{00ea(e}sz1fnL-*sx#22vQpF$G-_T}G^#4sG`lLl zTCO4!xm1)8UTv`?t*E0Iz=;9qxy7=gy0B<%#l$q+_{>&ol3FX)$_ui_wiwpZD-~I@ zVBQ&I*OCUY2m1d2G}BC3t=2R~s#Ij91apZA?>N${G}=-g^%#~X(FT8+7++Oi#>Z#S zrcsEb&Pn4c^U{i}>XoT#jy*OqdtuP(UTWs0aljA$)M)!A1TCAFm1&>26}>IpLd+kxaX!R%N%?pp1z-rYoE z5Q*Chsgqcp#Oj}?KV5C|{?FRepYy%19c_C3>!;UFzjo{o!H#R$tJ!Nut{!H#|s2(5MaeVC;!cAdY#F)VcEC}qsV!9hkUU4A$4L)Ay;~STD_~E<0(E6pd zOYd?!sfqWv8=32gcM|V%_0+_UZ{id0t;na5`rOh^Vfpsl(r5Bad+O-M z^EcelH*%kN?wjepz(YW{*S%_n&EIo2her;&!kBt$J1 zUsk+;>Je}eT%zwSW->^#h1HtdtkAiNL9IeQ-6yE2S6D`-+o-H-4ropzS(O04z* zip>lYk<5tWD@QZ{u7E*sm0{wQ-gxyIs@FjoP~JI2TiOdthmoITm{R_k3T}M{zqfd( zeS7c@@)2MGso*ZS2dY5@$OiX84R`<^0u@*eHh~842;_iruoi3tV<52uPq{jl8&K3U zqH2fe68)m|92G5i3`W5duo;YlM(~1;b(92OBJ2erup9ifOr)>C9- zKS7$6Z@P}BlTWlZP)LSpQ=mRwS>+6dj?;la6`7M~0zZ@U6WguqZ(`4%p>>Qd9u@Rh zSu|CdPp4m!Uej&Ca`J`t1W%C#d1cr4B*OyhFeSx5oAR7NYV0cSH delta 960 zcmajeZ%7ky7zgnC-8ON$!E{bVk<21C%4J#kCMlzqyNueK(H~NluH0@`yBjr(GDsKn z!Z$yn7pdzHg;@!4R`$nI%d#vyO$mmS_`=uH0*Okx?_IRsbuT_VzvrIc?RkE8`_j%P z+gWqcY|dbm%X+#t$lW&=yKf?jVFX?aZr z5hcDRrZ;Wq_sX?_iOis^57J+I3q2y4F=ffw_HO%>seHy-BCq(ne^S|RV2vXA@vWG# z6eJnM|E-n+p2B=*r_y4xO&ieP5Qu2wIU6HQA%{WOjsaGK{h)(h4V0vHA&k?}KN1`y_hGO!Np07D=(*)ToM=Q>^?X#&r| z3or3cF`zbo5YayqU^xm7fm)F2;T@J^;5|q+qJC22$jM*=;6xK9 z|FMR;NTA7IchVOUJ~B)JBTVA%6!3vQ1+iFxdblFWb4GJU>TL_NQdj6gCiz5HMRDlW z(QTRPl%KJ6gkFknBy-YO^rvB2>Ll}UPdiRTFToI;Kgr~!?&fmqh5)l9Z diff --git a/routes/__pycache__/tryouts.cpython-313.pyc b/routes/__pycache__/tryouts.cpython-313.pyc index 5a80b27c6c7459a9f4334b5ef0dd336dd3943729..1515b637e8e07079b2573e7302d1c59e89f4cb19 100644 GIT binary patch delta 4384 zcmd5X3 z(U(qrGZMNSbaiGzR}?Z16aGg@fy~UVC`uWGy+${Ey=|GKSl^~My8k< zU>Ze6W`MOABGsDBY;gez@4n6<19`?WeIcjY6ZVaJ$-^@;77U{jV#iMHZayX-b_d;q zUgY%kqcS|LEt>c$dz2VLm0@&ZWGw6)7(v5ZhQh;v=dX)nk|kp-eFP0U!(R7rC?;DT zAQY2&M%d3l3ToXg8S`?E%;eumxZrKodYQftW@T z3cJH&Aq4A(o&zYuCS3<>#INWowPY(ZXd5`D4~zu@&LEis-`2ITI{YtP)r5sdZQ#)k z&;hU;ATec3*6$8`ouM#FnKxx7;=JrKa>S2Xi5lVwm{v4o0ymWhd10)jk{}PU)k_G3 zra1gocI(iBT66y7*^~3?qFHs(Oy0fzsJbYsZktzk&#Jp0*m~w|o>`k`PTfDR9-37T z&8hvT4=nIm=ly5>^SpVMH_u4#RY!Sqls_=fcg^x$53Gmgt*%+CYmRr%^WItBJI4>6 zZpIB8-rTaFD|qAZg~Ri@l388J<-nY7`=oq9qkp5}Lc_eKXjW5nxphucIVoFAOH1$L z@WO_Cd^KmM`O&88snEsxsfjzqk4m>p2^VvxdT%v7$x&v>CneAHOu7Q!@tSeFxp<=K zeoGXcc*Za-oQ-?JFv>&RBEyIeabG^GU^4TkTcYaHrwm6%Ur=U7vo_9be4yOEpfN{_ zzHzT9+TBZ>PqBMBGC&vC3j=8TxPLN?s*hU~L)2HHEKM9$2!7x6PYfu1nQjU~Mai(hr{$h^>tMdMcZCM~YaSBS(Z`Y_QYDf$hfOOrY;B$-r} zYEIBeFg?}G$GIXXPccle2!(CP8i6C$9 z3h3kAc6T5@As-C@Wzc4S9MC1?3jv@I+E(#yW6~af2g1AAHa1{P^sMCIiDXDB2}6h} z5u#i{+sTMTS(hi-kcd#N6OpL+a)enM4{_{|OV$Ix_iP*G^M?g0QI3#{-Q7lUo{hD( z1D{XmSMWJ74{d_ho@K9gR3&s>ouruAz$E$I0qjOwH78}XO7ISl4g;hCz~)+=COrdsp@SX-tI||3 zgQTYqx?KQJbc-5wgA5e?^^}j?;F3ILRt?-zKN=;F|H#U1UW% zxpX3W#7}s*jeCI-xt$WZoe+6ZDv`U^AoBfDKO&I==cEkoq73e$4DMQH@Zai6IyB5j zn$6F1qTjPD!IK%3!RwbV6u$n*$L7CgvfcP@wUrfcM$HWSDgK~lynC1w-NGV2d7u$k z0JsI2O!T-#2&^FjpOGIuEB;0nCtA4sy|$U7mrniU)O&6JMq$!t5iRWuI!qA1QrjV+ zyZ0FWxOSRt#i1R)X1%y}XG<~lpu0#);*c1Cuz%`C@4;{H+@d)K#sPo|0ND8W^PPng zFM>t~|29Y`04xA!0O)Sd28n(UHAJ!)lDjr0^SFb~ai8}Xg8L^rOCY8m4Y*IhZ7k>< zc85Jf=zCyg5&AB;yb6lSJMIpQxx*s}zgm}nc#=Ad#$?{(zEGH4vtnX;F+<;nh~of| zSBxD-=RkQ4;0FNb0e%SZ9RQm1OCU`U2pI@qwqB2O>$4SCiE|}=34P}BGyN~Y}Ti#I>AkZ4npTU*w|iC3W=mJnR?BX2JmP0+|nd@ z!7wP9fs3f|9o33&wQm;xoLD@O$L%*ox*Ooz0MH2F1L(w8JNK=gI%}P&6<*YN;&l>*nE}uggAXNdZm1SB=mLGuAas2l_ zqxhFZ{4k<+zLi$KMp{ecMESr>94#CghfqJB_mpHoZAr3A7BC;fe1HB1T4yby*(ARQ z`gzcgg6=>enRX_GZUfj3&-2hmpVZf5JAy zUlcS50N*o$ZwJ9{MzE0(tOtU(M-YMv0gM190x?;`@JRnyz`G0m2B!`FxUH5w#61-; zTn0exVjAd+h-EnCJexVol79e}ThHC8z4gr~k=cEpu<9q=4%VKGX<`@Cz_1vOd_LI6 F{uh0&%Uu8f delta 3318 zcmaJ@ZETa*6@KsQ_w`5YB>u>U<0Q5T`LY5bfd&+a;{<3EH!%dixJfa@HHj1AI(E2r zsGziL?bxdQXxANSVr|)=T33Fw9n2Eyk9}7|;nxy~w94vMrb+uTsZu)lfvQQ{J=gJT zCknliAD{c&bMHO(p7UJ$@|R@k9;tX(US1}!_NXBme>{4t;+#yTvX|wY-dN694f{O2 zBSF04pAeX}!QXXSX^2E`fZOaAgLN?2Xfw(^1Q!s5B!M4QIt#Q`rNvTOr_!1Neau-^ zrm|9j#ib1@Etk;nz-fZFD;w8$0-vQ!);Wc+1I{)!=$nL)q?md{xMp#{nBH(eA8yOX zCkP=D5<{AhJ|u^Y;{xlqhDna?-h9v4nI_a8?h4&Wg3ykTirl3rhvN z;FinQv8T{4euva^xrNRCqzA6)9A-9vch8$*Q>x&d3YVrjWPk@Jt1c-uy<*{JnuTzS z>R1sH!h6+TZLg+T*d~PC1t#27u$~fiLbOg0Hf&R_h&^K7gYg?yRVsVMwCEC=g&D!C z)3}5g;<0CUSMMP3dW{e6*SMn>>=>2Fo1w}M+XrOA~Z9|Y15f#W-(3M;c{)DMx;+8X^N#6 zQZy5pjn2o?o(8yIy9;XV!!T{{9HG_B!&Al`H*Jv9Ph)K93@zCObGtr}Ivvkx^O2`f z74VhaWehW8Kl`MY2-Ma+3(mH8v}=-NI8NYghhq5JR%R`GL;I)(H1$JD&mZbmpO38= zXO^Xz$B#UMrT#tta%Jm7L1g}4m@LcI_8aZ1rafQSnwGbFm+Dq*$~}{^CgbooX)D|2 z&yJSieZtbdR=-(;w5@`m7xKCWAQR&m4U|k6iSLQzq7VzP)UO>uB1z46Wxhg z76@+>g9*E8A4{-e%D0K@2|NaG6K4~Sf*sOt5YfIOUnpf1QHUfO)DgqR8CVXy74@?| zrLiy)?t?eG8^qusiU`c7Op;6F6KHJ74H|#-(vJcd=17>*tIm=cf_I zq}V5&BQV+;S0#B7C0P%oeE?o)-|twRp)1DpvXp-O$W^LD=Jv;STkC4_!iw$Xd#0CB zeizr}cSmmVn}xgP4u8Mqu9x`xvpUaX3mN(GfuMx93a-8&+&G|+`|#fb=h|Y7@(_BO zebHHr2p>?lo5xJ!$iB#66@J=RZ%r`EqsdpcK@3-y#DnRim#!#OLtx zTwp44`l)C#a&9j662)H%`d#EI7ZTC)F&ddmM&_fLsWbF7WC^9OqRSUO_mA@DhVG3Ka$iYGG_Z3!SYxhzywIcNzIX zc3~iBDlZnVNS}efjP{c#R0L?(Fmv(PXgT|$C{cO}0iS4!OHv(zjG#prf|~*R?t{$C z$y2GtWQJl*iPDq*U!xhj353wZt@{~Jibf*gqaK3e~e$$mPDdvg`NgFi8;A7xzqPE zob_`C7i!%!HanNj#As~VJ(HsD{7>jM%F|Z&gh1IHRTl#_;cEO@X~g6mehd4UL3#~g ztNiIo^2ZOu>ph=IoO2z18EKVoGV_PomBOjWaTVp!6g9#n!-c}DQYnUQ!KvK{dl2~DZ*|T3`~moOT=~3a_=WQT zufTue9rA6q#!9y7#m~tQ{$b)zG(~08_YttdDHa#Sd{8_+#VOQ@;6iXS$m#p$Q`3uy zSU>$e49>qh(nV&;LyaJs5%#W0*k79=f@u0Hv8)jGf68<7=}-6G^er=+9QvG8el2#B TOmWU(vL+$1b|%}FoFxATET*2G diff --git a/routes/__pycache__/users.cpython-313.pyc b/routes/__pycache__/users.cpython-313.pyc index beafbbe5dcd8bfafe0040a44855f0a0a1d9faf2c..bcaa8dbc7b5505020bf31fefed48cad44d4e2be7 100644 GIT binary patch delta 779 zcmY+CUr19?9LLY^?%Zu|cQ{s8ajUsauj6LSyIIB}2SqA0#m4kineJx9{KMUhG9pX* z^Cohs+k;Pq^b$ctTp?lv~J zv1iBQaUoJ3&W>Dq_S~~(s;@FNF!17=*;$LTp`_z}Bh=f%Gp1%m;NZ(XIM0N34@~98 zEXlEprSZa+V@#fqm0UrzYp)q-@NRLVlM^NRN@=)sbxIbas&&|}KK*f8 zZ?}OP+_wOs6pK)?k5$*_{MzR_sMlvOSh!O%BI4f~5{#x+BPv-QJC`t#olR8ASqAwF zP${28X&8YbN8G=~{7?vg68RxPTdIMWyM~B1(ssT$)$e9O?f;rk8!vGBJs0?#I2%aX zwM8F<;gJ5u2VG25xlZgT(84*dXsVSm=z~0rf@_`#OVs~yZKVa; z^`CXH$#h8uaU70P_d=TyjahD%lT5_2Ql;DjsJVyuw*Tt_siKc;@ZQE}Le3Az_>ACO zLwx3l=JA8HkMQV!gt8wt9XQ)S5I#mAZ1d+L+KLZ?I@bjA0C%*-X1M0PO-)y!D2T{v zDFIp>e=u6A7_$N}01Mh2aqoIS23eFw&2IT9gl$|Ir zPH;k~v7^fIu9?p;cs0pq9C)43aQZJ1Tug%Av_g+dp}Q!n^i0z8moClow{xilp`?b#O zb-Ue4#BpDlx-h(AUp1^2k(tD;Pdxf!9NA41ZFhWdqW^IMv$Vh5yO24bEe>U7X3`5; ztyq}PQPDPW)2%{B79m!}yb`p<5BqRvBAf$s}TDZ!zdg|){G!jw4Q zaKUTuGrvCINCnKR#F0{Ymm9Gi?qx2x@9PaWKJJq6AN=sarEmH15Ln{3yAbB@0yrDK zE}k#<{ZBV6tFL@MoggI|_`W)jf?GYgV+RnEo4Kf50pN diff --git a/routes/main.py b/routes/main.py index aa53cc5..43ee72c 100644 --- a/routes/main.py +++ b/routes/main.py @@ -52,12 +52,24 @@ def dashboard(): stats['completed_tryouts'] = Tryout.query.filter_by(status='completed').count() stats['recent_users'] = User.query.order_by(User.created_at.desc()).limit(10).all() stats['recent_tryouts'] = Tryout.query.order_by(Tryout.created_at.desc()).limit(10).all() + today = date.today() + stats['upcoming_matches'] = Match.query.filter( + Match.status == 'scheduled', + Match.date >= today + ).order_by(Match.date, Match.start_time).limit(5).all() elif user.role == 'manager': stats['total_tryouts'] = Tryout.query.filter_by(created_by=user.id).count() stats['active_tryouts'] = Tryout.query.filter_by(created_by=user.id, status='in_progress').count() stats['total_evaluations'] = Evaluation.query.filter_by(evaluator_id=user.id).count() stats['my_tryouts'] = Tryout.query.filter_by(created_by=user.id).order_by(Tryout.date.desc()).limit(5).all() + today = date.today() + manager_tryout_ids = [t.id for t in Tryout.query.filter_by(created_by=user.id).all()] + stats['upcoming_matches'] = Match.query.filter( + Match.tryout_id.in_(manager_tryout_ids), + Match.status == 'scheduled', + Match.date >= today + ).order_by(Match.date, Match.start_time).limit(5).all() if manager_tryout_ids else [] elif user.role == 'coach': stats['my_evaluations'] = Evaluation.query.filter_by(evaluator_id=user.id).count() @@ -67,54 +79,66 @@ def dashboard(): evaluated_player_ids = [e.player_id for e in Evaluation.query.filter_by(evaluator_id=user.id).all()] stats['pending_evaluations'] = len(set(registered_player_ids) - set(evaluated_player_ids)) stats['my_recent_evaluations'] = Evaluation.query.filter_by(evaluator_id=user.id).order_by(Evaluation.created_at.desc()).limit(10).all() + today = date.today() + org_team = OrgTeam.query.filter_by(coach_id=user.id).first() + coach_tryout_ids = [t.id for t in Tryout.query.filter_by(target_org_team_id=org_team.id).all()] if org_team else [] + stats['upcoming_matches'] = Match.query.filter( + Match.tryout_id.in_(coach_tryout_ids), + Match.status == 'scheduled', + Match.date >= today + ).order_by(Match.date, Match.start_time).limit(5).all() if coach_tryout_ids else [] elif user.role == 'player': stats['my_tryouts'] = TryoutRegistration.query.filter_by(player_id=user.id).count() stats['my_registrations'] = TryoutRegistration.query.filter_by(player_id=user.id).order_by(TryoutRegistration.registered_at.desc()).limit(5).all() - # Get next match for each tryout the player is in + # Get upcoming matches for the player today = date.today() next_matches = [] - for reg in stats['my_registrations']: - tryout = reg.tryout - # Find matches where player participates (team membership or direct participant) - player_teams = Team.query.join(TeamMember).filter( - Team.tryout_id == tryout.id, - TeamMember.player_id == user.id - ).all() + + # Get all tryouts the player is registered for (not just the 5 most recent) + all_registrations = TryoutRegistration.query.filter_by(player_id=user.id).all() + registered_tryout_ids = [r.tryout_id for r in all_registrations] + + # Get all matches where player is a participant (any match type) + player_participant_matches = MatchParticipant.query.filter_by(player_id=user.id).all() + player_match_ids = [p.match_id for p in player_participant_matches] + + # Get all team memberships for this player + player_team_memberships = TeamMember.query.filter_by(player_id=user.id).all() + player_team_ids = [tm.team_id for tm in player_team_memberships] + + # Find all scheduled matches in registered tryouts + upcoming_matches = Match.query.filter( + Match.tryout_id.in_(registered_tryout_ids), + Match.status == 'scheduled', + Match.date >= today + ).order_by(Match.date, Match.start_time).all() + + for match in upcoming_matches: + is_participant = False + team = None - # Get matches for this tryout that include the player - tryout_matches = Match.query.filter( - Match.tryout_id == tryout.id, - Match.status == 'scheduled' - ).order_by(Match.date, Match.start_time).all() + if match.match_type == 'team_vs_team': + # Check if player is on either team + if match.team1_id in player_team_ids: + is_participant = True + team = next((tm for tm in player_team_memberships if tm.team_id == match.team1_id), None) + elif match.team2_id in player_team_ids: + is_participant = True + team = next((tm for tm in player_team_memberships if tm.team_id == match.team2_id), None) + else: + # For player_vs_player and player_scrim, check MatchParticipant + if match.id in player_match_ids: + is_participant = True - for match in tryout_matches: - # Check if player is in this match - is_participant = False - if match.match_type == 'team_vs_team': - # Check if player is on team1 or team2 - if match.team1_id in [t.id for t in player_teams] or match.team2_id in [t.id for t in player_teams]: - is_participant = True - else: - # Check if player is in match participants - participant = MatchParticipant.query.filter_by( - match_id=match.id, - player_id=user.id - ).first() - if participant: - is_participant = True - - if is_participant: - # Check if match is upcoming - match_date = match.date - if match_date >= today: - next_matches.append({ - 'tryout': tryout, - 'match': match, - 'team': player_teams[0] if player_teams else None - }) - break # Only get the next match per tryout + if is_participant: + tryout = match.tryout + next_matches.append({ + 'tryout': tryout, + 'match': match, + 'team': team.team if team else None + }) stats['next_matches'] = next_matches diff --git a/routes/matches.py b/routes/matches.py index 10b3b38..291f01b 100644 --- a/routes/matches.py +++ b/routes/matches.py @@ -309,13 +309,13 @@ def create_match(tryout_id): # Start time is now mandatory if not start_time_str: flash('Start time is required. Please select a time slot.', 'danger') - return render_template('pages/create_match.html', tryout=tryout, teams=teams, all_players=all_players) + return render_template('pages/match_form.html', tryout=tryout, teams=teams, all_players=all_players) try: date_obj = datetime.strptime(date_str, '%Y-%m-%d').date() if date_str else tryout.date except (ValueError, TypeError): flash('Invalid date format.', 'danger') - return render_template('pages/create_match.html', tryout=tryout, teams=teams, all_players=all_players) + return render_template('pages/match_form.html', tryout=tryout, teams=teams, all_players=all_players) start_time = None end_time = None @@ -331,7 +331,7 @@ def create_match(tryout_id): end_time = end_dt.time() except ValueError: flash('Invalid time format.', 'danger') - return render_template('pages/create_match.html', tryout=tryout, teams=teams, all_players=all_players) + return render_template('pages/match_form.html', tryout=tryout, teams=teams, all_players=all_players) match = Match( tryout_id=tryout_id, @@ -425,7 +425,7 @@ def create_match(tryout_id): flash('Match scheduled successfully!', 'success') return redirect(url_for('tryouts.view_tryout', tryout_id=tryout_id)) - return render_template('pages/create_match.html', tryout=tryout, teams=teams, all_players=all_players) + return render_template('pages/match_form.html', tryout=tryout, teams=teams, all_players=all_players) @matches_bp.route('//edit', methods=['GET', 'POST']) @@ -472,12 +472,12 @@ def edit_match(match_id): match.date = datetime.strptime(date_str, '%Y-%m-%d').date() except (ValueError, TypeError): flash('Invalid date format.', 'danger') - return render_template('pages/edit_match.html', match=match, tryout=tryout, teams=teams, all_players=all_players, current_player_ids=current_player_ids) + return render_template('pages/match_form.html', match=match, tryout=tryout, teams=teams, all_players=all_players, current_player_ids=current_player_ids) # Start time is now mandatory if not start_time_str: flash('Start time is required. Please select a time slot.', 'danger') - return render_template('pages/edit_match.html', match=match, tryout=tryout, teams=teams, all_players=all_players, current_player_ids=current_player_ids) + return render_template('pages/match_form.html', match=match, tryout=tryout, teams=teams, all_players=all_players, current_player_ids=current_player_ids) try: match.start_time = datetime.strptime(start_time_str, '%H:%M').time() @@ -578,7 +578,7 @@ def edit_match(match_id): flash('Match updated successfully!', 'success') return redirect(url_for('tryouts.view_tryout', tryout_id=tryout.id)) - return render_template('pages/edit_match.html', match=match, tryout=tryout, teams=teams, all_players=all_players, current_player_ids=current_player_ids, team1_player_ids=team1_player_ids, team2_player_ids=team2_player_ids) + return render_template('pages/match_form.html', match=match, tryout=tryout, teams=teams, all_players=all_players, current_player_ids=current_player_ids, team1_player_ids=team1_player_ids, team2_player_ids=team2_player_ids) @matches_bp.route('//delete', methods=['POST']) diff --git a/routes/tryouts.py b/routes/tryouts.py index 9bbc819..c9fa812 100644 --- a/routes/tryouts.py +++ b/routes/tryouts.py @@ -73,6 +73,8 @@ def create_tryout(): return redirect(url_for('tryouts.list_tryouts')) org_teams = OrgTeam.query.order_by(OrgTeam.name).all() + managers = User.query.filter_by(role='manager', is_active_account=True).order_by(User.full_name).all() + coaches = User.query.filter_by(role='coach', is_active_account=True).order_by(User.full_name).all() if request.method == 'POST': title = request.form.get('title') @@ -82,12 +84,14 @@ def create_tryout(): location = request.form.get('location') max_players = request.form.get('max_players') target_org_team_id = request.form.get('target_org_team_id') + manager_id = request.form.get('manager_id') + coach_id = request.form.get('coach_id') try: date_obj = datetime.strptime(date_str, '%Y-%m-%d').date() except (ValueError, TypeError): flash('Invalid date format.', 'danger') - return render_template('pages/create_tryout.html', org_teams=org_teams) + return render_template('pages/tryout_form.html', tryout=None, org_teams=org_teams, managers=managers, coaches=coaches, esport_games=ESPORT_GAMES) tryout = Tryout( title=title, @@ -98,14 +102,16 @@ def create_tryout(): max_players=int(max_players) if max_players else None, created_by=current_user.id, status='upcoming', - target_org_team_id=int(target_org_team_id) if target_org_team_id else None + target_org_team_id=int(target_org_team_id) if target_org_team_id else None, + manager_id=int(manager_id) if manager_id else None, + coach_id=int(coach_id) if coach_id else None ) db.session.add(tryout) db.session.commit() flash('Tryout created successfully!', 'success') return redirect(url_for('tryouts.view_tryout', tryout_id=tryout.id)) - return render_template('pages/create_tryout.html', org_teams=org_teams, esport_games=ESPORT_GAMES) + return render_template('pages/tryout_form.html', tryout=None, org_teams=org_teams, managers=managers, coaches=coaches, esport_games=ESPORT_GAMES) @tryouts_bp.route('//edit', methods=['GET', 'POST']) @@ -132,6 +138,8 @@ def edit_tryout(tryout_id): return redirect(url_for('tryouts.list_tryouts')) org_teams = OrgTeam.query.order_by(OrgTeam.name).all() + managers = User.query.filter_by(role='manager', is_active_account=True).order_by(User.full_name).all() + coaches = User.query.filter_by(role='coach', is_active_account=True).order_by(User.full_name).all() if request.method == 'POST': title = request.form.get('title') @@ -141,12 +149,14 @@ def edit_tryout(tryout_id): location = request.form.get('location') max_players = request.form.get('max_players') target_org_team_id = request.form.get('target_org_team_id') + manager_id = request.form.get('manager_id') + coach_id = request.form.get('coach_id') try: date_obj = datetime.strptime(date_str, '%Y-%m-%d').date() except (ValueError, TypeError): flash('Invalid date format.', 'danger') - return render_template('pages/edit_tryout.html', tryout=tryout, org_teams=org_teams, esport_games=ESPORT_GAMES) + return render_template('pages/tryout_form.html', tryout=tryout, org_teams=org_teams, managers=managers, coaches=coaches, esport_games=ESPORT_GAMES) tryout.title = title tryout.description = description @@ -155,11 +165,13 @@ def edit_tryout(tryout_id): tryout.location = location tryout.max_players = int(max_players) if max_players else None tryout.target_org_team_id = int(target_org_team_id) if target_org_team_id else None + tryout.manager_id = int(manager_id) if manager_id else None + tryout.coach_id = int(coach_id) if coach_id else None db.session.commit() flash('Tryout updated successfully!', 'success') return redirect(url_for('tryouts.view_tryout', tryout_id=tryout.id)) - return render_template('pages/edit_tryout.html', tryout=tryout, org_teams=org_teams, esport_games=ESPORT_GAMES) + return render_template('pages/tryout_form.html', tryout=tryout, org_teams=org_teams, managers=managers, coaches=coaches, esport_games=ESPORT_GAMES) @tryouts_bp.route('/') diff --git a/routes/users.py b/routes/users.py index f4c1bcf..87cf69e 100644 --- a/routes/users.py +++ b/routes/users.py @@ -1433,12 +1433,13 @@ def add_personal_note(): flash('Personal note added successfully!', 'success') return redirect(url_for('users.notes_dashboard')) - return render_template('pages/add_personal_note.html', + return render_template('pages/add_note.html', players=players, matches=matches, tryouts=tryouts, teams=teams, - org_team=org_team) + org_team=org_team, + context_type='general') @users_bp.route('/match//add-note', methods=['GET', 'POST']) @@ -1509,11 +1510,12 @@ def add_note_from_match(match_id): flash('Personal note added successfully!', 'success') return redirect(url_for('tryouts.view_tryout', tryout_id=tryout.id)) - return render_template('pages/add_note_from_match.html', + return render_template('pages/add_note.html', match=match, tryout=tryout, players=players, - team_notes=team_notes) + team_notes=team_notes, + context_type='match') @users_bp.route('/tryout//add-note', methods=['GET', 'POST']) @@ -1583,8 +1585,9 @@ def add_note_from_tryout(tryout_id): # Allow pre-selecting a player via query parameter preselected_player_id = request.args.get('player_id', type=int) - return render_template('pages/add_note_from_tryout.html', + return render_template('pages/add_note.html', tryout=tryout, players=players, team_notes=team_notes, - preselected_player_id=preselected_player_id) + preselected_player_id=preselected_player_id, + context_type='tryout') diff --git a/templates/pages/add_note.html b/templates/pages/add_note.html new file mode 100644 index 0000000..859abb9 --- /dev/null +++ b/templates/pages/add_note.html @@ -0,0 +1,152 @@ +{% extends "layouts/base.html" %} +{% block title %}Add Personal Note - TryoutPro{% endblock %} +{% block page_title %}Add Personal Note{% endblock %} +{% block breadcrumb %} + + Home / Tryouts + {% if context_type == 'tryout' %} + / {{ tryout.title }} + / Add Note + {% elif context_type == 'match' %} + / {{ tryout.tryout.title }} + / Add Note + {% else %} + / Add Note + {% endif %} + +{% endblock %} + +{% block content %} +
+
+

Add Personal Note

+ {% if context_type == 'tryout' %} +

Context: Tryout - {{ tryout.title }}

+ {% elif context_type == 'match' %} +

Context: Match - {{ match.title }}

+ {% endif %} +
+
+
+ + {% if context_type == 'tryout' %} + + {% elif context_type == 'match' %} + + {% endif %} + +
+ + +
+ +
+ + +
+ + {% if context_type != 'tryout' and context_type != 'match' %} +
+ + +
+ +
+ + +
+ +
+ + +
+ {% endif %} + + {% if team_notes %} +
+ +
+ {% for note in team_notes %} +
+ {{ note.created_at.strftime('%Y-%m-%d') }} - {{ note.coach.full_name }}: +

{{ note.content[:200] }}{% if note.content|length > 200 %}...{% endif %}

+
+ {% endfor %} +
+
+ {% endif %} + +
+ Cancel + +
+
+
+
+{% endblock %} + +{% block styles %} + +{% endblock %} \ No newline at end of file diff --git a/templates/pages/add_note_from_match.html b/templates/pages/add_note_from_match.html deleted file mode 100644 index f2eaedb..0000000 --- a/templates/pages/add_note_from_match.html +++ /dev/null @@ -1,63 +0,0 @@ -{% extends "layouts/base.html" %} -{% block title %}Add Note from Match - TryoutPro{% endblock %} -{% block page_title %}Add Note from Match{% endblock %} -{% block breadcrumb %}Home / Tryouts / {{ tryout.title }} / Add Note{% endblock %} - -{% block content %} -
-
-

Add Note for Match: {{ match.title }}

- {{ match.date.strftime('%m/%d/%Y') }} -
-
-
- - -
- - -
- -
- - -

This note will be linked to this match and visible to the selected player.

-
- -
- - - Back to Tryout - -
-
-
-
- -{% if team_notes %} -
-
-

Team Notes Reference

-
-
-
- {% for note in team_notes %} -
- - {{ note.coach.full_name if note.coach else 'Unknown Coach' }} - - {{ note.content | nl2br }} -
- {% endfor %} -
-
-
-{% endif %} -{% endblock %} \ No newline at end of file diff --git a/templates/pages/add_note_from_tryout.html b/templates/pages/add_note_from_tryout.html deleted file mode 100644 index 89bd793..0000000 --- a/templates/pages/add_note_from_tryout.html +++ /dev/null @@ -1,63 +0,0 @@ -{% extends "layouts/base.html" %} -{% block title %}Add Note from Tryout - TryoutPro{% endblock %} -{% block page_title %}Add Note from Tryout{% endblock %} -{% block breadcrumb %}Home / Tryouts / {{ tryout.title }} / Add Note{% endblock %} - -{% block content %} -
-
-

Add Note for Tryout: {{ tryout.title }}

- {{ tryout.date.strftime('%m/%d/%Y') }} -
-
-
- - -
- - -
- -
- - -

This note will be linked to this tryout and visible to the selected player.

-
- -
- - - Back to Tryout - -
-
-
-
- -{% if team_notes %} -
-
-

Team Notes Reference

-
-
-
- {% for note in team_notes %} -
- - {{ note.coach.full_name if note.coach else 'Unknown Coach' }} - - {{ note.content | nl2br }} -
- {% endfor %} -
-
-
-{% endif %} -{% endblock %} \ No newline at end of file diff --git a/templates/pages/add_personal_note.html b/templates/pages/add_personal_note.html deleted file mode 100644 index 36084c2..0000000 --- a/templates/pages/add_personal_note.html +++ /dev/null @@ -1,80 +0,0 @@ -{% extends "layouts/base.html" %} -{% block title %}Add Note - TryoutPro{% endblock %} -{% block page_title %}Add Personal Note{% endblock %} -{% block breadcrumb %}Home / My Notes / Add Note{% endblock %} - -{% block content %} -
-
-

Add Personal Note

- {% if org_team %} - {{ org_team.name }} - {% endif %} -
-
-
- - -
- - -
- -
- - -

These notes will only be visible to the selected player.

-
- -
- -

Link this note to a specific match, tryout, or team for better organization.

- -
-
- - -
-
- - -
-
- - -
-
-
- -
- - - Back to Notes - -
-
-
-
-{% endblock %} \ No newline at end of file diff --git a/templates/pages/create_match.html b/templates/pages/create_match.html deleted file mode 100644 index b9aca6d..0000000 --- a/templates/pages/create_match.html +++ /dev/null @@ -1,848 +0,0 @@ -{% extends "layouts/base.html" %} -{% block title %}Schedule Match - {{ tryout.title }} - TryoutPro{% endblock %} -{% block page_title %}Schedule Match{% endblock %} -{% block breadcrumb %}Home / Tryouts / {{ tryout.title }} / Schedule Match{% endblock %} - -{% block content %} -
-
-

Schedule Match for {{ tryout.title }}

-
-
-
- - -
- - -
- -
- - -
- -
-
- - -
-
- - -
-
- - - {% if current_user.can_manage_teams() or current_user.can_schedule_matches() %} -
-

Select Match Time

-

Click time slots consecutively to set match duration. Players available in all selected time blocks will be preselected.

- - - -
-

Loading availability...

-
- -
-
- - -
-
- - -
-
- {% else %} - -
-
- - -
-
- - -
-
- {% endif %} - -
- - -
- - -
-
-

Select Teams

- -
-
- - -
-
- - -
-
-
- - - - - - - -
- - - Cancel - -
-
-
-
-{% endblock %} - -{% block scripts %} - - -{% endblock %} \ No newline at end of file diff --git a/templates/pages/create_tryout.html b/templates/pages/create_tryout.html deleted file mode 100644 index 7a89be5..0000000 --- a/templates/pages/create_tryout.html +++ /dev/null @@ -1,64 +0,0 @@ -{% extends "layouts/base.html" %} -{% block title %}Create Tryout - TryoutPro{% endblock %} -{% block page_title %}Create Tryout{% endblock %} -{% block breadcrumb %}Home / Tryouts / Create{% endblock %} - -{% block content %} -
-
-
- -
-
- - -
-
-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
-
-
- - -
-
-
- - -
-
- Cancel - -
-
-
-
-{% endblock %} \ No newline at end of file diff --git a/templates/pages/dashboard.html b/templates/pages/dashboard.html index e9bfdaf..3c4e91b 100644 --- a/templates/pages/dashboard.html +++ b/templates/pages/dashboard.html @@ -108,6 +108,32 @@ + {% if stats.upcoming_matches %} +
+
+

Upcoming Matches

+
+
+ + + + {% for match in stats.upcoming_matches %} + + + + + + + {% endfor %} + +
MatchTryoutDate & TimeStatus
{{ match.title }}{{ match.tryout.title }} + {{ match.date.strftime('%m/%d/%Y') }} + {% if match.start_time %} at {{ match.start_time.strftime('%I:%M %p') }}{% endif %} + {{ match.status }}
+
+
+ {% endif %} + {% elif user.role == 'manager' %}
@@ -166,6 +192,32 @@
+ {% if stats.upcoming_matches %} +
+
+

Upcoming Matches

+
+
+ + + + {% for match in stats.upcoming_matches %} + + + + + + + {% endfor %} + +
MatchTryoutDate & TimeStatus
{{ match.title }}{{ match.tryout.title }} + {{ match.date.strftime('%m/%d/%Y') }} + {% if match.start_time %} at {{ match.start_time.strftime('%I:%M %p') }}{% endif %} + {{ match.status }}
+
+
+ {% endif %} + {% elif user.role == 'coach' %}
diff --git a/templates/pages/edit_tryout.html b/templates/pages/edit_tryout.html deleted file mode 100644 index 4833406..0000000 --- a/templates/pages/edit_tryout.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends "layouts/base.html" %} -{% block title %}Edit Tryout - TryoutPro{% endblock %} -{% block page_title %}Edit Tryout{% endblock %} -{% block breadcrumb %}Home / Tryouts / {{ tryout.title }} / Edit{% endblock %} - -{% block content %} -
-
-
- -
-
- - -
-
-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
-
-
- - -
-
-
- - -
-
- Cancel - -
-
-
-
-{% endblock %} \ No newline at end of file diff --git a/templates/pages/edit_match.html b/templates/pages/match_form.html similarity index 83% rename from templates/pages/edit_match.html rename to templates/pages/match_form.html index 34ddcf0..f2f9533 100644 --- a/templates/pages/edit_match.html +++ b/templates/pages/match_form.html @@ -1,28 +1,54 @@ {% extends "layouts/base.html" %} -{% block title %}Edit Match - TryoutPro{% endblock %} -{% block page_title %}Edit Match{% endblock %} -{% block breadcrumb %}Home / Tryouts / {{ tryout.title }} / Edit Match{% endblock %} +{% block title %}{% if match %}Edit Match{% else %}Schedule Match{% endif %} - {{ tryout.title }} - TryoutPro{% endblock %} +{% block page_title %}{% if match %}Edit Match{% else %}Schedule Match{% endif %}{% endblock %} +{% block breadcrumb %} + + Home / Tryouts + / {{ tryout.title }} + {% if match %} + / Edit Match + {% else %} + / Schedule Match + {% endif %} + +{% endblock %} {% block content %}
-

Edit Match

-

Match Type: {{ match.match_type.replace('_', ' ').title() }}

+

{% if match %}Edit Match{% else %}Schedule Match for {{ tryout.title }}{% endif %}

+ {% if match %} +

Match Type: {{ match.match_type.replace('_', ' ') | title }}

+ {% endif %}
-
+ + {% if not match %} +
+ + +
+ {% else %} + + {% endif %} +
- +
- +
+ {% if match %}
+ {% endif %} +
+ + +
@@ -52,11 +83,11 @@
- +
- +
{% else %} @@ -64,29 +95,24 @@
- +
- +
{% endif %} -
- - -
-
- +
-
+

-

Teams

+

Select Teams

@@ -94,7 +120,7 @@
@@ -103,15 +129,14 @@
- + {% if match and match.team1 %}
- {% if match.team1 %}
{{ match.team1.name }}
    @@ -122,8 +147,10 @@ {% endfor %}
- {% endif %} - {% if match.team2 %} +
+ {% endif %} + {% if match and match.team2 %} +
{{ match.team2.name }}
    @@ -134,12 +161,12 @@ {% endfor %}
- {% endif %}
+ {% endif %}
-
+

Select Players

@@ -181,7 +208,7 @@
-
+

Select Players

@@ -192,7 +219,7 @@
{% for player in all_players %} @@ -202,7 +229,7 @@
Cancel @@ -373,9 +400,11 @@ var allRegisteredPlayers = [ {%- endfor %} ]; +{% if match %} // Current team assignments from server var initialTeam1Ids = {{ team1_player_ids|tojson }}; var initialTeam2Ids = {{ team2_player_ids|tojson }}; +{% endif %} // Time slots from 12pm (12:00) to 12am (24:00) var TIME_SLOTS = []; @@ -427,11 +456,14 @@ document.addEventListener('DOMContentLoaded', function() { selectedDate = this.value; if (allDisponibilitiesInitialized()) { renderMergedDisponibilityGrid(); + {% if match %} updatePlayerPool(); + {% endif %} } }); selectedDate = document.getElementById('date').value; + {% if match %} selectedStartTime = document.getElementById('start_time').value; selectedEndTime = document.getElementById('end_time').value; @@ -459,6 +491,7 @@ document.addEventListener('DOMContentLoaded', function() { // Initialize team assignments for player_vs_player matches // Populate Team 1 + {% if match %} initialTeam1Ids.forEach(function(pid) { var teamDiv = document.getElementById('team1-selection'); var playerName = playerDataById.player_data[pid]; @@ -486,6 +519,13 @@ document.addEventListener('DOMContentLoaded', function() { updateHiddenInputs(); updateRandomizePreview(); + {% endif %} + + {% if not match %} + toggleMatchType(); + // Show all players initially + updatePlayerPool(); + {% endif %} }); function allDisponibilitiesInitialized() { @@ -499,7 +539,9 @@ function fetchDisponibilities() { .then(function(data) { allDisponibilities = data; renderMergedDisponibilityGrid(); + {% if match %} updatePlayerPool(); + {% endif %} }) .catch(function(error) { console.error('Error fetching disponibilities:', error); @@ -666,7 +708,16 @@ function toggleTimeSlot(dayOfWeek, timeStr, element) { }); if (selectedSlots.length > 0) { + {% if match %} fetchAvailablePlayersForSlots(); + {% else %} + fetchAvailablePlayersForAllSlots(); + {% endif %} + } else { + availablePlayersForSlots = []; + {% if match %} + updatePlayerPool(); + {% endif %} } } @@ -692,6 +743,35 @@ function formatTimeDisplay(timeStr) { return displayHour + ':' + m + ' ' + ampm; } +function fetchAvailablePlayersForAllSlots() { + if (!selectedDate || selectedSlots.length === 0) { + availablePlayersForSlots = []; + updatePlayerPool(); + return; + } + + var dateParts = selectedDate.split('-'); + var dateObj = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]); + var jsDay = dateObj.getDay(); + var dayOfWeek = jsDay === 0 ? 6 : jsDay - 1; + + // Find players available in ALL selected slots + availablePlayersForSlots = []; + for (var playerId in allDisponibilities) { + if (!allRegisteredPlayers.includes(parseInt(playerId))) continue; + var playerSlots = getSlotsForPlayer(parseInt(playerId), dayOfWeek); + var isAvailableInAll = selectedSlots.every(function(slot) { + return playerSlots.includes(slot); + }); + if (isAvailableInAll) { + availablePlayersForSlots.push(parseInt(playerId)); + } + } + + // Preselect available players in Team 1 + preselectAvailablePlayers(); +} + function fetchAvailablePlayersForSlots() { if (!selectedDate || selectedSlots.length === 0) return; @@ -713,20 +793,15 @@ function fetchAvailablePlayersForSlots() { } } + availablePlayersForSlots = availableIds; // Update player pool for PvP section updatePlayerPool(); updateRandomizePreview(); } -function clearTimeSelection() { - selectedSlots = []; - document.getElementById('start_time').value = ''; - document.getElementById('end_time').value = ''; - document.getElementById('merged-disponibility-selected').classList.add('hidden'); - document.querySelectorAll('.merged-disponibility-time-block').forEach(function(el) { - el.classList.remove('selected'); - }); - availablePlayersForSlots = []; +function preselectAvailablePlayers() { + // Just update the player pool - don't auto-assign to Team 1 + // Players will be shown in the pool and can be manually assigned to either team updatePlayerPool(); } @@ -827,10 +902,47 @@ function updateHiddenInputs() { document.getElementById('team2-player-ids-input').value = team2Ids.join(','); } +function clearTimeSelection() { + selectedSlots = []; + document.getElementById('start_time').value = ''; + document.getElementById('end_time').value = ''; + document.getElementById('merged-disponibility-selected').classList.add('hidden'); + document.querySelectorAll('.merged-disponibility-time-block').forEach(function(el) { + el.classList.remove('selected'); + }); + availablePlayersForSlots = []; + // Clear both team selections + document.querySelectorAll('#team1-selection [data-player-id], #team2-selection [data-player-id]').forEach(function(el) { + el.remove(); + }); + updateHiddenInputs(); + updatePlayerPool(); +} + +function toggleMatchType() { + var matchType = document.getElementById('match_type').value; + var teamSection = document.getElementById('team-vs-team-section'); + var playerVsPlayerSection = document.getElementById('player-vs-player-section'); + var scrimSection = document.getElementById('player-scrim-section'); + + teamSection.classList.add('hidden'); + playerVsPlayerSection.classList.add('hidden'); + scrimSection.classList.add('hidden'); + + if (matchType === 'team_vs_team') { + teamSection.classList.remove('hidden'); + } else if (matchType === 'player_vs_player') { + playerVsPlayerSection.classList.remove('hidden'); + updatePlayerPool(); + } else if (matchType === 'player_scrim') { + scrimSection.classList.remove('hidden'); + } +} + function updateRandomizePreview() { - var assignedCount = document.querySelectorAll('#team1-selection [data-player-id], #team2-selection [data-player-id]').length; + var checkedCount = document.querySelectorAll('#team1-selection [data-player-id], #team2-selection [data-player-id]').length; var team1Size = parseInt(document.getElementById('team1-size').value) || 1; - var team2Size = assignedCount - team1Size; + var team2Size = checkedCount - team1Size; if (team2Size < 0) team2Size = 0; diff --git a/templates/pages/tryout_form.html b/templates/pages/tryout_form.html new file mode 100644 index 0000000..391e05e --- /dev/null +++ b/templates/pages/tryout_form.html @@ -0,0 +1,104 @@ +{% extends "layouts/base.html" %} +{% block title %}{% if tryout %}Edit Tryout{% else %}Create Tryout{% endif %} - TryoutPro{% endblock %} +{% block page_title %}{% if tryout %}Edit Tryout{% else %}Create Tryout{% endif %}{% endblock %} +{% block breadcrumb %} + + Home / Tryouts + {% if tryout %} + / {{ tryout.title }} + / Edit + {% else %} + / Create + {% endif %} + +{% endblock %} + +{% block content %} +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+ + +
+
+ + Cancel + + +
+ +
+
+{% endblock %} \ No newline at end of file diff --git a/templates/pages/view_tryout.html b/templates/pages/view_tryout.html index 282d175..0ee7b75 100644 --- a/templates/pages/view_tryout.html +++ b/templates/pages/view_tryout.html @@ -55,6 +55,14 @@ Target Team {{ tryout.target_org_team.name if tryout.target_org_team else 'Not specified' }}
+
+ Manager + {{ tryout.manager.full_name if tryout.manager else 'Not assigned' }} +
+
+ Coach + {{ tryout.coach.full_name if tryout.coach else 'Not assigned' }} +
Registered Players {{ registered_players | length }}