From bd4a7c1f02d1cade8302bde00ad85ea28175e89b Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 29 Oct 2024 14:29:02 +0800 Subject: [PATCH 01/84] bugfix --- bricks/bricks.js | 1 + bricks/css/bricks.css | 23 ++++--- bricks/menu.js | 6 +- bricks/popup.js | 143 +++++++++++++++++++++++++++++++++++++----- bricks/widget.js | 17 +++++ 5 files changed, 161 insertions(+), 29 deletions(-) diff --git a/bricks/bricks.js b/bricks/bricks.js index 6eeb33a..75f7fe3 100755 --- a/bricks/bricks.js +++ b/bricks/bricks.js @@ -460,6 +460,7 @@ bricks.App = class extends bricks.Layout { */ super(opts); bricks.app = this; + this.docks = []; bricks.bug = opts.debug || false; bricks.Body = this; this.deviceid = bricks.deviceid(opts.appname || 'appname'); diff --git a/bricks/css/bricks.css b/bricks/css/bricks.css index 605ca18..f026bc2 100755 --- a/bricks/css/bricks.css +++ b/bricks/css/bricks.css @@ -46,6 +46,17 @@ body { grid-gap: 1px; } +.popup { + display:none; + position: absolute; + box-sizing: border-box; /* 包括边框在内计算宽度和高度 */ + color: #111111; + background-color: #f1f1f1; + border: 1px solid #c1c1c1; + border-radius: 5px; + padding: 4px; +} + .modal { display:none; position: absolute; @@ -210,16 +221,8 @@ body { .multicolumns { column-width: 340px; - colomn-gap: 10px'; - overflow-x:none; -} - -.popup { - display: none; - position: absolution; - box-sizing: border-box; /* 包括边框在内计算宽度和高度 */ - background-color: #f1f1f1; - border: 1px solid #c1c1c1; + colomn-gap: 10px; + overflow-x: none; } .selected_record { diff --git a/bricks/menu.js b/bricks/menu.js index 85f5872..85b80a0 100755 --- a/bricks/menu.js +++ b/bricks/menu.js @@ -24,11 +24,6 @@ bricks.Menu = class extends bricks.VBox { console.log(event); let e = event.target; let opts = event.params; - if (! opts.url){ - console.log('itme.url is null'); - this.dispatch('command', opts); - return; - } var t = bricks.getWidgetById(this.target); if (t){ var desc = { @@ -47,6 +42,7 @@ bricks.Menu = class extends bricks.VBox { } else { console.log('menu_clicked():', this.target, 'not found') } + this.dispatch('command', opts); } create_children(w, items){ for (let i=0;i { + if (o == this){ + } + }); + if (! f){ + bricks.app.docks.push(this); + } + super.open(); + } + dismiss(){ + var f = bricks.app.docks.find(o=> o===this); + if (!f){ + bricks.app.docks.push(this); + } + super.dismiss() } } bricks.Factory.register('Popup', bricks.Popup); +bricks.Factory.register('PopupWindow', bricks.PopupWindow); diff --git a/bricks/widget.js b/bricks/widget.js index 84683a4..ef72f5e 100755 --- a/bricks/widget.js +++ b/bricks/widget.js @@ -153,6 +153,23 @@ bricks.JsWidget = class { } } } + enter_fullscreen(){ + var e = this.dom_element; + // 获取要全屏显示的元素 + // 检查浏览器是否支持Fullscreen API + if (e.requestFullscreen) { + e.requestFullscreen(); + } else if (e.mozRequestFullScreen) { // Firefox + e.mozRequestFullScreen(); + } else if (e.webkitRequestFullscreen) { // Chrome, Safari and Opera + e.webkitRequestFullscreen(); + } else if (e.msRequestFullscreen) { // IE/Edge + e.msRequestFullscreen(); + } + } + exit_fullscreen(){ + document.exitFullscreen(); + } h_center(){ this.dom_element.style.marginLeft = 'auto'; this.dom_element.style.marginRight = 'auto'; From 987974a4bcbfef1722cec08f89b77a80e1fb6225 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 29 Oct 2024 14:29:44 +0800 Subject: [PATCH 02/84] bugfix --- docs/.DS_Store | Bin 6148 -> 8196 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/.DS_Store b/docs/.DS_Store index 39cb0f3bbaaf19a2906b549f1befd08b4005f9fc..d27a69df27083ece0ff1b7666d7f4c94d747cf17 100755 GIT binary patch delta 239 zcmZoMXmOBWU|?W$DortDU;r^WfEYvza8E20o2aMA$iFdQH}hr%jz7$c**Q2SHn1@A zZ{}gCXOv`P$YjW6NMuN7NM$HaDlaZb%E?ax>fAXwf~7D;vbx&H(AY>v!P3I0R!5=Q z(#SwZ!Nl0Cww9AaR9W9TC_XzUH!r^%r~wEV86h+SFO-H+JwOJEMPddAH)LaP}k uHe6iH&cPwb3{(XK0^C5t6{KNf;dkcA{4$;(?F>v1qd=xJY>wxd!wdiv6cSSa From 74f87faf0183baa578f819ed6ff3d9ab89e9333b Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 29 Oct 2024 14:32:02 +0800 Subject: [PATCH 03/84] bugfix --- bricks/imgs/app_delete.png | Bin 0 -> 12768 bytes bricks/imgs/app_fullscreen.png | Bin 0 -> 10748 bytes bricks/imgs/app_minimax.png | Bin 0 -> 10453 bytes docs/.DS_Store | Bin 8196 -> 10244 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 bricks/imgs/app_delete.png create mode 100644 bricks/imgs/app_fullscreen.png create mode 100644 bricks/imgs/app_minimax.png diff --git a/bricks/imgs/app_delete.png b/bricks/imgs/app_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..ea003cca0600c06ad1b0c34fe78f4e6998e2688a GIT binary patch literal 12768 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 literal 0 HcmV?d00001 diff --git a/bricks/imgs/app_fullscreen.png b/bricks/imgs/app_fullscreen.png new file mode 100644 index 0000000000000000000000000000000000000000..0d2809b8fe3af4097342faca5682e246cf2ff8de GIT binary patch literal 10748 zcmeHtc|2A7`|oG1y*GOscc!fr8-ec_jerJnS zvL0_m%Uurdl-l6ZR}HTW$I@>n^f78$SP!l!)Zbey9_yAh`|7++`xHxO^P29&&~5nb z&PRMYlg-6&Y_;Hz2lDRv2ul49U;{&B?!VSrT(DT@!4g?W0}uq0rig(c7DchgSKU|4 z(XhcN_Wyx@Ac(O3@d5kZptIh~`lR(fJL(O)cTO0?9S4iGrX6{*REsHU!Z0!R06o{) z%k2NCXjVD%yjrxnv`*S-mCNEpr;f^iq4BrC1Dnm=|uzlmE@+B0>`dqGnuotdB(z+txP z`MBsI!mDNR(Uu3Y)G(fwp!3l5{>%CLPI(7VEWao|T0j3Ii=E~*c11+qeMlV|BQOYsh1ZZ%RE^&I@_)r1p@NO!~SY{YH)i5x+)+#3|RE(waK<030l4WXQqVt+~@Ur}6_ygIljW*!&gi3t8Gp*u5x z`>a8^W3B*-SdP96roExVmF515*JL1#hQLmhYY76rXMFA7s|!^-E?*;qW=aFS*}ML7 z*I-2PtOOFOyl&rYY7mDnrQz{p zg8#bxP=Cxou#|5f@BqHt-Y5C#DdeBBjrV}9zlDos?1w;$AdyS}3<<&sx8Q*<(zl5xNTzK0~4_117Xd5*y^RC@j1BO0MUD{>n zGqQw2j4+0k1oDIdDtpZbm1_Qhs_5qv0hP)|n?e2$^C9;q4J^2HpYW-rNyq|^X-$5& zn=-V$23zr~E1{1NQ6#HveiFrsj$Vt!RZ)CumesaA$(mwLKNhMioC3UFetJmk1xmko zf>}!oS_C;2lyA9x9-hz$YcyJ0*b6!yl9B#QZOVokg4)68poq);!8;$$>`y(h#xQTP*UBAd{QC&aU=5~Y)3fDlbnCwtBr;>QeIsSSF<*Nu9CDu?b z>7)yqX9o-3y*Np2d2(KMn38b&Tog5tGfzaDX7n$y=J@qE2;ckSsR-}u>36YEM`-vx zXc5$m1&T?NUcGu%N{k<4-v<#kc;Ji3s#CwOqg&=k21rfc9naxu0YMYfP9C(9e0%Xw zNs9Azx$N%?u?Z=Bid-7ebal?Ks9-@Y0&!EW#+Joy)(r>@uR3TvTQK!D<{{5muhKl_ zfp?s8;pq!mi=vgdrl6GczP~H&G{#3)JwG(v3sVrEL(XQp@vZog5fL*jGnJC;Cb-bSI2qx$JW!pj-f@)_Yua$7qf`6X(76-zs~I%r2PA;xUv(&yL%Ug}LmAyc zjhnJCUR;OHov%_SqopvAa%Y#$aZHIy8@+=$Esnmg%*bsjv4{z6Bzdavaa{|zf)F#L zspq~MHyIY@*PWlw?)=_6@NM#1S1FSgxXQXGLVGn-**qk0yXPUKeX?a0?w;GfpKU}# zxa_7nIUAB#!>kuy=pbIuY=)WQ(i0rhYnvKev@5#-^?n>6d&zN9Y|8 z#X3*5hq_`NXR#idO<^ZJQn~t_tD{u&M)djvJU){Tc5bisqRC9f3ZAF77{Ixcfzm55*r-O-M{U#8nF5sTmbX0{m& zY2$yaOnxU5YD1Ke##8HrWy&Bon}W1 z8MGuSc&!E2epmra-Z}GbUWzmKTU+N}ZZXUL(G^6CYk^UBB?EQ+8@NB|lJuj>l7&Py zMrH%yiOB^+RmgSKHlyI+`7wHgQ!D@_{uBx2$|oavFQ}eBKWffia&L` zrjizerQv|R$K+Fu1vYYv1zy_nQ2IG06WEAV{BbebfG6tua~%U8&a_&Lb#PEs6{Esx zh5WLX+tI3n8%jXx+xio%AYJybp#H~6dp{Q<7q`EfO|xh_gJPTSC)n~12oj~!?%KSF zmS>}>qibuXHUS@JTg@ePl{jCllw44hdc_@i+r_}YeRi4cJPiMUh6D*CUr z609c9!S79&>tG3bt8vBWiXH{*?Sj?w1$XJwYlU~eZHXxMV{De?fLohP<{@YZ>PPd5 zO{TYsWjCsz*vfsHYFNi&_VA;a5M`tcY}q$|*epm~xUoMimMBGok!QJ{r!KZIvadw4 z!7Y6gh%ILr7G{z9wdy<$w>(L8aIFdWcsLM6JH;njKxdQwAx1Ewc6jia0(gAlGK3Fr zu~K=Vv6oD~IQu;msFn8!B7_X{C;R>Cn;BHY_4-FIxRpz~VkmPp36PGzzds-F5zFv?51fHk`p?7DqD1Tyhw@p#U z>UeqZ&B#O?LA#kuq+6@Y-xUs{6HSY)yj*&Dd7zUGf>ZZ z-WN6($n9T&2o-M#U^b{bOWa%7UORyc|7Suw-n0LOFa!Em}md zSQvJ!5X=ujrZtFNYYvk85Fzv0T8eERRwEkqyepiYe>~dSyBX1PR*HeSN0>kypwju- zhiq_Ce*slNM~TNqHkWLNJ6UgbU9%6!-8@BcaI)ime)6!nFIZ|Z=%Yu>4kf0;R~nvi z;Wo51hkkxIlUV!Zkbx?ja;-FCQ@w1D829qm;b$yi9ZUX9etR(tlU&vN#hy&Ym5mnD#V~=vmiq0G(U3N58vRXWVA`j{qg(+oV*ai2{ijeu zPfrx4eV!A7@ai5{*}H?|1uLn3a&jIUOy0EAG?)igFOA&`&BWb|0cO{tg8>Nd>8*4mq*OQN2;1ja}Me!smr~iVwklan6xvC3d6I0?hE|Az>TDn&p z94xk?>Me7qym?X2pBgBpc~oB#(!@fpSIX6;^gx2!%0Ng%ctPdznn$a}L49&F3Uhi# z2^b|{M~H2u^oqe3;SyWgimVVGCpiW_*3ZU)zR$-`nY!TVy9F2FdCtHM&oo>;e-YYF z?y(`X2peh=JAB%x6zK1K`+}m0V9@c3o%JfqfSvbF@x>U9x1)75M+O~uQq{Nw8Vpu! z4r^M#z&$;rD7AzrN(hg}Un+(ey#G(A`KUS{bIo&dhqs0#Fn7KPI0#P~!L& zgFTR@4|Y^zC++#=KtJk)ZX%Q$EsjZ>!qp(g+{rW}HBMcg`{h9JLE{woI0l*{MnTW- zJ&L8}o`t)sJA+f1Wc9@ppw33sE(X$EfkxCCJRTzs)LmbuL7M!n7--i1edaq#j4mn0 zpxg;vux1FJV4Xbl)fz5O6y~7+I+*{v2Xg`9OLV+^^u+9!-j4yLeg_9myqf<;x|+#l zoN-#IfuJYo7G^{46Ze(nHc5XKMTFMAbFJ=Gn3^Xn_k@1osXVOQ_R6$jN2LN2KF6Lz zEEBF1>@t2x9y%OR|FI$1-Uf!!kDM6BzbHZg)PRngS60jvE=)c{3m7-EM1bp?w?;w#@mR4DlN(N(903J z)k8_xaJ&|g1t$+JNPwg>5DSNz+=_wIX5;J97RAZaZF^onR!RVZr>Ob>S~|h;cl$TN zaO)}|AoD-p`!Kcaj?x=iFgV%tH_S?GEp7cb?IJ_{l?VC4DH%V$J0fpU{hr+B4 zSif>0PAH>0d+S7kgZ?`4g;#=Q*T&-w16Uu$hYG{?r?`psP3dLlD zHDMP`aM81CiIUk&doD2S3ONKBNpSOz;fGWC-XEfWTkgr3l{v{dqY6Cid;om7SSHk7 z(QVm;_SuMO&y^=Z-4ttWXxY{hl7S~X z6weyhwM)hIc9ljZr2cgfq7&9}06{tq{3hDwIa*uMQTg;ocS%V`V}>{_m1-Pc(&_l_ z(ayBe=A-2Ib4}a;a@CU$YKmDZFa81oWBAbcn_|Jqe>;8i3ALp>ar&Dnz>#SYUa(JscJeF2d#e$k3v39c4 z(q*zLKFTD)X(sH&cK2C#?RjW%>~tE`hXYN`k#$&sE#r`~S!{iqKemY=Xa&UO3fIgp z<>6%$;>gOJK@WJ+5XR3b%znJLE>-wf&Sl*B+%uTz2}e{lV?#}!*EcuBrx~(WhnC~JdVf0b&{(dmyojA?#Q~Lq`zfgctIE7 zpW3RmHU=*$M{B$FZkcXAb!~CtOGD!=r+jgRZ?9}{Vm+$b6qCqzZxf9^TMQqaz1Y8Sy?Gx! z&L7ys8mhyr+yZ|LH@5u)9eBu^(8cX^RsSP{fXTH(0au=j zo)R!T1}l>Cq7n)jN*RfzqICReRY}ksOUMSr+TOcUgX=!9cmT%g!SA}%kwfldu!Sla zb9I0xX97+{V8GfV(iTD-#cmB3e9o=70E;z33j3tY1~Q!XH&7Rt$^E67AZ)*X7j*G_ z+JA}r|J9g+izqRdsm?radfHV;`ICoQzzFO*#*-z6TKAv1A?i^*MUAX?@E0u)PFl{u zbuJV;K(Yf6ATF(!UBm@;o9%2VNZN&>#IEQ+D#9~CK&5tJ!WN_eh6A<=hU%&t*#>75 zk2GDJtS>0lZP?fr1}`u$?&t81`FOO6`t^?7ByCW5F2swP3eSb{?@pm^~DuTwNV#vGI@4{K^QYQ?Q zvICwb$H`TQ9{*2OwB|+CLMngW$7+hWpH&UU!{UpatzXB#9C$2<#l?||G$7D{XoMod zk+F;Ys}SYDyb@Zp$-+DRB0+7(GdJLvEzEj1qH_XkCl?ZbIF=!~t6xB?C_->i6k1nh z8MUY|-lO-_^OtAC$bgQh5?zs)LbliB9@?cMQjqYl=>4T8jFM^Nm{jcCIxomxb~>7<5> zoJeZE$x=Z&%z^2*HihY_R^^q8WR*D)G3PjFxUt|M!{QDS44(NMPyBS|Zcss_4wu=( zLch}CGD>ixKL1W|kKQt}Cp%oJ`>Hxu4EXf6Pxq-x)z~d*%QwS}Xu*hIw zwUqoAFw_EQ@;RS2AH`2LJ6H-&!3^}QBBS7eB95sBD zBDZ_SjW9sMj}V1a;`2i!8kYqlBHC_UU&W9Mk1n6a7D4LMf#Z8vdt(Q-`X1TCx=jWR ze=m(()5{Z`$JIZH)pS2xgm3zXx8FaS6v;JQV?tSR6l3cYkN3I zy0l*Emz0V*DKAX>Q3;Q7F&8+xLf$Q9Ho)HZo00V4q{K|cjl`eca@0N0k>fz{5l)wS z`+-Cor@CvRi5jwqcpv*J$|{v))AzffaDs_HXzNUSnTsFXwEI+i>2HaGLkysYzH%> z3yPsocke7eCW; z-7Ql_pZ=|b8V~e1z(VoP;&pb`OvS5qchAd#ol&P8xZ5#sTp>LqQkB>CKD}rK(xIav zI)ARKSZ6{cA z^NvqWOTi0^gK{^+zOTKSnmw^z(hat%TL0|TN8d88M(5aqY_ETcHRaIvlO;xFd{+L^ z2Z1tLnq2T#f#Estd3JAURO95V+q{!yrvX9EwN5IjvxK%<%VJcn^>n<#?`DEfm}uLK zy5_gaq?GjykhPxPInPz~Hv>1@oh=8`p2?xlZoX~17_KrPA80C=rO$Oom+a^}e+#w?J+TW+l z7gV5UGoI{#({Yu4-N20M4ZnM5Xe&p!wuSuBRNKcgRX9E=iI;sis^zD$e$zeQXY%y- zrGsm7re-6m7CH+31*$Y+>o4KBZN?G?>8s~=7dtqc2W`94)y1kaSsE@jls1jLO_YPH_FuC-PfNmwn zoRY^(fO_$|>Oik21a(cHoYQjYbe3^d!-1cUo2=rwLszj;hyBg#@ZMVo>@)iZF2PED zgQAuS%K(~@VUQVh+i+7lTPVfg4^od-mpcua4u?OgjEGU@IF42SxN?>?s>2Q^y+P0YQRD8h_5xZKo_KTzb(`as zQ+eg=jiE*xIPrenLT*9fv~hG5)iSZ0HQ|+OX{BU-pZkMrR3Cz4UV@$}a!W86ph2?X zvAa}#g%f6ip(zq29v(4Dg@qZ_Y&A5`<|zPEQFhz1Up?1(>f&j@pB5^`JNKnff?|JM zHv1r1`Cf{M0z(Tik4i;qszm?7&OSs|?gIfzywk4=#r`EMn(3)>4FM29Z8Ndl{tL`y%ifS)CQwoyU)n_SK{7d3TZf!?OrQxca z--0Jp14uNZMU^wFSa2!f!}Z;c6k!*`nGVW8ms0g{s3;YW{r#kd2|$Tv`+Z~7l9Q{j zs)XE)5We`mmwy;iYASC1cS(;ZJ+<%49F>FcZ3&r)5PH~skrgtOZ4#E&eQV*@10HNH zcCUoZ1?=|K>xNtSBXCJ*Cp-TrWrb(5Zb_X}uq9lTyF2>8;ZOBpur=#c5!vTS?}h~~ zHO$V1O1C3!n((cCwZ`))-a%Y0XyrW8!$d#$z^^f&mX^Y}cs|Dj1S7XbFP)z|LQNDU zu30oQdafJTQ^PR&V|w`giI4&soZjDVlCY!pzlc>BJxr=vj867%Y1G&t}LJ zy1_g_`oo!!B3i(k83^^x>)%roT{wGD7bKD2+5;s#`$4IE-KMNmF-k2t*`EFuezFPZ zy>7~OyWK4@*Fv9SgqKf*D1qrt>{Qv?uatiYQ!q#A*)<-ULrQ?d`4NnFx6Ob}aWItW z`O(5JF#%bt!?^jIs#ojI@txPx|EN+m7&O{EkaxOHQo|txm86Hyj zU8p-)!V<0Uo`zq8^e&!pB`l+Qs^-kIwd2c3naW^q`XTb&gDB?EN9R_tW^cDV_y!RC zj;?7R=WDH458O0$=!JX#+yhHKAQ)j-HBXx7?oI*u4$UK=d({>7Io5`VXDHzy(Z>x@55pVk>6F!022v=7m2U|5+tG5 zyr;96zyf<-f(OE|@FG)s-ter=hy02WYj7v>%xPl;dP7)D(7+rHM;J zfCJNlXc*id4}pP*N8c4sGw?m{AL$|)GEigdC5eZgdxHtfGcA(VKfaW}?-XJCRhigpTd&Dp&8p+5j&gS$9=fTPzUrPt%@!41nQ_24{-kzg$z=&voYhJ)h_E{Qds%zJI*^F-O<=Uf=!tZr3^G;6uzIbnR%?ovk|Y6d%D<$eP?TGCQ}Yj+9)|`3l|uAgxKjzxkbq((kI4d zyfv+Pg~);MP!vk?PQ)S0cwO7F*P)IWM(W2-*Wq8M+zm!^ zocoTXG*oI<)d427*-y{afndE^DXQ zm9^HH2EF=T?Tx=TAi#U~4YRuSMBSyz{%3a8KmQU}Q5aDbwLx*gk{?|S2bAiT_il3qQ2e_Fq{*lD5t z1JA9*ipwE+XGu`?YTaCfnLNZ$o4p}1TCldRx_$wqyr61AFPpr0wDEIV-(|D-qHqgI zA#}i9Y3h7un+R600?+E{@Zqi57rtddw_K|)@{7!i>d^eqtIj$u2tQu)PaNt7-bcHl zPUGosH{Q(;oLZYcynL1_&^PLMZ@2Gj%9ElEXDjYguIw@v@0$6kxci08k>h8B z9vJbIFeMH^Rd4yZCy!>hl@1g#1idpP=#icG#wzp?1F_@UMY;nINrD#|0?)3+SGR!A8zwi-4Qgz{ zFhStMzckf=k-P9m!?jV(V}9qT2xO+pA2X-R;oz+8+(n%)d>(YadU}zdQhD zo-1VIUPp+_M4_uh7a>*?FBnz4aF5|mrwJNsE5yp5U0$t&5DvGahHCal#xLuV5d>XV z9PJ$+=zhLX1NDSXk+uG@r`PaR42zQUP{6%YJ(`rkwz^q6g1m-L7@u*P8n&6sF|%9* z<w(>*@|gLrYr+p=~oK_-c6o5bGHZ6UOJN>HvCT05YvW^-|@m7 z%^r8e(G6^`nMcQmU(Z>!%f%Op<6BcPV&^{jv#$0e9)4{=F(^wWNjU|Bk*(E@7a{rD zxpPxCpF@~EA$=M8rUSoPS>Q|7oyNhya!E&9|4an^3re=8?r2CR%59w^x-aDaP`F0* zR;PHPe;GueiL_JR^eLy2qr4ZzwBZ#!kb-WS^6 zP`F6#M7`CYzBjGQVUn)x7CHIaLza~lIrt^j-03bihfu0*=i@e;Ljr|3t|_9En&_Vt z$|TKh?{1muJXWx{PFJuVT}IWms{wuEoZpkmYIX7W_c^)QHrn11h0XbLznZ+cV0Tc_ z-ZKdk2ipsR(VuJ&g{17qD7Ad{fx(n}NioZanv=KW?L9iH_L= z(w%8ACmX~+jqe*VFiq`Kelv$(lG)=~$!s%jzUwUqPW5z7ieJ2}Ie;#}!_3VNs4~g4 z_F$pSp4O17ls|f1&faq!LTvq(JfW=Sn8Okio55MidjlenCHrx?4B&Jo$F#LrQ2Mx_Q0dg577bR1=LRXVq zF9?+Q83)HcU7L_S_C*Upmp~3%4=4edi#h#1na2+9IS8}o8$y(WPszRj%s7oHLs};T z+%bHI3I~;Oa|9aEy=^x5=RgQ$LSXXuQ-K-yTr6h9_eKH1Wrz)_QvnvUEXNMYd|Zm4 z!R*n^ypbX{&^mQ(!t$%%6(AUcPMf_@4OslJ7&{nMXN;hau&3G$S+P2i(@#CKl;tRGvn0)uzR~p&hLdXbu(Z&V9gF&kosdS2TYGD z>Tls}*Z}#5+QoO9&&9}HH6%i7c za-t#mNo=ViKPC(Cb+6o(D3|#=LAd$w=$-n2QY@a6*ns!x5(K-&gkTp60Uu2qnRKS| zXtKXJknFAl2yfP38IrRui(uVGm7;-6{~>j-h`VGgh?~cPU^nqX)!cL?l$xraGZAoQ z)goP3#2F(6=(&$}z+4S93rEK!k}1P=>sD(@3p_pgovR%PlX+7enYMkC4=kbhH%U*V zGKvM92h7J(!cspaL#C!O8`)ubMkuub5lx<1_|@y90bQb*ucop{gF=j4#q*j>3E_WA zg0K&0*oW3A#ZWVlG`xP$JeA;zXf8^(Dg$j9;2`nU@;tg6N-u&UEH#V=e8m@akps`& zM`-e=AbFo}EHJ_#Gb9dE<_Tv*A;RHy>w0@oc#A(gQ&L!G2dV$b;m;LKSqEU^D;JjO z+@_7WV`?s&?>Pq%=>w1P%KZ)92DE{24<-kAO%|A6cxVgBhM?MbW(g`XoxE+i;{eTa zFLt_xZ5Sa(l}JKgpHF~n#Ji*pWs!LZRc_OI+X3jVXCQtU_j*4^W6RjeQpe0 zLRC|D0RC{w4~;rsNIpc#aGcAl0HSVT&APNraHUPfd}3(tlb>6kAjRXAhxpwKAwxxM z6))yJb;!~|tC&A&KX{0~)W(ff;mTbr;{&wDXJKosI3D_7w5#&u_Se=lOJ1o}M%)`< zfKK;51}RsHoatgZg84QRy@Z1V@o(*Un+>36xS}iE5R6RUl~pFSGDD!00cvD{yF_6M z(~&O9uW$t$0h0PTZIL(Rk<*}SHfcmnAk-0wr+!fYq{S88pxQFP23hbaJvn&iP_gAAb03IH_)kdQ zUifb9T(hPCG985s>``3GppSqUy;!1T2)^6g9+I{d`|-7p*k+Evqa`Bp(TpiJok@0w zSJQ9iF!eVxlMKPr@cbDc>*p9;a-y3Tu9{$v8`8l7+TwTn2fAoiSuZ!^==g!t!JR6{ z1_pe(x3BJmu^`@ocflR)#39?kT1yW*KzlW!8yaQoXF_{*TAv=e{x69z4Hsa)ArId{pdN4;lg4z8=(AJ!z=*(4D0^k}qP6l#CJ3^b{rqa<7E8n1%TG&v}j)@~^o zC!#d~AVi~awGM3!d&Bs?Mch)FZ0o)o^dU&{A-)8Vt_Uw;WU_9*d1Lrwr40>9a2$wF z0pt!u)PA)+xAfe`eI+`OB!U*8>4A(kHb{_YZI{Bib3xZS&36(j*GE#*I5L%*WbE@% z(XjB&23ILel^v|Xt)7mzJI3AdEVyg{Mr(vwdvjpgh7MvH-?4~$2Z)>{k5le#mdf=J zT^-0sgC{`ZS?SbEdlh#v>|C|7K-Gu!4m8!OEyT+Ja>iWXE$OlL?3FspXV#8UBi<;0 zghQ481v9fJ$^u9Xq3R_vj_$>@1Ohh{R>l`H>Ln(tYEh_FJXQ^t%-~L_f)U9o=gq&N z9|D04`gaNg*8+`_AT!277-JChH;xGvI7>mHL|B>m$erfB(1RHD6>OJB=H;3MuJdZQDguI7PvgC*B zzDMopt$$;>*0Kaxes%UZ%(@8rlZAy(A-rf*;Xj*CLR2oWdNj9YhJ&uc^Yf&rFLNnb zgaO%P5T71?+(K){+=SC-ONAknCU|}KKVVl$z|Y)P3c}XDiG)!N2x8H{o3WFHs7RHH zUErA_Rn;K@PZ5n_gJ!@Vq8*xg2+dV0hVsu9RyUCVDc9s|0|ffB`i(=6Edkv*#hm zaVBboYwTiDbIIe1xE*ATs|rEBtU1EWefxc}6O>0qjRP?9Sxrk7WYWc*sPbXThsaSr zNam5{8cU!qPs4^JE)$H(aL<1VN}?H=$La6{``qBR>Q&KYFgm54B*8##l{aGi$FKs; z+Dqoma5R z-Wrq0(G(jK$%Lt7`i;5cP{Uk7{(ng%<@ z^F0az4&;2`4;;YX)dt{&ZoTIJ!srA}uE<`DErU9K{*D0f*Weo9obd|6qv50~CeaoY zs)LWM6QQGL$pWyJjV^?;wjNNIvh#t>HQryM!&wG-@rilvEbJ5Olr~xNpO=u>gx< zK|b!;^xK0`C2-U`q1`W>_5DXFoM%{b?#+Qp$|*hpY|j7Q&V6psa?4T$Y^$|3g%OMc zR-Q5aS0Pr#b_n5SH55Y`LY-V1>YV&PPytkgvjsw^J!yuy4U#uK2H2>L(bd&?kD z3D(~*(xdIL9T832UcRTbm!2!h^bcQcdO7L|`n^jxP3h?=nSZ~(WiMIhOa5?I-njgJu)WIT&&frPk?ca+20V8eVRQ=qMN!`z@If zDApz;E!h*lBPX_w4FpM^Y*+jaTN5ixEbbTYANwL4J7X2PB{&7D#3i^xldjQD%VqY& z!RcJ~h#Nl0NmV6F45B9Ks(~Wl%#%%}rtexzM-|R$E*LGE-t$|1Z`yd59DNEoT{^IL zspn+$>sah#7=xjtU7w|iYB#jvvC}yC`_4Tv9j&;Ebl?E|pVLJf75xL~5(x+hR7X68 zI=dpx6QJDqPwAR8l`2Or2(#}ArkeDx#?XzOd!M?*IEUdF^xH#wprY=K*R&lSR(sxnea+(`5~s6D=7RH8-&EB z#Qu^7_J81EGRUkSF@4H557hpwOv@!N4Qpi^KJ?Myg&?^}L16h)CXY!_@^wt9-~^{j zfrN29gVfrU47)f81}!`gG7W~V7bxYJ(?H%^*># zIloLy?@Nt^@jtEBn`sMu0`?t0qXj7bNY5UssF=eq)#Iv0oyUGny16~iThznu8YAaxj&zARt zXX}Rasg;ITr4>ZDfE8h0d9!JqyimhO0k1)o z{KA1%-1Op`hgZ>R$Ii(ue=3;?^Ey%WlUhd^gOQ{g2xwXF~(@;_t zalX9gF>I26z#eTCV*?S%c6#Y2A~r>E4EG-zI!kkNT^SFT*ofH>Sj&sv9lwznn3N14 zqC3Z~Gu~MI9KH&{9x-)WB$Y~FsjSOyjXw@U7Tc8Z(utH=pim(`=xfh>i0M8YfhAUg z7Di#CiyV!~3>Gz$5|z2&IzwaWp5AjbITN*$MvG0_3P)CH zjBlVuEd5kd%U{&uQg9Xfyor>(Oez>y-OYR~b(`bdsCtRD!h#Am`320|b!U;3)Lm}E zZ%I0xUaxO(`y$of1MbasNjO3UkY_sY%1EIu(n}$TC{UHx>uOQ)?|IB;{xMJDs{l&b zVZVlkq>j*~8}C16;|utjsqY%=Xy?Se2spkZ4?c5-N2XE6yzJc_nn;y9@ntabttxrd z>9-ND@E@_(*LjigC(dFp~pcS$;f>NTQ%tCzBJ z-(4!$K&#OsVRl7|I3jcNo)ly>Op`Jq?c!-`g(}%Uok%&#gkn>Rk@|>LCovIEg+|!MZ7>hg&4?`!& zL|vD3#L|V!Z@IPnVH-#2M2MJMC6+y|O&g!2^)hj36{!h3>j9>g9zJ{lYVqZeg^!5P;K1Of7Zs)_#AlE84}nL zZzMfr&o@J%h#M4CJ#3mY04wg#Ep+v$CpeWO?oj$>$JSiR&=7*JM2l;<-7)Z5(zOf>Bs< zO-#R5Z5OH6r84ge9sKTb&tHtZEEU@gIjvn0;|Sq;QPsZ5$ZB(c-*VyYjpW3_KT#-A zh_YeGu#X>8R1>|aML3X%7He5ery2GZtZ|ntWKhM4K?%>tE&5gJq_JwZiOctH;SNwZ z?V%@9p{S(*=@E~(k1`}h2*nVjE4p5zE8z`-D0j(DS|xW*oO?y9cXR63y2xI@QzeFx zjGxd+cI&zfbqhm4F1xC&>TmiS53*IP$K;@BgW83M>1l`@^S;Ss#mX!OejU)?3`?!ek{Qw~#qY1je!YEm6{6^^TeKK(eMGQVtH+g(WHjlQT`@_1W& z5aPjn6WZ2o3dxvo_=A#I1K`0d6xk2bN1{zBcSv&E8>LE~^av;~*}P^bl}Hb9m-y^s z0mWT$vZ%8~vOnz;#%TSCl%tdL9eh^}Z2(~!AY7C8;%UAj#1gCOQ9n~L$J#5dY0vi( z7Kp2TokccWbnA!W^DmIMC99smT)OMLCt{%Gy@=Ma2cjsp@}7=}(t*g0+i+~tYY3XV ziK>=dbVaEJ`ERnwiW5l+w2wK%#r%a+!MU}Y3ec}wHFTB`D4^HJZKCwR3^@R2faV|k zX}{v33F0`l<-mN+Lu0u5-xEQP@fKGW!c(rvgR{Y@Z+AiEG;E;CBlAl^?)kSq@{Rb; z1yG3ZhN8cOy`v}t8itCiFd3(3PKw49ir%3v~2z5^LQz1tHww+tieMSM<24 z*;J7@ENr;7$b_46UJgWfl}xKD-mdqDzlxQ=wHT?CuH3nfQGyY_8kN!VtBOr zK>g&aM0=nS)TfD9CVhd0ih%jFN9eE*BeygJHOotD;-k%bMx>Em1L7~Pvjq)jz4362}x7|Gc= z@Q5OIR>3m!u$=kWh+14%g7ul2WA~LeUpe&pNlvK*sa4+b7 z(?`(75YOrk0fj0FrGxm#A*Iuk3PXyVcvB$4 z+5;+JePaLi&Juld+o=iyt_h;}yZwIstrB=`Z1@${bupCQUw_J@t<2y5SjMEn1VmjC*NK zm#kn1)JHix^zcC@SyNFx`L!>Bs{Ce={Tv!ihgTk{IIQ(+4){)%)|+I>e4ia8#H#VI zm!^*CCjIvS|H;<-YSHlGv3e8w4`w_Tmp>)X03qykR)#*GCpiE4*9zh(Ia@L?ySv5~ zNsZfk+AT{a&G4d=QkMa|{7eamN?^jT0lGh}&`G_U{g{QR4V(x^)qU62W90k~ts}a4 zwCVXNO1o!^Y=v$Y%D+qn7u0iijvOZwu6)+zxIl5Jo8RkaBRremxkuEnX9+7`U& zaB#c6_!=2oXIN(Eh(u;Q)}JM2x)wz{jao51d89tBfvQv-X?hWjG#CN0$o zNgoqtV)^-~EwOxB$jul?Z2Eyd>orKK<-RN}9DURs@X(H#JbGe(rEmel6Hiy1*}4TE z-MT3uqt&v&4$j%ke^k2HaAqmNE_mw)CwL>9pS^P7TIy7!#(@eg7FgJ09a0-bxdd8X zwWSzG7r4%!(7?!n*;no!i=vi3`tyPbnmt;a>o+t9cC(Fepn}UA6g+Q0ohBaiEC}ew z$UP34k-R8aVSL-_4zK^SpH8=d?avJ5!Iok<9Bn$)OC*rWk(q}t^_~STkB5H99M!}E z#abWhe;mHM3U&beufil3#ymI#ftK>q%`N>c_S;litb|?R`|XH?7$^6p%Em!G-dV95 zDUe;3xT^EI8ozq64ZsTcVA+p1TN+6tIqZz}ZXJhhF0=@Y51F2&*)M z!xW82S}Rlsz}DKgAw7w*V?}@anO`J9eER0`&s#*zS!f2M>CuT^YNOc9&+@Gv0e0L^ zD4n7{@SWlhs#%6S3%YUd>^G>tZw~(CJZ2{6VXgnikDbb5$1~cZy&d;&l*4!Ba{gfv zOlupLup=Emd}Dw6wLCt0FwbV<=%%B^p?NcjK=m5d*k9)m w1PdToEh!^ND(lutSR%py{Qph=w-qsJ!`Cjq6PkW(6M+9#uW(wPy^I(2UvAJ6EdT%j literal 0 HcmV?d00001 diff --git a/docs/.DS_Store b/docs/.DS_Store index d27a69df27083ece0ff1b7666d7f4c94d747cf17..64c101c451fd88ab25a6c9da5266358303181e86 100755 GIT binary patch literal 10244 zcmeHMYitx%6uxI#+8N5g^uc>c2Nw`zE!&5b@-W*Mp+G6Hg}#6?yEB%tvomF9ABECb zjWH5X6E((Q1P~A_U{y&D?YE zx#ygF?>Fb%x%Vz11e%g+H6bz~gvWbk4A>bk4A#f`ofZuGI_!36F+(W=az(ZgH0lGfO_)r>h=@_HV(t(+C1VCDd zY$stE&jF5(?9z}+#~5`~(Iz`RfU64b5d)Yyw#!r;X~?Bxj52isOr3z+Gq@)daC%2Q z*%2oYV${n$1Uv+$B0$gXvq%%3+K0*ZN$2+%QQHhF8ZoR0%3xT*38bg5Imt1^kti`E zX?w_(xeysLbUP6YUIwn9a7IxvU(A>A`@@HmW)3IDQGE!4rTN98Q*40d4 zSy#I@2TJM$n5Ko2LOp3xhMj6=4pI=wOzP{5g9tNAW{Iy;GYN&g8FWAe^1E zKwiG8s&?I`#?4!I>>ig&%gQUnd15d6shQC4(Y1JwVn;Po)y;uDXPqRh9x=2| zQ;BIpDFlS^g^LzTz9qiOOcN8luEgMRJ4ghB`abe7IYrKpbL3rekz68I$dBYV zAW#Iep&Tk;J}iKxunN{d1FVOQun9Ip2keAh5Qc-G!@V#FX&8h1;Q@FMj>F^d1Uv~( z!87n2oPp=zMK}v@!Z|n(Z^3);3498l!I$t2d<$3LJNO0uf~)X1Cvat4Iak50;MQxU5<&*NRdBhNZIx z_}0o*q69pvtQR+mQXvMYFz!R=7sbj(3|HcG(k!>i5)HQ-==k50pUAJ|DhTNKi$R9v zP>0Um4DIOXeXt)6fC3S8_86Ej1c%`$9D`A~4_*H_oPd+?C_DyF!zpz9XW=xw058GI z@Cv*JZ=n01hYRTZ@52Z1A$$%O;SziSmz^;90e*(x;g1~0-jUN n=Xt;^$P82i1QOgp!WE=^W8rt^$^0sT9E=b{7&gcA%wYxqc<>St From 3f8caaae81833197860f0d68b9e9d182e900be28 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 29 Oct 2024 15:43:52 +0800 Subject: [PATCH 04/84] bugfix --- bricks/popup.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/bricks/popup.js b/bricks/popup.js index cfc5d6d..53dc2cd 100644 --- a/bricks/popup.js +++ b/bricks/popup.js @@ -17,6 +17,7 @@ bricks.Popup = class extends bricks.VBox { this.issub = false; this.opened = false; this.set_css('popup'); + this.old_add_widget = super.add_widget.bind(this); const zindex = bricks.app.new_zindex(); this.set_style('zIndex', zindex); this.moving_w = this; @@ -61,7 +62,7 @@ bricks.Popup = class extends bricks.VBox { } } add_widget(w, index){ - super.add_widget(w, index); + this.old_add_widget(w, index); if (this.auto_open){ this.open(); } @@ -76,7 +77,6 @@ bricks.Popup = class extends bricks.VBox { left:l + 'px' } } - var _add_widget = super.add_widget; open(){ var rect; if (this.opened) { @@ -134,19 +134,21 @@ bricks.Popup = class extends bricks.VBox { bricks.PopupWindow = class extends bricks.Popup { constructor(opts){ super(opts); - this.title_bar = new bricks.HBox({cheight:1.5, width:100%}); + this.title_bar = new bricks.HBox({cheight:1, width:'100%'}); this.title_bar.set_css('titlebar') this.content_w = new bricks.Filler({}); this.auto_destroy = false; this.moving_w = this.title_bar; - super._add_widget(this.title_bar); - super._add_widget(this.content_w); + this.old_add_widget = bricks.Layout.prototype.add_widget.bind(this); + console.log(this.old_add_widget); + this.old_add_widget(this.title_bar); + this.old_add_widget(this.content_w); this.build_title_bar(); } build_title_bar(){ this.tb_w = new bricks.IconBar( { margin:'5px', - rate:1 + rate:1, tools:[ { name:'delete', @@ -168,7 +170,7 @@ bricks.PopupWindow = class extends bricks.Popup { } ] }); - this.title_bar_w.add_widget(this.tb_w); + this.title_bar.add_widget(this.tb_w); this.tb_w.bind('delete', this.destroy.bind(this)); this.tb_w.bind('minimax', this.dismiss.bind(this)); this.tb_w.bind('fullscreen', this.enter_fullscreen.bind(this)); From 88930f63f94f1e17dda8d5dc029846a88287ace6 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 29 Oct 2024 18:28:02 +0800 Subject: [PATCH 05/84] bugfix --- bricks/floaticonbar.js | 28 ++++++++++++++++++++-------- bricks/popup.js | 27 ++++++++++++++++++++++----- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/bricks/floaticonbar.js b/bricks/floaticonbar.js index a65670b..550cbf1 100644 --- a/bricks/floaticonbar.js +++ b/bricks/floaticonbar.js @@ -20,10 +20,21 @@ bricks.IconBar = class extends bricks.HBox { if (! opts.cheight){ opts.cheight = 2; } + if (! opts.rate){ + opts.rate = 1; + } super(opts); + this.height_int = 0; var tools = this.opts.tools; for (var i=0;i Date: Tue, 29 Oct 2024 18:29:47 +0800 Subject: [PATCH 06/84] bugfix --- bricks/floaticonbar.js | 1 - 1 file changed, 1 deletion(-) diff --git a/bricks/floaticonbar.js b/bricks/floaticonbar.js index 550cbf1..437f4bf 100644 --- a/bricks/floaticonbar.js +++ b/bricks/floaticonbar.js @@ -61,7 +61,6 @@ bricks.IconBar = class extends bricks.HBox { }); } opts.url = opts.icon; - console.log('opts=', opts, '-------'); var w = new bricks.Icon(opts); w.bind('click', this.regen_event.bind(this, opts)); return w; From c377a8ba7a066d19141f35824a6e687c9072fd26 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Wed, 30 Oct 2024 10:37:51 +0800 Subject: [PATCH 07/84] bugfix --- bricks/imgs/dislike.png | Bin 0 -> 12289 bytes bricks/imgs/like.png | Bin 16773 -> 12767 bytes bricks/imgs/tag.png | Bin 0 -> 15259 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 bricks/imgs/dislike.png create mode 100644 bricks/imgs/tag.png diff --git a/bricks/imgs/dislike.png b/bricks/imgs/dislike.png new file mode 100644 index 0000000000000000000000000000000000000000..dee0577d12ab004f4d1115c7cc98648a39082398 GIT binary patch literal 12289 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 D8XT$B literal 0 HcmV?d00001 diff --git a/bricks/imgs/like.png b/bricks/imgs/like.png index 6441c9dc547da8d82027b7c05ee249407b1a5bdc..928f1bc740026c116f457bb7d53413132ab6f9de 100644 GIT binary patch literal 12767 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 literal 0 HcmV?d00001 From f52edb8376f7888c03d83748f4f9afb2fc9213ab Mon Sep 17 00:00:00 2001 From: yumoqing Date: Wed, 30 Oct 2024 15:22:38 +0800 Subject: [PATCH 08/84] bigfix --- bricks/imgs/left-bottom-triangle.png | Bin 0 -> 8242 bytes bricks/imgs/left-top-triangle.png | Bin 0 -> 8361 bytes bricks/imgs/right-bottom-triangle.png | Bin 0 -> 8357 bytes bricks/imgs/right-top-triangle.png | Bin 0 -> 8284 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 bricks/imgs/left-bottom-triangle.png create mode 100644 bricks/imgs/left-top-triangle.png create mode 100644 bricks/imgs/right-bottom-triangle.png create mode 100644 bricks/imgs/right-top-triangle.png diff --git a/bricks/imgs/left-bottom-triangle.png b/bricks/imgs/left-bottom-triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..feb1db650372231a053bffcb046884ea3de28936 GIT binary patch literal 8242 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 literal 0 HcmV?d00001 diff --git a/bricks/imgs/left-top-triangle.png b/bricks/imgs/left-top-triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..fc0d8d87c7def0ea36f7585df0ac078a99a76362 GIT binary patch literal 8361 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�Xb11(@VYFbV8kytsDFl8`IRL1WIqET7b1v=|An#e`2y^Dt z#U@5)0o#qtkEBIo_9XGs;2&WJ)7*wBcaWY7g2r zGKW9@3e+|BESP%<%>We4l)BoQyFtM@I}8RZb4=EOR7+ zn5Jhv`kh<_u*@;Z96gggL^DR_co&M(z3XnA5A9jzSW~vyRG&U584PS>jx_Wfr>n&{ zgBh43XN{oFf3J3NZk4EMw!@2SR!D=IO6r(zl*b|f?m&Lv~ z_78VD3OY3~$J>Yj+N$hIoVkQtMEVrI9&4J0R^$_JZ!1PUd)ztdxF7K2s{%rPxz8awI1 zkSueQzP@3rd*s%nMOCuQQCQoyUV8c95ZwM63j5DB&bX2o5gtMgn1ng5B=u+cn;fxN z=IHFcP~6BIKuvwjkTP6obTWri_C|H98LTxh$1dBWmO8KNO_p4~fjI_$ou=~tk^VwX zhb(iP!u^1^+Zi!jY+#NAZ;3YHe$88fD34{1$zQh%^`BgpF{m<@IX3h~)C7mfwWEPK zs#m(y)vPRD94uoD%#rjpWA6z#NOuZc*2$ z=8uP>2Igq`pTPjSYcp}=SNPP5(w^#NE(=9 zpkt6GVfWfW$QJ{1l-@O0mEFyAB$^nQ;|oSs>+VC-NlLNIaqPoNRoRCnFNFvpeL z4QeMHH3QAiz#Q%O+s%7lM4Mo04^n1pxVl@?rrMZ&SgyzNF1c&fPKH+i$_NbSLN{ma z#%|A&asQ#-fHw?HKk)SdS5koN{4}&qvsHam(wmAHaHaJ@1a! z_}c&GLHtq(9h6KA5VKVF`7ysi|3{@Zz9VDz&o2jzwr}z}2DDgqOP1 z#V$$A!V4Ao9DwC1dD;rcI{mh-hPzx3ILGF9*BZXwb=?v(?D{Qs{n>21#;(VXcyb-K z3FnZwNL86~tK&AvyauITbg|Oi>iQxTN=wkfU3=%KBZfJKpoW;G(BT!eUi#p&AMwIo zghJ5OU2A22Z5uQ$2VjpL99fsUP@ILkX8955^V?;ie$=`Uu{>?w@o3bx)F zSFZBEEOI10@d~!Cm7D5oIh6BYq-p&C;ggVR%a7YlNq!QO-K!ggU} z3)Z-j`-}xpPZaH~picO9%nGV2>rwd;KZuuv;o{?3%G(f?e(&}IR?G!J^{pA2q_t-} zu?yc5Lu#jwu5^>SMm9f`mBJ!M+OQ1$>`2245nD7X=i}0@qOJ=fqugKzh|+o2B@pecc{xWKc@wgOO2OM*f+SJ_Rht*hIbTh_#rkR!9m(vP1t>?@JmAZ&eRxMtUyD~6X4z7TPv!C9Mh z!OPYWJl7YKem^pw_>Hj(YVG!}5#M`Hs;_E*qJ>juF=9xduC0pT@R27XIu8WfmucX$~UeGgE6X+R4eB;G? zYD3l4eB6Hy_ZUbI+r-IKhQ9vEtRX~^M33?#P`fy(;u?_^w~pBiS-uy{!q~_xkbi^~ zCF!{X*jKLmxMS?7y0TZ3qsi?#-oowhf>9k+hPQB)lE_n#wZ&WYfT-ycsF(pYU7r8W z%2LjgPk^kX^lm#b$jIxzxiHzOr5{KNvdsBAV6t8rR!GQ!pJ_Q7ChPNBn@$l~OGb-{ z$s1?N7qM#QFi)Z8jf+8c>?^5tv^z}p*U$@DlU;ZZV6y+mUgy3gvK(zk6O-#+8S3!5 z@UT0a`^I6#QsM!;92yVjDqk$ZTLbh+p2}3&@Ig~XUTG$LvYx>P8#4IbRPKm1Ut84s z7a3kZUpLLLm3{b15rt&TR&)by(sUwGEJCG^dR;|E1Ku2=F9)cLF`V#q8~V@TOBYE> u{{JKYdMteN&`lIYMUnpt@W1XoefO!4bXQ$VN1I>^Dl{m3RDNLG+W!G#9!-D% literal 0 HcmV?d00001 diff --git a/bricks/imgs/right-bottom-triangle.png b/bricks/imgs/right-bottom-triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..ce4f7b7985017e64cee8df326840eaee7c050ba2 GIT binary patch literal 8357 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 literal 0 HcmV?d00001 From 4e4136eb72479547c88c01cc2eca6679f64909ab Mon Sep 17 00:00:00 2001 From: yumoqing Date: Wed, 30 Oct 2024 17:56:50 +0800 Subject: [PATCH 09/84] bugfix --- bricks/css/bricks.css | 15 +++- bricks/dataviewer.js | 8 +++ bricks/menu.js | 2 +- bricks/message.js | 20 +----- bricks/modal.js | 2 +- bricks/popup.js | 162 ++++++++++++++++++++++++++++++++++++------ bricks/widget.js | 2 + 7 files changed, 165 insertions(+), 46 deletions(-) diff --git a/bricks/css/bricks.css b/bricks/css/bricks.css index f026bc2..7b8938d 100755 --- a/bricks/css/bricks.css +++ b/bricks/css/bricks.css @@ -46,8 +46,17 @@ body { grid-gap: 1px; } +.resizebox { + width: 10px; + height: 10px; + background-color: darkblue; + position: absolute; + bottom: 0; + right: 0; + cursor: se-resize; /* 改变鼠标指针样式 */ +} .popup { - display:none; + display: none; position: absolute; box-sizing: border-box; /* 包括边框在内计算宽度和高度 */ color: #111111; @@ -119,7 +128,7 @@ body { } .scroll { - overflow:scroll; + overflow: auto; } .vcontainer { @@ -149,7 +158,7 @@ body { .filler, .hfiller, .vfiller { flex: auto; flex-grow: 1; - overflow:hidden; + overflow:hidden; } .vfiller .vbox:last-child { diff --git a/bricks/dataviewer.js b/bricks/dataviewer.js index 0f16600..03c0f33 100644 --- a/bricks/dataviewer.js +++ b/bricks/dataviewer.js @@ -215,6 +215,10 @@ bricks.DataViewer = class extends bricks.VBox { fs.push(this.fields[i]); } var f = new bricks.ModalForm({ + "widget":this, + "movable":true, + "resizable":true, + "archor":"cc", "width":"90%", "height":"70%", "submit_url":this.editable.new_data_url, @@ -239,6 +243,10 @@ bricks.DataViewer = class extends bricks.VBox { fields.push(f); } var f = new bricks.ModalForm({ + "widget":this, + "movable":true, + "resizable":true, + "archor":"cc", "width":"90%", "height":"70%", "submit_url":this.editable.update_data_url+'?id=' + record.id, diff --git a/bricks/menu.js b/bricks/menu.js index 85b80a0..f0a7d97 100755 --- a/bricks/menu.js +++ b/bricks/menu.js @@ -33,7 +33,7 @@ bricks.Menu = class extends bricks.VBox { } } var w = await bricks.widgetBuild(desc, this); - if (w){ + if (w && ! w.parent){ t.clear_widgets(); t.add_widget(w); } else { diff --git a/bricks/message.js b/bricks/message.js index 1eb2f5e..f71f59b 100644 --- a/bricks/message.js +++ b/bricks/message.js @@ -1,6 +1,6 @@ var bricks = window.bricks || {}; -bricks.Message = class extends bricks.Modal { +bricks.Message = class extends bricks.PopupWindow { /* { title: @@ -43,23 +43,5 @@ bricks.show_message = function(opts){ w.open(); } -bricks.PopupForm = class extends bricks.VBox { - /* - { - form:{ - } - } - */ - constructor(options){ - super(options); - this.form = new bricks.Form(this.opts.form); - this.add_widget(this.form); - this.form.bind('submit', this.close_popup.bind(this)); - this.form.bind('discard', this.close_popup.bind(this)); - } - close_popup(e){ - this.dismiss(); - } -} bricks.Factory.register('Message', bricks.Message); bricks.Factory.register('Error', bricks.Error); diff --git a/bricks/modal.js b/bricks/modal.js index a83f7f1..e1f8695 100755 --- a/bricks/modal.js +++ b/bricks/modal.js @@ -167,7 +167,7 @@ bricks.Modal = class extends bricks.BaseModal { */ } -bricks.ModalForm = class extends bricks.Modal { +bricks.ModalForm = class extends bricks.PopupWindow { /* { auto_open: diff --git a/bricks/popup.js b/bricks/popup.js index 02fa3a2..6e5c51b 100644 --- a/bricks/popup.js +++ b/bricks/popup.js @@ -4,12 +4,14 @@ bricks.Popup = class extends bricks.VBox { /* { timeout:0 - auto_open: archor:one of ['tl', 'tc', 'tr', 'cl', 'cc', 'cr', 'bl','bc', 'br'] widget:null for bricks.Body, string value for widget's id or a widget object; - auto_dismiss: - auto_destroy: - movable: + auto_open:boolean + auto_dismiss:boolean + auto_destroy:boolean + movable:boolean + resizable:boolean + modal:boolean */ constructor(opts){ super(opts); @@ -24,12 +26,66 @@ bricks.Popup = class extends bricks.VBox { if (this.auto_dismiss){ bricks.Body.bind('click', this.click_outside.bind(this)); } + this.target_w = bricks.Body; this.moving_status = false; if (this.movable){ this.setup_movable(); - console.log('movable ...'); + // console.log('movable ...'); } + if (this.resizable){ + this.setup_resizable(); + } + this.set_style('display', 'none'); + bricks.Body.add_widget(this); } + setup_resizable(){ + this.resizable_w = new bricks.Icon({rate:1.5, url:bricks_resource('imgs/right-bottom-triangle.png')}); + this.old_add_widget(this.resizable_w); + this.resizable_w.set_css('resizebox'); + this.resizable_w.bind('mousedown', this.resize_start_pos.bind(this)); + bricks.Body.bind('mousemove', this.resizing.bind(this)); + bricks.Body.bind('mouseup', this.stop_resizing.bind(this)); + } + resize_start_pos(e){ + if (e.target != this.resizable_w.dom_element) + { + // console.log('not event target'); + return; + } + var rect = this.showRectage(); + this.resize_status = true; + this.s_offsetX = e.clientX; + this.s_offsetY = e.clientY; + this.s_width = rect.width; + this.s_height = rect.height; + e.preventDefault(); + // console.log('resize_start_pos():', this.s_width, this.s_height, this.s_offsetX, this.s_offsetY); + } + resizing(e){ + if (e.target != this.resizable_w.dom_element){ + this.stop_resizing(); + // console.log('resizing(): not event target'); + return; + } + if (!this.resize_status){ + // console.log('resizing(): not in resize status'); + return; + } + var cx, cy; + cx = this.s_width + e.clientX - this.s_offsetX; + cy = this.s_height + e.clientY - this.s_offsetY; + this.set_style('width', cx + 'px'); + this.set_style('height', cy + 'px'); + // console.log('resizing():', this.resize_status, cx, cy); + e.preventDefault(); + } + stop_resizing(e){ + this.resize_status = false; + bricks.Body.unbind('mousemove', this.resizing.bind(this)); + bricks.Body.unbind('mouseup', this.stop_resizing.bind(this)); + // console.log('stop_resizing():', this.resize_status); + } + setup_movable(){ this.moving_w.bind('mousedown', this.rec_start_pos.bind(this)); this.moving_w.bind('touchstart', this.rec_start_pos.bind(this)); @@ -37,7 +93,7 @@ bricks.Popup = class extends bricks.VBox { rec_start_pos(e){ if (e.target != this.moving_w.dom_element) { - console.log('moving star failed', e.target, this.moving_w.dom_element, 'difference ...'); + // console.log('moving star failed', e.target, this.moving_w.dom_element, 'difference ...'); return; } this.moving_status = true; @@ -48,15 +104,15 @@ bricks.Popup = class extends bricks.VBox { this.moving_w.bind('mousemove', this.moving.bind(this)); this.moving_w.bind('touchmove', this.moving.bind(this)); e.preventDefault(); - console.log('moving started ...'); + // console.log('moving started ...'); } moving(e){ if (e.target != this.moving_w.dom_element){ - console.log('moving failed', e.target, this.moving_w.dom_element, 'difference ...'); + // console.log('moving failed', e.target, this.moving_w.dom_element, 'difference ...'); this.stop_moving(); } if (!this.moving_status){ - console.log('moving failed', 'not started ...'); + // console.log('moving failed', 'not started ...'); return; } var cx, cy; @@ -66,7 +122,7 @@ bricks.Popup = class extends bricks.VBox { this.set_style('top', cy + 'px'); } stop_moving(e){ - console.log('stop moving ....'); + // console.log('stop moving ....'); this.moving_status = false; this.moving_w.unbind('mousemove', this.moving.bind(this)); this.moving_w.unbind('touchmove', this.moving.bind(this)); @@ -95,31 +151,34 @@ bricks.Popup = class extends bricks.VBox { } } open(){ - var rect; + var rect, w, h; if (this.opened) { return; } this.opened = true; if (this.widget instanceof bricks.JsWidget){ - rect = this.widget.showRectage() + this.target_w = this.widget; this.issub = true; } else { var w = bricks.getWidgetById(this.widget, bricks.Body); if (w){ this.issub = true - rect = w.showRectage(); - } else { - rect = bricks.Body.showRectage(); - } + this.target_w = w; + } } + rect = this.target_w.showRectage(); var lt = archor_at(this.archor); if (this.issub){ lt = this.transform2screen_at(rect, lt); - if (this.width && this.width.endsWith('%')){ - this.set_style('width', parseFloat(rect.width) * parseFloat(this.width) + 'px'); + if (typeof(this.width) == 'string' && this.width.endsWith('%')){ + w = parseFloat(rect.width) * parseFloat(this.width) / 100; + this.set_style('width', w + 'px'); + console.log('rect=', rect, 'w=', w); } - if (this.height && this.height.endsWith('%')){ - this.set_style('height', parseFloat(rect.height) * parseFloat(this.height) + 'px'); + if (typeof(this.height) == 'string' && this.height.endsWith('%')){ + h = parseFloat(rect.height) * parseFloat(this.height) / 100; + this.set_style('height', h + 'px'); + console.log('rect=', rect, 'h=', h); } } this.set_style('top',lt.top); @@ -128,8 +187,14 @@ bricks.Popup = class extends bricks.VBox { if (this.timeout > 0){ this.auto_task = schedule_once(this.auto_dismiss.bind(this), this.timeout) } + if (this.opts.modal){ + this.target_w.disabled(true); + } } dismiss(){ + if (this.opts.modal){ + this.target_w.disabled(false); + } this.opened = false; if (this.auto_task){ this.auto_task.cancel(); @@ -141,6 +206,9 @@ bricks.Popup = class extends bricks.VBox { } } destroy(){ + if (this.opened){ + this.dismiss(); + } if (this.parent){ this.parent.remove_widget(this); this.parent = null; @@ -149,19 +217,45 @@ bricks.Popup = class extends bricks.VBox { } bricks.PopupWindow = class extends bricks.Popup { + /* + { + title: + icon: + params: + url: + } + */ constructor(opts){ super(opts); this.title_bar = new bricks.HBox({cheight:1, width:'100%'}); this.title_bar.set_css('titlebar') - this.content_w = new bricks.Filler({}); this.auto_destroy = false; this.moving_w = this.title_bar; this.old_add_widget = bricks.Layout.prototype.add_widget.bind(this); this.old_add_widget(this.title_bar); - this.old_add_widget(this.content_w); this.build_title_bar(); + var filler = new bricks.Filler({}); + this.old_add_widget(filler) + this.content_w = new bricks.VScrollPanel({width:"100%"}); + filler.add_widget(this.content_w); + } + async load_content(){ + var dic = { + "widgettype":"urlwidget", + "options":{ + "params":this.params, + "url":this.url + } + } + var w = bricks.widgetBuild(dic, bricks.Body); + this.add_widget(w); } build_title_bar(){ + var icon = new bricks.Icon({ + rate:this.opts.rate, + url:this.opts.icon || bricks_resource('imgs/app.png') + }); + this.title_bar.add_widget(icon); this.tb_w = new bricks.IconBar( { cheight:1, margin:'5px', @@ -191,6 +285,15 @@ bricks.PopupWindow = class extends bricks.Popup { this.tb_w.bind('delete', this.destroy.bind(this)); this.tb_w.bind('minimax', this.dismiss.bind(this)); this.tb_w.bind('fullscreen', this.enter_fullscreen.bind(this)); + if (this.title){ + this.title_w = new bricks.Text({text:this.title}); + this.title_bar.add_widget(this.title_w); + } + } + set_title(txt){ + if (this.title_w){ + this.title_w.set_text(txt); + } } add_widget(w, index){ this.content_w.add_widget(w, index); @@ -216,6 +319,21 @@ bricks.PopupWindow = class extends bricks.Popup { super.dismiss() } } +bricks.Dock = class extends bricks.HBox { + constructor(opts){ + opts.cheight = opts.cheight || 2; + opts.width = opts.width || "80%"; + super(opts); + this.set_css('scroll'); + this.pw = []; + } + add_popupwindow(pw){ + var info = pw.get_window_info(); + + } + del_popupwindow(pw){ + } +} bricks.Factory.register('Popup', bricks.Popup); bricks.Factory.register('PopupWindow', bricks.PopupWindow); diff --git a/bricks/widget.js b/bricks/widget.js index ef72f5e..5566ee7 100755 --- a/bricks/widget.js +++ b/bricks/widget.js @@ -65,8 +65,10 @@ bricks.JsWidget = class { disabled(flag){ if(flag){ this.dom_element.disabled = true; + this.set_style('pointerEvents', 'none'); } else { this.dom_element.disabled = false; + this.set_style('pointerEvents', 'auto'); } } opts_set_style(){ From 13cb3d37eb16d939211f42a845245e7ab07524cc Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 31 Oct 2024 16:50:24 +0800 Subject: [PATCH 10/84] bugfix --- bricks/conform.js | 27 +++++-- bricks/css/bricks.css | 18 ++++- bricks/datarow.js | 6 +- bricks/dataviewer.js | 3 + bricks/floaticonbar.js | 1 + bricks/message.js | 12 ++- bricks/popup.js | 170 +++++++++++++++++++++++++++++------------ bricks/tree.js | 2 + 8 files changed, 175 insertions(+), 64 deletions(-) diff --git a/bricks/conform.js b/bricks/conform.js index f89b8e5..8a6059a 100644 --- a/bricks/conform.js +++ b/bricks/conform.js @@ -1,13 +1,28 @@ var bricks = window.bricks || {}; -bricks.Conform = class extends bricks.Message { +bricks.Conform = class extends bricks.PopupWindow { constructor(opts){ - opts.auto_open = true; - opts.auto_close = false; opts.timeout = 0; super(opts); - this.create_toolbar(); + this.create_conform(); } - create_toolbar(){ + create_conform(){ + var w = new bricks.VBox({width:'100%', height: '100%'}); + this.create_message(w); + this.create_toolbar(w); + this.add_widget(w); + } + create_message(widget){ + var w = new bricks.Filler(); + widget.add_widget(w); + var w1 = new bricks.VScrollPanel({}); + w.add_widget(w1); + var t = new bricks.Text({otext:this.opts.message, + wrap:true, + halign:'middle', + i18n:true}); + w1.add_widget(t); + } + create_toolbar(widget){ var desc = { tools:[ bricks.extend({ @@ -26,7 +41,7 @@ bricks.Conform = class extends bricks.Message { w.bind('conform', this.conform_hndl.bind(this)); w.bind('discard', this.discard_hndl.bind(this)); if (!w) return; - this.message_w.add_widget(w); + widget.add_widget(w); } conform_hndl(event){ this.dismiss(); diff --git a/bricks/css/bricks.css b/bricks/css/bricks.css index 7b8938d..74e4fbc 100755 --- a/bricks/css/bricks.css +++ b/bricks/css/bricks.css @@ -10,6 +10,11 @@ body { box-sizing: border-box!important; } +.flexbox { + height: 100%; + width: 100%; + display: flex; +} .curpos { border-radius: 30%; background-color: #f5f5f5; @@ -283,6 +288,11 @@ body { height: 50px; background-color: blue; } +.childrensize { + display: flex; + flex-wrap: nowrap; + flex-shrink: 0; +} .datagrid-row { flex:0 0 150px; display: flex; @@ -349,10 +359,12 @@ body { background-color: #dddddd; position: sticky; top: 0; - width: auto; + flex-wrap: nowrap; + flex-shrink: 0; } .tabular-row { - width: auto; + flex-wrap: nowrap; + flex-shrink: 0; margin-bottom: 5px; } .tabular-row:nth-child(odd) { @@ -365,7 +377,7 @@ body { background-color: #ef0000; } .tabular-row-content { - padding: 10px; + padding: 2; } .tabular-cell { border: 1px solid #ccc; diff --git a/bricks/datarow.js b/bricks/datarow.js index b9470a2..d32d14a 100644 --- a/bricks/datarow.js +++ b/bricks/datarow.js @@ -20,7 +20,6 @@ bricks.DataRow = class extends bricks.HBox { */ constructor(opts){ super(opts); - this.set_style('width', 'auto'); this.record_w = null; } render_header(){ @@ -87,6 +86,7 @@ bricks.DataRow = class extends bricks.HBox { } build_fields(header, cw){ this.record_w = new bricks.HBox({height:'auto'}); + this.record_w.set_css('childrensize'); this.add_widget(this.record_w); this._build_fields(header, this.record_w); } @@ -108,7 +108,7 @@ bricks.DataRow = class extends bricks.HBox { continue; } var opts = bricks.extend({ - margin:'3px' + margin:'1px' }, f); if (header || ! this.user_data){ opts.value = f.label || f.name; @@ -119,6 +119,8 @@ bricks.DataRow = class extends bricks.HBox { var cwidth = cwidths[f.name]; if (cwidth){ opts.cwidth = cwidth; + } else { + opts.cwidth = 10; } var f = bricks.get_ViewBuilder(f.uitype); if (!f) f = bricks.get_ViewBuilder('str'); diff --git a/bricks/dataviewer.js b/bricks/dataviewer.js index 03c0f33..a7f02a2 100644 --- a/bricks/dataviewer.js +++ b/bricks/dataviewer.js @@ -216,6 +216,7 @@ bricks.DataViewer = class extends bricks.VBox { } var f = new bricks.ModalForm({ "widget":this, + "archor":"cc", "movable":true, "resizable":true, "archor":"cc", @@ -268,6 +269,8 @@ bricks.DataViewer = class extends bricks.VBox { } delete_record(row, record){ var conform_w = new bricks.Conform({ + cwidth:16, + cheight:9, target:this, title:'Delete conform', message:'Are you sure to delete is record?' diff --git a/bricks/floaticonbar.js b/bricks/floaticonbar.js index 437f4bf..eeb0a02 100644 --- a/bricks/floaticonbar.js +++ b/bricks/floaticonbar.js @@ -24,6 +24,7 @@ bricks.IconBar = class extends bricks.HBox { opts.rate = 1; } super(opts); + this.set_css('childrensize'); this.height_int = 0; var tools = this.opts.tools; for (var i=0;i 0){ + w = this.cwidth * bricks.app.charsize; + } else if (this.width){ + if (this.width.endsWith('px')){ + w = parseFloat(this.width); + } else { + w = parseFloat(this.width) * rect.width / 100; + } + } else { + w = rect.width * 0.8; + } + if (this.cheight && this.cheight > 0){ + h = this.cheight * bricks.app.charsize; + } else if (this.height){ + if (this.height.endsWith('px')){ + h = parseFloat(this.height); + } else { + h = parseFloat(this.height) * rect.height / 100; + } + } else { + h = rect.height * 0.8; + } + var archor = this.archor || 'cc'; + switch(archor[0]){ + case 't': + t = 0; + break; + case 'c': + t = (rect.height - h) / 2; + break; + case 'b': + t = rect.height - h; + break; + default: + t = (rect.height - h) / 2; + break; + } + switch(archor[1]){ + case 'l': + l = 0; + break; + case 'c': + l = (rect.width - w) / 2; + break; + case 'r': + l = rect.width - w; + break; + default: + l = (rect.width - w) / 2; + break; + } + this.set_style('top', t + 'px'); + this.set_style('left', l + 'px'); + return { + top:t, + left:l + } + } + stop_resizing(e){ this.resize_status = false; bricks.Body.unbind('mousemove', this.resizing.bind(this)); bricks.Body.unbind('mouseup', this.stop_resizing.bind(this)); // console.log('stop_resizing():', this.resize_status); } - + setup_movable(){ this.moving_w.bind('mousedown', this.rec_start_pos.bind(this)); this.moving_w.bind('touchstart', this.rec_start_pos.bind(this)); @@ -97,8 +168,11 @@ bricks.Popup = class extends bricks.VBox { return; } this.moving_status = true; - this.offsetX = e.clientX - this.showRectage().left; - this.offsetY = e.clientY - this.showRectage().top; + var rect = this.showRectage(); + this.offsetX = e.clientX - rect.left; + this.offsetY = e.clientY - rect.top; + console.log(rect, '========', this.offsetX, this.offsetY, e.clientX, e.clientY); + bricks.Body.bind('mouseup', this.stop_moving.bind(this)); bricks.Body.bind('touchend', this.stop_moving.bind(this)); this.moving_w.bind('mousemove', this.moving.bind(this)); @@ -118,8 +192,10 @@ bricks.Popup = class extends bricks.VBox { var cx, cy; cx = e.clientX - this.offsetX; cy = e.clientY - this.offsetY; + console.log(cx, cy, e.clientX, e.clientY, this.offsetX, this.offsetY, '=========='); this.set_style('left', cx + 'px'); this.set_style('top', cy + 'px'); + e.preventDefault(); } stop_moving(e){ // console.log('stop moving ....'); @@ -135,19 +211,11 @@ bricks.Popup = class extends bricks.VBox { } } add_widget(w, index){ - this.old_add_widget(w, index); + this.content_box.add_widget(w, index); if (this.auto_open){ this.open(); - } - } - transform2screen_at(rect, lt){ - var screen_rect = bricks.Body.showRectage(); - var t, l; - t = rect.top + parseInt(lt.y) / 100 * (rect.bottom - rect.top); - l = rect.left + parseInt(lt.x) / 100 * (rect.right - rect.left); - return { - top:t + 'px', - left:l + 'px' + } else { + console.log('auto_open is ', this.auto_open, ' so not auto open it', this.opts, w); } } open(){ @@ -156,40 +224,28 @@ bricks.Popup = class extends bricks.VBox { return; } this.opened = true; - if (this.widget instanceof bricks.JsWidget){ - this.target_w = this.widget; - this.issub = true; - } else { - var w = bricks.getWidgetById(this.widget, bricks.Body); - if (w){ - this.issub = true - this.target_w = w; - } - } - rect = this.target_w.showRectage(); - var lt = archor_at(this.archor); - if (this.issub){ - lt = this.transform2screen_at(rect, lt); - if (typeof(this.width) == 'string' && this.width.endsWith('%')){ - w = parseFloat(rect.width) * parseFloat(this.width) / 100; - this.set_style('width', w + 'px'); - console.log('rect=', rect, 'w=', w); - } - if (typeof(this.height) == 'string' && this.height.endsWith('%')){ - h = parseFloat(rect.height) * parseFloat(this.height) / 100; - this.set_style('height', h + 'px'); - console.log('rect=', rect, 'h=', h); + if (this.no_opened){ + if (this.widget instanceof bricks.JsWidget){ + this.target_w = this.widget; + this.issub = true; + } else { + var w = bricks.getWidgetById(this.widget, bricks.Body); + if (w){ + this.issub = true + this.target_w = w; + } } + this.positify_tl() } - this.set_style('top',lt.top); - this.set_style('left',lt.left); + this.no_opened = false; this.set_style('display', 'block'); if (this.timeout > 0){ - this.auto_task = schedule_once(this.auto_dismiss.bind(this), this.timeout) + this.auto_task = schedule_once(this.dismiss.bind(this), this.timeout) } - if (this.opts.modal){ + if (this.opts.modal && this.opts.widget){ this.target_w.disabled(true); } + this.content_box.disabled(false); } dismiss(){ if (this.opts.modal){ @@ -226,18 +282,24 @@ bricks.PopupWindow = class extends bricks.Popup { } */ constructor(opts){ + opts.moviable = true; + opts.resizable = true; + opts.auto_open = true; + opts.auto_dismiss = false; + opts.auto_destroy = false; super(opts); - this.title_bar = new bricks.HBox({cheight:1, width:'100%'}); + this.title_bar = new bricks.HBox({cheight:1.5, width:'100%'}); this.title_bar.set_css('titlebar') - this.auto_destroy = false; this.moving_w = this.title_bar; - this.old_add_widget = bricks.Layout.prototype.add_widget.bind(this); - this.old_add_widget(this.title_bar); + this.parent_add_widget(this.title_bar); this.build_title_bar(); var filler = new bricks.Filler({}); - this.old_add_widget(filler) - this.content_w = new bricks.VScrollPanel({width:"100%"}); + this.parent_add_widget(filler) + this.content_w = new bricks.Layout({}); + this.content_w.set_css('flexbox'); + this.auto_open = true; filler.add_widget(this.content_w); + console.log(this.auto_open, 'opts=', opts); } async load_content(){ var dic = { @@ -295,10 +357,20 @@ bricks.PopupWindow = class extends bricks.Popup { this.title_w.set_text(txt); } } + parent_add_widget(w, index){ + var ao = this.autho_open; + this.auto_open = false; + super.add_widget(w, index); + this.auto_open = ao; + } add_widget(w, index){ + console.log('auto_open=', this.auto_open); this.content_w.add_widget(w, index); if (this.auto_open){ this.open(); + } else { + this.open(); + console.log('auto_open is false, not auto open'); } } open(){ diff --git a/bricks/tree.js b/bricks/tree.js index 18dee0d..77c3e81 100755 --- a/bricks/tree.js +++ b/bricks/tree.js @@ -316,6 +316,8 @@ bricks.Tree = class extends bricks.VScrollPanel { return; } var w = new bricks.Conform({ + cwidth:16, + cheight:9, title:'Delete node', message:'Please conform delete selected node' }); From 4231628a4a49d1cfb3aae677fd3fcbca6e3cc2f5 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 31 Oct 2024 17:45:15 +0800 Subject: [PATCH 11/84] bugfix --- bricks/datarow.js | 7 +------ bricks/popup.js | 12 ++++++------ 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/bricks/datarow.js b/bricks/datarow.js index d32d14a..8bbd31b 100644 --- a/bricks/datarow.js +++ b/bricks/datarow.js @@ -116,12 +116,7 @@ bricks.DataRow = class extends bricks.HBox { opts.user_data = this.user_data; opts.value = opts.tip = this.user_data[f.name]; } - var cwidth = cwidths[f.name]; - if (cwidth){ - opts.cwidth = cwidth; - } else { - opts.cwidth = 10; - } + opts.cwidth = cwidths[f.name] ||f.cwidth || 10; var f = bricks.get_ViewBuilder(f.uitype); if (!f) f = bricks.get_ViewBuilder('str'); var w = f(opts); diff --git a/bricks/popup.js b/bricks/popup.js index f7bb225..f33b8e2 100644 --- a/bricks/popup.js +++ b/bricks/popup.js @@ -171,7 +171,7 @@ bricks.Popup = class extends bricks.VBox { var rect = this.showRectage(); this.offsetX = e.clientX - rect.left; this.offsetY = e.clientY - rect.top; - console.log(rect, '========', this.offsetX, this.offsetY, e.clientX, e.clientY); + // console.log(rect, '========', this.offsetX, this.offsetY, e.clientX, e.clientY); bricks.Body.bind('mouseup', this.stop_moving.bind(this)); bricks.Body.bind('touchend', this.stop_moving.bind(this)); @@ -192,7 +192,7 @@ bricks.Popup = class extends bricks.VBox { var cx, cy; cx = e.clientX - this.offsetX; cy = e.clientY - this.offsetY; - console.log(cx, cy, e.clientX, e.clientY, this.offsetX, this.offsetY, '=========='); + // console.log(cx, cy, e.clientX, e.clientY, this.offsetX, this.offsetY, '=========='); this.set_style('left', cx + 'px'); this.set_style('top', cy + 'px'); e.preventDefault(); @@ -215,7 +215,7 @@ bricks.Popup = class extends bricks.VBox { if (this.auto_open){ this.open(); } else { - console.log('auto_open is ', this.auto_open, ' so not auto open it', this.opts, w); + // console.log('auto_open is ', this.auto_open, ' so not auto open it', this.opts, w); } } open(){ @@ -299,7 +299,7 @@ bricks.PopupWindow = class extends bricks.Popup { this.content_w.set_css('flexbox'); this.auto_open = true; filler.add_widget(this.content_w); - console.log(this.auto_open, 'opts=', opts); + // console.log(this.auto_open, 'opts=', opts); } async load_content(){ var dic = { @@ -364,13 +364,13 @@ bricks.PopupWindow = class extends bricks.Popup { this.auto_open = ao; } add_widget(w, index){ - console.log('auto_open=', this.auto_open); + // console.log('auto_open=', this.auto_open); this.content_w.add_widget(w, index); if (this.auto_open){ this.open(); } else { this.open(); - console.log('auto_open is false, not auto open'); + // console.log('auto_open is false, not auto open'); } } open(){ From 24cf16147d36ad0c0fee39fd87c5429112978d6d Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 31 Oct 2024 18:34:08 +0800 Subject: [PATCH 12/84] bugfix --- bricks/css/bricks.css | 14 ++++++++++---- bricks/tabular.js | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/bricks/css/bricks.css b/bricks/css/bricks.css index 74e4fbc..9d8a10f 100755 --- a/bricks/css/bricks.css +++ b/bricks/css/bricks.css @@ -356,16 +356,22 @@ body { overflow: auto; } .tabular-header-row { - background-color: #dddddd; - position: sticky; + display: flex; top: 0; + position: sticky; + background-color: #dddddd; + min-width: 0; + min-width: fit-content; flex-wrap: nowrap; flex-shrink: 0; } .tabular-row { + display: flex; + margin-bottom: 5px; + min-width: 0; + min-width: fit-content; flex-wrap: nowrap; flex-shrink: 0; - margin-bottom: 5px; } .tabular-row:nth-child(odd) { background-color: #5dfdfd; @@ -374,7 +380,7 @@ body { background-color: #f9f9f9; } .tabular-row-selected { - background-color: #ef0000; + color: #ef0000; } .tabular-row-content { padding: 2; diff --git a/bricks/tabular.js b/bricks/tabular.js index de8df4b..0c812da 100644 --- a/bricks/tabular.js +++ b/bricks/tabular.js @@ -26,7 +26,6 @@ bricks.Tabular = class extends bricks.DataViewer { return r; } var row = new bricks.VBox({ - css:'tabular-row' }); row.add_widget(r); var content = new bricks.VBox({ @@ -97,6 +96,7 @@ bricks.Tabular = class extends bricks.DataViewer { header = false; } var dr = new bricks.DataRow(options); + dr.set_css('tabular-row'); dr.render(header); dr.event_names.forEach(e => { dr.toolbar_w.bind(e, this.record_event_handle.bind(this, e, record, dr)); From fc76e82be2bb9b02b343162cc7d04432fbb9eac3 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Fri, 1 Nov 2024 16:23:16 +0800 Subject: [PATCH 13/84] bugfix --- bricks/header.tmpl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bricks/header.tmpl b/bricks/header.tmpl index 301a6cf..a2b942f 100644 --- a/bricks/header.tmpl +++ b/bricks/header.tmpl @@ -7,6 +7,7 @@ + + diff --git a/bricks/input.js b/bricks/input.js index 8e959fd..1dd4fe9 100644 --- a/bricks/input.js +++ b/bricks/input.js @@ -393,6 +393,8 @@ bricks.UiImage =class extends bricks.VBox { if (this.imgw){ this.remove_widget(this.imgw); } + this.value = e.target.result; + console.log('this.value=', this.value); this.imgw = new bricks.Image({ url:e.target.result, width:'100%' @@ -404,7 +406,8 @@ bricks.UiImage =class extends bricks.VBox { getValue(){ var ret = {} if (this.imgw){ - ret[this.name] = this.imgw.base64() + // ret[this.name] = this.imgw.base64() + ret[this.name] = this.value; } else { ret[this.name] = null; } diff --git a/bricks/jsoncall.js b/bricks/jsoncall.js index d491553..21fc3ac 100644 --- a/bricks/jsoncall.js +++ b/bricks/jsoncall.js @@ -44,9 +44,9 @@ bricks.HttpText = class { }; bricks.extend(this.headers, headers); var width=0, height=0; - var is_mobile = 0 + var is_mobile = '0' if (bricks.is_mobile()){ - is_mobile = 1; + is_mobile = '1'; } if (bricks.app) { width = bricks.app.screenWidth(); @@ -187,6 +187,11 @@ bricks.HttpText = class { } } +bricks.HttpBin = class extends bricks.HttpText { + async get_result_data(resp){ + return await resp.blob() + } +} bricks.HttpResponse = class extends bricks.HttpText { async get_result_data(resp){ return resp; diff --git a/bricks/llm.js b/bricks/llm.js index 43aa7cf..a805165 100644 --- a/bricks/llm.js +++ b/bricks/llm.js @@ -185,23 +185,30 @@ bricks.LlmModel = class extends bricks.JsWidget { this.llmio.o_w.add_widget(mout); var fmt = this.opts.user_message_format || { role:'user', content:'${prompt}'}; var umsg = bricks.apply_data(fmt, data); - var d = data; + var d = {}; this.messages.push(umsg); - d = {}; - d.messages = this.messages; d.model = this.opts.model; d.modelinstanceid = this.opts.modelinstanceid; d.modeltypeid = this.opts.modeltypeid; - console.log('upload data=', d, this.options); if (this.response_mode == 'stream' || this.response_mode == 'async') { + d = {}; + d.messages = this.messages; + d.model = this.opts.model; + d.modelinstanceid = this.opts.modelinstanceid; + d.modeltypeid = this.opts.modeltypeid; var hr = new bricks.HttpResponseStream(); var resp = await hr.post(this.opts.url, {params:d}); await hr.handle_chunk(resp, this.chunk_response.bind(this, mout)); this.chunk_ended(); } else { + d = data + d.model = this.opts.model; + d.modelinstanceid = this.opts.modelinstanceid; + d.modeltypeid = this.opts.modeltypeid; var hj = new bricks.HttpJson() var resp = await hj.post(this.opts.url, {params:d}); if (this.response_mode == 'sync'){ + resp.content = bricks.escapeSpecialChars(resp.content) mout.update_data(resp); if (this.messages){ var msg = this.llm_msg_format(); From 91e24f567f12ec46421658b8f48ed70387f3b745 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 5 Dec 2024 18:20:28 +0800 Subject: [PATCH 35/84] bugfix --- bricks/audio.js | 4 +++- bricks/bricks.js | 25 ++++++++++++++++++++++--- bricks/build.sh | 2 +- bricks/form.js | 16 ++++++++++++++-- bricks/header.tmpl | 4 +++- bricks/input.js | 10 +++++++++- bricks/jsoncall.js | 16 ++++++++-------- bricks/pdfviewer.js | 2 +- 8 files changed, 61 insertions(+), 18 deletions(-) diff --git a/bricks/audio.js b/bricks/audio.js index 2f06e57..a93774c 100644 --- a/bricks/audio.js +++ b/bricks/audio.js @@ -105,7 +105,9 @@ bricks.AudioRecorder = class extends bricks.HBox { this.add_widget(this.rec_btn); this.add_widget(this.rec_time); this.recordData = null; - this.bind('record_ended', this.upload.bind(this)); + if (this.upload_url){ + this.bind('record_ended', this.upload.bind(this)); + } } rec_btn_pressed(){ bricks.debug(this.rec_btn.url, ':url:', this.start_icon, this.stop_icon); diff --git a/bricks/bricks.js b/bricks/bricks.js index 7751e74..798dc0d 100644 --- a/bricks/bricks.js +++ b/bricks/bricks.js @@ -214,7 +214,7 @@ bricks.buildEventHandler = async function(w, desc, event){ return null } var rtdata = {}; - + desc.event_params = event.params || {} ; if (desc.rtdata) rtdata = desc.rtdata; else if (desc.datawidget){ var data_desc = { @@ -225,9 +225,15 @@ bricks.buildEventHandler = async function(w, desc, event){ } rtdata = await bricks.getRealtimeData(w, data_desc); } + /* if (typeof event.params == typeof {}){ rtdata = bricks.extend(rtdata, event.params); + } else if (event.params instanceof FormData){ + for ( const [key, value] of Object.entries(rtdata)){ + params.append(key, value); + } } + */ switch (desc.actiontype){ case 'urlwidget': return bricks.buildUrlwidgetHandler(w, target, rtdata, desc); @@ -312,8 +318,21 @@ bricks.buildUrlwidgetHandler = function(w, target, rtdata, desc){ } var options = objcopy(desc.options||{}); var params = options.params || {}; - options = bricks.apply_data(options, rtdata); - options.params = bricks.extend(params, rtdata); + if (desc.event_params instanceof FormData){ + var params = desc.event_params; + for ( const [key, value] of Object.entries(rtdata)){ + params.append(key, value); + } + options = bricks.apply_data(options, rtdata); + for ( const [key, value] of Object.entries(options.params||{})){ + params.append(key, value); + } + options.params = params; + } else { + rtdata = bricks.extend(rtdata, desc.event_params); + options = bricks.apply_data(options, rtdata); + options.params = bricks.extend(params, rtdata); + } var opts = { "widgettype":"urlwidget", diff --git a/bricks/build.sh b/bricks/build.sh index 81a9310..84bc196 100755 --- a/bricks/build.sh +++ b/bricks/build.sh @@ -8,7 +8,7 @@ SOURCES=" page_data_loader.js factory.js uitypesdef.js utils.js uitype.js \ floaticonbar.js miniform.js wterm.js dynamicaccordion.js \ binstreaming.js streaming_audio.js vadtext.js rtc.js docxviewer.js \ llm_dialog.js llm.js websocket.js datarow.js tabular.js \ - line.js pie.js bar.js gobang.js period.js " + line.js pie.js bar.js gobang.js period.js pdfviewer.js" echo ${SOURCES} cat ${SOURCES} > ../dist/bricks.js # uglifyjs --compress --mangle -- ../dist/bricks.js > ../dist/bricks.min.js diff --git a/bricks/form.js b/bricks/form.js index d245c94..f8782d4 100644 --- a/bricks/form.js +++ b/bricks/form.js @@ -177,6 +177,12 @@ bricks.FormBase = class extends bricks.Layout { } } getValue(){ + if (this.data) { + var ret = this.data; + this.data = null; + return ret; + } + return this.get_formdata(); var data = {}; for (var name in this.name_inputs){ if (! this.name_inputs.hasOwnProperty(name)){ @@ -204,11 +210,12 @@ bricks.FormBase = class extends bricks.Layout { var w = this.name_inputs[name]; var d = w.getValue(); if (w.required && ( d[name] == '' || d[name] === null)){ - bricks.debug('data=', data, 'd=', d); new bricks.Error({title:'Requirement', message:'required field must input"' + w.label + '"'}) w.focus(); return; } + w.set_formdata(data); + /* if (bricks.need_formdata_fields.includes(w.uitype)){ var files = w.get_files(); for (var i=0;i --> - + + + diff --git a/bricks/input.js b/bricks/input.js index 1dd4fe9..ff5fbc0 100644 --- a/bricks/input.js +++ b/bricks/input.js @@ -17,6 +17,9 @@ bricks.UiType =class extends bricks.Layout { } return o; } + set_formdata(formdata){ + formdata.append(this.name, this.resultValue()); + } resultValue(){ return this.value; } @@ -71,7 +74,8 @@ bricks.UiAudioText = class extends bricks.UiType { this.text_w.setValue(''); } getValue(){ - return this.text_w.getValue(); + this.value = this.text_w.getValue(); + return this.value; } setValue(v){ this.text_w.setValue(v); @@ -265,6 +269,7 @@ bricks.UiFloat =class extends bricks.UiInt { this.dom_element.step = step; } resultValue(){ + super.resultValue(); return parseFloat(this.value); } setValue(v){ @@ -403,6 +408,9 @@ bricks.UiImage =class extends bricks.VBox { }; reader.readAsDataURL(file); } + set_formdata(formdata){ + formdata.append(this.name, this.value); + } getValue(){ var ret = {} if (this.imgw){ diff --git a/bricks/jsoncall.js b/bricks/jsoncall.js index 21fc3ac..ac27bc3 100644 --- a/bricks/jsoncall.js +++ b/bricks/jsoncall.js @@ -77,8 +77,6 @@ bricks.HttpText = class { return await resp.text(); } add_own_params(params){ - if (! params) - params = {}; var session = bricks.app.get_session(); if (params instanceof FormData){ for ( const [key, value] of Object.entries(this.params)){ @@ -89,6 +87,8 @@ bricks.HttpText = class { } return params; } + if (! params) + params = {}; var p = bricks.extend({}, this.params); p = bricks.extend(p, params); if (session){ @@ -109,13 +109,13 @@ bricks.HttpText = class { var _params = { method:method } - // _params.headers = headers; - if (method == 'GET' || method == 'HEAD') { - let pstr = url_params(data); - url = url + '?' + pstr; + if (data instanceof FormData){ + method = 'POST'; + _params.body = data; } else { - if (data instanceof FormData){ - _params.body = data; + if (method == 'GET' || method == 'HEAD') { + let pstr = url_params(data); + url = url + '?' + pstr; } else { _params.body = JSON.stringify(data); } diff --git a/bricks/pdfviewer.js b/bricks/pdfviewer.js index b7b80d0..d4268c1 100644 --- a/bricks/pdfviewer.js +++ b/bricks/pdfviewer.js @@ -15,7 +15,7 @@ bricks.PDFviewer = class extends bricks.VBox { this.curpage = null; this.pdf = null; bricks.app.bind('keydown', this.key_action.bind(this)); - schedule_once(this.renderPage(1), 0.2); + schedule_once(this.renderPage(1), 1); } key_action(e){ if (!this.curpage) return; From 3caea6bc6edaa0cb404de010899379046cce8c04 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Fri, 6 Dec 2024 11:57:27 +0800 Subject: [PATCH 36/84] bugfix --- bricks/input.js | 5 +++-- bricks/llm.js | 47 ++++++++++++++++++++++++++++++++++------------- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/bricks/input.js b/bricks/input.js index ff5fbc0..05b00f7 100644 --- a/bricks/input.js +++ b/bricks/input.js @@ -73,11 +73,12 @@ bricks.UiAudioText = class extends bricks.UiType { clear_text(){ this.text_w.setValue(''); } - getValue(){ - this.value = this.text_w.getValue(); + resultValue(){ + this.value = this.text_w.resultValue(); return this.value; } setValue(v){ + this.value = v; this.text_w.setValue(v); } set_result_text(event){ diff --git a/bricks/llm.js b/bricks/llm.js index a805165..edbd75d 100644 --- a/bricks/llm.js +++ b/bricks/llm.js @@ -1,5 +1,17 @@ bricks = window.bricks || {} +var inputdata2dic = function(data){ + if (! data instanceof FormData) return data; + var d = {} + for (let k of data.keys()){ + var x = data.get(k); + x = x instanceof File? x:x.toString(); + y = Object.prototype.toString.call(x) + d[k] = x; + console.log('x=', x, 'k=', k, 'x type=', y); + } + return d; +} bricks.LlmMsgAudio = class extends bricks.UpStreaming { constructor(opts){ super(opts); @@ -171,6 +183,19 @@ bricks.LlmModel = class extends bricks.JsWidget { } show_setup_panel(event){ + } + inputdata2uploaddata(data){ + var d = data; + if (data instanceof FormData){ + d.append('model', this.opts.model) + d.append('modelinstanceid', this.opts.modelinstanceid) + d.append('modeltypeid', this.opts.modeltypeid) + } else { + d.model = this.opts.model; + d.modelinstanceid = this.opts.modelinstanceid; + d.modeltypeid = this.opts.modeltypeid; + } + return d; } async model_inputed(data){ if (!opts.use_session){ @@ -184,27 +209,20 @@ bricks.LlmModel = class extends bricks.JsWidget { output_view:this.opts.output_view}); this.llmio.o_w.add_widget(mout); var fmt = this.opts.user_message_format || { role:'user', content:'${prompt}'}; - var umsg = bricks.apply_data(fmt, data); + var umsg = bricks.apply_data(fmt, inputdata2dic(data)); var d = {}; this.messages.push(umsg); d.model = this.opts.model; d.modelinstanceid = this.opts.modelinstanceid; d.modeltypeid = this.opts.modeltypeid; if (this.response_mode == 'stream' || this.response_mode == 'async') { - d = {}; - d.messages = this.messages; - d.model = this.opts.model; - d.modelinstanceid = this.opts.modelinstanceid; - d.modeltypeid = this.opts.modeltypeid; + var d = this.inputdata2uploaddata(data); var hr = new bricks.HttpResponseStream(); var resp = await hr.post(this.opts.url, {params:d}); await hr.handle_chunk(resp, this.chunk_response.bind(this, mout)); this.chunk_ended(); } else { - d = data - d.model = this.opts.model; - d.modelinstanceid = this.opts.modelinstanceid; - d.modeltypeid = this.opts.modeltypeid; + var d = this.inputdata2uploaddata(data); var hj = new bricks.HttpJson() var resp = await hj.post(this.opts.url, {params:d}); if (this.response_mode == 'sync'){ @@ -302,8 +320,6 @@ bricks.LlmIO = class extends bricks.VBox { } async handle_input(event){ var params = event.params; - if (params.prompt) - params.prompt = bricks.escapeSpecialChars(params.prompt); await this.show_input(params); for(var i=0;i Date: Fri, 6 Dec 2024 17:23:28 +0800 Subject: [PATCH 37/84] bugfix --- bricks/bricks.js | 1 + bricks/jsoncall.js | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/bricks/bricks.js b/bricks/bricks.js index 798dc0d..5f2b6a6 100644 --- a/bricks/bricks.js +++ b/bricks/bricks.js @@ -328,6 +328,7 @@ bricks.buildUrlwidgetHandler = function(w, target, rtdata, desc){ params.append(key, value); } options.params = params; + options.method = "POST"; } else { rtdata = bricks.extend(rtdata, desc.event_params); options = bricks.apply_data(options, rtdata); diff --git a/bricks/jsoncall.js b/bricks/jsoncall.js index ac27bc3..f5f8155 100644 --- a/bricks/jsoncall.js +++ b/bricks/jsoncall.js @@ -187,11 +187,18 @@ bricks.HttpText = class { } } -bricks.HttpBin = class extends bricks.HttpText { +bricks.HttpArrayBuffer = class extends bricks.HttpText { async get_result_data(resp){ - return await resp.blob() + return await resp.arrayBuffer(); } } + +bricks.HttpBin = class extends bricks.HttpText { + async get_result_data(resp){ + return await resp.blob(); + } +} + bricks.HttpResponse = class extends bricks.HttpText { async get_result_data(resp){ return resp; From b7edc34bddfb88172f906dfc143c2e5a1dfaff30 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Fri, 6 Dec 2024 18:41:25 +0800 Subject: [PATCH 38/84] bugfix --- bricks/build.sh | 2 +- bricks/pdfviewer.js | 68 --------------------------------------------- 2 files changed, 1 insertion(+), 69 deletions(-) delete mode 100644 bricks/pdfviewer.js diff --git a/bricks/build.sh b/bricks/build.sh index 84bc196..81a9310 100755 --- a/bricks/build.sh +++ b/bricks/build.sh @@ -8,7 +8,7 @@ SOURCES=" page_data_loader.js factory.js uitypesdef.js utils.js uitype.js \ floaticonbar.js miniform.js wterm.js dynamicaccordion.js \ binstreaming.js streaming_audio.js vadtext.js rtc.js docxviewer.js \ llm_dialog.js llm.js websocket.js datarow.js tabular.js \ - line.js pie.js bar.js gobang.js period.js pdfviewer.js" + line.js pie.js bar.js gobang.js period.js " echo ${SOURCES} cat ${SOURCES} > ../dist/bricks.js # uglifyjs --compress --mangle -- ../dist/bricks.js > ../dist/bricks.min.js diff --git a/bricks/pdfviewer.js b/bricks/pdfviewer.js deleted file mode 100644 index d4268c1..0000000 --- a/bricks/pdfviewer.js +++ /dev/null @@ -1,68 +0,0 @@ -/* -https://mozilla.github.io/pdf.js download pdf from here -or add follow line to html file body tag - -*/ - -var bricks = window.bricks || {} - -bricks.PDFviewer = class extends bricks.VBox { - /* - url: - */ - constructor(opts){ - super(opts); - this.curpage = null; - this.pdf = null; - bricks.app.bind('keydown', this.key_action.bind(this)); - schedule_once(this.renderPage(1), 1); - } - key_action(e){ - if (!this.curpage) return; - switch(e.key){ - case 'Enter': - case ' ': - case 'ArrowDown': - this.renderPage(this.curpage+1); - break; - case 'ArrowUp': - this.renderPage(this.curpage-1); - break; - } - } - async renderPage(pn){ - if (pn < 1) return; - this.curpage = pn; - if (!this.pdf) { - pdfjsLib.getDocument(this.url).promise.then(function(pdf){ - this.pdf = pdf; - pdf.getPage(pn).promise.then(function(page){ - this._render_page(page); - }); - }); - return; - } - this.pdf.getPage(pn).promise.then(function(page){ - this._render_page(page); - }); - } - _render_page(page){ - var scale = 1.5; - var viewport = page.getViewport({scale: scale}); - var canvasElement = document.createElement('canvas'); - var context = canvasElement.getContext('2d'); - - canvasElement.height = viewport.height; - canvasElement.width = viewport.width; - - var renderContext = { - canvasContext: context, - viewport: viewport - }; - page.render(renderContext); - this.dom_element.innerHTML = ''; - this.dom_element.appendChild(canvasElement); - } -} - -bricks.Factory.register('PDFviewer', bricks.PDFviewer); From 7fca12127fe7f0e87f636ecc21273f8dcdf7b683 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Fri, 6 Dec 2024 23:46:51 +0800 Subject: [PATCH 39/84] bugfix --- bricks/bricks.js | 9 +++++++++ bricks/llm.js | 12 ------------ bricks/utils.js | 12 ++++++++++++ 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/bricks/bricks.js b/bricks/bricks.js index 5f2b6a6..54fa022 100644 --- a/bricks/bricks.js +++ b/bricks/bricks.js @@ -300,6 +300,7 @@ var _buildWidget = async function(from_widget, target, mode, options){ } bricks.buildUrlwidgetHandler = function(w, target, rtdata, desc){ + /* var f = async function(target, mode, options){ bricks.debug('target=', target, 'mode=', mode, 'options=', options); var w = await (bricks.widgetBuild(options, w)); @@ -316,6 +317,7 @@ bricks.buildUrlwidgetHandler = function(w, target, rtdata, desc){ target.add_widget(w); } } + */ var options = objcopy(desc.options||{}); var params = options.params || {}; if (desc.event_params instanceof FormData){ @@ -342,6 +344,7 @@ bricks.buildUrlwidgetHandler = function(w, target, rtdata, desc){ return _buildWidget.bind(w, target, target, desc.mode || 'replace', opts); } bricks.buildBricksHandler = function(w, target, rtdata, desc){ + /* var f = async function(target, mode, options){ bricks.debug('target=', target, 'mode=', mode, 'options=', options); var w = await (bricks.widgetBuild(options, wa)); @@ -354,7 +357,9 @@ bricks.buildBricksHandler = function(w, target, rtdata, desc){ } target.add_widget(w); } + */ var options = objcopy(desc.options||{}); + rtdata = bricks.extend(rtdata, inputdata2dic(desc.event_params)); options = bricks.apply_data(options, rtdata); return _buildWidget.bind(w, target, target, desc.mode || 'replace', options); } @@ -371,6 +376,7 @@ bricks.buildRegisterFunctionHandler = function(w, target, rtdata, desc){ if (rtdata){ bricks.extend(params, rtdata); } + bricks.extend(params, inputdata2dic(desc.event_params)); params = bricks.apply_data(params, rtdata); return f.bind(target, params); } @@ -383,6 +389,7 @@ bricks.buildMethodHandler = function(w, target, rtdata, desc){ var params = {}; bricks.extend(params, desc.params) bricks.extend(params, rtdata); + bricks.extend(params, inputdata2dic(desc.event_params)); params = bricks.apply_data(params, rtdata); return f.bind(target, params); } @@ -390,6 +397,7 @@ bricks.buildScriptHandler = function(w, target, rtdata, desc){ var params = {}; bricks.extend(params, desc.params) bricks.extend(params, rtdata); + bricks.extend(params, inputdata2dic(desc.event_params)); params = bricks.apply_data(params, rtdata); var AsyncFunction = Object.getPrototypeOf(async function(){}).constructor; var f = new AsyncFunction('params', 'event', desc.script); @@ -403,6 +411,7 @@ bricks.buildDispatchEventHandler = function(w, target, rtdata, desc){ var params = {}; bricks.extend(params, desc.params) bricks.extend(params, rtdata); + bricks.extend(params, inputdata2dic(desc.event_params)); params = bricks.apply_data(params, rtdata); return f.bind(target, desc.dispatch_event, params); } diff --git a/bricks/llm.js b/bricks/llm.js index edbd75d..3d1864b 100644 --- a/bricks/llm.js +++ b/bricks/llm.js @@ -1,17 +1,5 @@ bricks = window.bricks || {} -var inputdata2dic = function(data){ - if (! data instanceof FormData) return data; - var d = {} - for (let k of data.keys()){ - var x = data.get(k); - x = x instanceof File? x:x.toString(); - y = Object.prototype.toString.call(x) - d[k] = x; - console.log('x=', x, 'k=', k, 'x type=', y); - } - return d; -} bricks.LlmMsgAudio = class extends bricks.UpStreaming { constructor(opts){ super(opts); diff --git a/bricks/utils.js b/bricks/utils.js index d11481c..283a235 100644 --- a/bricks/utils.js +++ b/bricks/utils.js @@ -1,5 +1,17 @@ var bricks = window.bricks || {}; bricks.bug = false; +var inputdata2dic = function(data){ + try { + var d = {} + for (let k of data.keys()){ + var x = data.get(k); + d[k] = x; + } + return d; + } catch (e){ + return data; + } +} bricks.delete_null_values = function(obj) { for (let key in obj) { if (obj[key] === null) { From b479461741122b00b8ed5b8988fbc0d90b286836 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Wed, 11 Dec 2024 10:36:07 +0800 Subject: [PATCH 40/84] bugfix --- bricks/cols.js | 8 +- bricks/css/bricks.css | 4 + bricks/dynamiccolumn.js | 1 + bricks/llm.js | 170 +++++++++++++++++++++++++++++++++------- bricks/popup.js | 101 ++++++++++++------------ bricks/utils.js | 3 + 6 files changed, 205 insertions(+), 82 deletions(-) diff --git a/bricks/cols.js b/bricks/cols.js index a7c3544..e9bd64f 100644 --- a/bricks/cols.js +++ b/bricks/cols.js @@ -55,6 +55,7 @@ bricks.Cols = class extends bricks.VBox { } async handle_click(rw, event){ + event.stopPropagation(); var orev = null; if (this.select_record){ orev = this.select_record; @@ -64,6 +65,8 @@ bricks.Cols = class extends bricks.VBox { } this.select_record = rw; this.select_record.set_css('selected_record'); + console.log('record data=', rw.user_data); + this.dispatch('record_click', rw.user_data); } async dataHandle(d){ var data = d.rows; @@ -77,6 +80,7 @@ bricks.Cols = class extends bricks.VBox { for (var i=0;i{ - if (this.textvoice){ - m.textvoice = true; - m.tts_url = this.tts_url; - } - var lm = new bricks.LlmModel(this, m); - this.llmmodels.push(lm); - var tw = lm.render_title(); - this.title_w.add_widget(tw); + this.show_added_model(m); }); - this.build_input(); + } + show_added_model(m){ + if (this.textvoice){ + m.textvoice = true; + m.tts_url = this.tts_url; + } + var lm = new bricks.LlmModel(this, m); + this.llmmodels.push(lm); + var tw = lm.render_title(); + this.title_w.add_widget(tw); + } + async open_search_models(event){ + event.preventDefault(); + event.stopPropagation(); + var rect = this.showRectage(); + var opts = { + title:"select model", + icon:bricks_resource('imgs/search.png'), + auto_destroy:true, + auto_open:true, + auto_dismiss:false, + movable:true, + top:rect.top + 'px', + left:rect.left + 'px', + width: rect.right - rect.left + 'px', + height: rect.bottom - rect.top + 'px' + } + var w = new bricks.PopupWindow(opts); + var sopts = { + data_url:this.list_models_url, + data_params:{ + mii:this.models[0].modelinstanceid, + mti:this.models[0].modeltypeid + }, + data_method:'POST', + col_cwidth: 24, + record_view:{ + widgettype:"VBox", + options:{ + cheight:20, + css:"card" + }, + subwidgets:[ + { + widgettype:"Title4", + options:{ + text:"${name}" + } + }, + { + widgettype:"Filler", + options:{ + css:"scroll" + }, + subwidgets:[ + { + widgettype:"VBox", + options:{ + css:"subcard" + }, + subwidgets:[ + { + widgettype:"Text", + options:{ + text:"模型描述:${description}", + wrap:true + } + }, + { + widgettype:"Text", + options:{ + text:"启用日期:${enable_date}" + } + } + ] + } + ] + } + ] + } + }; + var cols = new bricks.Cols(sopts); + cols.bind('record_click', this.add_new_model.bind(this)); + cols.bind('record_click', w.dismiss.bind(w)); + w.add_widget(cols); + w.open(); + } + async add_new_model(event){ + event.preventDefault(); + event.stopPropagation(); + this.models.push(event.params); + this.show_added_model(event.params); + } + async open_input_widget(event){ + event.preventDefault(); + event.stopPropagation(); + var rect = this.showRectage(); + var opts = { + title:"input data", + icon:bricks_resource('imgs/input.png'), + auto_destroy:true, + auto_open:true, + auto_dismiss:false, + movable:true, + top:rect.top + 'px', + left:rect.left + 'px', + width: rect.right - rect.left + 'px', + height: rect.bottom - rect.top + 'px' + } + var w = new bricks.PopupWindow(opts); + var fopts = { + fields:this.input_fields + } + var fw = new bricks.Form(fopts); + fw.bind('submit', this.handle_input.bind(this)); + fw.bind('submit', w.destroy.bind(w)); + w.add_widget(fw); + w.open(); } async handle_input(event){ var params = event.params; @@ -320,9 +445,6 @@ bricks.LlmIO = class extends bricks.VBox { async show_input(params){ var box = new bricks.HBox({width:'100%'}); var data = inputdata2dic(params); - if (data.prompt){ - data.prompt = bricks.escapeSpecialChars(data.prompt); - } console.log('data=', data, 'input_view=', this.input_view); var w = await bricks.widgetBuild(this.input_view, this.o_w, data); w.set_css(this.msg_css||'user_msg'); @@ -333,14 +455,6 @@ bricks.LlmIO = class extends bricks.VBox { box.add_widget(img); this.o_w.add_widget(box); } - build_input(){ - var fopts = { - fields:this.input_fields - }; - var fw = new bricks.InlineForm(fopts); - fw.bind('submit', this.handle_input.bind(this)); - this.i_w.add_widget(fw); - } } bricks.Factory.register('LlmIO', bricks.LlmIO); diff --git a/bricks/popup.js b/bricks/popup.js index ad69950..c1a28ac 100644 --- a/bricks/popup.js +++ b/bricks/popup.js @@ -10,8 +10,10 @@ bricks.Popup = class extends bricks.VBox { auto_dismiss:boolean auto_destroy:boolean movable:boolean + dismiss_event: resizable:boolean modal:boolean + content:{} */ constructor(opts){ super(opts); @@ -21,11 +23,10 @@ bricks.Popup = class extends bricks.VBox { this.opened = false; this.set_css('popup'); this.bring_to_top(); - this.moving_w = this; - this.content_box = new bricks.VBox({width:'100%', height:'100%'}); - this.content_box.set_style('display', 'flex'); - this.content_box.set_style('overflow', 'auto'); + this.content_box = new bricks.VBox({height:'100%',width:'100%'}); super.add_widget(this.content_box); + this.content_w = this.content_box; + this.moving_w = this; if (this.auto_dismiss){ bricks.Body.bind('click', this.click_outside.bind(this)); } @@ -41,6 +42,22 @@ bricks.Popup = class extends bricks.VBox { this.set_style('display', 'none'); bricks.Body.add_widget(this); this.bind('click', this.bring_to_top.bind(this)); + if (this.auto_open){ + this.open(); + } + if (this.content){ + this.bind('opened', this.load_content.bind(this)) + } + } + async load_content(){ + var w = bricks.widgetBuild(this.content, this); + if (w){ + if (this.content.dismiss_event){ + w.bind(this.content.dismiss_event, this.distroy.bind(this)); + } + this.content_w.clear_widgets(); + this.content_w.add_widget(w); + } } bring_to_top(){ if (this == bricks.app.toppopup){ @@ -50,6 +67,7 @@ bricks.Popup = class extends bricks.VBox { bricks.app.toppopup.set_css('toppopup', true); this.zindex = bricks.app.new_zindex(); this.set_style('zIndex', this.zindex); + console.log('this.zindex=', this.zindex, 'app.zindex=', bricks.app.zindex); this.set_css('toppopup'); bricks.app.toppopup = this; } @@ -249,20 +267,6 @@ bricks.Popup = class extends bricks.VBox { this.dismiss(); } } - add_widget(w, index){ - this.content_box.add_widget(w, index); - if (this.auto_open){ - this.open(); - } else { - // console.log('auto_open is ', this.auto_open, ' so not auto open it', this.opts, w); - } - } - remove_widget(w){ - this.content_box.remove_widget(w); - } - clear_widgets(){ - this.content_box.clear_widgets(); - } open(){ var rect, w, h; if (this.opened) { @@ -291,7 +295,7 @@ bricks.Popup = class extends bricks.VBox { if (this.opts.modal && this.opts.widget){ this.target_w.disabled(true); } - this.content_box.disabled(false); + this.bring_to_top(); } dismiss(){ if (! this.opened) return; @@ -319,6 +323,15 @@ bricks.Popup = class extends bricks.VBox { this.parent = null; } } + add_widget(w, i){ + return this.content_box.add_widget(w, i); + } + remove_widget(w){ + return this.content_box.remove_widget(w); + } + clear_widgets(){ + return this.content_box.clear_widgets(); + } } bricks.PopupWindow = class extends bricks.Popup { @@ -333,33 +346,24 @@ bricks.PopupWindow = class extends bricks.Popup { constructor(opts){ opts.moviable = true; opts.resizable = true; - opts.auto_open = true; + var ao = opts.auto_open; + opts.auto_open = false opts.auto_dismiss = false; opts.auto_destroy = false; super(opts); - this.title_bar = new bricks.HBox({cheight:1.5, width:'100%'}); - this.title_bar.set_css('titlebar') + this.auto_open = ao; + this.title_bar = new bricks.HBox({css:'titlebar', cheight:2, width:'100%'}); this.moving_w = this.title_bar; - this.parent_add_widget(this.title_bar); + super.add_widget(this.title_bar); this.build_title_bar(); var filler = new bricks.Filler({}); - this.parent_add_widget(filler) + super.add_widget(filler) this.content_w = new bricks.Layout({}); this.content_w.set_css('flexbox'); - this.auto_open = true; filler.add_widget(this.content_w); - // console.log(this.auto_open, 'opts=', opts); - } - async load_content(){ - var dic = { - "widgettype":"urlwidget", - "options":{ - "params":this.params, - "url":this.url - } + if (this.auto_open){ + this.open(); } - var w = bricks.widgetBuild(dic, bricks.Body); - this.add_widget(w); } build_title_bar(){ var icon = new bricks.Icon({ @@ -406,22 +410,6 @@ bricks.PopupWindow = class extends bricks.Popup { this.title_w.set_text(txt); } } - parent_add_widget(w, index){ - var ao = this.autho_open; - this.auto_open = false; - super.add_widget(w, index); - this.auto_open = ao; - } - add_widget(w, index){ - // console.log('auto_open=', this.auto_open); - this.content_w.add_widget(w, index); - if (this.auto_open){ - this.open(); - } else { - this.open(); - // console.log('auto_open is false, not auto open'); - } - } open(){ var f = bricks.app.docks.find(o => { if (o == this){ @@ -439,6 +427,15 @@ bricks.PopupWindow = class extends bricks.Popup { } super.dismiss() } + add_widget(w, i){ + return this.content_w.add_widget(w, i); + } + remove_widget(w){ + return this.content_w.remove_widget(w); + } + clear_widgets(){ + return this.content_w.clear_widgets(); + } } bricks.Dock = class extends bricks.HBox { constructor(opts){ diff --git a/bricks/utils.js b/bricks/utils.js index 283a235..939f4e2 100644 --- a/bricks/utils.js +++ b/bricks/utils.js @@ -5,6 +5,9 @@ var inputdata2dic = function(data){ var d = {} for (let k of data.keys()){ var x = data.get(k); + if (k == 'prompt'){ + x = bricks.escapeSpecialChars(x); + } d[k] = x; } return d; From 3adab2a60e6775236643f77a8b15bf59e4729fca Mon Sep 17 00:00:00 2001 From: yumoqing Date: Wed, 11 Dec 2024 14:46:46 +0800 Subject: [PATCH 41/84] bugfix --- bricks/camera.js | 4 ++ bricks/docxviewer.js | 119 +++++++++++++++++++++++++++++++++++++++++++ bricks/input.js | 19 +++---- bricks/period.js | 99 +++++++++++++++++++++++++++++++++++ 4 files changed, 232 insertions(+), 9 deletions(-) create mode 100644 bricks/docxviewer.js create mode 100644 bricks/period.js diff --git a/bricks/camera.js b/bricks/camera.js index 90c09eb..c4820d1 100644 --- a/bricks/camera.js +++ b/bricks/camera.js @@ -52,6 +52,10 @@ bricks.Camera = class extends bricks.Popup { this.task = schedule_once(this.show_picture.bind(this), this.task_period); } take_picture(){ + if (this.task){ + task.cancel(); + } + this.task = null; var d = this.imgw.base64(); this.dispatch('shot', d); // Create a blob from the canvas data URL diff --git a/bricks/docxviewer.js b/bricks/docxviewer.js new file mode 100644 index 0000000..d990187 --- /dev/null +++ b/bricks/docxviewer.js @@ -0,0 +1,119 @@ +/* need mammoth module + +*/ +var bricks = window.bricks || {}; + +bricks.DOCXviewer = class extends bricks.VBox { + /* + url: + */ + constructor(opts){ + super(opts); + this.bind('on_parent', this.set_url.bind(this)); + // schedule_once(this.set_url.bind(this, this.url), 0.2); + } + async set_url(url){ + var container = this.dom_element + var hab = new bricks.HttpArrayBuffer(); + var ab = await hab.get(this.url); + var result = await mammoth.convertToHtml({ arrayBuffer: ab }); + container.innerHTML = result.value; + } +} + +function extractBodyContent(htmlString) { + // 正则表达式匹配和之间的内容 + const regex = /]*>([\s\S]*?)<\/body>/i; + const matches = htmlString.match(regex); + return matches ? matches[1] : null; // 如果匹配到,返回匹配的内容,否则返回null +} + +bricks.EXCELviewer = class extends bricks.VBox { + constructor(opts){ + opts.height = "100%", + super(opts); + this.sheets_w = new bricks.HBox({cheight:3, width:'100%'}); + this.sheets_w.set_css('scroll'); + this.cur_sheetname = null; + this.container = new bricks.Filler({}); + this.add_widget(this.container); + this.add_widget(this.sheets_w); + this.bind('on_parent', this.set_url.bind(this)); + } + async set_url(url){ + this.sheets_w.clear_widgets(); + var hab = new bricks.HttpArrayBuffer(); + var ab = await hab.get(this.url); + const data = new Uint8Array(ab); + this.workbook = XLSX.read(data, {type: 'array'}); + this.workbook.SheetNames.forEach((sheetname, index) => { + var w = new bricks.Text({text:sheetname, wrap:false}); + w.set_css('clickable'); + w.set_style('padding', '10px'); + w.bind('click', this.show_sheet_by_name.bind(this, sheetname, w)); + this.sheets_w.add_widget(w); + if (index==0){ + this.show_sheet_by_name(this.workbook.SheetNames[0], w); + } + }); + } + show_sheet_by_name(sheetname, tw){ + if (this.cur_sheetname == sheetname) return; + this.sheets_w.children.forEach(c => c.set_css('selected', true)); + tw.set_css('selected'); + const x = new bricks.VScrollPanel({width: '100%', height: '100%'}); + const sheet = this.workbook.Sheets[sheetname]; + // const html = extractBodyContent(XLSX.utils.sheet_to_html(sheet)); + const html = XLSX.utils.sheet_to_html(sheet); + x.dom_element.innerHTML = html; + this.container.clear_widgets(); + this.container.add_widget(x); + this.cur_sheetname = sheetname; + } +} + +bricks.PDFviewer = class extends bricks.VBox { + /* + url: + */ + constructor(opts){ + opts.width = '100%'; + super(opts); + this.bind('on_parent', this.set_url.bind(this)); + } + async set_url(url){ + var container = this.dom_element + var hab = new bricks.HttpArrayBuffer(); + var ab = await hab.get(this.url); + const task = pdfjsLib.getDocument({ data: ab }); + task.promise.then((pdf) => { + this.pdf = pdf; + for (let i = 1; i <= this.pdf.numPages; i++) { + this.pdf.getPage(i).then((page) => { + this.add_page_content(page); + }); + } + }).catch((err) => { + console.log('error'); + }) + } + add_page_content(page){ + const scale = 1.5; + const viewport = page.getViewport({ scale }); + const canvas = document.createElement('canvas'); + const context = canvas.getContext('2d'); + canvas.height = viewport.height; + canvas.width = viewport.width; + page.render({ canvasContext: context, viewport }); + var w = new bricks.JsWidget(); + w.dom_element.appendChild(canvas); + this.add_widget(w); + if (i < this.pdf.numPages){ + w = new bricks.Splitter(); + this.add_widget(w) + } + } +} +bricks.Factory.register('DOCXviewer', bricks.DOCXviewer); +bricks.Factory.register('EXCELviewer', bricks.EXCELviewer); +bricks.Factory.register('PDFviewer', bricks.PDFviewer); diff --git a/bricks/input.js b/bricks/input.js index 05b00f7..2cbf42e 100644 --- a/bricks/input.js +++ b/bricks/input.js @@ -372,16 +372,17 @@ bricks.UiImage =class extends bricks.VBox { "height":"90%", "width":"90%" }); - camera.bind('shot', function(d){ - if (this.imgw){ - this.remove_widget(this.imgw); - } - this.imgw = new bricks.Image({ - url:d, - width:'100%' - }); - this.add_widget(this.imgw); + camera.bind('shot', this.accept_photo.bind(this)); + } + accept_photo(url){ + if (this.imgw){ + this.remove_widget(this.imgw); + } + this.imgw = new bricks.Image({ + url:url, + width:'100%' }); + this.add_widget(this.imgw); } handleFileSelect(event){ const file = event.target.files[0]; diff --git a/bricks/period.js b/bricks/period.js new file mode 100644 index 0000000..3c00802 --- /dev/null +++ b/bricks/period.js @@ -0,0 +1,99 @@ +var bricks = window.bricks || {}; +bricks.str2date = function(sdate){ + let [year, month, day] = sdate.split("-"); + var dateObj = new Date(year, month - 1, day); + return dateObj; +} +bricks.date2str = function(date){ + let year = date.getFullYear(); + let month = String(date.getMonth() + 1).padStart(2, '0'); + let day = String(date.getDate()).padStart(2, '0'); + let formattedDate = `${year}-${month}-${day}`; + return formattedDate; +} +bricks.addMonths = function(dateObj, months){ + var newDate = new Date(dateObj); + newDate.setMonth(newDate.getMonth() + months); + return newDate; +} +bricks.addYears = function(dateObj, years){ + const newDate = new Date(dateObj); + newDate.setYear(newDate.getYear() + years); + return newDate; +} +bricks.addDays = function(dateObj, days){ + var newdate = new Date(dateObj); + newdate.setDate(newdate.getDate() + days); + return newdate; +} + +bricks.PeriodDays = class extends bricks.HBox { + /* + { + start_date: + end_date: + step_type: 'days', 'months', 'years' + step_cnt: + title:'', + splitter:' -- ' + } + event: 'changed'; + */ + constructor(opts){ + opts.splitter = opts.splitter || ' 至 '; + opts.step_cnt = opts.step_cnt || 1; + super(opts); + this.start_w = new bricks.Text({ + text:opts.start_date + }); + this.end_w = new bricks.Text({ + text:opts.end_date + }); + this.start_w.set_css('clickable'); + this.end_w.set_css('clickable'); + this.start_w.bind('click', this.step_back.bind(this)); + this.end_w.bind('click', this.step_forward.bind(this)); + if (this.title){ + this.add_widget(new bricks.Text({otext:this.title, i18n:true})); + } + this.add_widget(this.start_w); + this.add_widget(new bricks.Text({ + otext:this.splitter, + i18n:true + })); + this.add_widget(this.end_w); + } + date_add(strdate, step_cnt, step_type){ + var date = bricks.str2date(strdate); + switch(step_type){ + case 'years': + var nd = bricks.addYears(date, step_cnt); + return bricks.date2str(nd); + break; + case 'months': + var nd = bricks.addMonths(date, step_cnt); + return bricks.date2str(nd); + break; + default: + var nd = bricks.addDays(date, step_cnt); + return bricks.date2str(nd); + break; + } + } + step_back(){ + this.start_date = this.date_add(this.start_date, -this.step_cnt, this.step_type); + this.end_date = this.date_add(this.end_date, -this.step_cnt, this.step_type); + this.start_w.set_text(this.start_date); + this.end_w.set_text(this.end_date); + this.dispatch('changed', {start_date:this.start_date, end_date:this.end_date}); + } + step_forward(){ + this.start_date = this.date_add(this.start_date, this.step_cnt, this.step_type); + this.end_date = this.date_add(this.end_date, this.step_cnt, this.step_type); + this.start_w.set_text(this.start_date); + this.end_w.set_text(this.end_date); + this.dispatch('changed', {start_date:this.start_date, end_date:this.end_date}); + } +} + +bricks.Factory.register('PeriodDays', bricks.PeriodDays); From 4b46f2ff00a68ff6dc83f422ae8f499bff93cf4f Mon Sep 17 00:00:00 2001 From: yumoqing Date: Wed, 11 Dec 2024 18:08:41 +0800 Subject: [PATCH 42/84] bugfix --- bricks/bricks.js | 27 ++++++++++++++++++++++++--- bricks/camera.js | 46 ++++++++++++++++++++++++++++++++++++++++------ bricks/image.js | 2 +- bricks/input.js | 25 ++++++++++++++++++------- 4 files changed, 83 insertions(+), 17 deletions(-) diff --git a/bricks/bricks.js b/bricks/bricks.js index 54fa022..697f1cc 100644 --- a/bricks/bricks.js +++ b/bricks/bricks.js @@ -519,12 +519,33 @@ bricks.App = class extends bricks.Layout { this._Height = this.dom_element.offsetHeight; this.video_stream = null; this.audio_stream = null; + this.video_devices = null + this.vpos = null; document.addEventListener('keydown', this.key_down_action.bind(this)); } - async start_camera() { - if (this.video_stream) return; + async getCameras() { + try { + const devices = await navigator.mediaDevices.enumerateDevices(); + this.video_devices = devices.filter(device => device.kind === 'videoinput'); + } catch (error) { + console.error('获取摄像头数量出错:', error); + } + } + async start_camera(vpos) { + if (typeof(vpos) == 'undefined') vpos = 0; + if (this.video_devices === null){ + await this.getCameras(); + } + if (vpos == this.vpos) return; + this.vpos = vpos; + if (this.video_stream){ + this.video_stream.getTracks().forEach(track => { + track.stop(); + }); + } if (navigator.mediaDevices.getUserMedia) { - this.video_stream = await navigator.mediaDevices.getUserMedia({ video: true }); + var x = { deviceId: this.video_devices[vpos].deviceId }; + this.video_stream = await navigator.mediaDevices.getUserMedia({ video: x }); } else { console.log("Webcam access is not supported in this browser."); } diff --git a/bricks/camera.js b/bricks/camera.js index c4820d1..397c331 100644 --- a/bricks/camera.js +++ b/bricks/camera.js @@ -7,42 +7,73 @@ bricks.Camera = class extends bricks.Popup { */ constructor(opts){ opts.fps = opts.fps || 60; + opts.auto_dismiss = false; super(opts); this.stream = null; this.video = document.createElement('video'); var filler = new bricks.Filler({}); var hbox = new bricks.HBox({ - cheight:2 + cheight:3 }); + this.cur_camera_id = 0; this.add_widget(filler); this.add_widget(hbox); var shot_btn = new bricks.Icon({ url:bricks_resource('imgs/camera.png'), + margin: '10px', + tip:'Take a picture', + rate:2.5 + }); + var switch_btn = new bricks.Icon({ + url:bricks_resource('imgs/switch-camera.png'), + tip:'switch camera', + margin: '10px', rate:1.5 }); var del_btn = new bricks.Icon({ url:bricks_resource('imgs/delete.png'), + tip:'canel it', + margin: '10px', rate:1.5 }) del_btn.bind('click', this.dismiss.bind(this)); shot_btn.bind('click', this.take_picture.bind(this)); + switch_btn.bind('click', this.switch_camera.bind(this, switch_btn)); this.imgw = new bricks.Image({ width:'100%' }); + hbox.add_widget(switch_btn); hbox.add_widget(shot_btn); + hbox.add_widget(new bricks.Filler({})); hbox.add_widget(del_btn); filler.add_widget(this.imgw); this.task_period = 1 / this.fps; - schedule_once(this.startCamera.bind(this), 0.3); + schedule_once(this.startCamera.bind(this), 0.1); } - async startCamera() { - await bricks.app.start_camera(); + async switch_camera(btn, event){ + if (bricks.app.video_devices.length < 2){ + btn.disabled(true); + return; + } + var vpos = bricks.app.vpos; + vpos += 1; + if (vpos >= bricks.app.video_devices.length){ + vpos = 0; + } + this.startCamera(vpos); + } + async startCamera(vpos) { + await bricks.app.start_camera(vpos); this.stream = bricks.app.video_stream; this.video.srcObject = this.stream; this.video.play(); + this.show_cnt = 1; this.task = schedule_once(this.show_picture.bind(this), this.task_period); } show_picture(){ + if (this.task_period == 0){ + return; + } var canvas = document.createElement('canvas'); canvas.height = this.video.videoHeight; canvas.width = this.video.videoWidth; @@ -50,15 +81,18 @@ bricks.Camera = class extends bricks.Popup { context.drawImage(this.video, 0, 0); this.imgw.set_url(canvas.toDataURL('image/jpeg')); this.task = schedule_once(this.show_picture.bind(this), this.task_period); + this.show_cnt += 1; } - take_picture(){ + take_picture(event){ + event.stopPropagation(); if (this.task){ task.cancel(); + this.task = null; } + this.task_period = 0; this.task = null; var d = this.imgw.base64(); this.dispatch('shot', d); - // Create a blob from the canvas data URL } } diff --git a/bricks/image.js b/bricks/image.js index 977a340..0cb21b0 100644 --- a/bricks/image.js +++ b/bricks/image.js @@ -46,7 +46,7 @@ bricks.Image = class extends bricks.JsWidget { // 获取画布数据并转换为 base64 var dataURL = canvas.toDataURL('image/png'); // 可以根据需要修改图像格式 - dataURL = this.removeBase64Header(dataURL); + // dataURL = this.removeBase64Header(dataURL); return dataURL; } set_url(url){ diff --git a/bricks/input.js b/bricks/input.js index 2cbf42e..1baa345 100644 --- a/bricks/input.js +++ b/bricks/input.js @@ -352,7 +352,8 @@ bricks.UiImage =class extends bricks.VBox { this.uitype='image'; this.camera_w = new bricks.Icon({ url:bricks_resource('imgs/camera.png'), - rate:1.5}); + tip:'use cemera to take a picture', + rate:2}); this.add_widget(this.camera_w); this.camera_w.bind('click', this.take_photo.bind(this)); this.bind('drop', this.dropHandle.bind(this)); @@ -365,21 +366,23 @@ bricks.UiImage =class extends bricks.VBox { this.dom_element.appendChild(this.input); this.imgw = null; } - take_photo(){ + take_photo(event){ + event.stopPropagation(); var camera = new bricks.Camera({ "archor":"cc", "auto_open":true, "height":"90%", "width":"90%" }); - camera.bind('shot', this.accept_photo.bind(this)); + camera.bind('shot', this.accept_photo.bind(this, camera)); } - accept_photo(url){ + accept_photo(camera, event){ + camera.dismiss(); if (this.imgw){ this.remove_widget(this.imgw); } this.imgw = new bricks.Image({ - url:url, + url:event.params, width:'100%' }); this.add_widget(this.imgw); @@ -410,8 +413,16 @@ bricks.UiImage =class extends bricks.VBox { }; reader.readAsDataURL(file); } - set_formdata(formdata){ - formdata.append(this.name, this.value); + set_formdata(fd){ + // fd.append(this.name, this.resultValue(), 'test.png'); + fd.append(this.name, this.resultValue()); + } + resultValue(){ + if (this.imgw){ + this.value = this.imgw.base64(); + return this.value; + } + return null; } getValue(){ var ret = {} From 05bea8606909063cea7a1ddac2ad174d21d81598 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Fri, 13 Dec 2024 18:07:16 +0800 Subject: [PATCH 43/84] bugfix --- bricks/bricks.js | 22 +++++++++++++++++++--- bricks/llm.js | 25 +++++++++++++++++++------ 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/bricks/bricks.js b/bricks/bricks.js index 697f1cc..f8d6b58 100644 --- a/bricks/bricks.js +++ b/bricks/bricks.js @@ -48,9 +48,20 @@ params: */ bricks.uuid = function(){ - var d = crypto.randomUUID(); - var lst = d.split('-'); - return lst.join(''); + try{ + var d = crypto.randomUUID(); + var lst = d.split('-'); + return lst.join(''); + } catch(e) { + const vv = '1234567890qwertyuiopasdfghjklzxcvbnm'; + var ret = ''; + for (var i=0;i<30;i++){ + var j = parseInt(Math.random() * vv.length); + ret = ret + vv[j]; + } + console.log('uuid() return', ret); + return ret; + } } bricks.deviceid = function(appname){ @@ -522,6 +533,11 @@ bricks.App = class extends bricks.Layout { this.video_devices = null this.vpos = null; document.addEventListener('keydown', this.key_down_action.bind(this)); + this.screen_orient = window.screen.orientation.type; + window.screen.orientation.addEventListener('change', () => { + this.screen_orient = window.screen.orientation.type; + this.bind('orient_changed', this.screen_orient); + }); } async getCameras() { try { diff --git a/bricks/llm.js b/bricks/llm.js index 9979694..f611a17 100644 --- a/bricks/llm.js +++ b/bricks/llm.js @@ -55,7 +55,11 @@ bricks.ModelOutput = class extends bricks.HBox { opts.width = '100%'; super(opts); this.logid = null; - this.img = new bricks.Icon({rate:2,url:this.icon||bricks_resource('imgs/llm.png')}); + this.img = new bricks.Icon({ + rate:2, + tip:this.opts.model, + url:this.icon||bricks_resource('imgs/llm.png') + }); this.run = new bricks.BaseRunning({target:this}); this.add_widget(this.img); this.add_widget(this.run); @@ -163,7 +167,10 @@ bricks.LlmModel = class extends bricks.JsWidget { render_title(){ var w = new bricks.HBox({}); w.bind('click', this.show_setup_panel.bind(this)) - var img = new bricks.Icon({rate:2,url:this.opts.icon||bricks_resource('imgs/llm.png')}); + var img = new bricks.Icon({ + rate:2, + url:this.opts.icon||bricks_resource('imgs/llm.png') + }); var txt = new bricks.Text({text:this.opts.model}); w.add_widget(img); w.add_widget(txt); @@ -199,7 +206,8 @@ bricks.LlmModel = class extends bricks.JsWidget { var mout = new bricks.ModelOutput({ textvoice:this.textvoice, tts_url:this.tts_url, - icon:this.opts.icon, + icon:this.opts.icon, + model:this.opts.model, estimate_url:this.llmio.estimate_url, output_view:this.opts.output_view}); this.llmio.o_w.add_widget(mout); @@ -286,20 +294,25 @@ bricks.LlmIO = class extends bricks.VBox { constructor(opts){ super(opts); this.llmmodels = []; - this.title_w = new bricks.HBox({cheight:2}); + this.title_w = new bricks.HBox({cheight:3}); + var bottom_box = new bricks.HBox({cheight:3}); this.i_w = new bricks.Icon({ rate:2, url:bricks_resource('imgs/input.png'), + margin:'14px', tip:'input data', css:'clickable' }); this.nm_w = new bricks.Icon({ rate:2, url:bricks_resource('imgs/add.png'), + margin:'14px', tip:'add new model', css:'clickable' }); - this.title_w.add_widget(this.nm_w); + bottom_box.add_widget(this.i_w); + bottom_box.add_widget(this.nm_w); + this.nm_w.bind('click', this.open_search_models.bind(this)); this.i_w.bind('click', this.open_input_widget.bind(this)); this.o_w = new bricks.Filler({overflow:'auto'}); @@ -308,7 +321,7 @@ bricks.LlmIO = class extends bricks.VBox { if (this.models.length < 2 && this.tts_url){ this.textvoice = true; } - this.add_widget(this.i_w); + this.add_widget(bottom_box); this.models.forEach( m =>{ this.show_added_model(m); }); From 8462fdfe8d1e92df6656f3820d1434a477455028 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Fri, 13 Dec 2024 18:07:26 +0800 Subject: [PATCH 44/84] bigfix --- bricks/imgs/input.png | Bin 0 -> 12414 bytes bricks/imgs/search.png | Bin 0 -> 12795 bytes bricks/imgs/switch-camera.png | Bin 0 -> 14527 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 bricks/imgs/input.png create mode 100644 bricks/imgs/search.png create mode 100644 bricks/imgs/switch-camera.png diff --git a/bricks/imgs/input.png b/bricks/imgs/input.png new file mode 100644 index 0000000000000000000000000000000000000000..c60e28c087e5596db39cf61e993ca9fa2088b0da GIT binary patch literal 12414 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 d5%x^xmN%H literal 0 HcmV?d00001 diff --git a/bricks/imgs/search.png b/bricks/imgs/search.png new file mode 100644 index 0000000000000000000000000000000000000000..7a81137ab9e1ca6a0547f23c49c7869469a91fd0 GIT binary patch literal 12795 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 X$1S+8uW8u|fq#2UElmn{(k}fUyRM0E literal 0 HcmV?d00001 From 536adc7887a11f59209117705cdef41b8cd3ad40 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 26 Dec 2024 10:33:39 +0800 Subject: [PATCH 45/84] bugfix --- bricks/audio.js | 67 ++++++++++++-- bricks/binstreaming.js | 22 +++++ bricks/build.sh | 1 + bricks/css/bricks.css | 2 +- bricks/header.tmpl | 20 ++-- bricks/input.js | 44 ++++++++- bricks/jsoncall.js | 11 ++- bricks/utils.js | 204 +++++++++++++++++++++++++++++++---------- 8 files changed, 300 insertions(+), 71 deletions(-) diff --git a/bricks/audio.js b/bricks/audio.js index a93774c..8c088e5 100644 --- a/bricks/audio.js +++ b/bricks/audio.js @@ -26,7 +26,7 @@ bricks.AudioPlayer = class extends bricks.JsWidget { this.audio = this._create('audio'); this.audio.controls = true; if (this.opts.autoplay){ - this.audio.addEventListener('canplay', this.play_audio.bind(this)); + this.audio.addEventListener('canplay', this.play.bind(this)); } this.audio.style.width = "100%" this.dom_element.appendChild(this.audio); @@ -34,6 +34,58 @@ bricks.AudioPlayer = class extends bricks.JsWidget { this.set_source(this.url); } } + + set_stream_urls(response){ + async function* dyn_urls(response) { + const reader = response.body.getReader(); + var value; + var done; + while (true){ + done, value = await reader.read(); + if (value.done){ + console.log('done=', done, 'value=', value); + break; + } + let result = ''; + for (let i = 0; i < value.value.length; i++) { + result += String.fromCharCode(value.value[i]); + } + console.log('audio set url=', result); + yield result; + } + } + this.url_generator = dyn_urls(response); + this.srcList = []; + schedule_once(this.load_queue_url.bind(this), 0.1); + } + async load_queue_url(){ + while (true){ + var d = await this.url_generator.next(); + if (d.done){ + return; + } + this.srcList.push({played:false, url:d.value}); + if (this.srcList.length < 2 ){ + await this.play_srclist(); + this.audio.addEventListener('ended', + this.play_srclist.bind(this)); + } + } + } + async play_srclist(evnet){ + if (event && ! this.audio.ended){ + return; + } + for (var i=0;i - - - + + + - - - + + + +--> diff --git a/bricks/video.js b/bricks/video.js index a8cec15..86dcee1 100644 --- a/bricks/video.js +++ b/bricks/video.js @@ -64,6 +64,7 @@ bricks.Video = class extends bricks.Layout { } } auto_play(){ + return; schedule_once(this._auto_play.bind(this), 0.5); } _auto_play(){ @@ -74,6 +75,10 @@ bricks.Video = class extends bricks.Layout { play(){ console.log('Video:play() called....'); this.player.play(); + // this.player.muted(false); + } + unmuted(){ + this.player.muted(false); } set_fullscreen(){ if (this.fullscreen){ @@ -101,16 +106,10 @@ bricks.Video = class extends bricks.Layout { this.player.on('ended', this.report_ended.bind(this)); this._set_source(); this.player.ready(this.set_fullscreen.bind(this)); - /* + console.log('=======', this.autoplay, '========'); if (this.autoplay){ - this.player.autoplay = true; - this.player.muted = true; - this.player.ready(this.auto_play.bind(this)); - } else { - console.log('autoplay=', this.autoplay, this.auto_play); - // this.player.ready(this.auto_play.bind(this)); + this.auto_play(); } - */ } } report_ended(){ @@ -160,6 +159,7 @@ bricks.Video = class extends bricks.Layout { this.video_body.cur_url = url; this.video_body.cur_vtype = vtype; this._set_source(); + this.play(); } } set_url(url){ @@ -180,54 +180,73 @@ bricks.Iptv = class extends bricks.VBox { schedule_once(this.build_subwidgets.bind(this), 0.1); } async build_subwidgets(){ + console.log('build_subwidgets called'); var jc = new bricks.HttpJson(); - this.user_data = await jc.get(iptv_data_url); - this.video = new bricks.Video({url:this.iptv_data.url}); - this.title_w = new bricks.Text({text:this.iptv_data.title, wrap:false}); + this.deviceid = bricks.deviceid('iptv') + this.user_data = await jc.httpcall(this.iptv_data_url, { + params:{ + deviceid:this.deviceid + }, + method:'GET' + }); + console.log('this.user_data =', this.user_data); + this.video = new bricks.Video({ + autoplay:true, + url:this.user_data.url + }); + this.title_w = new bricks.Text({text:this.user_data.tv_name, wrap:false}); this.add_widget(this.title_w); this.add_widget(this.video); this.video.bind('play_ok', this.report_play_ok.bind(this)); this.video.bind('play_failed', this.report_play_failed.bind(this)); } async report_play_ok(){ + console.log(this.user_data, 'channel playing ...', this.playok_url); if (this.playok_url){ - var desc = { - "widgettye":"urlwidget", - "options":{ - "url":this.playok_url, - "params":this.user_data - } - } - var w = widgetBuild(desc, this); - if (w){ + var ht = new bricks.HttpText(); + var resp = ht.httpcall(this.playok_url,{ + params:{ + deviceid:this.deviceid, + channelid:this.user_data.id + }, + method:"GET" + }); + if (resp != 'Error'){ console.log('report playok ok'); } else { console.log('report playok failed'); } + } else { + console.log('this.playok_url not defined', this.playok_url); } } async report_play_failed(){ + console.log(this.user_data, 'channel play failed ...'); if (this.playfailed_url){ - var desc = { - "widgettye":"urlwidget", - "options":{ - "url":this.playfailed_url, - "params":this.user_data - } - } - var w = widgetBuild(desc, this); - if (w){ + var ht = new bricks.HttpText(); + var resp = ht.httpcall(this.playfailed_url,{ + params:{ + deviceid:this.deviceid, + channelid:this.user_data.id + }, + method:"GET" + }); + if (resp != 'Error'){ console.log('report playfailed ok'); } else { console.log('report playfailed failed'); } + } else { + console.log('this.playfailed_url not defined', this.playfailed_url); } } setValue(data){ this.user_data = data; + this.title_w.set_text(data.tv_name); this.video.set_url(data.url); } } bricks.Factory.register('Video', bricks.Video); +bricks.Factory.register('Iptv', bricks.Iptv); From 643c4f62af8125c0bde571d695edff8816b565ec Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 14 Jan 2025 12:33:18 +0800 Subject: [PATCH 59/84] bugfix --- bricks/dataviewer.js | 2 +- bricks/wterm.js | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/bricks/dataviewer.js b/bricks/dataviewer.js index 4409696..dc7ab50 100644 --- a/bricks/dataviewer.js +++ b/bricks/dataviewer.js @@ -173,7 +173,7 @@ bricks.DataViewer = class extends bricks.VBox { var r = this.select_row; var data = r.user_data; } - this.dispatch(tdesc.name. data); + this.dispatch(tdesc.name, data); } get_edit_fields(){ var fs = this.row_options.fields; diff --git a/bricks/wterm.js b/bricks/wterm.js index 133963d..5408ed1 100644 --- a/bricks/wterm.js +++ b/bricks/wterm.js @@ -6,9 +6,6 @@ bricks.Wterm = class extends bricks.JsWidget { /* { ws_url: - host: - ssh_port: - user: } */ constructor(opts){ From 76dc6d37dc378de6a7091f4a281f977be3c56a59 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 14 Jan 2025 13:42:29 +0800 Subject: [PATCH 60/84] bugfix --- 3parties/xterm-addon-fit.js | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 3parties/xterm-addon-fit.js diff --git a/3parties/xterm-addon-fit.js b/3parties/xterm-addon-fit.js new file mode 100644 index 0000000..709e60a --- /dev/null +++ b/3parties/xterm-addon-fit.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.FitAddon=t():e.FitAddon=t()}(window,function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(){}return e.prototype.activate=function(e){this._terminal=e},e.prototype.dispose=function(){},e.prototype.fit=function(){var e=this.proposeDimensions();if(e&&this._terminal){var t=this._terminal._core;this._terminal.rows===e.rows&&this._terminal.cols===e.cols||(t._renderService.clear(),this._terminal.resize(e.cols,e.rows))}},e.prototype.proposeDimensions=function(){if(this._terminal&&this._terminal.element&&this._terminal.element.parentElement){var e=this._terminal._core,t=window.getComputedStyle(this._terminal.element.parentElement),r=parseInt(t.getPropertyValue("height")),n=Math.max(0,parseInt(t.getPropertyValue("width"))),o=window.getComputedStyle(this._terminal.element),i=r-(parseInt(o.getPropertyValue("padding-top"))+parseInt(o.getPropertyValue("padding-bottom"))),a=n-(parseInt(o.getPropertyValue("padding-right"))+parseInt(o.getPropertyValue("padding-left")))-e.viewport.scrollBarWidth;return{cols:Math.max(2,Math.floor(a/e._renderService.dimensions.actualCellWidth)),rows:Math.max(1,Math.floor(i/e._renderService.dimensions.actualCellHeight))}}},e}();t.FitAddon=n}])}); +//# sourceMappingURL=xterm-addon-fit.js.map \ No newline at end of file From 5df6a98d72b253eb0ea35852a50864dced119aac Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 14 Jan 2025 13:43:24 +0800 Subject: [PATCH 61/84] bugfix --- bricks/header.tmpl | 1 + 1 file changed, 1 insertion(+) diff --git a/bricks/header.tmpl b/bricks/header.tmpl index 48f0c53..afdf312 100644 --- a/bricks/header.tmpl +++ b/bricks/header.tmpl @@ -25,6 +25,7 @@ +