From 53fac741d2b9489caef084c7d0db0b57dba124eb Mon Sep 17 00:00:00 2001
From: Marien Fressinaud
Date: Sun, 10 Mar 2024 18:03:15 +0100
Subject: [PATCH] new: Allow user to accept to be contacted
---
locales/fr_FR/LC_MESSAGES/main.mo | Bin 57032 -> 57632 bytes
locales/fr_FR/LC_MESSAGES/main.po | 153 ++++++++++--------
src/Application.php | 2 +
src/cli/Help.php | 1 +
src/cli/Users.php | 11 +-
src/controllers/Registrations.php | 12 +-
src/controllers/Showcases.php | 2 +
src/controllers/my/Preferences.php | 14 +-
...ion202403100001AddAcceptContactToUsers.php | 30 ++++
...00002SetAutoloadModalToShowcaseContact.php | 28 ++++
src/models/User.php | 3 +
src/schema.sql | 1 +
src/views/my/preferences/edit.phtml | 13 ++
src/views/registrations/new.phtml | 12 ++
src/views/showcases/show_contact.phtml | 31 ++++
15 files changed, 238 insertions(+), 75 deletions(-)
create mode 100644 src/migrations/Migration202403100001AddAcceptContactToUsers.php
create mode 100644 src/migrations/Migration202403100002SetAutoloadModalToShowcaseContact.php
create mode 100644 src/views/showcases/show_contact.phtml
diff --git a/locales/fr_FR/LC_MESSAGES/main.mo b/locales/fr_FR/LC_MESSAGES/main.mo
index d803680b67084702478859945eae90fb906fddf8..58091e1f312b0df287f1eeffc0e8a98d4dc11e01 100644
GIT binary patch
delta 12528
zcmb8#33N?Y-^cNT5Q#)agaj9f#1KNv^DKs-YOFEhrY@005^AceHC3Z(tf6LV_7u^Y
zYY0^peNaOcZ68%ys)kloY5RVE*(ZIhcXhpMy=Sd|KYQsg;pIc#DGyER)
zUSy1A)x$REj}x${Wx1_cBxuuGh*fa|F2-{>5J%LqtQPnwMq;tr1jb?!Y>vU$4uh~C
zdSfc8;qh1r7hwt9j~c*P^rU_3dlJW)=+@fClTgLIQByVugK#3!d20@;
z!V}1HTc=Pn^*cskn?`gRN21=FhgzETSQ)n=lWU#Fp6JOmHpc;tnSVNMEvH}sUPO&-
zL=&@Cpb8s*gZE9KUC(DJZa0#lSTvUTT>^Kh$LalWOmc|;WJrjphum@`3Uo>O>
zHPzQCD2#XTFg`$4xRcr=a4(j^uQ3=Oqekk}!faj#s=PL8N!p`kv=6G@!5Dx^sHGZ<
zdM?XNLKQDV^>7zzvm8dP{UuaIKcg=`MRnM#rJ1QfEK9xuYQ)V^9qWl|(1m(_0%|~0
zQ8Sc`0%3ZDDDfGrG7=<^nJoipP~kE0ln}$tc3T_7lXQ(V^{%ozbdK&b=)MhNg81x?19Cx
z4{By!woOA#?Ko5i7NMqg9jd}jsCu$d9XXA~@fzy>kEo9RikgW6tiw!n7bT%xJP-Ba
zIV_0RQ62gYYvB)A9YedBy%2{QnG^YHTNy~**85l-|3nSI_XTr$N}@j5)v+NC!umS@
zOGs#{&mx}!>n5^1R+a9S)fC5|AMQep{1~d@vsetjM0MmQYHfc(J^u`KY<*rd_bZ}0
z7K3`PIhN4*??ggVlYl{(jOx&2RD%mK5Z9n8{J_3{3N@AApc=e|{`eS!uxJnSd>HDv
z+Nk;(qB`16<+N{gA)({d6E(7QR0R`IJ$@U5aRmloHtPOyREI93Hq$-({v%XJJbRkw
zL$Eygs;K%pqVD%aw+e=nP|wDpdNv)G;%q#IReG7t_7id@-$qUO6V!mLzQ&@c4*Fw7jO@$&>lk&UKoxYwtvDFt(f1|uGoc@LCchTz;eFH+
zMD{bsvN4t;-xp(WEIM!#GFa{f>F2#!|*VU#cQbNd(rzAn1)({9jNE8V_7UV)C`~sGDfQZq
z^rL+%-7a_?wU$}BflE=FY%^+xK0;4CkD8II_#y@j|d*%%e+4ab?nyJ
zZbxGV7
znwV>sKSMPf!SuvoD^xvM7>RdMnSZTWP@4I9-5Ygd0@lT~sHwb+4KQ|;`E52C_1rwv
zZr+FY@UdNfi|L9b@0VegpfxTe-y37_E;hq*Zq8CQ5(7{por!yKBRX)%XtVZHP*c1F
zeQ_&l*Y86e!}I8acTwm2cT~qqjxj&~(=dSic+~r|ur9inlITz3402Me=vT}pnu{-x
ze~5g%tTvpr2wa6~_+!-Ce`Dt(#+ff@a}1%p8jDXmu=O2!
zW88SN%U{HzELRW9NzH1M>~`ApaY(3Re89rXxA%Pd*o$
z<24+~{pq^txod5c&RC1P`E&Qx0lG7f>^J2Q?t;En`tsJ^r>1+ZfvxZW6vc&<(wDAgYHh
z)Q{Vls3lpA9(WOJ;uU-ei_JEl(j<%|KL>RR_MmouE;hgmsCtUOZT^i)YwSzjy`Mx2
z5+&xa*{~PtL*p^m9Jf+9ihK;Za1GW%pLwRjW~fb-ftr~QZ4aW>{upYrUdI3|z){(b
zLC8$Gtz#tedWx#x0$#zZ<^gNZ0<(sPQRn|AYAyf5G8nqhG*k~YV?EFxlTr1(YC9E6
zkk3MOY&DkB&;LVq!6nqLeuS#Hz&mEQhoKkwrWlCr(Fb3`Abc4s;RFoBm8gy$z>;_Y
z_5P2j4*hET2kP%n%VUvwusaqf@4^x|7K3p%YEP_1%~TF*ljYj^^QZ={p*nO6OX5@1
zNCOv}C5XW&@?B8_9E^e2X(=TbBE
z4%=E-k@8lk`%cshOhRq;X-k>^T_omEpb@ow*PQEk^dr9*wd*&c1Gk~h|7WPpV*8t_Aq|Tuj8XI1uZu;TKbMFCd|*AGy|yXf*2h
zOvNg=5LMwJ)EZvL&iEAdUfeoU-VMu>ccG?wCTdfz#%j35&R;?;?SGI{{kIjV!%s16-NZKi9eDgGX{_8#laZ#aRdC5l6Js0Zr!4#Xll
z|077KqIA@VvQQ1rM?JW~b{A?Uj-Za^4b<~bPz@H?VE)ANL(M=F)ZXcVswc@d1B;NK
zjEiaCnn9uiIyRb-4ab7yCtzWmgtc)h#^P?&?!AMW%95MR9;u8Y$qzy`d>Ym8*BFLB
zViWY*%xqvgbhjh%HVJLIi#P!9Vjt|Z#r#pZ4z=5FqbhuYURY$S8M!~I!E&gP#h^M?
zAGKudQ8P5a&W}Jn|JqjOzZ{AA6sUonsI@(UT9R{E4DX=!$YWH60o%-{I1-DJZ-jcU
zHEQa6UN(
zI<_3uk=>|{A4bjSW!w8$iM;3gW^YwP)zjQ<7xY9;i3`=U37Csh@G5rOZW@T*!4Dkr
z^-vYAKp#Ac8ri?mfp<|OFTT_Kc&>ulL&>NaU5VOT?kyxV!X2oQoJ4JwZ&4$$vQ0y!
zQB&L$8(|kLjx$lGVlf8be$>cLqxQnLsD^H%26i9S&Tm*%=Rc4i03H-H#md+U_o55C
zVx0{H1*0(uHIfAwf}61h=AfQ?h?-(=dh3f3*ac%z4ZMz;sTHW_FJmk|K)n~Sk3FLE
z--1Lu_QvV>9_mz7-*48k6E-KGjHPia&cToEeD4FMd=!?XJPU{88XS$j2h9Mcpf>R`
z?2O0Jtq}%(WFCmZ_T*b)b)1QD_#rmKzpx=TJ7hjUV=;^TS}cP#51YRiI-)wf4eQ}u
zWUa06Bc`KWQ3G`yVg18M+^0Yf`W`jAxDECuKLl0251ZfvR6{j#%)bZdfU0;Jw!!VF
zkw3x?IQSTU@#1FG$Rm!MrRsv(y#0^6&4*+J1=`({P*eD}?RqRn{vZb9Rn#tifUWQe
z_QfV2b7b)yRD*#h_(tGcsPBUHiTNUWq4r8?)Ul0plh9h!!Ls-oYU)>_8qURucn9a=
zu#@J;^6%J*eE6s4zn-O`I(`DH;a8~5>V3*|upvf~pO1cc0M(8=mqY~;Pf$}Gnrn7x
zcdSc(I;x@rI1TS$XB>6fd>1~#81mP#CI)?GesO7yRmqRWa9o92(&OmDvj5I&&uz^h
z(UF3WP%n6$F~2g^L2bHZ)C*fM9!s1xn=27@oYtZ$zJz~Z&2wg?(Vv?R^+Ij(>6nen
zFb=z&SADGi5)v&axP|Iz)CIm)7?07|;G)^JNvJ8Fj6S#sLvfw$Ve}<`6}5D?QG3Aa
zlKJ5?5w&@zV<4`^TC{KNBGC(PVlp=Uf)WIO~T~O~2LAO7NEE4MJGStZYu9{sNW*dR3xCWNQmZ6<4b)WsfCW&U
z(DfRbID)-uwZcn;gY;I^cR*J)(mxTaNv}mG(VcV!;wYgd*+BR(6@_U3?`t&=Mo{Qa
zJS5$g&?uh2>QJU77>3VZI+}5W7om}T%KhF%8flGS0Q_dZQ(k5EuI+$?IYEQ}fCHNTd-#L_OjL_a_iv688yR*_8Vee1EKFxF7psBJnlp
zLs$dzudyVwc^{}i<3B*u;-Qg5RlD)Ky2VUKlf%6M~I=6>0@_}D5>@TjD#+IGQTAj@xc2S
zL<8lp2oX!XXIEB}^l4%X(TIp9boDdj{aWt9yKme1k9jZKPT#QWu(Q_9Zgy&?t=oQ}
zhV7pGC-DQ~CgtUy8~Hr)ODWIA?{LWc*TRG5&k6U)4|f&rd`0~4tD{}87zcBI1$Mvz
z#9{m12+}=B_s1WwFfC6eU69yHzBmz1`XEt^bpCaZL{rLk7GQ(5C-Dvi2{;oQ6CaYk
zO5|T>Nw*^w+GW3TBbUe_pNMZ^E&K&T?crA-{VHX;vPe(FBB;xoXA0z{?G3(w3_s7U
z(^$x^pn&b~_DeptE%0ZaZAq*oQi-XQ)y7y{NBls%K;Dx&-XQ(_Ro2eTp!{nsXjKY&
z6G22NUZ_HZlWtFJ=KfeBhx8{zFXAboYcsKodu4dO3F_KlyN2`>(%p%4VlHuwvVC|(
z4{{wO^2Xne#GAwkZeAd+k{&_4PWl${6X_C!u2k{^aUT&*!muoo
zu^jK+!Pkgegsv~SSJ));{@IOuJ*yBu_wvt#yS{GNO~#X)&LfYA26-=-->7Sn&%er%
z)~^G963KRXao+!){5GOCWhLzT$macZc8anV%5beSSdVa50sdlWz|Hb@MHv)sA|~4T
zhNRymx)8I7Qp5r71=7Hqc%0~}p|~BCc#->qC+efF9=L_*K-x)Mv&+w6<>$J%g#32y
zk0C}9!NfD-3(AMs?~u*ABKYUagg;S|I^M$nJohuh`i2)q6XS@w+}w_Vn17uiuj@yH
z)tY=~(oKn1h|0u9r74f3f%{mQh@tFr;wb3^>`4@{2a)&R?8sX!xml3HOw#`%t!o-K
z!4Gg(UWxflGsM1c7g-+UPmy_opXL{0l${R1R?n4p;ki-d_YzTVyC=GTo4Cx)Dp(ai
zBXnh=x1BzWJ&AXTdqf-Vn`4ppXx={}C|^h_5Op;(y7D5YLF8iT5bmO+=G^{`!l2XJRmg=dmbJfex=H?~Ct{*L8{b
zNNGn@+UOz4uEZ+Y6>Io;w{fOrIxCZ{=E
zBh%7T$2c9C!<>!`XZjddqSFzTnwIHGO-V?uQX@OM!6DyZJv}aUbh;xg-I?S}ccvsd
zGqQhZ+pTC(-b+Xskx?PLUYDMwTG@4u&iK39h>Yrb(~+2v;z&t-#gUMh_t3jjK2GwF}%@3XQdx1LHCEdY3gIeab;Y@c7
zy*_zK&gRVYzb7DP)Ah+4oQ|}Fbf#o`2qN5?n)hK4+C9VPwvxWLIiBx#Z_2
zBq?~Ms_wM=rQIEFfz3SRrCMm1k~b<(Xd&hd_+Ih!(4(^)Yd|NjhY
c{)D4-vYkgK7K^Ye`lrVJJHqTMr|(YF4cpHEOS>R*j-o
zTUu4LT3XstbPw8U%k%mE&+)w6*YnH!{La1i+;h*kiRXFN9QQhN*vtJg#Cx&BQK6vY
zL}RC5$N7eGURl*TPDGO96vdLL^W`uM8)9GVjCJrZ*2MeR9TTfMP8!Zc-FF&O@LLSR
zsAR_};yA8TnF7yrYGEa8j!SVQK8JqQco+`E3b+;h@DudGuP_vEVR8HieKD}Qd2l3_
zBd?7m@LALgjKIP?-Zcr*Jmb$4l4@gL&P5bRP4tQ!U4t
zj5kpCW%IhRxDfTgw=fbvz}0vQOYwYXMs3F_gX^&goZc<;&>71oO2u1V41o+9Lu3br~@Y8
zYZ!+oQTN?NP02%y$3pcShrx6z9_}J+PPPc@qdLv662~jdlxlF7w`qVjoFyp
zz;ReN&M{PjzoHt7OEnMdgWlwWQ1=hVk~jmkR@UG&+=hDdWLBm|xLz9LUx-2m6-Tip
z>J5Bpy*vhEIMzljvbLxcUM_e71?yZ
z<1^a-ITUo`QG3BfR0r;$hU}5eLo&>wOh9!Y3j?taYJ^6iMrJCi0}D{?zJZ#Gw^1*0
z6t(8gcyiZqdNkpqLq%UyL)%d|97J{G7$)PVsG%*=)GWS8)ChD#?Vg^fZ8jOT_~xKS
zW&>)j_o7DhLsUoZVgS!~exon|^;OXgIjDxmTc@DjY^KeZpf~v{jKg)P2b{qgcpWvj
zp}bWWOhjJRc@g!3XD|jYqpKnQlY+j0zAelUr=Z?w2x{BS#&~=i^`IMA3I9ed!ZR3PY!_oHq6x7r$L9Lm!7|QdV
zy%hAo4=@BjLpAt4s>cO7nxPCsJ+Kr8VHGTnX{hTvpoV+^s=Z;Tj!v}oFQP_t4tk~<
zi}QSEHwE?hB5tT=sPegSj)#h!m40$%HywI<^zl
zu|w!Cr*MM83Cw!hEV4L0%=iG{v}o+zvoiWke2IiZm5Hm$=jfAoPfGNM8WC?UR)-^z=eka73L47(SQD3G0-nQYypLnC
zcrVk@JZwn*2I{`=P}fKBTBWcN>IJfpzB@0V+PREcq`zYsEZ;|q++{c^)TLqpYEC}D
zNcJ%cVXohMi3w>}H
z>dnU>7dq3>3zwi8Sb^H6>#-odgZk1P$HI68)y@s{#@nd&engGj15Z8k?>*k^}{(;SXUNql}IMj75QB#nGnu0M{
z11FQZZUnP`2@d@<;nlU
zC@eS2EXs7eK%Ry1Se=`+4ZC7CPDib=Td0oRpUn{KO)JeY+o&4qO)^kJ*A?|9L#<;_
z4NSJqwXU-6KyAY#=!<8u41S8?_$O*A0`ttGY~oU=N<~ZThU2gzUc?Ic5ViW_Up9-a
z9@ZhxKs7WG*`dyE?1~lVn%|Doa69=4)c0lNJhRKDBi}A(73QEDG~cYs@u&v3VPm|3
z8kx8S#zfQ_sE%5s?JyXJ;Vztl8ma0FZAVe}XW$q36zY6DTS`-xglv1)=|n+uI0Pec
z7V1IkQA2hdgYa`ygWp?!LrvA+sOtk?G1pf?DQL4=A+5sHLU@gORy$Mx%y)u5~q*CEtY+_z7wRen74E-|;PchhTELIWzan8sr(%tJMN1@)%aF#sQ--Y8&&nd=G|OP-FEuqUd+c^HW+
zk#CN(AJu;9Yo^_{sF8l=HO60altqOW%TRm4cuXRnf?5l^ur^-ADD+>+e+7pL*b*0^
zrs^7Mb^nTC7{1Evt|Y8Oo{eg68P>(aE`O?onBV8o
z_#AmIeuiJ6hJ63)=7o-;M&cu^h}Ti=`K~onR|PfFZZitHagjZ-0?UxUh2eM+wHSZE
zM7(eFvg^#8Rz~ff2B;Tki4Czg>i+epkvU}Z^Qhf$8|k3yJfsjoMc{g~h!RjkTmv=d
zZLt>iKuysiREJih9=sW~R`#OWIgEOt%cuu`iMsAL>mw{n?!Q6X(Pg+P=!Pb!2e!h>
z*bVgtFQFFCYE(nJQ4c(VOYtOX4LtXT8S+h7ko*7^!b4ack7EtIhgz%^H}cXv-|0l5
z4)(zzxDxe1zfII)P5a}nycxk>sHu&GwS+xurz**dcZHJMfV6b6+v6glvPBnjasPo
z+F}Uy-OBhEp)i&T-8cm`c3RcZX?z&`$o;Cm)4s@2X3|pMrje>dgW$1`|PH>h1PkYR|yS(uJnuq58a`RM&Nx%U5J6>ul2!S`?=
zUdPdxdC9yY&pCZeWpFS>Im+@KJN
zLynk#7|cZV_M`@2!C0UC
zrDKf0dh#w6P4Fjdi8YQh-#7{N#($xvDE3{mYO7)hc^Ya}w?~a!FY7ogO+Ft(aVKi=
zp1{U<7Q15L373^iA?Jj7;7uG!o_*5n*H18z{3@ygKcKej1Jo20K4spx6Kcpuq8_{&
zC*l!Yfb~zCU&H4xll)J71~c3hcO-fJ~AE5M78JQf8cydA%TiZ=S@c*qV{dl$NT|_
zO|S+2g=(x{i#pKC~RdNfC1Y7FH+E)EyR(y
z8;fGxC9_(SFoe7%YJ|F@=58(y#+%p&J6tyZGu}R&N*?p68L4%s7yKMGrCy(zj`Y9~
zp6`sKP#N>EEFM5@v#VGf@1q*GN;!~)hdKwGj2#my0sBJV4b^Q|b#x>&=O}=V=IV?vF-96L;#$GcGPeCoB#W(~nVGGRo(sUpXQ^*%!0c=EQ
zk(DO-33a?_aPH^=j!pQL=6?@KF_OCWL<92j!~^num`JoDy4&+flpi18P?tj-qM{a&
zK?ITOrREYXiDdGjghul5@rc}WX#PvsvN-+t1ZCEtwut9A!Otz63n%!dcou9~TFj*U
zA$7~2xNpAa4%WyMbro&h@h9ryDZ3Ln@dJe)aRpu^dK0V2eQcNg$fGH@p>7Z5C8(nv
z@e=Vov7V^SIUPH!&!HA-23935P-b^}{z+B|r|AE|N}fn05i{($ETik$Sh|TN?nKy=k&NA2iLu6zk)!<`U<7{DNFZe?tEaWKA5P3XY@Xw}_sU3!{z?hEU5%!QuXZz(s{b!6qa_C?Bn5&H;!S$MvYo(uW0me@@F2ttQG
z=v6%>_8)bZ2>$}if2^$>ZZC|Y;mMR^Fo1J|ZGBnnL;OvYr9P1JBP7w>Uc)aQ=RWcH
zSVjHQMBwA|))-vFMa4D$@q~`os60f}BubK>!EE9fWiNY;t}92m67`*l2=Y?oe^P#%
z@@hPeOY!kh!Im3R@gdQLc$vDV&^7eL$~z9z;{cY}D3
zczhh7eh0}ST!>#23n|aB7hIv)6MPx%j=k6EhZ
zSWEv){*~)I--e|wtNM*5uXzO**abGoPO|p&vBife-ZC;
z!FlXN=;%Pco%oJuN?rzg5;`Um3B(Md6?Lx=`IO(nc{m;4CN@!ieAFPHWs{DSJ6KG@$-4&L(;g?~^}y6lKKPQc;gMsdMBV>;?Z~6m>_4
z#YAku|G&SvVlI`z6uYAS|Fu&n7shAFy-~;ehX4OOXG`JuBiH$J-DvDZv?k8j^KB`|
zaqczpy+kSU?>zg*Uhp{;TM7Na7Eq91j$v+bipA{dWt?h4gpgmgbsNZa46v$Pk@8IR
zB{rynqqf2EvWj_J_Xwxidv{ZgBz_}wysXK|q3|s+ST!6SiAa0H9ZwCNvH2U=g;-7f
zKg5@mOWQ%Smpa*x3z)+BNrW%gbVD7lVhV;)w@#a55=jv%3)l;qkyjuJa6xk{MEzMJ
zjk1n&l#60N97D7qz9*hMylg%Q2XZ2Y7-cU=pe~olBY#1Qb2o{OQ<#ongiE=Ht^Y+Q
zIZhLoh~Y#Ddu}YgORl4!ty^N9f`#np)Zlz5<(r->&8B#r^X@bJSVrYt{D64fUhq3!
zCcjDOXoTBv7~wuIQA1KBo7u!Grtu
z9+fjJe_m2S-~20e4hH0JZPvO-zE|50;rYw@oh+I^b@;(zK{cu**R7IVC#G6Tz2ua{
tYslouUAlhqm?y%^QUfnJ~}`9#16mwy63+O`X4>?SZV+O
diff --git a/locales/fr_FR/LC_MESSAGES/main.po b/locales/fr_FR/LC_MESSAGES/main.po
index 71876f37..1b6f0d7b 100644
--- a/locales/fr_FR/LC_MESSAGES/main.po
+++ b/locales/fr_FR/LC_MESSAGES/main.po
@@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: flusio\n"
-"POT-Creation-Date: 2023-09-08 16:05+0200\n"
-"PO-Revision-Date: 2023-09-08 16:06+0200\n"
+"POT-Creation-Date: 2024-03-10 18:30+0100\n"
+"PO-Revision-Date: 2024-03-10 18:38+0100\n"
"Last-Translator: Marien Fressinaud \n"
"Language-Team: \n"
"Language: fr_FR\n"
@@ -10,15 +10,15 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Poedit 3.3.2\n"
+"X-Generator: Poedit 3.4.2\n"
"X-Poedit-Basepath: ../../../src\n"
"X-Poedit-KeywordsList: _f;_n:1,2;_nf:1,2;Translatable\n"
"X-Poedit-SearchPath-0: .\n"
#: assets/javascripts/controllers/back_button_controller.js:47
-#: views/_layouts/connected.phtml:221
-#: views/_layouts/connected_blocked.phtml:180
-#: views/_layouts/not_connected.phtml:147
+#: views/_layouts/connected.phtml:225
+#: views/_layouts/connected_blocked.phtml:184
+#: views/_layouts/not_connected.phtml:151
msgid "Back"
msgstr "Retour"
@@ -51,7 +51,7 @@ msgstr "Afficher"
#: controllers/Links.php:270 controllers/Links.php:442
#: controllers/Mastodon.php:211 controllers/Mastodon.php:297
#: controllers/News.php:75 controllers/Passwords.php:89
-#: controllers/Passwords.php:192 controllers/Registrations.php:105
+#: controllers/Passwords.php:192 controllers/Registrations.php:103
#: controllers/Sessions.php:85 controllers/Support.php:70
#: controllers/collections/Filters.php:105
#: controllers/collections/Followers.php:49
@@ -61,7 +61,7 @@ msgstr "Afficher"
#: controllers/collections/Shares.php:98 controllers/collections/Shares.php:211
#: controllers/links/Messages.php:84 controllers/links/Repairing.php:99
#: controllers/links/Searches.php:106 controllers/my/Account.php:111
-#: controllers/my/Preferences.php:78 controllers/my/Profile.php:73
+#: controllers/my/Preferences.php:82 controllers/my/Profile.php:73
#: controllers/my/Security.php:93 controllers/my/Security.php:209
#: controllers/my/Subscription.php:74 controllers/my/Validation.php:138
msgid "A security verification failed: you should retry to submit the form."
@@ -77,7 +77,7 @@ msgstr "L’une des thématiques associées n’existe pas."
#: controllers/Groups.php:161 controllers/Importations.php:48
#: controllers/Links.php:499 controllers/Mastodon.php:87
#: controllers/Messages.php:93 controllers/Messages.php:141
-#: controllers/Sessions.php:208 controllers/collections/Read.php:73
+#: controllers/Sessions.php:206 controllers/collections/Read.php:73
#: controllers/collections/Read.php:139 controllers/collections/Read.php:200
#: controllers/importations/Opml.php:79 controllers/importations/Pocket.php:110
#: controllers/importations/Pocket.php:157
@@ -136,7 +136,7 @@ msgid "The token has expired, you should reset your password again."
msgstr ""
"Le token a expiré, vous devez de nouveau réinitialiser votre mot de passe."
-#: controllers/Registrations.php:118
+#: controllers/Registrations.php:116
msgid "You must accept the terms of service."
msgstr "Vous devez accepter les conditions générales d’utilisation."
@@ -307,7 +307,7 @@ msgid "Links never to read"
msgstr "Liens à ne jamais lire"
#: models/Collection.php:153 models/Collection.php:186
-#: views/_layouts/connected.phtml:82 views/news/index.phtml:3
+#: views/_layouts/connected.phtml:86 views/news/index.phtml:3
#: views/news/index.phtml:16
msgid "News"
msgstr "Journal"
@@ -530,128 +530,128 @@ msgstr "Commentaires sur %s"
msgid "Error: "
msgstr "Erreur : "
-#: views/_layouts/connected.phtml:43 views/_layouts/connected_blocked.phtml:39
-#: views/_layouts/not_connected.phtml:57 views/_layouts/onboarding.phtml:39
+#: views/_layouts/connected.phtml:47 views/_layouts/connected_blocked.phtml:43
+#: views/_layouts/not_connected.phtml:61 views/_layouts/onboarding.phtml:43
msgid "Skip to main content"
msgstr "Accéder au contenu principal"
-#: views/_layouts/connected.phtml:50 views/_layouts/connected_blocked.phtml:46
-#: views/_layouts/not_connected.phtml:64 views/_layouts/onboarding.phtml:46
+#: views/_layouts/connected.phtml:54 views/_layouts/connected_blocked.phtml:50
+#: views/_layouts/not_connected.phtml:68 views/_layouts/onboarding.phtml:50
#, php-format
msgid "You need to activate JavaScript in order to use %s."
msgstr "Vous devez activer JavaScript pour utiliser %s."
-#: views/_layouts/connected.phtml:58 views/_layouts/connected_blocked.phtml:54
-#: views/_layouts/not_connected.phtml:72
+#: views/_layouts/connected.phtml:62 views/_layouts/connected_blocked.phtml:58
+#: views/_layouts/not_connected.phtml:76
#, php-format
msgid "You’re using a demo version of %s, the data are reset every night."
msgstr ""
"Vous utilisez une version de démo de %s, les données sont réinitialisées "
"chaque nuit."
-#: views/_layouts/connected.phtml:66 views/_layouts/connected_blocked.phtml:62
+#: views/_layouts/connected.phtml:70 views/_layouts/connected_blocked.phtml:66
msgid "You must validate your account →"
msgstr "Vous devez valider votre compte →"
-#: views/_layouts/connected.phtml:93 views/links/index.phtml:3
+#: views/_layouts/connected.phtml:97 views/links/index.phtml:3
#: views/links/index.phtml:19
msgid "My links"
msgstr "Mes liens"
-#: views/_layouts/connected.phtml:104 views/feeds/index.phtml:3
+#: views/_layouts/connected.phtml:108 views/feeds/index.phtml:3
#: views/feeds/index.phtml:15
msgid "Feeds"
msgstr "Flux"
-#: views/_layouts/connected.phtml:117 views/collections/_selector.phtml:83
+#: views/_layouts/connected.phtml:121 views/collections/_selector.phtml:83
#: views/collections/groups/edit.phtml:88 views/links/searches/show.phtml:9
#: views/links/searches/show.phtml:21
msgid "New"
msgstr "Nouveau"
-#: views/_layouts/connected.phtml:126 views/_layouts/connected.phtml:129
-#: views/_layouts/connected_blocked.phtml:85
-#: views/_layouts/connected_blocked.phtml:88
+#: views/_layouts/connected.phtml:130 views/_layouts/connected.phtml:133
+#: views/_layouts/connected_blocked.phtml:89
+#: views/_layouts/connected_blocked.phtml:92
#, php-format
msgid "Menu of %s"
msgstr "Menu de %s"
-#: views/_layouts/connected.phtml:147
-#: views/_layouts/connected_blocked.phtml:106 views/my/profile/edit.phtml:3
+#: views/_layouts/connected.phtml:151
+#: views/_layouts/connected_blocked.phtml:110 views/my/profile/edit.phtml:3
#: views/my/profile/edit.phtml:14
msgid "Profile"
msgstr "Profil"
-#: views/_layouts/connected.phtml:157
-#: views/_layouts/connected_blocked.phtml:116 views/my/preferences/edit.phtml:3
+#: views/_layouts/connected.phtml:161
+#: views/_layouts/connected_blocked.phtml:120 views/my/preferences/edit.phtml:3
#: views/my/preferences/edit.phtml:12
msgid "Preferences"
msgstr "Préférences"
-#: views/_layouts/connected.phtml:167
-#: views/_layouts/connected_blocked.phtml:126 views/my/account/show.phtml:3
+#: views/_layouts/connected.phtml:171
+#: views/_layouts/connected_blocked.phtml:130 views/my/account/show.phtml:3
#: views/my/account/show.phtml:11
msgid "Account & data"
msgstr "Compte & données"
-#: views/_layouts/connected.phtml:179
-#: views/_layouts/connected_blocked.phtml:138 views/pages/addons.phtml:3
+#: views/_layouts/connected.phtml:183
+#: views/_layouts/connected_blocked.phtml:142 views/pages/addons.phtml:3
#: views/pages/addons.phtml:11
msgid "Add-ons"
msgstr "Extensions"
-#: views/_layouts/connected.phtml:189
-#: views/_layouts/connected_blocked.phtml:148 views/support/show.phtml:3
+#: views/_layouts/connected.phtml:193
+#: views/_layouts/connected_blocked.phtml:152 views/support/show.phtml:3
#: views/support/show.phtml:12
msgid "Help & support"
msgstr "Aide & support"
-#: views/_layouts/connected.phtml:198
-#: views/_layouts/connected_blocked.phtml:157
+#: views/_layouts/connected.phtml:202
+#: views/_layouts/connected_blocked.phtml:161
msgid "Log out"
msgstr "Se déconnecter"
-#: views/_layouts/connected.phtml:232 views/_layouts/connected.phtml:233
+#: views/_layouts/connected.phtml:236 views/_layouts/connected.phtml:237
msgid "Search links by words or URL"
msgstr "Rechercher des liens par mots ou URL"
-#: views/_layouts/connected.phtml:241 views/links/searches/show.phtml:47
+#: views/_layouts/connected.phtml:245 views/links/searches/show.phtml:47
#: views/links/searches/show.phtml:63
msgid "Search"
msgstr "Rechercher"
-#: views/_layouts/error.phtml:18
+#: views/_layouts/error.phtml:22
msgid "Oh no 😟"
msgstr "Oh non 😟"
-#: views/_layouts/not_connected.phtml:92 views/registrations/new.phtml:160
+#: views/_layouts/not_connected.phtml:96 views/registrations/new.phtml:172
msgid "Sign up"
msgstr "S’inscrire"
-#: views/_layouts/not_connected.phtml:96 views/sessions/new.phtml:97
+#: views/_layouts/not_connected.phtml:100 views/sessions/new.phtml:97
msgid "Login"
msgstr "Se connecter"
-#: views/_layouts/not_connected.phtml:110 views/onboarding/step1.phtml:26
+#: views/_layouts/not_connected.phtml:114 views/onboarding/step1.phtml:26
msgid "Choose your language"
msgstr "Choisissez votre langue"
-#: views/_layouts/not_connected.phtml:160 views/pages/about.phtml:3
+#: views/_layouts/not_connected.phtml:164 views/pages/about.phtml:3
#: views/pages/about.phtml:11 views/support/show.phtml:115
#, php-format
msgid "About %s"
msgstr "À propos de %s"
-#: views/_layouts/onboarding.phtml:65
+#: views/_layouts/onboarding.phtml:69
#, php-format
msgid "Step %d on %d"
msgstr "Étape %d sur %d"
-#: views/_layouts/onboarding.phtml:67
+#: views/_layouts/onboarding.phtml:71
msgid "skip"
msgstr "passer"
-#: views/_layouts/onboarding.phtml:69
+#: views/_layouts/onboarding.phtml:73
msgid "finished"
msgstr "terminé"
@@ -691,7 +691,7 @@ msgstr "Page suivante"
#: views/my/security/show.phtml:41 views/my/security/show.phtml:81
#: views/passwords/edit.phtml:58 views/passwords/forgot.phtml:48
#: views/registrations/new.phtml:51 views/registrations/new.phtml:76
-#: views/registrations/new.phtml:122 views/registrations/new.phtml:134
+#: views/registrations/new.phtml:122 views/registrations/new.phtml:146
#: views/sessions/new.phtml:49 views/sessions/new.phtml:88
#: views/support/show.phtml:51 views/support/show.phtml:75
msgid "Error"
@@ -844,7 +844,7 @@ msgstr "Afficher la collection publiquement"
#: views/collections/edit.phtml:132 views/collections/filters/edit.phtml:90
#: views/collections/groups/edit.phtml:105 views/groups/edit.phtml:53
#: views/links/edit.phtml:82 views/mastodon/show.phtml:86
-#: views/messages/edit.phtml:53 views/my/preferences/edit.phtml:86
+#: views/messages/edit.phtml:53 views/my/preferences/edit.phtml:99
#: views/my/profile/edit.phtml:101 views/my/security/show.phtml:94
msgid "Save changes"
msgstr "Enregistrer les modifications"
@@ -1966,11 +1966,17 @@ msgstr ""
"En mode compact, vous voyez plus de liens en un coup d’œil, mais vous "
"pourriez vous sentir submergé par la quantité d’informations."
-#: views/my/preferences/edit.phtml:76
+#: views/my/preferences/edit.phtml:75 views/registrations/new.phtml:137
+msgid "Accept to be contacted by email to help improve the service (optional)."
+msgstr ""
+"Accepter d’être contacté‧e par courriel pour aider à améliorer le service "
+"(facultatif)."
+
+#: views/my/preferences/edit.phtml:89
msgid "Enable beta features"
msgstr "Activer les fonctionnalités bêta"
-#: views/my/preferences/edit.phtml:80
+#: views/my/preferences/edit.phtml:93
msgid ""
"With beta features you test some features before everyone else, but you "
"enter a turbulent zone."
@@ -2624,7 +2630,7 @@ msgstr ""
msgid "And a password"
msgstr "Et un mot de passe"
-#: views/registrations/new.phtml:140
+#: views/registrations/new.phtml:152
#, php-format
msgid ""
"Before going any further, please read the "
@@ -2634,11 +2640,11 @@ msgstr ""
"target=\"_blank\">les conditions générales d’utilisation pour vous "
"assurer que celles-ci vous conviennent."
-#: views/registrations/new.phtml:153
+#: views/registrations/new.phtml:165
msgid "Accept the terms of service"
msgstr "Accepter les conditions générales d’utilisation"
-#: views/registrations/new.phtml:167
+#: views/registrations/new.phtml:179
msgid "Already an account?"
msgstr "Déjà un compte ?"
@@ -2662,15 +2668,34 @@ msgstr "Mot de passe oublié ?"
msgid "No account yet?"
msgstr "Pas encore de compte ?"
-#: views/showcases/show_link.phtml:3 views/showcases/show_link.phtml:10
+#: views/showcases/show_contact.phtml:3 views/showcases/show_contact.phtml:11
+msgid "You can help to improve the service"
+msgstr "Vous pouvez aider à améliorer le service"
+
+#: views/showcases/show_contact.phtml:15
+#, php-format
+msgid "To help us improve %s, you can now accept to be contacted by email."
+msgstr ""
+"Afin de nous aider à améliorer %s, vous pouvez désormais accepter d’être "
+"contacté‧e par courriel."
+
+#: views/showcases/show_contact.phtml:20
+msgid "Go to your preferences"
+msgstr "Rendez-vous dans vos préférences"
+
+#: views/showcases/show_contact.phtml:27
+msgid "No thanks!"
+msgstr "Non merci !"
+
+#: views/showcases/show_link.phtml:3 views/showcases/show_link.phtml:11
msgid "Links have been improved"
msgstr "Les liens ont été améliorés"
-#: views/showcases/show_link.phtml:14 views/showcases/show_navigation.phtml:14
+#: views/showcases/show_link.phtml:15 views/showcases/show_navigation.phtml:15
msgid "Something has changed!"
msgstr "Quelque chose a changé !"
-#: views/showcases/show_link.phtml:18
+#: views/showcases/show_link.phtml:19
msgid ""
"The link interface is now more consistent and practical. "
"You can mark a link as read, or add it to your bookmarks in one click. The "
@@ -2682,7 +2707,7 @@ msgstr ""
"un clic. Le lien « lire » a été enlevé, mais ne vous inquiétez pas : vous "
"pouvez toujours cliquer sur les titres pour lire vos liens !"
-#: views/showcases/show_link.phtml:23
+#: views/showcases/show_link.phtml:24
msgid ""
"The screenshot of a link card. The actions at its bottom allow to mark as "
"read, add to bookmarks and store the link."
@@ -2690,12 +2715,12 @@ msgstr ""
"La capture d’écran d’un lien. Les actions en-dessous du lien permettent de "
"le marquer comme lu, de l’ajouter aux signets et de le ranger."
-#: views/showcases/show_link.phtml:28
+#: views/showcases/show_link.phtml:29
msgid "The look of the links on mobile has also been improved to save space."
msgstr ""
"Les liens ont également été améliorés sur mobile pour gagner de la place."
-#: views/showcases/show_link.phtml:32 views/showcases/show_navigation.phtml:32
+#: views/showcases/show_link.phtml:33 views/showcases/show_navigation.phtml:33
msgid ""
"Don’t hesitate to give feedback from the “Help & support” "
"menu!"
@@ -2703,16 +2728,16 @@ msgstr ""
"N’hésitez pas à faire des retours depuis le menu « Aide & "
"support » !"
-#: views/showcases/show_link.phtml:38 views/showcases/show_navigation.phtml:38
+#: views/showcases/show_link.phtml:39 views/showcases/show_navigation.phtml:39
msgid "Got it!"
msgstr "C’est noté !"
#: views/showcases/show_navigation.phtml:3
-#: views/showcases/show_navigation.phtml:10
+#: views/showcases/show_navigation.phtml:11
msgid "A new navigation is available"
msgstr "Une nouvelle navigation est disponible"
-#: views/showcases/show_navigation.phtml:18
+#: views/showcases/show_navigation.phtml:19
msgid ""
"The navigation has been revised to make it more intuitive. "
"The things you own are now separated from the things you follow."
@@ -2721,12 +2746,12 @@ msgstr ""
"Les choses que vous possédez sont désormais séparées des choses que vous "
"suivez."
-#: views/showcases/show_navigation.phtml:23
+#: views/showcases/show_navigation.phtml:24
msgid "The navigation bar showing three tabs: News, My links and Feeds"
msgstr ""
"La barre de navigation qui montre trois onglets : Journal, Mes liens et Flux"
-#: views/showcases/show_navigation.phtml:28
+#: views/showcases/show_navigation.phtml:29
msgid ""
"Your bookmarks, read links and your own collections are now under the “My "
"links” tab. Followed collections and feeds are only one concept and can be "
diff --git a/src/Application.php b/src/Application.php
index 852ccb07..1718194c 100644
--- a/src/Application.php
+++ b/src/Application.php
@@ -132,6 +132,8 @@ public function run(\Minz\Request $request): mixed
$autoload_modal_url = \Minz\Url::for('showcase', ['id' => 'navigation']);
} elseif ($current_user->autoload_modal === 'showcase link') {
$autoload_modal_url = \Minz\Url::for('showcase', ['id' => 'link']);
+ } elseif ($current_user->autoload_modal === 'showcase contact') {
+ $autoload_modal_url = \Minz\Url::for('showcase', ['id' => 'contact']);
}
// Force CSRF token to avoid weird issues when user did nothing for a while
diff --git a/src/cli/Help.php b/src/cli/Help.php
index 81a1ff2f..f1da9aa5 100644
--- a/src/cli/Help.php
+++ b/src/cli/Help.php
@@ -92,6 +92,7 @@ public function show(): Response
$usage .= " --url=TEXT where TEXT is an external URL\n";
$usage .= "\n";
$usage .= " users List all the users\n";
+ $usage .= " [--to-contact=BOOL] list only the users who accepted to be contacted (default: false)\n";
$usage .= " users create Create a user\n";
$usage .= " --email=EMAIL\n";
$usage .= " --password=PASSWORD\n";
diff --git a/src/cli/Users.php b/src/cli/Users.php
index 0ef7b706..5ee96f80 100644
--- a/src/cli/Users.php
+++ b/src/cli/Users.php
@@ -19,11 +19,20 @@ class Users
/**
* List all the users ordered by created_at.
*
+ * @request_param bool to-contact
+ *
* @response 200
*/
public function index(Request $request): Response
{
- $users = models\User::listAll();
+ $to_contact = $request->paramBoolean('to-contact');
+
+ if ($to_contact) {
+ $users = models\User::listBy(['accept_contact' => true]);
+ } else {
+ $users = models\User::listAll();
+ }
+
usort($users, function ($user1, $user2) {
if ($user1->created_at == $user2->created_at) {
return 0;
diff --git a/src/controllers/Registrations.php b/src/controllers/Registrations.php
index 365ecd6f..4af0cf70 100644
--- a/src/controllers/Registrations.php
+++ b/src/controllers/Registrations.php
@@ -59,7 +59,8 @@ public function new(): Response
* @request_param string email
* @request_param string username
* @request_param string password
- * @request_param string accept_terms
+ * @request_param bool accept_terms
+ * @request_param bool accept_contact
*
* @response 302 / if already connected
* @response 302 /login if registrations are closed
@@ -68,10 +69,6 @@ public function new(): Response
* @response 400 if the service has terms of service and accept_terms is false
* @response 400 if email already exists
* @response 302 /onboarding
- *
- * @param \Minz\Request $request
- *
- * @return \Minz\Response
*/
public function create(Request $request): Response
{
@@ -91,7 +88,8 @@ public function create(Request $request): Response
$username = $request->param('username', '');
$email = $request->param('email', '');
$password = $request->param('password', '');
- $accept_terms = $request->param('accept_terms', false);
+ $accept_terms = $request->paramBoolean('accept_terms');
+ $accept_contact = $request->paramBoolean('accept_contact');
$csrf = $request->param('csrf', '');
if (!\Minz\Csrf::validate($csrf)) {
@@ -134,6 +132,8 @@ public function create(Request $request): Response
]);
}
+ $user->accept_contact = $accept_contact;
+
// Initialize the validation token
$validation_token = new models\Token(1, 'day', 16);
$validation_token->save();
diff --git a/src/controllers/Showcases.php b/src/controllers/Showcases.php
index 4000973a..afabebfb 100644
--- a/src/controllers/Showcases.php
+++ b/src/controllers/Showcases.php
@@ -29,6 +29,8 @@ public function show(Request $request): Response
return Response::ok('showcases/show_navigation.phtml');
} elseif ($id === 'link') {
return Response::ok('showcases/show_link.phtml');
+ } elseif ($id === 'contact') {
+ return Response::ok('showcases/show_contact.phtml');
} else {
return Response::notFound('not_found.phtml');
}
diff --git a/src/controllers/my/Preferences.php b/src/controllers/my/Preferences.php
index 634deffb..cd2e8e55 100644
--- a/src/controllers/my/Preferences.php
+++ b/src/controllers/my/Preferences.php
@@ -34,6 +34,7 @@ public function edit(Request $request): Response
return Response::ok('my/preferences/edit.phtml', [
'locale' => $user->locale,
'option_compact_mode' => $user->option_compact_mode,
+ 'accept_contact' => $user->accept_contact,
// Don't name it "beta_enabled" because there's already a global
// view variable named like this.
'is_beta_enabled' => models\FeatureFlag::isEnabled('beta', $user->id),
@@ -45,8 +46,9 @@ public function edit(Request $request): Response
*
* @request_param string csrf
* @request_param string locale
- * @request_param boolean option_compact_mode
- * @request_param boolean beta_enabled
+ * @request_param bool option_compact_mode
+ * @request_param bool accept_contact
+ * @request_param bool beta_enabled
* @request_param string from
*
* @response 302 /login?redirect_to=:from
@@ -59,8 +61,9 @@ public function edit(Request $request): Response
public function update(Request $request): Response
{
$locale = $request->param('locale', '');
- $option_compact_mode = $request->paramBoolean('option_compact_mode', false);
- $beta_enabled = $request->paramBoolean('beta_enabled', false);
+ $option_compact_mode = $request->paramBoolean('option_compact_mode');
+ $accept_contact = $request->paramBoolean('accept_contact');
+ $beta_enabled = $request->paramBoolean('beta_enabled');
$csrf = $request->param('csrf', '');
$from = $request->param('from', '');
@@ -73,6 +76,7 @@ public function update(Request $request): Response
return Response::badRequest('my/preferences/edit.phtml', [
'locale' => $locale,
'option_compact_mode' => $option_compact_mode,
+ 'accept_contact' => $accept_contact,
'is_beta_enabled' => $beta_enabled,
'from' => $from,
'error' => _('A security verification failed: you should retry to submit the form.'),
@@ -82,6 +86,7 @@ public function update(Request $request): Response
$old_locale = $user->locale;
$user->locale = trim($locale);
$user->option_compact_mode = $option_compact_mode;
+ $user->accept_contact = $accept_contact;
$errors = $user->validate();
if ($errors) {
@@ -89,6 +94,7 @@ public function update(Request $request): Response
return Response::badRequest('my/preferences/edit.phtml', [
'locale' => $locale,
'option_compact_mode' => $option_compact_mode,
+ 'accept_contact' => $accept_contact,
'is_beta_enabled' => $beta_enabled,
'from' => $from,
'errors' => $errors,
diff --git a/src/migrations/Migration202403100001AddAcceptContactToUsers.php b/src/migrations/Migration202403100001AddAcceptContactToUsers.php
new file mode 100644
index 00000000..3a00f097
--- /dev/null
+++ b/src/migrations/Migration202403100001AddAcceptContactToUsers.php
@@ -0,0 +1,30 @@
+exec(<<<'SQL'
+ ALTER TABLE users
+ ADD COLUMN accept_contact BOOLEAN NOT NULL DEFAULT false;
+ SQL);
+
+ return true;
+ }
+
+ public function rollback(): bool
+ {
+ $database = \Minz\Database::get();
+
+ $database->exec(<<<'SQL'
+ ALTER TABLE users
+ DROP COLUMN accept_contact;
+ SQL);
+
+ return true;
+ }
+}
diff --git a/src/migrations/Migration202403100002SetAutoloadModalToShowcaseContact.php b/src/migrations/Migration202403100002SetAutoloadModalToShowcaseContact.php
new file mode 100644
index 00000000..8b35a061
--- /dev/null
+++ b/src/migrations/Migration202403100002SetAutoloadModalToShowcaseContact.php
@@ -0,0 +1,28 @@
+exec(<<<'SQL'
+ UPDATE users SET autoload_modal = 'showcase contact';
+ SQL);
+
+ return true;
+ }
+
+ public function rollback(): bool
+ {
+ $database = \Minz\Database::get();
+
+ $database->exec(<<<'SQL'
+ UPDATE users SET autoload_modal = '';
+ SQL);
+
+ return true;
+ }
+}
diff --git a/src/models/User.php b/src/models/User.php
index 30d52305..475c18f4 100644
--- a/src/models/User.php
+++ b/src/models/User.php
@@ -91,6 +91,9 @@ class User
#[Database\Column]
public bool $option_compact_mode;
+ #[Database\Column]
+ public bool $accept_contact;
+
public function __construct(string $username, string $email, string $password)
{
$this->id = \Minz\Random::timebased();
diff --git a/src/schema.sql b/src/schema.sql
index 3294a957..6eb9879f 100644
--- a/src/schema.sql
+++ b/src/schema.sql
@@ -38,6 +38,7 @@ CREATE TABLE users (
csrf TEXT NOT NULL DEFAULT '',
autoload_modal TEXT NOT NULL DEFAULT '',
option_compact_mode BOOLEAN NOT NULL DEFAULT false,
+ accept_contact BOOLEAN NOT NULL DEFAULT false,
validated_at TIMESTAMPTZ,
validation_token TEXT REFERENCES tokens ON DELETE SET NULL ON UPDATE CASCADE,
diff --git a/src/views/my/preferences/edit.phtml b/src/views/my/preferences/edit.phtml
index 98a8652f..f827fe9e 100644
--- a/src/views/my/preferences/edit.phtml
+++ b/src/views/my/preferences/edit.phtml
@@ -63,6 +63,19 @@
+
+
+ />
+
+
+
+
+
+
+
+
+
+