From 4d1949233f17d40984d04c6d5d17ae707420123e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Gigandet?= Date: Mon, 8 Apr 2024 20:57:11 +0200 Subject: [PATCH] feat: report a problem panels (OFF data + French SignalConso) (#10106) --- .../report_problem/signalconso-button.png | Bin 0 -> 35923 bytes .../panels/report_problem/signalconso.png | Bin 0 -> 23111 bytes lib/ProductOpener/Display.pm | 2 + lib/ProductOpener/KnowledgePanels.pm | 2 + .../KnowledgePanelsReportProblem.pm | 123 +++++++++++ lib/ProductOpener/Products.pm | 63 ++---- lib/ProductOpener/Store.pm | 1 + po/common/common.pot | 28 +++ po/common/en.po | 32 ++- po/common/fr.po | 26 +++ stop_words.txt | 1 + .../fr_report_product_signalconso.tt.json | 35 ++++ .../incomplete_or_incorrect_data.tt.json | 31 +++ .../report_problem_card.tt.json | 21 ++ templates/api/knowledge-panels/root.tt.json | 6 + .../web/pages/product/product_page.tt.html | 14 +- .../get-fields-all-knowledge-panels.json | 54 +++++ ...attribute-groups-all-knowledge-panels.json | 54 +++++ .../get-knowledge-panels-fr.json | 54 +++++ .../get-knowledge-panels.json | 54 +++++ .../get-fields-all-knowledge-panels.json | 54 +++++ ...attribute-groups-all-knowledge-panels.json | 54 +++++ .../get-knowledge-panels-fr.json | 54 +++++ .../get-knowledge-panels.json | 54 +++++ ...ted-attribute-groups-knowledge-panels.json | 54 +++++ .../data-quality.json | 54 +++++ .../no-data-quality.json | 54 +++++ .../crawler-access-product-page.html | 116 ++++++++++- .../normal-user-access-product-page.html | 116 ++++++++++- .../product_read/get-existing-product.html | 116 ++++++++++- .../web_html/fr-product-2.html | 193 +++++++++++++++++- .../web_html/fr-product.html | 193 +++++++++++++++++- .../web_html/world-product.html | 116 ++++++++++- 33 files changed, 1775 insertions(+), 54 deletions(-) create mode 100644 html/images/panels/report_problem/signalconso-button.png create mode 100644 html/images/panels/report_problem/signalconso.png create mode 100644 lib/ProductOpener/KnowledgePanelsReportProblem.pm create mode 100644 templates/api/knowledge-panels/report_problem/fr_report_product_signalconso.tt.json create mode 100644 templates/api/knowledge-panels/report_problem/incomplete_or_incorrect_data.tt.json create mode 100644 templates/api/knowledge-panels/report_problem/report_problem_card.tt.json diff --git a/html/images/panels/report_problem/signalconso-button.png b/html/images/panels/report_problem/signalconso-button.png new file mode 100644 index 0000000000000000000000000000000000000000..16265b21d6b0468c00df213eef6a6040dcb1024f GIT binary patch literal 35923 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%0DiLpfI7h-$&FDDC1K(ec5der)%5;nPG8t_f0=4 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 literal 0 HcmV?d00001 diff --git a/html/images/panels/report_problem/signalconso.png b/html/images/panels/report_problem/signalconso.png new file mode 100644 index 0000000000000000000000000000000000000000..8c9cc70bf6b8aea1d4400570a034dc148ee41009 GIT binary patch literal 23111 zcmXt918^o?u>E3lqm7ddHnwfswr$(CZ5tcgwr$&d`Cq+PQ!_QygNyFzd%EXzn5?u2 z95g00004j!6BU#P0DuI4&SN3Le~z~F$Pzz-Kr;aWSup_td|P`PV>3%50N`(&R~(mU zKQBh`b}?#%B6d380D*v0JwEwfsnTEmAX$pWGhO>rJVrAyc};AvW&Z%42qg$~6D=G~ zFuogzfz@8ISt0QcYO==A+vt7Vt@o{z_G>_%nqC_!CWK=@^ZaOF;$)S0XALBQBm=aZ zp0bs6vce6H&NJlAC-qdr$N3lbr}~yYFE3%X5z{=$7Jl|tqebR(n2@qO`b} z$B5J7KFgF)3RpH-dfEeLohT)0yXvLBGQHCt*?+E&MA%Vo(9L^s@@@D7b(=>+84ujLF_?46oy9NJ_5{#k# z_wH6!`;WWfT_n4>y0XJyFk-62hssQc6dUg5gyN~aeEXB5@SNAlK1qa)%}g<}KYaR$ zJ53D)-cN^HP3Se+-(7iNfMHX7LPWuVW*8RG zVVix1Wj5Cmvy&3Ae(RV9>q&-&)hHMGZ|uj0O2WxoipAnX$rYzwaRghKnXwOU4pKsV zXZ)gr1?iy`oh)CHloE6Eynixi`dUyLuP(A*V@oXYQBYCxEloX00J&WL9R4lNgWKVF zHk1`YDqlZ_ItU8nyX&im;(GIUF|XzCv$dfordwhNC{#S6QN-bW3CpRuh2;HXBg$vf z$Y%r!R3QF|ccinl@>|^3!n~?Z#ET~U-x;JGd{F4UfN(;%$OlFUK~0kyPWi~NsCJhx z`I)!)a5O*<(D3)38Zc7sh<Rs?%TtH}Ma0;O$$5sW zJuf~0G`FIvZ&6m|GzH-<*(DjZxEO`{FIB}{czBH8LZai%t*s*?^Mcul4G*<8!u|9l z1!S8uL%2|`$z&WPfo=0FT6=4oPwjidBZOETF`vFEFLmeF(5ylVbq=eWhZ(vGXv4?w z)7t7<$L*9xgg{8aWsEa!s^Vldg7|2qBJYV?kru$(0G2$3GV}d1|FyxJGzSF=xiFaZ zfR>3#i(zw{uP$J|jNRwz!RhM@SEzsX>Tp~o28Ywm!prJc47e{yA8pT0jY7O6roZoL z_98QU^H;>tbUA(w@_+UP4`VF-gp7iQMvWXX2~Xf|FQ%`>&FCNc&6(+6!0&KA7sx3_a0 zcuvTudt#G-pC|f*$(;)b*=1=Ft!v!mOlv-h#)lG#T_@mrT=Bi;R z^^b4p@D6l+TIxsT@pL)jcZmTgqNMGqDQLO}0)J(gpQX#?c-NOj{mj~r&+)XXwR=zD z2@W*$3f=$aaisI>SraUn>R%+7o|}89PHHl0i3!mnAjAE6t2RcwLnvPivf^}3HxSt= z>dpC=3ze$m&_s2$^v*pPKFL5&ya|x5>crD@jN$0)Us|3X5Kqqyxt)oy%sgz%nSEAH z0&b(tc|%A5Z!g{7D(gjxs_3P8d5H{mmYHK1z)M?ATbl+yV_9cMC!zH)p|=bNAtWrX zG*H3pEq-zGD_mRX?`X3Y7*V7@e0xlU1AAk}?uLemG71#KP4)R}Ok_o&cdV4|d~oex z0KnG!13u?vMnta;AByco4KFky9Z;*=Vb9@Hc+}PPh5QKvO^o zL-$|v|Ds*jo8u>bZK^$!j5w75gEe(ILJzh;$wqqd&05+26|i}X1hQ!8y=^Q^WE@+? znmswlL%=qc!u<~PWD@O&rftr77M08`yTOKo2gLyBVgRy&Ig*Vx$C983golmI4v)~P z%gXh9(0*s+ZES1>NsyOI>pL&;w9<^Q(uK`s%wIDLz1aZfoo0cOi+4>JgP>?K ztKinT7h$|KbDNw`iI&gO*`HGjkyDvx%{(1ohRZA4kS3%S$qa^4E4*3_JUCw6V_mak z71c{RzI%EfN(TrT%+B-YZDr;1If{ogr;^-9KgMlLw%QyIhtTath1#?@cWbYP@ImoW zkX8y-G}BXg&tW1emT5HJ#WpZR+IeuWt!h9e?{}U`vOS)04K}ppa*P-k7j#(CE{nv#}ED z!*k;R$d^bExdye8>VX~Ba{F)5PU=G7U*tb0XJ}8KUE<{jPXRY#8O@i`JdWfiwxWvF z*3YyFyZ5;}7>UY^0{rHqFAXVIIo`HBh1Sa{+taV^-_s~!&qt_Cee-Fz*&)H?AY97UuAGn3FpfaBT8xCN5v4iOvo3|!= za{cH&cPCZyF9Zl69W>dMj9`cuO)n%`Q_bh9FFOm&Yt`2<6W-dS5e0LY6`Zv!I-{GP8ie_+v$2-e&1CrI z(ynD~a2_7QH?$qADk@-ZxFO{P(ttAIrv&6P#bRTFVUa?i7-`{dM`kIydI`whGuAys zv;d%iH{2rYtBXmC%T8WgOr2w6PkwzL* zC6E??gsH#~g(TjIYquNz$;LLZgt?IL(wZ7L_-OdT#&~?X%)r#d699ST) z1ZAB<5J1oA0Y9Jjs?Q}f`I{*0oadjvGn4h;Mt>r{YuAD@V(g5Rl8C)FHy75Bi>pe6 zj&OgL=oZM^h#GhbRFvcnD#Ylm(8qY#;-O&inPqry0S6Y-QVUm}@AmNGSA#hJDip3? z0Udb-sU#xZpC71b3f@Y_%A*o4wLg3qz zc|SJ53&xt64O3Y9GhE5Q)Hns|ko^@ER&LH?i?2HsT<_Aq6gmfYfiy;V*!{W9)w3ML zObL%0>KT*u58+6r;C;L?TcLDJh#EBe42_Y`+&)yy&4TR>1r}O596IXh#UZpr7@$g7&=%hJQ8xx@7;^3Ku1z0J#Nm)511V>Dz zfYC&UDXMZ1zgPgdk!fgaM}9nyTRaHb+somVi{9+&&WS0*F97xTJr)U1Ht%GegQ_&l zl{5Eg*2F>JV+010FoYpvjfmQ|8B#Sn$J^`qF^vvRN}Njmef>KfY|nt`byqZS7QRpt zXqX=1KwEHek`)f;s)eDrBcsP!izbD{cnuvimFr|ZK>Gm(*kX|6m|<@}-ceHv+bNK+ zS3gd+k&KBcM_FlGIOU>u*2i+a)?c;p=+gnRcPJ$d*$y@U(|L1QuB=t%V*~q3X_Iym zimQ~%o?2Q5bs;;CCvFZyDo#M@MqdjZ0(Tzlud+g5y7JcY>6_m-n}F+XpTX-(VWGrj z7EO)|2o5Ua*6{ffO=0GbjywZXGc*c`&P$m{-pXmM(#QR@@T@*1Gu9B&kUFK& zM+XO2&{5JV-mPjtegy$elzyeNg{l8*M;IxI6(5sd0&De^ibTS+R%b665opybP3Hww zAYDGanPH%SMBp9*0ITE0M3vGro-lQ3wRQIV?5Gb}!tQ6SB(mn$q8&Uq1pS?bj(TxY zf51fJ2FNk>R(GrW;KiHCn(VC*z!v(EXq(uwO69rnbsgWI9V;vjjrxk6rucNQ%+$Qt z_wI!gwqLt+>&yOS;|%LxKhM>;b7@5pD0`c_4o&*G&=qw8KAmQus=R#Vus+>{p;}pM z944e-ABZxEJ^d`lwl>H2$Ci$?mZJ;lMhnhHh1{%6gdErxmQ&J^4?2LO;&VaFNJ$5yaQI5~eg?~M?CeI4|v z$6|kvWHhuaMEX38c8U>0@_KAR!mLV5jLlcnRtJ%xxA)h6e*v>Z!g4#zX~SQUYgPISptJp;%c_z4hA6T&;m4I66G! zlc=y%NIN+#cbU*ZTlZrf2i zyVT#6f3SOKXWxPL1Ew^)c)F?zF5gA!%s7grY`so7(D8jXdSFbvqrJbh>yOc!9$jG#0)#c%xoSbA;Rbda6;AR%az|_{v-a(|4z$ajA zW7eA-JhXHU;qf@mUoUO`MHOxu{`v*UT=P)1+Ib!@@RitYd+GO{V`7sQZCAJI_-Tyo zy*nYbJ~f4F1t0RB=&2i8sX|A`mwI9AjmE+-1*s)V4w0Krj zRFpuI-411NQB?)T@8@&VZ^-I;(+CwoY%@1I3wN1GZEA50Oo#|61h~ZJK0sgK6A=L> zA~v>*y4VuUKC_AWjrBYE_Vq(Vq2z_-#f|MtCfhTYJ9^BIx>~e230jD-qpHeCv`=Yu z{p<#?<7z9qF^TDXiST?SLN!KV9SZ?CxvnFyuo(X{^hTC*fUV}jZh#EP%QK0$vL%3Y+h@X)oC9xyR>Azu({b# zUsN>S(9kgKG#ej<5xq~&nGFEtM|!vu`hi`@S(_oi9ok5VDhm@pzT8kqv}5gnTFJF1 zTG-sYx^s3wMHK)5c)0%}FANe{vX+*PI7oj^z#j9MHjLJh0N^0q#B%QBKbH_v;1mE?8%# z5(~0sW@p=4F0+)r8Ge(OQA-QQs;EN1Rn^bGM2MfE7!)L20Ofj?vg6VkcrpMgJ8h{9 zzdzsgJbo@F%a?t^0JtsEV@yAfXq-(@7qgO4JnD<0V0gaWy*}bu)N!>tk-nbdgA(q+ z=cak4coJpAB{lJo;@%|OsWtXQ`YbZlLh}9h(no&{!=;uTPBcz!b1N-1|KkLm0ob)#>nEULU`A@wLU$JN_B$OY=fa(j+P% zziOQg`PFgf+J~|3pBO+o1+l)8b}?v|Zx}v3fDY}Zsg5MIFun-oh0=6jEj#iqWaRY5 z*=0zjDU}AK%pAPV?P{ZB;4^G@@gODcpwMn3rZ$LvJiYx?RciK~vM)mT`>O!#c~}6& z?*i>Nq(`#v^QS#B!_54e{pU~tjtNaL7CtCF*LV0nMx(v!Q%v8yw99P^klyWSd&yhN z!KgiM_ohqu*4onDQ(S)u_v8r8vbFi~*ZXNtFhM9;w1I5z5r98)(dtsKVtkz3h7(e1 zoy(%_ymS$x49%HYRalyiS1w?Je2~_+@WCEIOCT$?9f^$M_^lls;Sj(0)#DCmXDTkh zwxs*HQVVOQ_4IPnDx z5&+P?TB3v?9cD_Q*>tR|u&^H;sXB8(ruOIEIkfipJlDF;xxU8edViD&xybD3pS5f4 z;^HKDn%;$(xUN6aIB=w%L8n z&WeSi6-%K&Pk{qKR;eQpH=xCBE6Pf}TCRI;nb4Y*ZzYc23gQ@DNj)}s$XBB{BE~Wv zA@Vm9Rh$eCl~$$s?TUY)4ljQR@I#RaA!ew~m{|6w^o~hZ^!em(4~zIDX);sS1KQoc zpHfn)1FfyjPn3r3EK$O7mtxSPV&x<-Y(2izfwI`p4P#?7ow?YVryELC7%Be zyTZYOk7O)__TnBz<3oBWW)*UaR*is!6QCuo0@Xs>pQCG zmxHjq5D_L3;fj*QU}^X=aaZ4FRToRc$(H(Vv+Yrchm&CYdDj$sQaCY&Bo_RgTiy&8 z5ib4pw6hz5C4xf$48S4W4h|N&=J9x)^|yC^FBN50R$l}bk>32$|Nci>_0yNLvy<=K zk@#P*Mgl0%;7(Fn;CwN2U7k1i9q!A=-Cp%(>&G>mQoSiTHb`r#X`i_xg`M$FRTE5c zG1IJJ>gJy6U7luYulvJwtI-(3_Pf52Nd5Q(bej|;bnD1IgAT)oNR+_s2^`PHT z9Dn3hGpe#tlFIn7bqT~rG(1=`Jw&PXnHZ<|Jh{20=*~z>!%JnFv{KDHdiH*cep%1? zZpn_*c;A%;EAQBt?}pww#8z3U>+3 z^XaUK2Y`P2w}9IsIcJ7KJ0nLVDdpr~%BY@Sl_j-%yKN)H%9a)o76x>3e!{OIL4lHz zC@_|w?`osAQyfBogr?+_X{OmFYTRBaX9q^>^Cjs6XyGV_yuD;{$VbTPaNb=B%gAtd z^;elAh{NFfS>#D;UWU-;Nm@JJ?{{HzfWW)GYK;zKX^xo~7osB_7&p?BrjxPGnp5o+ zXY&VP_GEBZ=S_b6?$AGg9Fd{!opWxNeP6{*h}4Xt+t>eb5Tji zd5VVW&E#b}Qg#$o07s+e;gCQC(>N(roA+*sjJ9JZG=TnBb;lAW;Xf77Xz66E0Gj~G zKbQodx;E8P7^fCNt?>j*s9gG!8!+ucsj zvof#5^$ts}H?$Mh3rK_j-lK%Oe~(UzgNKV!Hr?U^)H?XV9(iTtXXLFs?a@u?K2LL> zofgT{xO29uSSsCebw=+jVQR0I-Fdj%t~4HYVq$hV)tWgzpA_2i@}08k^n#E*{i}o~ zlVe3#C9g3O-fC>$Vbb~lNSot4j7;HA$`k7WT<6c8KLlZdpq#F$9bVI41+O059>)`= z_fUOOx&i3PB^1tMUieF>wCda57urEULY#M;TgMGyKR%!R3aB@wx>#N2@-oGRB*Xmcgt}C z$zgXHwkPTaoRLe~?Ku8hndbI%m?HWPLtA|Pm!fj``S{QA6_`{@ODU-crsKISh6!ox zV+1~U;}a7zM(rv;HELXvXRPLUGT`hdRvX4mz1X8U;pOMgf{ zj?Xugl3J@0zhAA(2s}wR6!5`enhZ(H>O+}-NTA>xd;6<=Q&CMBD0lYN`X@F@;Q#ZJ8(I2TBs6gH3Z`Rso=6BckW>gwU4Tjb6 zI&^^hHSk5N?WMP^%yg%S+hA0A{aJrPB_<^70}HrsbMGjUzb~0VIL;;2vW=UC(T4W# zshD?+UyYWJAt^w*|0vHCloXx=1N3K4*c4asW`tMlbQ1edSB^U`_% zF@aSVFtlI$n2i(v&joOFB=XT+TQ8Eh)HSFE8xtotDJ<)so~~(V?jm-aIRc{d@AH?> zh$FngHJCJqg@q$|mA1#N^|G8CW8>G+iNUUmWX7WF$!%_K)-ftWfwhGNLH7t)Ih5E= z?ead{ixA*aL9YQ{Myj{J{!M&*^DY!R)tsI`&8>-ZabjA~ZuS_d`-=;87V^d)7#2Xj zdTGPV$e6uWXOT0pM1Nc(Tm)~_eV7I-tDumeTK$vVP~s34cAuHrZ5CGu$wrHqS)M-< zztiX?zY!H1uHRpuT@{vY`n!w@%w11W9n5#KgjXe?{MKEiBFh z^YiOf-YoyJg5zFE<56cG(8d97uSNuvi>!6Bk>AZoJ;b>*Rn$xFOceuNSykvpKQv`qxhFE z2F3|65rVrD#2_(Kt?R7gF960v*~-cas}Yt(f6rK3?>d8-BKb&zYK`<55-@0~?y09w z+5LO!S!pBXW^DjSQ55~E(ZwG8^*b`=TcG#1-U$j3;nG&er!Bv+cak)V45UC83$6Hw zl6m_&hR41(;N??mItK;# zCTk2SEzX#?vzej2`1|$+k3wxtT?c7Yf?(+a}F$@xNvli+?V+-;00{qXNgo(hU0b z&{Uqq3M_y$NY81&aJAdQ;_~$v&0l!Q=_;J&3!5K6Xq3d1Q7nD`gnGMCEwC#I71><;B;)5QiITyb7R$Gc@0$IT9iaJc1*3gK~M!l8Z%6>JUdtE z=A<9(M;WCG8@v(fQ-{RA(vEj|Z*6gC867E|k)g4X`|uFr)ba}TuEXxkAlvc&w08ia z)5&5oN5qn`s*uI)RLgwwTe3Q?H#ff-N5Ut*)p$nTSoK4aB%qiv(aX~O%0C>rc>v1J z-o9nm(ByAYg}9}Cm^;6{xUHrBl<#sSot@ZqP;gP1D2Fx$MFI(gL;?H@Uax4BDy}0B z5KPQu{rgQr4!2szU4LK8K*!2T;+ztj&~!XOm>$W1Pwi(`lMpGqx0CMF1z8&fy7b$W zMP{07=^yStpt9R5_3pLLq{Ji?k2isz+33J|Ks06=Yp%2=Q;n1HW3#m4?NLdmT4sT1 zG${Rt>vY_4vvnr$A5R|Lp{4I-&*3vK}s4TG{VIhu0j$=UA1nX8`OZ6-`JQg>vQy<;~{yY3>oXK z0!!L(?MlQX)Z-&AAE|y2p2V~jU&6)C^|K%X0+$|_ms&GJr|^`NmpUy(&|m>)XX;^v z=U0|~#o(2z`8|a%j}PHZg>HT{no+7JN0ya7yKkSD6zG%QX0aimrLfPxNU1$h(bCvE z^Mn69Hqb69oa3AypnP;cu0>+=b9&uoe@2}naEnV$stsA6B_<@fK@$KZ6ejhFiG{`= zF7B3tmCE{8ReK(8M@y!+p&Mx{Ze*>_-BcB~Dj8AmXyZaLG-%JP+&0(1nj-nG*gk zY$ZYjra?FsaX6MVCv-ws)n7c4N-gL-W-*!GdMhnY7JvYhSv^7motTpOM--S9aRzj) z&$?}N&c)X=$0LRyo~ulvgYfp*giuQl^XKEDDK(dlw82@|Ag(xp@c5{xuTy`&mgtl{ zi`Z6D!Btyo|2sJq=t6h7FMNSqaDf0(=|%-TLncl_GR_YGd)| zBXK|b7>rHJ+N@`5E~qF2Bz$hdP*qj=I6XgcS(%I=3Jn=CP>hWmG8h$%I@w&7SHT}o zgLk^TJ3rJCx4GJ^hZA90%)6*brcacF52FK@BrxdKPft=U8PK9)6VbQ<8BgEQxP7^p zkgn@|lCC_Cqs>g6%9oXvpQ3}facD4=T8zABWR#l4Y6;;Q zLrAi9eOFXXemi)+KyP2^cyp9wq2wUrqNUONqE}Qh?!jut?( z=`j!hk`GcJG3Jd8i5T-6~>+fn@mu6;Gx}y$LG`Se#y$> z8S}J4G0HKI5YgXPZJ$Qw;gMaE+S(|@!36ij*ziDDc<6XtRDu=*e21sE-eP&mDP+sb zrQxwn$)P{X64qV&nQaINKv^}}xX$io`zpOL0Fx5%%h~&DKMy9wpDCmO%O2rQA{!Y!dhNjcoSGXD<&4E9ThP-*fc!)x(8JE8-T+c{>;rIfuU)9D-v$ zFVgn68CYb0MXJ8{RNxDen!Nu$u^}w8xsq?UC-t^)RV4J7?&{yxY(vWDNW{?{WuQ~D zm=}k($48D>hj7<1BGyovn?oW103)>~bPjjjXyTv_T_z%=+W*AfROIy$ZclP!7y$ zjZY6uzr}tTQ+XR$M{!2I&S8Q91BD9KtI@}l2dwJXr9OX1;34J6@c1z4FK@QT)NiYH zIE~6W<#u%q$}J@jix3QoSl@q&Igx^ZP^Ucwjp| z-%rI(RQ0AGFQXMaxL=>i6P^5tsE55%Q_ellMn{UG59fluyaEl^s=-%NXo%S}E^S(M z7<`uDj%=RJULB_?GdBk}sVfJar)ohA&=Qy!1GHE*i-~DFmwJ;+bBf;k8Y^UN!{NA)9BM#D?(G|c!4WxbF(Wc-6g5Ks;ZLk=W>!y!}}MH%vWpg z8kzC&eKH))H8Gf${qNpy^BgC94{y}fyhme=z!6)!2c{bIGw<$TpP`8{0F;Aw>BQoa zk|Y>ed^*grqoxL6=j)dHc1D9N?$tk7fTK;wa7+y~g;zV&b~}D+=O8|}!x{2uePF+u z472)#gikkgm46EJA44~z%VwsrSy`8(=cr;@G1bxLjtDiRb=wEN48H#3BsuZ2MA)bf zQec1`d$&*Mh(I9lQ@2NQnY%NPg{0pMXw+UcgA)U^TWe$F4S99DL`i&?PR_U>Z|-Zr z5EcPGDZ4>MO{xM03G&{01hogKlJpHQJe}@bjIr~BDR|KH{(fD~ApuF=hq6+b@w&>b zt`sE5fMU_|l7fbLQDv|43ah^hGjn27qZKG)6eBgb;dTwFjIs)P&KX$eLo2EoS~&;j z&ZF}VmA-|Qc|rc13TMY*h=2gTGEaxqN^b^=XgOYGyY{tp;ShQD(tuSAK%>)x{JMR) zle|MYIzCD_Z=BHkTJI2|y84Q}-*Q-YU7^^e}(VNh6GS#TMd={@P*XTYq9rDJj@swgrPqN{!-q~uW*Cjk^k9Ku~1k(3@4AOO67L)$9Tni$)PVz)0(Qc6-J&eS}C0Ns6 zF*GRqz`rl)U7Q@$>_$(A_PI2LAK28%0lwwwW3ixuI9FB9fdI=YsrZfIR=998#>IoY z)+mZu%bAr0m&ec16kq`D&{EIMU7Ear4NC;jFtjK3J!nLj*vHG;fc@aL}MEI z%Gpwiif6l_BZ_H)1B8h3V-usdV7~X?AIUniqSK?J=?U?fJ9qP4KPY^S_+B(9FPhM_ zoZ|A{o&_%vY;AfOwR$5w`DAEmcJ?20ae2A?j0~L;1vT~je_%&nNvTOnTYJ>|3P0-7 zd#l-WP4Sy-98J0$pUlKCfJ_7oSLaPCY34?9V?_0t0^r(EWAEbMf2`SVe|*siaY{ay zs+%pWK!I=vLypkh;MJX9mnSsc36b|w(~a$wGihx^i>7I;goL;lh^qiDE?#!J!A>?_uPr=lbR`W~V`JdQoH;29 zjr(HKkGWpcIfhAE+%D!kV!;J~B{cTfG*YaR9FaUIi>~)e#Z6V0sOg zyr&Z$dP3R9;Np$nS<1wLDC*APIF3v9F z?AHUf{7P{I%}sS{9j3b%vSw$eCuh|44GRI8eO+$V^=&}p73DhVW~NIAbPEu>YRK!q zA_jZ*;W)i4G(9_#ME}w!8&}?v4Z5$Tr>n?(+8x7CNmY?s;UwWAuy7EF@%%wBCl{9k z)QT%VIyv7GFj9`Alizy9Q4#F~L;6A04K9IM3`*z*c= zT=XxyL4!vCcNS<3vyBr$o(j^0oVB~)5dr(!=p33VVo&LG+{Yl0V9@>s zkuh7{qyYX6+6WE{Sdq%=ftLaY+z=w(@&AQDeko%Hdls}-#VaZsa47n?i8MK+oJac~-+7uMBXAVYV1@KBqIT6y0 zDUXZaG0qk%F$9pjN~JQ{RQvoS7YArzlaiLP3*_v=1obV;pXZ3=n3yiSv)D`I?P60* z;9GJynyEk_B&=3p`nTm8%22R>a#Nsy4Q-?aMn_(@cB!;=ih5Z1=|;=zgKyW9XN~U6 zR+I%a)HKDn+bg{2Z#Od2(asq`w!5TwuA}L@{j^jJ>)9pUu+dcvaDGSI+BWvy`Mdg} zu%%MS`Taf9Kx1hq50BwttYhh{3+j1GB`lUIN(Ggqlos5mu<<;IpyBlH6Lm8+wQe*5 zdq&LC(!U6r36GDHO7hCoUP;ruL?pRoK_XCa(@briT;BJy`^(jtTpm=H5jD})qEa<; z#5z=~dsR^qH1Ds`FlRE1Bx-$A>UdIjPTp4jgnIzMJ+Ltv#00eJ?N&3~lL9Hb*Oh72 za%u4ZhMZnE67Y<&NpC*yGo?)po$>bd_sfE8<1f}lhQ%3KiTv{%RY_WYJV7as*`}6( zeD9_~eL6msZQC9%M!NZfQ>?QO;SxFFfrdO;T2u2&zlBQi5DOPVnXjAsyjmqJZn_k{ z$@+NQp4f{}&`#iY9=LwNGjmLdk~jA46s+K5>gn7*f57yan}bQqxtV!~SizovFgSU* z{X_iO5CIFs4hA@*`L@IJb??RCJqbQw1j6@2WVb8?H#pd1{=gK^*~zXXFwmr9PP366 zGkoVtKf&5G_w$kzuezIV;c}H@eM3~5B4bmf{_hV>(7VPK6@cyWwN?maFyW6U79BWv zdXT)%#)<}C9K&GzvT0>$>B&N0J!4N~_Q=@<8P70w5%rh^v#t6zmCm6Ot&M4^RiDTP zJ4z4sT9I~xv#tW=&E{%{6fxL=h8c%BGnv$Ribens;ozDD)k)beKO@JpR!71I_>xMf zc-8;e4SSev%W><1^gG8;(5*WlJi|;s`NQX}b5cfcRj)w`2sA`d3`$B-DT~4}Ire(m z&_cI>>4#%;Q^MrTj@=r>S&K4bhl2poLd_13?|WqPW3WCuKM#@4IAElN7*Pv{Ue3aX z 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 literal 0 HcmV?d00001 diff --git a/lib/ProductOpener/Display.pm b/lib/ProductOpener/Display.pm index 6905c7ea2a18a..228b72978d972 100644 --- a/lib/ProductOpener/Display.pm +++ b/lib/ProductOpener/Display.pm @@ -7655,6 +7655,8 @@ JS = display_knowledge_panel($product_ref, $product_ref->{"knowledge_panels_" . $lc}, "environment_card"); $template_data_ref->{health_card_panel} = display_knowledge_panel($product_ref, $product_ref->{"knowledge_panels_" . $lc}, "health_card"); + $template_data_ref->{report_problem_card_panel} + = display_knowledge_panel($product_ref, $product_ref->{"knowledge_panels_" . $lc}, "report_problem_card"); if ($product_ref->{"knowledge_panels_" . $lc}{"contribution_card"}) { $template_data_ref->{contribution_card_panel} = display_knowledge_panel($product_ref, $product_ref->{"knowledge_panels_" . $lc}, "contribution_card"); diff --git a/lib/ProductOpener/KnowledgePanels.pm b/lib/ProductOpener/KnowledgePanels.pm index 0470409dea523..6b4affdb8f414 100644 --- a/lib/ProductOpener/KnowledgePanels.pm +++ b/lib/ProductOpener/KnowledgePanels.pm @@ -67,6 +67,7 @@ use ProductOpener::Display qw/:all/; use ProductOpener::Ecoscore qw/is_ecoscore_extended_data_more_precise_than_agribalyse/; use ProductOpener::PackagerCodes qw/%packager_codes/; use ProductOpener::KnowledgePanelsContribution qw/create_contribution_card_panel/; +use ProductOpener::KnowledgePanelsReportProblem qw/create_report_problem_card_panel/; use JSON::PP; use Encode; @@ -196,6 +197,7 @@ sub create_knowledge_panels ($product_ref, $target_lc, $target_cc, $options_ref) create_health_card_panel($product_ref, $target_lc, $target_cc, $options_ref); create_environment_card_panel($product_ref, $target_lc, $target_cc, $options_ref); + create_report_problem_card_panel($product_ref, $target_lc, $target_cc, $options_ref); my $has_contribution_card = create_contribution_card_panel($product_ref, $target_lc, $target_cc, $options_ref); # Create the root panel that contains the panels we want to show directly on the product page diff --git a/lib/ProductOpener/KnowledgePanelsReportProblem.pm b/lib/ProductOpener/KnowledgePanelsReportProblem.pm new file mode 100644 index 0000000000000..75ce17b8abcb5 --- /dev/null +++ b/lib/ProductOpener/KnowledgePanelsReportProblem.pm @@ -0,0 +1,123 @@ +# This file is part of Product Opener. +# +# Product Opener +# Copyright (C) 2011-2023 Association Open Food Facts +# Contact: contact@openfoodfacts.org +# Address: 21 rue des Iles, 94100 Saint-Maur des Fossés, France +# +# Product Opener is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +=head1 NAME + +ProductOpener::KnowledgePanelsReportProblem - Generate knowledge panels to report a problem with the data or the product + +=head1 SYNOPSIS + +Knowledge panels to indicate how to report a problem with the product data, +or with the product (e.g. link to report to authorities like SignalConso in France) + +=cut + +package ProductOpener::KnowledgePanelsReportProblem; + +use ProductOpener::PerlStandards; +use Exporter qw< import >; + +use Log::Any qw($log); + +BEGIN { + use vars qw(@ISA @EXPORT_OK %EXPORT_TAGS); + @EXPORT_OK = qw( + &create_report_problem_card_panel + &create_data_quality_panel + ); # symbols to export on request + %EXPORT_TAGS = (all => [@EXPORT_OK]); +} + +use vars @EXPORT_OK; + +use ProductOpener::KnowledgePanels qw(create_panel_from_json_template); +use ProductOpener::Tags qw(:all); + +use Encode; +use Data::DeepAccess qw(deep_get); + +=head2 create_report_problem_card_panel ( $product_ref, $target_lc, $target_cc, $options_ref ) + +Creates a knowledge panel card that contains all knowledge panels related to reporting problems. + +=head3 Arguments + +=head4 product reference $product_ref + +Loaded from the MongoDB database, Storable files, or the OFF API. + +=head4 language code $target_lc + +Returned attributes contain both data and strings intended to be displayed to users. +This parameter sets the desired language for the user facing strings. + +=head4 country code $target_cc + +We may display country specific recommendations from health authorities, or country specific scores. + +=head4 options reference $options_ref + +=cut + +sub create_report_problem_card_panel ($product_ref, $target_lc, $target_cc, $options_ref) { + + $log->debug("create contribution card panel", {code => $product_ref->{code}}) if $log->is_debug(); + + my @panels = (); + my $panel_data_ref = {}; + + # TODO: add a panel to display the consumer service contact information if we have it + # for the owner of the product. Otherwise, warn that we don't make or sell the product + # + add promo message for the pro platform ("Are you the owner? Add your contact information") + + # Panel to tell users that they can fix the data themselves + + create_panel_from_json_template( + "incomplete_or_incorrect_data", + "api/knowledge-panels/report_problem/incomplete_or_incorrect_data.tt.json", + $panel_data_ref, $product_ref, $target_lc, $target_cc, $options_ref + ); + push(@panels, "incomplete_or_incorrect_data"); + + # TODO: add a panel for Nutri-Patrol once it is ready + + # Panels to report product issues to local authorities + + # France - SignalConso + + if (($target_cc eq "fr") and ($target_lc eq "fr")) { + + create_panel_from_json_template( + "fr_report_product_signalconso", + "api/knowledge-panels/report_problem/fr_report_product_signalconso.tt.json", + $panel_data_ref, $product_ref, $target_lc, $target_cc, $options_ref + ); + push(@panels, "fr_report_product_signalconso"); + } + + my $panel_data_ref = {report_problem_panels => \@panels,}; + create_panel_from_json_template("report_problem_card", + "api/knowledge-panels/report_problem/report_problem_card.tt.json", + $panel_data_ref, $product_ref, $target_lc, $target_cc, $options_ref); + + return; +} + +1; diff --git a/lib/ProductOpener/Products.pm b/lib/ProductOpener/Products.pm index d4e2d66051ade..2e76577022b11 100644 --- a/lib/ProductOpener/Products.pm +++ b/lib/ProductOpener/Products.pm @@ -2798,54 +2798,31 @@ This function is called by the web/panels/panel.tt.html template for knowledge p =cut +my %actions_urls = ( + edit_product => "", + add_categories => "#categories", + add_ingredients_image => "#ingredients", + add_ingredients_text => "#ingredients", + add_nutrition_facts_image => "#nutrition", + add_nutrition_facts => "#nutrition", + add_packaging_image => "#packaging", + add_packaging_text => "#packaging", + add_packaging_components => "#packaging", + add_origins => "#origins", + add_quantity => "#product_characteristics", + add_stores => "#stores", + add_packager_codes_image => "#packager_codes", + add_labels => "#labels", + add_countries => "#countries", +); + sub product_action_url ($code, $action) { my $url = "/cgi/product.pl?type=edit&code=" . $code; - if ($action eq "add_categories") { - $url .= "#categories"; - } - elsif ($action eq "add_ingredients_image") { - $url .= "#ingredients"; - } - elsif ($action eq "add_ingredients_text") { - $url .= "#ingredients"; - } - elsif ($action eq "add_nutrition_facts_image") { - $url .= "#nutrition"; - } - elsif ($action eq "add_nutrition_facts") { - $url .= "#nutrition"; - } - elsif ($action eq "add_packaging_image") { - $url .= "#packaging"; - } - elsif ($action eq "add_packaging_text") { - $url .= "#packaging"; - } - elsif ($action eq "add_packaging_components") { - $url .= "#packaging"; - } - # Note: 27/11/2022 - Pierre - The following HTML anchors links will do nothing unless a matching custom HTML anchor is added in the future to the product edition template - elsif ($action eq "add_origins") { - $url .= "#origins"; - } - elsif ($action eq "add_quantity") { - $url .= "#product_characteristics"; - } - elsif ($action eq "add_stores") { - $url .= "#stores"; - } - elsif ($action eq "add_packager_codes_image") { - $url .= "#packager_codes"; - } - elsif ($action eq "add_labels") { - $url .= "#labels"; - } - elsif ($action eq "add_countries") { - $url .= "#countries"; + if (defined $actions_urls{$action}) { + $url .= $actions_urls{$action}; } - # END will do nothing unless a custom section is added else { $log->error("unknown product action", {code => $code, action => $action}); } diff --git a/lib/ProductOpener/Store.pm b/lib/ProductOpener/Store.pm index a0ba10a07eaf9..a204590093762 100644 --- a/lib/ProductOpener/Store.pm +++ b/lib/ProductOpener/Store.pm @@ -45,6 +45,7 @@ use ProductOpener::Config qw/:all/; use ProductOpener::Paths qw/:all/; use Storable qw(lock_store lock_nstore lock_retrieve); + use URI::Escape::XS; use Unicode::Normalize; use Log::Any qw($log); diff --git a/po/common/common.pot b/po/common/common.pot index ca2be7d6adf6d..cfafad15b760d 100644 --- a/po/common/common.pot +++ b/po/common/common.pot @@ -6842,6 +6842,34 @@ msgctxt "sweetener" msgid "sweetener" msgstr "" +msgctxt "action_edit_product" +msgid "Complete or correct product information" +msgstr "Complete or correct product information" + +msgctxt "report_problem_panel_title" +msgid "Report a problem" +msgstr "Report a problem" + +msgctxt "incomplete_or_incorrect_data_title" +msgid "Incomplete or incorrect information?" +msgstr "Incomplete or incorrect information?" + +msgctxt "incomplete_or_incorrect_data_subtitle_off" +msgid "Category, labels, ingredients, allergens, nutritional information, photos etc." +msgstr "Category, labels, ingredients, allergens, nutritional information, photos etc." + +msgctxt "incomplete_or_incorrect_data_content_correct" +msgid "If the information does not match the information on the packaging, you can complete or correct it. Thank you!" +msgstr "If the information does not match the information on the packaging, you can complete or correct it. Thank you!" + +msgctxt "incomplete_or_incorrect_data_content_correct_off" +msgid "Open Food Facts is a collaborative database, and every contribution is useful for all." +msgstr "Open Food Facts is a collaborative database, and every contribution is useful for all." + msgctxt "description" msgid "Description" msgstr "Description" + +msgctxt "report_problem_navigation" +msgid "Report a problem" +msgstr "Report a problem" diff --git a/po/common/en.po b/po/common/en.po index aebe9ddf1ec6a..251bc80996604 100644 --- a/po/common/en.po +++ b/po/common/en.po @@ -6861,6 +6861,36 @@ msgctxt "sweetener" msgid "sweetener" msgstr "sweetener" +msgctxt "action_edit_product" +msgid "Complete or correct product information" +msgstr "Complete or correct product information" + +msgctxt "report_problem_panel_title" +msgid "Report a problem" +msgstr "Report a problem" + +msgctxt "incomplete_or_incorrect_data_title" +msgid "Incomplete or incorrect information?" +msgstr "Incomplete or incorrect information?" + +msgctxt "incomplete_or_incorrect_data_subtitle_off" +msgid "Category, labels, ingredients, allergens, nutritional information, photos etc." +msgstr "Category, labels, ingredients, allergens, nutritional information, photos etc." + +msgctxt "incomplete_or_incorrect_data_content_correct" +msgid "If the information does not match the information on the packaging, please complete or correct it." +msgstr "If the information does not match the information on the packaging, please complete or correct it." + +msgctxt "incomplete_or_incorrect_data_content_correct_off" +msgid "Open Food Facts is a collaborative database, and every contribution is useful for all." +msgstr "Open Food Facts is a collaborative database, and every contribution is useful for all." + msgctxt "description" msgid "Description" -msgstr "Description" \ No newline at end of file +msgstr "Description" + +msgctxt "report_problem_navigation" +msgid "Report a problem" +msgstr "Report a problem" + + diff --git a/po/common/fr.po b/po/common/fr.po index d7e5c74c6026f..b42c3dc9439f8 100644 --- a/po/common/fr.po +++ b/po/common/fr.po @@ -6829,4 +6829,30 @@ msgctxt "api_result_product_reverted" msgid "Product reverted to the specified revision" msgstr "Produit rétabli à la version spécifiée" +msgctxt "action_edit_product" +msgid "Complete or correct product information" +msgstr "Compléter ou corriger les informations du produit" +msgctxt "report_problem_panel_title" +msgid "Report a problem" +msgstr "Signaler un problème" + +msgctxt "incomplete_or_incorrect_data_title" +msgid "Incomplete or incorrect information?" +msgstr "Informations incomplètes ou incorrectes ?" + +msgctxt "incomplete_or_incorrect_data_subtitle_off" +msgid "Category, labels, ingredients, allergens, nutritional information, photos etc." +msgstr "Catégorie, labels, ingrédients, allergènes, informations nutritionnelles, photos etc." + +msgctxt "incomplete_or_incorrect_data_content_correct" +msgid "If the information does not match the information on the packaging, you can complete or correct it. Thank you!" +msgstr "Si les informations ne correspondent pas aux informations présentes sur l'emballage, vous pouvez les compléter ou de les corriger. Merci !" + +msgctxt "incomplete_or_incorrect_data_content_correct_off" +msgid "Open Food Facts is a collaborative database, and every contribution is useful for all." +msgstr "Open Food Facts est une base de données collaborative, et chaque contribution est utile à tous." + +msgctxt "report_problem_navigation" +msgid "Signaler un problème" +msgstr "Signaler un problème" \ No newline at end of file diff --git a/stop_words.txt b/stop_words.txt index 9986eb2c4c626..8194f07261249 100644 --- a/stop_words.txt +++ b/stop_words.txt @@ -228,6 +228,7 @@ scrypt Scrypt serverTimePretty sftp +SignalConso sirop slad Sonnenblumen diff --git a/templates/api/knowledge-panels/report_problem/fr_report_product_signalconso.tt.json b/templates/api/knowledge-panels/report_problem/fr_report_product_signalconso.tt.json new file mode 100644 index 0000000000000..def790d4b53b5 --- /dev/null +++ b/templates/api/knowledge-panels/report_problem/fr_report_product_signalconso.tt.json @@ -0,0 +1,35 @@ +{ + "level": "info", + "topics": [ + "problem" + ], + "expand_for": "large", + "evaluation": "neutral", + "title_element": { + "title": "Faire un signalement sur SignalConso", + "subtitle": "Etiquetage non conforme, vente d'un produit périmé, présence d'un corps étranger, etc.", + "icon_url": "[% static_subdomain %]/images/panels/report_problem/signalconso.png", + }, + "elements": [ + { + "element_type": "text", + "text_element": { + "html": ` +Vous avez rencontré un problème avec ce produit : étiquetage non conforme, produit périmé encore en vente, +présence d'un corps étranger, etc. ?
+Faites un signalement à l'entreprise et à la répression des fraudes sur SignalConso, un outil de la +Direction générale de la concurrence, de la consommation et de la répression des fraudes (DGCCRF). + ` + }, + }, + { + "element_type": "image", + "image_element": { + "url": "[% static_subdomain %]/images/panels/report_problem/signalconso-button.png", + "alt": "Je fais un signalement sur SignalConso", + "link_url": "https://signal.conso.gouv.fr/fr/alimentaire-codebarres/faire-un-signalement?gtin=[% product.code %]&utm_source=openfoodfacts&utm_campaign=product_page_panel" + } + + } + ] +} diff --git a/templates/api/knowledge-panels/report_problem/incomplete_or_incorrect_data.tt.json b/templates/api/knowledge-panels/report_problem/incomplete_or_incorrect_data.tt.json new file mode 100644 index 0000000000000..13015bf8fcad5 --- /dev/null +++ b/templates/api/knowledge-panels/report_problem/incomplete_or_incorrect_data.tt.json @@ -0,0 +1,31 @@ +{ + "level": "info", + "topics": [ + "problem" + ], + "expand_for": "large", + "evaluation": "neutral", + "title_element": { + "title": "[% edq(lang('incomplete_or_incorrect_data_title')) %]", + "subtitle": "[% edq(lang('incomplete_or_incorrect_data_subtitle_off')) %]", + "icon_url": "[% static_subdomain %]/images/logos/off-logo-icon-light.svg", + }, + "elements": [ + { + "element_type": "text", + "text_element": { + "html": ` + [% lang('incomplete_or_incorrect_data_content_correct') %] + [% lang('incomplete_or_incorrect_data_content_correct_off') %] + ` + }, + }, + { + "element_type": "action", + "action_element": { + "html": "", + "actions": ["edit_product"] + } + } + ] +} diff --git a/templates/api/knowledge-panels/report_problem/report_problem_card.tt.json b/templates/api/knowledge-panels/report_problem/report_problem_card.tt.json new file mode 100644 index 0000000000000..182f26242bfb9 --- /dev/null +++ b/templates/api/knowledge-panels/report_problem/report_problem_card.tt.json @@ -0,0 +1,21 @@ +[%# A panel to indicate how to report problems with the product or its data %] +{ + "type": "card", + "expanded": true, + "topics": [ + "problems" + ], + "title_element": { + "title": "[% edq(lang('report_problem_panel_title')) %]", + }, + "elements": [ + [% FOREACH panel_name IN panel.report_problem_panels %] + { + "element_type": "panel", + "panel_element": { + "panel_id": "[% panel_name %]", + }, + }, + [% END %] + ], +} \ No newline at end of file diff --git a/templates/api/knowledge-panels/root.tt.json b/templates/api/knowledge-panels/root.tt.json index cc070f60e2c07..e17e24d623071 100644 --- a/templates/api/knowledge-panels/root.tt.json +++ b/templates/api/knowledge-panels/root.tt.json @@ -14,6 +14,12 @@ "panel_id": "environment_card", }, }, + { + "element_type": "panel", + "panel_element": { + "panel_id": "report_problem_card", + }, + }, [% IF panel.has_contribution_card %] { "element_type": "panel", diff --git a/templates/web/pages/product/product_page.tt.html b/templates/web/pages/product/product_page.tt.html index c912c87404607..5c20fcc2e0458 100755 --- a/templates/web/pages/product/product_page.tt.html +++ b/templates/web/pages/product/product_page.tt.html @@ -86,6 +86,7 @@

[% title %]

  • [% lang("your_criteria") %]
  • [% lang("health") %]
  • [% lang("environment") %]
  • +
  • [% lang("report_problem_navigation") %]
  • [% lang("contribution_navigation") %]
  • @@ -222,9 +223,6 @@

    [% lang('matching_with_your_preferences') %]

    - - - [% IF other_fields != "" %]
    @@ -247,7 +245,15 @@

    [% lang('product_other_in

    [% END %] - +
    +
    +
    +
    + [% report_problem_card_panel %] +
    +
    +
    +
    [% IF server_options_producers_platform %] diff --git a/tests/integration/expected_test_results/api_v2_product_read/get-fields-all-knowledge-panels.json b/tests/integration/expected_test_results/api_v2_product_read/get-fields-all-knowledge-panels.json index 91bf421ff2575..9e02bf78a6fc9 100644 --- a/tests/integration/expected_test_results/api_v2_product_read/get-fields-all-knowledge-panels.json +++ b/tests/integration/expected_test_results/api_v2_product_read/get-fields-all-knowledge-panels.json @@ -1313,6 +1313,36 @@ ], "type" : "card" }, + "incomplete_or_incorrect_data" : { + "elements" : [ + { + "element_type" : "text", + "text_element" : { + "html" : "\n If the information does not match the information on the packaging, please complete or correct it.\n Open Food Facts is a collaborative database, and every contribution is useful for all.\n " + } + }, + { + "action_element" : { + "actions" : [ + "edit_product" + ], + "html" : "" + }, + "element_type" : "action" + } + ], + "evaluation" : "neutral", + "expand_for" : "large", + "level" : "info", + "title_element" : { + "icon_url" : "http://static.openfoodfacts.localhost/images/logos/off-logo-icon-light.svg", + "subtitle" : "Category, labels, ingredients, allergens, nutritional information, photos etc.", + "title" : "Incomplete or incorrect information?" + }, + "topics" : [ + "problem" + ] + }, "ingredients" : { "elements" : [ { @@ -1966,6 +1996,24 @@ "environment" ] }, + "report_problem_card" : { + "elements" : [ + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "incomplete_or_incorrect_data" + } + } + ], + "expanded" : true, + "title_element" : { + "title" : "Report a problem" + }, + "topics" : [ + "problems" + ], + "type" : "card" + }, "root" : { "elements" : [ { @@ -1979,6 +2027,12 @@ "panel_element" : { "panel_id" : "environment_card" } + }, + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "report_problem_card" + } } ], "expanded" : true, diff --git a/tests/integration/expected_test_results/api_v2_product_read/get-fields-attribute-groups-all-knowledge-panels.json b/tests/integration/expected_test_results/api_v2_product_read/get-fields-attribute-groups-all-knowledge-panels.json index 7f7a13f763f64..f1049c039a058 100644 --- a/tests/integration/expected_test_results/api_v2_product_read/get-fields-attribute-groups-all-knowledge-panels.json +++ b/tests/integration/expected_test_results/api_v2_product_read/get-fields-attribute-groups-all-knowledge-panels.json @@ -1961,6 +1961,36 @@ ], "type" : "card" }, + "incomplete_or_incorrect_data" : { + "elements" : [ + { + "element_type" : "text", + "text_element" : { + "html" : "\n If the information does not match the information on the packaging, please complete or correct it.\n Open Food Facts is a collaborative database, and every contribution is useful for all.\n " + } + }, + { + "action_element" : { + "actions" : [ + "edit_product" + ], + "html" : "" + }, + "element_type" : "action" + } + ], + "evaluation" : "neutral", + "expand_for" : "large", + "level" : "info", + "title_element" : { + "icon_url" : "http://static.openfoodfacts.localhost/images/logos/off-logo-icon-light.svg", + "subtitle" : "Category, labels, ingredients, allergens, nutritional information, photos etc.", + "title" : "Incomplete or incorrect information?" + }, + "topics" : [ + "problem" + ] + }, "ingredients" : { "elements" : [ { @@ -2614,6 +2644,24 @@ "environment" ] }, + "report_problem_card" : { + "elements" : [ + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "incomplete_or_incorrect_data" + } + } + ], + "expanded" : true, + "title_element" : { + "title" : "Report a problem" + }, + "topics" : [ + "problems" + ], + "type" : "card" + }, "root" : { "elements" : [ { @@ -2627,6 +2675,12 @@ "panel_element" : { "panel_id" : "environment_card" } + }, + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "report_problem_card" + } } ], "expanded" : true, diff --git a/tests/integration/expected_test_results/api_v2_product_read/get-knowledge-panels-fr.json b/tests/integration/expected_test_results/api_v2_product_read/get-knowledge-panels-fr.json index 965a9fb3ab45c..9548fe5c6ac56 100644 --- a/tests/integration/expected_test_results/api_v2_product_read/get-knowledge-panels-fr.json +++ b/tests/integration/expected_test_results/api_v2_product_read/get-knowledge-panels-fr.json @@ -627,6 +627,36 @@ ], "type" : "card" }, + "incomplete_or_incorrect_data" : { + "elements" : [ + { + "element_type" : "text", + "text_element" : { + "html" : "\n Si les informations ne correspondent pas aux informations présentes sur l'emballage, vous pouvez les compléter ou de les corriger. Merci !\n Open Food Facts est une base de données collaborative, et chaque contribution est utile à tous.\n " + } + }, + { + "action_element" : { + "actions" : [ + "edit_product" + ], + "html" : "" + }, + "element_type" : "action" + } + ], + "evaluation" : "neutral", + "expand_for" : "large", + "level" : "info", + "title_element" : { + "icon_url" : "http://static.openfoodfacts.localhost/images/logos/off-logo-icon-light.svg", + "subtitle" : "Catégorie, labels, ingrédients, allergènes, informations nutritionnelles, photos etc.", + "title" : "Informations incomplètes ou incorrectes ?" + }, + "topics" : [ + "problem" + ] + }, "ingredients" : { "elements" : [ { @@ -1280,6 +1310,24 @@ "environment" ] }, + "report_problem_card" : { + "elements" : [ + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "incomplete_or_incorrect_data" + } + } + ], + "expanded" : true, + "title_element" : { + "title" : "Signaler un problème" + }, + "topics" : [ + "problems" + ], + "type" : "card" + }, "root" : { "elements" : [ { @@ -1293,6 +1341,12 @@ "panel_element" : { "panel_id" : "environment_card" } + }, + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "report_problem_card" + } } ], "expanded" : true, diff --git a/tests/integration/expected_test_results/api_v2_product_read/get-knowledge-panels.json b/tests/integration/expected_test_results/api_v2_product_read/get-knowledge-panels.json index 66d0ea58d5f20..e329b055a92be 100644 --- a/tests/integration/expected_test_results/api_v2_product_read/get-knowledge-panels.json +++ b/tests/integration/expected_test_results/api_v2_product_read/get-knowledge-panels.json @@ -627,6 +627,36 @@ ], "type" : "card" }, + "incomplete_or_incorrect_data" : { + "elements" : [ + { + "element_type" : "text", + "text_element" : { + "html" : "\n If the information does not match the information on the packaging, please complete or correct it.\n Open Food Facts is a collaborative database, and every contribution is useful for all.\n " + } + }, + { + "action_element" : { + "actions" : [ + "edit_product" + ], + "html" : "" + }, + "element_type" : "action" + } + ], + "evaluation" : "neutral", + "expand_for" : "large", + "level" : "info", + "title_element" : { + "icon_url" : "http://static.openfoodfacts.localhost/images/logos/off-logo-icon-light.svg", + "subtitle" : "Category, labels, ingredients, allergens, nutritional information, photos etc.", + "title" : "Incomplete or incorrect information?" + }, + "topics" : [ + "problem" + ] + }, "ingredients" : { "elements" : [ { @@ -1280,6 +1310,24 @@ "environment" ] }, + "report_problem_card" : { + "elements" : [ + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "incomplete_or_incorrect_data" + } + } + ], + "expanded" : true, + "title_element" : { + "title" : "Report a problem" + }, + "topics" : [ + "problems" + ], + "type" : "card" + }, "root" : { "elements" : [ { @@ -1293,6 +1341,12 @@ "panel_element" : { "panel_id" : "environment_card" } + }, + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "report_problem_card" + } } ], "expanded" : true, diff --git a/tests/integration/expected_test_results/api_v3_product_read/get-fields-all-knowledge-panels.json b/tests/integration/expected_test_results/api_v3_product_read/get-fields-all-knowledge-panels.json index 819eaf1dde919..70694b067c742 100644 --- a/tests/integration/expected_test_results/api_v3_product_read/get-fields-all-knowledge-panels.json +++ b/tests/integration/expected_test_results/api_v3_product_read/get-fields-all-knowledge-panels.json @@ -1315,6 +1315,36 @@ ], "type" : "card" }, + "incomplete_or_incorrect_data" : { + "elements" : [ + { + "element_type" : "text", + "text_element" : { + "html" : "\n If the information does not match the information on the packaging, please complete or correct it.\n Open Food Facts is a collaborative database, and every contribution is useful for all.\n " + } + }, + { + "action_element" : { + "actions" : [ + "edit_product" + ], + "html" : "" + }, + "element_type" : "action" + } + ], + "evaluation" : "neutral", + "expand_for" : "large", + "level" : "info", + "title_element" : { + "icon_url" : "http://static.openfoodfacts.localhost/images/logos/off-logo-icon-light.svg", + "subtitle" : "Category, labels, ingredients, allergens, nutritional information, photos etc.", + "title" : "Incomplete or incorrect information?" + }, + "topics" : [ + "problem" + ] + }, "ingredients" : { "elements" : [ { @@ -1968,6 +1998,24 @@ "environment" ] }, + "report_problem_card" : { + "elements" : [ + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "incomplete_or_incorrect_data" + } + } + ], + "expanded" : true, + "title_element" : { + "title" : "Report a problem" + }, + "topics" : [ + "problems" + ], + "type" : "card" + }, "root" : { "elements" : [ { @@ -1981,6 +2029,12 @@ "panel_element" : { "panel_id" : "environment_card" } + }, + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "report_problem_card" + } } ], "expanded" : true, diff --git a/tests/integration/expected_test_results/api_v3_product_read/get-fields-attribute-groups-all-knowledge-panels.json b/tests/integration/expected_test_results/api_v3_product_read/get-fields-attribute-groups-all-knowledge-panels.json index c64fc37593c20..370e7e9b41d74 100644 --- a/tests/integration/expected_test_results/api_v3_product_read/get-fields-attribute-groups-all-knowledge-panels.json +++ b/tests/integration/expected_test_results/api_v3_product_read/get-fields-attribute-groups-all-knowledge-panels.json @@ -1963,6 +1963,36 @@ ], "type" : "card" }, + "incomplete_or_incorrect_data" : { + "elements" : [ + { + "element_type" : "text", + "text_element" : { + "html" : "\n If the information does not match the information on the packaging, please complete or correct it.\n Open Food Facts is a collaborative database, and every contribution is useful for all.\n " + } + }, + { + "action_element" : { + "actions" : [ + "edit_product" + ], + "html" : "" + }, + "element_type" : "action" + } + ], + "evaluation" : "neutral", + "expand_for" : "large", + "level" : "info", + "title_element" : { + "icon_url" : "http://static.openfoodfacts.localhost/images/logos/off-logo-icon-light.svg", + "subtitle" : "Category, labels, ingredients, allergens, nutritional information, photos etc.", + "title" : "Incomplete or incorrect information?" + }, + "topics" : [ + "problem" + ] + }, "ingredients" : { "elements" : [ { @@ -2616,6 +2646,24 @@ "environment" ] }, + "report_problem_card" : { + "elements" : [ + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "incomplete_or_incorrect_data" + } + } + ], + "expanded" : true, + "title_element" : { + "title" : "Report a problem" + }, + "topics" : [ + "problems" + ], + "type" : "card" + }, "root" : { "elements" : [ { @@ -2629,6 +2677,12 @@ "panel_element" : { "panel_id" : "environment_card" } + }, + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "report_problem_card" + } } ], "expanded" : true, diff --git a/tests/integration/expected_test_results/api_v3_product_read/get-knowledge-panels-fr.json b/tests/integration/expected_test_results/api_v3_product_read/get-knowledge-panels-fr.json index 54966d8f3f6bd..1467559f66f5e 100644 --- a/tests/integration/expected_test_results/api_v3_product_read/get-knowledge-panels-fr.json +++ b/tests/integration/expected_test_results/api_v3_product_read/get-knowledge-panels-fr.json @@ -628,6 +628,36 @@ ], "type" : "card" }, + "incomplete_or_incorrect_data" : { + "elements" : [ + { + "element_type" : "text", + "text_element" : { + "html" : "\n Si les informations ne correspondent pas aux informations présentes sur l'emballage, vous pouvez les compléter ou de les corriger. Merci !\n Open Food Facts est une base de données collaborative, et chaque contribution est utile à tous.\n " + } + }, + { + "action_element" : { + "actions" : [ + "edit_product" + ], + "html" : "" + }, + "element_type" : "action" + } + ], + "evaluation" : "neutral", + "expand_for" : "large", + "level" : "info", + "title_element" : { + "icon_url" : "http://static.openfoodfacts.localhost/images/logos/off-logo-icon-light.svg", + "subtitle" : "Catégorie, labels, ingrédients, allergènes, informations nutritionnelles, photos etc.", + "title" : "Informations incomplètes ou incorrectes ?" + }, + "topics" : [ + "problem" + ] + }, "ingredients" : { "elements" : [ { @@ -1281,6 +1311,24 @@ "environment" ] }, + "report_problem_card" : { + "elements" : [ + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "incomplete_or_incorrect_data" + } + } + ], + "expanded" : true, + "title_element" : { + "title" : "Signaler un problème" + }, + "topics" : [ + "problems" + ], + "type" : "card" + }, "root" : { "elements" : [ { @@ -1294,6 +1342,12 @@ "panel_element" : { "panel_id" : "environment_card" } + }, + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "report_problem_card" + } } ], "expanded" : true, diff --git a/tests/integration/expected_test_results/api_v3_product_read/get-knowledge-panels.json b/tests/integration/expected_test_results/api_v3_product_read/get-knowledge-panels.json index e0777e948f0e8..c806ed564da0a 100644 --- a/tests/integration/expected_test_results/api_v3_product_read/get-knowledge-panels.json +++ b/tests/integration/expected_test_results/api_v3_product_read/get-knowledge-panels.json @@ -628,6 +628,36 @@ ], "type" : "card" }, + "incomplete_or_incorrect_data" : { + "elements" : [ + { + "element_type" : "text", + "text_element" : { + "html" : "\n If the information does not match the information on the packaging, please complete or correct it.\n Open Food Facts is a collaborative database, and every contribution is useful for all.\n " + } + }, + { + "action_element" : { + "actions" : [ + "edit_product" + ], + "html" : "" + }, + "element_type" : "action" + } + ], + "evaluation" : "neutral", + "expand_for" : "large", + "level" : "info", + "title_element" : { + "icon_url" : "http://static.openfoodfacts.localhost/images/logos/off-logo-icon-light.svg", + "subtitle" : "Category, labels, ingredients, allergens, nutritional information, photos etc.", + "title" : "Incomplete or incorrect information?" + }, + "topics" : [ + "problem" + ] + }, "ingredients" : { "elements" : [ { @@ -1281,6 +1311,24 @@ "environment" ] }, + "report_problem_card" : { + "elements" : [ + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "incomplete_or_incorrect_data" + } + } + ], + "expanded" : true, + "title_element" : { + "title" : "Report a problem" + }, + "topics" : [ + "problems" + ], + "type" : "card" + }, "root" : { "elements" : [ { @@ -1294,6 +1342,12 @@ "panel_element" : { "panel_id" : "environment_card" } + }, + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "report_problem_card" + } } ], "expanded" : true, diff --git a/tests/integration/expected_test_results/api_v3_product_write/patch-request-fields-updated-attribute-groups-knowledge-panels.json b/tests/integration/expected_test_results/api_v3_product_write/patch-request-fields-updated-attribute-groups-knowledge-panels.json index f9325b254c176..866acc4cb3111 100644 --- a/tests/integration/expected_test_results/api_v3_product_write/patch-request-fields-updated-attribute-groups-knowledge-panels.json +++ b/tests/integration/expected_test_results/api_v3_product_write/patch-request-fields-updated-attribute-groups-knowledge-panels.json @@ -444,6 +444,36 @@ ], "type" : "card" }, + "incomplete_or_incorrect_data" : { + "elements" : [ + { + "element_type" : "text", + "text_element" : { + "html" : "\n If the information does not match the information on the packaging, please complete or correct it.\n Open Food Facts is a collaborative database, and every contribution is useful for all.\n " + } + }, + { + "action_element" : { + "actions" : [ + "edit_product" + ], + "html" : "" + }, + "element_type" : "action" + } + ], + "evaluation" : "neutral", + "expand_for" : "large", + "level" : "info", + "title_element" : { + "icon_url" : "http://static.openfoodfacts.localhost/images/logos/off-logo-icon-light.svg", + "subtitle" : "Category, labels, ingredients, allergens, nutritional information, photos etc.", + "title" : "Incomplete or incorrect information?" + }, + "topics" : [ + "problem" + ] + }, "ingredients" : { "elements" : [ { @@ -829,6 +859,24 @@ "environment" ] }, + "report_problem_card" : { + "elements" : [ + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "incomplete_or_incorrect_data" + } + } + ], + "expanded" : true, + "title_element" : { + "title" : "Report a problem" + }, + "topics" : [ + "problems" + ], + "type" : "card" + }, "root" : { "elements" : [ { @@ -842,6 +890,12 @@ "panel_element" : { "panel_id" : "environment_card" } + }, + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "report_problem_card" + } } ], "expanded" : true, diff --git a/tests/integration/expected_test_results/data_quality_knowledge_panel/data-quality.json b/tests/integration/expected_test_results/data_quality_knowledge_panel/data-quality.json index 156ec02bc6052..368f4417e0247 100644 --- a/tests/integration/expected_test_results/data_quality_knowledge_panel/data-quality.json +++ b/tests/integration/expected_test_results/data_quality_knowledge_panel/data-quality.json @@ -298,6 +298,36 @@ ], "type" : "card" }, + "incomplete_or_incorrect_data" : { + "elements" : [ + { + "element_type" : "text", + "text_element" : { + "html" : "\n If the information does not match the information on the packaging, please complete or correct it.\n Open Food Facts is a collaborative database, and every contribution is useful for all.\n " + } + }, + { + "action_element" : { + "actions" : [ + "edit_product" + ], + "html" : "" + }, + "element_type" : "action" + } + ], + "evaluation" : "neutral", + "expand_for" : "large", + "level" : "info", + "title_element" : { + "icon_url" : "http://static.openfoodfacts.localhost/images/logos/off-logo-icon-light.svg", + "subtitle" : "Category, labels, ingredients, allergens, nutritional information, photos etc.", + "title" : "Incomplete or incorrect information?" + }, + "topics" : [ + "problem" + ] + }, "ingredients" : { "elements" : [ { @@ -937,6 +967,24 @@ "environment" ] }, + "report_problem_card" : { + "elements" : [ + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "incomplete_or_incorrect_data" + } + } + ], + "expanded" : true, + "title_element" : { + "title" : "Report a problem" + }, + "topics" : [ + "problems" + ], + "type" : "card" + }, "root" : { "elements" : [ { @@ -951,6 +999,12 @@ "panel_id" : "environment_card" } }, + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "report_problem_card" + } + }, { "element_type" : "panel", "panel_element" : { diff --git a/tests/integration/expected_test_results/data_quality_knowledge_panel/no-data-quality.json b/tests/integration/expected_test_results/data_quality_knowledge_panel/no-data-quality.json index d13f4dd71cccb..0dce49cba2c04 100644 --- a/tests/integration/expected_test_results/data_quality_knowledge_panel/no-data-quality.json +++ b/tests/integration/expected_test_results/data_quality_knowledge_panel/no-data-quality.json @@ -260,6 +260,36 @@ ], "type" : "card" }, + "incomplete_or_incorrect_data" : { + "elements" : [ + { + "element_type" : "text", + "text_element" : { + "html" : "\n If the information does not match the information on the packaging, please complete or correct it.\n Open Food Facts is a collaborative database, and every contribution is useful for all.\n " + } + }, + { + "action_element" : { + "actions" : [ + "edit_product" + ], + "html" : "" + }, + "element_type" : "action" + } + ], + "evaluation" : "neutral", + "expand_for" : "large", + "level" : "info", + "title_element" : { + "icon_url" : "http://static.openfoodfacts.localhost/images/logos/off-logo-icon-light.svg", + "subtitle" : "Category, labels, ingredients, allergens, nutritional information, photos etc.", + "title" : "Incomplete or incorrect information?" + }, + "topics" : [ + "problem" + ] + }, "ingredients" : { "elements" : [ { @@ -840,6 +870,24 @@ "environment" ] }, + "report_problem_card" : { + "elements" : [ + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "incomplete_or_incorrect_data" + } + } + ], + "expanded" : true, + "title_element" : { + "title" : "Report a problem" + }, + "topics" : [ + "problems" + ], + "type" : "card" + }, "root" : { "elements" : [ { @@ -854,6 +902,12 @@ "panel_id" : "environment_card" } }, + { + "element_type" : "panel", + "panel_element" : { + "panel_id" : "report_problem_card" + } + }, { "element_type" : "panel", "panel_element" : { diff --git a/tests/integration/expected_test_results/page_crawler/crawler-access-product-page.html b/tests/integration/expected_test_results/page_crawler/crawler-access-product-page.html index d9841b0254b94..3455a5c120ff9 100644 --- a/tests/integration/expected_test_results/page_crawler/crawler-access-product-page.html +++ b/tests/integration/expected_test_results/page_crawler/crawler-access-product-page.html @@ -379,6 +379,7 @@

    Only-Product - Nutella
  • Your criteria
  • Health
  • Environment
  • +
  • Report a problem
  • Contribution
  • @@ -3253,13 +3254,126 @@

    Transportation

    + +
    +
    +
    +
    + - + + + +
    + + +

    Report a problem

    + + + +
    + + + + + + + +
    + +
    + + + +
    +
    +
    +
    diff --git a/tests/integration/expected_test_results/page_crawler/normal-user-access-product-page.html b/tests/integration/expected_test_results/page_crawler/normal-user-access-product-page.html index d9841b0254b94..3455a5c120ff9 100644 --- a/tests/integration/expected_test_results/page_crawler/normal-user-access-product-page.html +++ b/tests/integration/expected_test_results/page_crawler/normal-user-access-product-page.html @@ -379,6 +379,7 @@

    Only-Product - Nutella
  • Your criteria
  • Health
  • Environment
  • +
  • Report a problem
  • Contribution
  • @@ -3253,13 +3254,126 @@

    Transportation

    + +
    +
    +
    +
    + - + + + +
    + + +

    Report a problem

    + + + +
    + + + + + + + +
    + +
    + + + +
    +
    +
    +
    diff --git a/tests/integration/expected_test_results/product_read/get-existing-product.html b/tests/integration/expected_test_results/product_read/get-existing-product.html index d44104867fa52..bb61fd9b2427b 100644 --- a/tests/integration/expected_test_results/product_read/get-existing-product.html +++ b/tests/integration/expected_test_results/product_read/get-existing-product.html @@ -377,6 +377,7 @@

    Some product - 100 gYour criteria
  • Health
  • Environment
  • +
  • Report a problem
  • Contribution
  • @@ -3848,13 +3849,126 @@

    Threatened species

    + +
    +
    +
    +
    + - + + + +
    + + +

    Report a problem

    + + + +
    + + + + + + + +
    + +
    + + + +
    +
    +
    +
    diff --git a/tests/integration/expected_test_results/web_html/fr-product-2.html b/tests/integration/expected_test_results/web_html/fr-product-2.html index 1d5bbd7c22735..45699b031dbce 100644 --- a/tests/integration/expected_test_results/web_html/fr-product-2.html +++ b/tests/integration/expected_test_results/web_html/fr-product-2.html @@ -379,6 +379,7 @@

    Tarte aux pommes et aux
  • Vos critères
  • Santé
  • Environnement
  • +
  • Signaler un problème
  • Contribution
  • @@ -3449,13 +3450,203 @@

    Espèces menacées

    + + +
    +
    +
    +
    + + - + +
    + + +

    Signaler un problème

    + + + +
    + + + + + + + + + + + + + + + +
    + +
    + + + +
    +
    +
    +
    diff --git a/tests/integration/expected_test_results/web_html/fr-product.html b/tests/integration/expected_test_results/web_html/fr-product.html index c8e0c3c09a32f..9f53971987956 100644 --- a/tests/integration/expected_test_results/web_html/fr-product.html +++ b/tests/integration/expected_test_results/web_html/fr-product.html @@ -379,6 +379,7 @@

    Apple pie - Bob's pies
  • Vos critères
  • Santé
  • Environnement
  • +
  • Signaler un problème
  • Contribution
  • @@ -3463,13 +3464,203 @@

    Espèces menacées

    + + +
    +
    +
    +
    + + - + +
    + + +

    Signaler un problème

    + + + +
    + + + + + + + + + + + + + + + +
    + +
    + + + +
    +
    +
    +
    diff --git a/tests/integration/expected_test_results/web_html/world-product.html b/tests/integration/expected_test_results/web_html/world-product.html index 154406e188400..a98b02be367d5 100644 --- a/tests/integration/expected_test_results/web_html/world-product.html +++ b/tests/integration/expected_test_results/web_html/world-product.html @@ -379,6 +379,7 @@

    Apple pie - Bob's pies
  • Your criteria
  • Health
  • Environment
  • +
  • Report a problem
  • Contribution
  • @@ -3478,13 +3479,126 @@

    Threatened species

    + +
    +
    +
    +
    + - + + + +
    + + +

    Report a problem

    + + + +
    + + + + + + + +
    + +
    + + + +
    +
    +
    +