From 4cb0f87dfdc1105729c79a1368cee12b8d8cb624 Mon Sep 17 00:00:00 2001 From: Rohit Bhati Date: Tue, 24 Sep 2024 16:39:08 +0530 Subject: [PATCH] Added support for auto-detecting and setting the End-of-line character (LF/CRLF) in the query tool editor. #7393 --- docs/en_US/images/query_status_bar.png | Bin 21040 -> 47626 bytes docs/en_US/query_tool_toolbar.rst | 4 +- web/pgadmin/static/js/components/Menu.jsx | 3 +- .../ReactCodeMirror/CustomEditorView.js | 18 ++++++-- .../ReactCodeMirror/components/Editor.jsx | 9 +++- .../ReactCodeMirror/extensions/extraStates.js | 6 +++ .../js/components/QueryToolComponent.jsx | 20 ++++++--- .../js/components/QueryToolConstants.js | 5 ++- .../static/js/components/sections/Query.jsx | 15 +++++-- .../js/components/sections/StatusBar.jsx | 42 +++++++++++++++--- 10 files changed, 101 insertions(+), 21 deletions(-) diff --git a/docs/en_US/images/query_status_bar.png b/docs/en_US/images/query_status_bar.png index e885920ba9727f67f2807a4c64317f41bcc64779..fdc2d610023d58d68039cd61529f9359eb90e8cb 100644 GIT binary patch literal 47626 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 literal 21040 zcmZ^JV{m3&&~0qnwrx&q+qN;WZ9K8@QQAS!^6$Auw>)WP-0sGcerASF2AS%x?;-czapciYbpdcVH z5JlHUulD;8tlHmifOPA9`#?x6{Z-%4cSKlA_N{&m=bq>KY+f`f4V8Tq*d znNJD@hj8Kdkz;-A2dPNx0v!drAM4L%3~lr03SPDymgLkKr44Z}<4>e*fe1-c$H!RC zPeERq<6aI@4`vh#>c~I^1r+=HGrrt%*nci7?PtB!^+r?J%T8o^TBT#QKmJB$&upy? zAY`9B)cgj*v~D4QKMIvTrCQ*NQ~?d=1dWQ!T63?CVVOUywkKzBXX0 zzt=zjE+r|_x=YrX`9MecG zt+(*c>Fk%`1st=j8yvGZ*1?voji3$u;bIuURFxI;8S>RZoAE;e?P^WV161-ysmlW8 zzrfL;xeb_(6lH$LoxwwQ-h@*f6lp}r@?YU|d@kPfna7i40T=+Qy7r5`1hKEDSV4Tb z^p%t%{m@>Z&-u<@as2!f**Uez{49uPoHX3$#6{{ak#0;3o&brikyl|bw zeoxLHS_7xhbcV=8^gLL8+j+7!hOxt>bk8a>C3t(ZLd=ZLV!@#IHh~ zhqM)6*abRl7z>6~a$|4W@@I=MMo@0MCbmDuJPT1ExC3y7we7e8UOv2kx&?)LeBN%K z+EF$DL_s!d@yK+MwLy%vuriTWCd{d0&R(XO#8A6uzT~$#{g~)+y8{RL}VuzlZVQ+VA;I%5K&WQ(RD-Yb8L~*Zb13$Ov zTymZ+5uRc@c6>LT8!mDq6(3ko!gjv|zrad=^2N>JcB^nSTg)Fs1 zNHxng>TiHR{`Qw6aKe2nV4FkL4u=qJEgs zvvX4jLjW1(Kk5xNGrn9FY+AZYtp`hV0se}VrscFhB47QUu4N0py3G(a1_7WTK}S~S z6jp}2tmLz+unJi>W0L-#r8_DfF4TNR{+qi`hab29L{>?e1Qobp5wYFwBWtodBvrm{ zD!Z$3nQmSPWyOVsXl^jdHE<4AHN6(?LplxGh1~C{rp?;MyEsfu1xiv6OHc?Kd z)Z*Xc*}#DFgS?WpVkQs?xB6WADC!4&algiAfo~PTXVfcZ3)HDq)VE&??JZ*# zXzye+3>Gg-q6!K?KnVK2b9|$8FYshBx~@rMCby@<^|4dhK&tflxgG&{tQYbwBLdv8 zttyjU!gzh>RJfq!T#tQX??SjDK~^RE+xxP(U>OrAgB!nYeLk} z_=f#RydL0^_V^C8QC1#fWkz;RcHU7T&w!f#@wPP{s5D~nF^yYFqCV?kL4fx;`t)9V8L~-THoBy3pB>`5h z%Pz}RhR_gv?Xs^V82J9Y+=_E!0=)BAg5!nNYv^i}%i1X$^a531>LoW!SGy7CD48x;J^j`Sl|Fm|nBw zeS0zS_|=4}KfR9siI8VXBzcD$rQiVjRZtXH=@vuj7NAsmHg>Z1x_8AU%gfJ#9V%uN zVT3Q$zp)>6gxzo?BLWi{g>)n+n24AE9muAx!qtnBZ~L?5$+UK4e1$Fv$pTyiUA)M zv!UzE*2^=IK${+;G5FVah(R_x{Z~&1h!MGB;+pTVnYbOd9*6_K>;}SMWdSt5{ZEOm z@b@$P>n<9uv}WHsr4FESdd3ZHoII3L7PsF*B;>TMp5oRSQDvD?S+nVXI}2ahUn`tAY-jRS~WK>w{cILzqAp2z;DMZr_ot!%mZ+@6&}&letXJie3Kz z<^C%x1DL=2+tuJo-DbH`0TKeEZcDfK8&L{45id)t-KtD7nRnCC_()tHiLlWau@KVP zN>4?G79LH5TKi5J{VL_QnA zfGbWHupe*e`s!oUL>KoTQxuq`w)5eM0fv)$d6kcL+{BMY7AAxc@_G^*K93W>V>%6g ze}5CxH>A9)9bXFC_=v(d$#)G)Eo0-4P$?yo{&L1m6KKwISUDI>*~Mzkf6@Z#sc(>gCmt^#PS1=%hkcYg z=J-MF&}@TlE1zbVDod_>vEI+C(DR|HX1?UAqqDFj0q?u9q+(T{DVP3%;i=@y=;DM-*GQNmJr>E5fSasiI<<29SwsKK zT9Vc~&%?~^_;ey3=bMgOble$qz<DeOk(MCleisWL1<8NHLFx`X#9>n)Le&jK`)}1o5DDVcYEcoWrDQ3g&FhLq{ zmSLZDni1zzvG}a&kEcvZ_J+QiWnkGunKo_}0~9y6&8p*;CDXf!+Jr!BDC|8yyk%eS z%N4bGR07Y-?ia8*`=S>`QFkN`7xd5)7<&dgAw4sb+ciexu+bLkPpyZNwgUBcX!IwG<7bHTV8-_Cnao}bZnIaf`wQPq ztw1}VyD6GT7&e>T33S$K)}T0_RJ=~0%)s|)aj2CJER^M@`{%A`9}ad)cfEd3dbvVQ z`)#+w8pCF+OCQSv!j{;{AjIr^2S^#R2XI4Z;dzqOfw0PkgmT4e673`T0tX zQIYBJ+-XB5453^G-C~g$wE&q3zMv&RNsZat6QSGbi~<`BYaS9I|J%ze1Vq;4X(Ao~ z7T)NFNYE#ZK_ljcNXXUiEn&Oo?O_oqZR97Vv~tZV%(Kv}4`=akf+ss!G#T~|T;4}tHSCGSTb=Q22K%{`LjJo6C2&2*0n^gZAwCe(+I@v6rF^{kprl0sa z2X`&@|8@-h-J;^~+h}kr|YE)V$#tW)NaXny;(=hW-pIHQRFLTX> z_}m-Yv8$aDt=#}{FDwDhdg+6uZ zKJ|WlTD@eo*b>49ZU25t`d4M7koq&MfhQ<<)V)uhdsn9s@bgM=;0!y}U5V3eWy|m7 zo*&X8X!K&R%1m~M;g{nuZ=csOTm~M@qHH6RABQM*&%ra^ZqOAnG34IVm^IZgELdNV z$3P8C30u-E$AJEX+9{KP-Ae5x9SylA>p?@N5iGm0x?+w{tUI`VLPaoXeM)h1=63@5 zdV8Z1M<*1Mu#HV6!BPMTVP|Wr&Q?k%28} zuvwwVpuNx1pMR1GD3YuqBvE1hu%&3$>K~9Lt8&9#mx0}Ot@ZU89NeeY?d8&eEJhj;tH5>ytJ(W?uq)qe z+iFV@m8CSUEi%8@<`2C^H>?aK6fpO?$700v>_0r;`d#xx&NG^jBfzUUHhR2r=-DsNL7|&03qDms!|ie*4PG zLy3GISGEul7%Y+YJP?0B0tGmRpsKKBx>Np!w%|;QEy=v8#}K`Uw#?~{__owYb%KMJ z!tSfwpae_Zld#xBFN;<9(S^?jTPZbux=YFKC;xSPpz{Gw!N@`Kzs*LLQ7xBe4cs>^ zHP9&x!N`lk&DHP|eNFET8-B6e@9QTY(J3SE+&DQ#Q`H~x;9h-v&3qafZ+0hDC3kq5 z4`nMHW+g9ye~~gSOdks$i27#UU(Y{<6>4$XjZ8 z>8sQZcS5OOhX(Ccvn#uQez7+6lQQqsdbU3y>EVanz;o~5sX@j0=!R4La05LakD9YV zq7sJ>_&ax`^Ii-KLPG0aRKf{h&_UCPVgeD+p2>(DgY}Bbm5$jHS~KkRmeNnT{Q7rx z2Jz;&F!7b6kLj56`taAN!x?pDS6`})9g68PaO8pX{{xV z%3Si_EE?&}8QCE1bZiSA1+I#)_p1Pm%xthU$~n6dy+f@4(D(T=(!WGoW+;noUo^{? zjfH1eUfHsa99_Y6rokS0?Q+fNOUFSbRuR_|nzMpn9?Pqu10O;R#~df2`J@(h-k}d> z8m3N%J^|SwkfhFU{?nq6R;{ABnS<#Y<=XvVBS+Qq+Ko{MqCcH>8_~DP5hiGk5j{&> zb+Gsnh}aFOd1e_xaQabUp-mtRFaSD@uAIgTPZ6#*L?9G>(kCr{+0lm*BW0ybNk!a1 zk?k#DN^qu|M1FbVR(q}8Bp(2H=W`zh2PEV&sRqQxdY%4!f_R0nj#7MeY~1v z4?P!(7GKhCG@}`oq|R=nu;7~108GnE#&Ob!34X;xL=xVIqC|F+LRtVR4?@+-t;YD> zuFydISc8Tob`!AxD$b(G@KE0;emH?5-Q#VukkG)uVa7WcZimBWTjK3(;9ivKI4g7U z3q+n4nlF%$&#!dLl7Y@wS+Z)3Tq?0nwG~g3>INrp>)BLi}D)*^+WwjC=Fw zdM_^ewh+>I`P{?USYMuIyDiy5!Bwb$m!@~PLOY{=%UJvcN||!v(q`u$x8rz$u(1Dk z)W_5ZLKzLp89;6ihG^B=Y8RSWgF4+W6)o!Ze`7A7|IE9&-ti66Y(jhg_>ifIE-ysT z?+Q3f$O0o+!sH-+p?`>y62Ib@^;+$;G>89KB^Dk;UX3T_a*R!{1Ca*Mhz`r9X$y9S zmdY$z67qZ4toE99MEgBJ5ECwu!tIUSLIve;Z!?__>}D=qfV#3;%Vtx!G#(5q74%dp zjCHu3M2tq?tN`xUl?Ge#1j1NtLQF}n(oUHtsILGf8lF&G9-p@cN5)l&>zAf(H& zxIGb!h>gl3X^^-0$hWsr0wDwjrb3kR*?Iy#BIZK1M9^UgZGW(3nWfQb?30lHcnJax z#Q__Jz>y&iDpD{`O|gKvXVu4RSc)Q>hvsx}8In5tF>2WJdIO8RwpMCrv)HH5mWCOp z5NxH02YiR`w9n@FM!75PCld#6qMolK#_o4i z>GOz>V^sEISXQlK8U%s6Dex;;WF&zw)kt$k5y!xIrQi#rmpq762esAlGXux1Vqtcd zd1Uts3@5G964GJ~X@W=OkbK1DV5q!F=RUn7{Cvi}R7++NU?`D$6Hhonp;a!Q^%Cy# zTIm72NnY}`8aq3@bUV9oNqwXey3^|QgWP)5W;NTZ-k-dr!jBcNyU(bt1tpRKpsN(o z_bKKIfa6fleG@ln6|unYn)h_Z$XZZ&Pp$z%G;$Xfy@EzwzLZ32h5(&P@oKxP;Y4u;GUtaB^CGp(+!DC}xn#TwOz01S zbe}-sKfv3A6nxVK+@n)!h3qh+rz*9(jCVa({bVwenWO8#hc%fe)Q9_Qa;ur6@l;NS zjkq9qc8QO>X@iJ|zcvSU**q#>)7WtRN@3U3z}tMTRscKYIM%5Gm?G;k6|@rGH)8P??P=7{C4!i58$C_<@xT|N6%|*>tHwA;)vC zu)kB2%yKkpD03o>QAy#uvU)`(c*qd`N_NZYeYIjbvvQ%(n84UuqGRn`cm;~hqGKy& zk_Z*dkr_)R<`t))u#81h@qB186uT-Hr_M_#pVSM|kcU_CP(?bmI|@P}5>?OZwb{oL zaosZfII3I+bSGKJ6-C73l1*c?cp~7f6jyie6gA23_8u20 zN-5-(9TX3MM#QChzufp~z0)mGx8cz*uM78^QU7KwH4{TW;Om&1fg!T$tq|d^Q0ZS4 zspf%n{Z^Q11`;u+Pc4!-&sc^|($EBrhFUv0g1C@b(U0(y3Ta7;3Pl4Lao66G&BZdg z$>+c7#Wx<_Q7m7V4S~0hk40!xqzQU(l@iN~DsC4Wby9!XEO=f$Tq)(!!vt&gq4&>{)eX?qr*?sy70~MDgy^H?tS)`Ruv{aNa&`zNyEb3vBxfz3>)nWhEyk(`$;?J{m<~=xGPDh1q@$ zi&?PUUNF!siq6fk&>@pjo0vsytthi;#PWw{NAoF{!`$X|Q9iW|1sIY@NU$mM!IELE zDxlJlgs7KB19rq&V`##Yuw<>rP_yy=1{%tPYGGXKC`-1h$PKW;7{=+UtA#MH!z751 zX!~(4A5^GFbx37XJJ6~2US3|$8K)4_AIF>$*1F1`IL`W)_nyx6zss4aGX&zALZ6w) zK))^7$bz{(^MV6#YoRKAKko~a#z^St3oxYr=(5Cq>=(#PH2X~32El;(tZ3kK=HIqd z1a0X@`%FSl0OcEug9*e!oM03w>BVq6n4kqj0j8QkWd$4MGPM(78{FNuY~>QFB%luu z>@!ownfYQ;2iaF}Hv_W;FY88A88OvWH>J$(oe;!`{^B*%V>@ow;6$Q=EoD#q)UxN( z@1uo@uhMFZ+1)T)&xgV<%@oqY(ZA?em6^M54yN_ml3*|cfb*kUuVG5>=IJ5@Zs%1M zu)}k!rC+mO1I$npUR5WQ53#%hJt5J#@C*}R%n=8rsfxwOEND!C_vixHWOcS?y7rLq zMAZlhZY@-&;2>j(B2Z?(et7pzO9sB2cjdx3y@IzFqZXfKS%yoU?nrmrLNx4yFeGnw z%(>v|Y?TSp*-nX1MTyaLqM-su8(vSm;p!q&4w-9LvI?2@7IAG;L;OvuJdv!x7i93% zSJ5=WLsXLjuLHBM58-wup7sW#40B=-S?H3%_su}ZN6bM<1<^aBReX5GbXb7*v+qvq zb3|dHxH7djBE%mr+A{jlfOrn-rQb04$)M=gXDd4R+%Gm>1Ag~*C(Y@8_6Roh>=-X+Xm1+bacy0px*wV*jhvfOf`+3B*XMU|`bJ_uWv*=Y*#4-w(Pl{{md$|(P4pB#CDLi&R zkhLFK=&nh%#XdZ~LXm091ACZi=JS4T6FLr?-p22~*THvw#Mzs_`tQVG{xD7o=R=fN zUv_?OPVYzci~Sj{SsD3Upu}T$I5OGLv2YHH;;nsFv%GKjrnQEVinO>rI$m z+WJmSp2rABZ7A009Ss=n5**$q?+7}EFdO54V&z|dL%+L>0bR>5%FDFj*09}(;!_;W zAs;7}s?#V zfxAMu@!NHo&RdC5GB~Gx{CB_4k|k%B!cIiFJq`Br(GnP zR9IVSRB*ufc@j6POY+T#o6*Mf?b2Nc+eYa;M6v|o9Y4bhu9om8y3os5Ndg=qDI=wz zGPr=EEJ--HGKM7tc!Iv~_9Ja&E}^9;E`)`bs5>XW7Q^d;(?6Wm7d#g8-x`i!KFJfo zJgbJ!RJ8Vgd1G7vlw7o8zb7ce9AzRYDp5J%6xVkW(){Sx@L!J8ciqivGa)SAOW%cm zW}KodsUo@2rZlGPMIm`Mp!gQ(P1v^$_+I<(g}^gEG*?{w2>&$+I^m^-*NaRm`e3ZQ zfyBlHJ0WoSSLqR8_?9lw0Ov|{&Rgm5vQ(*g0^1Wk0J*(4uR*W1;O*z@dfy&6`rN^} zAA3t2-UIS8X`6AGO>2M|)G9jYHCZkP??DR&n~22`b1>e)?qfYR1~*KRGGGEO3syz$ zs`HJAmH&55Rq1tcr?CJ60Zqw|$|U=8`#YkShB`f&*>{BpfK=tfme`rxnQ{|UT&ad^ zuhTzG81gl+sbI5XsW?P0v*Vz>?hb)F`qYkwleavM>$3Aw>s!1{yY_9rh6#fys`cD( zo_s{_anS^N9yH!yU!?AG+~9mJvb0>F4q8@~DUp`UILzEcU9x{f69?=BP=uh%^YVNg zkks7=vsDSLCA%&{wpvB+-MEjkPMLe(2D7u0N#D?Wa+2d@z@>cR#LFMFxwm!W8pDyP z!7pkiglJcWkXR*?fe0a6Z0bhI#dVo&vewy{Tkx&}D2hMB$p5)y&wOV?gsLU2ksq>u z)-&-nm-sFo3I-l{o8gzWx(wgKTzjy*;r0oMt@@VsGSTp<+b+_6hM-rJPTo}XTyVW9 z8}0BBRLJ|X(ePG|mxyTHO-8b0ma@NgtS68k8j-Sw|4diAK1$?^(2geviPv#H-IO13zH!9PL6BhCpdOJMlX`2k}&q;ib zdL8MHjUaA$9gmogdX(jZXh&q7aEs{)j*?ni+ zP3Dg)z$vFuIobeDkYRj>@h50e-7O z3mi^v8}jtSF7Dmw>p%4Fxl6MOWZ6t7Ut(O0mepNi`nfSZRi>Yr(f#%>faORrvG|%I5v-hy84SGWTg@GpZ*Thj4%(RLznYjPD zXcnX!`k)!4GkQ~5_iTyQVwenX7?+J`-4#EGg;$?y%e(yW$6Df- zIDZ{RR>7Rey%kp}ewXWpO~t&VKJ_U2(%NfB9(^q$NVxlw60lV1_MY(CFT)t3ltK=1 z-3Jc3s-H-}d>C#->_FO(dPEK|06Q$G#s2;pu(1wt!C(MHSI80hYn$Ex7NJ_-}1MeuPY zaX9=)$vI3B_5Cs0u%BSrbimB1|NeIa)io^P?&K`4K2=41U zhy`9zb0Gp+ovydF1AZX_VQUtk`hu1YF~nKZRypZpFfqx;Yhn#1qR}Ty1Xlsm@L{P! z=s4T1p(2*Zxeqk5{@ohrPOGlQIoU)|eJLPWYz$&&_}Y~5#;0i!MTeAOErZ+7u+~+Z z91?ys7Nt~t&ZO-ue>5z1FXOU zQUdIS;*HdknoW0{PmPmf<$2W~efxSf*Z{6m zpv@9KGgJaoej1nSGT;*yt>{fQIdyg$M!J^V7?-D70)?){_OV(&ou#p#Emz#QYkK+I z`;>oo+85Glg=vF9MI zf#ZqZMr1hv;t1dC+@_+)+27&GcVrP;#4xqG@b|kinXzAGRp3Yam-BF%7HM8~P9Z{# zNEQp^=mPDl5Qp-~ZaRd;&TCuy{Rz$j7*Eyka9ZIP7_T5?8VrC|hvc3{4S0Yg>OR%~W!&}gLZ@KrG{ig(A1ZBeWLyN|xUfS6H(1Nw#Tx-~f`|AGRXt*0HfC6vxe!X@ zQrmkE6guh83t_3(#luZm81TRjEeFm^r^}P@+0}sSFYTeGD0eTmciGXJN5<(!-F@;X z5w)q%D=;-t=o11VVaj`8M=)qY{GIVP!i9?F{R=k&spX+&0HACHsc+uZkb#v zk64F5CWV4T5&V86x1kR%6it71fKIz(o=A|u2zqUrRYCXROjqT4yx3PL-Pxcd-ulC@ z$H?1=La#Axh`eLz<5;i5N$I=jg7>P3GN++D3&^HbZX7yZHy7<6T zQDoaA-)s+T-+8YTLrS(9f@9+>I=%%>#jK|xOslT7_CFj$D}%=!$lr|(8bcO%_{BEu`>Wb(0ki5eye%tF+=8zI`0C^hmW!Fo_Oxx~6jZX@ouE^< z^G({^3OsK5p*J0}Wd;Rm(MoAjwB7-lcY%=KT<4d-T-VBDm}_ zESd%ThNsKUhcBHA@iXj|WEny2IrG{vh=t`J7o>^*E$l`K0Ld$hcY=O~x{qU8 zTpkKY3@`2Ei5gwyDJ2j4niQwRj4{AhFCbM;*A+T21TD z`=?w43KxlL?nz{VT_!u7a4DUWQXg`IO|w`re`=9SI_|L1ZNcVg12lyJrGcLN)oc?1 z^vss53}XZJM5OaC3fP$k2e6LNOhwiiAw!C+?Qh&HUOxl+VT1C`O*>4;<3E*wXmDLK zP-Df`n|F~iW>>b8eY$9aS2Ee9RV)ME}>=Y}A>u?&;A45m(?>9iqE z&~Dds+!k=*cO+o|4xvpJ`Ul=;;I{qPBE-aBxz4zGYgK!9$z`IlZn1lcyO_-=N7NS++C7y<{Vgs&+X-9wD*zBdH5virs4 z>}_g~&@`bXN0>x!G$qwwJP=H&MjGpZ6Bi`T<@yGmMqppq*HEE`z{-L*N`W{>6K(~I z@?Lz$j&*PHdK1F}&4n*o|HQ9C0uElz4!J;hj`j7zDQ%-Kq=xJQvrMlAFdaZ;QB3?S z&*2oUvgB8%spDy5SvTq5y-Kgs?dNY!IigsIpiW3rlBk;2A5~rbMzPyE8dhG|Zd=hql zyB@wIV^WM`yBQHUlAgn{4NFgw2!G~j2U=9CNiw8tgiypq?bD+3@xo7oliy{6Z)b0Y zQ>7U~ryzNQ_9I(+h+EQzrdp(rH!@AcIZM}wK`dGJa1GzQOW_#jLIB&|Qc_wOh2B|2 za1*&Fyui*02@M>6!~jc064c=Vpw1A6Uads5K3a!5j@mkSMnue{065GOPKOltdGd0e zOX$z<9aF;C`}{m38Bo?U8s$AG$Ii&Pt_>K-nmJbI`JHzx1v8O^VFq=HfcWe|RYPOh zIhW?rq*FHHhHMYCW_d?_I5Cx*)t-6h29KKJ%;BuaDnyZWU`)Qv9~9q6_ha;QL^T7m zussEY9uWYti2tYF;-w*ONdxoYVS2ckH$OOsAUvg& zYpkV-GpCq${#pK|5Uf9?tgr?zNjmOVSr~U5H_EDo%t&in#Xw9#!O09yBPP0SbuHM; z>@A8%VjONQhf)Enwo{rL7F|j~4X&aqD=gZykEi?#7WIjD*6({TyY#!8Wrol0kby?b zM&%2|LbWA`_V4UE?52}GC>}=On+cy7fcwvJ-HQ|j8Nf~D<){L!wsP^Xl-06b=kKq| zr1$K#Q8*@L?^^bw(vC1d&RB}#o0#zXp%{wr$(k7y4ZB|85XCJy^YuS%hl)uWPRvE| zum`5zttQvGU8+zc`;_g>e&gYRvyv?lp(}JD+6F95$CW<>*UY^@v~x9kZeXjIaK3^X zk+lsxuNOXkcBv~bHXFR}4dJyHwy1IoQbGuJ(k~Z9k&(ef0XP!;d^V!?It>Tq+2^l4 zd;R$tDn}PH{>z8OX*NgHY&DO)9GD-l8Iy~? zw7PwTOW?1hIE@^s4vEtS^h<+`zsr8^Uh;N(s9Mv$oFqt2t2b_Y`nQR1&`Q5-!zjAM z7QLO7B$hJ*Z#*N*-Z_#*N5QT)c=f=`xoi&F1|=u5Dj(VrMbNigMhTS)RB}j}*Tw1P z?te?UASy{WSV4&64Bc-NAi*DSc=WQ2`fXz#fadR zv_4fDO^Pz!@HB@(=LnKuhcjPxT@!^u3&8t>x4+nYpoLTOx}(yMxGJ@VViIER<=`i@ z#~vhOZ4WSjHIgpUl;6WYF+iDj7;A6iS1cIYwAoPW%LHmRBvS5 z1YTHw>O`O;(T(~OLy5yI!;B_N2uSpRrD5VRoP^OmvckylAZ)MZ2vjZz;L#d5_trVu zW_!IAvZY!_68K8VM+RlA=A2 zi_R{(+_Ri1{w0^&M#nh?V}n|;RnXX|+>c*~H28kt8!S~L$dMqFMEKICR|@9aV#3sY zMh5C@KmQhr4s)tvqnH)AXP6U)Gs}<9;fhX^b6nINeHxLTe{}L4zL(zuzoXL~|YY|LcUyEf|!b31PG z=qS<9)9Bd6kk-ST7;fe}Vr&Ls6XCyl2iGf8Nwn1cwNNL=OYgmqU?-oG;)6VlG=(uT)jeci+j!&JHd*TYVns z&T${0G2$50%Z2N7m1~wNQB=W45qIBX!dJWBVG3C3w;(8=4)Fm9*04jSB><72zg+EiaKx0<# zEG^9bekbp89EP5+6zDuq1y}f;U20@LP0u63Rt0W`iiT7L#-oc$!v3?{KgDdL!;}R6 zQk+2@D-Z06v} zM3BYhH_0-foy9Y@9|>DE__CbbET7Ji%bYe%YRscLkw`82Wk|aA3(+x$l$5_4r1(Yg z8SpomrcWxGxGZ&A&(QXKE)%V%i%q~n6}$0yZQ7to^+nBpBLWe>?^PBIGDe;i)+?qf z3&ZSr_sh74p?+mMRgv$dx~4uo-@bkOXCp<9AN&-rbeLE4IZTZVQye{_r^ z-Cs(Z^oooNx;de+C@A%-eW!fcNAoZP)L8uBSTKf(a_6K$l@yx19Guv}TvI)M2yzcO zS`s$}Sw*j+L}goWJ8Am6N!Vs*?~G2~c8O!RE=%)LW}(5vt)$On;&+1+K>^(ue}eJt zVU`nA#)#bMRXWA~FfdseBddtfw|@tYq8lKyPWR ziMUvSwc`J@HJJ}iB>dgQJLAc;gVkx3!{*=CPd-jEN+Hqmb1Iv?<+x>@ziQFK20Py)p3ld+a^a zRt%YywdJf^JTTq9wW0f$0Ipk*#}Hhk%rpD#i|GHdx|jJTZAXPbkdKVshhu`}MByv1 z6Wexc+oO0B4#tmvzs}m(Hh7cADKPUb-N$Q;q<+S7?AwW4Mt49`iC_i9aIlau~R(T9 z^po=OeckXS``913X`bD$yV64Wy?0o+*q+^YS@@a!XpiH>xWa0|vA{zL4cd(HU;Sb@ z0g=fpQkKDgV3wk&gR^C=w_ymCGZ5tv!;~#^-AuxzMOD6UDd=4DG*eq-a^%)1;_Vz( z`5u+J-~62;5Bk*p9QEG>p+9g^aQz1~t~V&=*K9OynWCI6xHLW7LNrFbkx`T8p% zDvmv?;!{VsSfFxvjXP1nbckqPL7LGlJfaM7<8wS#QnlJsnGJ4k{j`G(Kz|n6t`-k) z%D=#G&1&7kuNm?X$?vAqp25cK(I}uJ!R~^xE>dEL|9#Nub`i{jUYZaDA1p^eAW$rb zw{psWPGg2vnKP$=0_VB>DIB$rz1aX7F|uYicQj}v4v&9LXY4Hxg`&oE`t*@1KGkjWWXeO=u=fy@;Si%O3yY>;-B1DOU}aelwTJ8w4`ey zdr%hWY`XV03mq>--vHr>vwdD+>i1BKO$9+%R8k{~k5a%+{zbJ)4H@#BINC6338e5Y zMnyd9M?P`8CzV|oH?x^c%5rE5BY2UFesd z3*k_bH288#Zx8((jm;je@3Sw5Lll_0}m=ji{C%Puk{%H z>LUE%krjv&y0cACSMSz#P=cI2dXL0|PZ&|YcK`4Ej#W72hIV5`4L)@cjcS&PcKB{+ zH&@Zbqn<)E_9Ej>2v#&natwJ%4Egn%q&a$5EA%3mK%@L&dWH6jv1^4Etz2}ZSuqTgn4tQm>N0-%izsZvUJ%lLH$tSAPuu)uW2VxtS?b` zY6bv7zfz-G$+GEMvj|lDKLK(PjqaI?B!mwV?|5qz5=RXQ6vwx&@lnLPmuOf%<7LV$ zkA-82+z6k7)eQ*za*&{SyAVz}L0_rR4pAe)=Hg7*=S$$;OcbozmwL$0RQz6ws~^Au ziSIi=`fV--GEKvUiqoffk+SIyD7O(&9i=`Z_L&U-)uGy`!-{GpQ&ZSzUn#S+RKk=# zTk8NKPRfhBC!m%ZZBxej8a0QHJy(jP?u-QTZcZbaEFRfhp3(|$h52!#kh8`*A6KO< zBumB-*rX&!N~yYmvIav9j0OSaS6YE~kfiaM;}aY;R-)~PqiU7XJ) zsrvU47E1aG#Qz&_y!o~}?v!?U_e8iFf~w^U6=|KMN>ZFmn{jfhcA?uxEk|#HZl>zQ zhN{~$1+K}e!@?0>6r4w&_?$;i`TO&HEI(BIMr)wqNNKoA z!d3xu_5l6fu^3ge*5F1tdHl-F7TFFCEXSDX?hQ%J^Aj4ws? z>8(F3>QMtJ5Cw(3b?XQ&)jHQmn=*yw)I$@|G|;lrHh2+5_N`i9@?V&}Pc5r9t;gGb zcE;S4@lnP3a&JAG7?BMxY%}>P);;&!4+q{;!_hNd^;I^vX;IAuN(8~BCqd4~IOhWU zDZDoI(8G_xvV)HcX#A{4%Lc`yR!_BUS;Z9Kf-3uq=^XU_e7uV7 zs#W!lLba?l2e!-JqFp>=&99)8+ZlQKC%(P~o-mxp|HYh3H1)e7s>I6=0Dcdf*M!J428jP?;L3SNo-X^#qf}_j0MgeEHWREsB zoE`k;49g=p)}kE)-;`N91m&j8>Oo@@oPEU|&$wK`^n#yVN*j zyUpP%fQ=X|Z8M%^!4m{Q5bWX$Yjm=E{V@A*zWct1CiDkcqwJt6%Qyl`w!+o0o*fOc zDHCKVo9}!$nd~|JP)pb`Jt(H0DXAkd}^uNhjq`UgP}1OZ=n znq6#s;EAW7-*epLtW!?7;M}t(F!2c18ngFtf8*mLK`<2Ess7EvMOQW~D|(7xI0(ZBxD!2$1F zabo-su!z1A(5;M>1f2cOX)Z0;uI6!AE^m~&+*+69wveJ7fhB6v?dUkr5oH38B6?yC z%P`mt?Y4zT$3(5|g;=B#M4udrE;D2pVPYq%;jX0Ma;CSC11W34gO~fQ4hHsp8-Yb_ z@yJP(a#);;#R)ad3Ze##J5_nL;jMeLl8vGB{o}^s)~P1b!D5uch^%B%t6UHSK?y!< z$X5~ZxWoHI_j+smsxEX! zI4N|ZW};$@qWU3fGgQbUQBzUzAbagU_&P|okRm8-ej-H*&59GkGXZN1s0|bp)e$bl zCR7V%(lxAtvRA<&zP6)1Jui0;FD!;H64B`P+ujGh`eL`#Z1s{o+#)J#ETim=x8OPR zN))l_VQ=TWiJ$Yi5qxAMLM}!3aLX1bSONtkgI|J1nJr>ibPa(u2(k0x8c^c<(e58! zo}O31<%;@X>53VDbeOqH?<63fHw1qvwS7@+TqMsbm%(GPPV~!9Lz7LZOlMlHXS(DhToPl?4GKT><-iqO$RFC`e88YVHq*my8dn z=Vdh#O8=0vYfJH?9=@!&pjadZ2q88O=Fx)zCDAqun2^9$SBW;iN|>Yx22_>T{C*m! zcw6|28xyD?KbQwdRC!KKz!pYUcYhALr6z3=-e2UUMkq7er z-K~~+jw*e1gLhrNdh5jL3p;inT(W%4q{-9b5|RPz&_iMb0Te~i+qP}nW?B1RQEVrZ zsL%NG0X`7+>-~DJNqb8ZI63)&{7!-{ei1tW9!U5Ixd=FT?rRTud7t|(H;6(Ia>1L% zZrR={&@R~vVG2Ro`I}QCP)$%xQ;JfIP)k!uP)pG*vKi$!Z(koa|IGGZm#6Rha_7}uv)rk>7_PiOv+m5tyw0~xzF|W~`>ZKm zhc+*+o3S})R^5xY4snX-I^R^64_>!cbxnETKKHS8Z^Wp4x zN!uf7Pndn5Mf5b<;eFO~5L09+usLF+ce+V|L^C`h=R?NYQ_zhhSKb|?LD&r4WCzk5 z#~OIbVESnK_esx5Tir*`g5!eKn%`-6EzX;|c+E~vY`D=OCtVgSHEL91RI+!LPD#&E zOo173pZqv^s%SyGvm7(<$+`t?&@Bcr>kWyHzt1j38$I`?r(GTZHF2+MAi)|ZThu6q zi)J?jsm>one;%smuH1Fy^F7 z3i!gdaoT*c82+z6X|F#X zSARj7hwbN%-#&cy^W)Rsz!I#x`T94_Z3j-E_;`Qm%Pm4#n$2$URa@+6y`RG{1&X97 z5d0faLq028#cRbXm}H843ZTNiqnxAx61IfHgN0;A+U)Cm$Hxq`!-3H;MHj<(-HmOQ zpPsVgciHiWZ$9}I4sy2tR*~E7w8~Da{pOQ8TSHt$vcB3{UPebANd`xqf$^ARwbQ-k zRa@=x4Hljmrzlep?~|FL(y|9>PW91IEjxe@y2q)p@}6v~Np5(d#;c(Pyb)w+;UZQf zH^SjKU%Wd+-6C?dqmixG;DLjGC!wR9lCrWvH+q4*Lw$l9*^tvd*StX+W>}m+N-dgT z#(6=~_{Aqs7uijkR}f# zH5#A=!GR%pG6k7DM+yK#0~Y%Ci4zb7xv)m_8f;($<5-UfnjuTC=|V3j6&8SGz=Pu0 z1)I&2PCi%!xsOVYFqW7OaL#5eKZI zI}TOwSd3*Nf{Nv#u-4G!r~Olry%pK3pe1&Zq3YYLD)w|Jy85)=ehGSS*B$sQvt5^*E| zmb({s3mc2RzJ#E(8ZZSR`mP|P29r~=(-dNKY4S0m?X8t43NX?lG^9j<%o++3pgZg_ zHkbUg5{rCo^z#2;CR~F-KB7b$gO8-)gh$lTNk!`bJnml@@f4Ye7{Jp){~c$&;L!r zk5`DnXPzyYD$5c}$KXOoV)5B=^+jOz^zl#XYp~cP)MaLE$T)GF{{4wo(|6xqq3smO z%w82qk=<$hf!zPKHKr{B#}GqTwN#2F=HzLD?|+f|i6#*E_7A!JbC`cPEIuuNp~K=0 zeVY7whoB|q^jDV%Q)7Hb6xpr7taXK`3(rtV*WyD@(G`0B1JTC`x&M9Ke4~!PK|>{W z2Q6{LWII9B;Wvv-6#=`uIq%x?0oD$iI`2Rco}cfZA8#IS&+l&l-B)ngBDMkb05N!# zDz(830F3}N`Z}sJCymT9b-OwUY%vY3G&D5{3w_N{=+Kk%#Og}FDg3d^;VpqV;c4&A zOGwf+ab1J}y{-(J+{;3JY;#z9WQ)?jZmR;(aUF;$&@kEI*M`c>+>cB5KhlmL;{{fQ z7>1+?&3gurbE(YqB5462LH5i3^{^P!+ya{19Mzm8x*nIL^=w$3ck}6>-HBW4X_w4? z{eQU}SG(1S3_7WHSdXeq&wSj4t)>&^4E-uNY$sK2GYgSuE^G+|M?#SrWoCp9s29|f z)x7SPVG&8xvdz5dmuxj{mXmrt>m9e#UKvh$Db+R~7VBAeJ}QX#VKb$(bJ(Q4BBG3u z1y@FynpJL@Ks#15hV{IkbG2#*!#bUhtK7$KH8^g@Wuj$F&bSm>&;UmPQ;`O+We}*; zKnD#u1$qK^K~R7e9w|J4>B3n0;uX5}>IGPP`{pd+4J<%~SZ_K!VRB?63y=gLS(>|` zTd;92&qI}H`pTR5I$(-uU{ + const name = e.currentTarget?.getAttribute('name') || e.currentTarget?.name; setOpenMenuName(()=>{ - return prevMenuOpenIdRef.current == e.currentTarget?.name ? null : e.currentTarget?.name; + return prevMenuOpenIdRef.current == name ? null : name; }); prevMenuOpenIdRef.current = null; }, []); diff --git a/web/pgadmin/static/js/components/ReactCodeMirror/CustomEditorView.js b/web/pgadmin/static/js/components/ReactCodeMirror/CustomEditorView.js index 6801b44a7..b48f77a92 100644 --- a/web/pgadmin/static/js/components/ReactCodeMirror/CustomEditorView.js +++ b/web/pgadmin/static/js/components/ReactCodeMirror/CustomEditorView.js @@ -9,7 +9,7 @@ import { errorMarkerEffect } from './extensions/errorMarker'; import { currentQueryHighlighterEffect } from './extensions/currentQueryHighlighter'; import { activeLineEffect, activeLineField } from './extensions/activeLineMarker'; import { clearBreakpoints, hasBreakpoint, toggleBreakpoint } from './extensions/breakpointGutter'; -import { autoCompleteCompartment } from './extensions/extraStates'; +import { autoCompleteCompartment, eol, eolCompartment } from './extensions/extraStates'; function getAutocompLoading({ bottom, left }, dom) { @@ -30,11 +30,13 @@ export default class CustomEditorView extends EditorView { this._cleanDoc = this.state.doc; } - getValue(tillCursor=false) { + getValue(tillCursor=false, useLineSep=false) { if(tillCursor) { return this.state.sliceDoc(0, this.state.selection.main.head); + } else if (useLineSep) { + return this.state.doc.sliceString(0, this.state.doc.length, this.getEOL()); } - return this.state.doc.toString(); + return this.state.sliceDoc(); } /* Function to extract query based on position passed */ @@ -328,4 +330,14 @@ export default class CustomEditorView extends EditorView { setQueryHighlightMark(from,to) { this.dispatch({ effects: currentQueryHighlighterEffect.of({ from, to }) }); } + + getEOL(){ + return this.state.facet(eol); + } + + setEOL(val){ + this.dispatch({ + effects: eolCompartment.reconfigure(eol.of(val)) + }); + } } diff --git a/web/pgadmin/static/js/components/ReactCodeMirror/components/Editor.jsx b/web/pgadmin/static/js/components/ReactCodeMirror/components/Editor.jsx index 4a7d9231b..1c27170a2 100644 --- a/web/pgadmin/static/js/components/ReactCodeMirror/components/Editor.jsx +++ b/web/pgadmin/static/js/components/ReactCodeMirror/components/Editor.jsx @@ -51,7 +51,8 @@ import CustomEditorView from '../CustomEditorView'; import breakpointGutter, { breakpointEffect } from '../extensions/breakpointGutter'; import activeLineExtn from '../extensions/activeLineMarker'; import currentQueryHighlighterExtn from '../extensions/currentQueryHighlighter'; -import { autoCompleteCompartment, indentNewLine } from '../extensions/extraStates'; +import { autoCompleteCompartment, eolCompartment, indentNewLine, eol } from '../extensions/extraStates'; +import { OS_EOL } from '../../../../../tools/sqleditor/static/js/components/QueryToolConstants'; const arrowRightHtml = ReactDOMServer.renderToString(); const arrowDownHtml = ReactDOMServer.renderToString(); @@ -147,6 +148,10 @@ const defaultExtensions = [ return 0; }), autoCompleteCompartment.of([]), + EditorView.clipboardOutputFilter.of((text, state)=>{ + const lineSep = state.facet(eol); + return state.doc.sliceString(0, text.length, lineSep); + }) ]; export default function Editor({ @@ -174,6 +179,7 @@ export default function Editor({ useEffect(() => { if (!checkIsMounted()) return; const finalOptions = { ...defaultOptions, ...options }; + const osEOL = OS_EOL === 'crlf' ? '\r\n' : '\n'; const finalExtns = [ (language == 'json') ? json() : sql({dialect: PgSQL}), ...defaultExtensions, @@ -198,6 +204,7 @@ export default function Editor({ const state = EditorState.create({ extensions: [ ...finalExtns, + eolCompartment.of([eol.of(osEOL)]), shortcuts.current.of([]), configurables.current.of([]), editableConfig.current.of([ diff --git a/web/pgadmin/static/js/components/ReactCodeMirror/extensions/extraStates.js b/web/pgadmin/static/js/components/ReactCodeMirror/extensions/extraStates.js index 5e4c7b433..0970c4cdd 100644 --- a/web/pgadmin/static/js/components/ReactCodeMirror/extensions/extraStates.js +++ b/web/pgadmin/static/js/components/ReactCodeMirror/extensions/extraStates.js @@ -13,4 +13,10 @@ export const indentNewLine = Facet.define({ combine: values => values.length ? values[0] : true, }); +export const eol = Facet.define({ + combine: values => values.length ? values[0] : '\n', +}); + export const autoCompleteCompartment = new Compartment(); +export const eolCompartment = new Compartment(); + diff --git a/web/pgadmin/tools/sqleditor/static/js/components/QueryToolComponent.jsx b/web/pgadmin/tools/sqleditor/static/js/components/QueryToolComponent.jsx index 4af52d05a..0c7d6bf52 100644 --- a/web/pgadmin/tools/sqleditor/static/js/components/QueryToolComponent.jsx +++ b/web/pgadmin/tools/sqleditor/static/js/components/QueryToolComponent.jsx @@ -18,7 +18,7 @@ import { MainToolBar } from './sections/MainToolBar'; import { Messages } from './sections/Messages'; import getApiInstance, {callFetch, parseApiError} from '../../../../../static/js/api_instance'; import url_for from 'sources/url_for'; -import { PANELS, QUERY_TOOL_EVENTS, CONNECTION_STATUS, MAX_QUERY_LENGTH } from './QueryToolConstants'; +import { PANELS, QUERY_TOOL_EVENTS, CONNECTION_STATUS, MAX_QUERY_LENGTH, OS_EOL } from './QueryToolConstants'; import { useBeforeUnload, useInterval } from '../../../../../static/js/custom_hooks'; import { Box } from '@mui/material'; import { getDatabaseLabel, getTitle, setQueryToolDockerTitle } from '../sqleditor_title'; @@ -202,7 +202,8 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN database_name: _.unescape(params.database_name) || getDatabaseLabel(selectedNodeInfo), is_selected: true, }], - editor_disabled:true + editor_disabled:true, + eol:OS_EOL }); const [selectedText, setSelectedText] = useState(''); @@ -224,6 +225,14 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN || !qtState.is_visible) { pollTime = -1; } + + const handleEndOfLineChange = useCallback((e)=>{ + const val = e.value || e; + const lineSep = val === 'crlf' ? '\r\n' : '\n'; + setQtStatePartial({ eol: val }); + eventBus.current.fireEvent(QUERY_TOOL_EVENTS.CHANGE_EOL, lineSep); + }, []); + useInterval(async ()=>{ try { let {data: respData} = await fetchConnectionStatus(api, qtState.params.trans_id); @@ -262,7 +271,7 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN { maximizable: true, tabs: [ - LayoutDocker.getPanel({id: PANELS.QUERY, title: gettext('Query'), content: setSelectedText(text)}/>}), + LayoutDocker.getPanel({id: PANELS.QUERY, title: gettext('Query'), content: setSelectedText(text)} handleEndOfLineChange={handleEndOfLineChange}/>}), LayoutDocker.getPanel({id: PANELS.HISTORY, title: gettext('Query History'), content: , cached: undefined}), ], @@ -877,6 +886,7 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN preferences: qtState.preferences, mainContainerRef: containerRef, editor_disabled: qtState.editor_disabled, + eol: qtState.eol, toggleQueryTool: () => setQtStatePartial((prev)=>{ return { ...prev, @@ -907,7 +917,7 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN }; }); }, - }), [qtState.params, qtState.preferences, containerRef.current, qtState.editor_disabled]); + }), [qtState.params, qtState.preferences, containerRef.current, qtState.editor_disabled, qtState.eol]); const queryToolConnContextValue = React.useMemo(()=>({ connected: qtState.connected, @@ -948,7 +958,7 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN savedLayout={params.layout} resetToTabPanel={PANELS.MESSAGES} /> - + diff --git a/web/pgadmin/tools/sqleditor/static/js/components/QueryToolConstants.js b/web/pgadmin/tools/sqleditor/static/js/components/QueryToolConstants.js index 70e909173..691332e48 100644 --- a/web/pgadmin/tools/sqleditor/static/js/components/QueryToolConstants.js +++ b/web/pgadmin/tools/sqleditor/static/js/components/QueryToolConstants.js @@ -76,6 +76,7 @@ export const QUERY_TOOL_EVENTS = { RESET_GRAPH_VISUALISER: 'RESET_GRAPH_VISUALISER', GOTO_LAST_SCROLL: 'GOTO_LAST_SCROLL', + CHANGE_EOL: 'CHANGE_EOL' }; export const CONNECTION_STATUS = { @@ -106,4 +107,6 @@ export const PANELS = { GRAPH_VISUALISER: 'id-graph-visualiser', }; -export const MAX_QUERY_LENGTH = 1000000; \ No newline at end of file +export const MAX_QUERY_LENGTH = 1000000; + +export const OS_EOL = navigator.platform === 'win32' ? 'crlf' : 'lf'; \ No newline at end of file diff --git a/web/pgadmin/tools/sqleditor/static/js/components/sections/Query.jsx b/web/pgadmin/tools/sqleditor/static/js/components/sections/Query.jsx index e543db304..737fe0d04 100644 --- a/web/pgadmin/tools/sqleditor/static/js/components/sections/Query.jsx +++ b/web/pgadmin/tools/sqleditor/static/js/components/sections/Query.jsx @@ -56,7 +56,7 @@ async function registerAutocomplete(editor, api, transId) { }); } -export default function Query({onTextSelect}) { +export default function Query({onTextSelect, handleEndOfLineChange}) { const editor = React.useRef(); const eventBus = useContext(QueryToolEventsContext); const queryToolCtx = useContext(QueryToolContext); @@ -65,7 +65,6 @@ export default function Query({onTextSelect}) { const pgAdmin = usePgAdmin(); const preferencesStore = usePreferences(); const queryToolPref = queryToolCtx.preferences.sqleditor; - const highlightError = (cmObj, {errormsg: result, data}, executeCursor)=>{ let errorLineNo = 0, startMarker = 0, @@ -175,7 +174,6 @@ export default function Query({onTextSelect}) { } }); - eventBus.registerListener(QUERY_TOOL_EVENTS.LOAD_FILE, (fileName, storage)=>{ queryToolCtx.api.post(url_for('sqleditor.load_file'), { 'file_name': decodeURI(fileName), @@ -191,6 +189,8 @@ export default function Query({onTextSelect}) { checkTrojanSource(res.data); editor.current.markClean(); eventBus.fireEvent(QUERY_TOOL_EVENTS.LOAD_FILE_DONE, fileName, true); + const lineSep = res.data.includes('\r\n') ? 'crlf' : 'lf'; + handleEndOfLineChange(lineSep); }).catch((err)=>{ eventBus.fireEvent(QUERY_TOOL_EVENTS.LOAD_FILE_DONE, null, false); pgAdmin.Browser.notifier.error(parseApiError(err)); @@ -200,7 +200,7 @@ export default function Query({onTextSelect}) { eventBus.registerListener(QUERY_TOOL_EVENTS.SAVE_FILE, (fileName)=>{ queryToolCtx.api.post(url_for('sqleditor.save_file'), { 'file_name': decodeURI(fileName), - 'file_content': editor.current.getValue(), + 'file_content': editor.current.getValue(false, true), }).then(()=>{ editor.current.markClean(); eventBus.fireEvent(QUERY_TOOL_EVENTS.SAVE_FILE_DONE, fileName, true); @@ -288,6 +288,12 @@ export default function Query({onTextSelect}) { editor.current.setValue(formattedSql); } }); + + eventBus.registerListener(QUERY_TOOL_EVENTS.CHANGE_EOL, (lineSep)=>{ + editor.current?.setEOL(lineSep); + eventBus.fireEvent(QUERY_TOOL_EVENTS.QUERY_CHANGED, true); + }); + eventBus.registerListener(QUERY_TOOL_EVENTS.EDITOR_TOGGLE_CASE, ()=>{ let selectedText = editor.current?.getSelection(); if (!selectedText) return; @@ -518,4 +524,5 @@ export default function Query({onTextSelect}) { Query.propTypes = { onTextSelect: PropTypes.func, + handleEndOfLineChange: PropTypes.func }; diff --git a/web/pgadmin/tools/sqleditor/static/js/components/sections/StatusBar.jsx b/web/pgadmin/tools/sqleditor/static/js/components/sections/StatusBar.jsx index c4dbf06cc..79a7324a3 100644 --- a/web/pgadmin/tools/sqleditor/static/js/components/sections/StatusBar.jsx +++ b/web/pgadmin/tools/sqleditor/static/js/components/sections/StatusBar.jsx @@ -9,12 +9,13 @@ ////////////////////////////////////////////////////////////// import React, { useEffect, useState, useContext } from 'react'; import { styled } from '@mui/material/styles'; -import { Box } from '@mui/material'; +import { Box, Tooltip } from '@mui/material'; import _ from 'lodash'; import { QUERY_TOOL_EVENTS } from '../QueryToolConstants'; import { useStopwatch } from '../../../../../../static/js/custom_hooks'; import { QueryToolEventsContext } from '../QueryToolComponent'; import gettext from 'sources/gettext'; +import { PgMenu, PgMenuItem, usePgMenuGroup } from '../../../../../../static/js/components/Menu'; const StyledBox = styled(Box)(({theme}) => ({ @@ -26,17 +27,17 @@ const StyledBox = styled(Box)(({theme}) => ({ userSelect: 'text', '& .StatusBar-padding': { padding: '2px 12px', - '& .StatusBar-mlAuto': { + '&.StatusBar-mlAuto': { marginLeft: 'auto', }, - '& .StatusBar-divider': { + '&.StatusBar-divider': { ...theme.mixins.panelBorder.right, }, }, })); -export function StatusBar() { +export function StatusBar({eol, handleEndOfLineChange}) { const eventBus = useContext(QueryToolEventsContext); const [position, setPosition] = useState([1, 1]); const [lastTaskText, setLastTaskText] = useState(null); @@ -49,6 +50,8 @@ export function StatusBar() { deleted: 0, }); const {seconds, minutes, hours, msec, start:startTimer, pause:pauseTimer, reset:resetTimer} = useStopwatch({}); + const eolMenuRef = React.useRef(null); + const {openMenuName, toggleMenu, onMenuClose} = usePgMenuGroup(); useEffect(()=>{ eventBus.registerListener(QUERY_TOOL_EVENTS.CURSOR_ACTIVITY, (newPos)=>{ @@ -109,7 +112,36 @@ export function StatusBar() { {gettext('Changes staged: %s', stagedText)} } - {gettext('Ln %s, Col %s', position[0], position[1])} + + + + + + {eol.toUpperCase()} + + + + {gettext('LF')} + {gettext('CRLF')} + + + {gettext('Ln %s, Col %s', position[0], position[1])} + ); }