From 7cfdd0f75afd1fc46fe1a2e9a6b28cae4cabd774 Mon Sep 17 00:00:00 2001 From: ilkin-overleaf <100852799+ilkin-overleaf@users.noreply.github.com> Date: Wed, 19 Aug 2026 17:47:38 +0300 Subject: [PATCH] Merge pull request #36230 from overleaf/ii-workspaces-projects-page Empty states for the project list views GitOrigin-RevId: 3ce8e327bb675f3c63763e7599396020a4252025 --- .../Project/ProjectListController.mjs | 1 + .../web/frontend/extracted-translations.json | 14 ++ ...alSymbolsRoundedUnfilledPartialSlice.woff2 | Bin 10604 -> 10784 bytes .../material-symbols/unfilled-symbols.mjs | 2 + .../project-list/components/no-projects.tsx | 83 ++++++++++ .../components/project-list-ds-nav.tsx | 102 +++++++----- .../components/sidebar/tags-list.tsx | 4 +- .../components/table/project-list-table.tsx | 7 +- .../context/project-list-context.tsx | 13 ++ .../pages/project-list-ds-nav.scss | 60 +++++++ services/web/locales/en.json | 14 ++ .../components/no-projects.spec.tsx | 153 ++++++++++++++++++ .../table/project-list-table.test.tsx | 54 +++++++ 13 files changed, 466 insertions(+), 41 deletions(-) create mode 100644 services/web/frontend/js/features/project-list/components/no-projects.tsx create mode 100644 services/web/test/frontend/features/project-list/components/no-projects.spec.tsx diff --git a/services/web/app/src/Features/Project/ProjectListController.mjs b/services/web/app/src/Features/Project/ProjectListController.mjs index ee9dd7e9bc..6b42b9fc7c 100644 --- a/services/web/app/src/Features/Project/ProjectListController.mjs +++ b/services/web/app/src/Features/Project/ProjectListController.mjs @@ -577,6 +577,7 @@ async function projectListPage(req, res, next) { 'overleaf-library', 'import-markdown', 'themed-modals', + 'shared-workspace', ].filter(Boolean) await Promise.all( diff --git a/services/web/frontend/extracted-translations.json b/services/web/frontend/extracted-translations.json index c4b747df09..dc1f435fe9 100644 --- a/services/web/frontend/extracted-translations.json +++ b/services/web/frontend/extracted-translations.json @@ -1344,6 +1344,7 @@ "no_actions": "", "no_add_on_purchase_while_paused": "", "no_ai_assistant": "", + "no_archived_projects": "", "no_audit_logs_found": "", "no_borders": "", "no_caption": "", @@ -1370,6 +1371,8 @@ "no_preview_available": "", "no_project_notifications_description": "", "no_projects": "", + "no_projects_match_query": "", + "no_projects_yet": "", "no_references_found": "", "no_references_found_in_this_file": "", "no_resolved_comments": "", @@ -1379,6 +1382,7 @@ "no_selection_select_file": "", "no_symbols_found": "", "no_thanks_cancel_now": "", + "no_trashed_projects": "", "no_trashed_references": "", "non_blinking_cursor": "", "normal": "", @@ -1386,6 +1390,7 @@ "normally_x_price_per_year": "", "not_managed": "", "not_now": "", + "nothing_shared_with_you_yet": "", "notification": "", "notification_personal_and_group_subscriptions": "", "notification_project_invite_accepted_message": "", @@ -1608,6 +1613,13 @@ "projects": "", "projects_count": "", "projects_list": "", + "projects_shared_with_you_directly_or_in_shared_workspaces_will_appear_here": "", + "projects_shared_with_you_directly_will_appear_here": "", + "projects_you_archive_will_appear_here": "", + "projects_you_create_across_all_your_workspaces_will_appear_here": "", + "projects_you_create_will_appear_here": "", + "projects_you_own_or_have_access_to_will_appear_here": "", + "projects_you_trash_will_appear_here": "", "provide_details_of_your_sso_configuration": "", "provider_rate_limited": "", "public": "", @@ -2573,6 +2585,7 @@ "you_can_now_log_in_sso": "", "you_can_now_search_and_add_references_from_your_rm_library_without_needing_to_import_files": "", "you_can_only_be_affiliated_with_one_group": "", + "you_can_restore_or_permanently_delete_them_at_any_time": "", "you_can_select_or_invite_collaborator": "", "you_can_select_or_invite_collaborator_plural": "", "you_can_still_use_your_premium_features": "", @@ -2639,6 +2652,7 @@ "your_subscription_will_pause_on": "", "your_subscription_will_pause_on_short": "", "your_subscriptions": "", + "your_tags": "", "youre_a_member_of_overleaf_labs": "", "youre_about_to_enable_single_sign_on": "", "youre_about_to_enable_single_sign_on_sso_only": "", diff --git a/services/web/frontend/fonts/material-symbols/MaterialSymbolsRoundedUnfilledPartialSlice.woff2 b/services/web/frontend/fonts/material-symbols/MaterialSymbolsRoundedUnfilledPartialSlice.woff2 index 0c1bed5eb381f6e488d1e22949b364124970c4ea..379bf3bb7b19ed5638a558440ba598dfc8c83731 100644 GIT binary patch literal 10784 zcmV+*D&N(2Pew8T0RR9104g8=4gdfE09|YV04c@*0RR9100000000000000000000 z0000Sopc6ZKT}jeRAK;#5)lXrfrm`;dJBPE00A}vBm;q51Rw>40tX-r2OCIHWkl0i zZ4Zq|%!f=>EfeDHRRiLe-~RaPpa1?5I(*I>9(tYS(-&BlX%W1HWLmEb^4c=#0$ioK zGDuZw!t&;-0N0t6slp|YAN{61;M6BHLQmB7)6^GYLwd5Q+4+5Q)z7Ar)YQ~;S7>M{ zhro_mks|WQrdUr3cpxHW@{8=Y9PQ<7AS3e7|<)MTo6CI;k*%HK9Ux!J!| ztV>%J3ky~d3t0Q&B8Ux32ThR_?I&1>=ER!h;EH86Rgz%9k(dNoHH->Zd-*Y!_) z0I&TU0=xt+=#aO-UBoAOeTx47t6H{#!mdL~8#@=>gw7!sjhjxq|Kalx51+6Al4J6V z(y^!wB&6{SDNP_JfEey91?jA*a4c@fl|x9Rv_30J4hjw_6kQCZtK7Qi-Me&M*?sN0 zweLiGPsuguT>0D0xke2_2qDym@gJLP)f$|LqBX2bC7}%*^FNF^gD~9h(-xkW;CU6I zf7kiRAOQy5Od_^-k0bc+xPIU+{3yJZP$;|aj&c!w6Q6o1xB$ibss5K@{KD}E5S#53X{VG2dMB|RhUOS62>6Fkfy3abp$gh351LS#u}($R6M(7B=y zWRv3x3!A-D*5s0k4i=Zo2X4bnj4%!%awi?bKK{!wjz)$g79pZ2EYeF22HPm)NfYCo zS?5VLetLN_OyDL75xLkXy>@rO^b$HoD!4~W*XvDTeg!B$B zX2?T}-ba_EY+aQ(mT{A+&DuDmEy|*~mV+}#C+x|XHyZf3#Fio*Yjv)IdqwKB^h1|{)+7L$|;Z6gOr>qt(* zQ@Ap{fQH3TOykBNcDNI{6)t7Nxafl)v&tmBG*Q8bGsP)Xt`-=^(>f`Tbj?;iU=W84 zhj)4d%{2}k+XZUvIQ?ON=fIO7-)psH*}5{LXfzSWRZ~9O=gxhbmlP_;FS~cJim(v zNO^}a44`*>7jFq6XM2JJAnp)NSb#H$!i*2Ybm2Y5aR5M4V&Z5DfG7ZjL|{U?Rn7)B zV?gK{@cAhmOkv0ZSue|yiEPKpQHeb13#!qEA2LFICmO?kL$(uFqSB^k`|wT5?jIc4 zlS$Sx^JW@Bn8S&zQzmqjpbAI`HEp~LF9jH@ZJeMg*ajmVO|WhcH>E7w^gOhBG7xYN*Hs_PRdH4c5U(vXku98Ok1q)H~VU z!QDcYWg3-02r7hfKU~?8z<1os%XpB46bCTOqW9@bfEQ~{ygr>QMSMW|wB*T&wa3CH5J_$-(?GV-4*P#|@to07YGHZpt|o zAPI0Eyt0m=R?v%vi$I(Z8dPEM;492ico6I&?e?;gP@8Ud<%WJvCAT7a6G zbKsc!Txy`xk$18xUr$416Y(`rLs5n`!!$QP_M#y%OY{Uug?dFpX-B2u4RntX*;Iv& z6tKfE8t4=uWEc(Agc9p9LL+<^Pp#fO@@?rUR6bu$H6&RQc%s`}alxMU&d&C@P4JJ8 zl;Hobg3?0?^nF77L}<6Q+kPaRbRCfND@%v~Jh#k|SDnY1~XvXa^G~O`W5t zP-l)DHBHf=p~%pTtyYDqYy#BltiA$O$@Y)&xAHo+#1^HovqBHdprv;YU=cE51R_xd z)t_4ahcjEKqLipAYKW#{v^XU$id(`I(#&PHHrtz>%--f8^N7{LYGZY_x>-G~;nqXz zxfSxB^xpSA@y7bH`U?8USK2?w|HA)1kT=jO&@M14FgCC>up;;`7#Bp+j%$d;{$wxPw`p4$d~ygf9E((vvb>J?Fx2`of^s%DjaGT zb>d&Qe{*DY*+h1c)r%(PHj18t7sL+F_@FHXVfpWjrK-)1Ar$CcrJLxyQMqI{SI&o_hI)K zcUN~K*LK$+*DO~hS5cSZssTjY0V2BViTZ#2k^W5Ir|;0u0|4M?>&W1!?a1ZGL6T0= z2|7SG0f6q%3V`+lw1BqJF`7z4r~_@HF*J>OQy!{N=o3(=e<7n#qaLdL@`u@JeXeI! z+&}l+y?5W-H+RJybvFSw-yN~P?RmRW)|Hp=FCe-ft%L^vUz&gZ06CvG<8AZ%sujJ# zXLaXI2)*j-xQW}<`K!40i{^%2Ka(dBy?J+NEejC8nGOyGx}t>PsG~rEZkU20n2urS zhyECjF_@2D=!N;1kGb&BKsy5TKzTNL78xF9E~UX(j75-m^#A{G$z8VH!`uI&#zacD zKO_22rUL{oT5-!0aE!p(z!b0!1nife9H4{{yVwR=6g5x@*X(`amX(O^u}?}`QR_rJ zggQDFqZHFG+-4l^cnrFtSc0UYAh_9$phEX7XmFK<*Pr%mQQ)!3q;i@hm8`ZbD3e4i1foMx!v@fu;adb$wUq0 zF||$Lv~WgBD>1+J75a-q(1)fzU+{vUp=RU6 zpj{~=muuFxbXT=zu_7*baC?uxXAc0G-$SPlKqBeEbpERKXA&gR=JPpdW%S`xZa+4E zF;rC}Y%kC*kE9c->XKrfLlUa>2qe2kDa-D>IH23c}Tc7*s*-)=wZb*g6mr2e$A zsLn&0-)K4x6If;Mtz0#<4^yJ^Z*;tJF+%Q2 zPv=BOGQ=2O;-#&dxLGcbiKPz_3a1+uKn#|c0*W;O&8ag|LdE%0AA$k_9eu@=|2jWr z>ed3Xr}?Xmusz&n4zJe0=?v2SInh5oM=)xrGFW#1A3<(j1Xq6>1e!puVKdFcprsnc zvaw#147*60`G;C+m$LK??tERS;3V)hr{czxlLB~>eK)2|(=xf4qe)iwvZq3)YC)hQ zP#6o9Ik^^FZ1F))7g^c)kQlFFb%slts{5$Znmk5nR7gVvl<(A;*}%%JFlmlIQuXAC zBb0#TNBZ5jK_00CBu+WFtb%4X!RvgGr?^cFRfH`aE|v>YW(p^oYvslEEhQEPo54gJ zWG9V|XsE=h;!R^z=rmZs-ETC@6p5Td07%jlsrM6nq9d0_-EF6i^V)ELRj*2oH*P*| z!fSy7uhl58!E3?O_e(LQqrI?R-vQw-bHTi=FAuj>!m6C5k6UgXj>@7>z0OsxzocS6 zdW8}-hI6RbsC7nIhQG!?gHBIX!%0V&H%EaNPjX9lgPRG!(yeV`AS*${z0>*e%}?-f zg@DXdg05amfDqGK%`YyR9#*l7=hv8L6y=rVbTyrG8kb4axRO^aaV;qe>IjH9U{-6k z(^S8LDf#V(n%h4`1@X-EO=A!k@=Roc@*(~cqf5nUV^ATA+!a7YH)4l3i#|l+fPJL= z4}{2>>tRQBT|fAid@m5AGb^NRB5;;I%|bZ|xVb=>lRJr}yISEOx9BSmocORS8!|J&Us}aYw0VGy6Ekkvt-=wpzf zGx0zjzDylG*cweotSXv2WR{8x2r=_2>p6q?{00orxa8E9f?R!ly+QnEg><`$`A73jgKuV8-fG#WW_I0Xr0rXXRQi}@l`C}6Uae}C*;4%M za$Q|;aMOBH=Pn#=bru`!b4!?i)n>(6ocN1tw8=R?8aiTbA!tYc#@gHeFf0PC!vdhz zJSb5liC(8p@>2vAZ602NRqUUA9BYKv>$F*iS`E0$?i?PEq{Yw%1gKm*QVjymCY!`- zlDVHS)y&^x@HBgNTO>ve8?v*%70i_yI#$gb6Bd@SQjz^}HVLwE_8Y?=3sHI+*395~ zIcRtr%JI3!IAfH09yNoogVzvJ9*5O!xL4o6K!% zw38P++ElT_279x?10Bj;2|HtBEw<{?(a`pW`*Wf@HMZB^o#9cx7xw#&BDWB1>hk z6!`qg|35;gzJ7DnJjgii^@^XMUw+rU5)GFC0}Im!_;Z!lLXER*itfKNG^rBFO_0ye z{dh30ct`(Pgk3JTz}wnu-w_WRgMNR!ouLlIVJ>eY3Q!v1!)g=oyW)ZO54PBkMFf>p zd~1FkJJ_!oLYo@Dh`z{�Fi>kc>i%s9&54z&{f%MyD_<#^neO>^d#7r0-*H9x zs9il&yG7G%ilC|sj-2-Qfr@QAeTFVXIK~Yecx?XThRELNF(u~b?4x%BHLc1f{K}K| ze6wv+9M<`qB3)7vR29k(ql@AOOVg!eYOo`qH`m5^vxj|aw>^boY%0Psx*^Jf%2F2HJTD38cK0c85;fUsu^?6y*ae}KUT!Qw6MAx+kVHD@KUIhz6`9&$wMYz3Os>4CzfzieP&tyd;NmV($^DYBu%f$PG&8cVe-8+K+U zu}agls0;lS4}m+>Cy`oJGe_TK(nNrxI!IoG)7}(C5hueo6STBLtEmCjhr;ki^`oz& z8p5cMI@k`|VJp>&Buav9uuZR1Hkb%2+hHqdBHRHa=5$1oFNzFd2S@%Ug(d_F7_oJq zt2kwU8@)Fqm}?PWgii^-?2m4x-uismspeBHT@N0f5+C-qoNBH)AvS{SZf*T-*%*cLRM1AV@ zDOK)L$A?K?lH?_U6^2$>ek9ASt+L!2<2SNiRdG;UH&GRJq+j&N5u(^3iX)CY1SgNB zj!zvqb?aN@`?}|I#*a=lN4!sr8W692KP^!@95$S4jx_bwpq&7lUkXnin`Byc@*CyD zsbkJq4;~EW0S69fdj#KiyRn#c=Dk5#R)&VP5rL5W8>MTIsibEp|-B+r_RS7 zzEyV%*t@;nliPC9Rt}B)#w7g-%0(Lk{YG^Q0Q8vgy^A35buQkBM~6R);o6@aMm+L% zspAE~h0aJj=eR~>yH{yxR8Q2%(qi34Potb~wdTtPW4_I5mGgJm=qK2WhJ1N1wtU0L zY%zSrxpV)Ai`lEspPx7XWUV&K-1_^L8a;OYN)G%+1OW%(D_1a!aS)#VpMmj`2BQKt z!Cm{RY@qtT1@q`|T4Km!v*RwdtIPb)l)1-NwwwDZG6s%?zkk0P16R+po5`1xJQ`r| z_vzKQq%uqj!=xluoPO7KKRA6tSyoh8Nb!;>_qB_*<9~pw-_DM(uh3-#|UFV#Ud7 z@KZ^`s=BSPRPb7O1TP@z`2FK)K-B36K6)^iPD# z8>~zZw}tydcvG@NISm?BGNBcj|0w|gUc^fz@jUIOnr}h9#{ORnTP3L9ARtf(Pj|Iy z-@o?zv1;BDbWb2yQC%}~aG`?h#Q`+-t@NJK(y4+0;fC=E+yK2iz0kM;hhE*y#5it% zUSO}r$6rm1zf?1XtvOLPN~FOi_}S;#S?sj({6~<{Xf%xiHo-Ep8oMqTO{Q?6*~X9{ z0rzg#Zw*aw=PqE4N)XJ@m=PRVU1{LAB<4rH`7CgjucNgKrh>mGpP%CM8@r{>axBD6 z>SlFR)axNQV%)~|@?vi@(s?3AlHBI5KxSFsRr>!dllU)hk~PsD>V9Y!)_s6(8$p8y zm!g`{IB5Q@WZo7*Aq}-rIRn9w1_VdkAlxuKTqH4&(}$^>5~HDS=KX=&Y9dPb2&jop z3!Xa2Us1tPo5}>d<`o=QdCL;-WN!uLqw|jQC_apyBAr6<>VC48ziT$<_GI9MSpcQ{T61O7+#3CGumBT8=zXy8^Ra4cU;Xc630uqmpf*RkrfQcY@lLXmbO- zabshZt!+c${X!R8TfdDrZ=#tt2}IQHEw~S^{uZ>o8?EW?-ZWMNX2A+er}p&AOXj>h zaDrBqa){4E`B*x_UBZr2MyeyhS=tGZmnWBxC~+fJo^sg(0GxHk`xGs3KYW(_h<@7yU82$vL5KtAkJg30Ya zmT%Eu6s)2%CKIDzm{hL2+Yt3pnk=VdoR-lH`A@MK**!5RPU>_a z^JI?WJ%(&ubi0FJ7B0^g)Z4mJ1}MJwCg1MQ>BEO_Yr2Ivk{vl~V^PpE8Wf*96n1Eo zT08Cr6P$*-RRclrW>Px2?Og`=J zNB(Kl$n$-89HGa)>Fm3&LLdAu8+N;PTEha2Kd)U&hFq$%$gup&WYQLR-Za?*F+!d?ZvCCoZur0v|}{$i(4c!!A54o6SXhN zkcOL*Anp}OV&S3v+F>{*Bex#_z~HCwXvYCKK;!XKey0BI=@aI~I33cS?5D!e)CR^%wy%HksvHPsj;O+!rOK;~ZSnxv&OB5lGY z&F1uYSEO>bWl-Vc?}KQkc%Iswq15ZGdc86uwfngrMym8L3Mo~oPN`I-A^t^25onDz zeAQ{{#Fn%=9IxAbptQsmbsB;r8cYjMFSKoFu^kL52&tde4hbq4v~6jyEd;>c+={iQ zjw_b@o!_}j0anPwL+cVmwMOj}q1K)W%TH60cZf1TadWtF5Yv6<^&Nlm^k)zSHZ@^H zB7#6a*l+8JI_I-n=<~_Wv$t+_bWS>(ygQsHJ3DUOI@>vk|7`;)Zr>j;o5NaLy;@tn z+ZUSuuO4+9Gxl4N*Sff5z3_~D-Z*h1sm#UmRwBqmze7P5t9Su-4(^Jdh=<1HWWvCPY)OXT_!5R~ZG zO5ZbIR)IpWO!C29SdcFq}2%TmfAohJYQ007Wu`dwp{?7KFtz1CuJ zS!xvD-MV!TquRmWVsTlnw(bpUoV=EnU^%wjTRHoG8vjJKY`4G854o{q?;9Fj>A%aK zJuzdQ`s)_IBcX#P_y4P5mD#3vHN`+W5fjnM_xfk#tRHM zbP&P~1U<$_+Ok%^GY+;qN#p717NSAhU6h$=E&~F7qo7fj`blr)(VfuCI+^a zy1NaPOO>9fsY*|2`H&l2hirBhOY8oa3UmChwKW2_RhF&4Gnjo1sS=4K-sW-RPLFhd ze~Q4dML38 zV^Wyd)&z0AP}mksH8+z^@|ub)N0+I9xKw|)zfz-{bMO86Q&4(URXVgK=s}^1{ zQjzU`-#x}A$hXy5O>j96hJNe+@Pn5fCw70ir|vg;`=BVNaE=*bcjEoNe~>YV;djty9!R%>;-zfg(_A z{IhJIU~5bg`e?+{;^P{quMODJ7~7L+JM z`>CMT*n?ZA^bUHf9%l>uRmW8W4ui)#RQ{mW=q|eQdaH2j+dCPc))*|B|DhwJBN(iJ z3J! ze9uZMT`jbd-ZK{co3y(A+kf)D`$xK(`!A?9R)(akPFz)Jlm;iRX1oKRLsN?f&yde7 z9-PuI9zI1rwRrfjSZz{i$Qsi&b>9V*maH{(f?DI6&<$`dH$1yFEIW_80S-0VOCVYs zH^^tj5bv0^n4~$)xk(f^M5-f=8`312=DcXCOOq&Wh(t#kH@HbO)g>csK>v_2I%E2W z4j9-!c%06-{y`rF$wM>A1IX6u6iwo*YR7ZjP9tt-L~i6TQCRrS67HdGiS`>mJki|t zL)4;}uNb*1bj`AL{=W8AJ|mbu-LmUldV({{MrLj)zWHfoy;!k8F?w3SnxzxngG|$$ z>MWb}<4;%}lU5bp&Br!wI9tjNlES#ybmp(m11?oFG zRax&5OBz*6f@g8Tii;b^q!ZeO8)=z z|F6_(5L_QkP;#7rTq&NxB*^hF;16>M1%NJvoIH@lBsj7hs!3K7NYGtQ%px?25~2VN zSYUv)e+mBx#*04>9ES4A%5ej-7e6@9K8R`1M+cWvID{euUg-JxGDJbP0Wm_e4Jccw z_*G>PJi!BVyHqN{0~JWhv7C&MwPwxy3ti{bF=L{qORLDVG%@ac5rGgQ`yvvWMBGIb z^6}~-8Yx(GkpfIH;wg%VLySdyuc|`8MFdpgg;~>-F~HPSr49_$PZmf=1DYWN4*?QX zpaxZ_Mk_MVh*r#HmJei*Q`?OSB%&GoTp8H})PTzhNCS^n-HaM-K_+6Mt(kcf*7sDc2QnMTdAbJJ-C(boVx er5_4GSD+;h-2TEIGc1IZ@cMQ6F5>_2P4svOfv0Bx literal 10604 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 G0001+Y?vzm diff --git a/services/web/frontend/fonts/material-symbols/unfilled-symbols.mjs b/services/web/frontend/fonts/material-symbols/unfilled-symbols.mjs index cd75514c59..2aef7d579c 100644 --- a/services/web/frontend/fonts/material-symbols/unfilled-symbols.mjs +++ b/services/web/frontend/fonts/material-symbols/unfilled-symbols.mjs @@ -5,6 +5,7 @@ export default /** @type {const} */ ([ 'account_balance', + 'archive', 'arrow_back_ios_new', 'arrow_circle_up', 'auto_delete', @@ -30,6 +31,7 @@ export default /** @type {const} */ ([ 'edit_square', 'error', 'experiment', + 'find_in_page', 'find_replace', 'format_strikethrough', 'forum', diff --git a/services/web/frontend/js/features/project-list/components/no-projects.tsx b/services/web/frontend/js/features/project-list/components/no-projects.tsx new file mode 100644 index 0000000000..f9ea0addef --- /dev/null +++ b/services/web/frontend/js/features/project-list/components/no-projects.tsx @@ -0,0 +1,83 @@ +import { useTranslation } from 'react-i18next' +import MaterialIcon from '@/shared/components/material-icon' +import { Filter } from '@/features/project-list/context/project-list-context' +import NewProjectButton from '@/features/project-list/components/new-project-button' +import getMeta from '@/utils/meta' + +type NoProjectsCommonProps = { + showNewProjectButton?: boolean +} + +type NoProjectsProps = NoProjectsCommonProps & { + activeSection: Filter +} + +function NoProjects({ activeSection, showNewProjectButton }: NoProjectsProps) { + const { t } = useTranslation() + const usersBestSubscription = getMeta('ol-usersBestSubscription') + const isGroupPlan = usersBestSubscription?.type === 'group' + + return ( +
+
+
+ {activeSection === 'all' && ( + + )} + {activeSection === 'owned' && } + {activeSection === 'shared' && } + {activeSection === 'archived' && ( + + )} + {activeSection === 'trashed' && ( + + )} +
+
+
+ {(activeSection === 'all' || activeSection === 'owned') && + t('no_projects_yet')} + {activeSection === 'shared' && t('nothing_shared_with_you_yet')} + {activeSection === 'archived' && t('no_archived_projects')} + {activeSection === 'trashed' && t('no_trashed_projects')} +
+
+ {activeSection === 'all' && + t('projects_you_own_or_have_access_to_will_appear_here')} + {activeSection === 'owned' && + (isGroupPlan + ? t( + 'projects_you_create_across_all_your_workspaces_will_appear_here' + ) + : t('projects_you_create_will_appear_here'))} + {activeSection === 'shared' && + (isGroupPlan + ? t( + 'projects_shared_with_you_directly_or_in_shared_workspaces_will_appear_here' + ) + : t('projects_shared_with_you_directly_will_appear_here'))} + {activeSection === 'archived' && + t('projects_you_archive_will_appear_here')} + {activeSection === 'trashed' && ( + <> + {t('projects_you_trash_will_appear_here')} +
+ {t('you_can_restore_or_permanently_delete_them_at_any_time')} + + )} +
+
+ {showNewProjectButton && ( +
+ +
+ )} +
+
+ ) +} + +export default NoProjects diff --git a/services/web/frontend/js/features/project-list/components/project-list-ds-nav.tsx b/services/web/frontend/js/features/project-list/components/project-list-ds-nav.tsx index fc8d715a4b..c043246381 100644 --- a/services/web/frontend/js/features/project-list/components/project-list-ds-nav.tsx +++ b/services/web/frontend/js/features/project-list/components/project-list-ds-nav.tsx @@ -24,8 +24,10 @@ import SystemMessages from '@/shared/components/system-messages' import overleafLogo from '@/shared/svgs/overleaf-a-ds-solution-mallard.svg' import overleafLogoDark from '@/shared/svgs/overleaf-a-ds-solution-mallard-dark.svg' import CookieBanner from '@/shared/components/cookie-banner' +import NoProjects from '@/features/project-list/components/no-projects' import { useActiveOverallTheme } from '@/shared/hooks/use-active-overall-theme' import { isSplitTestEnabled } from '@/utils/splitTestUtils' +import { useFeatureFlag } from '@/shared/context/split-test-context' export function ProjectListDsNav() { const navbarProps = getMeta('ol-navbar') @@ -39,9 +41,11 @@ export function ProjectListDsNav() { filter, tags, selectedTagId, + currentFilterProjectsCount, } = useProjectListContext() const activeOverallTheme = useActiveOverallTheme() const isLibraryEnabled = isSplitTestEnabled('overleaf-library') + const isSharedWorkspaceEnabled = useFeatureFlag('shared-workspace') const selectedTag = tags.find(tag => tag._id === selectedTagId) const showTrashHeader = isLibraryEnabled && filter === 'trashed' @@ -142,49 +146,52 @@ export function ProjectListDsNav() { {showTrashHeader && } -
- - - - - {isLibraryEnabled && showNewProjectButton && ( - - + + + + ) : ( +
+ + + - )} - -
- {/* Omit the survey card in mobile view for now */} -
-
-
- - + {isLibraryEnabled && showNewProjectButton && ( + + + + )} + +
+ {/* Omit the survey card in mobile view for now */} +
+ +
+ + {tableTopArea} + + +
+
+
-
- - {tableTopArea} - - -
-
- -
-
+ )}
@@ -195,3 +202,20 @@ export function ProjectListDsNav() {
) } + +function ProjectsToolbarMobile() { + const { t } = useTranslation() + + return ( +
+
+ + +
+
+ ) +} diff --git a/services/web/frontend/js/features/project-list/components/sidebar/tags-list.tsx b/services/web/frontend/js/features/project-list/components/sidebar/tags-list.tsx index bd101e322a..3d0e730e9a 100644 --- a/services/web/frontend/js/features/project-list/components/sidebar/tags-list.tsx +++ b/services/web/frontend/js/features/project-list/components/sidebar/tags-list.tsx @@ -13,9 +13,11 @@ import { OLDropdownMenu, OLDropdownToggle, } from '@/shared/components/ol/ol-dropdown-menu' +import { useFeatureFlag } from '@/shared/context/split-test-context' export default function TagsList() { const { t } = useTranslation() + const isSharedWorkspaceEnabled = useFeatureFlag('shared-workspace') const { tags, projectsPerTag, @@ -40,7 +42,7 @@ export default function TagsList() { aria-hidden="true" data-testid="organize-projects" > - {t('organize_tags')} + {isSharedWorkspaceEnabled ? t('your_tags') : t('organize_tags')}