From a385991fbca54b93823d92d0042d6ad20402f889 Mon Sep 17 00:00:00 2001 From: Jacob Maynard Date: Sun, 18 Jan 2026 15:12:23 -0600 Subject: [PATCH 1/6] improve project view --- .mcp/memory.db-shm | Bin 32768 -> 32768 bytes .../src/components/project/ProjectContext.jsx | 7 + .../src/components/project/ProjectHeader.jsx | 134 ++++---- .../src/components/project/ProjectView.jsx | 131 ++++---- .../project/all-studies-tab/AllStudiesTab.jsx | 4 +- .../all-studies-tab/study-card/StudyCard.jsx | 6 +- .../study-card/StudyCardHeader.jsx | 89 ++++- .../project/overview-tab/OverviewTab.jsx | 306 ++++++++---------- 8 files changed, 352 insertions(+), 325 deletions(-) diff --git a/.mcp/memory.db-shm b/.mcp/memory.db-shm index fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10..5a0bc9ff479a5ed9b29c65884dfea882295d897b 100644 GIT binary patch literal 32768 zcmeHQWzbet7rlFLQaYtWLO{ACrAtb>ln|sF1Zj{4X_W5nkTy{i6hs9~3U~@6SCmi}!h1YxZ8xx|bjPxa(#*U&M<)^x%{ zCHZS@`}a33vRh5itQ_ET0=cZtZ(5yV*^8)#-&Tp3C@∨P0*|Y;0pqUtj=$i z;qC(phiJ@QThwZT_7wwP94KLRe)|kp5-1g-DGk1i)dcM;3;uqfoYnd5GhBI~g4G1g zstCRkP}%DIW*P1Qpo-N5&8iB%8c^Np{AL-h22e9ZQww};s|ngy2Yg+ip4Iv7Gu(qf zeX9wY)c|}$ppn)2%`#kL;32CCn$-k+Q=pmE`OPw1bD)LQ1kGv*z7^2g>ilLIt_{%E zYJz691OG7aNQkaI_zpnF5M3wmj{==TbX~wd26PS4bpziW=nsgjRZznP0*~- z;Ku-Ct9X5g7z%|zZ6(zb$8Q5YqL9@1k-v(^A zI=@+l+X3vfnxI*`!0!g0wK~69hT8+|4bkiazu#(t_8kC!5IAIYe)|mf9PoUI<^}LC zT20Wtm%zUa9JV^YeTI7lcr`?G1pI4O6SVJj@JE4TR_C|RaBl!_T20Wbu!E{Pr2{6X4Sj z&1c|0x0;}R=fHmfoVPl^eTKULd>Nv-2>z1Q1ns*F{wv^XtMl7uxNm@OLp0xkzhX5( z`>ulj9{9oP{Pr2{N8qOr&ClR}0e%I3vs$w^5s(;20we{D?swoCa2+7vc8!^1xEsJ9 zfYAiax(V)2;IBLA%)Gw=Gl&fE(Ql{W7%>0Gj!u+7lt7d~lt7d~lt7d~lt7d~lt7d~ zlt7d~lt7d~lt7d~lt7d~lt7d~lt7d~lt7d~lt7d~lt7d~lt7d~lt7d~lt7d~lt7d~ zlt7d~lt7d~lt7d~lt7d~lt7d~Y!euyeqtf5#CG$oX%o~#GjKM}#~S$_dCq~?BI=}G zPrUQawxJPJ?B&hi#{tMTOHUOdrv3{R?^#S>Up%#%fQ7p0@@l%I-Id8$DTsTFmi zUNo2cOWSEb9i}(wG<`~!=m)w^!pS)!=i~xhk}GmeZp5v)6Zho7Jc=jt zY+l4`cq{Mam-raJ%V+sZzRJI|CwECYndoJaY?5D!Nja%5^`*JAmu}KuhRb-FDGOzl zY>~Zj*C@L>spp+s)1vBo>UFhK-92(kRZcB_L+!MmlcYYzlYizpyYMs6NmAi^;}s*- zNo94C)Qor|p+9q|lQNAou|LJAtTL;kYN!9jWqGyuU8PUY8|oyf^J=Gqc({|Sv<610 zlgi^HshL`%UjF}UPH4YTC-t@yr`6O+ol-k}!pSwgpmsXKNm7hPt@K_2uOgatI-xyf zwzt)L$vfp;#na2_>0YWpHK`G`rbnqa4WZFAk*3l*IzVUWGTopQT###VYwpFPc`@(f zQ+$z0vP)hmFD+z%%#zizHAcCawhrC7*GW>k-9}YTeNVmP#A$W4)sNLqhsju(8lx-u zk3G{YpgSX-Bqd&QG`HnM8(B%TY}G=0RBJRQ^+HR~Xtd+ZLF>yJw3+PlUPdRzX>>hY zM2EpOJhz{WGEfdGKqaUm)uP7KhB{Lp8cJhn5>2Cdw3OD<4mwD$&~bW?KBKSbNBV;j za7wac??hCIlP3|@;2VjFY_CGnm^%7{5@Y|mSmD%7I--% zpWG{jrMQ%l3Q|KFNK5G;-DRMRkO}{~GR2%ErMpT-RaJdYedxq#jkrEBjo-6sr{n&W zuV%7NV|p`mXM&TY5}+wDqn8Uke5KGYR~x-)ZO|3g8~s>g(ET*mTY`3>?P$$8j5e4v zXgRrr_KxdltVm87DJK=Al2nOm(?isjx=>$wg2vHgnojd+8Ev4QbckN16ZAfPPG8ec zbdwTtD$c~Y`93bqmAMW-#BI4V_u(NtmZ$PuUdrouJ0IY~{3f5_Px&(cz}HzMxnz)q z=uFz^<&*+aL`q0SsVNPmm2{LIGDt?sM42s%WQ}Z-eNx;>Qo5^TRMph?)JIO7)>m8o zgf1w(KI!D{H%%$JGto&>3B8nPZo=)j3-{%rJdUUFJYL4@c?TclSNJ%;$Di?6{3GAs z1d>8B%1SSn6qKS;QYuL;X(X+slk}9qGD;@N99b-DWxMQ;yGA9r99MIamhMVbSKd+R zR^l%l_-vrF3DuWsr_*G4^40MlKhJCk?@KNIt;5}^S%6Ix#jqs_DmS~{D0?a%?) z7rlq$ylLKi^w_OOKifg{j-5cC*5~Mo`U(9=2`MFIqTF;Jm8J)%E;XfxsVnuT;WVCR z&}@2!R?sHeP0!P7bdo-#FX&tPh5n+%oQAV-9xlRVxeC|gru;BJ#{KvSev+s2d|u8Q zcqbp?SNR0L&!6+x{1gAd2_>c6EvvlTQb$b*H+Mq;$KDs)0JGZ=E=88P^)E@q1P6bcT~_8rP1fG3qUF zl9XwN)SboZq^dee%5>lAP7NnX>2@1cb9GYRIdR%vZS{NlP3iS%C)YHwaywe7og|e; zoz!Zz(`r&zn#4RU)9kD}^_?W8+ig@W)Ja|8U--|MyX~O1`n%fcGcmuO#$*!p{*^IL z$?Q*S{!pDYYNz#_B(*25Wn5#mfs>>(n{R1as+0QFiPLUstJl;{7szr4S2Zc6RytVa zB&jUwq_!x1;@vF{a=O*7uQS__n>)!$x83vFtCRZ8iO=p@qo^C#N>@0!rfJkkt>#U< zTkTf+t+Hx`-d45KrcRPF?~c%&7BNprw>MtZL7miJPMr3LdpA(Ln>+m^_5PJku4!6z zQk&II@AQ3d=d#`Y7lFTTqdiKm&736lTA;JriIz^1x_wLV?;Vvn;f)YZoDK-Kb{oT- zROw)&lWUqqozxbk&)dFW$gkPs-dz|Xilg_cowjq5)ax3Pahmo{l2Whtx~r2)>?Emy zYO8mtliK9OX;yVo&#IlOzdVHb)Z%?=rw=S)~iqBM3pI7v#g`Ie@KI;kX1k{YhI znoOP4W+zUwQ66Phd(=+VUmn8zYVnIopLj#3bdf$WPs_X~O?NtSHz!%?wtHSrby7(s zwPcQYQX{lRy>#lFcE{YMF_~AL)bnbm>MsvrQMLFbwbRF(BxT+Ls5{-AB&FMJR0GvX zrE!wfNN;@H`&Pppr&lNStP`jC)JeUdb{hVz|4|hC=VQpHm+2_IqjKBTNmAy0l)BTy HNmBm<5!Ix4 delta 96 zcmZo@U}|V!;*ofy%K!tDKZePOSg=d5nNGgVi7uf4lYpuIj|Mh3@~<@5Jb`}}h;Wqy E0RNmKZU6uP diff --git a/packages/web/src/components/project/ProjectContext.jsx b/packages/web/src/components/project/ProjectContext.jsx index d9fea9dae..319ed0bb2 100644 --- a/packages/web/src/components/project/ProjectContext.jsx +++ b/packages/web/src/components/project/ProjectContext.jsx @@ -7,6 +7,7 @@ * - userRole: The current user's role in the project * - isOwner: Whether the current user is the project owner * - getAssigneeName: Helper to get a member's display name + * - getMember: Helper to get full member object (for avatar display) * - getChecklistPath: Helper to build project-scoped checklist path * - getReconcilePath: Helper to build project-scoped reconciliation path * - projectOps: Y.js operations for child routes (checklist, reconciliation) @@ -45,6 +46,11 @@ export function ProjectProvider(props) { return member?.displayName || member?.name || member?.email || 'Unknown'; }; + const getMember = userId => { + if (!userId) return null; + return members().find(m => m.userId === userId) || null; + }; + // Path builders for project-scoped routes const getChecklistPath = (studyId, checklistId, tab = 'overview') => { return `/projects/${props.projectId}/studies/${studyId}/checklists/${checklistId}?tab=${tab}`; @@ -62,6 +68,7 @@ export function ProjectProvider(props) { userRole, isOwner, getAssigneeName, + getMember, getChecklistPath, getReconcilePath, // Y.js operations passed from ProjectView for child routes diff --git a/packages/web/src/components/project/ProjectHeader.jsx b/packages/web/src/components/project/ProjectHeader.jsx index 16f028dfa..e9497694f 100644 --- a/packages/web/src/components/project/ProjectHeader.jsx +++ b/packages/web/src/components/project/ProjectHeader.jsx @@ -1,5 +1,5 @@ import { Show, createMemo, createSignal } from 'solid-js'; -import { FiChevronLeft, FiEdit2, FiCheck, FiX } from 'solid-icons/fi'; +import { FiArrowLeft, FiEdit2, FiCheck, FiX } from 'solid-icons/fi'; import { useProjectContext } from './ProjectContext.jsx'; import { SimpleEditable } from '@/components/ui/editable'; import { handleError } from '@/lib/error-utils.js'; @@ -63,81 +63,79 @@ export default function ProjectHeader(props) { }; return ( -
-
+
+
-
- -
- - - {userRole()} - - -
- - {/* Description section */} -
- -

- {description() || No description} -

- +
+
+ + + + {userRole()} + + +
+ +

+ {description() || No description} +

+ + + +
+ } + > +
+