From 96b9f3e305adcc094df85b920131eb25b8211a6d Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 11 Dec 2024 17:45:37 +0100 Subject: [PATCH] updates deps, improved zebra styles --- bun.lockb | Bin 112819 -> 125654 bytes data-grid.scss | 12 ++++++------ dist/data-grid.css | 13 +++++++------ dist/data-grid.css.map | 2 +- dist/data-grid.js | 22 ++++++++++++++++------ dist/data-grid.js.map | 4 ++-- dist/data-grid.min.css | 4 ++-- dist/data-grid.min.css.map | 2 +- dist/data-grid.min.js | 2 +- dist/data-grid.min.js.map | 4 ++-- package.json | 16 ++++++++-------- scss/_core.scss | 23 +++++++++++------------ src/core/base-element.js | 22 ++++++++++++++++++---- src/data-grid.js | 9 ++++++--- 14 files changed, 81 insertions(+), 54 deletions(-) diff --git a/bun.lockb b/bun.lockb index 321328e805bbb71561bb43917c0da8236028f951..26e3ae196b5ef0f7e0e437686e0c685742a84fe2 100644 GIT binary patch delta 44136 zcmeEvc|4Tg`}fQkF)@{FgBB!_NXVKk+6+l0OO}M}OLj_QtEeowLkpD_$(B-)B5TT0 z%34BMQYn?n*7jUy?wQYLzRUA{{hrtJdY-?&=jEE~ysvZ4b*^)r^}gqxTgjJMogF+W zO7c{%brN5)+m{@rlniZqOw3xPI{Hv&?ztwp&p>QfUl4U1PS0rfG-5@4SW%BGvJGXD*~4U&JSD)_!uZe=}&;8^jpBi zfu9DB^h5&}1MUiZ0Rtj*Rt8<*a{#LXpAEc~hd`hJ-yPuO>X%z0s;P_!dGef0)(dG*bB6y{MT80J8)6Jn}8#|evnT9 z_%7hcldgfzPTo!~uFl>b!5*OJ;9LTOY1uz3Vps6b3LkC|@ko%ntM6{esR!w3jMUD@T^jD>>$K3ZeR_4Zx8tYk(u& z%D_>&D2tCQAP~UZs29MIGadj(FuGlls#m^a(YD(jHDRA&llpt{EsHmrq50wvgR`T(1 z4)9A|f@2?--~ewJf`oVwpo+jF9zhmTnDBw^e$`v>`BkC>WLk9m|hWFA-7WVdYVGhIwz_X$Ls7i>SZoI|fyS;;5cY6f5 z_;{g-N+9?+1$eo_jP&w$3WbIeP}eF3x&{#;KXUDaB;FzyAIJoOu7Ee_25_V|)Gxp# zG{DI}mnA>PlKXi0dN6!E0)y6o0QG4#xE8gH)i+Vs0Hc<%yM(NSx9AXXl@=z}<{s4{sL&O%<<*8#wB_FEC3` z%ld&M1DaU)7H~AUE&xaQQh?6~z8^TszXv!<-^#)|z+nzVEoI5)14re4ufp?xSOxx{ z4}xx%pawWna1A)hcp5kwwTD>g{;YI67B&Hn$~%QPAEEP=xHh4;&4hY~TXG_jtGk2f%)%Ym9r?)yE?!$Tc9`#dUYE8)!~~ ze8{mj>+m5F3m7#_U_I{0Kv$m-*8u1hAD7jN?yg~kH;{lb5P{DFJ_Q9)OI-tlgFL(g z37=S4dLu613kp$>xB^GB?+eJ0VKyur1wth6+=Ls*-mZ=TMh#-_I%pEGx0_AcSPVsp zVF2Y(y|9C#C7J--Ed&~*4suk^$=NT!7ciSEfE?K!y%~2PbCZU28*|oN@O5?tNI((+Ew&D3#07i2r$cZ^pV88eFhP8n3*Qx`nLxi`-?f?&; z0H;0BBkUH;+kwv!0&vtLHNcS}d{(&SyMQBu{GEc_6}?=;L)|@`(Z1^u=o*Ha{M{1I zUuliE7%fBoaP0bL4}5@p$Rk8ss0Zqg`euVGhLZy`f!&qtE)3X-yBapFP+w?N(RRGW zzJC5e$kk4}cL%sapM`)Nd1jeC&V7KRArlm!rjGKtLOL2U>m2ZObfjV)m7M*21O2?6 zkQn-X}QDy?b!w_Fk>0J!=gg%Jk)ym8cs7m5uycCc_`#GnIxu15@0*up z_UDvra^5$7sl|M{_SQY}?$colJX&AJJB+K%@K;!+U3W<8-o;qx`={Nme#Kj{$Yq<0 zUf%s66}UqD{niJMx?OWTSLt6`x<6Jx{9DfaOj7Eel(UEK8s+|)lXHK?nHM^iG?S14 zlQ!keiS~14)@|2MTY;_Qm*NePYKc5Hy!a!wi(grjZDv_YjOf9!_&&C|`)Apo(LHwA z*LZI6m7v7dBQD2o@9=nec5EtmI?i%5^%j=Ge^OFX-jDGK6S{Y>-D*KWKvjBD_6^Hl zkxwkm3!jF5>=Ijz`BSY^=g2WG1rc0C6E29{8V&kmr#Kbn{5^7$Nz($as(}#QEUnG$ z#QjSf>}7M^`DNyPR9H6@l(jv8D0!NGIXa}JQ>fA)`~HtTjeRuCxg+-rXqIT>uQ~y zTb6wdz+SqSQ>}X%jeG{ujVcSs&9wvBLrn!eDtZ0FZvKMAlBv1z#9izm@-oCvO?xP; zdeaf%B>tHDgxd0Xy~{`6i>hkK<>lR0zI5qkUB|7i>{5Py=*z6-J)u&A4#P`2k5p%0+8>H( z&ar0HFgCyT>%Z%ek$2`{V8}P#sF2ZiD--pf$8*nLHBLD--l^lR#SZVQ~166t(WJ8Us& zz`ziqC+^0gOgF}|}Gf|vS{Sns9c>tAV?0Kq=P&I#!6 za$DdM8;&VaJeZ+~2IT}GID|!!F`~Ez={XM;A*@FcA2iVEyKr~o%pr#B!? zKxC|1RD=5xLRh4f4&^1p^g+&t)Cz>b2CD%G>LP$&2&Od>MdFbxPd zH(E%8q{xp&i0M&I!f^+Vc~QbB3+XvOHY27-qEInyaXm^fY}BauEN1O@5yC1&btsb% zLoVe)wNuRI;LYGgi2EoY6HHe`htx3#E0@qCNzBD&B=jiTU<*`%GLTDDgOUX3FSq>f z>S3GlAF89Yfg_Z(H#{(VhePkkQ;&G-&SzgnJV; zR0s|M%2_{i62!_Oi#nVoR)cU37A>VgxeN%^Ltt7n0tg={U=2x12%C}CqgV?4rDcf* zsayyvm)0YVL7IpjX@xLWzC@37Kp2|=c3l|LmeC`P2xAd4dK66&0>J=OLlYKgP!0ov z12q~p;u_p7fb_8n2_0^JI4N#nHrWnhsB#KcZLP@*KnnmLv+x^0NENdWD6%ws0MBB2 z!-0m)$m)@@XqfggJ<=N*RxYGR(iX#JfCY#lM9CAwryX-_k;cTZ2r%7994iNwD2{2< z^hh1zSi~|til+ov0~NuP1e?nNA)5)vf82xxFf6c0Asv$50xUvKk92SWRxYPU`2}(` z#feOFY!_nM@?g$FEJ9w7G6r|>wldSIB{V1|i(niBqA;h5x2A5(p zDtg=svd|{%mx>PMCd5o}MKCl8%dm1)J<^_K*o>+kcO~5KFkr4>JaV`XNX&K`0z!j` zfK|iDjgZ6274=BPa@foYJ<3N`P8j&hHAu_kF>Mt+ijzEUEf*Foronv?kQ$~dqeB@& zF;IlB2(;xeO9A0a)kZ+5h1}39n!Ete_<=DG4QvI3781w^XpRDbpackC%bgXl867=R zg94_#Mvp>Tfh!?0ov957ITP&G)F6edz-HFyaTlX3Sj7?@%3FvbFXHtpDdIC2Y=-s3 z9}pS@xWDrNnKG*+LfSm29Uo2AfYt*-a|(t8pcFuO{~;~SfQ%uHfEliaax2+`2Q_L7 zAe08X&oWIi05EE)4y74lCLm_6>l9h=4_dHrhxr0RRl$-crNLbU$QHSkD!2;YV+asv z?2VqfT$NS%KS+H+iW>cQUjNM$eh{K+{uU|=Glj^&zlCsopc+8`{Zm$P3O@*ufBw!| zti=@mV@;^MIINlfs?`Cc|ELw^%>n5@szuWAf6cpy!Vev?`5!D$2D3o;kL8hBApAFG zY5cPR${G}Y5dN#JIscLsSv3aIf2`{>SOo+6U+anjDeB_Cy``+c%=)h$m=DwLpR__< z4j}#4yg4BK7i%fMKnkM}#uHkJm%?2w*64!8<{%(^gGPh3mW5y@FVdh8VHBh32&>r& zP2Rr%nt)M&&=_a#qLh0q#N0(FQ-Dy5VN}CbxdHBp(e;Qa*d4k)<+Cn6ZJ6gJlB^!4 zZK_A{fclXxe1E3ah)F?|h}j;>5f;Lim&bt6X28Qd z4kE)>0D>ixra@T&2u4KIY_t%O_O4|fIB$UvEgZP&Q9xVRh+7BNY&gNe3J?l0wu8^V6laLYzb6{Mj3MhA?;s}&Fs*l6oU{|$6RztU)Ez0R(cfW4QwrFAcO%zjs|yt zLvH{=1)#eCy=A50%c%lX&B_Vm&J_@ZGBXlzO8m+S7fY6A--FFMn4yJNGI^Ja1^@TJjn*ibNKn*z#2$>F5 z+30Yi9SS$$2gp$mgDz;2BG`<^4~6MMdqDUEL8B=R5NaTP;CTWFX~9P)ml>`Fcl~NW z$Ua^Sju)f|Gfdk-k6H*qSc92Y33L8h!QX=v4I%;r3CvK1c>za#3hNwnaugY)pk%cI zR%}k;HOFm(O;H>=8_-{^BV9Mgv{&mjAX4Lg4g&;$t2%iq4fM7_2>(B^OgyR}MD$!+TFd&ve(Ek;H zP&Lex5_KBT4x|Oz1Flt2z?5YvyxZ850A>?+H6R`Am%5G|Z99PgUWp$w z_{MhAT7`X=3e~Y!f;4IrWJYTr4AAm{8kD<$V53D-T2F%_3nqgi)ON@j0SL7ZIvfT=3n1hd7_1r^6mcuODa_eL@d1Rq zgb$5tfbjYZp&Zc~A1Js7RsTY;giu`pp+Szk#0Lu)J{B543d?rX?0;w>$p+U7^@DBN zfKX4v^#Gimg8-q`g*m{f<*YO=&hp#>wqPTsyG)0&4PvM)FSAdl{zh<^RoRK=?JroF zq9BIa3+HiIX(|DsaRaA)n5rbZzx)e5uMP;+&fEhihXFyaq3cdaD`n+m`iVLUXbq&H zj^@EC4;fTj5;AY?7RPCWvI zMgxpRaSee#fWReDbCH)>H7`TAO$3}AaUK7XLMeb0)F!+~#{nUukj<*--ZN7V88|8_ z03->7f+X|v|0!oMt3VYYH%c=R&e1Sh0))5>i^GKjGa!!SvN-&Y9OYZa%7-`=NDT-L zC=K)-Eef!PF$3agE`s-&fs>;GhCoOm%nxSxKjEl6Y--GkVJ0&5Y=Vwp2G}l`32e;C zQH8LgFblxS$_$7jIjoq>fH)VXxLXukvzylfrNDy344fR905hLi6AU6|;N;vOf$_x* zoO~9h=na~^c^N2&2P+5Ss3uP!)O+46>;oJH#F5+&2<7t!Lg7DgWMLpP7tT@nU={|B zcNY@y0!6YC5JwdpU}3}&W_2!;BSq0bsCVOmQ20+A&4*(^$e?5(6p{%F?8x7o0@0H= zWO7t669{_42Ylu;Zxu2%mz4wYxj>~X%*m07cYtPL6)uZCPy?!fP^e;l;vD6wVPQ^= z^49_(gCDTc{~bs98d&Lw6S0M^q6{Q`gb+|85DNc}qx2>qRLf%^6c9&NwF05Gb_1bt z(hG#b|A6B?g)*WF`cNqdh$D9nAOHbzRM8Lu5D-WChk=lMgoWP%M*(qU$VUVqAdd2n zApik!8qh2vYoyFVsZ7EDXU_Eh|7FGUP<|ye0C{2+t0Di6Bag0zbd*J%m5+fUD6YX0 zAdVDiu`uE&s?EZj9Eo&Ta>P+|4GSZVqUaGc6c9&IJr-th?7sg}Y>gYfav8GH5J%Cq zEc~B1%3{RI$H|G9nVTpBjY>0CDkn#x%`EwU;wXzbD<3CEqAe^r;>crLfuq@B$&v$y z^9f6UGFY(^{zn|E*ei-w7=kq_g(2uk9Ft0f z1sSDbtPGqSiB7QOh@*n(EX>J~C<8taKM5ZwA9@ZF1;mk|=YgXNFS2+JD?Nuj-TxNg zimpHglqZ*!5pkqAkHrgEa!!uYi&*l1$5GNX_&|o-VCB1k5j_PN$j4|a`2T$3f*J_~ zNwhg4)1?uDfH<;l35(0H_)_2~Adb>y5rFWYILfz-nG5Gsi2r@!!V~`C*c-k=z^s2#Ejp z#Km+4e)2-j`R|E~<&Xy)966?eg%SVniR-^7F2a9LT>tUp#awC82Ly8tj-vlPae)^| z;E4a8xc=uSu2X?Q2FcOKDC+kjEN*DD>NMQ0i?IvZLB6`$ux#fsYIwUwKlxZl_;Lf8 zp9|N_@z|dBdhEv9qc89NdK`FIPUg>W8;$-PGYg_IjvA(QNxPl#nA~0HS$j!gYbj$z z@=n3}IP%a(ZIiWjdwU=Dwh`Qy6Ry<~b+w)xe&4fD)1Pcr>S=U(^~IIF7toJ;p!;~y zB?&ryumib7q5oj!xauQv5w%0q)WfP_cip+;Ew{wo_nh^+8+%um>*dypPt&IuL!>Re zfo^l^yFOgyR)3lD(6-A>jn}_V7tInPI=BNzM@x1f=UGmLE8g?jFpu(Lz&l*>w`jiN zr<+{u0lQY_oN?~T36(Bwp7slWmg^d*+#WjH%Rrm#ds{Z>`2ayMvxoG?=_2|bRB zE~eQ#JXG@j^?0?k>XRqej(Qk0TV1{#A`!HY>r7ZY&)MFAIqvR@{SN*afw4QIE>KZ=bD7`u2VW%M-|AbhKm# zGTk=H_~O;Wq66ej%8Kh7j>+nBJNMcKS0tDISXgmU@09PC^`Tj#I*+l(J3EIIuRpDD zR0Y}SGFGQhb=G3q~dAaj3pcARBWx1h{cw$^XFc6M3%#tUC(R4i78 z^8eIw&D=X}XquZ~WPD|B&dL_Ce9@xQQC#~ale_x!65?aVxrxV^1`~LZUgpIfOELM# z#h58i!8y?Z*mvuV7N3uWSr;+PCDK=yH@`J6r`;*-xtu4vyz_-5EhT(k;Aba`b&>AqcsM1303Z!RVCF~#;}h&KP7^$<%r;eC{Tv(AhQE`rcA!L z-J~X&FcNzC>g@*mwqv)FKa$$NuDaT0BWE~tRqIv%yb13X8;6fp0}|pRF+LA}_FPWTswpoy!j7Qa;C0s{=~~T^OqA5~n^m`ZHPvwQ6r`sub@?o78!J zdbdLh-|U`NYhZiccZU zhP}}v{k^$G1BA!YeM)0B)(4AG^ zL%vpaezE9g1DbYd%FSVG1x`LJ8*0ks*6h}Fd7gU7Z=ufhpP#2{=6c&2r&llDRkKNe z`@oy#5?+VHb$#)Q-eOr_U#wo-*YZQ(z%add^2X|I+gJu8z33{D9Sq46WvOE>< zJi&Vo?ZOs@(@fv^^pq?g6n0u&|9j-gZPB1UrI27ByQ2F}Q_J35eGylAX7+}OhxuVx z_?YQ=Me`$*l75uc3$Fy!@CToXYChS3-usQeN-$loK6(Qsza=>w}6(0(#^!!O#)87P9}TN%koDDG)U&EW-2GREZ+aM0jUXYZ`Ps*S3zl|v=d8?5CVjtHHsK~G&tHB?vOefx zWQu2Y^DU2^qOpG>kNqO-Nfn*dn7&SEphao7$g3$$V-D*Ub6Tgl)I2lxOi66Wgz2_q zmHw^wl2Rv(^WQs;tJOcVUL$xnZu9VAuF)T2$)Wmnr!M5BO^ujEw%^&~`hE8C{VtpD z-Oa?Z4$w^N8xFsC^!iq%>4bIOoJVoBXD{zNFmp=XMSw9VaQ|uD(|`yr-;C148(T8; zpBg2Pzr4Hdr=01ry@L~HU)U}xuG`LGofM|E&kD0TFGQU63+Tlzh%uQfxKa;}2? z;&Sal&IxJ_#j-0@{R6Couhh2;9OQK2I?V7exalYr`+kUSwt=&|OZIvW?yx+3x5wvW zvPSsm&U-N*H#ZAgX$AJ{Cul_mI-Ra+o82%TF<6tb&NqEI{lw?p621%L?Z*Yys-DUU z6+DO8AEPnSL_6{u>c;tJ461zjAD^BoDV5}JJGyzpdqSFr$?j`Tt2fMcf1M^5n`CmS zqml3Hvfe|#w&)x#cRRQ_dAHT)U-(G_pDFCyG{{Es(7pke&Qp75k|$4p&iQj|fu@kB zTZ!+Ltxju75_LY`JaI*mQCb=DM$EQGF@5D6p-sK?eoafgaMiHhyCORs4+O_x)I=Iq z7*8kCvFUi|{zNKf3CIkSg0(6viHhAypcBn8;t}ZnWGd!*gbvRSTnE$*Ncbq7xD9hU z3aeTQ6{|l=H-oR){|aQK7yK#<4APIh6c;Ll!R`|rKsQeUOV_kHX z*BN^X<#^Mn*y?0D(G`nMhW-aM49E>zl>*ZwgNmi4(1{+{Ye2M4Dsi2#XMsz{ z@?&$duFSojqtthQC(Yt+ySCI30+&p|>bF_kA;N^_rFocQCJn1dqnm}YRRSlsymolP zpAqJ}qDhv=cPf~x@2=$Rygx8}hv}rHci+ysIS& zxI1p1IDFV?%{8nSw3=nniQ(9tbm+G%=#7(f;y&!rN$9t;(2J+Hds6!aUQUO)^? z{xtO4IanG_(}~g8b3oSTVQDx+C&pq4XQ1D*VKD%75X(Lb{RW8p9G!R=vp5I+b^&|? zC;=m$hkm;V%VH*-coch=3H=7h@+_U0hv}+NGneQZi+}X-V$Nvnk@B)Bv&(LqIPHT*d5`_U?O zpM_B0R*yQv4o;?^r#X79svPG5)?xkJBCU5i;c^yXDx(uxzG|l`j2{@A z>5Xo?!0qer7n}(#y3cd%Gt9+XruLK^d$_DfUjGpFk(J* ze=aN{`E=qL>^h*0S7F)~(1}@?Qvq~8p!x#3**VU3#C|@%DM7b?<>~gAoDsT7#vO6< zuNM>5h1Xh0Y~9Hi?4(=SWG+t=8e0*2CV@LkA^d)o+fLWn*RLyIckGt<oUF2&zcT$4a^swFhwuCf^B)ME2$%i+$%B9$AC+^IOH&Z$bDt2LicDpc^PvH6|edIqUwTlkAW_aMaiP#_1BwLOU|X; zUTY3+H8mioS!glZ$dw^FZ`B%Qdo>cXwcEb)7XJy*BQ zk$x5H_%z;guGq#kn#VJ`&k+j+LML1r;`b3+qby2NBtuNF!U7uOH?LQWyQ6cR?WV5W z!7wvNarXs$dxP)FYzcdEdFF(*myZa4=2nrp5(~Rs=3UvM@Yt*P?UCv4QW=>qSIrWM zl~m%e?h2=M=dbp}*&UaP*na23&v-%EhwIC-%BCcTRLVv5Ygf8B-|yT$sVw=)QjDwU zp57;cl(FBfzB3zdZr-;-clHUjQR}jkn0+CQk(UxxAr^U~Cuz~-ksAjZvT7_Ue+PA5 z5ce-=J@M)HN`AY^kIQ>Vr-ouE9$ z{M+i~YMlWuJffl`BbVH~dD+)>K2M9%_tOd{7*=JMm}Un(80lN-K&ZM@vp@tvXZj z-A6P@T8M4B35()2Dnn%8NyO)DnvPVoTxOEO{0j%w_P)FNyE1M=I7jhYy5y^h^6H{5?PZM)a;vjfs0#>eWpzKQ?7tnNe0kkb zUZ!FKuK^f)gVW$dyWYnSnn%Rn-ejZ?|MH$Xv%SeuBxbc5<+rlRB%|MSvFs?<^l#Ik z<+4W??Rca!VjA<(#Hwz~&oduSSS@t3t6@Doz$*z#OE?t|EdS<_XePFCBcHYX`4yvG zV><`Kizj;$tL5!Cj-2Z$J-?z!>f`W?lZmy@p zk|m9P%fl}`p>?@Qe{9o><%@Xg!14rAd5cr;AvLuPKQ5Qky&5!j6<^L9b*fMz@G=b1JU5 zTUczHGCiZxPfqo9ueJ}Myd9ss{!mIbc1^SN_d&N=9;s15vKt=#iO%`de2Nih-mccX z#ZtavW)-7oUCYG1I$SXcDP}*6g!GeL>$GPsxzt)NaB&_lkUP9+Q?#f4)_BRE+E>Cy zvWJ8Iq@<_u?sGkVE;QS~)qTzA^U9}hJ_ml8zCQ8viATj9(LP)+^IlmQr@`JE_XR!r zb2w-fBYfczb48=A&8>+h4;M_BJRCc%VL3&Xe;pa`yY@=f!kjy*LMdFow3GKlrOPyP#zHBc3ooQ|UR+33W$;wK!4DbC_YM%s*;;{<<6^Ek z_~`e~ot~cekvAhF_rdy<#DalXA#vS5$6Dq+rtuP&=F`R)>+Px@`?{$weo?hojmy#L zr$U3_*gE&aeHVaLx{hkywcw~$i6zx?Xlfbt^?l+ zx@@kN%0G1(f8;pSqjvp(iB`|6yNR3Eeb*T5Wa`ClC0BCXNhXk^Qsa;AUa~%E{acT{ zehr~>)kQNzjgy^SQ&*VZxRSgHlTsS-)RVAzC9H7iD0VDe^ud?Nv)Y$uzB%)Fit}~6 zyoI&`?e;_V5GN(Q!j5p>}8S0PT|k@?|WwtJyHvqX3Uo= z59sZS?5{VS4AgSl>6-E2Q2NW}KK<9R2S=$h@8l#_ov?WXYKWks#4UuAae`~}}^3mX+p z^HWQ%mL60+%@~qC?4hWRp2uQ;Z&Amoc*mo%$$RTm?{1TvnEkzE+pf%mzjw|Z>75s7 zd41_~!}r!TKAk4p+E0!v{g#%W!sIM}UJhU8`FMHN7Vkwrh?Px$n0oO&x}H<7XR)H` zjLy4p218O_)Mk`Ud172;*y!=$^uSkzb;GXn4w8tQUM?=t^c9>p^~93#dYx9Py=j}M zns{fmUy{A&)_qLHQOs}P*kAJ_{bbu`SwfG8OOn2(WY=4%s*WEq{cvYN@sUW+UG3y3 zkt1a~PX%>4T(%}Y!^>02cYSMD#mlXg5_(6Ot2DTm@m*t-fVVk2f)X+>x*s_lSN)6mvtAK0P z8alBHGlZ+uw}2Mb(uvP8k6O66s-!Xomwhw%^da5qPnY_0n}kn0sV#Lf%8CIc(z>(0 zCeuwuo^+*H$+akW>z?Z8c1vj(3}Mvp7`(fZq!}GWp!CS2C&}2J?)lpz1hQG^Xyfvp z(}hz_b;O$4G26>3$D=f|y+gt%&(0Obn@dRv9758T$p-J>F;^($BAJW&jnk>oLcj5tr**|B-zz8?6Y{AyAi=5YpVG}NR^1-EEVlcq1#sZ z#$t2keO|lnbd}Y?{=G}~@AsE<*Ok)0bD`$Yjkn5IuVH4@G}9fMdZmAzlUy8G!q<9! z&K+OBb2q#qwsfrziwe3p&wJY4;9z&q7lPWWw0BF&dw5=a`#L@3r!f1XY(-IP-MZM5 z${bA|#J)U&J0Uex#^NhPB|ho*Uq!U4u2yWx60#ZY+mJ61GP--Q=gbam%YCgT&f2p# zrM1;>uGUW%^a_+TIljiKDnIniz@K(0-<*vcN{2aHy#4ntd!sK_yDmh>P9}O2wrsz2 zch8Yrfgg92#V=XL%*rpkekb-~-w`qA(`(8Xo%k^^U;4o2x>H?ODtf|g{+%ouKg8xr0Q9ZL*h*#l10;z&cW2U-E-dUXdQfOFu^N6pEMrtkc3s# z(acVosfq7@F=R-5siU^=t4jKgKyUFkD~2a4zUL;l>aN+;cHnlQ(Puk%tVl&{=+Np< zetrj!Cw7!Y6cRkQ>A5fEyxsbdfX#or0}HFCV!@B;q)!B_2B6#n_@?Fwo%Dr(1w7e- zbpz}G_?3W3x9-5=8>ra9RyyfB0ec2e^C8@1d`c%x60n%3JFvF^hXGC#FqLOJu#=DA zHsdoo=?4KD0JyOc?liU0NxukKYTFKMs*%dboU|2gS3CSA?#Qesv+cgO>#qEjYFsOJ z*7EpSmBi=63g)+rhqzv>KB1RV6Q93ZCbp$i`JC&^WJ=7HYa;D&W%xIT_)VBUoUXq8 z0Fz#u{=JeqMO-qy)L`0uQ;Wl&=7)ABV?R&cNH^L1(ylgjQI(09uR1^Xw zWrPGAv(Fq&p!xJXIF4mC(HNB($D~Nt1J!E((A6nVMHW8z7CzwcZk2QW{e%&k=$KIE zgS-cK<=)&syn1ewe)KyN#`0CqNSmsn>!-&D!!NEm&N29i5N8MSyp=bzjc6U>Ij_c! zDwQp{74>QF4#B2UsX2j~Mim;*+NKnEC-2T!h`s0f)kt~QEp4iBJnu)l`h~0cLMf_k zTe^}lvt}A**+D0AVc8upQCi?8VJDr)ja}`8TZS!E(?z3R6{_B%$;#)%R0ZaXYK<{Y zTP+rT&_COILG1a2vnzT`M(%!|Ra^SeF2=t631z0kY45?>@s!Euh2^d`7zIM45wOfImm01UQ>;Q5sdv_8fVzaYhu04bOFq=*iCSv6PHQT^F7w9BWBIbDk z<{H2jfMP^U{36V?cDVU`kxr5zVvPVdcEH`|OLWpgA{KE8=2{1pv2I%CXCs5Z^3e{B z(z}k_bvrMv-QKdnv)u6OeC0(|_aygDZd;!`@uJV*Tub5NcO6E4bGp++|72>9jGa*6 zU6Fzxt?;?FnA3e%JnxrIXIBnh{I%g|n!}yZ?AYIYxiz-m;`XmSktj0Z+ia7-*KRK* zrj&e>_`&;IQ1a~d;7vhlrn=3_d0no#JqcJ=Cynv+%z=`CAC|v%9_2pO(;2mXsrAZ5 z1IiwCTOIfIhxYJHO(rg0efR5a#quLlVz+qJ68SItESp$Toz!O0xApiy>q-vyNpV_t z^QM_aNa0b8J8aSbYw-Wbw{K3SIZvV7e%@tYT%301+%9~WvnPZorvGBqB86|7`zv?q z4XvrJERA^(();~Kw5&L0)&*Y&o250D&%_DQ_^HNmT!-uLRX zVyfyKw}X$UXTGdECY1E0lzY+Rj9KK>Mmq~C#2g4B(pv=LcgejQTsO4!jt6)ea(R4VGaA3ExnEY_Y`ZEe6L3dLx4jF!Z{kVjCn^2;k&-;y7VK3N~cs|VsLF9SQ8qAfiZ#}vf*?|0a~Jk^QX1qEmCA<=CrMS&vbN;j8WPLou!pd0%0*?bGy&%AN!nRE5SO1vsnWxJj`$A8|2fCn*XCa{-0MNaD!d(V%TS3P{dZAUZC zZT{&(tUekOc1Lmd&lT&HwFVzrW(CzZSysIhYs)fn{ZUzZ|Fqw&YwwmUzwB{CD1O?a zw7wGa>7g<1*r#YYPh@$2Xxek^%7fzxWxKyW4-`HA>hOuf?u$1ktcrW6HXxIE{n>{* z9o)T-_IxA+`g$FF)Ur0yE3ia(J`L4&;>mUOnm_ySw%j^m@+G9(9}uE?np$ zQT1hpBClXk79M`hp;^}7%t_2_*A6Gs;ldo{uAir_-e(dh)(b%wuA6xj6#`yFp zOGLu1A#%F!m2G}i?S@$2I?+NN<-4w2*{9TaGxsihcQfCE{6gN`}+%=qb+xArcE*OF7%k* z@%*T;2Cd zp7^Qil(L|bxe89-%V$#yGM!pqy6EKXB6rnB*E`J0v(Zr8`Q!Tn4ue;tpDM8fS*BIh zwSIJVpZfOQW6rv&`}u44^F6ZhjfzY#;^vRFN~t-KnDeGeR$(w+=dRZG&=2eD4_`66 zNI3n}qwT4fPQ)e-#p;{}=MI+8t%zoOxL*nUjI>JT7fhO1?xV8zgg_=WaFW4q8`SY4 znC^DVeYMlvMe7%|q^MnfLHPJQV&8T8=s7pX_S;?@iZwVDOI-TqdSK0i*{Thd`^QWc zId-n-?o@f}aqZ97pA*%J`#K_P=8IpdT{p1I>n5+-DFJ#{HAS$Z56vw!NyRIKyxWnxa3r&W?fYirvp0sB3MX46kz zI~(NdT#zXm&PXDh5jb*xJVZ6_NiwawU#pt(quS1HEWpR7`sKk#*FEQP=tW<4umkyq zQmb`R$(F`DM(?iA7nwMJ+q*f)x$vUs)9Ga;UEAb*CUtK6r5)cOgLQU3-*7H+RhmV~ zr4q5!S_8rhzBREG%)>c*LDj_!+pUOt*eUqb$G)^%F$_4XnmQKf+-jr6!*F;rcfIE) z0qgqT5f|TV6dW*I{?T@Efi{18v-|p0BB{kOFX{B7=eAiEtTLtizHq}|m`5SkD0qgW z35J|{YbX`-#X^!Y^7QwA{&Od{&v=8#S<`u%p2U|7m5y%@Qv8+A8Yb;{C||)#|Gdbp z^Xkqv>yAD~&yw|yd(OIAQ(Xo*6tjQ&$@F>q{eIK4LZ=*uw+T&H{8D?L@myY~DoW}= zz=GecZ;1;&DLp@X_tNGncW$BN;)JG6R=MFfPSGET^d$~^!F=kerXsb1&xtKJ-}9JLnP_R-HiPkKSbJNeP$YTeuwEAJ=W<4NE(9L_UfoF;xW z*eB@dp5YR*BKzk-4ujE6e|8`TMq5N~x*uFB;&w}~!}BH=gK$IWe(BlXGlEpD>YrPm zyz0E{C4HNc8l7O}##p^f~U(ePW+jsTB=4&rQ zG)CTj<(Vb^>_%$Sx~HE{TzB~?sZ=>$vX=N*;95MDVP=@1@07)T(9VBapgNF z>jcIf29ADBcDPepf9SJ&UDM*UuV=Z*p2sTjM1yx`VI2!I_r`b z%@U-z*Y2Ass+6TP&E(wauMxW0c}Mc0mGhcb>(I{859L-?j&Y|KuHGO1zT0irH4eq- zh7LQB?_Dz=nK}{qJaUMnx76-L* z@jma;_|h*n+XTa-9eEbtU!jEG-o`zF7HW1NCklmEzr37ZbxCV1J3=v%w#TjRaX#6b zJHvn1(-=jXW=`d*LeiuS7CZJB%uerTO|$Z%5-_{9<(*7KF=#j-7oEU zeJEpn>%8t)el9Ey?g>_A>}`uY`>Pcv}$)jvA`id{L=blLaNJ&iB!eUCU4qnj%1KtA;~ck5Q=FI#pm zjUCN6VY9z^$ZqA=v02Y@6wd}OQ%If?ur9yNTYtdljmdpd8%q>wTaP*mPumM&*~8nA6wB>f!#xV(IVG>(@sS{NEB307 zTypI7LsT*h0q%Nn_<|5h>_iB=H|Wi6un6Ad4U$r(4#^>I^j%T76fV?9*+}Y3u(QK8 z%=FK1cuB2G0ZyP4u~YK+Yrxq~2D=DdAftjpKa^vUr2_uqadr;)LW2H3Vq=O@5~WeS@LRZBW}`9c=ZT8 z#2>}G9rqb}ArN^s`yKF;+rc7nB$C2k0}n4xw`6|%8in+;-w4l?fj9OsTRCEd*Y*YY zyprtUm3U3;x3KSrSMue6ner5)A#e?#o-vhCKrhz|01U>~BdcFb${LTjcP7C&Z7yMp1{)2Zk ztRXO%uYW*s9w7GRlnMxt3>lINgaSH{BN;M;{m>seOCuRF1SSL1C^!c*WeD4#LsjD5Cbjrs4%P*f4xfp-(Z;k zy#>9CiK!S38&vTEpbae9W>#7BQvr0KKmp&Tng9HW`I|qKwuO~%F~k!f4yzEs0+%re zk^oKuKw&FzREZQ2dNYC~@a@3ikNKyXTml~E3v4;aY2=+!pMdARiHeee4qlLLZBib z^ng||5Ipz9d_)O7O>`6J77%)#CK)IN=r|CX9T?CFpfsR#plF~NpjeQw($+2)WZ12)Ph>4BbUSUfKoZ1hgB- z1;`2rISutO8V_iIq5+AvRdf>Cgif_+;Guzr1{OMjqS5XE6*>a#0&)U!1~LFSx}?zu z(gi}79%zoEd5qQsw9qI6p((5hqy>atVzLHE7YIFfa~B9bb%GucsRVjp4Iec?RY281 z?||L|jRN%py#jg)^bDvCs2%76&}E?0Kxob<038833KR?!0u-8|t40)M?1g9mkPVP6 z&~~7$Ky!fvfaU`U0to>L1Bn2k*^6eY7!aC_5`LI9D!P3qEl{A?Qd+jAbb$&2H*M2W%F4@5!5jl~`L{1D&&%)Qg3oA15;e*fOwIdjgOIdkUB+_`B_ z0XMp26m&;2wX=3!-0ozPr+~vK(THEuoVbwY#{2@l@%!C z6AFa**+erEKP~!~r5Us1`FCk9EHyVvj7S&4uDK-2FRhvv51u%jU0{~PX~|_ zl0%ZSMgZiv6b)JdVE|dM1<)LzMY+H0?<(Q0J;N7Ko@}g>Mo!g+81Nl6*ql=-hcr}2U3A# zfMQ)5VASr(KPW(E0^}2Y0pg<}$py$41_GoA-IF3T%rr#WHcDLX#r@rAUyL=47xjY1 zoZH@0&{^mz-;ZF>MQ^%0kZgf zfTm>y-BsYjVqg*Q5by}F6nGeT40s{{WLi@8Zb0@-Ua12c0qVfh04XdxumPXf169B? zz&c1+{02=IH zfnR{1f!}~XfIk5pdjA)$3|ESWqySkgm{yV&Ksb;DbOy+zi9iAn2Xq430QZ9_5?AUy zDH)5;dLRa92Sfu=KwF?a&=KeWP&t*w10=f(Kr%^=k4!|nq>;dIU@(viP%rMpbs&%f z&;ouJ&<*IS-FL^ehxVD)U0TxUiAe!^0tSFgPdlkpK<=c{@R{WGqMbx0K9HvU09q?) z3zh^XGSQs?ZO06_lDUXRA;?1Aldv#Hj9Ga($9lHOVldhBM!cNZuQqxOSBRs^XtmgXhbn&8c|;+ zCzbiUKuI^G(EnqmIo}-8WMVQO z6q#jNCdl(s^0oBGN1{Gydg%4sZ{lF?G?*J>B6C{G%w?b$4QVvOGFNieFGu#h8_}ys z3{fgko(SbHa|$IMpzN7T^mYsK$Ck9Dfd=q7$r#u7|jn({L18JM+6Cew1tRB@naVFF^Z z2Sc1HUWk(|{GWBokjbU!?!)e3V`$+@3x*u1n&vGmi;Fr5So-(Go5Z9fH^@5whSWmW5^^|!a z1x2`p%+GyoeeAVi??4=H7m|*YN0lj$AfnC1|Zilr0oa!$`Tjexbk z(ep!)p-r0TIEby=lL$60R`sn_op{dOu#?O`Ei+$2Y=%0SWoB!cQxg=5FK~{do%qC& ztVdRFbc5y{)=UaS?hiXfJoKCG6;$kl&<@RH-twkL)-E}5_KIBy7cTxqCqCmICUm?4 zcG@nDzxd+v^7c)ikJ8yqUMsTfBE7lLQ7?01%WRwwL*X7xKN!cu&L@^l){0KM`fkLlz9#dGLYC$qEI}MtRLV@Gpip?jNXm5MGFPc+ z-$<0YyG&3h7Q;BvnlzbT6%?8jnQs;KQVe}4GQ6fyWJXp&5!3&80>3>Pc0G+6H1BTx``Ak}=0qJtjZ|z9 z!Tf0g-!lqM_iX|F8xfS@2?yLKq*(*OV08hMTTtjt^gVQ$;C&h4M4LQ~C~8~53}d+=T3VN1;o zWB$esdCv(X8RY&udT`4G#I+Z-8Zl?)rc9cX-V=`+G{l$& zUue5ppk_+{#7w!Ns816zc`s^U0+F#p3~K0*X?{V0XYq&$tX*?0ILTT4 z5URGon95ARs7fmcgqVv=_L=YpnG;wQLdrL|j}kn&$*M{+e=vBcJxD7ud6WXXsZeGV z7Sb@QL6XDSNH{}-ZBzL5iL8eYGlyg~KJJZEM#6BB=;vpj9bUiN_+NcO7(MQiv?-uO zf%0~k-W(D8Mz`!cWmb3{V%*9-yZd7(}9S!jQbv7DXcet0rfIrvI1LS zncM0KsvH)tKX;%x9r$FZ(SW}Fkv|74T84L0gETY-ZRTtW8heqKPQ&FeA4_*9xorx| z@HuUBtwAz*II%!Ibjsl&gW%LyOD_%zJ#j(-m*OzFK#>W^L7}Z0jP(h6K_@XXWjQF? zlX3$`1FB|0yO}y0kNb^M6N{Eoj|2dUqL^bIr-gs2DN;=$s z@abeLs2SXl%k*)Gg+XmWrGu)x(cb7o_g?uks%H6j@+{adW-cnwV7)fp_PXx&hs(iE zoxyMm1E=Xr`>PU4vkruP=USO9S{D`YD12lZmh^p^e)qGg^Fx2%=pqeN5!qS%*J*5& zetNdrgQq5LXT!I#SH;t2nu?%DZ-;V;*gz z(zrKG9-_`2<;DwVOJ8a`9z5FI`C$k@VZz4X=8!e{*vzn@ykkBq(6=6{hK-NgEt*)I zcH@}8k*|mHD%8{`4p;r=&o_EbP24|@PN=m0{xqDQLJi;JBUIzcboZ#C^{x`Ll_sp3 z)qU_eP_%Q75g0NW^{bZq@4e9f$Y7F+2Nam`45X1oChXmKx@W}2Z~g5x;)b+7BPiL; z=+=Z*{2?rwVA2!UJ5C-m1Uxj+pxpatpVZGB z`R;Y&GaYAxg6CR#US9xdcYxCQ%%ev)Z>^vRmfjyE$ZI@Km1{&O!K4k@ zkgjn;bfa;C6U!afzlg52Cdg{;b zToM#9A@=9->~Rv+{GE6cBZG-+hUEgjQ5sGiLuumHgh_*s3AYNYIGx>rB?A(W0j zG^YCI6Z4|+{?dt!+iAC#x$rLEetvlPwt*|6*cLQEN4#cdiN|R-1${bT-uizpIhuin z($s^L22Rqo322?5Mu)AI>GQUXa^3?T@@qImIVj{1%WrJkbSO4>At*+lA%pBBzaetyXsVQi#LC2v;$o7(YAuK3y<1_w-YOBAn=X zG}HzSx$heCkIO4weG?Qdbm6#mRteY!ym_`XCs^5{^HGmPLk?Ss&1LduWj7zr_3?g?KV8@|IA-F)3G9f zoL_UI+U@wXhQtaizi7Gh=3M)4%kG}8F~M~5>y`n|FG50ZpHGO6J zjEh1!(V@JtDkV<$g>Txp>(^;fpj}8hUJ-(c=F*agDR%o}MhhKWnVxFtI|~t@bcl?! zPv{)}ktPm96afnD@OFirx&7Cmk7>ea?syCol9o5${_3au_U{2ji*a&g^VMJ4W)<1Y zMHtr;j%B|;JNDAgNSSG!^MU8^?T^Rzr?VpMfx6`+bq3}{f4;Ww;ZPi4 z$@O3cC=^gyd^ag}z^2Fl5IkbQZ651vtB)M0=cIG@M1D_BCl`@=zOeN^^##vsxYADH z$2aD=s?MJH5Ih(Numv>`1T?i94+6hVMn_4z4ZBueX&e0kZ9K^D;dJbN)!aMg+;*mI ziW!I}OV|K*#W{Svg+n_u+^X^1{Nur*WB0AvrejZ_q#fjIy8+)jxTknznf&^(4dI)b z=-5jriAG5S$L`qf(hR(U8l+=ti=VD^9~y;YgR>}!LP-M;lG+BbK^@gYAWapW`vKkw z%aXo<)vk{kqNUQcXH4LPG3DpGt>t*ld-D55Kde20b%!^3`%{@`K+)!( zwZ!bC#b@yot0!Dsvf?1l#9>(KsMnpIK>?+2!KF{0KCpNYHbQU|gAcLB0dbM&@z(C2 zJytg2u8|O@g^eN8)P}5o?(Q4g$49Suw6I~Z=9d*h+_FVM>6bdb`<9MjeuE$d)zh-*rY(KfsV$(ShpKN99aDLK3zqTq)42=R7Af>i zD*T*!guc}r#m`w-w(oeBI=-JCyES?6tzV!0821!%zw|D&MOa3h{~Y(Naeu-4+N#5& zj=WiSfyBaWDE8nT`o44L?>x&^KZymD{AbJA0}=Z^)X#qo_cWnboIkiuU-d}TKHO8J zy|z0vvea=o=09(sfSl!<@$VilKHq$n_y!xa%>JH_x3Z5zGigqE3+M8z0@kHfj?3gW zTkXlSOkQ&lA6Ly{eYJ|L?qo$JTHT6xqe{FMtJiAwDu~Etht2GEI*7Z(X|XCMi^W-@ zm|V6xQWT5HJg_fb&iI%jW{NZ< zBV;EBL_`DMynw~V29!W{z@37nj;Ah%sEPu1UoaL$_3mZ?iwedrnHudJjX-L1yTB>G z`JfPK#%{1(FJ>{pBqVGmTh03LqosHw1GPf z7fac+NO3Yv5!`OGj~8*wnJ@N)-Z?I7S&7Z;beG`Bs1U{?xpB3M(3x8IN($e+igo5C z<*Y5weUT;cxgO?jK{6FMgtdf^+rspGh=-+fn~i1j>t!sgda{>&#CrUVVrZt8qCB;f zB~|YzXHLf7UWU%X(6KzekUh?im*ciY5gW$;Rm7_J%f&3Vy4`H{R&X0Sd`cw?nA~pD z93|gmp2@RULRnV9y04kXy7D6{p!Jjrww0e>2q~Rbv&i5Ymzg?`o$4>%Rgw&|$y{Vr zTuxhw*IedC$GnQeX(_X#4Et%1GryQtQ?FC;xJA8U`zIx>|Xq3 zoN>0p4jX%{?wov6J~jZ_4UMBGnLq4fv0X9HHkVTD!GdmfIvh~jWA&I#F5v>$zbS5O zp>?)P^`PB5SWn(%3G2cWE7_Rp=?mC-dnxaKfaeEQllpPp_slsEe;Df@SA3|I;hkg^vVN+VKZti!dhmx=EEG-k3PvxF&?}O{g}UkJ;EPZ z$zs~k6H}TnHNDYMyjF*c-X!yXtYqDI+-lYu1E0nzsPK%MEv8s;J z7pm%*1_hy9S?{;c-t{b;&t4CI*9?Y&uJW_6H``E0#)u89wz4Q_$v17NqtS&87-L#A z{=I?qkHSk+b>E+Z!yMZ2_C`2_cO#qM3h~W^*siS!KW$`{P3Vw1rMi3*D+|FQ z!?t5eL~LVic!CF?hHXRmJYC45MGNFNy$k6s63icx;$QR{p~_ z=543lfU6dDO(`Pnr`uU8%rI@4^zLNIUFk&z>N>0r`lP7uF-W$_$JVbOk zc^?}VD_*BkvxQc#Vx?C4Hffod-0ckGfG&85OgSA4Jh4T zWT*L%{cJLPg2D)YeLpJ=##xaFb=CL1#Paa<*aL9Mxd&KSIIRlM$64l0Hrs9L!r==T zax{&BN3g*gwmwu-J#bOnW{95d>AXmLpoGuzB zlU-i%=v$`-ePKs%BJ6s+YKPRVTa6Uz6Fqy@6ku)4BM$0s<+I+!k7Mp-2JfIAW^{O#!K4Sc~K^6avg0nN# z_b`A>Q|g(NDvKReJqq;d16#~w@sk=DA@Bu^7d#w?^wftOb#+&}j}t5z#t0c~N6}8I_>2Ok@2MRD zqq_FVAA>A78csGBdy+kFGmW-ztWNw&B@3_FIjmX1LXzm%83N=9G=_}Ms-UQlVD&hN zn{Qme;-b~VV^mf@h{jTR=`I$};fGKxR=iH^sk zZbrGu#q_EEd+-HNF$9_?c#5!p!j_PBR@hC^Q0Y@^mw~lTEp_OrMUBAsI9NigtR=RW z0bJsq=PhPQSZmaCXi()xnoR1*2#*nG*y^*H|6X`dYe531xXS6D7)FQDC>4j&{HK>$ z($Ij>kqxP1MO#g+G4)V0zM>*tywx>|PvVH(?k-bk=g${xXZnuvj+&_XObb`Kc={t> zYeR1lK$fSiv|klb9>gZmbi}3+#c`WL?+Zi-;Lkn65_#?-)}?=qW1(ivXIQ4rM8VQf zh7-D(g_rc4oaXI?Z!vp+5 ztb{q@ZD2}Zk%GA=tGN_YiN}_sz7M*l~cRw^7g9$r?o_murq+F{sb$B-a{U~ntXdNzvaB)VTwa8o4i1MlV|a$A)NO}R{+0Fl0K^ghob_% z5PT=lkfh+yaLDwO5tmyEO6oU)5_!RKGh%~NLL+CPB~m^iJ~<^6O6-#rmyZjMi;oK9 z2stx?lco^eI>~W3ol$Uxm17)O&aaMQ{w30hB9`)EdK0`R_zF-WxCP~iVhx~5pyA1( z!7;&M;h`~6sZo$4gUUpqzseEI7jiQHDsU(&5W&kqiLDwy@$X**{Jnm1OmK1}8h#_` zX+l)Q4AP-S@I+oUs4{3uWO!VN5LqXXKn7_>aBK`IcpYXS8k2DdK|U)mHauxcxHX3p zH6<=SDV)QZ4r!!Z3hYi43d?9#Zp#n)y;?Wq%w?r#ypgllI z0~(;DoB}Axf8SM1&!CV7`2A`ae`1niB#??@AxIr`7$_OjQj{W!6oC>!?ihH|)07zr zQ5a=T9MTEzfOL}I7nC%#N>cBOmbiX1D3KqX92Or6*`7M$dUiTOv1!bZKpKjP4`T)| zb}DR=z~RIOCru3x<8XA459KqJKuJTXp%$@Gp-J&6x?(;yEHxxnrQja=Q)0ymb$81InO1k^UL!-9T&6a}0AP88-9e@DyflqrEPMVqX!)$A!X` z;7m!u2?;Ye99d+L24#%IV;BiadNdZ42#Sh}3{Q$mNsfw(h>4mKnbMBdh(*|;xQqq~ zZ`w;-PY0CLWAoXeJ1H(F%oLm2`j4>;i-o;$4L21FU@Hy;PXzrn-3IBz62_AJZjyQ` z5*pt}+@b05Nnxau;owP!#xv=d|FKbVQL$0UDO^+_Ub_g+Ljkg1^#v7n#f>IzNCgU%6nJAL=5K*w zMrED`CFwgsNyRmi`~{$-ezJt007}Yvfs%4|prpq=B>9~r`K{;yY43?8M~@K@JS~_R z^VI{yrdD(kn~+P_bkvOc>&h+TEFP#DP~xi5$>z+`8J?Vw6croHVJF=O7x4i3Ln;}V zTu?GF?A*$d@L%}i0i8kn%4rH8yNY#4m^#Hg6zkpefnvXlh>8m{Pfg$`xQV6wLOPL_ zU>*}68k`ai3O7pO{F3A+n8yZV1>wwe7i)VRRJ!#9^YCd{COGQ{iF*;7%$PvPi4Bis z?qVS>)I1{2$wMq4!8|NHB0LFe61G*)c&JbOZ!#$HTkPE7NlEcZ?%-9xM?_6YO~Mu( zH$-ghaA=njo-`vYJS24rTIh#zWR!A-irvl#d?zf(neLvFVGWO+hITlyVRq(`;b|Pr zVd5TGBVQR6dxH}DhbO0|M8za?3?#h2mpHvE1QPe?2ujwho&vFA?fu0(yTh|PxtupF zZH$5^P>}SD-I>`P`2{MHp55(Fm&#iRtHF}?gOie&Ef#djG<57D(nU?owTTtCHsbj&ib(V>WH>;2ad~x z6xg38w+o$!)q zE7#4&>2pOiiV$y97DTHBD>XG&Un(a|$O+bJ0eP1FuqkjW_?AwsgbZ zfFBvx0}4kaQ3eHqEpw(_y`^??;D*r88N^1TSBfM*umy+4?D1yz86~Vnx<)H z)tu`eeYm;gZt>)7Heby^^d)~;;FHCZy0^VNuUE;Y?@A~+yvmdF@~`PjwI8T|<EMn=p67(9-6MY zA!K6H*3rIKh6gL}zjWKsSuT6Vg882(j9l^~xw22ct^CtZvqLg$9860~4_a=Py)B?p zHri#%FB&A*uxXt?d`)@o z3l6QI%jfl_I2bK%koI(*sbTn@*B&eeC~9mAbH zQ^$9TqdXYwIGJ2JPuqd#&;f2{^2JB(J9f?-n@hDVef#O)m$onhfm)seUr3 zPUmVnao5Svl{$Rh3nUPQB{;OK?Z90qM^~cACnS>U9qAe!2iXDg zM31XFPTXnobdElsSA_(ktvu0#r+^hz(i2D+#iP9p_}l^>onye~-9Vl-QxbxBidZxM z(Enc>5$o`eZE^h+=$xK>ULgcwbA<6Amit11Rxtc`rT>#W<4$yr5uX=`ZB}9~bchB= zOd=kdbKpo@6zz*H$YNWN(|G1Rxx$p&hA22YV)~AyU+@~ z`P|M*v{!FF&lUR*aV)4Y-jPzGE0J~)X#<(GJOc-wx-y4@jTkBw|kvn#EDSunaQ z?FF(M1fJ-DZF3}wpogxG@?eNI9OBWud*F!2h^La48tv7O&z+=3=k(+AZsTA#3VC8* zwNa>?7pI3pypdXXx3yq9$R3x4z&kV&ra71@m;>X-K8nl-cpXZI!CmBg3 z>O07;0B6t4ph`_z!J5zOh-V0~9x56RvL4_D636Dv!yS>CE=hEY}8*{+%2&k z7J(BFBiw=Or$a0B=ku27zyVOb15^D0I3kQg`&v10HM`N3j(pibJX_h)xxJlaSBvj@ zI&rJI(F(R$XLQ9gxC=2YPYBKtwc&k64zh>9@o7b<_!)PkVWdMT6C6*R!7=^hg@Pk> zWN37Yw^qW56}}0M3`7@ZAnf(TLkuYbM|m(fOG=Ej7n~(o#AKUs2fOGx@%rN7l5_>d zdpq#L!I1%GRNx-ar*qKvw@4&y!*}(dmw{M5hgRwBz)d!wEA9ER$B;OHzH0Bp^XS3h z;LIkGu)GJILPSk{QTVHKKFI@p(x`Vr#(}QEwMG54I%l12~Dj(ZxPEO%e_= z1rEFraD0X%HZKPEhs|a0lRRcXt$QJz-0|XY_lIQJy?>;);EqgQ7|t1PY$BG*n2{F( zPBO6#9AsC6!&(c|*W%6sb+86wItQ6DZD5C4LGHw|pi?zCNsH*2TJJyd;5)zDABl8# zrViL1RX?$Ava||%u^1c~6=t=TJp;~@&h6Wn4+p|}fo z4n$L2n$UstU-1HFHR;-)5_vX~<&!N*pPs_&j6|~e{Hde}iGQnJ|4$_iF+GT(|ENx% z7VtVFkqq7+iA1FXNc@}3HYEP7bvNv9f09Y6=OXb>CFy|%yv|4*{?~>KVdFnlXH-Js z-&I25pJbATejxF0db+{Fe=E5NiGOa0sD#A7HPj8$pY>5@jOfe|US}l!P3BG{{z)cL zsqLRix?xxStDd~oNQ4Js^;N+k>oAsCFJ>>&!mAA8&SEDWE#a`B8e&5O=g7EU6}dwx z@g!D-9}`z*jwQSi5{}ucd5gi3USbKwj&;wO&Kbt14C%|mTzPX{ST848M_gzxFFx-( z5{WGFfyWW5kg3LOG}KI*Cvg4qJ|KG-C9n`;l5%kl9mtmDxq~Bn2Xji4O$WzlF1sIh z*k_EerQwd48e0dpEmu?}Jz}ODFB=>&8KX7tGB}JiIep-?td8R=v5zR>BDdOXNLCNz{W(Eo_n_nUatx z8wt*yjFjwF+znuQ(u6xRl;F}T7C7fZaWb+z8e0+13*7I1Wr1USjwx9Ij_4;oY5bIM z;(pl<7LS8i_XKdHo;dFyI3g46Sv&Arz!5uQL&37}25*oON$%7F1^9IP34#KFWS zu@SJ{CPS71j^x3a0-a>Z9rG~7Q-`KRbsl3Xe{ire*()%xB5=gj#iqImZZtTt^xi(= zdL5blUybr`{%7BQ!$;*LlVk3%6iqA*Utcus5{L3@qiE2?9B#~@LGgSTzy zS6}+{2wrC-l9GQUVsVmfMdA>~k}ketcM_jL=7J-IvFrNb5dj>rAG&~}dpAGvU^5S$ zyeZ&FNeqlhKYF>kjIa}F73ctT0mvmy<-uz(sbWguUQ@zLQIBPQ(p@i3w z&~6f{i`UUi2F|$5MJN~02NVG_fGCFjo4KT^98xfD%q2}pc`VJ0T#N{F{W}%@y#Nt_ zHI!+1ASlt?4ImexBp*J=T+)=3!%Sw%W1cb>p(GvikGTjX_2G-m<%Piz-$+qX0keU* zq$#NgH)AeBWoVzNn!d8Q3lt~*BPIFc0brp`_wmfK;3hkn5i) z>Bs_r2P_B3B~6uR#aMkta50m|;Yd@`y^TOeU>iWLf1;$7?M&{UDXCv3NtdRi{0@N7 zoovT&!(4=tj9p@up@iQpNiPQ_-QEX~>pxMVzyW}C;21zILW#WNgu!*3EC3|o1i+;y zz#gR98Gu~Ul%$_yQpJ?iIu8(fL6S}=QLjS6OViFss|ARhTL7tdTSD)ElJtA*s!$Jx zT>nI6k={r$aWyjk|JNvKut`#$P$K6kK-}r2gnvsMjA-&6AlE-pBIpA^=tl|t1WGPK ziNLRf!6i*e`8Fo?&y=LMOVZnkKWYJ8N$UR()aSpmVKX{4!9+;x;eqau9u1asi%@bq zM8XqF?CvSy2_?6~B)l{wNnVn4LdmT_!V^kvy(K(o2$SF=Ng$LoG(y4?N_bxhPbj(d zlTd#N9Yqpx5lU_Y@E@rcNO<~5q6sr`#*r*sgp%9w5}r_UJ3+$#CrYGFl9ZFCBxy4K zBQ#i&PpCZjD2g2Q#W#OYQYKnb@IO&fWGeZO?w%x`|8d~RJWiCBtB%MrAauG`S|H65PDfhoU?uh&U=W`F)0Hx14U>Tka(SQBCLuxT6 z)juey|JUP=(2dFde{kNB$n}z<#Bu@&FQFPt0?~||bI3*L|D1PV1Y(r=0J;8&5^Mg? zdFOx5J8*+WfVe{wKrTZ6=e$EK@z>+c|D1Qkp7KBE9XN;dIfpn4;r}0>cf`Bgf7^M7 zo-sRRpq%mfTUqDc)~qb6c~jfEAjq)FSzl9cdEE7}-=AhCnWo(hEnWHYz*hIg)mM`O zk0{-)@EN`=Z5cfyvi{1xC}sN}w7F1=&R!rGLv|eYlDVa`PUNh0)^?EE;rp7ZOCEPL zS{~bXv;T|TqXf=pEVQeh3l4HVaGS22Uo~Ogzz(0^rMtbDoqPXW{*at`hwipj4TUW! z&QGPEpfYst^?{TuJqQ1Hr0?Q?Ir_-FKuVsrDhi}{bmII#N`bzN|2xr(kkXlM!vBgi zwI-12LaSs4;$!rv>_A$6o+5oUTR^GM+VcbH!{7!N3w%^rl|f}9TCSTt4pY5lX;*(O z?THsZym)@WwS!h8{b%*Ha$7sy<%RC*>;=cyG|O!a^EX;@>CBC({_5SE-fNZ&-C4#T za?P2ZkgY|(Ss|d*>HaGNX|4H+^qWNjN|WxN6G&HpE6fp4+Vl%>X$ur-pTz>I8@*>~ zAZ@x(k^TX$J3VYkAbkhi&Lsj$pKb%UaFHTCAy+{4ptt7+(vCTbwBk|$Wk`=fz31Rg zfHS7wFAk(vFBZ!*VWfC25liV!M=cMezk<8ETtM}uwete$ZMoul=1jeyrQ&-1n0oTd z#PzJ`-Zbn4E|(TiHuPO^k;@fn7xd4LUbF)J%R`S=3Va--Z5V4DT#>igK1q z#hnE`bE<}~H|U|z)+4q#;NBVh0k{!#UNNRyfg=66 zSU~yGZX4i6;I?cKQ2z9LaFJ^j>41#_DuCXw5pJ|jk(S*gpaN;%O_(O&4r~(mjFC2m zQH0j?bxBz%=C#&V`c1WlPkvPrs1y=OC~+j1A zY~t5$yLf3aHFNyyt&jTKnpjQjPMa5Nc@J;ftAB+1Vx@nGSC*sWap7mFcCHrsnS|v3Yp|ti^cu}#U zw|&bE;q0*Sh2BB-o|c_5ebiLv1}${C-_&w%(M!j-Q6ny-?_SZ;O;s3`hKIYu8`_dNo9 zv2(^YjQ%E!H%i9Ry|-iZH)EmLE}-J+yWr%vV4)}#P>J-SQj9*hH{g=#{$&{b5-b~K z0xFe$0ZwZx>9(C1eQ*vY7V^tQXI<^g_BN9ThgIm%nZFX_+I*y;-~xQd;M|-tlU>u^ycD- z`{TT}40y9`P)+--*8b;Ge=Y92LZ$tbQ?G23Q?7~2m6aydXG$4nuCy!6e(f>0zhl2D z9qnnEc@4VOCtLZkvgeT!Pt{h&;X?*2f)&F0Y24@T3gcVJ}(yMROMJRD7X?!*jxDBv#Q(3N1nf;Ddt za2IpvnGK`qZM$G|u(=$%PvdAhXg7@BDDYV(tzo|G=+i4EhDWVD61v=U(6;QPMU!5f zyBRWY%K8pE>QsGuZFF;H7A8yy)5}-$v~ew3(QBp?ozquZpQ~J z>rxAjzF)f3&LlpsN!L`$e0kE!b=FB)+4uJ2crR_`n|b;*Z97lsKiOR0)!cE?k}dgH zZ0**nOp4WNd#P>qeW=R9r;A;!bZ!jw$SE;=?!GiMxir(UkltCYC46;u%ePbGRXv9E zevy-}>+hw+e@>Nc>oz;_;J^v58t?U-8Jd2(arMBT7bkYJesLjw{6y_i>WovLB=?*P zy?P9NrY@x&Ev;Q$%(#g5rl;^fy58DoA(lg52iwaEdc#P%_DvN(|_T5eOh!LfquaA46-RM81<)R)a*h^0 z)LnP`mf6X=pS}0{p2{pd_^Ido;8Tw4Keou3EUI#UeM$S6g^PyUYWe(w6}-qPGuAKE z%N%ujOWa<&lk^E_=Q+n{>7HYWMMK7{(4yNGw1@9ZRDE*gM|12rk<+&k-_JyjLDvr?SASof7*n4$&3v4Lly+;Rwc9h2n*M zeOkh_wO=>yZAt&p_;jfDZgayI;V*g|zjLl;h1{Z*#%rFp%Dr2tJ8rSQL8?^ zIUSO{C-Bilrwx5>we~AMw9xp9ly+;SwY%D>?Mkcu$F)``?p5*w?+@)isOV#<>8K|A z-m44FADTU8b57RoJh!ddcja9YRz|w_=r>(uh?!64fgZxoUo!T16<(yf@7EH33)~*l zIkxwcHwWFat?Yj2=WZ*rp^tn@O>E5m8o_z8spQ0_m#uPXE*{4l;wKe_`I?1J^z&4) zNR7H&@&27tmwGAf3Z=FC|2`|OLc2=~Fa0|Ec~-9>Lr?V|vur*8{t|oLbt3<1-8~gbg5>h=91$t1sVrOrt$8s^!=Xr!THsb+LP~xq#nQA;w^sa5kC?XNoyCI!*4B* z@Ex>o?ufuMZI+y4X)e@foBU7btk>`8HZ$nRAq~w5k7g{<7F-{?$i?kTzGtbI>&t*W z_g~aC7EQWSy8Q{AaX`zvWw!k0eKuNCIw@By?{m(#<=y(P4?RBZ%hNdK<2(Lv`I`sJ zZXN3WY)mJWPIvj$hYyd}ec;ovF~+jFV8CfD!yED^rEIr>?y(Ph&_P8yd!K;XMAv|O z4$f}BfZ9UO*^fQ;kRttLzrbg!bU&8J+kWA7&o96BX)v8S{q4uWtMt>?M@)lW-rr(sa&Gdf0Qa{Cwp*WD zJYcqNX3EkX8)SM+xVp4z-O+neohp-7)kf_&)sXSHbOOhmx3R!=!D9m zUT%7+K{q7!5r1qVb_n((QKF>G>bIH)cPu;ATV0{@-7?y^f52|9gu)SxC*4LreQ{)J zRP8Jy?}6Dzw6$9_GCI8V@w;#1Rr4T`D`-^QWf2-@20vtB*8fy-&7LaozRSxcN}vjp5UhJ~;%+4?gl^%|efQc~bG>Xd|M2Ioa#t^(Iv%4uI5GD5qn8E&JJyDux8CR3wJz_~Vy)Ue z3QAK?J4z|MhyAFT2$%V9T=e#`+Wv3l3jfbmQ}(lMM&appCzhuVy*VMSV@09Q^wh?c zjn_?1O+NUgpF_@+`LDAkRTgzl=ia)ZF|6Z-ZQX5O_NeY3t=qe3q311AjnXAgw=$p7 z2_l0Puh!WUzR@$l0Q4_ z=sMp;*A6UD*kyk&N-k}3(#sRWMlGn5GBNqEoxNoAv-RCIlA_%WJDrsO{NQVPM2E9N zpW9pde10SEG2O$#uTAzWPBK7_YzaNxC|u6OR2b(}2y9_A43dn8bJSX%rG`!8z^dlnlQoLZxQ{HKsVWX#W5 z{#*PGeSUxEO_WB*PW5RcR(5ZA6Y(^yp!{UKR$Ai6H8ZkSx@`1}xD^<k0a7@ z|J}~Q|6@ZR{jUlBFUk%5J*$sN3;u7MBgbj#XrSrL|s}x<>$=w_@Z%r^!IVo*MHHSJ+P1Aw;)$}+m`7%a_73Jh0?u;cExK+ zm|8v)GEYj&m6fBwwZ4Lttv z^n-(UPP_TAAOA_mX#))NTXXCCKIoVEoKct~KM*p{NXzw5^S`GsPvovJkmKK!^60Jb zN)%oHZKlrbH9MZ&nN~YvP3q)JW3^=ZWS53&Tdr?;?Q~`6t1cD>0>Of7-Ck%k+m%ZM z8$jq;X~9vs#nvGueBDX@Z)Bz=&mLbtB+j9FZpY9^Gn~6k|FFZx)%RAyxgAr-Y0u4n z{Uxo}`1xBVae&M?`oiq3@%HM`r*C)t$r?z6$uae?u>8)w`OEiY@6C`?42 zmzEp#>ilxUIN|HEpd^dV)=`}?*TyFC}J(7Jj!nP@i<&wW#=3HXsl26uU9?Pb=4oI*0I<()_%QhRIcPRCD z3n-TJeSZ9OjJeYA@Q`!cM>|`M?IxS-x0)OB>)nn8W#dB+9kWP3sHYg))!)#75uC{g zu3!Zdxhb2{XUj%U7u5E2jx$=i>{o66u(wa;?!E2M!1c`7(QC$-?~TGWL2m~2`X2hh zsnX|*TFR9BWm5)S%qr+qa_LC_$>f_9_{RvoEG>Bbp5&_YPUEuk%<8)Mi^78x3SJpc zG#vEpeaL*jrBCJt-5J@Pa9md)}g&6;J!Z_D(1`}UX{|G{s$LQbW$ z;K1%K{j5x7cO`d8Td#lihLzg$WrxeYi%P4f9^F>-S^ISKrzrj6fu<8bG>;2#F&R7W z$FggeOAj@4iMqS8%(mvLDkE5)QTU3q+yI-ju8$U+Ni>>d*H-9M7rNL<^+Vb9@}-@G zRbjJl)%Vumh#v0d8=I9!=~=p0TfVsBSY&ix!>(;r|9kbZ5sCN3rz{ypaFw*+Uk~bq zF?(iC*XojFZj~)OHDTt})^>lRN1NuDtH{^NHfVcvte>6nXOfk!#X&SL~c< z{CacU%I|)|qSYH(g&lUP9Vu$}4ZJuaq(vw9*4AYo-#qpoJfDA4b=N&F_Z7c(TREOM zy{TxT`R-h=;dMGrFByepm@lSWmlnKW%z(@NTsJpd)$=!g_Uh~S*5>@KajS-RY`-yI zZEm@*vY)1vbDUX1-P1>_ny=-4H@7IU&3mmcT(ZB+sm$k2h5S6RQ^=DqW>rfIj_e&h zP3GLFPxEvXxPtQ?y3M|LtZLntQI~9GjQ2T>d_HL6{taDzeffSR!`u4Jn#eEDng_=i zaFRzIxMQI_f2P~qGKs=OZjH3ukn;y;r3!aur8|w?HGM*YAaUZN>~1n;6=AcLQdNw{ zrsRCweZR{~>p@m)&bsY+T03>!(}uGtj@iRZZn+l8+P}If@nU&0MQ%t7UhkhFx7+Vf zb%I~!?4{l-Za(O?>usm%YKMw(r>7rrPN`Sdzu5eFx9&*Ut}17QGIIt@yFPuKvehE( zkL>}&9=p%*ohi|n2)-#T_)?dYoOPQgoPE9j&?@}{d8wWDmKUsF+St+M!KV`sLY~>~ zHQjkj_4%f%8H@XBhR9zTdMoea+sbQm2YL;gn=khxX8|KuyhoESJ(7#8KOC83{8RhA z4;qX)F?jCYU;e%N%^LQtEXU|(&L1p=cw-4%QShR4IQ)>OdEX8$m9w(3b-DqEvI01ZsLmxG3$(1 zYl+$ueQmW9Y}1sge6OA{NzXlCFt*m!=Hh{K4evN7htel1wCJ7Z1k_!+?Ht}BU&cG- z^8%`#-hLi$kt^{=`+|UaK##eAx5(g5fNP+67x5PPiXt6*Q9w1(N5DB&;cfRN0riNE zx`Zcqa96=Sp|$a5di7PjrL7Q9&*;nGJg?y;?PY<_3$_oSGE~p#0ngPmN7q;7whgnP z{8mM$eoF<_?Q#iO4_8*6PCpq6_wEVoBT;X&sI z^qXt=%wW~`DM!CeIQT|(K-Fi@DBAg+_0i0`0aYWWaTnMdACjH!I@9}QgQaNy+s&76 z3}0+hx0#a~w6dWToL%Zm6m!cBBofdvip+bVT*#wIz0R(bieXUR%t+5YVy7F^^d#0w5XhV z^3JM{)!(CfmtO9kml zuN?0AHoIT?`DIrh(2F>NXLVbg1I^xyYd9a@OXgQi=YD}7TBDZvbJKTM4=NouXPcFj z0p3e1m-RU$_e*@y{@M3-ESq#W^YB(#Er)iyYX`LJFGhVb(>-A(vt&|VOTPBe3tJn5 z-G3b6yWLkB$u|n}6U-YHQnGvhD0*j&mhg1@%U2tp%%AwHk;;0$Y+ae!r`LxAPlSAW zw=eK|;Cb8Ew%qk*gI5XX6!?3u4=s85@w&r}yYUxiRR`Ta+-Zr?2JuENo&q1GwR>_x zrTKo;HJe+3O7|zEs?4nH(5%t!|2;z{!@1v)cV9zO_q;w=)tab1quYz*+l~#>@6OZM z`m589-0~e|3MGy1_^f!s4J~1OmT&EQ-`m~?R&Q(SzDy7qJ>Xz; zX2)&Mra3#6PRI{6nSHfyWB#?0s^l7bFNG^_J+w`Kc2%?Z_Vd$Cw?%mccaBYK&uWhg z?N~lAiB`O+CA?9fRKtHL+7kWnnEB9iCQXwn+>g4MwJaMjxa*FGH4A$2wI)@p>*1H( z`Sl>7fBkABy{?U(=Ma7tYk^0fy~cDf+DVDXl5TX%*&xu!ea`F8D{!lF*2#?mKlYSBNg z3Vhn6#il+?|6;JbC00;#Bh1IN1 zQK&gJZSvwD6J#m9hxmNNx@A;}>!fv|dm?IWgFj8);vG{tj9(kH&+6s)6JtaI{r9Iz z=>8rjJFk?h8F6Cj;`-E2Qil8?-Q$znvThddnx|Hqn)h??qV)2yS8hJs-C^l)I=`z^ znauaf&$${G^)q*9uh%**Ojj5^@%@L;!`zmN-PNs5eLn}xl{KNS)@cc2*1dn3Z0fq{ zoY}j<1zmn#=(=8g?S;6xeRal1*t@!~`rLNE^y%?yOl%+K7AjO*_% z3;0dDu39!oY4=N7yVKp@rFR}v;*(kRtk#kiv^{9QxHx#Q*`{}cuT5Rhu2s3ZbAy|4 zNxpWEUa#rbT|bvREqq#c?xFjglD0$FMingIbBxZog)bUh6>uqv_PREjcD#-6JzNv` zbU=&jC1dco&%x{Wx<@qUTJf z6ZKWS$BfqYdy-`zSFG|`U%n!JgKLi)Z3Vks%11g?xi{AZd6i5ZwEmdW)tL2_bnYE3 zpGPyltm*dg+gV?O?YB(cJbJe_)T3mkPUOdo4X&jI!`Am!EL{BS#ld2a!Z1J8u=jc% zliqLMQ2ulGEB*6^m-qIZV=iS_If~|1wA?<^9v<$LpX^n9w&(0%GIStqNeyj{Z-0JQ z#MmbNe#tF9B96b~@Yn;dXJ4)=xsg1n^N)wq`(G0Ve0JuJy1epj7puK-4%6w3CN0|M zj=-mfv{c(AgP*OAZ%!$7uQH;ZFI_zLdxP%rUV+2aY;WZ}@Bg?s?$et3RnxoQ9lmnm zjMbUbKh@dX6`Z_kq~&J0b@Z~DYAf2j8H>>!@`ayacX0}7R`gb)Hrd5T7R;V^`sb&p zSthSX@h+|Da(ilE&B3rJ$B(JL-miW>o7cs>+D&o8+4+}>zsOc(IQ!&O8S6hW(UZNs zajBH4jOjKAUHu3Lq&FXvElu&Y_CLL9l6_-^*^;;1p%&Z5ZfH^;=Dcfn;G@JL z8||##f8}#sHom0&|Jyvd5hoh&4$|&- zb?p9@i<8#JjVxQgNsy>pAFtYTfYO0N8~VpnE$`q0hrU_{8t>mbtxbop&@kzx?(+=xkc+CHn`47vmjHPYZdJJ;Ac)6xUj=E>DVawRA-mJW6L@ajPxSNP+pO%q09pivg4Vhe~El z>8^d~_8&U3X?^f3ZHye$`y^I!lO_I?gH5Yt(zx0E86nVm8>vpI9~#4@HgUn$B4@$-W`EI4P?7^{!l_^iXNa~X(@J*b=IN+Z^|7X8T=Aoq4oO#r#X&uz>v;&C2{ zlQ`W-Ir7Y^2t1Y~>LC&Tn7@}{UsI74m!v5H?3*A1Ng8?A!oCS0YbYtF0>t>YFRqXtYXXh{ zu?AWDNICNNJLDit{yNc2lBSLO=KwAtGlry~4nQ7hNslZf1>xm?ymBT>3n`}y;E&cB z1&A*Z1-k>Tk~C{cIX&<#0J&@=X%!?B*J_EAC^(B0MpAkrvyqf3l`6^}NhJ>;ZIiZ$ zZ1N;Ts*w7&fE_@-X+o-#&;I%Y0{|z$nG*H#rL09kBPmPKYF|pXyNI*|tN{vuwZJ-n zd{1D#$lRaO6lUOdHV_R=1!90$AP$HJ%m53(0O$eq1dM@RfC*p<^ahA^r$LG70C|}_ z1DFZS0+N9)$S3YYj7!{uxC4e?G}WKt31d(o7MKbI10g^t5C((;5x^865||831pFYt z9~cD$0OYj^*$9GwQGgFH93X!tC;+?w4}eT2cYqJL0+>ib@`wK%E5I7C1?+&`z;>V% z*a4IQ8-dNh7N7(mUj=9a$c!Qr=m|h3O(j4kN)>PoxDHeUWTM;v76FTaTwp0#0y1$k z2gm}FfMg&AhybPl!+{ZiH{bZ zT7Uxp`Ec_Pa2PlO90kZE3IQeqLO)dUz|CpkI1mc>BW*C~3E(6^UK)=EC4Xm0{#4Wk z_su{fFa-PnP$$41Z~z>EkH9B@O#fEk8E^sE2iyi~fqCTb(*hx2C>U%a_>)FYS;%mFe1 zV$Eg1JYXr13oHQ^0`q}vU;(fQSPbNl8YF`x<^y>E4Xgk}0O{>2fVIL_+!HHo07!3& zfg)f%uohSY5Q`K5L;sMg2Y@nwR3>SAfgKWl4`?~C zTf*-I-6gqa8{7~6C~z1!1RMm803^Q-s0D5UHvqF5{8tTJ2d)8Efhyn%PzhWHDu7FX zX!#ht%I`yA0s-XsMNTv1l+z0^0?2Vm1|`W+ss~^IkRzEEpaGCGU?+flGeaJb17v{# zs3QaV7_87%|H|I2zUxS2VMfNfww>l@E&*vd>|h45jUTJFF-3m1b+qEfuFz+;1@vB z2s)w{qz4M1sz6tO9Iwf-o49ZnP;#8_3@8EQ^sEW!0@?sM{gP8LQCiOhH{AhafD8pW zD3WtmA~MNYjGV*Bxs06m2~W;u??@$F$HPRW}8L+?Dj5@X!mKHYRrBWNy(Dv6}pBsr6 zBamZ-99z-I36#2%qqxvmh*3wOf)@Ui<>Tgll@ziQPxsEq`C?w4Ir8a)>0DGtZ3}Bl zQSk&yO^91tJ7#t1gi;ZrVMh+$TlrL63hi*%KqKsLWpgPj3kL@ad#qHE@l&J1@Z0RC zb0&0i?RS(*kx9`7QZ9hHKu5^_*dOagBi0ty#L8@>6ZYr2nH(#U zGpmDWeH5i7N|;D#>Vs!vow$5Fy{A&yE)pdj&>C`<%7`XUrnH2On02HpefoKR|2j_X z15?5hcHxkRdZIV`BjL!g!C)ZgA2ox`|H)*igIZYFWSMO|b6DgOxs_KZeugySOrqAw zRCjKvtVko6GLsj}-zO^?7*1*FvQb9ZpB6_I;xZ6cEi0NGj1r9yO00eS#}V!JTa%hm zg18Qx>W!>uZ!nd~70XhWL67f?&V*CiqKFX6mfO%#v@Qe!*ibBwANXF1deeO(1i-?? zKEFDOszWGiT{g&z%arP{^aasIqy!3}NQIn8FBCG^-+bQ@Z?!+BC3HPXNbK}dPE?E% zTuXV;$uLl{Om$iGK$2z8#(D|3`Pyh^yfPm6F+fZohbo92Wq7}{8?`IXsUb(wdx&Wv zV#P8Tacm3!Wu5HVSTP}qMlJ(8DLImUp<(o#jUH1IR9ZdkQ_&N6DCsap_y4#Rkx@9M zBN+p43pPp&`_u5h4aLThVShZHC?kr24~*iwkOiPWCnecDE<`i-7o8*qV58TtKUt3)iRDTB z8D;p};;yclWL#1jiCk;N3sS}O&0F{GL758X?o z+KReNrgXWsT#*^3Be$)KXw?+TTleoRk%q9`agHj9eompZ>^njcCCGEq_nbI0-wU4> zKz}R{*q)I?rZoHO`I464bqiHQ){$6ZXcbXrBwCYDT{b+9qgQ2%^;(@Y8Pa1bvIf5I zDte6tMVAeTW0M~`^GsoJ2ABHLRXq1JR7D2SD8Yu%$*{K2KdaiICt8I&5q%_cP!^`O zR29WVV^;mUxMDTYaUu?pc9^MsNbAD=>gu15A&&7+N6r~F(L2asr#4yU*f2futFJ4~ zUg#}Srut&DAU2585G5o+92*ja{VjY(JGd5(bQ+?PsZ`%Udl(PH#RlR@x~Zo;|8vwa z6m(>!JBJPF)A97`?5f+ZVvs}Xpm{d#%AzS10{12_H{_5t9l|BebNgzF#>YSnHtbLR zoaL9VH0JP7($>O`lyuh=Ek_Biq=x8h3}((kP0>TCL^e|>2}P61#t(oPVjPHJgW0eV z2#~{UrZ_iC;_0vf3z()E-(@52upte8OZ)4lEvX}fo!9_HY$OIrC0K(EVZ_F2Kn_s> z%Kf{Y*x*1)gND>Axx68(kpp&c3oAP|d=MLa0XdfPVzbw3uZqWBXAwu~=(16V*q9BZ zm<1LH9K^Im!%>XeK}S>-hvJQ~l#VqU73q81+5MAes2w3X5|6k1BW{w%nxPp5D&O8A z$I-&x!a4MTw(9E*q+o;sr0q;-QtD9grH zdh;??t$TD}q=0h-93vl(( z6U8LJv;I1TQG#@+KaSM;qLu{8l51rrZhf}_^Kgw=S5Li77kZvSN!Z#Bv;DJys2H-m zm3uHx$eB+^&g|e5u;!4sgsp`G#~L}9_nB^LWl=i2N6$iz#PQgWKWvN#s<1(!*iatQ4Khp6$bX--TvPE#wJnLLN<65 z8}WmwOO7WTHp&wl-UB)0T!I`n0F@+c$VW+g$YDcPv4KXAL*_1W*dSJH=n;uDyZ<i9mQ`$?Gj;eAA3h^g4P zTHS8Vv<#eKYldBp%ue{kKP*h7U38lbfyKr?LANDmfq&~8z5{F~4*J8!M?oDj6;xp= zHX;`ribYhMOm+8_^#1>*EjF|l8`A}Ckw+)u&HfUx|E}m9bMX4pb(@(9QV zp82iFtbU?ZDO6wme;+eOIHQ-d#9mJzk*skKAD${Kvp&&ZhQd^2o^IJFU=?yBMMIv) zp8cJJkMdIStjUz>fnMP7lBw0+Zsk{LAO5=(8(nODH_M|pUxbeRox{c-vve<*bf}{e z_je8(p-fTJc00EH)xr zpRT4h)Z#}Qe&K3B$ou{O)_T_gD3H(OJ)2ZfC&M?1YXjLt1s_`4JvbMDNOyltwQLtB66 zuu4r(_XGVziZdun%2vdmL1}AaqOc*~GKU)I-aEh}Z*QW8!zB|s34N@RzuaTX0v$GPr^8PN(`}O=P;u1}R+Qa?aH<|GhEC(fTrrygI>CHLtqZQc@M${XJli(p*<@LJ5hN&r5ymJ(V3Cr zImQNyLjiIe!w9qS9oevP$dOD0HXC$$`Wm? zMW@zLrlKB&_+rVkbr3@Yb_Fsegd_b6!s+D=-0@kCJhc`?=bkbeNlOXA zDUs#~KpZaWQAz2FI;^MEMcg`A?cHih=FqGS)Ku!wh0WB(4zgrdu@NobMs<@(iI0yF zo!Lh95jEXKr6q?@$#grlS@dcfWg^0XMNRbKK5U{_N?jk!yxby9g$5%=t9e3vR9s4E zd`wJuXo`7oObh~Qlc?Y3alt83)57CJqDgv6ym@j$@boxy5(qsdJT^g;aGx?zCU+RD zlt^@iN!@iHI(U>(b|UYa==A?8>{?@^sG@LAOKTe+MFe?l7uwP`A#vJnDFq_sVT{p# znD_{Wn9S}D%fNQGbawmTk5v+*h93yZA2d-fHh9rjVoO{l>_nv$1Irq+N@}2Ld75g?zU%SJ4*ofEKzn( zdNgi`T#F|7-@wFeZbkrE=|t3MwE(fodr!hIQ+?FLCzuL(u!mmcqJAv;$9)ti44aAC zNHfp&QyCBUQz}#NB~9h={b|f$^8n)GmtH!?u^!sX&-K&mTzC!*`}=5pX67p@&fDPk z8Jyu~@Z18T!M|Uis*QeCSHQ6)eaNWn@!Y+DkVD|C$j2RtA29g$ z2WTD7FMvPPPlZp`!-De)L=A5XhkkPp^niSWJx!w_@K@9bJs0Yko%XYA|DqiUVfQED&*~ayXP`Rxo!gCe(f?H z&BxUw^TKyjo(E;M9c~U%37;9HRUSsQ=ed~6hH%_=rHi>|h>AEqaK9Rf(Y|6yCaKZ#Uj|g}V6O6?&^c4vV48;j5Hh#_ycL>Mol^byVxTW0H=SI*95B zqwF;gA&K*zvb}AJQk&4^TwsvZq;8{E8(v+NLRG+x4%13;?0-!-Sa}j_N%m`jNQ!-%9C`!;*?h z*SIv)ysckA@dR1V5zE1m*aq4*M4bnM;6JciP23=jIqWRq) zaMCsZpaK5qNBX{6c}_l-JCO`~w*NdltQvL5)8p?c diff --git a/data-grid.scss b/data-grid.scss index 9b737ef..a850dcc 100644 --- a/data-grid.scss +++ b/data-grid.scss @@ -1,6 +1,6 @@ -@import "scss/_core"; -@import "scss/_rtl"; -@import "scss/_menu"; -@import "scss/_actions"; -@import "scss/_resizer"; -@import "scss/_responsive"; \ No newline at end of file +@use "scss/_core"; +@use "scss/_rtl"; +@use "scss/_menu"; +@use "scss/_actions"; +@use "scss/_resizer"; +@use "scss/_responsive"; diff --git a/dist/data-grid.css b/dist/data-grid.css index dc324a6..f51457d 100644 --- a/dist/data-grid.css +++ b/dist/data-grid.css @@ -1,5 +1,5 @@ /** - * Data Grid Web Component v2.0.11 + * Data Grid Web Component v2.0.11 * https://github.com/lekoala/data-grid */ @keyframes dataGridShow { @@ -19,6 +19,8 @@ data-grid { --color-rgb: var(--bs-primary-rgb, 13, 110, 253); --color: rgb(var(--color-rgb)); --highlight-color: #fffcee; + --body-background: var(--bs-table-bg, #fff); + --striped-background: rgba(0, 0, 0, 0.05); --header-background: var(--bs-gray-200, #e9ecef); --header-color: var(--bs-dark, #212529); --input-background: var(--bs-body-bg, #ffffff); @@ -91,7 +93,7 @@ data-grid table { width: 100%; max-width: 100%; white-space: normal; - background: var(--header-background); + background: var(--body-background); } data-grid thead, data-grid tfoot { @@ -344,7 +346,7 @@ data-grid tbody tr { border-bottom: solid 1px var(--row-border-color); } data-grid tbody tr:nth-child(even) { - background-color: var(--bs-table-striped-bg, #f8f9fa); + background-color: var(--striped-background); } data-grid tbody tr:hover { background-color: var(--highlight-color) !important; @@ -436,14 +438,13 @@ data-grid [aria-sort=descending]:after { [data-bs-theme=dark] data-grid { --scroller-color-lightness: 20%; --highlight-color: #43423e; + --body-background: #212529; + --striped-background: #2c3034; --header-background: var(--bs-gray-800, #34373b); --header-color: var(--bs-light, #e9ecef); --body-color: var(--bs-body-color, #494e53); --row-border-color: var(--bs-gray-900, #212325); } -[data-bs-theme=dark] data-grid tbody tr:nth-child(even) { - background-color: var(--bs-table-striped-bg, #2c3034); -} data-grid[dir=rtl] th, data-grid[dir=rtl] td { diff --git a/dist/data-grid.css.map b/dist/data-grid.css.map index ca729aa..7de2261 100644 --- a/dist/data-grid.css.map +++ b/dist/data-grid.css.map @@ -1 +1 @@ -{"version":3,"sources":["../scss/_core.scss","data-grid.css","../scss/_rtl.scss","../scss/_menu.scss","../scss/_actions.scss","../scss/_resizer.scss","../scss/_responsive.scss"],"names":[],"mappings":"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","file":"data-grid.css","sourcesContent":["/**\r\n * Data Grid Web Component v2.0.11 \r\n * https://github.com/lekoala/data-grid\r\n */\r\n\r\n@keyframes dataGridShow {\r\n 0% {\r\n opacity: 1;\r\n }\r\n\r\n 100% {\r\n opacity: 0.5;\r\n }\r\n}\r\n\r\ndata-grid {\r\n --padding: 0.5rem;\r\n --padding-x: 0.75rem;\r\n --padding-y: 0.5rem;\r\n --padding-y-header: 0.75rem;\r\n --padding-half: calc(var(--padding) / 2);\r\n --color-rgb: var(--bs-primary-rgb, 13, 110, 253);\r\n --color: rgb(var(--color-rgb));\r\n\r\n --highlight-color: #fffcee;\r\n --header-background: var(--bs-gray-200, #e9ecef);\r\n --header-color: var(--bs-dark, #212529);\r\n --input-background: var(--bs-body-bg, #ffffff);\r\n --input-border-color: var(--bs-border-color, #e9ecef);\r\n --btn-background: var(--bs-body-bg, #ffffff);\r\n --btn-color: var(--color);\r\n --btn-border-color: var(--bs-border-color, #e9ecef);\r\n --body-bg: var(--bs-body-bg, #212529);\r\n --body-color: var(--bs-body-color, #212529);\r\n --icon-scale: 1;\r\n --border-radius: 0.25rem;\r\n --row-border-color: #f2f2f2;\r\n --responsive-width: 60%;\r\n\r\n --black: var(--bs-black, #000);\r\n --white: var(--bs-white, #fff);\r\n --gray: var(--bs-gray, #6c757d);\r\n --gray-dark: var(--bs-gray-dark, #343a40);\r\n --gray-100: var(--bs-gray-100, #f8f9fa);\r\n --gray-200: var(--bs-gray-200, #e9ecef);\r\n --gray-300: var(--bs-gray-300, #dee2e6);\r\n --gray-400: var(--bs-gray-400, #ced4da);\r\n --gray-500: var(--bs-gray-500, #adb5bd);\r\n --gray-600: var(--bs-gray-600, #6c757d);\r\n --gray-700: var(--bs-gray-700, #495057);\r\n --gray-800: var(--bs-gray-800, #343a40);\r\n --gray-900: var(--bs-gray-900, #212529);\r\n\r\n display: block;\r\n min-height: 6rem;\r\n position: relative;\r\n\r\n // When used with fixed height, have a nice scrollbar\r\n & {\r\n --scroller-color: 0, 0%;\r\n --scroller-color-lightness: 80%;\r\n --scroller-hover-factor: 0.8;\r\n --scroller-thumb: hsl(var(--scroller-color), var(--scroller-color-lightness));\r\n /* Replicate hover for webkit */\r\n --scroller-thumb-hover: hsl(var(--scroller-color), calc(var(--scroller-color-lightness) * var(--scroller-hover-factor)));\r\n --scroller-background: transparent;\r\n scrollbar-color: var(--scroller-thumb) var(--scroller-background);\r\n scrollbar-width: thin;\r\n\r\n &::-webkit-scrollbar {\r\n width: 8px;\r\n height: 8px;\r\n }\r\n\r\n &::-webkit-scrollbar-track {\r\n background: transparent;\r\n }\r\n\r\n &::-webkit-scrollbar-thumb {\r\n background: var(--scroller-thumb);\r\n }\r\n\r\n &::-webkit-scrollbar-thumb:hover {\r\n background: var(--scroller-thumb-hover);\r\n }\r\n }\r\n\r\n // Hides column header row when it's not populated\r\n > table {\r\n &[role=grid] {\r\n tr.dg-head-columns:is(:empty, :has(>:first-child:not([scope=col]))) {\r\n display: none;\r\n }\r\n }\r\n }\r\n\r\n img {\r\n border: none;\r\n height: auto;\r\n max-width: 100%;\r\n vertical-align: middle;\r\n }\r\n\r\n [hidden] {\r\n display: none;\r\n }\r\n\r\n table {\r\n display: table;\r\n // Table and column widths are set by the widths of table and col elements\r\n // or by the width of the first row of cells. Cells in subsequent rows do not affect column widths.\r\n table-layout: fixed;\r\n width: 100%;\r\n max-width: 100%;\r\n white-space: normal;\r\n // Background needs to be on the table, not on the component in case the table overflows the component\r\n background: var(--header-background);\r\n }\r\n\r\n thead,\r\n tfoot {\r\n background-color: var(--header-background);\r\n color: var(--header-color);\r\n }\r\n\r\n &.dg-loading {\r\n &:not(.dg-initialized) {\r\n\r\n thead,\r\n tfoot {\r\n background: none;\r\n }\r\n }\r\n\r\n tbody {\r\n animation-name: dataGridShow;\r\n animation-timing-function: ease-in;\r\n animation-fill-mode: forwards;\r\n animation-duration: 0.3s; // only triggers after 300ms\r\n pointer-events: none; // disable clicks while loading\r\n }\r\n\r\n &:not(:has(th)) { \r\n tfoot {\r\n display: none;\r\n }\r\n }\r\n }\r\n\r\n tr {\r\n position: relative;\r\n }\r\n\r\n th,\r\n td {\r\n empty-cells: show;\r\n padding: var(--padding-y) var(--padding-x);\r\n text-align: left;\r\n\r\n &[tabindex] {\r\n outline: none;\r\n word-break: normal;\r\n }\r\n }\r\n\r\n th {\r\n font-weight: bold;\r\n padding: var(--padding-y-header) var(--padding-x);\r\n }\r\n\r\n // Prevent overflow on headers and cells\r\n th,\r\n td {\r\n position: relative;\r\n overflow: hidden;\r\n text-align: left;\r\n // These two properties keep content on one line\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n\r\n // Use this to allow content to flow over multiple lines\r\n &.dg-wrap {\r\n white-space: normal;\r\n word-break: break-all;\r\n }\r\n }\r\n\r\n // Expand on multiple lines on row click\r\n .dg-expandable {\r\n cursor: pointer;\r\n\r\n &.dg-expanded td {\r\n white-space: normal;\r\n word-break: break-all;\r\n }\r\n }\r\n\r\n .dg-clickable-cell {\r\n margin: 0;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n\r\n // Stick headers\r\n // https://css-tricks.com/making-tables-with-sticky-header-and-footers-got-a-bit-easier/\r\n &[sticky] table {\r\n\r\n thead,\r\n tfoot {\r\n z-index: 2;\r\n position: sticky;\r\n margin: 0;\r\n border: 0;\r\n }\r\n\r\n // Use silly value to prevent sub pixel alignment issue\r\n thead {\r\n inset-block-start: -1px;\r\n }\r\n\r\n tfoot {\r\n inset-block-end: -1px;\r\n }\r\n }\r\n\r\n // Pagination icons\r\n .dg-nav-icon,\r\n .dg-skip-icon {\r\n width: 22px;\r\n height: 22px;\r\n box-sizing: border-box;\r\n position: absolute;\r\n display: block;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%) scale(var(--icon-scale, 1));\r\n\r\n &:before,\r\n &:after {\r\n content: \"\";\r\n display: block;\r\n box-sizing: border-box;\r\n position: absolute;\r\n }\r\n }\r\n\r\n .dg-nav-icon::before {\r\n width: 0;\r\n height: 10px;\r\n border-top: 5px solid transparent;\r\n border-bottom: 5px solid transparent;\r\n border-left: 6px solid;\r\n top: 6px;\r\n left: 9px;\r\n }\r\n\r\n .dg-skip-icon {\r\n &::before {\r\n width: 3px;\r\n height: 10px;\r\n background: currentColor;\r\n top: 6px;\r\n left: 14px;\r\n }\r\n\r\n &::after {\r\n width: 0;\r\n height: 10px;\r\n border-top: 5px solid transparent;\r\n border-bottom: 5px solid transparent;\r\n border-left: 6px solid;\r\n top: 6px;\r\n left: 7px;\r\n }\r\n }\r\n\r\n .dg-rotate {\r\n transform: rotate(-180deg);\r\n }\r\n\r\n // Default actions buttons\r\n button {\r\n background-color: var(--btn-background);\r\n border: solid 1px var(--btn-border-color);\r\n border-radius: var(--border-radius);\r\n color: var(--body-color);\r\n height: 2rem;\r\n margin: 0 0.2rem;\r\n padding: 0 0.5rem;\r\n pointer-events: all;\r\n text-align: center;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n opacity: 0.7;\r\n }\r\n\r\n &:disabled:hover {\r\n background-color: inherit;\r\n border-color: inherit;\r\n }\r\n }\r\n\r\n // Form elements\r\n input[type=\"checkbox\"] {\r\n margin: 0;\r\n }\r\n\r\n input:not([type=\"checkbox\"]),\r\n select {\r\n background-color: var(--input-background, \"#fff\");\r\n color: currentColor;\r\n box-sizing: border-box;\r\n border: 1px solid var(--input-border-color, \"#f0f0f0\");\r\n border-radius: var(--border-radius);\r\n height: 2rem;\r\n margin: 0 0.2rem;\r\n padding: 0 var(--padding);\r\n max-width: none;\r\n }\r\n\r\n input:not([type=\"checkbox\"]),\r\n select,\r\n button {\r\n &:focus {\r\n box-shadow: 0 0 0 var(--padding-half) rgba(var(--color-rgb), 0.25);\r\n outline: 0;\r\n }\r\n\r\n &[disabled],\r\n &:disabled {\r\n opacity: 0.35;\r\n pointer-events: none;\r\n }\r\n }\r\n\r\n // Filters (2nd header row)\r\n thead tr:nth-child(2) th {\r\n padding: 0 2px 0 0;\r\n background-color: transparent;\r\n\r\n > * { \r\n width: 100%;\r\n border-radius: 0;\r\n margin: 0;\r\n }\r\n\r\n input {\r\n &:focus {\r\n box-shadow: inset 0px 0px 0px 1px var(--color);\r\n }\r\n }\r\n }\r\n\r\n // Editable\r\n tbody td.dg-editable-col {\r\n padding: 0;\r\n height: 0; // it needs a height for height 100%\r\n }\r\n\r\n tbody td input.dg-editable {\r\n width: 100%;\r\n background: transparent;\r\n border: 0;\r\n border-radius: 0;\r\n margin: 0;\r\n box-shadow: none;\r\n height: 100%;\r\n\r\n &:focus {\r\n box-shadow: inset 0px 0px 0px 1px var(--color);\r\n }\r\n }\r\n\r\n // Empty table or error message (don't use :empty as it would create fouc on load)\r\n &.dg-empty {\r\n tbody {\r\n height: 4rem;\r\n position: relative;\r\n\r\n &:before {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n content: attr(data-empty);\r\n transform: translate(-50%, -50%);\r\n opacity: 0.5;\r\n font-size: 1.5rem;\r\n text-align: center;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n overflow: hidden;\r\n width: 90%;\r\n }\r\n }\r\n\r\n tr {\r\n &.dg-fake-row {\r\n height: 4rem;\r\n border: none;\r\n }\r\n }\r\n\r\n &.dg-network-error {\r\n table {\r\n color: #842029;\r\n background-color: #f8d7da;\r\n border: 1px solid #f5c2c7;\r\n }\r\n\r\n tbody {\r\n height: auto;\r\n\r\n &:before {\r\n font-size: 2rem;\r\n top: auto;\r\n transform: translate(-50%);\r\n }\r\n\r\n tr:not(.dg-fake-row) {\r\n display: none;\r\n }\r\n }\r\n }\r\n\r\n &:not(.dg-network-error) {\r\n tbody {\r\n &:before {\r\n top: auto;\r\n transform: translate(-50%, 30%);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Zebra rows\r\n tbody tr {\r\n &:nth-child(even) {\r\n background-color: var(--bs-table-striped-bg, #f8f9fa);\r\n }\r\n\r\n border-bottom: solid 1px var(--row-border-color);\r\n\r\n &:hover {\r\n background-color: var(--highlight-color) !important;\r\n }\r\n\r\n &:focus {\r\n background-color: var(--highlight-color) !important;\r\n border-bottom-color: var(--highlight-color) !important;\r\n outline: none;\r\n }\r\n }\r\n\r\n // Meta footer\r\n tfoot {\r\n min-width: 280px;\r\n\r\n td {\r\n padding: var(--padding-y-header) var(--padding-x);\r\n }\r\n\r\n .dg-page-nav {\r\n display: flex;\r\n align-items: center;\r\n min-width: 160px;\r\n }\r\n\r\n .dg-input-page {\r\n width: 4rem;\r\n }\r\n\r\n .dg-footer {\r\n display: flex;\r\n align-items: center;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n }\r\n\r\n .dg-pagination {\r\n display: flex;\r\n text-align: center;\r\n\r\n button {\r\n // Fix icon inside button\r\n position: relative;\r\n width: 2rem;\r\n }\r\n }\r\n\r\n .dg-meta {\r\n // Prevent layout from jumping around\r\n min-width: 160px;\r\n text-align: right;\r\n }\r\n\r\n &.dg-footer-compact {\r\n .dg-meta {\r\n display: none;\r\n }\r\n\r\n .dg-input-page {\r\n display: none;\r\n }\r\n }\r\n }\r\n\r\n // Pagination in header\r\n [aria-sort] {\r\n cursor: pointer;\r\n padding-right: 1.5rem;\r\n }\r\n\r\n [aria-sort=\"none\"]:after,\r\n [aria-sort=\"none\"]:before,\r\n [aria-sort=\"ascending\"]:before,\r\n [aria-sort=\"descending\"]:after {\r\n right: 0.5rem;\r\n top: calc(50% - 0.5rem);\r\n border: solid transparent;\r\n content: \" \";\r\n height: 0;\r\n width: 0;\r\n position: absolute;\r\n border-color: rgba(0, 0, 0, 0);\r\n border-width: 0.25rem;\r\n margin-left: -0.25rem;\r\n }\r\n\r\n [aria-sort=\"none\"] {\r\n &:before {\r\n border-bottom-color: currentColor;\r\n opacity: 0.25;\r\n top: calc(50% - 0.6rem);\r\n }\r\n\r\n &:after {\r\n border-top-color: currentColor;\r\n opacity: 0.25;\r\n bottom: calc(50% - 0.5rem);\r\n top: auto;\r\n }\r\n }\r\n\r\n [aria-sort=\"ascending\"]:before {\r\n border-bottom-color: var(--body-color);\r\n opacity: 0.75;\r\n }\r\n\r\n [aria-sort=\"descending\"]:after {\r\n border-top-color: var(--body-color);\r\n opacity: 0.75;\r\n bottom: calc(50% - 0.5rem);\r\n top: auto;\r\n }\r\n}\r\n\r\n[data-bs-theme=\"dark\"] data-grid {\r\n --scroller-color-lightness: 20%;\r\n --highlight-color: #43423e;\r\n --header-background: var(--bs-gray-800, #34373b);\r\n --header-color: var(--bs-light, #e9ecef);\r\n --body-color: var(--bs-body-color, #494e53);\r\n --row-border-color: var(--bs-gray-900, #212325);\r\n\r\n tbody tr {\r\n &:nth-child(even) {\r\n background-color: var(--bs-table-striped-bg, #2c3034);\r\n }\r\n }\r\n}\r\n","/**\n * Data Grid Web Component v2.0.11 \n * https://github.com/lekoala/data-grid\n */\n@keyframes dataGridShow {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0.5;\n }\n}\ndata-grid {\n --padding: 0.5rem;\n --padding-x: 0.75rem;\n --padding-y: 0.5rem;\n --padding-y-header: 0.75rem;\n --padding-half: calc(var(--padding) / 2);\n --color-rgb: var(--bs-primary-rgb, 13, 110, 253);\n --color: rgb(var(--color-rgb));\n --highlight-color: #fffcee;\n --header-background: var(--bs-gray-200, #e9ecef);\n --header-color: var(--bs-dark, #212529);\n --input-background: var(--bs-body-bg, #ffffff);\n --input-border-color: var(--bs-border-color, #e9ecef);\n --btn-background: var(--bs-body-bg, #ffffff);\n --btn-color: var(--color);\n --btn-border-color: var(--bs-border-color, #e9ecef);\n --body-bg: var(--bs-body-bg, #212529);\n --body-color: var(--bs-body-color, #212529);\n --icon-scale: 1;\n --border-radius: 0.25rem;\n --row-border-color: #f2f2f2;\n --responsive-width: 60%;\n --black: var(--bs-black, #000);\n --white: var(--bs-white, #fff);\n --gray: var(--bs-gray, #6c757d);\n --gray-dark: var(--bs-gray-dark, #343a40);\n --gray-100: var(--bs-gray-100, #f8f9fa);\n --gray-200: var(--bs-gray-200, #e9ecef);\n --gray-300: var(--bs-gray-300, #dee2e6);\n --gray-400: var(--bs-gray-400, #ced4da);\n --gray-500: var(--bs-gray-500, #adb5bd);\n --gray-600: var(--bs-gray-600, #6c757d);\n --gray-700: var(--bs-gray-700, #495057);\n --gray-800: var(--bs-gray-800, #343a40);\n --gray-900: var(--bs-gray-900, #212529);\n display: block;\n min-height: 6rem;\n position: relative;\n}\ndata-grid {\n --scroller-color: 0, 0%;\n --scroller-color-lightness: 80%;\n --scroller-hover-factor: 0.8;\n --scroller-thumb: hsl(var(--scroller-color), var(--scroller-color-lightness));\n /* Replicate hover for webkit */\n --scroller-thumb-hover: hsl(var(--scroller-color), calc(var(--scroller-color-lightness) * var(--scroller-hover-factor)));\n --scroller-background: transparent;\n scrollbar-color: var(--scroller-thumb) var(--scroller-background);\n scrollbar-width: thin;\n}\ndata-grid::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\ndata-grid::-webkit-scrollbar-track {\n background: transparent;\n}\ndata-grid::-webkit-scrollbar-thumb {\n background: var(--scroller-thumb);\n}\ndata-grid::-webkit-scrollbar-thumb:hover {\n background: var(--scroller-thumb-hover);\n}\ndata-grid > table[role=grid] tr.dg-head-columns:is(:empty, :has(> :first-child:not([scope=col]))) {\n display: none;\n}\ndata-grid img {\n border: none;\n height: auto;\n max-width: 100%;\n vertical-align: middle;\n}\ndata-grid [hidden] {\n display: none;\n}\ndata-grid table {\n display: table;\n table-layout: fixed;\n width: 100%;\n max-width: 100%;\n white-space: normal;\n background: var(--header-background);\n}\ndata-grid thead,\ndata-grid tfoot {\n background-color: var(--header-background);\n color: var(--header-color);\n}\ndata-grid.dg-loading:not(.dg-initialized) thead,\ndata-grid.dg-loading:not(.dg-initialized) tfoot {\n background: none;\n}\ndata-grid.dg-loading tbody {\n animation-name: dataGridShow;\n animation-timing-function: ease-in;\n animation-fill-mode: forwards;\n animation-duration: 0.3s;\n pointer-events: none;\n}\ndata-grid.dg-loading:not(:has(th)) tfoot {\n display: none;\n}\ndata-grid tr {\n position: relative;\n}\ndata-grid th,\ndata-grid td {\n empty-cells: show;\n padding: var(--padding-y) var(--padding-x);\n text-align: left;\n}\ndata-grid th[tabindex],\ndata-grid td[tabindex] {\n outline: none;\n word-break: normal;\n}\ndata-grid th {\n font-weight: bold;\n padding: var(--padding-y-header) var(--padding-x);\n}\ndata-grid th,\ndata-grid td {\n position: relative;\n overflow: hidden;\n text-align: left;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\ndata-grid th.dg-wrap,\ndata-grid td.dg-wrap {\n white-space: normal;\n word-break: break-all;\n}\ndata-grid .dg-expandable {\n cursor: pointer;\n}\ndata-grid .dg-expandable.dg-expanded td {\n white-space: normal;\n word-break: break-all;\n}\ndata-grid .dg-clickable-cell {\n margin: 0;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n}\ndata-grid[sticky] table thead,\ndata-grid[sticky] table tfoot {\n z-index: 2;\n position: sticky;\n margin: 0;\n border: 0;\n}\ndata-grid[sticky] table thead {\n inset-block-start: -1px;\n}\ndata-grid[sticky] table tfoot {\n inset-block-end: -1px;\n}\ndata-grid .dg-nav-icon,\ndata-grid .dg-skip-icon {\n width: 22px;\n height: 22px;\n box-sizing: border-box;\n position: absolute;\n display: block;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(var(--icon-scale, 1));\n}\ndata-grid .dg-nav-icon:before, data-grid .dg-nav-icon:after,\ndata-grid .dg-skip-icon:before,\ndata-grid .dg-skip-icon:after {\n content: \"\";\n display: block;\n box-sizing: border-box;\n position: absolute;\n}\ndata-grid .dg-nav-icon::before {\n width: 0;\n height: 10px;\n border-top: 5px solid transparent;\n border-bottom: 5px solid transparent;\n border-left: 6px solid;\n top: 6px;\n left: 9px;\n}\ndata-grid .dg-skip-icon::before {\n width: 3px;\n height: 10px;\n background: currentColor;\n top: 6px;\n left: 14px;\n}\ndata-grid .dg-skip-icon::after {\n width: 0;\n height: 10px;\n border-top: 5px solid transparent;\n border-bottom: 5px solid transparent;\n border-left: 6px solid;\n top: 6px;\n left: 7px;\n}\ndata-grid .dg-rotate {\n transform: rotate(-180deg);\n}\ndata-grid button {\n background-color: var(--btn-background);\n border: solid 1px var(--btn-border-color);\n border-radius: var(--border-radius);\n color: var(--body-color);\n height: 2rem;\n margin: 0 0.2rem;\n padding: 0 0.5rem;\n pointer-events: all;\n text-align: center;\n cursor: pointer;\n}\ndata-grid button:hover {\n opacity: 0.7;\n}\ndata-grid button:disabled:hover {\n background-color: inherit;\n border-color: inherit;\n}\ndata-grid input[type=checkbox] {\n margin: 0;\n}\ndata-grid input:not([type=checkbox]),\ndata-grid select {\n background-color: var(--input-background, \"#fff\");\n color: currentColor;\n box-sizing: border-box;\n border: 1px solid var(--input-border-color, \"#f0f0f0\");\n border-radius: var(--border-radius);\n height: 2rem;\n margin: 0 0.2rem;\n padding: 0 var(--padding);\n max-width: none;\n}\ndata-grid input:not([type=checkbox]):focus,\ndata-grid select:focus,\ndata-grid button:focus {\n box-shadow: 0 0 0 var(--padding-half) rgba(var(--color-rgb), 0.25);\n outline: 0;\n}\ndata-grid input:not([type=checkbox])[disabled], data-grid input:not([type=checkbox]):disabled,\ndata-grid select[disabled],\ndata-grid select:disabled,\ndata-grid button[disabled],\ndata-grid button:disabled {\n opacity: 0.35;\n pointer-events: none;\n}\ndata-grid thead tr:nth-child(2) th {\n padding: 0 2px 0 0;\n background-color: transparent;\n}\ndata-grid thead tr:nth-child(2) th > * {\n width: 100%;\n border-radius: 0;\n margin: 0;\n}\ndata-grid thead tr:nth-child(2) th input:focus {\n box-shadow: inset 0px 0px 0px 1px var(--color);\n}\ndata-grid tbody td.dg-editable-col {\n padding: 0;\n height: 0;\n}\ndata-grid tbody td input.dg-editable {\n width: 100%;\n background: transparent;\n border: 0;\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n height: 100%;\n}\ndata-grid tbody td input.dg-editable:focus {\n box-shadow: inset 0px 0px 0px 1px var(--color);\n}\ndata-grid.dg-empty tbody {\n height: 4rem;\n position: relative;\n}\ndata-grid.dg-empty tbody:before {\n position: absolute;\n top: 50%;\n left: 50%;\n content: attr(data-empty);\n transform: translate(-50%, -50%);\n opacity: 0.5;\n font-size: 1.5rem;\n text-align: center;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n width: 90%;\n}\ndata-grid.dg-empty tr.dg-fake-row {\n height: 4rem;\n border: none;\n}\ndata-grid.dg-empty.dg-network-error table {\n color: #842029;\n background-color: #f8d7da;\n border: 1px solid #f5c2c7;\n}\ndata-grid.dg-empty.dg-network-error tbody {\n height: auto;\n}\ndata-grid.dg-empty.dg-network-error tbody:before {\n font-size: 2rem;\n top: auto;\n transform: translate(-50%);\n}\ndata-grid.dg-empty.dg-network-error tbody tr:not(.dg-fake-row) {\n display: none;\n}\ndata-grid.dg-empty:not(.dg-network-error) tbody:before {\n top: auto;\n transform: translate(-50%, 30%);\n}\ndata-grid tbody tr {\n border-bottom: solid 1px var(--row-border-color);\n}\ndata-grid tbody tr:nth-child(even) {\n background-color: var(--bs-table-striped-bg, #f8f9fa);\n}\ndata-grid tbody tr:hover {\n background-color: var(--highlight-color) !important;\n}\ndata-grid tbody tr:focus {\n background-color: var(--highlight-color) !important;\n border-bottom-color: var(--highlight-color) !important;\n outline: none;\n}\ndata-grid tfoot {\n min-width: 280px;\n}\ndata-grid tfoot td {\n padding: var(--padding-y-header) var(--padding-x);\n}\ndata-grid tfoot .dg-page-nav {\n display: flex;\n align-items: center;\n min-width: 160px;\n}\ndata-grid tfoot .dg-input-page {\n width: 4rem;\n}\ndata-grid tfoot .dg-footer {\n display: flex;\n align-items: center;\n flex-direction: row;\n justify-content: space-between;\n}\ndata-grid tfoot .dg-pagination {\n display: flex;\n text-align: center;\n}\ndata-grid tfoot .dg-pagination button {\n position: relative;\n width: 2rem;\n}\ndata-grid tfoot .dg-meta {\n min-width: 160px;\n text-align: right;\n}\ndata-grid tfoot.dg-footer-compact .dg-meta {\n display: none;\n}\ndata-grid tfoot.dg-footer-compact .dg-input-page {\n display: none;\n}\ndata-grid [aria-sort] {\n cursor: pointer;\n padding-right: 1.5rem;\n}\ndata-grid [aria-sort=none]:after,\ndata-grid [aria-sort=none]:before,\ndata-grid [aria-sort=ascending]:before,\ndata-grid [aria-sort=descending]:after {\n right: 0.5rem;\n top: calc(50% - 0.5rem);\n border: solid transparent;\n content: \" \";\n height: 0;\n width: 0;\n position: absolute;\n border-color: rgba(0, 0, 0, 0);\n border-width: 0.25rem;\n margin-left: -0.25rem;\n}\ndata-grid [aria-sort=none]:before {\n border-bottom-color: currentColor;\n opacity: 0.25;\n top: calc(50% - 0.6rem);\n}\ndata-grid [aria-sort=none]:after {\n border-top-color: currentColor;\n opacity: 0.25;\n bottom: calc(50% - 0.5rem);\n top: auto;\n}\ndata-grid [aria-sort=ascending]:before {\n border-bottom-color: var(--body-color);\n opacity: 0.75;\n}\ndata-grid [aria-sort=descending]:after {\n border-top-color: var(--body-color);\n opacity: 0.75;\n bottom: calc(50% - 0.5rem);\n top: auto;\n}\n\n[data-bs-theme=dark] data-grid {\n --scroller-color-lightness: 20%;\n --highlight-color: #43423e;\n --header-background: var(--bs-gray-800, #34373b);\n --header-color: var(--bs-light, #e9ecef);\n --body-color: var(--bs-body-color, #494e53);\n --row-border-color: var(--bs-gray-900, #212325);\n}\n[data-bs-theme=dark] data-grid tbody tr:nth-child(even) {\n background-color: var(--bs-table-striped-bg, #2c3034);\n}\n\ndata-grid[dir=rtl] th,\ndata-grid[dir=rtl] td {\n text-align: right;\n}\ndata-grid[dir=rtl] [aria-sort] {\n padding-left: 1rem;\n padding-right: 0.5rem;\n}\ndata-grid[dir=rtl] [aria-sort=none]:after,\ndata-grid[dir=rtl] [aria-sort=none]:before,\ndata-grid[dir=rtl] [aria-sort=ascending]:before,\ndata-grid[dir=rtl] [aria-sort=descending]:after {\n left: 0.75rem;\n right: auto;\n}\ndata-grid[dir=rtl] tfoot .dg-meta {\n text-align: left;\n}\n\ndata-grid .dg-menu {\n position: absolute;\n z-index: 3;\n background: var(--body-bg);\n list-style: none;\n max-width: 150px;\n margin: 0;\n padding: var(--padding);\n box-shadow: 0 0 1rem rgba(0, 0, 0, 0.25);\n border-radius: var(--border-radius);\n}\ndata-grid .dg-menu li {\n margin: 0;\n padding: 0;\n}\ndata-grid .dg-menu label {\n display: flex;\n align-items: center;\n margin-bottom: 0.25em;\n}\ndata-grid .dg-menu input {\n margin-right: 0.5em;\n}\n\ndata-grid .dg-actions {\n text-overflow: initial;\n width: 100px;\n text-align: right;\n white-space: nowrap !important;\n}\ndata-grid .dg-actions button {\n margin: 0;\n}\ndata-grid .dg-actions button + button {\n margin-left: 0.5rem;\n}\ndata-grid .dg-actions .dg-actions-toggle {\n display: none;\n width: calc(100px - var(--padding-x) * 2);\n}\ndata-grid .dg-actions.dg-actions-1 {\n width: 100%;\n}\ndata-grid .dg-actions.dg-actions-2 button {\n width: calc(50% - 0.25rem);\n}\ndata-grid .dg-actions.dg-actions-more button {\n display: none;\n}\ndata-grid .dg-actions.dg-actions-more button.dg-actions-toggle {\n display: inline-block;\n}\ndata-grid .dg-actions.dg-actions-expand {\n position: absolute;\n right: 0;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n width: 100%;\n height: 100%;\n}\ndata-grid .dg-actions.dg-actions-expand.dg-actions-more {\n width: 100%;\n}\ndata-grid .dg-actions.dg-actions-expand.dg-actions-more button {\n display: inline-block;\n}\ndata-grid tr.dg-actionable {\n cursor: pointer;\n}\ndata-grid tr.dg-actionable:hover td {\n background-color: var(--highlight-color);\n}\n\ndata-grid .dg-resizer {\n position: absolute;\n top: 0;\n right: 0;\n width: 6px;\n z-index: 2;\n cursor: col-resize;\n user-select: none;\n}\ndata-grid .dg-resizer:before {\n content: \"\";\n display: block;\n position: absolute;\n top: var(--padding-y-header);\n height: 1.5rem;\n right: 0;\n width: 2px;\n background: var(--body-color);\n opacity: 0.2;\n}\ndata-grid .dg-resizer:hover:before {\n opacity: 0.6;\n}\ndata-grid .dg-resizer.dg-resizer-active {\n border-right: 1px dashed var(--color);\n}\ndata-grid .dg-resizer.dg-resizer-active:before {\n opacity: 0.6;\n}\n\ndata-grid .dg-responsive-toggle {\n padding: 0;\n text-align: center;\n}\ndata-grid .dg-responsive-child-row > td {\n padding: 0;\n}\ndata-grid .dg-responsive-table {\n table-layout: auto;\n border: 0;\n}\ndata-grid .dg-responsive-table td,\ndata-grid .dg-responsive-table th {\n white-space: normal;\n}\ndata-grid .dg-responsive-table th {\n max-width: 40%;\n}\n\n@media only screen and (max-width: 767px) {\n data-grid[responsive] .dg-resizer {\n display: none;\n }\n data-grid[responsive] .dg-meta {\n display: none;\n }\n data-grid[responsive] .dg-input-page {\n display: none;\n }\n data-grid[responsive] table,\n data-grid[responsive] tbody,\n data-grid[responsive] tfoot,\n data-grid[responsive] th,\n data-grid[responsive] td,\n data-grid[responsive] tr:not([hidden]) {\n display: block;\n }\n data-grid[responsive] thead {\n display: flex;\n border-bottom: 2px solid var(--header-background);\n }\n data-grid[responsive] thead > tr {\n flex-grow: 1;\n }\n data-grid[responsive] thead th {\n width: auto;\n }\n data-grid[responsive] tbody tr {\n padding: 0;\n border: 1px solid var(--header-background);\n }\n data-grid[responsive] tbody td {\n border: none;\n border-bottom: 1px solid var(--row-border-color);\n position: relative;\n padding-left: calc(100% - var(--responsive-width) - var(--padding) * 2);\n }\n data-grid[responsive] tbody td:last-child {\n border: 0;\n }\n data-grid[responsive] tbody td:before {\n position: absolute;\n top: 0;\n left: 0;\n padding: var(--padding);\n width: calc(100% - var(--responsive-width) - var(--padding) * 4);\n content: attr(data-name);\n display: block;\n font-weight: bold;\n background-color: var(--header-background);\n }\n data-grid[responsive] tbody td[role=gridcell] {\n padding-left: calc(100% - var(--responsive-width) - var(--padding) * 4 + 0.5rem);\n }\n data-grid[responsive] .dg-selectable {\n height: 28px;\n margin: 2px 1px 2px;\n }\n data-grid[responsive] td.dg-selectable::before, data-grid[responsive] td.dg-actions::before {\n padding: 0;\n }\n data-grid[responsive] td.dg-selectable label {\n padding: 5px;\n }\n data-grid[responsive] td[role=gridcell] {\n min-height: 35px;\n width: auto;\n }\n data-grid[responsive] td[data-name]::before {\n height: 100%;\n }\n data-grid[responsive] td.dg-actions {\n padding-left: inherit;\n width: inherit;\n }\n data-grid[responsive] .dg-actions button {\n width: inherit !important;\n }\n data-grid[responsive] tr.dg-head-columns {\n padding: 0;\n width: calc(100% - var(--responsive-width) - var(--padding) * 4);\n }\n data-grid[responsive] tr.dg-head-columns th[role=\"columnheader button\"] {\n padding: 0.36em 1.3em 0.36em 0.75em;\n }\n data-grid[responsive] tr.dg-head-filters {\n background: transparent;\n vertical-align: top;\n padding: 0;\n width: calc(100% - (100% - var(--responsive-width) - var(--padding) * 4));\n }\n data-grid[responsive] .dg-head-filters th input:not([type=checkbox], [type=radio]) {\n height: 2.25em;\n }\n data-grid[responsive] .dg-head-filters th.dg-selectable {\n background: transparent;\n }\n data-grid[responsive] .dg-head-filters th.dg-selectable label::before {\n content: \"Column Filters\";\n }\n data-grid[responsive] tfoot .dg-page-nav {\n min-width: revert;\n }\n data-grid[data-responsive=true] tfoot .dg-page-nav {\n min-width: revert;\n }\n}\n\n/*# sourceMappingURL=data-grid.css.map */\n","data-grid {\r\n &[dir=\"rtl\"] {\r\n th,\r\n td {\r\n text-align: right;\r\n }\r\n [aria-sort] {\r\n padding-left: 1rem;\r\n padding-right: 0.5rem;\r\n }\r\n [aria-sort=\"none\"]:after,\r\n [aria-sort=\"none\"]:before,\r\n [aria-sort=\"ascending\"]:before,\r\n [aria-sort=\"descending\"]:after {\r\n left: 0.75rem;\r\n right: auto;\r\n }\r\n tfoot .dg-meta {\r\n text-align: left;\r\n }\r\n }\r\n}\r\n","data-grid {\r\n .dg-menu {\r\n position: absolute;\r\n z-index: 3;\r\n background: var(--body-bg);\r\n list-style: none;\r\n max-width: 150px;\r\n margin: 0;\r\n padding: var(--padding);\r\n box-shadow: 0 0 1rem rgba(0, 0, 0, 0.25);\r\n border-radius: var(--border-radius);\r\n\r\n li {\r\n margin: 0;\r\n padding: 0;\r\n }\r\n label {\r\n display: flex;\r\n align-items: center;\r\n margin-bottom: 0.25em;\r\n }\r\n input {\r\n margin-right: 0.5em;\r\n }\r\n }\r\n}\r\n","data-grid {\r\n .dg-actions {\r\n text-overflow: initial;\r\n width: 100px;\r\n text-align: right;\r\n white-space: nowrap !important;\r\n\r\n button {\r\n margin: 0;\r\n\r\n + button {\r\n margin-left: 0.5rem;\r\n }\r\n }\r\n .dg-actions-toggle {\r\n display: none;\r\n width: calc(100px - var(--padding-x) * 2);\r\n }\r\n &.dg-actions-1 {\r\n width: 100%;\r\n }\r\n // This needs icons to work\r\n &.dg-actions-2 button {\r\n width: calc(50% - 0.25rem);\r\n }\r\n &.dg-actions-more button {\r\n display: none;\r\n\r\n &.dg-actions-toggle {\r\n display: inline-block;\r\n }\r\n }\r\n &.dg-actions-expand {\r\n position: absolute;\r\n right: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n width: 100%;\r\n height: 100%;\r\n }\r\n &.dg-actions-expand.dg-actions-more {\r\n width: 100%;\r\n\r\n button {\r\n display: inline-block;\r\n }\r\n }\r\n }\r\n tr.dg-actionable {\r\n cursor: pointer;\r\n\r\n &:hover td {\r\n background-color: var(--highlight-color);\r\n }\r\n }\r\n}\r\n","data-grid {\r\n .dg-resizer {\r\n position: absolute;\r\n top: 0;\r\n right: 0;\r\n width: 6px; // clickable zone\r\n z-index: 2;\r\n cursor: col-resize;\r\n user-select: none;\r\n\r\n &:before {\r\n content: \"\";\r\n display: block;\r\n position: absolute;\r\n top: var(--padding-y-header);\r\n height: 1.5rem;\r\n right: 0;\r\n width: 2px;\r\n background: var(--body-color);\r\n opacity: 0.2;\r\n }\r\n &:hover:before {\r\n opacity: 0.6;\r\n }\r\n &.dg-resizer-active {\r\n border-right: 1px dashed var(--color);\r\n\r\n &:before {\r\n opacity: 0.6;\r\n }\r\n }\r\n }\r\n}\r\n","data-grid {\n .dg-responsive-toggle {\n padding: 0;\n text-align: center;\n }\n .dg-responsive-child-row > td {\n padding: 0;\n }\n .dg-responsive-table {\n table-layout: auto;\n border: 0;\n\n td,\n th {\n white-space: normal;\n }\n\n th {\n max-width: 40%;\n }\n }\n}\n\n// CSS Only responsive\n@media only screen and (max-width: 767px) {\n data-grid[responsive] {\n // Doesn't make any sense to resize\n .dg-resizer {\n display: none;\n }\n\n // more compact footer\n .dg-meta {\n display: none;\n }\n .dg-input-page {\n display: none;\n }\n\n // everything as blocks\n table,\n tbody,\n tfoot,\n th,\n td,\n tr:not([hidden]) {\n display: block;\n }\n\n // use flex for thead\n thead {\n display: flex;\n\n > tr {\n flex-grow: 1;\n }\n th {\n width: auto;\n }\n\n border-bottom: 2px solid var(--header-background);\n }\n\n // use pseudo element to display column name\n tbody {\n tr {\n padding: 0;\n border: 1px solid var(--header-background);\n }\n td {\n border: none;\n border-bottom: 1px solid var(--row-border-color);\n position: relative;\n padding-left: calc(100% - var(--responsive-width) - var(--padding) * 2);\n\n &:last-child {\n border: 0;\n }\n &:before {\n position: absolute;\n top: 0;\n left: 0;\n padding: var(--padding);\n width: calc(100% - var(--responsive-width) - var(--padding) * 4);\n content: attr(data-name);\n display: block;\n font-weight: bold;\n background-color: var(--header-background);\n }\n &[role=\"gridcell\"] {\n padding-left: calc(100% - var(--responsive-width) - var(--padding) * 4 + 0.5rem);\n }\n }\n }\n\n // give selectable some room\n .dg-selectable {\n height: 28px;\n margin: 2px 1px 2px;\n }\n\n td {\n &.dg-selectable::before,\n &.dg-actions::before {\n padding: 0;\n }\n &.dg-selectable label {\n padding: 5px;\n }\n &[role=\"gridcell\"] {\n min-height: 35px;\n width: auto;\n }\n &[data-name]::before {\n height: 100%;\n }\n &.dg-actions {\n padding-left: inherit;\n width: inherit;\n }\n }\n .dg-actions button {\n width: inherit !important;\n }\n tr {\n &.dg-head-columns {\n padding: 0;\n width: calc(100% - var(--responsive-width) - var(--padding) * 4);\n\n th[role=\"columnheader button\"] {\n padding: 0.36em 1.3em 0.36em 0.75em;\n }\n }\n &.dg-head-filters {\n background: transparent;\n vertical-align: top;\n padding: 0;\n width: calc(100% - (100% - var(--responsive-width) - var(--padding) * 4));\n }\n }\n .dg-head-filters th input:not([type=\"checkbox\"], [type=\"radio\"]) {\n height: 2.25em;\n }\n .dg-head-filters th.dg-selectable {\n background: transparent;\n }\n .dg-head-filters th.dg-selectable label::before {\n content: \"Column Filters\";\n }\n\n tfoot .dg-page-nav {\n min-width: revert;\n }\n }\n\n data-grid[data-responsive=true] {\n tfoot .dg-page-nav {\n min-width: revert;\n } \n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../scss/_core.scss","data-grid.css","../scss/_rtl.scss","../scss/_menu.scss","../scss/_actions.scss","../scss/_resizer.scss","../scss/_responsive.scss"],"names":[],"mappings":"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","file":"data-grid.css","sourcesContent":["/**\n * Data Grid Web Component v2.0.11\n * https://github.com/lekoala/data-grid\n */\n\n@keyframes dataGridShow {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0.5;\n }\n}\n\ndata-grid {\n --padding: 0.5rem;\n --padding-x: 0.75rem;\n --padding-y: 0.5rem;\n --padding-y-header: 0.75rem;\n --padding-half: calc(var(--padding) / 2);\n --color-rgb: var(--bs-primary-rgb, 13, 110, 253);\n --color: rgb(var(--color-rgb));\n\n --highlight-color: #fffcee;\n --body-background: var(--bs-table-bg, #fff);\n --striped-background: rgba(0, 0, 0, 0.05);\n --header-background: var(--bs-gray-200, #e9ecef);\n --header-color: var(--bs-dark, #212529);\n --input-background: var(--bs-body-bg, #ffffff);\n --input-border-color: var(--bs-border-color, #e9ecef);\n --btn-background: var(--bs-body-bg, #ffffff);\n --btn-color: var(--color);\n --btn-border-color: var(--bs-border-color, #e9ecef);\n --body-bg: var(--bs-body-bg, #212529);\n --body-color: var(--bs-body-color, #212529);\n --icon-scale: 1;\n --border-radius: 0.25rem;\n --row-border-color: #f2f2f2;\n --responsive-width: 60%;\n\n --black: var(--bs-black, #000);\n --white: var(--bs-white, #fff);\n --gray: var(--bs-gray, #6c757d);\n --gray-dark: var(--bs-gray-dark, #343a40);\n --gray-100: var(--bs-gray-100, #f8f9fa);\n --gray-200: var(--bs-gray-200, #e9ecef);\n --gray-300: var(--bs-gray-300, #dee2e6);\n --gray-400: var(--bs-gray-400, #ced4da);\n --gray-500: var(--bs-gray-500, #adb5bd);\n --gray-600: var(--bs-gray-600, #6c757d);\n --gray-700: var(--bs-gray-700, #495057);\n --gray-800: var(--bs-gray-800, #343a40);\n --gray-900: var(--bs-gray-900, #212529);\n\n display: block;\n min-height: 6rem;\n position: relative;\n\n // When used with fixed height, have a nice scrollbar\n & {\n --scroller-color: 0, 0%;\n --scroller-color-lightness: 80%;\n --scroller-hover-factor: 0.8;\n --scroller-thumb: hsl(var(--scroller-color), var(--scroller-color-lightness));\n /* Replicate hover for webkit */\n --scroller-thumb-hover: hsl(var(--scroller-color), calc(var(--scroller-color-lightness) * var(--scroller-hover-factor)));\n --scroller-background: transparent;\n scrollbar-color: var(--scroller-thumb) var(--scroller-background);\n scrollbar-width: thin;\n\n &::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n\n &::-webkit-scrollbar-track {\n background: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n background: var(--scroller-thumb);\n }\n\n &::-webkit-scrollbar-thumb:hover {\n background: var(--scroller-thumb-hover);\n }\n }\n\n // Hides column header row when it's not populated\n > table {\n &[role=grid] {\n tr.dg-head-columns:is(:empty, :has(>:first-child:not([scope=col]))) {\n display: none;\n }\n }\n }\n\n img {\n border: none;\n height: auto;\n max-width: 100%;\n vertical-align: middle;\n }\n\n [hidden] {\n display: none;\n }\n\n table {\n display: table;\n // Table and column widths are set by the widths of table and col elements\n // or by the width of the first row of cells. Cells in subsequent rows do not affect column widths.\n table-layout: fixed;\n width: 100%;\n max-width: 100%;\n white-space: normal;\n // Background needs to be on the table, not on the component in case the table overflows the component\n background: var(--body-background);\n }\n\n thead,\n tfoot {\n background-color: var(--header-background);\n color: var(--header-color);\n }\n\n &.dg-loading {\n &:not(.dg-initialized) {\n\n thead,\n tfoot {\n background: none;\n }\n }\n\n tbody {\n animation-name: dataGridShow;\n animation-timing-function: ease-in;\n animation-fill-mode: forwards;\n animation-duration: 0.3s; // only triggers after 300ms\n pointer-events: none; // disable clicks while loading\n }\n\n &:not(:has(th)) {\n tfoot {\n display: none;\n }\n }\n }\n\n tr {\n position: relative;\n }\n\n th,\n td {\n empty-cells: show;\n padding: var(--padding-y) var(--padding-x);\n text-align: left;\n\n &[tabindex] {\n outline: none;\n word-break: normal;\n }\n }\n\n th {\n font-weight: bold;\n padding: var(--padding-y-header) var(--padding-x);\n }\n\n // Prevent overflow on headers and cells\n th,\n td {\n position: relative;\n overflow: hidden;\n text-align: left;\n // These two properties keep content on one line\n text-overflow: ellipsis;\n white-space: nowrap;\n\n // Use this to allow content to flow over multiple lines\n &.dg-wrap {\n white-space: normal;\n word-break: break-all;\n }\n }\n\n // Expand on multiple lines on row click\n .dg-expandable {\n cursor: pointer;\n\n &.dg-expanded td {\n white-space: normal;\n word-break: break-all;\n }\n }\n\n .dg-clickable-cell {\n margin: 0;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n // Stick headers\n // https://css-tricks.com/making-tables-with-sticky-header-and-footers-got-a-bit-easier/\n &[sticky] table {\n\n thead,\n tfoot {\n z-index: 2;\n position: sticky;\n margin: 0;\n border: 0;\n }\n\n // Use silly value to prevent sub pixel alignment issue\n thead {\n inset-block-start: -1px;\n }\n\n tfoot {\n inset-block-end: -1px;\n }\n }\n\n // Pagination icons\n .dg-nav-icon,\n .dg-skip-icon {\n width: 22px;\n height: 22px;\n box-sizing: border-box;\n position: absolute;\n display: block;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(var(--icon-scale, 1));\n\n &:before,\n &:after {\n content: \"\";\n display: block;\n box-sizing: border-box;\n position: absolute;\n }\n }\n\n .dg-nav-icon::before {\n width: 0;\n height: 10px;\n border-top: 5px solid transparent;\n border-bottom: 5px solid transparent;\n border-left: 6px solid;\n top: 6px;\n left: 9px;\n }\n\n .dg-skip-icon {\n &::before {\n width: 3px;\n height: 10px;\n background: currentColor;\n top: 6px;\n left: 14px;\n }\n\n &::after {\n width: 0;\n height: 10px;\n border-top: 5px solid transparent;\n border-bottom: 5px solid transparent;\n border-left: 6px solid;\n top: 6px;\n left: 7px;\n }\n }\n\n .dg-rotate {\n transform: rotate(-180deg);\n }\n\n // Default actions buttons\n button {\n background-color: var(--btn-background);\n border: solid 1px var(--btn-border-color);\n border-radius: var(--border-radius);\n color: var(--body-color);\n height: 2rem;\n margin: 0 0.2rem;\n padding: 0 0.5rem;\n pointer-events: all;\n text-align: center;\n cursor: pointer;\n\n &:hover {\n opacity: 0.7;\n }\n\n &:disabled:hover {\n background-color: inherit;\n border-color: inherit;\n }\n }\n\n // Form elements\n input[type=\"checkbox\"] {\n margin: 0;\n }\n\n input:not([type=\"checkbox\"]),\n select {\n background-color: var(--input-background, \"#fff\");\n color: currentColor;\n box-sizing: border-box;\n border: 1px solid var(--input-border-color, \"#f0f0f0\");\n border-radius: var(--border-radius);\n height: 2rem;\n margin: 0 0.2rem;\n padding: 0 var(--padding);\n max-width: none;\n }\n\n input:not([type=\"checkbox\"]),\n select,\n button {\n &:focus {\n box-shadow: 0 0 0 var(--padding-half) rgba(var(--color-rgb), 0.25);\n outline: 0;\n }\n\n &[disabled],\n &:disabled {\n opacity: 0.35;\n pointer-events: none;\n }\n }\n\n // Filters (2nd header row)\n thead tr:nth-child(2) th {\n padding: 0 2px 0 0;\n background-color: transparent;\n\n > * {\n width: 100%;\n border-radius: 0;\n margin: 0;\n }\n\n input {\n &:focus {\n box-shadow: inset 0px 0px 0px 1px var(--color);\n }\n }\n }\n\n // Editable\n tbody td.dg-editable-col {\n padding: 0;\n height: 0; // it needs a height for height 100%\n }\n\n tbody td input.dg-editable {\n width: 100%;\n background: transparent;\n border: 0;\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n height: 100%;\n\n &:focus {\n box-shadow: inset 0px 0px 0px 1px var(--color);\n }\n }\n\n // Empty table or error message (don't use :empty as it would create fouc on load)\n &.dg-empty {\n tbody {\n height: 4rem;\n position: relative;\n\n &:before {\n position: absolute;\n top: 50%;\n left: 50%;\n content: attr(data-empty);\n transform: translate(-50%, -50%);\n opacity: 0.5;\n font-size: 1.5rem;\n text-align: center;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n width: 90%;\n }\n }\n\n tr {\n &.dg-fake-row {\n height: 4rem;\n border: none;\n }\n }\n\n &.dg-network-error {\n table {\n color: #842029;\n background-color: #f8d7da;\n border: 1px solid #f5c2c7;\n }\n\n tbody {\n height: auto;\n\n &:before {\n font-size: 2rem;\n top: auto;\n transform: translate(-50%);\n }\n\n tr:not(.dg-fake-row) {\n display: none;\n }\n }\n }\n\n &:not(.dg-network-error) {\n tbody {\n &:before {\n top: auto;\n transform: translate(-50%, 30%);\n }\n }\n }\n }\n\n // Zebra/striped rows\n tbody tr {\n &:nth-child(even) {\n background-color: var(--striped-background);\n }\n\n border-bottom: solid 1px var(--row-border-color);\n\n &:hover {\n background-color: var(--highlight-color) !important;\n }\n\n &:focus {\n background-color: var(--highlight-color) !important;\n border-bottom-color: var(--highlight-color) !important;\n outline: none;\n }\n }\n\n // Meta footer\n tfoot {\n min-width: 280px;\n\n td {\n padding: var(--padding-y-header) var(--padding-x);\n }\n\n .dg-page-nav {\n display: flex;\n align-items: center;\n min-width: 160px;\n }\n\n .dg-input-page {\n width: 4rem;\n }\n\n .dg-footer {\n display: flex;\n align-items: center;\n flex-direction: row;\n justify-content: space-between;\n }\n\n .dg-pagination {\n display: flex;\n text-align: center;\n\n button {\n // Fix icon inside button\n position: relative;\n width: 2rem;\n }\n }\n\n .dg-meta {\n // Prevent layout from jumping around\n min-width: 160px;\n text-align: right;\n }\n\n &.dg-footer-compact {\n .dg-meta {\n display: none;\n }\n\n .dg-input-page {\n display: none;\n }\n }\n }\n\n // Pagination in header\n [aria-sort] {\n cursor: pointer;\n padding-right: 1.5rem;\n }\n\n [aria-sort=\"none\"]:after,\n [aria-sort=\"none\"]:before,\n [aria-sort=\"ascending\"]:before,\n [aria-sort=\"descending\"]:after {\n right: 0.5rem;\n top: calc(50% - 0.5rem);\n border: solid transparent;\n content: \" \";\n height: 0;\n width: 0;\n position: absolute;\n border-color: rgba(0, 0, 0, 0);\n border-width: 0.25rem;\n margin-left: -0.25rem;\n }\n\n [aria-sort=\"none\"] {\n &:before {\n border-bottom-color: currentColor;\n opacity: 0.25;\n top: calc(50% - 0.6rem);\n }\n\n &:after {\n border-top-color: currentColor;\n opacity: 0.25;\n bottom: calc(50% - 0.5rem);\n top: auto;\n }\n }\n\n [aria-sort=\"ascending\"]:before {\n border-bottom-color: var(--body-color);\n opacity: 0.75;\n }\n\n [aria-sort=\"descending\"]:after {\n border-top-color: var(--body-color);\n opacity: 0.75;\n bottom: calc(50% - 0.5rem);\n top: auto;\n }\n}\n\n[data-bs-theme=\"dark\"] data-grid {\n --scroller-color-lightness: 20%;\n --highlight-color: #43423e;\n --body-background: #212529;\n --striped-background: #2c3034;\n --header-background: var(--bs-gray-800, #34373b);\n --header-color: var(--bs-light, #e9ecef);\n --body-color: var(--bs-body-color, #494e53);\n --row-border-color: var(--bs-gray-900, #212325);\n}\n\n","/**\n * Data Grid Web Component v2.0.11\n * https://github.com/lekoala/data-grid\n */\n@keyframes dataGridShow {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0.5;\n }\n}\ndata-grid {\n --padding: 0.5rem;\n --padding-x: 0.75rem;\n --padding-y: 0.5rem;\n --padding-y-header: 0.75rem;\n --padding-half: calc(var(--padding) / 2);\n --color-rgb: var(--bs-primary-rgb, 13, 110, 253);\n --color: rgb(var(--color-rgb));\n --highlight-color: #fffcee;\n --body-background: var(--bs-table-bg, #fff);\n --striped-background: rgba(0, 0, 0, 0.05);\n --header-background: var(--bs-gray-200, #e9ecef);\n --header-color: var(--bs-dark, #212529);\n --input-background: var(--bs-body-bg, #ffffff);\n --input-border-color: var(--bs-border-color, #e9ecef);\n --btn-background: var(--bs-body-bg, #ffffff);\n --btn-color: var(--color);\n --btn-border-color: var(--bs-border-color, #e9ecef);\n --body-bg: var(--bs-body-bg, #212529);\n --body-color: var(--bs-body-color, #212529);\n --icon-scale: 1;\n --border-radius: 0.25rem;\n --row-border-color: #f2f2f2;\n --responsive-width: 60%;\n --black: var(--bs-black, #000);\n --white: var(--bs-white, #fff);\n --gray: var(--bs-gray, #6c757d);\n --gray-dark: var(--bs-gray-dark, #343a40);\n --gray-100: var(--bs-gray-100, #f8f9fa);\n --gray-200: var(--bs-gray-200, #e9ecef);\n --gray-300: var(--bs-gray-300, #dee2e6);\n --gray-400: var(--bs-gray-400, #ced4da);\n --gray-500: var(--bs-gray-500, #adb5bd);\n --gray-600: var(--bs-gray-600, #6c757d);\n --gray-700: var(--bs-gray-700, #495057);\n --gray-800: var(--bs-gray-800, #343a40);\n --gray-900: var(--bs-gray-900, #212529);\n display: block;\n min-height: 6rem;\n position: relative;\n}\ndata-grid {\n --scroller-color: 0, 0%;\n --scroller-color-lightness: 80%;\n --scroller-hover-factor: 0.8;\n --scroller-thumb: hsl(var(--scroller-color), var(--scroller-color-lightness));\n /* Replicate hover for webkit */\n --scroller-thumb-hover: hsl(var(--scroller-color), calc(var(--scroller-color-lightness) * var(--scroller-hover-factor)));\n --scroller-background: transparent;\n scrollbar-color: var(--scroller-thumb) var(--scroller-background);\n scrollbar-width: thin;\n}\ndata-grid::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\ndata-grid::-webkit-scrollbar-track {\n background: transparent;\n}\ndata-grid::-webkit-scrollbar-thumb {\n background: var(--scroller-thumb);\n}\ndata-grid::-webkit-scrollbar-thumb:hover {\n background: var(--scroller-thumb-hover);\n}\ndata-grid > table[role=grid] tr.dg-head-columns:is(:empty, :has(> :first-child:not([scope=col]))) {\n display: none;\n}\ndata-grid img {\n border: none;\n height: auto;\n max-width: 100%;\n vertical-align: middle;\n}\ndata-grid [hidden] {\n display: none;\n}\ndata-grid table {\n display: table;\n table-layout: fixed;\n width: 100%;\n max-width: 100%;\n white-space: normal;\n background: var(--body-background);\n}\ndata-grid thead,\ndata-grid tfoot {\n background-color: var(--header-background);\n color: var(--header-color);\n}\ndata-grid.dg-loading:not(.dg-initialized) thead,\ndata-grid.dg-loading:not(.dg-initialized) tfoot {\n background: none;\n}\ndata-grid.dg-loading tbody {\n animation-name: dataGridShow;\n animation-timing-function: ease-in;\n animation-fill-mode: forwards;\n animation-duration: 0.3s;\n pointer-events: none;\n}\ndata-grid.dg-loading:not(:has(th)) tfoot {\n display: none;\n}\ndata-grid tr {\n position: relative;\n}\ndata-grid th,\ndata-grid td {\n empty-cells: show;\n padding: var(--padding-y) var(--padding-x);\n text-align: left;\n}\ndata-grid th[tabindex],\ndata-grid td[tabindex] {\n outline: none;\n word-break: normal;\n}\ndata-grid th {\n font-weight: bold;\n padding: var(--padding-y-header) var(--padding-x);\n}\ndata-grid th,\ndata-grid td {\n position: relative;\n overflow: hidden;\n text-align: left;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\ndata-grid th.dg-wrap,\ndata-grid td.dg-wrap {\n white-space: normal;\n word-break: break-all;\n}\ndata-grid .dg-expandable {\n cursor: pointer;\n}\ndata-grid .dg-expandable.dg-expanded td {\n white-space: normal;\n word-break: break-all;\n}\ndata-grid .dg-clickable-cell {\n margin: 0;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n}\ndata-grid[sticky] table thead,\ndata-grid[sticky] table tfoot {\n z-index: 2;\n position: sticky;\n margin: 0;\n border: 0;\n}\ndata-grid[sticky] table thead {\n inset-block-start: -1px;\n}\ndata-grid[sticky] table tfoot {\n inset-block-end: -1px;\n}\ndata-grid .dg-nav-icon,\ndata-grid .dg-skip-icon {\n width: 22px;\n height: 22px;\n box-sizing: border-box;\n position: absolute;\n display: block;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(var(--icon-scale, 1));\n}\ndata-grid .dg-nav-icon:before, data-grid .dg-nav-icon:after,\ndata-grid .dg-skip-icon:before,\ndata-grid .dg-skip-icon:after {\n content: \"\";\n display: block;\n box-sizing: border-box;\n position: absolute;\n}\ndata-grid .dg-nav-icon::before {\n width: 0;\n height: 10px;\n border-top: 5px solid transparent;\n border-bottom: 5px solid transparent;\n border-left: 6px solid;\n top: 6px;\n left: 9px;\n}\ndata-grid .dg-skip-icon::before {\n width: 3px;\n height: 10px;\n background: currentColor;\n top: 6px;\n left: 14px;\n}\ndata-grid .dg-skip-icon::after {\n width: 0;\n height: 10px;\n border-top: 5px solid transparent;\n border-bottom: 5px solid transparent;\n border-left: 6px solid;\n top: 6px;\n left: 7px;\n}\ndata-grid .dg-rotate {\n transform: rotate(-180deg);\n}\ndata-grid button {\n background-color: var(--btn-background);\n border: solid 1px var(--btn-border-color);\n border-radius: var(--border-radius);\n color: var(--body-color);\n height: 2rem;\n margin: 0 0.2rem;\n padding: 0 0.5rem;\n pointer-events: all;\n text-align: center;\n cursor: pointer;\n}\ndata-grid button:hover {\n opacity: 0.7;\n}\ndata-grid button:disabled:hover {\n background-color: inherit;\n border-color: inherit;\n}\ndata-grid input[type=checkbox] {\n margin: 0;\n}\ndata-grid input:not([type=checkbox]),\ndata-grid select {\n background-color: var(--input-background, \"#fff\");\n color: currentColor;\n box-sizing: border-box;\n border: 1px solid var(--input-border-color, \"#f0f0f0\");\n border-radius: var(--border-radius);\n height: 2rem;\n margin: 0 0.2rem;\n padding: 0 var(--padding);\n max-width: none;\n}\ndata-grid input:not([type=checkbox]):focus,\ndata-grid select:focus,\ndata-grid button:focus {\n box-shadow: 0 0 0 var(--padding-half) rgba(var(--color-rgb), 0.25);\n outline: 0;\n}\ndata-grid input:not([type=checkbox])[disabled], data-grid input:not([type=checkbox]):disabled,\ndata-grid select[disabled],\ndata-grid select:disabled,\ndata-grid button[disabled],\ndata-grid button:disabled {\n opacity: 0.35;\n pointer-events: none;\n}\ndata-grid thead tr:nth-child(2) th {\n padding: 0 2px 0 0;\n background-color: transparent;\n}\ndata-grid thead tr:nth-child(2) th > * {\n width: 100%;\n border-radius: 0;\n margin: 0;\n}\ndata-grid thead tr:nth-child(2) th input:focus {\n box-shadow: inset 0px 0px 0px 1px var(--color);\n}\ndata-grid tbody td.dg-editable-col {\n padding: 0;\n height: 0;\n}\ndata-grid tbody td input.dg-editable {\n width: 100%;\n background: transparent;\n border: 0;\n border-radius: 0;\n margin: 0;\n box-shadow: none;\n height: 100%;\n}\ndata-grid tbody td input.dg-editable:focus {\n box-shadow: inset 0px 0px 0px 1px var(--color);\n}\ndata-grid.dg-empty tbody {\n height: 4rem;\n position: relative;\n}\ndata-grid.dg-empty tbody:before {\n position: absolute;\n top: 50%;\n left: 50%;\n content: attr(data-empty);\n transform: translate(-50%, -50%);\n opacity: 0.5;\n font-size: 1.5rem;\n text-align: center;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n width: 90%;\n}\ndata-grid.dg-empty tr.dg-fake-row {\n height: 4rem;\n border: none;\n}\ndata-grid.dg-empty.dg-network-error table {\n color: #842029;\n background-color: #f8d7da;\n border: 1px solid #f5c2c7;\n}\ndata-grid.dg-empty.dg-network-error tbody {\n height: auto;\n}\ndata-grid.dg-empty.dg-network-error tbody:before {\n font-size: 2rem;\n top: auto;\n transform: translate(-50%);\n}\ndata-grid.dg-empty.dg-network-error tbody tr:not(.dg-fake-row) {\n display: none;\n}\ndata-grid.dg-empty:not(.dg-network-error) tbody:before {\n top: auto;\n transform: translate(-50%, 30%);\n}\ndata-grid tbody tr {\n border-bottom: solid 1px var(--row-border-color);\n}\ndata-grid tbody tr:nth-child(even) {\n background-color: var(--striped-background);\n}\ndata-grid tbody tr:hover {\n background-color: var(--highlight-color) !important;\n}\ndata-grid tbody tr:focus {\n background-color: var(--highlight-color) !important;\n border-bottom-color: var(--highlight-color) !important;\n outline: none;\n}\ndata-grid tfoot {\n min-width: 280px;\n}\ndata-grid tfoot td {\n padding: var(--padding-y-header) var(--padding-x);\n}\ndata-grid tfoot .dg-page-nav {\n display: flex;\n align-items: center;\n min-width: 160px;\n}\ndata-grid tfoot .dg-input-page {\n width: 4rem;\n}\ndata-grid tfoot .dg-footer {\n display: flex;\n align-items: center;\n flex-direction: row;\n justify-content: space-between;\n}\ndata-grid tfoot .dg-pagination {\n display: flex;\n text-align: center;\n}\ndata-grid tfoot .dg-pagination button {\n position: relative;\n width: 2rem;\n}\ndata-grid tfoot .dg-meta {\n min-width: 160px;\n text-align: right;\n}\ndata-grid tfoot.dg-footer-compact .dg-meta {\n display: none;\n}\ndata-grid tfoot.dg-footer-compact .dg-input-page {\n display: none;\n}\ndata-grid [aria-sort] {\n cursor: pointer;\n padding-right: 1.5rem;\n}\ndata-grid [aria-sort=none]:after,\ndata-grid [aria-sort=none]:before,\ndata-grid [aria-sort=ascending]:before,\ndata-grid [aria-sort=descending]:after {\n right: 0.5rem;\n top: calc(50% - 0.5rem);\n border: solid transparent;\n content: \" \";\n height: 0;\n width: 0;\n position: absolute;\n border-color: rgba(0, 0, 0, 0);\n border-width: 0.25rem;\n margin-left: -0.25rem;\n}\ndata-grid [aria-sort=none]:before {\n border-bottom-color: currentColor;\n opacity: 0.25;\n top: calc(50% - 0.6rem);\n}\ndata-grid [aria-sort=none]:after {\n border-top-color: currentColor;\n opacity: 0.25;\n bottom: calc(50% - 0.5rem);\n top: auto;\n}\ndata-grid [aria-sort=ascending]:before {\n border-bottom-color: var(--body-color);\n opacity: 0.75;\n}\ndata-grid [aria-sort=descending]:after {\n border-top-color: var(--body-color);\n opacity: 0.75;\n bottom: calc(50% - 0.5rem);\n top: auto;\n}\n\n[data-bs-theme=dark] data-grid {\n --scroller-color-lightness: 20%;\n --highlight-color: #43423e;\n --body-background: #212529;\n --striped-background: #2c3034;\n --header-background: var(--bs-gray-800, #34373b);\n --header-color: var(--bs-light, #e9ecef);\n --body-color: var(--bs-body-color, #494e53);\n --row-border-color: var(--bs-gray-900, #212325);\n}\n\ndata-grid[dir=rtl] th,\ndata-grid[dir=rtl] td {\n text-align: right;\n}\ndata-grid[dir=rtl] [aria-sort] {\n padding-left: 1rem;\n padding-right: 0.5rem;\n}\ndata-grid[dir=rtl] [aria-sort=none]:after,\ndata-grid[dir=rtl] [aria-sort=none]:before,\ndata-grid[dir=rtl] [aria-sort=ascending]:before,\ndata-grid[dir=rtl] [aria-sort=descending]:after {\n left: 0.75rem;\n right: auto;\n}\ndata-grid[dir=rtl] tfoot .dg-meta {\n text-align: left;\n}\n\ndata-grid .dg-menu {\n position: absolute;\n z-index: 3;\n background: var(--body-bg);\n list-style: none;\n max-width: 150px;\n margin: 0;\n padding: var(--padding);\n box-shadow: 0 0 1rem rgba(0, 0, 0, 0.25);\n border-radius: var(--border-radius);\n}\ndata-grid .dg-menu li {\n margin: 0;\n padding: 0;\n}\ndata-grid .dg-menu label {\n display: flex;\n align-items: center;\n margin-bottom: 0.25em;\n}\ndata-grid .dg-menu input {\n margin-right: 0.5em;\n}\n\ndata-grid .dg-actions {\n text-overflow: initial;\n width: 100px;\n text-align: right;\n white-space: nowrap !important;\n}\ndata-grid .dg-actions button {\n margin: 0;\n}\ndata-grid .dg-actions button + button {\n margin-left: 0.5rem;\n}\ndata-grid .dg-actions .dg-actions-toggle {\n display: none;\n width: calc(100px - var(--padding-x) * 2);\n}\ndata-grid .dg-actions.dg-actions-1 {\n width: 100%;\n}\ndata-grid .dg-actions.dg-actions-2 button {\n width: calc(50% - 0.25rem);\n}\ndata-grid .dg-actions.dg-actions-more button {\n display: none;\n}\ndata-grid .dg-actions.dg-actions-more button.dg-actions-toggle {\n display: inline-block;\n}\ndata-grid .dg-actions.dg-actions-expand {\n position: absolute;\n right: 0;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n width: 100%;\n height: 100%;\n}\ndata-grid .dg-actions.dg-actions-expand.dg-actions-more {\n width: 100%;\n}\ndata-grid .dg-actions.dg-actions-expand.dg-actions-more button {\n display: inline-block;\n}\ndata-grid tr.dg-actionable {\n cursor: pointer;\n}\ndata-grid tr.dg-actionable:hover td {\n background-color: var(--highlight-color);\n}\n\ndata-grid .dg-resizer {\n position: absolute;\n top: 0;\n right: 0;\n width: 6px;\n z-index: 2;\n cursor: col-resize;\n user-select: none;\n}\ndata-grid .dg-resizer:before {\n content: \"\";\n display: block;\n position: absolute;\n top: var(--padding-y-header);\n height: 1.5rem;\n right: 0;\n width: 2px;\n background: var(--body-color);\n opacity: 0.2;\n}\ndata-grid .dg-resizer:hover:before {\n opacity: 0.6;\n}\ndata-grid .dg-resizer.dg-resizer-active {\n border-right: 1px dashed var(--color);\n}\ndata-grid .dg-resizer.dg-resizer-active:before {\n opacity: 0.6;\n}\n\ndata-grid .dg-responsive-toggle {\n padding: 0;\n text-align: center;\n}\ndata-grid .dg-responsive-child-row > td {\n padding: 0;\n}\ndata-grid .dg-responsive-table {\n table-layout: auto;\n border: 0;\n}\ndata-grid .dg-responsive-table td,\ndata-grid .dg-responsive-table th {\n white-space: normal;\n}\ndata-grid .dg-responsive-table th {\n max-width: 40%;\n}\n\n@media only screen and (max-width: 767px) {\n data-grid[responsive] .dg-resizer {\n display: none;\n }\n data-grid[responsive] .dg-meta {\n display: none;\n }\n data-grid[responsive] .dg-input-page {\n display: none;\n }\n data-grid[responsive] table,\n data-grid[responsive] tbody,\n data-grid[responsive] tfoot,\n data-grid[responsive] th,\n data-grid[responsive] td,\n data-grid[responsive] tr:not([hidden]) {\n display: block;\n }\n data-grid[responsive] thead {\n display: flex;\n border-bottom: 2px solid var(--header-background);\n }\n data-grid[responsive] thead > tr {\n flex-grow: 1;\n }\n data-grid[responsive] thead th {\n width: auto;\n }\n data-grid[responsive] tbody tr {\n padding: 0;\n border: 1px solid var(--header-background);\n }\n data-grid[responsive] tbody td {\n border: none;\n border-bottom: 1px solid var(--row-border-color);\n position: relative;\n padding-left: calc(100% - var(--responsive-width) - var(--padding) * 2);\n }\n data-grid[responsive] tbody td:last-child {\n border: 0;\n }\n data-grid[responsive] tbody td:before {\n position: absolute;\n top: 0;\n left: 0;\n padding: var(--padding);\n width: calc(100% - var(--responsive-width) - var(--padding) * 4);\n content: attr(data-name);\n display: block;\n font-weight: bold;\n background-color: var(--header-background);\n }\n data-grid[responsive] tbody td[role=gridcell] {\n padding-left: calc(100% - var(--responsive-width) - var(--padding) * 4 + 0.5rem);\n }\n data-grid[responsive] .dg-selectable {\n height: 28px;\n margin: 2px 1px 2px;\n }\n data-grid[responsive] td.dg-selectable::before, data-grid[responsive] td.dg-actions::before {\n padding: 0;\n }\n data-grid[responsive] td.dg-selectable label {\n padding: 5px;\n }\n data-grid[responsive] td[role=gridcell] {\n min-height: 35px;\n width: auto;\n }\n data-grid[responsive] td[data-name]::before {\n height: 100%;\n }\n data-grid[responsive] td.dg-actions {\n padding-left: inherit;\n width: inherit;\n }\n data-grid[responsive] .dg-actions button {\n width: inherit !important;\n }\n data-grid[responsive] tr.dg-head-columns {\n padding: 0;\n width: calc(100% - var(--responsive-width) - var(--padding) * 4);\n }\n data-grid[responsive] tr.dg-head-columns th[role=\"columnheader button\"] {\n padding: 0.36em 1.3em 0.36em 0.75em;\n }\n data-grid[responsive] tr.dg-head-filters {\n background: transparent;\n vertical-align: top;\n padding: 0;\n width: calc(100% - (100% - var(--responsive-width) - var(--padding) * 4));\n }\n data-grid[responsive] .dg-head-filters th input:not([type=checkbox], [type=radio]) {\n height: 2.25em;\n }\n data-grid[responsive] .dg-head-filters th.dg-selectable {\n background: transparent;\n }\n data-grid[responsive] .dg-head-filters th.dg-selectable label::before {\n content: \"Column Filters\";\n }\n data-grid[responsive] tfoot .dg-page-nav {\n min-width: revert;\n }\n data-grid[data-responsive=true] tfoot .dg-page-nav {\n min-width: revert;\n }\n}\n\n/*# sourceMappingURL=data-grid.css.map */\n","data-grid {\r\n &[dir=\"rtl\"] {\r\n th,\r\n td {\r\n text-align: right;\r\n }\r\n [aria-sort] {\r\n padding-left: 1rem;\r\n padding-right: 0.5rem;\r\n }\r\n [aria-sort=\"none\"]:after,\r\n [aria-sort=\"none\"]:before,\r\n [aria-sort=\"ascending\"]:before,\r\n [aria-sort=\"descending\"]:after {\r\n left: 0.75rem;\r\n right: auto;\r\n }\r\n tfoot .dg-meta {\r\n text-align: left;\r\n }\r\n }\r\n}\r\n","data-grid {\r\n .dg-menu {\r\n position: absolute;\r\n z-index: 3;\r\n background: var(--body-bg);\r\n list-style: none;\r\n max-width: 150px;\r\n margin: 0;\r\n padding: var(--padding);\r\n box-shadow: 0 0 1rem rgba(0, 0, 0, 0.25);\r\n border-radius: var(--border-radius);\r\n\r\n li {\r\n margin: 0;\r\n padding: 0;\r\n }\r\n label {\r\n display: flex;\r\n align-items: center;\r\n margin-bottom: 0.25em;\r\n }\r\n input {\r\n margin-right: 0.5em;\r\n }\r\n }\r\n}\r\n","data-grid {\r\n .dg-actions {\r\n text-overflow: initial;\r\n width: 100px;\r\n text-align: right;\r\n white-space: nowrap !important;\r\n\r\n button {\r\n margin: 0;\r\n\r\n + button {\r\n margin-left: 0.5rem;\r\n }\r\n }\r\n .dg-actions-toggle {\r\n display: none;\r\n width: calc(100px - var(--padding-x) * 2);\r\n }\r\n &.dg-actions-1 {\r\n width: 100%;\r\n }\r\n // This needs icons to work\r\n &.dg-actions-2 button {\r\n width: calc(50% - 0.25rem);\r\n }\r\n &.dg-actions-more button {\r\n display: none;\r\n\r\n &.dg-actions-toggle {\r\n display: inline-block;\r\n }\r\n }\r\n &.dg-actions-expand {\r\n position: absolute;\r\n right: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n width: 100%;\r\n height: 100%;\r\n }\r\n &.dg-actions-expand.dg-actions-more {\r\n width: 100%;\r\n\r\n button {\r\n display: inline-block;\r\n }\r\n }\r\n }\r\n tr.dg-actionable {\r\n cursor: pointer;\r\n\r\n &:hover td {\r\n background-color: var(--highlight-color);\r\n }\r\n }\r\n}\r\n","data-grid {\r\n .dg-resizer {\r\n position: absolute;\r\n top: 0;\r\n right: 0;\r\n width: 6px; // clickable zone\r\n z-index: 2;\r\n cursor: col-resize;\r\n user-select: none;\r\n\r\n &:before {\r\n content: \"\";\r\n display: block;\r\n position: absolute;\r\n top: var(--padding-y-header);\r\n height: 1.5rem;\r\n right: 0;\r\n width: 2px;\r\n background: var(--body-color);\r\n opacity: 0.2;\r\n }\r\n &:hover:before {\r\n opacity: 0.6;\r\n }\r\n &.dg-resizer-active {\r\n border-right: 1px dashed var(--color);\r\n\r\n &:before {\r\n opacity: 0.6;\r\n }\r\n }\r\n }\r\n}\r\n","data-grid {\n .dg-responsive-toggle {\n padding: 0;\n text-align: center;\n }\n .dg-responsive-child-row > td {\n padding: 0;\n }\n .dg-responsive-table {\n table-layout: auto;\n border: 0;\n\n td,\n th {\n white-space: normal;\n }\n\n th {\n max-width: 40%;\n }\n }\n}\n\n// CSS Only responsive\n@media only screen and (max-width: 767px) {\n data-grid[responsive] {\n // Doesn't make any sense to resize\n .dg-resizer {\n display: none;\n }\n\n // more compact footer\n .dg-meta {\n display: none;\n }\n .dg-input-page {\n display: none;\n }\n\n // everything as blocks\n table,\n tbody,\n tfoot,\n th,\n td,\n tr:not([hidden]) {\n display: block;\n }\n\n // use flex for thead\n thead {\n display: flex;\n\n > tr {\n flex-grow: 1;\n }\n th {\n width: auto;\n }\n\n border-bottom: 2px solid var(--header-background);\n }\n\n // use pseudo element to display column name\n tbody {\n tr {\n padding: 0;\n border: 1px solid var(--header-background);\n }\n td {\n border: none;\n border-bottom: 1px solid var(--row-border-color);\n position: relative;\n padding-left: calc(100% - var(--responsive-width) - var(--padding) * 2);\n\n &:last-child {\n border: 0;\n }\n &:before {\n position: absolute;\n top: 0;\n left: 0;\n padding: var(--padding);\n width: calc(100% - var(--responsive-width) - var(--padding) * 4);\n content: attr(data-name);\n display: block;\n font-weight: bold;\n background-color: var(--header-background);\n }\n &[role=\"gridcell\"] {\n padding-left: calc(100% - var(--responsive-width) - var(--padding) * 4 + 0.5rem);\n }\n }\n }\n\n // give selectable some room\n .dg-selectable {\n height: 28px;\n margin: 2px 1px 2px;\n }\n\n td {\n &.dg-selectable::before,\n &.dg-actions::before {\n padding: 0;\n }\n &.dg-selectable label {\n padding: 5px;\n }\n &[role=\"gridcell\"] {\n min-height: 35px;\n width: auto;\n }\n &[data-name]::before {\n height: 100%;\n }\n &.dg-actions {\n padding-left: inherit;\n width: inherit;\n }\n }\n .dg-actions button {\n width: inherit !important;\n }\n tr {\n &.dg-head-columns {\n padding: 0;\n width: calc(100% - var(--responsive-width) - var(--padding) * 4);\n\n th[role=\"columnheader button\"] {\n padding: 0.36em 1.3em 0.36em 0.75em;\n }\n }\n &.dg-head-filters {\n background: transparent;\n vertical-align: top;\n padding: 0;\n width: calc(100% - (100% - var(--responsive-width) - var(--padding) * 4));\n }\n }\n .dg-head-filters th input:not([type=\"checkbox\"], [type=\"radio\"]) {\n height: 2.25em;\n }\n .dg-head-filters th.dg-selectable {\n background: transparent;\n }\n .dg-head-filters th.dg-selectable label::before {\n content: \"Column Filters\";\n }\n\n tfoot .dg-page-nav {\n min-width: revert;\n }\n }\n\n data-grid[data-responsive=true] {\n tfoot .dg-page-nav {\n min-width: revert;\n } \n }\n}\n"]} \ No newline at end of file diff --git a/dist/data-grid.js b/dist/data-grid.js index cbb1265..953b765 100644 --- a/dist/data-grid.js +++ b/dist/data-grid.js @@ -136,6 +136,7 @@ var BaseElement = class extends HTMLElement { super(); this.options = Object.assign({}, this.defaultOptions, this.normalizedDataset, options); this.log("constructor"); + this.setup = false; this.fireEvents = true; this._ready(); this.log("ready"); @@ -210,6 +211,10 @@ var BaseElement = class extends HTMLElement { _connected() { } connectedCallback() { + if (this.setup) { + return; + } + this.setup = true; setTimeout(() => { this.log("connectedCallback"); const template = document.createElement("template"); @@ -224,10 +229,18 @@ var BaseElement = class extends HTMLElement { */ _disconnected() { } + /** + * @link https://nolanlawson.com/2024/12/01/avoiding-unnecessary-cleanup-work-in-disconnectedcallback/ + */ disconnectedCallback() { - this.log("disconnectedCallback"); - this._disconnected(); - dispatch(this, "disconnected"); + setTimeout(() => { + if (!this.isConnected && this.setup) { + this.log("disconnectedCallback"); + this._disconnected(); + dispatch(this, "disconnected"); + this.setup = false; + } + }, 0); } /** * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#a-props-like-accessor @@ -683,17 +696,14 @@ var DataGrid = class _DataGrid extends base_element_default { }; } /** @returns {HTMLTableSectionElement} */ - //@ts-ignore get thead() { return $("thead", this); } /** @returns {HTMLTableSectionElement} */ - //@ts-ignore get tbody() { return $("tbody", this); } /** @returns {HTMLTableSectionElement} */ - //@ts-ignore get tfoot() { return $("tfoot", this); } diff --git a/dist/data-grid.js.map b/dist/data-grid.js.map index d446c54..41cd892 100644 --- a/dist/data-grid.js.map +++ b/dist/data-grid.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/utils/camelize.js", "../src/utils/normalizeData.js", "../src/utils/shortcuts.js", "../src/core/base-element.js", "../src/utils/addSelectOption.js", "../src/utils/appendParamsToUrl.js", "../src/utils/convertArray.js", "../src/utils/elementOffset.js", "../src/utils/interpolate.js", "../src/utils/getTextWidth.js", "../src/utils/randstr.js", "../src/utils/debounce.js", "../src/data-grid.js", "../src/core/base-plugin.js", "../src/plugins/column-resizer.js", "../src/utils/getParentElement.js", "../src/plugins/context-menu.js", "../src/plugins/draggable-headers.js", "../src/plugins/touch-support.js", "../src/plugins/selectable-rows.js", "../src/plugins/fixed-height.js", "../src/plugins/autosize-column.js", "../src/plugins/responsive-grid.js", "../src/plugins/row-actions.js", "../src/plugins/editable-column.js", "../src/plugins/spinner-support.js", "../src/plugins/save-state.js", "../data-grid.js"], - "sourcesContent": ["/**\n * @param {String} str\n * @returns {String}\n */\nexport default function camelize(str) {\n return str.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, (m, chr) => chr.toUpperCase());\n}\n", "/**\n * Parse data attribute and return properly typed data\n * @param {String} v\n * @returns {any}\n */\nexport default function normalizeData(v) {\n // Bool\n if (v === \"true\") {\n return true;\n }\n if (v === \"false\") {\n return false;\n }\n // Null or empty\n if (v === \"\" || v === \"null\") {\n return null;\n }\n // Numeric attributes\n if (v === Number(v).toString()) {\n return Number(v);\n }\n // Only attempt json parsing for array or objects\n if (v && [\"[\", \"{\"].includes(v.substring(0, 1))) {\n try {\n // In case we have only single quoted values, like ['one', 'two', 'three']\n let val = v;\n if (val.indexOf('\"') === -1) {\n val = val.replace(/'/g, '\"');\n }\n return JSON.parse(decodeURIComponent(val));\n } catch {\n console.error(`Failed to parse ${v}`);\n return {};\n }\n }\n return v;\n}\n", "/**\n * @typedef FlexibleHTMLProps\n * @property {boolean} [checked] (HTMLInputElement)\n * @property {string} [value] (HTMLInputElement)\n * @property {number} [rowHeight] (HTMLTableRowElement)\n *\n * A flexible type HTMLElement type that does not require using instanceof all over the place\n * Make sure that your selector is indeed valid\n * Only includes most commons props\n * @typedef {HTMLElement & FlexibleHTMLProps} FlexibleHTMLElement\n */\n\n/**\n * Keep this as reference for easy documentation\n * @typedef {HTMLElement&HTMLInputElement&HTMLTableRowElement} MixedHTMLElement\n */\n\n/**\n * @typedef FlexibleEventProps\n * @property {FlexibleHTMLElement} target\n * @property {FlexibleHTMLElement} currentTarget\n * @property {DataTransfer} [dataTransfer] (DragEvent)\n * @property {number} [clientX] (MouseEvent)\n * @property {number} [clientY] (MouseEvent)\n *\n * @typedef {Event & FlexibleEventProps} FlexibleEvent\n */\n\n/**\n * Keep this as reference for easy documentation\n * @typedef {Event&MouseEvent&InputEvent&DragEvent&FocusEvent&KeyboardEvent&PointerEvent} MixedEvent\n */\n\n/**\n * @callback FlexibleListener\n * @param {FlexibleEvent} event\n */\n\nclass FlexibleEventListenerObject {\n /**\n * @param {FlexibleEvent} e\n */\n handleEvent(e) {}\n}\n\nconst supportedPassiveTypes = [\n \"scroll\",\n \"wheel\",\n \"touchstart\",\n \"touchmove\",\n \"touchenter\",\n \"touchend\",\n \"touchleave\",\n \"mouseout\",\n \"mouseleave\",\n \"mouseup\",\n \"mousedown\",\n \"mousemove\",\n \"mouseenter\",\n \"mousewheel\",\n \"mouseover\",\n];\n\n/**\n * Automatically set passive options based on type\n * @param {string} type\n * @returns {AddEventListenerOptions}\n */\nfunction passiveOpts(type) {\n if (supportedPassiveTypes.includes(type)) {\n return { passive: true };\n }\n return {};\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n * @returns {any}\n */\nexport function getAttribute(el, name) {\n return el.getAttribute(name);\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n * @returns {Boolean}\n */\nexport function hasAttribute(el, name) {\n return el.hasAttribute(name);\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n * @param {any} v\n * @param {Boolean} check Prevent setting if attribute is already there\n */\nexport function setAttribute(el, name, v = \"\", check = false) {\n if (check && hasAttribute(el, name)) return;\n el.setAttribute(name, `${v}`);\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n */\nexport function removeAttribute(el, name) {\n if (hasAttribute(el, name)) {\n el.removeAttribute(name);\n }\n}\n\n/**\n * @param {EventTarget} el\n * @param {String} type\n * @param {EventListenerObject|FlexibleListener} listener\n */\nexport function on(el, type, listener) {\n el.addEventListener(type, listener, passiveOpts(type));\n}\n\n/**\n * @param {EventTarget} el\n * @param {String} type\n * @param {EventListenerObject|FlexibleListener} listener\n */\nexport function off(el, type, listener) {\n el.removeEventListener(type, listener, passiveOpts(type));\n}\n\n/**\n * @param {EventTarget} el\n * @param {String} type\n * @param {EventListenerObject|FlexibleListener} listener\n */\nexport function one(el, type, listener) {\n el.addEventListener(type, listener, {\n once: true,\n });\n}\n\n/**\n * @param {HTMLElement} el\n * @param {String} name\n * @param {any} data\n * @param {Boolean} bubbles\n */\nexport function dispatch(el, name, data = {}, bubbles = false) {\n const opts = {};\n if (bubbles) {\n opts.bubbles = true;\n }\n if (data) {\n opts.detail = data;\n }\n el.dispatchEvent(new CustomEvent(name, opts));\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n * @returns {Boolean}\n */\nexport function hasClass(el, name) {\n return el.classList.contains(name);\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n */\nexport function addClass(el, name) {\n el.classList.add(...name.split(\" \"));\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n */\nexport function removeClass(el, name) {\n el.classList.remove(...name.split(\" \"));\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n */\nexport function toggleClass(el, name) {\n el.classList.toggle(name);\n}\n\n/**\n * @param {String|HTMLElement} selector\n * @param {HTMLElement|Document} base\n * @returns {FlexibleHTMLElement|null}\n */\nexport function $(selector, base = document) {\n if (selector instanceof HTMLElement) {\n return selector;\n }\n return base.querySelector(selector);\n}\n\n/**\n * @param {String} selector\n * @param {Element|Document} base\n * @returns {Array}\n */\nexport function $$(selector, base = document) {\n return Array.from(base.querySelectorAll(selector));\n}\n\n/**\n * Easily retrieve untyped element\n * For actual type, prefer use of el.querySelector\n * @param {HTMLElement} el\n * @param {String|HTMLElement} selector\n * @returns {FlexibleHTMLElement}\n */\nexport function find(el, selector) {\n return $(selector, el);\n}\n\n/**\n * Easily retrieve untyped elements\n * For actual type, prefer use of el.querySelectorAll\n * @param {Element} el\n * @param {String} selector\n * @returns {Array}\n */\nexport function findAll(el, selector) {\n return $$(selector, el);\n}\n\n/**\n * @param {*} el\n * @returns {FlexibleHTMLElement}\n */\nexport function el(el) {\n return el;\n}\n\n/**\n * @template {keyof HTMLElementTagNameMap} K\n * @param {K} tagName\n * @param {HTMLElement} parent\n * @returns {HTMLElementTagNameMap[K]}\n */\nexport function ce(tagName, parent = null) {\n const el = document.createElement(tagName);\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n}\n\n/**\n * @param {HTMLElement} newNode\n * @param {HTMLElement} existingNode\n */\nexport function insertAfter(newNode, existingNode) {\n existingNode.parentNode.insertBefore(newNode, existingNode.nextSibling);\n}\n", "import camelize from \"../utils/camelize.js\";\nimport normalizeData from \"../utils/normalizeData.js\";\nimport { dispatch, getAttribute, setAttribute } from \"../utils/shortcuts.js\";\n\n/** @typedef {import('../data-grid').Options} Options */\n\n/**\n * Base element that does not contain any specific logic\n * related to this project but makes HTMLElemnt usable\n */\nclass BaseElement extends HTMLElement {\n /**\n * @param {Object} options\n */\n constructor(options = {}) {\n super();\n\n /** @type {Options} */\n this.options = Object.assign({}, this.defaultOptions, this.normalizedDataset, options);\n\n this.log(\"constructor\");\n\n this.fireEvents = true;\n this._ready();\n\n this.log(\"ready\");\n }\n\n get defaultOptions() {\n return {};\n }\n\n /**\n * @param {String} opt\n * @returns {any}\n */\n getOption(opt) {\n return this.options[opt];\n }\n\n /**\n * @param {String} opt\n * @param {any} v\n */\n setOption(opt, v) {\n setAttribute(this, `data-${opt}`, v);\n }\n\n /**\n * @param {String} opt\n */\n toggleOption(opt) {\n setAttribute(this, `data-${opt}`, !this.getOption(opt));\n }\n\n get normalizedDataset() {\n const jsonConfig = this.dataset.config ? JSON.parse(this.dataset.config) : {};\n const data = { ...this.dataset };\n for (const key in data) {\n if (key === \"config\") {\n continue;\n }\n data[key] = normalizeData(data[key]);\n }\n // Once normalized, merge into json config\n Object.assign(data, jsonConfig);\n return data;\n }\n\n /**\n * @returns {String}\n */\n static template() {\n return \"\";\n }\n\n /**\n * This is called at the end of constructor. Extend in subclass if needed.\n */\n _ready() {}\n\n /**\n * @param {String|Error} message\n */\n log(message) {\n if (this.options.debug) {\n console.log(`[${getAttribute(this, \"id\")}] ${message}`);\n }\n }\n\n /**\n * Handle events within the component\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#handling-events\n * @param {Event} event\n */\n handleEvent(event) {\n if (this[`on${event.type}`]) {\n this[`on${event.type}`](event);\n }\n }\n\n /**\n * This is called when connected. Extend in subclass if needed.\n */\n _connected() {}\n\n connectedCallback() {\n // ensure whenDefined callbacks run first\n setTimeout(() => {\n this.log(\"connectedCallback\");\n\n // Append only when labels had the opportunity to be set\n // Don't use shadow dom as it makes theming super hard\n const template = document.createElement(\"template\");\n // @ts-ignore\n template.innerHTML = this.constructor.template();\n this.appendChild(template.content.cloneNode(true));\n\n this._connected();\n // @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#life-cycle-events\n dispatch(this, \"connected\");\n }, 0);\n }\n\n /**\n * This is called when disconnected. Extend in subclass if needed.\n */\n _disconnected() {}\n\n disconnectedCallback() {\n this.log(\"disconnectedCallback\");\n this._disconnected();\n // @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#life-cycle-events\n dispatch(this, \"disconnected\");\n }\n\n /**\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#a-props-like-accessor\n * @returns {Object}\n */\n get transformAttributes() {\n return {};\n }\n\n /**\n * This is only meant to work with data attributes\n * This allows us to have properties that reflect automatically in the component\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#reflected-dataset-attributes\n * @param {String} attributeName\n * @param {String} oldValue\n * @param {String} newValue\n */\n attributeChangedCallback(attributeName, oldValue, newValue) {\n // It didn't change\n if (oldValue === newValue) {\n return;\n }\n\n this.log(`attributeChangedCallback: ${attributeName}`);\n\n let isOption = false;\n const transformer = this.transformAttributes[attributeName] ?? normalizeData;\n\n let attr = attributeName;\n // Data attributes are mapped to options while other attributes are mapped as properties\n if (attr.indexOf(\"data-\") === 0) {\n attr = attr.slice(5);\n isOption = true;\n }\n attr = camelize(attr);\n if (isOption) {\n this.options[attr] = transformer(newValue);\n } else {\n this[attr] = transformer(newValue);\n }\n\n // Fire internal event\n if (this.fireEvents && this[`${attr}Changed`]) {\n this[`${attr}Changed`]();\n }\n }\n}\n\nexport default BaseElement;\n", "/**\n * @param {HTMLSelectElement} el\n * @param {String} value\n * @param {String} label\n * @param {Boolean} checked\n */\nexport default function addSelectOption(el, value, label, checked = false) {\n const opt = document.createElement(\"option\");\n opt.value = `${value}`;\n if (checked) {\n opt.selected = true;\n }\n opt.label = label;\n el.appendChild(opt);\n}\n", "/**\n * @param {URL} url\n * @param {Object} params\n */\nexport default function appendParamsToUrl(url, params = {}) {\n for (const key of Object.keys(params)) {\n if (Array.isArray(params[key])) {\n for (const k of Object.keys(params[key])) {\n // @ts-ignore\n url.searchParams.append(isNaN(k) ? `${key}[${k}]` : key, params[key][k]);\n }\n } else {\n url.searchParams.append(key, params[key]);\n }\n }\n}\n", "/**\n * Force value as arrays\n * @param {String|Array} v\n * @returns {Array}\n */\nexport default function convertArray(v) {\n if (typeof v === \"string\") {\n if (v[0] === \"[\") {\n // \"['my', 'value']\" would fail as a json\n let bv = v;\n if (bv.indexOf('\"') === -1) {\n bv = bv.replace(/'/g, '\"');\n }\n return JSON.parse(bv);\n }\n\n return v.split(\",\");\n }\n if (!Array.isArray(v)) {\n console.error(\"Invalid array\", v);\n return [];\n }\n return v;\n}\n", "/**\n * @param {HTMLElement} el\n * @returns {Object}\n */\nexport default function elementOffset(el) {\n const rect = el.getBoundingClientRect();\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return { top: rect.top + scrollTop, left: rect.left + scrollLeft };\n}\n", "/**\n * Replace element within {} by their data value\n * @param {String} str\n * @param {Object} data\n * @returns {String}\n */\nexport default function interpolate(str, data) {\n return str.replace(/\\{([^}]+)?\\}/g, ($1, $2) => data[$2]);\n}\n", "let canvas;\n\n/**\n * Uses canvas.measureText to compute and return the width of the given text of given font in pixels.\n * Getting computed styles only works for dom that are added in the dom\n * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393\n * @param {String} text The text to be rendered.\n * @param {Element} el Target element (defaults to body)\n * @param {Boolean} withPadding Include padding on element\n * @returns {Number}\n */\nexport default function getTextWidth(text, el = document.body, withPadding = false) {\n const styles = window.getComputedStyle(el || document.createElement(\"div\"));\n const fontWeight = styles.getPropertyValue(\"font-weight\") || \"normal\";\n const fontSize = styles.getPropertyValue(\"font-size\") || \"1rem\";\n const fontFamily = styles.getPropertyValue(\"font-family\") || \"Arial\";\n\n let padding = 0;\n if (withPadding) {\n const paddingLeft = styles.getPropertyValue(\"padding-left\") || \"0\";\n const paddingRight = styles.getPropertyValue(\"padding-right\") || \"0\";\n padding = Number.parseInt(paddingLeft) + Number.parseInt(paddingRight);\n }\n\n // re-use canvas object for better performance\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const context = canvas.getContext(\"2d\");\n context.font = `${fontWeight} ${fontSize} ${fontFamily}`;\n const metrics = context.measureText(text);\n return Number.parseInt(metrics.width) + padding;\n}\n", "/**\n * @param {String} prefix\n * @returns {String}\n */\nexport default function randstr(prefix) {\n return Math.random()\n .toString(36)\n .replace(\"0.\", prefix || \"\");\n}\n", "/**\n * Define a function that can be happily passed to addEventListener\n * @typedef {Function & EventListenerOrEventListenerObject} ExtendedFunction\n */\n\n/**\n * @param {Function} handler\n * @param {Number} timeout\n * @returns {ExtendedFunction}\n */\nexport default function debounce(handler, timeout = 300) {\n let timer = null;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n handler(...args);\n }, timeout);\n };\n}\n", "/**\n * Data Grid Web component\n *\n * Credits for inspiration\n * @link https://github.com/riverside/zino-grid\n */\n\nimport BaseElement from \"./core/base-element.js\";\nimport addSelectOption from \"./utils/addSelectOption.js\";\nimport appendParamsToUrl from \"./utils/appendParamsToUrl.js\";\nimport camelize from \"./utils/camelize.js\";\nimport convertArray from \"./utils/convertArray.js\";\nimport elementOffset from \"./utils/elementOffset.js\";\nimport interpolate from \"./utils/interpolate.js\";\nimport getTextWidth from \"./utils/getTextWidth.js\";\nimport randstr from \"./utils/randstr.js\";\nimport debounce from \"./utils/debounce.js\";\nimport {\n $,\n $$,\n dispatch,\n find,\n findAll,\n hasClass,\n removeAttribute,\n getAttribute,\n setAttribute,\n addClass,\n toggleClass,\n on,\n ce,\n} from \"./utils/shortcuts.js\";\n\n/**\n * Column definition\n * @typedef Column\n * @property {String} field - the key in the data\n * @property {String} title - the title to display in the header (defaults to \"field\" if not set)\n * @property {Number} [width] - the width of the column (auto otherwise)\n * @property {String} [class] - class to set on the column (target body or header with th.class or td.class)\n * @property {String} [attr] - don't render the column and set a matching attribute on the row with the value of the field\n * @property {Boolean} [hidden] - hide the column\n * @property {Boolean} [noSort] - allow disabling sort for a given column\n * @property {String | Function} [format] - custom data formatting\n * @property {String} [defaultFormatValue] - default value to use for formatting\n * @property {String} [transform] - custom value transformation\n * @property {Boolean} [editable] - replace with input (EditableColumn module)\n * @property {String} [editableType] - type of input (EditableColumn module)\n * @property {Number} [responsive] - the higher the value, the sooner it will be hidden, disable with 0 (ResponsiveGrid module)\n * @property {Boolean} [responsiveHidden] - hidden through responsive module (ResponsiveGrid module)\n * @property {String} [filterType] - defines a filter field type (\"text\" or \"select\" - defaults to \"text\")\n * @property {Array} [filterList] - defines a custom array to populate a filter select field in the format of [{value: \"\", text: \"\"},...]. When defined, it overrides the default behaviour where the filter select elements are populated by the unique values from the corresponding column records.\n * @property {Object} [firstFilterOption] - defines an object for the first option element of the filter select field. defaults to {value: \"\", text: \"\"}\n */\n\n/**\n * Row action\n * @typedef Action\n * @property {String} title - the title of the button\n * @property {String} name - the name of the action\n * @property {String} class - the class for the button\n * @property {String} url - link for the action\n * @property {String} html - custom button data\n * @property {Boolean} [confirm] - needs confirmation\n * @property {Boolean} default - is the default row action\n */\n\n// Import definitions without importing the actual file\n/** @typedef {import('./plugins/autosize-column').default} AutosizeColumn */\n/** @typedef {import('./plugins/column-resizer').default} ColumnResizer */\n/** @typedef {import('./plugins/context-menu').default} ContextMenu */\n/** @typedef {import('./plugins/draggable-headers').default} DraggableHeaders */\n/** @typedef {import('./plugins/editable-column').default} EditableColumn */\n/** @typedef {import('./plugins/fixed-height').default} FixedHeight */\n/** @typedef {import('./plugins/responsive-grid').default} ResponsiveGrid */\n/** @typedef {import('./plugins/row-actions').default} RowActions */\n/** @typedef {import('./plugins/selectable-rows').default} SelectableRows */\n/** @typedef {import('./plugins/touch-support').default} TouchSupport */\n/** @typedef {import('./plugins/spinner-support').default} SpinnerSupport */\n/** @typedef {import('./plugins/save-state').default} SaveState */\n\n/**\n * These plugins are all optional\n * @typedef {Object} Plugins\n * @property {ColumnResizer} [ColumnResizer] resize handlers in the headers\n * @property {ContextMenu} [ContextMenu] menu to show/hide columns\n * @property {DraggableHeaders} [DraggableHeaders] draggable headers columns\n * @property {EditableColumn} [EditableColumn] draggable headers columns\n * @property {TouchSupport} [TouchSupport] touch swipe\n * @property {SelectableRows} [SelectableRows] create a column with checkboxes to select rows\n * @property {FixedHeight} [FixedHeight] allows having fixed height tables\n * @property {AutosizeColumn} [AutosizeColumn] compute ideal width based on column content\n * @property {ResponsiveGrid} [ResponsiveGrid] hide/show column on the fly\n * @property {RowActions} [RowActions] add action on rows\n * @property {SpinnerSupport} [SpinnerSupport] inserts a spinning icon element to indicate grid loading.\n * @property {SaveState} [SaveState] stores grid filter, sort, and paging.\n */\n\n/**\n * Parameters to pass along or receive from the server\n * @typedef ServerParams\n * @property {String} serverParams.start\n * @property {String} serverParams.length\n * @property {String} serverParams.search\n * @property {String} serverParams.sort\n * @property {String} serverParams.sortDir\n * @property {String} serverParams.dataKey\n * @property {String} serverParams.metaKey\n * @property {String} serverParams.metaTotalKey\n * @property {String} serverParams.metaFilteredKey\n * @property {String} serverParams.optionsKey\n * @property {String} serverParams.paramsKey\n */\n\n/**\n * Available data grid options, plugins included\n * @typedef Options\n * @property {?String} id Custom id for the grid\n * @property {?String} url An URL with data to display in JSON format\n * @property {Boolean} debug Log actions in DevTools console\n * @property {Boolean} filter Allows a filtering functionality\n * @property {Boolean} sort Allows a sort by column functionality\n * @property {String} defaultSort Default sort field if sorting is enabled\n * @property {Boolean} server Is a server side powered grid\n * @property {ServerParams} serverParams Describe keys passed to the server backend\n * @property {String} dir Dir\n * @property {Array} perPageValues Available per page options\n * @property {Boolean} hidePerPage Hides the page size select element\n * @property {Column[]} columns Available columns\n * @property {Number} defaultPage Starting page\n * @property {Number} perPage Number of records displayed per page (page size)\n * @property {Boolean} expand Allow cell content to spawn over multiple lines\n * @property {Action[]} actions Row actions (RowActions module)\n * @property {Boolean} collapseActions Group actions (RowActions module)\n * @property {Boolean} resizable Make columns resizable (ColumnResizer module)\n * @property {Boolean} selectable Allow selecting rows with a checkbox (SelectableRows module)\n * @property {Boolean} selectVisibleOnly Select all only selects visible rows (SelectableRows module)\n * @property {Boolean} autosize Compute column sizes based on given data (Autosize module)\n * @property {Boolean} autoheight Adjust height so that it matches table size (FixedHeight module)\n * @property {Boolean} autohidePager auto-hides the pager when number of records falls below the selected page size\n * @property {Boolean} menu Right click menu on column headers (ContextMenu module)\n * @property {Boolean} reorder Allows a column reordering functionality (DraggableHeaders module)\n * @property {Boolean} responsive Change display mode on small screens (ResponsiveGrid module)\n * @property {Boolean} responsiveToggle Show toggle column (ResponsiveGrid module)\n * @property {Boolean} filterOnEnter Toggles the ability to filter column data by pressing the Enter or Return key\n * @property {String} spinnerClass Sets a space-delimited string of css classes for a spinner (use spinner-border css class for bootstrap 5 spinner)\n * @property {Number} filterKeypressDelay Sets a keypress delay time in milliseconds before triggering filter operation.\n * @property {Boolean} saveState Enable/disable save state plugin (SaveState module)\n * @property {?String} errorMessage A generic text to be displayed in footer when error occurs.\n */\n\n/**\n * Available labels that can be translated\n * @typedef Labels\n * @property {String} itemsPerPage\n * @property {String} gotoPage\n * @property {String} gotoFirstPage\n * @property {String} gotoPrevPage\n * @property {String} gotoNextPage\n * @property {String} gotoLastPage\n * @property {String} of\n * @property {String} items\n * @property {String} resizeColumn\n * @property {String} noData\n * @property {String} areYouSure\n * @property {String} networkError\n */\n\n/**\n * List of registered plugins\n * @type {Plugins}\n */\nlet plugins = {};\n\n/**\n * @type {Labels}\n */\nlet labels = {\n itemsPerPage: \"Items per page\",\n gotoPage: \"Go to page\",\n gotoFirstPage: \"Go to first page\",\n gotoPrevPage: \"Go to previous page\",\n gotoNextPage: \"Go to next page\",\n gotoLastPage: \"Go to last page\",\n of: \"of\",\n items: \"items\",\n resizeColumn: \"Resize column\",\n noData: \"No data\",\n areYouSure: \"Are you sure?\",\n networkError: \"Network response error\",\n};\n\n/**\n * Column definition will update some props on the html element\n * @param {HTMLElement} el\n * @param {Column} column\n */\nfunction applyColumnDefinition(el, column) {\n if (column.width) {\n setAttribute(el, \"width\", column.width);\n }\n if (column.class) {\n addClass(el, column.class);\n }\n if (column.hidden) {\n setAttribute(el, \"hidden\", \"\");\n if (column.responsiveHidden) {\n addClass(el, \"dg-responsive-hidden\");\n }\n }\n}\n\n/**\n */\nclass DataGrid extends BaseElement {\n _filterSelector = \"[id^=dg-filter]\";\n _excludedKeys = [\n 37,\n 39,\n 38,\n 40,\n 45,\n 36,\n 35,\n 33,\n 34,\n 27,\n 20,\n 16,\n 17,\n 91,\n 92,\n 18,\n 93,\n 144,\n 231,\n \"ArrowLeft\",\n \"ArrowRight\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"Insert\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n \"Escape\",\n \"CapsLock\",\n \"Shift\",\n \"Control\",\n \"Meta\",\n \"Alt\",\n \"ContextMenu\",\n \"NumLock\",\n \"Unidentified\",\n ];\n\n _ready() {\n setAttribute(this, \"id\", this.options.id ?? randstr(\"el-\"), true);\n\n /**\n * The grid displays that data\n * @type {Array}\n */\n this.data = [];\n /**\n * We store the original data in this\n * @type {Array}\n */\n this.originalData; // declared uninitialized to allow data preloading before fetch.\n\n // Make the IDE happy\n /**\n * @type {Options}\n */\n this.options = this.options || this.defaultOptions;\n\n // Init values\n this.fireEvents = false;\n this.page = this.options.defaultPage || 1;\n this.pages = 0;\n this.meta; // declared uninitialized to allow data preloading before fetch.\n /**\n * @type {Plugins}\n */\n this.plugins = {};\n // Init plugins\n for (const [pluginName, pluginClass] of Object.entries(plugins)) {\n // @ts-ignore until we can set typeof import ...\n this.plugins[pluginName] = new pluginClass(this);\n }\n\n // Expose options as observed attributes in the dom\n // Do it when fireEvents is disabled to avoid firing change callbacks\n for (const attr of DataGrid.observedAttributes) {\n if (attr.indexOf(\"data-\") === 0) {\n setAttribute(this, attr, this.options[camelize(attr.slice(5))]);\n }\n }\n }\n\n static template() {\n return `\n\n \n \n \n \n \n \n \n \n \n \n \n
\n`;\n }\n\n /**\n * @returns {Labels}\n */\n get labels() {\n return labels;\n }\n\n /**\n * @returns {Labels}\n */\n static getLabels() {\n return labels;\n }\n\n /**\n * @param {Object} v\n */\n static setLabels(v) {\n labels = Object.assign(labels, v);\n }\n\n /**\n * @returns {Column}\n */\n get defaultColumn() {\n return {\n field: \"\",\n title: \"\",\n width: 0,\n class: \"\",\n attr: \"\",\n hidden: false,\n editable: false,\n noSort: false,\n responsive: 1,\n responsiveHidden: false,\n format: \"\",\n transform: \"\",\n filterType: \"text\",\n firstFilterOption: { value: \"\", text: \"\" },\n };\n }\n\n /**\n * @returns {Options}\n */\n get defaultOptions() {\n return {\n id: null,\n url: null,\n perPage: 10,\n debug: false,\n filter: false,\n menu: false,\n sort: false,\n server: false,\n serverParams: {\n start: \"start\",\n length: \"length\",\n search: \"search\",\n sort: \"sort\",\n sortDir: \"sortDir\",\n dataKey: \"data\",\n metaKey: \"meta\",\n metaTotalKey: \"total\",\n metaFilteredKey: \"filtered\",\n optionsKey: \"options\",\n paramsKey: \"params\",\n },\n defaultSort: \"\",\n reorder: false,\n dir: \"ltr\",\n perPageValues: [10, 25, 50, 100, 250],\n hidePerPage: false,\n columns: [],\n actions: [],\n collapseActions: false,\n selectable: false,\n selectVisibleOnly: true,\n defaultPage: 1,\n resizable: false,\n autosize: true,\n expand: false,\n autoheight: true,\n autohidePager: false,\n responsive: false,\n responsiveToggle: true,\n filterOnEnter: true,\n filterKeypressDelay: 500,\n spinnerClass: \"\",\n saveState: false,\n errorMessage: \"\",\n };\n }\n\n /**\n * Determines if the grid is initialized.\n * @returns {Boolean}\n */\n get isInit() {\n return this.classList.contains(\"dg-initialized\");\n }\n\n /**\n * Determines if data load has failed.\n * @returns {Boolean}\n */\n get hasDataError() {\n return this.classList.contains(\"dg-network-error\");\n }\n\n /**\n * @param {Plugins} list\n */\n static registerPlugins(list) {\n plugins = list;\n }\n\n /**\n * @param {String} plugin\n */\n static unregisterPlugins(plugin = null) {\n if (plugin === null) {\n plugins = {};\n } else {\n delete plugins[plugin];\n }\n }\n\n /**\n * @returns {Plugins}\n */\n static registeredPlugins() {\n return plugins;\n }\n\n /**\n * @param {Object|Array} columns\n * @returns {Column[]}\n */\n convertColumns(columns) {\n const cols = [];\n // Convert key:value objects to actual columns\n if (typeof columns === \"object\" && !Array.isArray(columns)) {\n for (const key of Object.keys(columns)) {\n const col = Object.assign({}, this.defaultColumn);\n col.title = columns[key];\n col.field = key;\n cols.push(col);\n }\n } else {\n for (const item of columns) {\n let col = Object.assign({}, this.defaultColumn);\n if (typeof item === \"string\") {\n col.title = item;\n col.field = item;\n } else if (typeof item === \"object\") {\n col = Object.assign(col, item);\n if (!col.field) {\n console.error(\"Invalid column definition\", item);\n }\n if (!col.title) {\n col.title = col.field;\n }\n } else {\n console.error(\"Column definition must be a string or an object\");\n }\n cols.push(col);\n }\n }\n return cols;\n }\n\n /**\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#reflected-dom-attributes\n * @returns {Array}\n */\n static get observedAttributes() {\n return [\n \"page\",\n \"data-filter\",\n \"data-sort\",\n \"data-debug\",\n \"data-reorder\",\n \"data-menu\",\n \"data-selectable\",\n \"data-url\",\n \"data-per-page\",\n \"data-responsive\",\n ];\n }\n\n get transformAttributes() {\n return {\n columns: (v) => this.convertColumns(convertArray(v)),\n actions: (v) => convertArray(v),\n defaultPage: (v) => Number.parseInt(v),\n perPage: (v) => Number.parseInt(v),\n };\n }\n\n /** @returns {HTMLTableSectionElement} */ //@ts-ignore\n get thead() {\n return $(\"thead\", this);\n }\n\n /** @returns {HTMLTableSectionElement} */ //@ts-ignore\n get tbody() {\n return $(\"tbody\", this);\n }\n\n /** @returns {HTMLTableSectionElement} */ //@ts-ignore\n get tfoot() {\n return $(\"tfoot\", this);\n }\n\n get page() {\n return Number.parseInt(this.getAttribute(\"page\"));\n }\n\n set page(val) {\n setAttribute(this, \"page\", this.constrainPageValue(val));\n }\n\n /**\n * Loads data and configures the grid.\n * @param {Boolean} initOnly\n */\n urlChanged(initOnly = false) {\n if (initOnly && !this.isInit) return;\n this.reconfig();\n this.loadData().then(() => {\n this.configureUi();\n });\n }\n\n /**\n * Clears columns, re-renders table, and repopulates columns to ensure consistent column widths rendering.\n */\n reconfig() {\n const cols = this.options.columns;\n this.options.columns = [];\n this.configureUi();\n this.options.columns = cols;\n }\n\n constrainPageValue(v) {\n let pv = v;\n if (this.pages < pv) {\n pv = this.pages;\n }\n if (pv < 1 || !pv) {\n pv = 1;\n }\n return pv;\n }\n\n fixPage() {\n this.pages = this.totalPages();\n this.page = this.constrainPageValue(this.page);\n\n // Show current page in input\n setAttribute(this.inputPage, \"max\", this.pages);\n this.inputPage.value = `${this.page}`;\n this.inputPage.disabled = this.pages < 2;\n }\n\n pageChanged() {\n this.reload();\n }\n\n responsiveChanged() {\n if (!this.plugins.ResponsiveGrid) {\n return;\n }\n if (this.options.responsive) {\n this.plugins.ResponsiveGrid.observe();\n } else {\n this.plugins.ResponsiveGrid.unobserve();\n }\n }\n\n menuChanged() {\n this.renderHeader();\n }\n\n /**\n * This is the callback for the select control\n */\n changePerPage() {\n this.options.perPage = Number.parseInt(this.selectPerPage.options[this.selectPerPage.selectedIndex].value);\n this.perPageChanged();\n }\n\n /**\n * This is the actual event triggered on attribute change\n */\n perPageChanged() {\n // Refresh UI\n if (\n this.options.perPage !== Number.parseInt(this.selectPerPage.options[this.selectPerPage.selectedIndex].value)\n ) {\n this.perPageValuesChanged();\n }\n // Make sure current page is still valid\n let updatePage = this.page;\n while (updatePage > 1 && this.page * this.options.perPage > this.totalRecords()) {\n updatePage--;\n }\n if (updatePage !== this.page) {\n // Triggers pageChanged, which will trigger reload\n this.page = updatePage;\n } else {\n // Simply reload current page\n this.reload(() => {\n // Preserve distance between top of page and select control if no fixed height\n if (!this.plugins.FixedHeight || !this.plugins.FixedHeight.hasFixedHeight) {\n this.selectPerPage.scrollIntoView();\n }\n });\n }\n }\n\n dirChanged() {\n setAttribute(this, \"dir\", this.options.dir);\n }\n\n defaultSortChanged() {\n this.sortChanged();\n }\n\n /**\n * Populate the select dropdown according to options\n */\n perPageValuesChanged() {\n if (!this.selectPerPage) {\n return;\n }\n while (this.selectPerPage.lastChild) {\n this.selectPerPage.removeChild(this.selectPerPage.lastChild);\n }\n for (const v of this.options.perPageValues) {\n addSelectOption(this.selectPerPage, v, v, v === this.options.perPage);\n }\n }\n\n _connected() {\n /**\n * @type {HTMLTableElement}\n */\n this.table = this.querySelector(\"table\");\n /**\n * @type {HTMLInputElement}\n */\n this.btnFirst = this.querySelector(\".dg-btn-first\");\n /**\n * @type {HTMLInputElement}\n */\n this.btnPrev = this.querySelector(\".dg-btn-prev\");\n /**\n * @type {HTMLInputElement}\n */\n this.btnNext = this.querySelector(\".dg-btn-next\");\n /**\n * @type {HTMLInputElement}\n */\n this.btnLast = this.querySelector(\".dg-btn-last\");\n /**\n * @type {HTMLSelectElement}\n */\n this.selectPerPage = this.querySelector(\".dg-select-per-page\");\n /**\n * @type {HTMLInputElement}\n */\n this.inputPage = this.querySelector(\".dg-input-page\");\n\n this.getFirst = this.getFirst.bind(this);\n this.getPrev = this.getPrev.bind(this);\n this.getNext = this.getNext.bind(this);\n this.getLast = this.getLast.bind(this);\n this.changePerPage = this.changePerPage.bind(this);\n this.gotoPage = this.gotoPage.bind(this);\n\n this.btnFirst.addEventListener(\"click\", this.getFirst);\n this.btnPrev.addEventListener(\"click\", this.getPrev);\n this.btnNext.addEventListener(\"click\", this.getNext);\n this.btnLast.addEventListener(\"click\", this.getLast);\n this.selectPerPage.addEventListener(\"change\", this.changePerPage);\n this.selectPerPage.toggleAttribute(\"hidden\", this.options.hidePerPage);\n this.inputPage.addEventListener(\"input\", this.gotoPage);\n\n for (const plugin of Object.values(this.plugins)) {\n plugin.connected();\n }\n\n // Display even if we don't have data\n this.dirChanged();\n this.perPageValuesChanged();\n\n // @ts-ignore\n this.loadData().finally(() => {\n this.configureUi();\n\n this.sortChanged();\n this.classList.add(\"dg-initialized\"); //acts as a flag to prevent unnecessary server calls down the chain.\n\n this.filterChanged();\n this.reorderChanged();\n\n this.dirChanged();\n this.perPageValuesChanged();\n this.pageChanged();\n\n this.fireEvents = true; // We can now fire attributeChangedCallback events\n\n this.log(\"initialized\");\n });\n }\n\n _disconnected() {\n this.btnFirst?.removeEventListener(\"click\", this.getFirst);\n this.btnPrev?.removeEventListener(\"click\", this.getPrev);\n this.btnNext?.removeEventListener(\"click\", this.getNext);\n this.btnLast?.removeEventListener(\"click\", this.getLast);\n this.selectPerPage?.removeEventListener(\"change\", this.changePerPage);\n this.inputPage?.removeEventListener(\"input\", this.gotoPage);\n\n for (const plugin of Object.values(this.plugins)) {\n plugin.disconnected();\n }\n }\n\n /**\n * @param {string} field\n * @returns {Column}\n */\n getCol(field) {\n let found = null;\n\n for (const col of this.options.columns) {\n if (col.field === field) {\n found = col;\n }\n }\n return found;\n }\n\n getColProp(field, prop) {\n const c = this.getCol(field);\n return c ? c[prop] : null;\n }\n\n setColProp(field, prop, val) {\n const c = this.getCol(field);\n if (c) {\n c[prop] = val;\n }\n }\n\n visibleColumns() {\n return this.options.columns.filter((col) => {\n return !col.hidden;\n });\n }\n\n hiddenColumns() {\n return this.options.columns.filter((col) => {\n return col.hidden === true;\n });\n }\n\n showColumn(field, render = true) {\n this.setColProp(field, \"hidden\", false);\n\n // We need to render the whole table otherwise layout fixed won't do its job\n if (render) this.renderTable();\n\n dispatch(this, \"columnVisibility\", {\n col: field,\n visibility: \"visible\",\n });\n }\n\n hideColumn(field, render = true) {\n this.setColProp(field, \"hidden\", true);\n\n // We need to render the whole table otherwise layout fixed won't do its job\n if (render) this.renderTable();\n\n dispatch(this, \"columnVisibility\", {\n col: field,\n visibility: \"hidden\",\n });\n }\n\n /**\n * Returns the starting index of actual data\n * @returns {Number}\n */\n startColIndex() {\n let start = 1;\n if (this.options.selectable && this.plugins.SelectableRows) {\n start++;\n }\n if (this.options.responsive && this.plugins.ResponsiveGrid && this.plugins.ResponsiveGrid.hasHiddenColumns()) {\n start++;\n }\n return start;\n }\n\n /**\n * @returns {Boolean}\n */\n isSticky() {\n return this.hasAttribute(\"sticky\");\n }\n\n /**\n * @param {Boolean} visibleOnly\n * @returns {Number}\n */\n columnsLength(visibleOnly = false) {\n let len = 0;\n // One column per (visible) column\n for (const col of this.options.columns) {\n if (visibleOnly && col.hidden) {\n continue;\n }\n if (!col.attr) {\n len++;\n }\n }\n // Add one col for selectable checkbox at the beginning\n if (this.options.selectable && this.plugins.SelectableRows) {\n len++;\n }\n // Add one col for actions at the end\n if (this.options.actions.length && this.plugins.RowActions) {\n len++;\n }\n // Add one col for the responsive toggle\n if (this.options.responsive && this.plugins.ResponsiveGrid && this.plugins.ResponsiveGrid.hasHiddenColumns()) {\n len++;\n }\n return len;\n }\n\n /**\n * Global configuration and renderTable\n * This should be called after your data has been loaded\n */\n configureUi() {\n this.table.style.visibility = \"hidden\";\n this.renderTable();\n if (this.options.responsive && this.plugins.ResponsiveGrid) {\n // Let the observer make the table visible\n } else {\n this.table.style.visibility = \"visible\";\n }\n\n // Store row height for later usage\n if (!this.rowHeight) {\n const tr = find(this, \"tbody tr\") || find(this, \"table tr\");\n if (tr) {\n this.rowHeight = tr.offsetHeight;\n }\n }\n this.fixPage();\n }\n\n filterChanged() {\n const row = this.querySelector(\"thead tr.dg-head-filters\");\n if (this.options.filter) {\n removeAttribute(row, \"hidden\");\n } else {\n this.clearFilters();\n setAttribute(row, \"hidden\", \"\");\n }\n }\n\n reorderChanged() {\n const headers = findAll(this, \"thead tr.dg-head-columns th\");\n for (const th of headers) {\n if (th.classList.contains(\"dg-selectable\") || th.classList.contains(\"dg-actions\")) {\n continue;\n }\n if (this.options.reorder && this.plugins.DraggableHeaders) {\n th.draggable = true;\n } else {\n th.removeAttribute(\"draggable\");\n }\n }\n }\n\n sortChanged() {\n this.log(\"toggle sort\");\n\n const headers = findAll(this, \"thead tr.dg-head-columns th\");\n for (const th of headers) {\n const fieldName = th.getAttribute(\"field\");\n if (\n th.classList.contains(\"dg-not-sortable\") ||\n (!this.fireEvents && fieldName === this.options.defaultSort)\n ) {\n return;\n }\n if (this.options.sort && !this.getColProp(fieldName, \"noSort\")) {\n setAttribute(th, \"aria-sort\", \"none\");\n } else {\n removeAttribute(th, \"aria-sort\");\n }\n }\n }\n\n selectableChanged() {\n this.renderTable();\n }\n\n addRow(row) {\n if (!Array.isArray(this.originalData)) {\n return;\n }\n this.log(\"add row\");\n this.originalData.push(row);\n this.data = this.originalData.slice();\n this.sortData();\n }\n\n /**\n * @param {any} value Value to remove. Defaults to last row.\n * @param {String} key The key of the item to remove. Defaults to first column\n */\n removeRow(value = null, key = null) {\n if (!Array.isArray(this.originalData)) {\n return;\n }\n\n let v = value;\n let k = key;\n if (k === null) {\n k = this.options.columns[0].field;\n }\n if (v === null) {\n v = this.originalData[this.originalData.length - 1][k];\n }\n this.log(`remove row ${k}:${v}`);\n for (let i = 0; i < this.originalData.length; i++) {\n if (this.originalData[i][k] === v) {\n this.originalData.splice(i, 1);\n break;\n }\n }\n this.data = this.originalData.slice();\n this.sortData();\n }\n\n /**\n * @param {String} key Return a specific key (eg: id) instead of the whole row\n * @returns {Array}\n */\n getSelection(key = null) {\n if (!this.plugins.SelectableRows) {\n return [];\n }\n return this.plugins.SelectableRows.getSelection(key);\n }\n\n getData() {\n return this.originalData;\n }\n\n clearData() {\n // Already empty\n if (this.data.length === 0) {\n return;\n }\n this.data = this.originalData = [];\n this.renderBody();\n }\n\n /**\n * Preloads the data intended to bypass the initial fetch operation, allowing for faster intial page load time.\n * Subsequent grid actions after initialization will operate as normal.\n * @param {Object} data - an object with meta ({total, filtered, start}) and data (array of objects) properties.\n */\n preload(data) {\n const metaKey = this.options.serverParams.metaKey;\n const dataKey = this.options.serverParams.dataKey;\n if (data?.[metaKey]) {\n this.meta = data[metaKey];\n }\n if (data?.[dataKey]) {\n this.data = this.originalData = data[dataKey];\n }\n }\n\n refresh(cb = null) {\n this.data = this.originalData = [];\n return this.reload(cb);\n }\n\n reload(cb = null) {\n this.log(\"reload\");\n\n // If the data was cleared, we need to render again\n const needRender = !this.originalData?.length;\n this.fixPage();\n // @ts-ignore\n this.loadData().finally(() => {\n if (this.hasDataError) return;\n // If we load data from the server, we redraw the table body\n // Otherwise, we just need to paginate\n this.options.server || needRender ? this.renderBody() : this.paginate();\n if (cb) {\n cb();\n }\n });\n }\n\n /**\n * @returns {Promise}\n */\n loadData() {\n const flagEmpty = () => !this.data.length && this.classList.add(\"dg-empty\");\n const tbody = this.tbody;\n\n // We already have some data\n if (this.meta || this.originalData || this.isInit) {\n // We don't use server side data\n if (!this.options.server || (this.options.server && !this.fireEvents)) {\n this.log(\"skip loadData\");\n flagEmpty();\n return new Promise((resolve) => {\n resolve();\n });\n }\n }\n this.log(\"loadData\");\n this.loading = true;\n this.classList.add(\"dg-loading\");\n this.classList.remove(\"dg-empty\", \"dg-network-error\");\n return (\n this.fetchData()\n .then((response) => {\n // We can get a straight array or an object\n if (Array.isArray(response)) {\n this.data = response;\n } else {\n // Object must contain data key\n if (!response[this.options.serverParams.dataKey]) {\n console.error(\n \"Invalid response, it should contain a data key with an array or be a plain array\",\n response,\n );\n this.options.url = null;\n return;\n }\n\n // We may have a config object\n this.options = Object.assign(\n this.options,\n response[this.options.serverParams.optionsKey] ?? {},\n );\n // It should return meta data (see metaFilteredKey)\n this.meta = response[this.options.serverParams.metaKey] ?? {};\n this.data = response[this.options.serverParams.dataKey];\n }\n this.originalData = this.data.slice();\n this.fixPage();\n\n // Make sure we have a proper set of columns\n if (this.options.columns.length === 0 && this.originalData.length) {\n this.options.columns = this.convertColumns(Object.keys(this.originalData[0]));\n } else {\n this.options.columns = this.convertColumns(this.options.columns);\n }\n })\n .catch((err) => {\n this.log(err);\n tbody.setAttribute(\n \"data-empty\",\n this.options.errorMessage ||\n err.message?.replace(/^\\s+|\\r\\n|\\n|\\r$/g, \"\") ||\n labels.networkError,\n );\n this.classList.add(\"dg-empty\", \"dg-network-error\");\n dispatch(this, \"loadDataFailed\", err);\n })\n // @ts-ignore\n .finally(() => {\n flagEmpty();\n if (!this.hasDataError && tbody.getAttribute(\"data-empty\") !== this.labels.noData) {\n tbody.setAttribute(\"data-empty\", this.labels.noData);\n }\n this.classList.remove(\"dg-loading\");\n setAttribute(this.table, \"aria-rowcount\", this.data.length);\n this.loading = false;\n })\n );\n }\n\n getFirst() {\n if (this.loading) {\n return;\n }\n this.page = 1;\n }\n\n getLast() {\n if (this.loading) {\n return;\n }\n this.page = this.pages;\n }\n\n getPrev() {\n if (this.loading) {\n return;\n }\n this.page = this.page - 1;\n }\n\n getNext() {\n if (this.loading) {\n return;\n }\n this.page = this.page + 1;\n }\n\n gotoPage(event) {\n if (event.type === \"keypress\") {\n const key = event.keyCode || event.key;\n if (key === 13 || key === \"Enter\") {\n event.preventDefault();\n } else {\n return;\n }\n }\n this.page = Number.parseInt(this.inputPage.value);\n }\n\n getSort() {\n const col = this.querySelector(\"thead tr.dg-head-columns th[aria-sort$='scending']\");\n if (col) {\n return col.getAttribute(\"field\");\n }\n return this.options.defaultSort;\n }\n\n getSortDir() {\n const col = this.querySelector(\"thead tr.dg-head-columns th[aria-sort$='scending']\");\n if (col) {\n return col.getAttribute(\"aria-sort\") || \"\";\n }\n return \"\";\n }\n\n getFilters() {\n const filters = [];\n const inputs = findAll(this, this._filterSelector);\n for (const input of inputs) {\n filters[input.dataset.name] = input.value;\n }\n return filters;\n }\n\n clearFilters() {\n const inputs = findAll(this, this._filterSelector);\n for (const input of inputs) {\n input.value = \"\";\n }\n this.filterData();\n }\n\n filterData() {\n this.log(\"filter data\");\n\n this.page = 1;\n\n if (this.options.server) {\n this.reload();\n } else {\n this.data = this.originalData?.slice() ?? [];\n\n // Look for rows matching the filters\n const inputs = findAll(this, this._filterSelector);\n for (const input of inputs) {\n const value = input.value;\n if (value) {\n const name = input.dataset.name;\n this.data = this.data.filter((item) => {\n const str = `${item[name]}`;\n return str.toLowerCase().indexOf(value.toLowerCase()) !== -1;\n });\n }\n }\n this.pageChanged();\n\n const col = this.querySelector(\"thead tr.dg-head-columns th[aria-sort$='scending']\");\n if (this.options.sort && col) {\n this.sortData();\n } else {\n this.renderBody();\n }\n }\n }\n\n /**\n * Data will be sorted then rendered using renderBody\n * @param {Element} baseCol The column that was clicked or null to use current sort\n */\n sortData(baseCol = null) {\n this.log(\"sort data\");\n\n let col = baseCol;\n\n // Early exit\n if (col && this.getColProp(col.getAttribute(\"field\"), \"noSort\")) {\n this.log(\"sorting prevented because column is not sortable\");\n return;\n }\n if (this.plugins.ColumnResizer?.isResizing) {\n this.log(\"sorting prevented because resizing\");\n return;\n }\n if (this.loading) {\n this.log(\"sorting prevented because loading\");\n return;\n }\n\n // We clicked on a column, update sort state\n if (col !== null) {\n // Remove active sort if any\n const haveClasses = (c) => [\"dg-selectable\", \"dg-actions\", \"dg-responsive-toggle\"].includes(c);\n\n const headers = findAll(this, \"thead tr:first-child th\");\n for (const th of headers) {\n // @ts-ignore\n if ([...th.classList].some(haveClasses)) {\n continue;\n }\n if (th !== col) {\n th.setAttribute(\"aria-sort\", \"none\");\n }\n }\n\n // Set tristate col\n if (!col.hasAttribute(\"aria-sort\") || col.getAttribute(\"aria-sort\") === \"none\") {\n col.setAttribute(\"aria-sort\", \"ascending\");\n } else if (col.getAttribute(\"aria-sort\") === \"ascending\") {\n col.setAttribute(\"aria-sort\", \"descending\");\n } else if (col.getAttribute(\"aria-sort\") === \"descending\") {\n col.setAttribute(\"aria-sort\", \"none\");\n }\n } else {\n // Or fetch current sort\n col = this.querySelector(\"thead tr.dg-head-columns th[aria-sort$='scending']\");\n }\n\n if (this.options.server) {\n // Reload data with updated sort\n this.loadData().finally(() => {\n this.renderBody();\n });\n } else {\n const sort = col ? col.getAttribute(\"aria-sort\") : \"none\";\n if (sort === \"none\") {\n const stack = [];\n\n // Restore order while keeping filters\n this.originalData?.some((itemA) => {\n this.data.some((itemB) => {\n if (JSON.stringify(itemA) === JSON.stringify(itemB)) {\n stack.push(itemB);\n return true;\n }\n return false;\n });\n return stack.length === this.data.length;\n });\n\n this.data = stack;\n } else {\n const field = col.getAttribute(\"field\");\n this.data.sort((a, b) => {\n if (!isNaN(a[field]) && !isNaN(b[field])) {\n return sort === \"ascending\" ? a[field] - b[field] : b[field] - a[field];\n }\n const valA = sort === \"ascending\" ? a[field].toUpperCase() : b[field].toUpperCase();\n const valB = sort === \"ascending\" ? b[field].toUpperCase() : a[field].toUpperCase();\n\n switch (true) {\n case valA > valB:\n return 1;\n case valA < valB:\n return -1;\n case valA === valB:\n return 0;\n }\n });\n }\n this.renderBody();\n }\n }\n\n _sort(columnName, sortDir) {\n const col = this.querySelector(`.dg-head-columns th[field=${columnName}]`);\n const dir = sortDir === \"ascending\" ? \"none\" : sortDir === \"descending\" ? \"ascending\" : \"descending\";\n col?.setAttribute(\"aria-sort\", dir);\n this.sortData(col);\n }\n\n sortAsc = (columnName) => this._sort(columnName, \"ascending\");\n sortDesc = (columnName) => this._sort(columnName, \"descending\");\n sortNone = (columnName) => this._sort(columnName, \"none\");\n\n fetchData() {\n if (!this.options.url) {\n return new Promise((resolve, reject) => reject(\"No url set\"));\n }\n\n let base = window.location.href;\n // Fix trailing slash if no extension is present\n if (!base.split(\"/\").pop().includes(\".\")) {\n base += base.endsWith(\"/\") ? \"\" : \"/\";\n }\n const url = new URL(this.options.url, base);\n let params = {\n r: Date.now(),\n };\n if (this.options.server) {\n // 0 based\n params[this.options.serverParams.start] = this.page - 1;\n params[this.options.serverParams.length] = this.options.perPage;\n if (this.options.filter) params[this.options.serverParams.search] = this.getFilters();\n params[this.options.serverParams.sort] = this.getSort() || \"\";\n params[this.options.serverParams.sortDir] = this.getSortDir();\n\n // extra params ?\n if (this.meta?.[this.options.serverParams.paramsKey]) {\n params = Object.assign(params, this.meta[this.options.serverParams.paramsKey]);\n }\n }\n\n appendParamsToUrl(url, params);\n\n return fetch(url).then((response) => {\n const newError = new Error(response.statusText || labels.networkError);\n if (!response.ok) {\n // @ts-ignore\n newError.response = response;\n throw newError;\n }\n return response\n .clone()\n .json()\n .catch((err) => {\n let error = err;\n if (!this.options.debug) {\n error = newError;\n }\n error.response = response;\n throw error;\n });\n });\n }\n\n renderTable() {\n this.log(\"render table\");\n\n if (this.options.menu && this.plugins.ContextMenu) {\n this.plugins.ContextMenu.createMenu();\n }\n\n let sortedColumn;\n\n this.renderHeader();\n if (this.options.defaultSort) {\n // We can have a default sort even with sort disabled\n sortedColumn = this.querySelector(`thead tr.dg-head-columns th[field=\"${this.options.defaultSort}\"]`);\n }\n\n if (sortedColumn) {\n this.sortData(sortedColumn);\n } else {\n this.renderBody();\n }\n\n this.renderFooter();\n }\n\n /**\n * Create table header\n * - One row for the column headers\n * - One row for the filters\n */\n renderHeader() {\n this.log(\"render header\");\n\n const thead = this.thead;\n this.createColumnHeaders(thead);\n this.createColumnFilters(thead);\n\n if (this.options.resizable && this.plugins.ColumnResizer) {\n this.plugins.ColumnResizer.renderResizer(labels.resizeColumn);\n }\n\n dispatch(this, \"headerRendered\");\n }\n\n renderFooter() {\n this.log(\"render footer\");\n\n const tfoot = this.tfoot;\n const td = tfoot.querySelector(\"td\");\n tfoot.removeAttribute(\"hidden\");\n setAttribute(td, \"colspan\", this.columnsLength(true));\n tfoot.style.display = \"\";\n }\n\n /**\n * Create the column headers based on column definitions and set options\n * @param {HTMLTableSectionElement} thead\n */\n createColumnHeaders(thead) {\n // @link https://stackoverflow.com/questions/21064101/understanding-offsetwidth-clientwidth-scrollwidth-and-height-respectively\n const availableWidth = this.clientWidth;\n const colMaxWidth = Math.round((availableWidth / this.columnsLength(true)) * 2);\n\n let idx = 0;\n let tr;\n\n // Create row\n tr = ce(\"tr\");\n this.headerRow = tr;\n tr.setAttribute(\"role\", \"row\");\n tr.setAttribute(\"aria-rowindex\", \"1\");\n tr.setAttribute(\"class\", \"dg-head-columns\");\n\n // We need a real th from the dom to compute the size\n let sampleTh = thead.querySelector(\"tr.dg-head-columns th\");\n if (!sampleTh) {\n sampleTh = ce(\"th\");\n thead.querySelector(\"tr\").appendChild(sampleTh);\n }\n\n if (this.options.selectable && this.plugins.SelectableRows) {\n this.plugins.SelectableRows.createHeaderCol(tr);\n }\n if (this.options.responsive && this.plugins.ResponsiveGrid && this.plugins.ResponsiveGrid.hasHiddenColumns()) {\n this.plugins.ResponsiveGrid.createHeaderCol(tr);\n }\n\n // Create columns\n idx = 0;\n let totalWidth = 0;\n\n for (const column of this.options.columns) {\n if (column.attr) {\n continue;\n }\n const colIdx = idx + this.startColIndex();\n const th = ce(\"th\");\n th.setAttribute(\"scope\", \"col\");\n th.setAttribute(\"role\", \"columnheader button\");\n th.setAttribute(\"aria-colindex\", `${colIdx}`);\n th.setAttribute(\"id\", randstr(\"dg-col-\"));\n if (this.options.sort) {\n th.setAttribute(\"aria-sort\", \"none\");\n }\n th.setAttribute(\"field\", column.field);\n if (this.plugins.ResponsiveGrid && this.options.responsive) {\n setAttribute(th, \"data-responsive\", column.responsive || \"\");\n }\n // Make sure the header fits (+ add some room for sort icon if necessary)\n const computedWidth = getTextWidth(column.title, sampleTh, true) + 20;\n th.dataset.minWidth = `${computedWidth}`;\n applyColumnDefinition(th, column);\n th.tabIndex = 0;\n th.textContent = column.title;\n\n let w = 0;\n // Autosize small based on first/last row ?\n // Take into account minWidth of the header and max available size based on col numbers\n if (this.options.autosize && this.plugins.AutosizeColumn) {\n const colAvailableWidth = Math.min(availableWidth - totalWidth, colMaxWidth);\n w = this.plugins.AutosizeColumn.computeSize(\n th,\n column,\n Number.parseInt(th.dataset.minWidth),\n colAvailableWidth,\n );\n } else {\n w = Math.max(Number.parseInt(th.dataset.minWidth), Number.parseInt(th.getAttribute(\"width\")));\n }\n\n setAttribute(th, \"width\", w);\n if (column.hidden) {\n th.setAttribute(\"hidden\", \"\");\n } else {\n totalWidth += w;\n }\n\n // Reorder columns with drag/drop\n if (this.options.reorder && this.plugins.DraggableHeaders) {\n this.plugins.DraggableHeaders.makeHeaderDraggable(th);\n }\n\n tr.appendChild(th);\n idx++;\n }\n\n // There is too much available width, and we want to avoid fixed layout to split remaining amount\n if (totalWidth < availableWidth) {\n const visibleCols = findAll(tr, \"th:not([hidden],.dg-not-resizable)\");\n if (visibleCols.length) {\n const lastCol = visibleCols[visibleCols.length - 1];\n removeAttribute(lastCol, \"width\");\n }\n }\n\n // Actions\n if (this.options.actions.length && this.plugins.RowActions) {\n this.plugins.RowActions.makeActionHeader(tr);\n }\n\n thead.replaceChild(tr, thead.querySelector(\"tr.dg-head-columns\"));\n\n // Once columns are inserted, we have an actual dom to query\n if (thead.offsetWidth > availableWidth) {\n this.log(`adjust width to fix size, ${thead.offsetWidth} > ${availableWidth}`);\n const scrollbarWidth = this.offsetWidth - this.clientWidth;\n let diff = thead.offsetWidth - availableWidth - scrollbarWidth;\n if (this.options.responsive && this.plugins.ResponsiveGrid) {\n diff += scrollbarWidth;\n }\n // Remove diff for columns that can afford it\n const thWithWidth = findAll(tr, \"th[width]\");\n\n for (const th of thWithWidth) {\n if (hasClass(th, \"dg-not-resizable\")) {\n continue;\n }\n if (diff <= 0) {\n continue;\n }\n const actualWidth = Number.parseInt(th.getAttribute(\"width\"));\n const minWidth = th.dataset.minWidth ? Number.parseInt(th.dataset.minWidth) : 0;\n if (actualWidth > minWidth) {\n let newWidth = actualWidth - diff;\n if (newWidth < minWidth) {\n newWidth = minWidth;\n }\n diff -= actualWidth - newWidth;\n setAttribute(th, \"width\", newWidth);\n }\n }\n }\n\n // Context menu\n if (this.options.menu && this.plugins.ContextMenu) {\n this.plugins.ContextMenu.attachContextMenu();\n }\n\n // Sort col on click\n const rowsWithSort = findAll(tr, \"[aria-sort]\");\n for (const sortableRow of rowsWithSort) {\n sortableRow.addEventListener(\"click\", () => this.sortData(sortableRow));\n }\n\n setAttribute(this.table, \"aria-colcount\", this.columnsLength(true));\n }\n\n createColumnFilters(thead) {\n let idx = 0;\n let tr;\n\n // Create row for filters\n tr = ce(\"tr\");\n this.filterRow = tr;\n tr.setAttribute(\"role\", \"row\");\n tr.setAttribute(\"aria-rowindex\", \"2\");\n tr.setAttribute(\"class\", \"dg-head-filters\");\n if (!this.options.filter) {\n tr.setAttribute(\"hidden\", \"\");\n }\n\n if (this.options.selectable && this.plugins.SelectableRows) {\n this.plugins.SelectableRows.createFilterCol(tr);\n }\n if (this.options.responsive && this.plugins.ResponsiveGrid && this.plugins.ResponsiveGrid.hasHiddenColumns()) {\n this.plugins.ResponsiveGrid.createFilterCol(tr);\n }\n\n for (const column of this.options.columns) {\n if (column.attr) {\n continue;\n }\n const colIdx = idx + this.startColIndex();\n const relatedTh = thead.querySelector(`tr.dg-head-columns th[aria-colindex=\"${colIdx}\"]`);\n if (!relatedTh) {\n console.warn(\"Related th not found\", colIdx);\n continue;\n }\n const th = ce(\"th\");\n th.setAttribute(\"aria-colindex\", `${colIdx}`);\n\n const filter = this.createFilterElement(column, relatedTh);\n if (!this.options.filter) {\n th.tabIndex = 0;\n } else {\n filter.tabIndex = 0;\n }\n\n if (column.hidden) {\n th.setAttribute(\"hidden\", \"\");\n }\n\n th.appendChild(filter);\n tr.appendChild(th);\n idx++;\n }\n\n // Actions\n if (this.options.actions.length && this.plugins.RowActions) {\n this.plugins.RowActions.makeActionFilter(tr);\n }\n\n thead.replaceChild(tr, thead.querySelector(\"tr.dg-head-filters\"));\n\n if (typeof this.options.filterKeypressDelay !== \"number\" || this.options.filterOnEnter)\n this.options.filterKeypressDelay = 0;\n\n // Filter content by field events\n const filteredRows = findAll(tr, this._filterSelector);\n for (const el of filteredRows) {\n const eventName = /select/i.test(el.tagName) ? \"change\" : \"keyup\";\n const eventHandler = debounce((e) => {\n const key = e.keyCode || e.key;\n const isKeyPressFilter = !this.options.filterOnEnter && !this._excludedKeys.some((k) => k === key);\n if (key === 13 || key === \"Enter\" || isKeyPressFilter || e.type === \"change\") {\n this.filterData.call(this);\n }\n }, this.options.filterKeypressDelay);\n el.addEventListener(eventName, eventHandler);\n }\n }\n\n createFilterElement(column, relatedTh) {\n const isSelect = column.filterType === \"select\";\n const filter = isSelect ? ce(\"select\") : ce(\"input\");\n if (isSelect) {\n if (!Array.isArray(column.filterList)) {\n // Gets unique values from column records\n const uniqueValues = [...new Set((this.data ?? []).map((e) => e[column.field]))]\n .filter((v) => v)\n .sort();\n column.filterList = [column.firstFilterOption || this.defaultColumn.firstFilterOption].concat(\n uniqueValues.map((e) => ({ value: e, text: e })),\n );\n }\n\n for (const e of column.filterList) {\n const opt = ce(\"option\");\n opt.value = e.value;\n opt.text = e.text;\n\n if (filter instanceof HTMLSelectElement) {\n filter.add(opt);\n }\n }\n } else {\n //@ts-ignore\n filter.type = \"text\";\n filter.inputMode = \"search\";\n filter.autocomplete = \"off\";\n filter.spellcheck = false;\n }\n // Allows binding filter to this column\n filter.dataset.name = column.field;\n filter.id = randstr(\"dg-filter-\");\n // Don't use aria-label as it triggers autocomplete\n filter.setAttribute(\"aria-labelledby\", relatedTh.getAttribute(\"id\"));\n return filter;\n }\n\n /**\n * Render the data as rows in tbody\n * It will call paginate() at the end\n */\n renderBody() {\n this.log(\"render body\");\n let tr;\n let td;\n let idx;\n const tbody = ce(\"tbody\");\n\n this.data.forEach((item, i) => {\n tr = ce(\"tr\");\n setAttribute(tr, \"role\", \"row\");\n setAttribute(tr, \"hidden\", \"\");\n setAttribute(tr, \"aria-rowindex\", i + 1);\n tr.tabIndex = 0;\n\n if (this.options.selectable && this.plugins.SelectableRows) {\n this.plugins.SelectableRows.createDataCol(tr);\n }\n if (\n this.options.responsive &&\n this.plugins.ResponsiveGrid &&\n this.plugins.ResponsiveGrid.hasHiddenColumns()\n ) {\n this.plugins.ResponsiveGrid.createDataCol(tr);\n }\n\n // Expandable\n if (this.options.expand) {\n tr.classList.add(\"dg-expandable\");\n\n on(tr, \"click\", (ev) => {\n if (this.plugins.ResponsiveGrid) {\n this.plugins.ResponsiveGrid.blockObserver();\n }\n toggleClass(ev.currentTarget, \"dg-expanded\");\n if (this.plugins.ResponsiveGrid) {\n this.plugins.ResponsiveGrid.unblockObserver();\n }\n });\n }\n\n idx = 0;\n\n for (const column of this.options.columns) {\n if (!column) {\n console.error(\"Empty column found!\", this.options.columns);\n }\n // It should be applied as an attr of the row\n if (column.attr) {\n if (item[column.field]) {\n // Special case if we try to write over the class attr\n if (column.attr === \"class\") {\n addClass(tr, item[column.field]);\n } else {\n tr.setAttribute(column.attr, item[column.field]);\n }\n }\n return;\n }\n td = ce(\"td\");\n td.setAttribute(\"role\", \"gridcell\");\n td.setAttribute(\"aria-colindex\", `${idx}${this.startColIndex()}`);\n applyColumnDefinition(td, column);\n // This is required for pure css responsive layout\n td.setAttribute(\"data-name\", column.title);\n td.tabIndex = -1;\n\n // Inline editing ...\n if (column.editable && this.plugins.EditableColumn) {\n addClass(td, \"dg-editable-col\");\n this.plugins.EditableColumn.makeEditableInput(td, column, item, i);\n } else {\n // ... or formatting\n const v = item[column.field] ?? \"\";\n let tv;\n // TODO: make this modular\n switch (column.transform) {\n case \"uppercase\":\n tv = v.toUpperCase();\n break;\n case \"lowercase\":\n tv = v.toLowerCase();\n break;\n default:\n tv = v;\n break;\n }\n if (column.format) {\n // Only use formatting with values or if defaultFormatValue is set\n if (column.defaultFormatValue !== undefined && (tv === \"\" || tv === null)) {\n tv = `${column.defaultFormatValue}`;\n }\n if (typeof column.format === \"string\" && tv) {\n td.innerHTML = interpolate(\n // @ts-ignore\n column.format,\n Object.assign(\n {\n _v: v,\n _tv: tv,\n },\n item,\n ),\n );\n } else if (column.format instanceof Function) {\n const val = column.format.call(this, { column, rowData: item, cellData: tv, td, tr });\n td.innerHTML = val || tv || v;\n }\n } else {\n td.textContent = tv;\n }\n }\n tr.appendChild(td);\n idx++;\n }\n\n // Actions\n if (this.options.actions.length && this.plugins.RowActions) {\n this.plugins.RowActions.makeActionRow(tr, item);\n }\n\n tbody.appendChild(tr);\n });\n\n tbody.setAttribute(\"role\", \"rowgroup\");\n\n // Keep data empty message\n const prev = this.tbody;\n tbody.setAttribute(\"data-empty\", prev.getAttribute(\"data-empty\"));\n this.table.replaceChild(tbody, prev);\n\n if (this.plugins.FixedHeight) {\n this.plugins.FixedHeight.createFakeRow();\n }\n\n this.paginate();\n\n if (this.plugins.SelectableRows) {\n this.plugins.SelectableRows.shouldSelectAll(tbody);\n }\n\n this.data.length && this.classList.remove(\"dg-empty\");\n\n dispatch(this, \"bodyRendered\");\n }\n\n paginate() {\n this.log(\"paginate\");\n\n const total = this.totalRecords();\n const p = this.page || 1;\n const tbody = this.tbody;\n const tfoot = this.tfoot;\n const bodyRows = findAll(tbody, \"tr\");\n\n // Refresh page count in case we added/removed a page\n this.pages = this.totalPages();\n\n let index;\n let high = p * this.options.perPage;\n let low = high - this.options.perPage + 1;\n\n if (high > total) {\n high = total;\n }\n if (!total) {\n low = 0;\n }\n\n // Display all rows within the set indexes\n // For server side paginated grids, we display everything\n // since the server is taking care of actual pagination\n for (const tr of bodyRows) {\n if (this.options.server) {\n removeAttribute(tr, \"hidden\");\n continue;\n }\n index = Number(getAttribute(tr, \"aria-rowindex\"));\n if (index > high || index < low) {\n setAttribute(tr, \"hidden\", \"\");\n } else {\n removeAttribute(tr, \"hidden\");\n }\n }\n\n if (this.options.selectable && this.plugins.SelectableRows) {\n this.plugins.SelectableRows.clearCheckboxes(tbody);\n }\n\n // Store default height and update styles if needed\n if (this.plugins.FixedHeight) {\n this.plugins.FixedHeight.updateFakeRow();\n }\n\n // Enable/disable buttons if shown\n if (this.btnFirst) {\n this.btnFirst.disabled = this.page <= 1;\n this.btnPrev.disabled = this.page <= 1;\n this.btnNext.disabled = this.page >= this.pages;\n this.btnLast.disabled = this.page >= this.pages;\n }\n tfoot.querySelector(\".dg-low\").textContent = low.toString();\n tfoot.querySelector(\".dg-high\").textContent = high.toString();\n tfoot.querySelector(\".dg-total\").textContent = `${this.totalRecords()}`;\n tfoot.toggleAttribute(\"hidden\", this.options.autohidePager && this.options.perPage > this.totalRecords());\n }\n\n /**\n * @returns {number}\n */\n totalPages() {\n return Math.ceil(this.totalRecords() / this.options.perPage);\n }\n\n /**\n * @returns {number}\n */\n totalRecords() {\n if (this.options.server) {\n return this.meta?.[this.options.serverParams.metaFilteredKey] || 0;\n }\n return this.data.length;\n }\n}\n\nexport default DataGrid;\n", "/** @typedef {import(\"../data-grid\").default} DataGrid */\n\nclass BasePlugin {\n /**\n * @param {DataGrid} grid\n */\n constructor(grid) {\n this.grid = grid;\n }\n\n connected() {}\n\n disconnected() {}\n\n /**\n * Handle events within the plugin\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#handling-events\n * @param {Event} event\n */\n handleEvent(event) {\n if (this[`on${event.type}`]) {\n this[`on${event.type}`](event);\n }\n }\n}\n\nexport default BasePlugin;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport elementOffset from \"../utils/elementOffset.js\";\nimport {\n addClass,\n dispatch,\n findAll,\n getAttribute,\n hasClass,\n off,\n on,\n removeAttribute,\n removeClass,\n setAttribute,\n} from \"../utils/shortcuts.js\";\n\n/**\n * Allows to resize columns\n */\nclass ColumnResizer extends BasePlugin {\n constructor(grid) {\n super(grid);\n this.isResizing = false;\n }\n\n /**\n * @param {String} resizeLabel\n */\n renderResizer(resizeLabel) {\n const grid = this.grid;\n const table = grid.table;\n const cols = findAll(grid, \"thead tr.dg-head-columns th\");\n\n for (const col of cols) {\n if (hasClass(col, \"dg-not-resizable\")) {\n continue;\n }\n // Create a resizer element\n const resizer = document.createElement(\"div\");\n addClass(resizer, \"dg-resizer\");\n resizer.ariaLabel = resizeLabel;\n\n // Add a resizer element to the column\n col.appendChild(resizer);\n\n // Handle resizing\n let startX = 0;\n let startW = 0;\n let remainingSpace = 0;\n let max = 0;\n\n const mouseMoveHandler = (e) => {\n if (e.clientX > max) {\n return;\n }\n const newWidth = startW + (e.clientX - startX);\n if (col.dataset.minWidth && newWidth > Number.parseInt(col.dataset.minWidth)) {\n setAttribute(col, \"width\", newWidth);\n }\n };\n\n // When user releases the mouse, remove the existing event listeners\n const mouseUpHandler = () => {\n grid.log(\"resized column\");\n\n // Prevent accidental sorting if mouse is not over resize handler\n setTimeout(() => {\n this.isResizing = false;\n }, 0);\n\n removeClass(resizer, \"dg-resizer-active\");\n if (grid.options.reorder) {\n col.draggable = true;\n }\n col.style.overflow = \"hidden\";\n\n // Remove handlers\n off(document, \"mousemove\", mouseMoveHandler);\n off(document, \"mouseup\", mouseUpHandler);\n\n dispatch(grid, \"columnResized\", {\n col: getAttribute(col, \"field\"),\n width: getAttribute(col, \"width\"),\n });\n };\n\n // Otherwise it could sort the col\n on(resizer, \"click\", (e) => {\n e.stopPropagation();\n });\n\n on(resizer, \"mousedown\", (e) => {\n e.stopPropagation();\n\n this.isResizing = true;\n\n const target = e.target;\n const currentCols = findAll(grid, \"dg-head-columns th\");\n const visibleCols = currentCols.filter((col) => {\n return !col.hasAttribute(\"hidden\");\n });\n const columnIndex = visibleCols.findIndex((column) => column === target.parentNode);\n grid.log(\"resize column\");\n\n addClass(resizer, \"dg-resizer-active\");\n\n // Make sure we don't drag it\n removeAttribute(col, \"draggable\");\n\n // Allow overflow when resizing\n col.style.overflow = \"visible\";\n\n // Show full column height (-1 to avoid scrollbar)\n resizer.style.height = `${table.offsetHeight - 1}px`;\n\n // Register initial data\n startX = e.clientX;\n startW = col.offsetWidth;\n\n remainingSpace = (visibleCols.length - columnIndex) * 30;\n max = elementOffset(target).left + grid.offsetWidth - remainingSpace;\n\n // Remove width from next columns to allow auto layout\n setAttribute(col, \"width\", startW);\n for (let j = 0; j < visibleCols.length; j++) {\n if (j > columnIndex) {\n removeAttribute(cols[j], \"width\");\n }\n }\n\n // Attach handlers\n on(document, \"mousemove\", mouseMoveHandler);\n on(document, \"mouseup\", mouseUpHandler);\n });\n }\n }\n}\n\nexport default ColumnResizer;\n", "/**\n * @param {HTMLElement} el\n * @param {String} type\n * @param {String} prop\n * @returns {HTMLElement}\n */\nexport default function getParentElement(el, type, prop = \"nodeName\") {\n let parent = el;\n while (parent[prop] !== type) {\n parent = parent.parentElement;\n }\n return parent;\n}\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport getParentElement from \"../utils/getParentElement.js\";\nimport { find, off, on, removeAttribute, setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Create a right click menu on the headers\n */\nclass ContextMenu extends BasePlugin {\n connected() {\n /**\n * @type {HTMLUListElement}\n */\n this.menu = this.grid.querySelector(\".dg-menu\");\n }\n disconnected() {\n if (this.grid.headerRow) {\n off(this.grid.headerRow, \"contextmenu\", this);\n }\n }\n\n attachContextMenu() {\n const grid = this.grid;\n on(grid.headerRow, \"contextmenu\", this);\n }\n\n onchange(e) {\n const grid = this.grid;\n const t = e.target;\n const field = t.dataset.name;\n if (t.checked) {\n grid.showColumn(field);\n } else {\n // Prevent hidding last\n if (grid.visibleColumns().length <= 1) {\n // Restore checkbox value\n t.checked = true;\n return;\n }\n grid.hideColumn(field);\n }\n grid.fixPage(); //fixes Chrome footer flexbox resize issues that may appear when there is a large number of columns (i.e. more than 10).\n }\n\n oncontextmenu(e) {\n e.preventDefault();\n const grid = this.grid;\n const target = getParentElement(e.target, \"THEAD\");\n const menu = this.menu;\n const rect = target.getBoundingClientRect();\n let x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n menu.style.top = `${y}px`;\n menu.style.left = `${x}px`;\n\n removeAttribute(menu, \"hidden\");\n if (x + 150 > rect.width) {\n x -= menu.offsetWidth;\n menu.style.left = `${x}px`;\n }\n\n const documentClickHandler = (e) => {\n if (!menu.contains(e.target)) {\n setAttribute(menu, \"hidden\", \"\");\n off(document, \"click\", documentClickHandler);\n }\n };\n on(document, \"click\", documentClickHandler);\n }\n createMenu() {\n const grid = this.grid;\n const menu = this.menu;\n while (menu.lastChild) {\n menu.removeChild(menu.lastChild);\n }\n menu.addEventListener(\"change\", this);\n\n for (const col of grid.options.columns) {\n if (col.attr) {\n continue;\n }\n const li = document.createElement(\"li\");\n const label = document.createElement(\"label\");\n const checkbox = document.createElement(\"input\");\n setAttribute(checkbox, \"type\", \"checkbox\");\n setAttribute(checkbox, \"data-name\", col.field);\n if (!col.hidden) {\n checkbox.checked = true;\n }\n const text = document.createTextNode(col.title);\n\n label.appendChild(checkbox);\n label.appendChild(text);\n\n li.appendChild(label);\n menu.appendChild(li);\n }\n }\n}\n\nexport default ContextMenu;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport getParentElement from \"../utils/getParentElement.js\";\nimport { dispatch, findAll, getAttribute, on, setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Allows to move headers\n */\nclass DraggableHeaders extends BasePlugin {\n /**\n * @param {HTMLTableCellElement} th\n */\n makeHeaderDraggable(th) {\n const grid = this.grid;\n th.draggable = true;\n on(th, \"dragstart\", (e) => {\n if (grid.plugins.ColumnResizer?.isResizing && e.preventDefault) {\n e.preventDefault();\n return;\n }\n grid.log(\"reorder col\");\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", e.target.getAttribute(\"aria-colindex\"));\n });\n on(th, \"dragover\", (e) => {\n if (e.preventDefault) {\n e.preventDefault();\n }\n e.dataTransfer.dropEffect = \"move\";\n return false;\n });\n on(th, \"drop\", (e) => {\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n const t = e.target;\n const target = getParentElement(t, \"TH\");\n const index = Number.parseInt(e.dataTransfer.getData(\"text/plain\"));\n const targetIndex = Number.parseInt(target.getAttribute(\"aria-colindex\"));\n\n if (index === targetIndex) {\n grid.log(\"reordered col stayed the same\");\n return;\n }\n grid.log(`reordered col from ${index} to ${targetIndex}`);\n\n const offset = grid.startColIndex();\n const tmp = grid.options.columns[index - offset];\n grid.options.columns[index - offset] = grid.options.columns[targetIndex - offset];\n grid.options.columns[targetIndex - offset] = tmp;\n\n const swapNodes = (selector, el1) => {\n const rowIndex = el1.parentNode.getAttribute(\"aria-rowindex\");\n const el2 = grid.querySelector(\n `${selector} tr[aria-rowindex=\"${rowIndex}\"] [aria-colindex=\"${targetIndex}\"]`,\n );\n setAttribute(el1, \"aria-colindex\", targetIndex);\n setAttribute(el2, \"aria-colindex\", index);\n const newNode = document.createElement(\"th\");\n el1.parentNode.insertBefore(newNode, el1);\n el2.parentNode.replaceChild(el1, el2);\n newNode.parentNode.replaceChild(el2, newNode);\n };\n\n // Swap all rows in header and body\n for (const el1 of findAll(grid, `thead th[aria-colindex=\"${index}\"]`)) {\n swapNodes(\"thead\", el1);\n }\n for (const el1 of findAll(grid, `tbody td[aria-colindex=\"${index}\"]`)) {\n swapNodes(\"tbody\", el1);\n }\n\n // Updates the columns\n grid.options.columns = findAll(grid, \"thead tr.dg-head-columns th[field]\").map((th) =>\n grid.options.columns.find((c) => c.field === getAttribute(th, \"field\")),\n );\n\n dispatch(grid, \"columnReordered\", {\n col: tmp.field,\n from: index,\n to: targetIndex,\n });\n return false;\n });\n }\n}\n\nexport default DraggableHeaders;\n", "import BasePlugin from \"../core/base-plugin.js\";\n\n/**\n * Allows to paginate with horizontal swipe motions\n */\nclass TouchSupport extends BasePlugin {\n constructor(grid) {\n super(grid);\n this.touch = null;\n }\n connected() {\n const grid = this.grid;\n grid.addEventListener(\"touchstart\", this, { passive: true });\n grid.addEventListener(\"touchmove\", this, { passive: true });\n }\n\n disconnected() {\n const grid = this.grid;\n grid.removeEventListener(\"touchstart\", this);\n grid.removeEventListener(\"touchmove\", this);\n }\n\n ontouchstart(e) {\n this.touch = e.touches[0];\n }\n\n ontouchmove(e) {\n if (!this.touch) {\n return;\n }\n const grid = this.grid;\n const xDiff = this.touch.clientX - e.touches[0].clientX;\n const yDiff = this.touch.clientY - e.touches[0].clientY;\n\n if (Math.abs(xDiff) > Math.abs(yDiff)) {\n if (xDiff > 0) {\n grid.getNext();\n } else {\n grid.getPrev();\n }\n }\n this.touch = null;\n }\n}\n\nexport default TouchSupport;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport { dispatch, findAll, hasClass, setAttribute } from \"../utils/shortcuts.js\";\n\nconst SELECTABLE_CLASS = \"dg-selectable\";\nconst SELECT_ALL_CLASS = \"dg-select-all\";\nconst CHECKBOX_CLASS = \"form-check-input\"; //bs5\n\n/**\n * Allows to select rows\n */\nclass SelectableRows extends BasePlugin {\n disconnected() {\n if (this.selectAll) {\n this.selectAll.removeEventListener(\"change\", this);\n }\n }\n\n /**\n * @param {String} key Return a specific key (eg: id) instead of the whole row\n * @returns {Array}\n */\n getSelection(key = null) {\n const grid = this.grid;\n const selectedData = [];\n\n const inputs = findAll(grid, `tbody .${SELECTABLE_CLASS} input:checked`);\n\n for (const checkbox of inputs) {\n const idx = Number.parseInt(checkbox.dataset.id);\n const item = grid.data[idx - 1];\n if (!item) {\n console.warn(`Item ${idx} not found`);\n }\n if (key) {\n selectedData.push(item[key]);\n } else {\n selectedData.push(item);\n }\n }\n return selectedData;\n }\n\n /**\n * Uncheck box if hidden and visible only\n * @param {HTMLTableSectionElement} tbody\n */\n clearCheckboxes(tbody) {\n const grid = this.grid;\n if (!grid.options.selectVisibleOnly) {\n return;\n }\n const inputs = findAll(tbody, `tr[hidden] .${SELECTABLE_CLASS} input`);\n for (const input of inputs) {\n input.checked = false;\n }\n this.selectAll.checked = false;\n }\n\n colIndex() {\n return this.grid.startColIndex() - 2;\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createHeaderCol(tr) {\n const th = document.createElement(\"th\");\n setAttribute(th, \"scope\", \"col\");\n setAttribute(th, \"role\", \"columnheader button\");\n setAttribute(th, \"aria-colindex\", this.colIndex());\n th.classList.add(...[SELECTABLE_CLASS, \"dg-not-resizable\", \"dg-not-sortable\"]);\n th.tabIndex = 0;\n\n this.selectAll = document.createElement(\"input\");\n this.selectAll.type = \"checkbox\";\n this.selectAll.classList.add(SELECT_ALL_CLASS);\n this.selectAll.classList.add(CHECKBOX_CLASS);\n this.selectAll.addEventListener(\"change\", this);\n\n const label = document.createElement(\"label\");\n label.appendChild(this.selectAll);\n\n th.appendChild(label);\n\n th.setAttribute(\"width\", \"40\");\n tr.appendChild(th);\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createFilterCol(tr) {\n const th = document.createElement(\"th\");\n setAttribute(th, \"role\", \"columnheader button\");\n setAttribute(th, \"aria-colindex\", this.colIndex());\n th.classList.add(SELECTABLE_CLASS);\n th.tabIndex = 0;\n\n tr.appendChild(th);\n }\n\n /**\n * Handles the selectAll checkbox when any other .dg-selectable checkbox is checked on table body.\n * It should check selectAll if all is checked\n * It should uncheck selectAll if any is unchecked\n * @param {HTMLTableSectionElement} tbody\n */\n shouldSelectAll(tbody) {\n if (!this.selectAll) {\n return;\n }\n // Delegate listener for change events on input checkboxes\n tbody.addEventListener(\"change\", this);\n // Make sure state is up to date\n tbody.dispatchEvent(new Event(\"change\"));\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createDataCol(tr) {\n // Create col\n const td = document.createElement(\"td\");\n setAttribute(td, \"role\", \"gridcell button\");\n setAttribute(td, \"aria-colindex\", this.colIndex());\n td.classList.add(SELECTABLE_CLASS);\n\n // Create input\n const selectOne = document.createElement(\"input\");\n // Alias row id for easy retrieval in getSelection\n selectOne.dataset.id = tr.getAttribute(\"aria-rowindex\");\n selectOne.type = \"checkbox\";\n selectOne.classList.add(CHECKBOX_CLASS);\n // Label need to take full space thanks to css to make the whole cell clickable\n const label = document.createElement(\"label\");\n label.classList.add(\"dg-clickable-cell\");\n label.appendChild(selectOne);\n td.appendChild(label);\n\n // Prevent unwanted click behaviour on row\n label.addEventListener(\"click\", this);\n\n tr.appendChild(td);\n }\n\n /**\n * @param {Event} e\n */\n onclick(e) {\n e.stopPropagation();\n }\n\n /**\n * Handle change event on select all or any select checkbox in the table body\n * @param {import(\"../utils/shortcuts.js\").FlexibleEvent} e\n */\n onchange(e) {\n const grid = this.grid;\n if (hasClass(e.target, SELECT_ALL_CLASS)) {\n const visibleOnly = grid.options.selectVisibleOnly;\n const inputs = findAll(grid, `tbody .${SELECTABLE_CLASS} input`);\n for (const cb of inputs) {\n if (visibleOnly && !cb.offsetWidth) {\n return;\n }\n cb.checked = this.selectAll.checked;\n }\n dispatch(grid, \"rowsSelected\", {\n selection: this.getSelection(),\n });\n } else {\n if (!e.target.closest(`.${SELECTABLE_CLASS}`)) {\n return;\n }\n const totalCheckboxes = findAll(grid, `tbody .${SELECTABLE_CLASS} input[type=checkbox]`);\n // @ts-ignore\n const totalChecked = totalCheckboxes.filter((n) => n.checked);\n this.selectAll.checked = totalChecked.length === totalCheckboxes.length;\n\n dispatch(grid, \"rowsSelected\", {\n selection: grid.getSelection(),\n });\n }\n }\n}\n\nexport default SelectableRows;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport { setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Support for fixed table height\n *\n * We should add a fake row to push the footer down in case we don't have enough rows\n */\nclass FixedHeight extends BasePlugin {\n constructor(grid) {\n super(grid);\n\n this.hasFixedHeight = false;\n // If we have a fixed height, make sure we have overflowY set\n if (grid.style.height) {\n grid.style.overflowY = \"auto\";\n this.hasFixedHeight = true;\n }\n }\n\n /**\n */\n createFakeRow() {\n const grid = this.grid;\n const tbody = grid.querySelector(\"tbody\");\n const tr = document.createElement(\"tr\");\n setAttribute(tr, \"role\", \"row\");\n setAttribute(tr, \"hidden\", \"\");\n tr.classList.add(\"dg-fake-row\");\n tr.tabIndex = 0;\n tbody.appendChild(tr);\n }\n\n get fakeRow() {\n return this.grid.querySelector(\".dg-fake-row\");\n }\n\n /**\n * On last page, use a fake row to push footer down\n */\n updateFakeRow() {\n const grid = this.grid;\n const fakeRow = this.fakeRow;\n if (!fakeRow) {\n return;\n }\n\n // We don't need a fake row if we display everything\n if (grid.options.perPage > grid.totalRecords()) {\n return;\n }\n // We are not on last page\n if (grid.page !== grid.totalPages()) {\n return;\n }\n if (!grid.options.autoheight) {\n return;\n }\n // Find remaining missing height\n const max = grid.options.perPage * grid.rowHeight;\n const visibleRows = grid.querySelectorAll(\"tbody tr:not([hidden])\").length;\n const fakeHeight = visibleRows > 1 ? max - visibleRows * grid.rowHeight : max;\n if (fakeHeight > 0) {\n setAttribute(fakeRow, \"height\", fakeHeight);\n fakeRow.removeAttribute(\"hidden\");\n } else {\n fakeRow.removeAttribute(\"height\");\n }\n }\n}\n\nexport default FixedHeight;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport getTextWidth from \"../utils/getTextWidth.js\";\nimport { getAttribute, hasAttribute, setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Allows to resize columns\n */\nclass AutosizeColumn extends BasePlugin {\n /**\n * Autosize col based on column data\n * @param {HTMLTableCellElement} th\n * @param {import(\"../data-grid\").Column} column\n * @param {Number} min\n * @param {Number} max\n * @returns {Number}\n */\n computeSize(th, column, min, max) {\n const grid = this.grid;\n if (hasAttribute(th, \"width\")) {\n return getAttribute(th, \"width\");\n }\n if (!grid.data.length) {\n return;\n }\n const firstVal = grid.data[0];\n const lastVal = grid.data[grid.data.length - 1];\n let v = firstVal[column.field] ? firstVal[column.field].toString() : \"\";\n const v2 = lastVal[column.field] ? lastVal[column.field].toString() : \"\";\n if (v2.length > v.length) {\n v = v2;\n }\n let width = 0;\n if (v.length <= 6) {\n width = min;\n } else if (v.length > 50) {\n width = max;\n } else {\n // Add some extra room to have some spare space\n width = getTextWidth(`${v}0000`, th);\n }\n if (width > max) {\n width = max;\n }\n if (width < min) {\n width = min;\n }\n setAttribute(th, \"width\", width);\n return width;\n }\n}\n\nexport default AutosizeColumn;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport debounce from \"../utils/debounce.js\";\nimport {\n addClass,\n ce,\n find,\n findAll,\n hasClass,\n insertAfter,\n removeAttribute,\n removeClass,\n setAttribute,\n} from \"../utils/shortcuts.js\";\n\nconst RESPONSIVE_CLASS = \"dg-responsive\";\n\nlet obsTo;\n\n/**\n * @param {Array} list\n * @returns {Array}\n */\nfunction sortByPriority(list) {\n return list.sort((a, b) => {\n const v1 = Number.parseInt(a.dataset.responsive) || 1;\n const v2 = Number.parseInt(b.dataset.responsive) || 1;\n return v2 - v1;\n });\n}\n\n/**\n * @type {ResizeObserverCallback}\n */\n//@ts-ignore\nconst callback = debounce((entries) => {\n for (const entry of entries) {\n /**\n * @type {import(\"../data-grid\").default}\n */\n // @ts-ignore\n const grid = entry.target;\n const table = grid.table;\n if (grid.plugins.ResponsiveGrid.observerBlocked) {\n return;\n }\n // check inlineSize (width) and not blockSize (height)\n const contentBoxSize = Array.isArray(entry.contentBoxSize) ? entry.contentBoxSize[0] : entry.contentBoxSize;\n const size = Number.parseInt(contentBoxSize.inlineSize);\n const tableWidth = table.offsetWidth;\n const realTableWidth = findAll(grid.headerRow, \"th\").reduce((result, th) => {\n return result + th.offsetWidth;\n }, 0);\n const diff = (realTableWidth || tableWidth) - size - 1;\n const minWidth = 50;\n const prevAction = grid.plugins.ResponsiveGrid.prevAction;\n // We have an array with the columns to show/hide are in order, most important first\n const headerCols = sortByPriority(\n findAll(grid.headerRow, \"th[field]\")\n .reverse() // Order takes precedence if no priority is set\n .filter((col) => {\n // Leave out unresponsive columns\n return col.dataset.responsive !== \"0\";\n }),\n );\n let changed = false;\n\n grid.log(`table is ${tableWidth}/${realTableWidth} and available size is ${size}. Diff: ${diff}`);\n\n // The table is too big when diff has a high value, otherwise it will be like -1 or -2\n if (diff > 0) {\n if (prevAction === \"show\") {\n return;\n }\n grid.plugins.ResponsiveGrid.prevAction = \"hide\";\n let remaining = diff;\n let cols = headerCols.filter((col) => {\n return !col.hasAttribute(\"hidden\") && col.hasAttribute(\"data-responsive\");\n });\n if (cols.length === 0) {\n cols = headerCols.filter((col) => {\n return !col.hasAttribute(\"hidden\");\n });\n // Always keep one column\n if (cols.length === 1) {\n return;\n }\n }\n\n for (const col of cols) {\n if (remaining < 0) {\n continue;\n }\n\n const colWidth = col.offsetWidth;\n const field = col.getAttribute(\"field\");\n if (!field) {\n continue;\n }\n col.dataset.baseWidth = `${col.offsetWidth}`;\n\n grid.hideColumn(field, false);\n grid.setColProp(field, \"responsiveHidden\", true);\n changed = true;\n\n remaining -= colWidth;\n remaining = Math.round(remaining);\n }\n } else {\n if (prevAction === \"hide\") {\n return;\n }\n grid.plugins.ResponsiveGrid.prevAction = \"show\";\n\n const requiredWidth =\n headerCols\n .filter((col) => {\n return !col.hasAttribute(\"hidden\");\n })\n .reduce((result, col) => {\n const width = col.dataset.minWidth ? Number.parseInt(col.dataset.minWidth) : col.offsetWidth;\n return result + width;\n }, 0) + minWidth; // Add an offset so that inserting column is smoother\n\n // Compute available width to insert columns\n let remaining = size - requiredWidth;\n // Do we have any hidden column that we can restore ?\n const filteredHeaderCols = headerCols\n .slice()\n .reverse() // Reverse the array to restore the columns in the proper order\n .filter((col) => {\n return col.hasAttribute(\"hidden\");\n });\n\n for (const col of filteredHeaderCols) {\n if (remaining < minWidth) {\n continue;\n }\n const colWidth = Number.parseInt(col.dataset.minWidth);\n\n // We need to have enough space to restore it\n if (colWidth > remaining) {\n remaining = -1; // break loop to keep restoring in order\n continue;\n }\n\n const field = col.getAttribute(\"field\");\n if (!field) {\n continue;\n }\n\n grid.showColumn(field, false);\n grid.setColProp(field, \"responsiveHidden\", false);\n changed = true;\n\n remaining -= colWidth;\n remaining = Math.round(remaining);\n }\n }\n\n // Check footer\n const footer = find(grid.table, \"tfoot\");\n const realFooterWidth = findAll(grid.table, \".dg-footer > div\").reduce((result, div) => {\n return result + div.offsetWidth;\n }, 0);\n const availableFooterWidth = footer.offsetWidth - realFooterWidth;\n if (realFooterWidth > size) {\n addClass(footer, \"dg-footer-compact\");\n } else if (availableFooterWidth > 250) {\n removeClass(footer, \"dg-footer-compact\");\n }\n if (changed) {\n grid.renderTable();\n }\n // Prevent resize loop\n setTimeout(() => {\n grid.plugins.ResponsiveGrid.prevAction = null;\n }, 1000);\n grid.table.style.visibility = \"visible\";\n }\n}, 100);\nconst resizeObserver = new ResizeObserver(callback);\n\n/**\n * Responsive data grid\n */\nclass ResponsiveGrid extends BasePlugin {\n constructor(grid) {\n super(grid);\n\n this.observerBlocked = false;\n this.prevAction = null;\n }\n\n connected() {\n if (this.grid.options.responsive) {\n this.observe();\n }\n }\n\n disconnected() {\n this.unobserve();\n }\n\n observe() {\n if (!this.grid.options.responsive) {\n return;\n }\n resizeObserver.observe(this.grid);\n this.grid.style.display = \"block\"; // Otherwise resize doesn't happen\n this.grid.style.overflowX = \"hidden\"; // Prevent scrollbars from appearing\n }\n\n unobserve() {\n resizeObserver.unobserve(this.grid);\n this.grid.style.display = \"unset\";\n this.grid.style.overflowX = \"unset\";\n }\n\n blockObserver() {\n this.observerBlocked = true;\n if (obsTo) {\n clearTimeout(obsTo);\n }\n }\n\n unblockObserver() {\n obsTo = setTimeout(() => {\n this.observerBlocked = false;\n }, 200); // more than debounce\n }\n\n /**\n * @returns {Boolean}\n */\n hasHiddenColumns() {\n let flag = false;\n\n for (const col of this.grid.options.columns) {\n if (col.responsiveHidden) {\n flag = true;\n }\n }\n return flag;\n }\n\n colIndex() {\n return this.grid.startColIndex() - 1;\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createHeaderCol(tr) {\n if (!this.grid.options.responsiveToggle) {\n return;\n }\n const th = ce(\"th\", tr);\n setAttribute(th, \"scope\", \"col\");\n setAttribute(th, \"role\", \"columnheader button\");\n setAttribute(th, \"aria-colindex\", this.colIndex());\n setAttribute(th, \"width\", \"40\");\n th.classList.add(...[`${RESPONSIVE_CLASS}-toggle`, \"dg-not-resizable\", \"dg-not-sortable\"]);\n th.tabIndex = 0;\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createFilterCol(tr) {\n if (!this.grid.options.responsiveToggle) {\n return;\n }\n const th = ce(\"th\", tr);\n setAttribute(th, \"role\", \"columnheader button\");\n setAttribute(th, \"aria-colindex\", this.colIndex());\n th.classList.add(`${RESPONSIVE_CLASS}-toggle`);\n th.tabIndex = 0;\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createDataCol(tr) {\n if (!this.grid.options.responsiveToggle) {\n return;\n }\n // Create col\n const td = document.createElement(\"td\");\n setAttribute(td, \"role\", \"gridcell button\");\n setAttribute(td, \"aria-colindex\", this.colIndex());\n td.classList.add(`${RESPONSIVE_CLASS}-toggle`);\n\n // Create icon\n td.innerHTML = `
\n \n \n\n\n \n
`;\n tr.appendChild(td);\n\n td.addEventListener(\"click\", this);\n td.addEventListener(\"mousedown\", this);\n }\n\n computeLabelWidth() {\n let idealWidth = 0;\n let consideredCol = 0;\n while (idealWidth < 120) {\n consideredCol++;\n const hCol = find(this.grid, `.dg-head-columns th[aria-colindex=\"${consideredCol}\"]`);\n if (hCol) {\n idealWidth += hCol.offsetWidth;\n } else {\n break;\n }\n }\n return idealWidth;\n }\n\n /**\n * @param {Event} ev\n */\n onmousedown(ev) {\n // Avoid selection through double click\n ev.preventDefault();\n }\n\n /**\n * @param {Event} ev\n */\n onclick(ev) {\n // Prevent expandable\n ev.stopPropagation();\n\n // target is the element that triggered the event (e.g., the user clicked on)\n // currentTarget is the element that the event listener is attached to.\n\n /**\n * @type {HTMLTableRowElement}\n */\n //@ts-ignore\n const td = ev.currentTarget;\n const tr = td.parentElement;\n const open = find(td, `.${RESPONSIVE_CLASS}-open`);\n const close = find(td, `.${RESPONSIVE_CLASS}-close`);\n\n this.blockObserver();\n\n const isExpanded = hasClass(tr, `${RESPONSIVE_CLASS}-expanded`);\n if (isExpanded) {\n removeClass(tr, `${RESPONSIVE_CLASS}-expanded`);\n open.style.display = \"unset\";\n close.style.display = \"none\";\n\n // Move back rows and cleanup row\n const childRow = tr.nextElementSibling;\n const hiddenCols = findAll(childRow, `.${RESPONSIVE_CLASS}-hidden`);\n\n for (const col of hiddenCols) {\n // We don't really need to care where we insert them since we are going to redraw anyway\n tr.appendChild(col);\n setAttribute(col, \"hidden\");\n }\n\n childRow.parentElement.removeChild(childRow);\n } else {\n addClass(tr, `${RESPONSIVE_CLASS}-expanded`);\n open.style.display = \"none\";\n close.style.display = \"unset\";\n\n // Create a child row and move rows into it\n const childRow = ce(\"tr\");\n insertAfter(childRow, tr);\n addClass(childRow, `${RESPONSIVE_CLASS}-child-row`);\n\n const childRowTd = ce(\"td\", childRow);\n setAttribute(childRowTd, \"colspan\", this.grid.columnsLength(true));\n\n const childTable = ce(\"table\", childRowTd);\n addClass(childTable, `${RESPONSIVE_CLASS}-table`);\n\n const hiddenCols = findAll(tr, `.${RESPONSIVE_CLASS}-hidden`);\n const idealWidth = this.computeLabelWidth();\n\n for (const col of hiddenCols) {\n const childTableRow = ce(\"tr\", childTable);\n\n // Add label\n const label = col.dataset.name;\n const labelCol = ce(\"th\", childTableRow);\n // It looks much better when aligned with an actual col\n labelCol.style.width = `${idealWidth}px`;\n labelCol.innerHTML = label;\n\n // Add actual row\n childTableRow.appendChild(col);\n removeAttribute(col, \"hidden\");\n }\n }\n\n this.unblockObserver();\n }\n}\n\nexport default ResponsiveGrid;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport interpolate from \"../utils/interpolate.js\";\nimport { dispatch, on, setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Add action on rows\n */\nclass RowActions extends BasePlugin {\n /**\n * @returns {Boolean}\n */\n hasActions() {\n return this.grid.options.actions.length > 0;\n }\n\n /**\n *\n * @param {HTMLTableRowElement} tr\n */\n makeActionHeader(tr) {\n const actionsTh = document.createElement(\"th\");\n setAttribute(actionsTh, \"role\", \"columnheader button\");\n setAttribute(actionsTh, \"aria-colindex\", this.grid.columnsLength(true));\n actionsTh.classList.add(...[\"dg-actions\", \"dg-not-sortable\", \"dg-not-resizable\", this.actionClass]);\n actionsTh.tabIndex = 0;\n tr.appendChild(actionsTh);\n }\n\n /**\n *\n * @param {HTMLTableRowElement} tr\n */\n makeActionFilter(tr) {\n const actionsTh = document.createElement(\"th\");\n actionsTh.setAttribute(\"role\", \"columnheader button\");\n setAttribute(actionsTh, \"aria-colindex\", this.grid.columnsLength(true));\n actionsTh.classList.add(...[\"dg-actions\", this.actionClass]);\n actionsTh.tabIndex = 0;\n tr.appendChild(actionsTh);\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n * @param {Object} item\n */\n makeActionRow(tr, item) {\n const labels = this.grid.labels;\n const td = document.createElement(\"td\");\n setAttribute(td, \"role\", \"gridcell\");\n setAttribute(td, \"aria-colindex\", this.grid.columnsLength(true));\n td.classList.add(...[\"dg-actions\", this.actionClass]);\n td.tabIndex = 0;\n\n // Add menu toggle\n const actionsToggle = document.createElement(\"button\");\n actionsToggle.classList.add(\"dg-actions-toggle\");\n actionsToggle.innerHTML = \"\u2630\";\n td.appendChild(actionsToggle);\n on(actionsToggle, \"click\", (ev) => {\n ev.stopPropagation();\n ev.target.parentElement.classList.toggle(\"dg-actions-expand\");\n });\n\n for (const action of this.grid.options.actions) {\n const button = document.createElement(\"button\");\n if (action.html) {\n button.innerHTML = action.html;\n } else {\n button.innerText = action.title ?? action.name;\n }\n if (action.title) {\n button.title = action.title;\n }\n if (action.url) {\n button.type = \"submit\";\n button.formAction = interpolate(action.url, item);\n }\n if (action.class) {\n button.classList.add(...action.class.split(\" \"));\n }\n const actionHandler = (ev) => {\n ev.stopPropagation();\n if (action.confirm) {\n const c = confirm(labels.areYouSure);\n if (!c) {\n ev.preventDefault();\n return;\n }\n }\n dispatch(this.grid, \"action\", {\n data: item,\n action: action.name,\n });\n };\n button.addEventListener(\"click\", actionHandler);\n td.appendChild(button);\n\n // Row action\n if (action.default) {\n tr.classList.add(\"dg-actionable\");\n tr.addEventListener(\"click\", actionHandler);\n }\n }\n\n tr.appendChild(td);\n }\n\n get actionClass() {\n if (this.grid.options.actions.length < 3 && !this.grid.options.collapseActions) {\n return `dg-actions-${this.grid.options.actions.length}`;\n }\n return \"dg-actions-more\";\n }\n}\n\nexport default RowActions;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport { dispatch } from \"../utils/shortcuts.js\";\n\n/**\n * Make editable inputs in rows\n */\nclass EditableColumn extends BasePlugin {\n /**\n *\n * @param {HTMLTableCellElement} td\n * @param {import(\"../data-grid\").Column} column\n * @param {Object} item\n * @param {number} i\n */\n makeEditableInput(td, column, item, i) {\n const gridId = this.grid.getAttribute(\"id\");\n const input = document.createElement(\"input\");\n input.type = column.editableType || \"text\";\n if (input.type === \"email\") {\n input.inputMode = \"email\";\n }\n if (input.type === \"decimal\") {\n input.type = \"text\";\n input.inputMode = \"decimal\";\n }\n input.autocomplete = \"off\";\n input.spellcheck = false;\n input.tabIndex = 0;\n input.classList.add(\"dg-editable\");\n input.name = `${gridId.replace(\"-\", \"_\")}[${i + 1}][${column.field}]`;\n input.value = item[column.field];\n input.dataset.field = column.field;\n\n // Prevent row action\n input.addEventListener(\"click\", (ev) => ev.stopPropagation());\n // Enter validates edit\n input.addEventListener(\"keypress\", (ev) => {\n if (ev.type === \"keypress\") {\n const key = ev.keyCode || ev.key;\n if (key === 13 || key === \"Enter\") {\n input.blur();\n ev.preventDefault();\n }\n }\n });\n // Save on blur\n input.addEventListener(\"blur\", () => {\n // Only fire on update\n if (input.value === item[input.dataset.field]) {\n return;\n }\n // Update underlying data\n item[input.dataset.field] = input.value;\n // Notify\n dispatch(this.grid, \"edit\", {\n data: item,\n value: input.value,\n });\n });\n td.appendChild(input);\n }\n}\n\nexport default EditableColumn;\n", "import BasePlugin from \"../core/base-plugin.js\";\r\nimport { $ } from \"../utils/shortcuts.js\";\r\n\r\n/**\r\n * Adds an element for showing a spinning icon on grid loading.\r\n */\r\nclass SpinnerSupport extends BasePlugin {\r\n connected() {\r\n // Inserts spinner\r\n if (this.grid.options.spinnerClass && this.grid.plugins.SpinnerSupport) {\r\n this.add();\r\n }\r\n }\r\n\r\n /**\r\n * Adds a spinner element with its associated css styles.\r\n */\r\n add() {\r\n const grid = this.grid;\r\n const classes = grid.options.spinnerClass;\r\n if (!classes) {\r\n return;\r\n }\r\n const cls = classes\r\n .split(\" \")\r\n .map((e) => `.${e}`)\r\n .join(\"\");\r\n\r\n const template = `\r\n\r\n`;\r\n if (!$(\"#dg-styles\")) {\r\n const styleParent = $(\"head\") ?? $(\"body\");\r\n const position = /head/i.test(styleParent.tagName) ? \"beforeend\" : \"afterbegin\";\r\n styleParent.insertAdjacentHTML(position, template);\r\n }\r\n !$(`i${cls}`, grid) && grid.insertAdjacentHTML(\"afterbegin\", ``);\r\n }\r\n}\r\n\r\nexport default SpinnerSupport;\r\n", "\uFEFFimport BasePlugin from \"../core/base-plugin.js\";\nimport { findAll } from \"../utils/shortcuts.js\";\n\n/**\n * @typedef GridState\n * @property {Object} meta\n * @property {Number} pages\n * @property {Number} page\n * @property {Number} perPage\n * @property {Object} filters\n * @property {Array} columns\n * @property {String} sort\n * @property {String} sortDir\n * @property {Number} scrollTo\n */\n\nclass SaveState extends BasePlugin {\n constructor(grid) {\n super(grid);\n this.cachedState = null;\n this.isFilterSortSet = false;\n this.isDataLoaded = false;\n this.isScrolled = false;\n this.log(\"Init\");\n }\n\n connected() {\n this.log(\"connected\");\n const grid = this.grid;\n\n if (!grid.options.saveState) {\n this.log(\"disabled\");\n return;\n }\n\n this.log(\"enabled\");\n\n const cachedState = this._getState();\n if (cachedState) {\n this.log(\"hide columns\");\n\n for (const col of cachedState.columns) {\n if (col.hidden) {\n const hideCol = grid.options.columns.find((c) => c.field === col.field);\n hideCol.hidden = true;\n }\n }\n\n this.log(\"set: meta, pages\");\n grid.options.perPage = cachedState.perPage;\n if (grid.options.server) {\n grid.meta = cachedState.meta;\n grid.pages = cachedState.pages;\n grid.page = cachedState.page;\n }\n }\n\n this.cachedState = cachedState;\n\n const dgLoadData = grid.loadData;\n grid.loadData = function (...args) {\n return new Promise((resolve, reject) => {\n dgLoadData.apply(this, args).finally(() => {\n const saveState = this.plugins.SaveState;\n\n if (!grid.classList.contains(\"dg-initialized\")) {\n saveState.log(\"not init, loadData skipped\");\n return resolve();\n }\n\n saveState.log(\"loadData finished, set param controls\");\n\n if (saveState.cachedState && !saveState.isFilterSortSet) {\n saveState.log(\"set sort and filters\");\n\n const sortableHeaders = findAll(grid, \"thead tr.dg-head-columns th[aria-sort]\");\n for (const el of sortableHeaders) {\n el.setAttribute(\"aria-sort\", \"none\");\n }\n\n grid.querySelector(\n `thead tr.dg-head-columns th[field='${saveState.cachedState.sort}']`,\n )?.setAttribute(\"aria-sort\", saveState.cachedState.sortDir);\n\n const filters = findAll(grid.filterRow, \"[id^=dg-filter]\");\n for (const el of filters) {\n el.value = saveState.cachedState.filters[el.dataset.name];\n }\n saveState.isFilterSortSet = true;\n }\n\n /** @type {GridState} */\n const newState = {\n meta: grid.meta,\n pages: grid.pages,\n page: grid.page,\n perPage: grid.options.perPage,\n filters: {},\n columns: grid.options.columns.map((col) => ({ field: col.field, hidden: col.hidden })),\n sort: grid.getSort(),\n sortDir: grid.getSortDir(),\n scrollTo: window.scrollY,\n };\n\n const filters = grid.getFilters();\n\n for (const key of Object.keys(filters)) {\n newState.filters[key] = filters[key];\n }\n\n saveState.log(\"store new state\");\n saveState._setState(newState);\n\n if (!grid.options.server && saveState.cachedState && !saveState.isDataLoaded) {\n saveState.isDataLoaded = true;\n grid.filterData();\n grid.page = saveState.cachedState.page;\n grid.pageChanged();\n }\n\n resolve();\n });\n });\n };\n\n const updateState = () => {\n const saveState = grid.plugins.SaveState;\n const state = saveState._getState();\n if (!state) {\n return;\n }\n state.columns = grid.options.columns.map((col) => ({ field: col.field, hidden: col.hidden }));\n state.sort = grid.getSort();\n state.sortDir = grid.getSortDir();\n state.scrollTo = window.scrollY;\n saveState._setState(state);\n };\n\n document.addEventListener(\"scrollend\", updateState);\n grid.addEventListener(\"headerRendered\", updateState);\n\n grid.addEventListener(\"bodyRendered\", (ev) => {\n if (!grid.classList.contains(\"dg-initialized\") || grid.classList.contains(\"dg-loading\")) {\n return;\n }\n\n if (!grid.options.server) {\n updateState();\n }\n\n const saveState = grid.plugins.SaveState;\n if (!saveState.cachedState || !saveState.isFilterSortSet) {\n return;\n }\n\n if (!saveState.isDataLoaded) {\n saveState.isDataLoaded = true;\n grid.reload();\n } else if (!saveState.isScrolled) {\n saveState.isScrolled = true;\n window.scrollTo({ top: saveState.cachedState.scrollTo, left: 0, behavior: \"instant\" });\n }\n });\n }\n\n log(message) {\n this.grid.log(`[Save-State] ${message}`);\n }\n\n /**\n * @returns {GridState}\n */\n _getState() {\n let state;\n try {\n state = JSON.parse(sessionStorage.getItem(`gridSaveState_${this.grid.id}`));\n } catch (_) {}\n return state;\n }\n\n /**\n * @param {GridState} state\n */\n _setState(state) {\n sessionStorage.setItem(`gridSaveState_${this.grid.id}`, JSON.stringify(state));\n }\n}\n\nexport default SaveState;\n", "/**\r\n * Data Grid custom element\r\n * https://github.com/lekoala/data-grid/\r\n * @license MIT\r\n */\r\n\r\nimport DataGrid from \"./src/data-grid.js\";\r\n// Optional plugins\r\nimport ColumnResizer from \"./src/plugins/column-resizer.js\";\r\nimport ContextMenu from \"./src/plugins/context-menu.js\";\r\nimport DraggableHeaders from \"./src/plugins/draggable-headers.js\";\r\nimport TouchSupport from \"./src/plugins/touch-support.js\";\r\nimport SelectableRows from \"./src/plugins/selectable-rows.js\";\r\nimport FixedHeight from \"./src/plugins/fixed-height.js\";\r\nimport AutosizeColumn from \"./src/plugins/autosize-column.js\";\r\nimport ResponsiveGrid from \"./src/plugins/responsive-grid.js\";\r\nimport RowActions from \"./src/plugins/row-actions.js\";\r\nimport EditableColumn from \"./src/plugins/editable-column.js\";\r\nimport SpinnerSupport from \"./src/plugins/spinner-support.js\";\r\nimport SaveState from \"./src/plugins/save-state.js\";\r\n\r\n// Using shorthand property names\r\n// This make them reserved and keys will be preserved\r\n// Actual class names are renamed\r\nDataGrid.registerPlugins({\r\n ColumnResizer,\r\n ContextMenu,\r\n DraggableHeaders,\r\n TouchSupport,\r\n SelectableRows,\r\n FixedHeight,\r\n AutosizeColumn,\r\n ResponsiveGrid,\r\n RowActions,\r\n EditableColumn,\r\n SpinnerSupport,\r\n SaveState\r\n});\r\n\r\n// Prevent errors if included multiple times\r\nif (!customElements.get(\"data-grid\")) {\r\n customElements.define(\"data-grid\", DataGrid);\r\n}\r\n\r\nexport default DataGrid;\r\n\r\nconst global = typeof globalThis !== \"undefined\" ? globalThis : self;\r\nglobal.DataGrid = DataGrid;"], - "mappings": "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", + "sourcesContent": ["/**\n * @param {String} str\n * @returns {String}\n */\nexport default function camelize(str) {\n return str.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, (m, chr) => chr.toUpperCase());\n}\n", "/**\n * Parse data attribute and return properly typed data\n * @param {String} v\n * @returns {any}\n */\nexport default function normalizeData(v) {\n // Bool\n if (v === \"true\") {\n return true;\n }\n if (v === \"false\") {\n return false;\n }\n // Null or empty\n if (v === \"\" || v === \"null\") {\n return null;\n }\n // Numeric attributes\n if (v === Number(v).toString()) {\n return Number(v);\n }\n // Only attempt json parsing for array or objects\n if (v && [\"[\", \"{\"].includes(v.substring(0, 1))) {\n try {\n // In case we have only single quoted values, like ['one', 'two', 'three']\n let val = v;\n if (val.indexOf('\"') === -1) {\n val = val.replace(/'/g, '\"');\n }\n return JSON.parse(decodeURIComponent(val));\n } catch {\n console.error(`Failed to parse ${v}`);\n return {};\n }\n }\n return v;\n}\n", "/**\n * @typedef FlexibleHTMLProps\n * @property {boolean} [checked] (HTMLInputElement)\n * @property {string} [value] (HTMLInputElement)\n * @property {number} [rowHeight] (HTMLTableRowElement)\n *\n * A flexible type HTMLElement type that does not require using instanceof all over the place\n * Make sure that your selector is indeed valid\n * Only includes most commons props\n * @typedef {HTMLElement & FlexibleHTMLProps} FlexibleHTMLElement\n */\n\n/**\n * Keep this as reference for easy documentation\n * @typedef {HTMLElement&HTMLInputElement&HTMLTableRowElement} MixedHTMLElement\n */\n\n/**\n * @typedef FlexibleEventProps\n * @property {FlexibleHTMLElement} target\n * @property {FlexibleHTMLElement} currentTarget\n * @property {DataTransfer} [dataTransfer] (DragEvent)\n * @property {number} [clientX] (MouseEvent)\n * @property {number} [clientY] (MouseEvent)\n *\n * @typedef {Event & FlexibleEventProps} FlexibleEvent\n */\n\n/**\n * Keep this as reference for easy documentation\n * @typedef {Event&MouseEvent&InputEvent&DragEvent&FocusEvent&KeyboardEvent&PointerEvent} MixedEvent\n */\n\n/**\n * @callback FlexibleListener\n * @param {FlexibleEvent} event\n */\n\nclass FlexibleEventListenerObject {\n /**\n * @param {FlexibleEvent} e\n */\n handleEvent(e) {}\n}\n\nconst supportedPassiveTypes = [\n \"scroll\",\n \"wheel\",\n \"touchstart\",\n \"touchmove\",\n \"touchenter\",\n \"touchend\",\n \"touchleave\",\n \"mouseout\",\n \"mouseleave\",\n \"mouseup\",\n \"mousedown\",\n \"mousemove\",\n \"mouseenter\",\n \"mousewheel\",\n \"mouseover\",\n];\n\n/**\n * Automatically set passive options based on type\n * @param {string} type\n * @returns {AddEventListenerOptions}\n */\nfunction passiveOpts(type) {\n if (supportedPassiveTypes.includes(type)) {\n return { passive: true };\n }\n return {};\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n * @returns {any}\n */\nexport function getAttribute(el, name) {\n return el.getAttribute(name);\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n * @returns {Boolean}\n */\nexport function hasAttribute(el, name) {\n return el.hasAttribute(name);\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n * @param {any} v\n * @param {Boolean} check Prevent setting if attribute is already there\n */\nexport function setAttribute(el, name, v = \"\", check = false) {\n if (check && hasAttribute(el, name)) return;\n el.setAttribute(name, `${v}`);\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n */\nexport function removeAttribute(el, name) {\n if (hasAttribute(el, name)) {\n el.removeAttribute(name);\n }\n}\n\n/**\n * @param {EventTarget} el\n * @param {String} type\n * @param {EventListenerObject|FlexibleListener} listener\n */\nexport function on(el, type, listener) {\n el.addEventListener(type, listener, passiveOpts(type));\n}\n\n/**\n * @param {EventTarget} el\n * @param {String} type\n * @param {EventListenerObject|FlexibleListener} listener\n */\nexport function off(el, type, listener) {\n el.removeEventListener(type, listener, passiveOpts(type));\n}\n\n/**\n * @param {EventTarget} el\n * @param {String} type\n * @param {EventListenerObject|FlexibleListener} listener\n */\nexport function one(el, type, listener) {\n el.addEventListener(type, listener, {\n once: true,\n });\n}\n\n/**\n * @param {HTMLElement} el\n * @param {String} name\n * @param {any} data\n * @param {Boolean} bubbles\n */\nexport function dispatch(el, name, data = {}, bubbles = false) {\n const opts = {};\n if (bubbles) {\n opts.bubbles = true;\n }\n if (data) {\n opts.detail = data;\n }\n el.dispatchEvent(new CustomEvent(name, opts));\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n * @returns {Boolean}\n */\nexport function hasClass(el, name) {\n return el.classList.contains(name);\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n */\nexport function addClass(el, name) {\n el.classList.add(...name.split(\" \"));\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n */\nexport function removeClass(el, name) {\n el.classList.remove(...name.split(\" \"));\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n */\nexport function toggleClass(el, name) {\n el.classList.toggle(name);\n}\n\n/**\n * @param {String|HTMLElement} selector\n * @param {HTMLElement|Document} base\n * @returns {FlexibleHTMLElement|null}\n */\nexport function $(selector, base = document) {\n if (selector instanceof HTMLElement) {\n return selector;\n }\n return base.querySelector(selector);\n}\n\n/**\n * @param {String} selector\n * @param {Element|Document} base\n * @returns {Array}\n */\nexport function $$(selector, base = document) {\n return Array.from(base.querySelectorAll(selector));\n}\n\n/**\n * Easily retrieve untyped element\n * For actual type, prefer use of el.querySelector\n * @param {HTMLElement} el\n * @param {String|HTMLElement} selector\n * @returns {FlexibleHTMLElement}\n */\nexport function find(el, selector) {\n return $(selector, el);\n}\n\n/**\n * Easily retrieve untyped elements\n * For actual type, prefer use of el.querySelectorAll\n * @param {Element} el\n * @param {String} selector\n * @returns {Array}\n */\nexport function findAll(el, selector) {\n return $$(selector, el);\n}\n\n/**\n * @param {*} el\n * @returns {FlexibleHTMLElement}\n */\nexport function el(el) {\n return el;\n}\n\n/**\n * @template {keyof HTMLElementTagNameMap} K\n * @param {K} tagName\n * @param {HTMLElement} parent\n * @returns {HTMLElementTagNameMap[K]}\n */\nexport function ce(tagName, parent = null) {\n const el = document.createElement(tagName);\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n}\n\n/**\n * @param {HTMLElement} newNode\n * @param {HTMLElement} existingNode\n */\nexport function insertAfter(newNode, existingNode) {\n existingNode.parentNode.insertBefore(newNode, existingNode.nextSibling);\n}\n", "import camelize from \"../utils/camelize.js\";\nimport normalizeData from \"../utils/normalizeData.js\";\nimport { dispatch, getAttribute, setAttribute } from \"../utils/shortcuts.js\";\n\n/** @typedef {import('../data-grid').Options} Options */\n\n/**\n * Base element that does not contain any specific logic\n * related to this project but makes HTMLElemnt usable\n */\nclass BaseElement extends HTMLElement {\n /**\n * @param {Object} options\n */\n constructor(options = {}) {\n super();\n\n /** @type {Options} */\n this.options = Object.assign({}, this.defaultOptions, this.normalizedDataset, options);\n\n this.log(\"constructor\");\n\n this.setup = false;\n this.fireEvents = true;\n this._ready();\n\n this.log(\"ready\");\n }\n\n get defaultOptions() {\n return {};\n }\n\n /**\n * @param {String} opt\n * @returns {any}\n */\n getOption(opt) {\n return this.options[opt];\n }\n\n /**\n * @param {String} opt\n * @param {any} v\n */\n setOption(opt, v) {\n setAttribute(this, `data-${opt}`, v);\n }\n\n /**\n * @param {String} opt\n */\n toggleOption(opt) {\n setAttribute(this, `data-${opt}`, !this.getOption(opt));\n }\n\n get normalizedDataset() {\n const jsonConfig = this.dataset.config ? JSON.parse(this.dataset.config) : {};\n const data = { ...this.dataset };\n for (const key in data) {\n if (key === \"config\") {\n continue;\n }\n data[key] = normalizeData(data[key]);\n }\n // Once normalized, merge into json config\n Object.assign(data, jsonConfig);\n return data;\n }\n\n /**\n * @returns {String}\n */\n static template() {\n return \"\";\n }\n\n /**\n * This is called at the end of constructor. Extend in subclass if needed.\n */\n _ready() {}\n\n /**\n * @param {String|Error} message\n */\n log(message) {\n if (this.options.debug) {\n console.log(`[${getAttribute(this, \"id\")}] ${message}`);\n }\n }\n\n /**\n * Handle events within the component\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#handling-events\n * @param {Event} event\n */\n handleEvent(event) {\n if (this[`on${event.type}`]) {\n this[`on${event.type}`](event);\n }\n }\n\n /**\n * This is called when connected. Extend in subclass if needed.\n */\n _connected() {}\n\n connectedCallback() {\n // already connected\n if (this.setup) {\n return;\n }\n this.setup = true;\n // ensure whenDefined callbacks run first\n setTimeout(() => {\n this.log(\"connectedCallback\");\n\n // Append only when labels had the opportunity to be set\n // Don't use shadow dom as it makes theming super hard\n const template = document.createElement(\"template\");\n // @ts-ignore\n template.innerHTML = this.constructor.template();\n this.appendChild(template.content.cloneNode(true));\n\n this._connected();\n // @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#life-cycle-events\n dispatch(this, \"connected\");\n }, 0);\n }\n\n /**\n * This is called when disconnected. Extend in subclass if needed.\n */\n _disconnected() {}\n\n /**\n * @link https://nolanlawson.com/2024/12/01/avoiding-unnecessary-cleanup-work-in-disconnectedcallback/\n */\n disconnectedCallback() {\n setTimeout(() => {\n if (!this.isConnected && this.setup) {\n this.log(\"disconnectedCallback\");\n this._disconnected();\n // @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#life-cycle-events\n dispatch(this, \"disconnected\");\n this.setup = false;\n }\n }, 0);\n }\n\n /**\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#a-props-like-accessor\n * @returns {Object}\n */\n get transformAttributes() {\n return {};\n }\n\n /**\n * This is only meant to work with data attributes\n * This allows us to have properties that reflect automatically in the component\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#reflected-dataset-attributes\n * @param {String} attributeName\n * @param {String} oldValue\n * @param {String} newValue\n */\n attributeChangedCallback(attributeName, oldValue, newValue) {\n // It didn't change\n if (oldValue === newValue) {\n return;\n }\n\n this.log(`attributeChangedCallback: ${attributeName}`);\n\n let isOption = false;\n const transformer = this.transformAttributes[attributeName] ?? normalizeData;\n\n let attr = attributeName;\n // Data attributes are mapped to options while other attributes are mapped as properties\n if (attr.indexOf(\"data-\") === 0) {\n attr = attr.slice(5);\n isOption = true;\n }\n attr = camelize(attr);\n if (isOption) {\n this.options[attr] = transformer(newValue);\n } else {\n this[attr] = transformer(newValue);\n }\n\n // Fire internal event\n if (this.fireEvents && this[`${attr}Changed`]) {\n this[`${attr}Changed`]();\n }\n }\n}\n\nexport default BaseElement;\n", "/**\n * @param {HTMLSelectElement} el\n * @param {String} value\n * @param {String} label\n * @param {Boolean} checked\n */\nexport default function addSelectOption(el, value, label, checked = false) {\n const opt = document.createElement(\"option\");\n opt.value = `${value}`;\n if (checked) {\n opt.selected = true;\n }\n opt.label = label;\n el.appendChild(opt);\n}\n", "/**\n * @param {URL} url\n * @param {Object} params\n */\nexport default function appendParamsToUrl(url, params = {}) {\n for (const key of Object.keys(params)) {\n if (Array.isArray(params[key])) {\n for (const k of Object.keys(params[key])) {\n // @ts-ignore\n url.searchParams.append(isNaN(k) ? `${key}[${k}]` : key, params[key][k]);\n }\n } else {\n url.searchParams.append(key, params[key]);\n }\n }\n}\n", "/**\n * Force value as arrays\n * @param {String|Array} v\n * @returns {Array}\n */\nexport default function convertArray(v) {\n if (typeof v === \"string\") {\n if (v[0] === \"[\") {\n // \"['my', 'value']\" would fail as a json\n let bv = v;\n if (bv.indexOf('\"') === -1) {\n bv = bv.replace(/'/g, '\"');\n }\n return JSON.parse(bv);\n }\n\n return v.split(\",\");\n }\n if (!Array.isArray(v)) {\n console.error(\"Invalid array\", v);\n return [];\n }\n return v;\n}\n", "/**\n * @param {HTMLElement} el\n * @returns {Object}\n */\nexport default function elementOffset(el) {\n const rect = el.getBoundingClientRect();\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return { top: rect.top + scrollTop, left: rect.left + scrollLeft };\n}\n", "/**\n * Replace element within {} by their data value\n * @param {String} str\n * @param {Object} data\n * @returns {String}\n */\nexport default function interpolate(str, data) {\n return str.replace(/\\{([^}]+)?\\}/g, ($1, $2) => data[$2]);\n}\n", "let canvas;\n\n/**\n * Uses canvas.measureText to compute and return the width of the given text of given font in pixels.\n * Getting computed styles only works for dom that are added in the dom\n * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393\n * @param {String} text The text to be rendered.\n * @param {Element} el Target element (defaults to body)\n * @param {Boolean} withPadding Include padding on element\n * @returns {Number}\n */\nexport default function getTextWidth(text, el = document.body, withPadding = false) {\n const styles = window.getComputedStyle(el || document.createElement(\"div\"));\n const fontWeight = styles.getPropertyValue(\"font-weight\") || \"normal\";\n const fontSize = styles.getPropertyValue(\"font-size\") || \"1rem\";\n const fontFamily = styles.getPropertyValue(\"font-family\") || \"Arial\";\n\n let padding = 0;\n if (withPadding) {\n const paddingLeft = styles.getPropertyValue(\"padding-left\") || \"0\";\n const paddingRight = styles.getPropertyValue(\"padding-right\") || \"0\";\n padding = Number.parseInt(paddingLeft) + Number.parseInt(paddingRight);\n }\n\n // re-use canvas object for better performance\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const context = canvas.getContext(\"2d\");\n context.font = `${fontWeight} ${fontSize} ${fontFamily}`;\n const metrics = context.measureText(text);\n return Number.parseInt(metrics.width) + padding;\n}\n", "/**\n * @param {String} prefix\n * @returns {String}\n */\nexport default function randstr(prefix) {\n return Math.random()\n .toString(36)\n .replace(\"0.\", prefix || \"\");\n}\n", "/**\n * Define a function that can be happily passed to addEventListener\n * @typedef {Function & EventListenerOrEventListenerObject} ExtendedFunction\n */\n\n/**\n * @param {Function} handler\n * @param {Number} timeout\n * @returns {ExtendedFunction}\n */\nexport default function debounce(handler, timeout = 300) {\n let timer = null;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n handler(...args);\n }, timeout);\n };\n}\n", "/**\n * Data Grid Web component\n *\n * Credits for inspiration\n * @link https://github.com/riverside/zino-grid\n */\n\nimport BaseElement from \"./core/base-element.js\";\nimport addSelectOption from \"./utils/addSelectOption.js\";\nimport appendParamsToUrl from \"./utils/appendParamsToUrl.js\";\nimport camelize from \"./utils/camelize.js\";\nimport convertArray from \"./utils/convertArray.js\";\nimport elementOffset from \"./utils/elementOffset.js\";\nimport interpolate from \"./utils/interpolate.js\";\nimport getTextWidth from \"./utils/getTextWidth.js\";\nimport randstr from \"./utils/randstr.js\";\nimport debounce from \"./utils/debounce.js\";\nimport {\n $,\n $$,\n dispatch,\n find,\n findAll,\n hasClass,\n removeAttribute,\n getAttribute,\n setAttribute,\n addClass,\n toggleClass,\n on,\n ce,\n} from \"./utils/shortcuts.js\";\n\n/**\n * Column definition\n * @typedef Column\n * @property {String} field - the key in the data\n * @property {String} title - the title to display in the header (defaults to \"field\" if not set)\n * @property {Number} [width] - the width of the column (auto otherwise)\n * @property {String} [class] - class to set on the column (target body or header with th.class or td.class)\n * @property {String} [attr] - don't render the column and set a matching attribute on the row with the value of the field\n * @property {Boolean} [hidden] - hide the column\n * @property {Boolean} [noSort] - allow disabling sort for a given column\n * @property {String | Function} [format] - custom data formatting\n * @property {String} [defaultFormatValue] - default value to use for formatting\n * @property {String} [transform] - custom value transformation\n * @property {Boolean} [editable] - replace with input (EditableColumn module)\n * @property {String} [editableType] - type of input (EditableColumn module)\n * @property {Number} [responsive] - the higher the value, the sooner it will be hidden, disable with 0 (ResponsiveGrid module)\n * @property {Boolean} [responsiveHidden] - hidden through responsive module (ResponsiveGrid module)\n * @property {String} [filterType] - defines a filter field type (\"text\" or \"select\" - defaults to \"text\")\n * @property {Array} [filterList] - defines a custom array to populate a filter select field in the format of [{value: \"\", text: \"\"},...]. When defined, it overrides the default behaviour where the filter select elements are populated by the unique values from the corresponding column records.\n * @property {Object} [firstFilterOption] - defines an object for the first option element of the filter select field. defaults to {value: \"\", text: \"\"}\n */\n\n/**\n * Row action\n * @typedef Action\n * @property {String} title - the title of the button\n * @property {String} name - the name of the action\n * @property {String} class - the class for the button\n * @property {String} url - link for the action\n * @property {String} html - custom button data\n * @property {Boolean} [confirm] - needs confirmation\n * @property {Boolean} default - is the default row action\n */\n\n// Import definitions without importing the actual file\n/** @typedef {import('./plugins/autosize-column').default} AutosizeColumn */\n/** @typedef {import('./plugins/column-resizer').default} ColumnResizer */\n/** @typedef {import('./plugins/context-menu').default} ContextMenu */\n/** @typedef {import('./plugins/draggable-headers').default} DraggableHeaders */\n/** @typedef {import('./plugins/editable-column').default} EditableColumn */\n/** @typedef {import('./plugins/fixed-height').default} FixedHeight */\n/** @typedef {import('./plugins/responsive-grid').default} ResponsiveGrid */\n/** @typedef {import('./plugins/row-actions').default} RowActions */\n/** @typedef {import('./plugins/selectable-rows').default} SelectableRows */\n/** @typedef {import('./plugins/touch-support').default} TouchSupport */\n/** @typedef {import('./plugins/spinner-support').default} SpinnerSupport */\n/** @typedef {import('./plugins/save-state').default} SaveState */\n\n/**\n * These plugins are all optional\n * @typedef {Object} Plugins\n * @property {ColumnResizer} [ColumnResizer] resize handlers in the headers\n * @property {ContextMenu} [ContextMenu] menu to show/hide columns\n * @property {DraggableHeaders} [DraggableHeaders] draggable headers columns\n * @property {EditableColumn} [EditableColumn] draggable headers columns\n * @property {TouchSupport} [TouchSupport] touch swipe\n * @property {SelectableRows} [SelectableRows] create a column with checkboxes to select rows\n * @property {FixedHeight} [FixedHeight] allows having fixed height tables\n * @property {AutosizeColumn} [AutosizeColumn] compute ideal width based on column content\n * @property {ResponsiveGrid} [ResponsiveGrid] hide/show column on the fly\n * @property {RowActions} [RowActions] add action on rows\n * @property {SpinnerSupport} [SpinnerSupport] inserts a spinning icon element to indicate grid loading.\n * @property {SaveState} [SaveState] stores grid filter, sort, and paging.\n */\n\n/**\n * Parameters to pass along or receive from the server\n * @typedef ServerParams\n * @property {String} serverParams.start\n * @property {String} serverParams.length\n * @property {String} serverParams.search\n * @property {String} serverParams.sort\n * @property {String} serverParams.sortDir\n * @property {String} serverParams.dataKey\n * @property {String} serverParams.metaKey\n * @property {String} serverParams.metaTotalKey\n * @property {String} serverParams.metaFilteredKey\n * @property {String} serverParams.optionsKey\n * @property {String} serverParams.paramsKey\n */\n\n/**\n * Available data grid options, plugins included\n * @typedef Options\n * @property {?String} id Custom id for the grid\n * @property {?String} url An URL with data to display in JSON format\n * @property {Boolean} debug Log actions in DevTools console\n * @property {Boolean} filter Allows a filtering functionality\n * @property {Boolean} sort Allows a sort by column functionality\n * @property {String} defaultSort Default sort field if sorting is enabled\n * @property {Boolean} server Is a server side powered grid\n * @property {ServerParams} serverParams Describe keys passed to the server backend\n * @property {String} dir Dir\n * @property {Array} perPageValues Available per page options\n * @property {Boolean} hidePerPage Hides the page size select element\n * @property {Column[]} columns Available columns\n * @property {Number} defaultPage Starting page\n * @property {Number} perPage Number of records displayed per page (page size)\n * @property {Boolean} expand Allow cell content to spawn over multiple lines\n * @property {Action[]} actions Row actions (RowActions module)\n * @property {Boolean} collapseActions Group actions (RowActions module)\n * @property {Boolean} resizable Make columns resizable (ColumnResizer module)\n * @property {Boolean} selectable Allow selecting rows with a checkbox (SelectableRows module)\n * @property {Boolean} selectVisibleOnly Select all only selects visible rows (SelectableRows module)\n * @property {Boolean} autosize Compute column sizes based on given data (Autosize module)\n * @property {Boolean} autoheight Adjust height so that it matches table size (FixedHeight module)\n * @property {Boolean} autohidePager auto-hides the pager when number of records falls below the selected page size\n * @property {Boolean} menu Right click menu on column headers (ContextMenu module)\n * @property {Boolean} reorder Allows a column reordering functionality (DraggableHeaders module)\n * @property {Boolean} responsive Change display mode on small screens (ResponsiveGrid module)\n * @property {Boolean} responsiveToggle Show toggle column (ResponsiveGrid module)\n * @property {Boolean} filterOnEnter Toggles the ability to filter column data by pressing the Enter or Return key\n * @property {String} spinnerClass Sets a space-delimited string of css classes for a spinner (use spinner-border css class for bootstrap 5 spinner)\n * @property {Number} filterKeypressDelay Sets a keypress delay time in milliseconds before triggering filter operation.\n * @property {Boolean} saveState Enable/disable save state plugin (SaveState module)\n * @property {?String} errorMessage A generic text to be displayed in footer when error occurs.\n */\n\n/**\n * Available labels that can be translated\n * @typedef Labels\n * @property {String} itemsPerPage\n * @property {String} gotoPage\n * @property {String} gotoFirstPage\n * @property {String} gotoPrevPage\n * @property {String} gotoNextPage\n * @property {String} gotoLastPage\n * @property {String} of\n * @property {String} items\n * @property {String} resizeColumn\n * @property {String} noData\n * @property {String} areYouSure\n * @property {String} networkError\n */\n\n/**\n * List of registered plugins\n * @type {Plugins}\n */\nlet plugins = {};\n\n/**\n * @type {Labels}\n */\nlet labels = {\n itemsPerPage: \"Items per page\",\n gotoPage: \"Go to page\",\n gotoFirstPage: \"Go to first page\",\n gotoPrevPage: \"Go to previous page\",\n gotoNextPage: \"Go to next page\",\n gotoLastPage: \"Go to last page\",\n of: \"of\",\n items: \"items\",\n resizeColumn: \"Resize column\",\n noData: \"No data\",\n areYouSure: \"Are you sure?\",\n networkError: \"Network response error\",\n};\n\n/**\n * Column definition will update some props on the html element\n * @param {HTMLElement} el\n * @param {Column} column\n */\nfunction applyColumnDefinition(el, column) {\n if (column.width) {\n setAttribute(el, \"width\", column.width);\n }\n if (column.class) {\n addClass(el, column.class);\n }\n if (column.hidden) {\n setAttribute(el, \"hidden\", \"\");\n if (column.responsiveHidden) {\n addClass(el, \"dg-responsive-hidden\");\n }\n }\n}\n\n/**\n */\nclass DataGrid extends BaseElement {\n _filterSelector = \"[id^=dg-filter]\";\n _excludedKeys = [\n 37,\n 39,\n 38,\n 40,\n 45,\n 36,\n 35,\n 33,\n 34,\n 27,\n 20,\n 16,\n 17,\n 91,\n 92,\n 18,\n 93,\n 144,\n 231,\n \"ArrowLeft\",\n \"ArrowRight\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"Insert\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n \"Escape\",\n \"CapsLock\",\n \"Shift\",\n \"Control\",\n \"Meta\",\n \"Alt\",\n \"ContextMenu\",\n \"NumLock\",\n \"Unidentified\",\n ];\n\n _ready() {\n setAttribute(this, \"id\", this.options.id ?? randstr(\"el-\"), true);\n\n /**\n * The grid displays that data\n * @type {Array}\n */\n this.data = [];\n /**\n * We store the original data in this\n * @type {Array}\n */\n this.originalData; // declared uninitialized to allow data preloading before fetch.\n\n // Make the IDE happy\n /**\n * @type {Options}\n */\n this.options = this.options || this.defaultOptions;\n\n // Init values\n this.fireEvents = false;\n this.page = this.options.defaultPage || 1;\n this.pages = 0;\n this.meta; // declared uninitialized to allow data preloading before fetch.\n /**\n * @type {Plugins}\n */\n this.plugins = {};\n // Init plugins\n for (const [pluginName, pluginClass] of Object.entries(plugins)) {\n // @ts-ignore until we can set typeof import ...\n this.plugins[pluginName] = new pluginClass(this);\n }\n\n // Expose options as observed attributes in the dom\n // Do it when fireEvents is disabled to avoid firing change callbacks\n for (const attr of DataGrid.observedAttributes) {\n if (attr.indexOf(\"data-\") === 0) {\n setAttribute(this, attr, this.options[camelize(attr.slice(5))]);\n }\n }\n }\n\n static template() {\n return `\n\n \n \n \n \n \n \n \n \n \n \n \n
\n`;\n }\n\n /**\n * @returns {Labels}\n */\n get labels() {\n return labels;\n }\n\n /**\n * @returns {Labels}\n */\n static getLabels() {\n return labels;\n }\n\n /**\n * @param {Object} v\n */\n static setLabels(v) {\n labels = Object.assign(labels, v);\n }\n\n /**\n * @returns {Column}\n */\n get defaultColumn() {\n return {\n field: \"\",\n title: \"\",\n width: 0,\n class: \"\",\n attr: \"\",\n hidden: false,\n editable: false,\n noSort: false,\n responsive: 1,\n responsiveHidden: false,\n format: \"\",\n transform: \"\",\n filterType: \"text\",\n firstFilterOption: { value: \"\", text: \"\" },\n };\n }\n\n /**\n * @returns {Options}\n */\n get defaultOptions() {\n return {\n id: null,\n url: null,\n perPage: 10,\n debug: false,\n filter: false,\n menu: false,\n sort: false,\n server: false,\n serverParams: {\n start: \"start\",\n length: \"length\",\n search: \"search\",\n sort: \"sort\",\n sortDir: \"sortDir\",\n dataKey: \"data\",\n metaKey: \"meta\",\n metaTotalKey: \"total\",\n metaFilteredKey: \"filtered\",\n optionsKey: \"options\",\n paramsKey: \"params\",\n },\n defaultSort: \"\",\n reorder: false,\n dir: \"ltr\",\n perPageValues: [10, 25, 50, 100, 250],\n hidePerPage: false,\n columns: [],\n actions: [],\n collapseActions: false,\n selectable: false,\n selectVisibleOnly: true,\n defaultPage: 1,\n resizable: false,\n autosize: true,\n expand: false,\n autoheight: true,\n autohidePager: false,\n responsive: false,\n responsiveToggle: true,\n filterOnEnter: true,\n filterKeypressDelay: 500,\n spinnerClass: \"\",\n saveState: false,\n errorMessage: \"\",\n };\n }\n\n /**\n * Determines if the grid is initialized.\n * @returns {Boolean}\n */\n get isInit() {\n return this.classList.contains(\"dg-initialized\");\n }\n\n /**\n * Determines if data load has failed.\n * @returns {Boolean}\n */\n get hasDataError() {\n return this.classList.contains(\"dg-network-error\");\n }\n\n /**\n * @param {Plugins} list\n */\n static registerPlugins(list) {\n plugins = list;\n }\n\n /**\n * @param {String} plugin\n */\n static unregisterPlugins(plugin = null) {\n if (plugin === null) {\n plugins = {};\n } else {\n delete plugins[plugin];\n }\n }\n\n /**\n * @returns {Plugins}\n */\n static registeredPlugins() {\n return plugins;\n }\n\n /**\n * @param {Object|Array} columns\n * @returns {Column[]}\n */\n convertColumns(columns) {\n const cols = [];\n // Convert key:value objects to actual columns\n if (typeof columns === \"object\" && !Array.isArray(columns)) {\n for (const key of Object.keys(columns)) {\n const col = Object.assign({}, this.defaultColumn);\n col.title = columns[key];\n col.field = key;\n cols.push(col);\n }\n } else {\n for (const item of columns) {\n let col = Object.assign({}, this.defaultColumn);\n if (typeof item === \"string\") {\n col.title = item;\n col.field = item;\n } else if (typeof item === \"object\") {\n col = Object.assign(col, item);\n if (!col.field) {\n console.error(\"Invalid column definition\", item);\n }\n if (!col.title) {\n col.title = col.field;\n }\n } else {\n console.error(\"Column definition must be a string or an object\");\n }\n cols.push(col);\n }\n }\n return cols;\n }\n\n /**\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#reflected-dom-attributes\n * @returns {Array}\n */\n static get observedAttributes() {\n return [\n \"page\",\n \"data-filter\",\n \"data-sort\",\n \"data-debug\",\n \"data-reorder\",\n \"data-menu\",\n \"data-selectable\",\n \"data-url\",\n \"data-per-page\",\n \"data-responsive\",\n ];\n }\n\n get transformAttributes() {\n return {\n columns: (v) => this.convertColumns(convertArray(v)),\n actions: (v) => convertArray(v),\n defaultPage: (v) => Number.parseInt(v),\n perPage: (v) => Number.parseInt(v),\n };\n }\n\n /** @returns {HTMLTableSectionElement} */\n get thead() {\n //@ts-ignore\n return $(\"thead\", this);\n }\n\n /** @returns {HTMLTableSectionElement} */\n get tbody() {\n //@ts-ignore\n return $(\"tbody\", this);\n }\n\n /** @returns {HTMLTableSectionElement} */\n get tfoot() {\n //@ts-ignore\n return $(\"tfoot\", this);\n }\n\n get page() {\n return Number.parseInt(this.getAttribute(\"page\"));\n }\n\n set page(val) {\n setAttribute(this, \"page\", this.constrainPageValue(val));\n }\n\n /**\n * Loads data and configures the grid.\n * @param {Boolean} initOnly\n */\n urlChanged(initOnly = false) {\n if (initOnly && !this.isInit) return;\n this.reconfig();\n this.loadData().then(() => {\n this.configureUi();\n });\n }\n\n /**\n * Clears columns, re-renders table, and repopulates columns to ensure consistent column widths rendering.\n */\n reconfig() {\n const cols = this.options.columns;\n this.options.columns = [];\n this.configureUi();\n this.options.columns = cols;\n }\n\n constrainPageValue(v) {\n let pv = v;\n if (this.pages < pv) {\n pv = this.pages;\n }\n if (pv < 1 || !pv) {\n pv = 1;\n }\n return pv;\n }\n\n fixPage() {\n this.pages = this.totalPages();\n this.page = this.constrainPageValue(this.page);\n\n // Show current page in input\n setAttribute(this.inputPage, \"max\", this.pages);\n this.inputPage.value = `${this.page}`;\n this.inputPage.disabled = this.pages < 2;\n }\n\n pageChanged() {\n this.reload();\n }\n\n responsiveChanged() {\n if (!this.plugins.ResponsiveGrid) {\n return;\n }\n if (this.options.responsive) {\n this.plugins.ResponsiveGrid.observe();\n } else {\n this.plugins.ResponsiveGrid.unobserve();\n }\n }\n\n menuChanged() {\n this.renderHeader();\n }\n\n /**\n * This is the callback for the select control\n */\n changePerPage() {\n this.options.perPage = Number.parseInt(this.selectPerPage.options[this.selectPerPage.selectedIndex].value);\n this.perPageChanged();\n }\n\n /**\n * This is the actual event triggered on attribute change\n */\n perPageChanged() {\n // Refresh UI\n if (\n this.options.perPage !== Number.parseInt(this.selectPerPage.options[this.selectPerPage.selectedIndex].value)\n ) {\n this.perPageValuesChanged();\n }\n // Make sure current page is still valid\n let updatePage = this.page;\n while (updatePage > 1 && this.page * this.options.perPage > this.totalRecords()) {\n updatePage--;\n }\n if (updatePage !== this.page) {\n // Triggers pageChanged, which will trigger reload\n this.page = updatePage;\n } else {\n // Simply reload current page\n this.reload(() => {\n // Preserve distance between top of page and select control if no fixed height\n if (!this.plugins.FixedHeight || !this.plugins.FixedHeight.hasFixedHeight) {\n this.selectPerPage.scrollIntoView();\n }\n });\n }\n }\n\n dirChanged() {\n setAttribute(this, \"dir\", this.options.dir);\n }\n\n defaultSortChanged() {\n this.sortChanged();\n }\n\n /**\n * Populate the select dropdown according to options\n */\n perPageValuesChanged() {\n if (!this.selectPerPage) {\n return;\n }\n while (this.selectPerPage.lastChild) {\n this.selectPerPage.removeChild(this.selectPerPage.lastChild);\n }\n for (const v of this.options.perPageValues) {\n addSelectOption(this.selectPerPage, v, v, v === this.options.perPage);\n }\n }\n\n _connected() {\n /**\n * @type {HTMLTableElement}\n */\n this.table = this.querySelector(\"table\");\n /**\n * @type {HTMLInputElement}\n */\n this.btnFirst = this.querySelector(\".dg-btn-first\");\n /**\n * @type {HTMLInputElement}\n */\n this.btnPrev = this.querySelector(\".dg-btn-prev\");\n /**\n * @type {HTMLInputElement}\n */\n this.btnNext = this.querySelector(\".dg-btn-next\");\n /**\n * @type {HTMLInputElement}\n */\n this.btnLast = this.querySelector(\".dg-btn-last\");\n /**\n * @type {HTMLSelectElement}\n */\n this.selectPerPage = this.querySelector(\".dg-select-per-page\");\n /**\n * @type {HTMLInputElement}\n */\n this.inputPage = this.querySelector(\".dg-input-page\");\n\n this.getFirst = this.getFirst.bind(this);\n this.getPrev = this.getPrev.bind(this);\n this.getNext = this.getNext.bind(this);\n this.getLast = this.getLast.bind(this);\n this.changePerPage = this.changePerPage.bind(this);\n this.gotoPage = this.gotoPage.bind(this);\n\n this.btnFirst.addEventListener(\"click\", this.getFirst);\n this.btnPrev.addEventListener(\"click\", this.getPrev);\n this.btnNext.addEventListener(\"click\", this.getNext);\n this.btnLast.addEventListener(\"click\", this.getLast);\n this.selectPerPage.addEventListener(\"change\", this.changePerPage);\n this.selectPerPage.toggleAttribute(\"hidden\", this.options.hidePerPage);\n this.inputPage.addEventListener(\"input\", this.gotoPage);\n\n for (const plugin of Object.values(this.plugins)) {\n plugin.connected();\n }\n\n // Display even if we don't have data\n this.dirChanged();\n this.perPageValuesChanged();\n\n // @ts-ignore\n this.loadData().finally(() => {\n this.configureUi();\n\n this.sortChanged();\n this.classList.add(\"dg-initialized\"); //acts as a flag to prevent unnecessary server calls down the chain.\n\n this.filterChanged();\n this.reorderChanged();\n\n this.dirChanged();\n this.perPageValuesChanged();\n this.pageChanged();\n\n this.fireEvents = true; // We can now fire attributeChangedCallback events\n\n this.log(\"initialized\");\n });\n }\n\n _disconnected() {\n this.btnFirst?.removeEventListener(\"click\", this.getFirst);\n this.btnPrev?.removeEventListener(\"click\", this.getPrev);\n this.btnNext?.removeEventListener(\"click\", this.getNext);\n this.btnLast?.removeEventListener(\"click\", this.getLast);\n this.selectPerPage?.removeEventListener(\"change\", this.changePerPage);\n this.inputPage?.removeEventListener(\"input\", this.gotoPage);\n\n for (const plugin of Object.values(this.plugins)) {\n plugin.disconnected();\n }\n }\n\n /**\n * @param {string} field\n * @returns {Column}\n */\n getCol(field) {\n let found = null;\n\n for (const col of this.options.columns) {\n if (col.field === field) {\n found = col;\n }\n }\n return found;\n }\n\n getColProp(field, prop) {\n const c = this.getCol(field);\n return c ? c[prop] : null;\n }\n\n setColProp(field, prop, val) {\n const c = this.getCol(field);\n if (c) {\n c[prop] = val;\n }\n }\n\n visibleColumns() {\n return this.options.columns.filter((col) => {\n return !col.hidden;\n });\n }\n\n hiddenColumns() {\n return this.options.columns.filter((col) => {\n return col.hidden === true;\n });\n }\n\n showColumn(field, render = true) {\n this.setColProp(field, \"hidden\", false);\n\n // We need to render the whole table otherwise layout fixed won't do its job\n if (render) this.renderTable();\n\n dispatch(this, \"columnVisibility\", {\n col: field,\n visibility: \"visible\",\n });\n }\n\n hideColumn(field, render = true) {\n this.setColProp(field, \"hidden\", true);\n\n // We need to render the whole table otherwise layout fixed won't do its job\n if (render) this.renderTable();\n\n dispatch(this, \"columnVisibility\", {\n col: field,\n visibility: \"hidden\",\n });\n }\n\n /**\n * Returns the starting index of actual data\n * @returns {Number}\n */\n startColIndex() {\n let start = 1;\n if (this.options.selectable && this.plugins.SelectableRows) {\n start++;\n }\n if (this.options.responsive && this.plugins.ResponsiveGrid && this.plugins.ResponsiveGrid.hasHiddenColumns()) {\n start++;\n }\n return start;\n }\n\n /**\n * @returns {Boolean}\n */\n isSticky() {\n return this.hasAttribute(\"sticky\");\n }\n\n /**\n * @param {Boolean} visibleOnly\n * @returns {Number}\n */\n columnsLength(visibleOnly = false) {\n let len = 0;\n // One column per (visible) column\n for (const col of this.options.columns) {\n if (visibleOnly && col.hidden) {\n continue;\n }\n if (!col.attr) {\n len++;\n }\n }\n // Add one col for selectable checkbox at the beginning\n if (this.options.selectable && this.plugins.SelectableRows) {\n len++;\n }\n // Add one col for actions at the end\n if (this.options.actions.length && this.plugins.RowActions) {\n len++;\n }\n // Add one col for the responsive toggle\n if (this.options.responsive && this.plugins.ResponsiveGrid && this.plugins.ResponsiveGrid.hasHiddenColumns()) {\n len++;\n }\n return len;\n }\n\n /**\n * Global configuration and renderTable\n * This should be called after your data has been loaded\n */\n configureUi() {\n this.table.style.visibility = \"hidden\";\n this.renderTable();\n if (this.options.responsive && this.plugins.ResponsiveGrid) {\n // Let the observer make the table visible\n } else {\n this.table.style.visibility = \"visible\";\n }\n\n // Store row height for later usage\n if (!this.rowHeight) {\n const tr = find(this, \"tbody tr\") || find(this, \"table tr\");\n if (tr) {\n this.rowHeight = tr.offsetHeight;\n }\n }\n this.fixPage();\n }\n\n filterChanged() {\n const row = this.querySelector(\"thead tr.dg-head-filters\");\n if (this.options.filter) {\n removeAttribute(row, \"hidden\");\n } else {\n this.clearFilters();\n setAttribute(row, \"hidden\", \"\");\n }\n }\n\n reorderChanged() {\n const headers = findAll(this, \"thead tr.dg-head-columns th\");\n for (const th of headers) {\n if (th.classList.contains(\"dg-selectable\") || th.classList.contains(\"dg-actions\")) {\n continue;\n }\n if (this.options.reorder && this.plugins.DraggableHeaders) {\n th.draggable = true;\n } else {\n th.removeAttribute(\"draggable\");\n }\n }\n }\n\n sortChanged() {\n this.log(\"toggle sort\");\n\n const headers = findAll(this, \"thead tr.dg-head-columns th\");\n for (const th of headers) {\n const fieldName = th.getAttribute(\"field\");\n if (\n th.classList.contains(\"dg-not-sortable\") ||\n (!this.fireEvents && fieldName === this.options.defaultSort)\n ) {\n return;\n }\n if (this.options.sort && !this.getColProp(fieldName, \"noSort\")) {\n setAttribute(th, \"aria-sort\", \"none\");\n } else {\n removeAttribute(th, \"aria-sort\");\n }\n }\n }\n\n selectableChanged() {\n this.renderTable();\n }\n\n addRow(row) {\n if (!Array.isArray(this.originalData)) {\n return;\n }\n this.log(\"add row\");\n this.originalData.push(row);\n this.data = this.originalData.slice();\n this.sortData();\n }\n\n /**\n * @param {any} value Value to remove. Defaults to last row.\n * @param {String} key The key of the item to remove. Defaults to first column\n */\n removeRow(value = null, key = null) {\n if (!Array.isArray(this.originalData)) {\n return;\n }\n\n let v = value;\n let k = key;\n if (k === null) {\n k = this.options.columns[0].field;\n }\n if (v === null) {\n v = this.originalData[this.originalData.length - 1][k];\n }\n this.log(`remove row ${k}:${v}`);\n for (let i = 0; i < this.originalData.length; i++) {\n if (this.originalData[i][k] === v) {\n this.originalData.splice(i, 1);\n break;\n }\n }\n this.data = this.originalData.slice();\n this.sortData();\n }\n\n /**\n * @param {String} key Return a specific key (eg: id) instead of the whole row\n * @returns {Array}\n */\n getSelection(key = null) {\n if (!this.plugins.SelectableRows) {\n return [];\n }\n return this.plugins.SelectableRows.getSelection(key);\n }\n\n getData() {\n return this.originalData;\n }\n\n clearData() {\n // Already empty\n if (this.data.length === 0) {\n return;\n }\n this.data = this.originalData = [];\n this.renderBody();\n }\n\n /**\n * Preloads the data intended to bypass the initial fetch operation, allowing for faster intial page load time.\n * Subsequent grid actions after initialization will operate as normal.\n * @param {Object} data - an object with meta ({total, filtered, start}) and data (array of objects) properties.\n */\n preload(data) {\n const metaKey = this.options.serverParams.metaKey;\n const dataKey = this.options.serverParams.dataKey;\n if (data?.[metaKey]) {\n this.meta = data[metaKey];\n }\n if (data?.[dataKey]) {\n this.data = this.originalData = data[dataKey];\n }\n }\n\n refresh(cb = null) {\n this.data = this.originalData = [];\n return this.reload(cb);\n }\n\n reload(cb = null) {\n this.log(\"reload\");\n\n // If the data was cleared, we need to render again\n const needRender = !this.originalData?.length;\n this.fixPage();\n // @ts-ignore\n this.loadData().finally(() => {\n if (this.hasDataError) return;\n // If we load data from the server, we redraw the table body\n // Otherwise, we just need to paginate\n this.options.server || needRender ? this.renderBody() : this.paginate();\n if (cb) {\n cb();\n }\n });\n }\n\n /**\n * @returns {Promise}\n */\n loadData() {\n const flagEmpty = () => !this.data.length && this.classList.add(\"dg-empty\");\n const tbody = this.tbody;\n\n // We already have some data\n if (this.meta || this.originalData || this.isInit) {\n // We don't use server side data\n if (!this.options.server || (this.options.server && !this.fireEvents)) {\n this.log(\"skip loadData\");\n flagEmpty();\n return new Promise((resolve) => {\n resolve();\n });\n }\n }\n this.log(\"loadData\");\n this.loading = true;\n this.classList.add(\"dg-loading\");\n this.classList.remove(\"dg-empty\", \"dg-network-error\");\n return (\n this.fetchData()\n .then((response) => {\n // We can get a straight array or an object\n if (Array.isArray(response)) {\n this.data = response;\n } else {\n // Object must contain data key\n if (!response[this.options.serverParams.dataKey]) {\n console.error(\n \"Invalid response, it should contain a data key with an array or be a plain array\",\n response,\n );\n this.options.url = null;\n return;\n }\n\n // We may have a config object\n this.options = Object.assign(\n this.options,\n response[this.options.serverParams.optionsKey] ?? {},\n );\n // It should return meta data (see metaFilteredKey)\n this.meta = response[this.options.serverParams.metaKey] ?? {};\n this.data = response[this.options.serverParams.dataKey];\n }\n this.originalData = this.data.slice();\n this.fixPage();\n\n // Make sure we have a proper set of columns\n if (this.options.columns.length === 0 && this.originalData.length) {\n this.options.columns = this.convertColumns(Object.keys(this.originalData[0]));\n } else {\n this.options.columns = this.convertColumns(this.options.columns);\n }\n })\n .catch((err) => {\n this.log(err);\n tbody.setAttribute(\n \"data-empty\",\n this.options.errorMessage ||\n err.message?.replace(/^\\s+|\\r\\n|\\n|\\r$/g, \"\") ||\n labels.networkError,\n );\n this.classList.add(\"dg-empty\", \"dg-network-error\");\n dispatch(this, \"loadDataFailed\", err);\n })\n // @ts-ignore\n .finally(() => {\n flagEmpty();\n if (!this.hasDataError && tbody.getAttribute(\"data-empty\") !== this.labels.noData) {\n tbody.setAttribute(\"data-empty\", this.labels.noData);\n }\n this.classList.remove(\"dg-loading\");\n setAttribute(this.table, \"aria-rowcount\", this.data.length);\n this.loading = false;\n })\n );\n }\n\n getFirst() {\n if (this.loading) {\n return;\n }\n this.page = 1;\n }\n\n getLast() {\n if (this.loading) {\n return;\n }\n this.page = this.pages;\n }\n\n getPrev() {\n if (this.loading) {\n return;\n }\n this.page = this.page - 1;\n }\n\n getNext() {\n if (this.loading) {\n return;\n }\n this.page = this.page + 1;\n }\n\n gotoPage(event) {\n if (event.type === \"keypress\") {\n const key = event.keyCode || event.key;\n if (key === 13 || key === \"Enter\") {\n event.preventDefault();\n } else {\n return;\n }\n }\n this.page = Number.parseInt(this.inputPage.value);\n }\n\n getSort() {\n const col = this.querySelector(\"thead tr.dg-head-columns th[aria-sort$='scending']\");\n if (col) {\n return col.getAttribute(\"field\");\n }\n return this.options.defaultSort;\n }\n\n getSortDir() {\n const col = this.querySelector(\"thead tr.dg-head-columns th[aria-sort$='scending']\");\n if (col) {\n return col.getAttribute(\"aria-sort\") || \"\";\n }\n return \"\";\n }\n\n getFilters() {\n const filters = [];\n const inputs = findAll(this, this._filterSelector);\n for (const input of inputs) {\n filters[input.dataset.name] = input.value;\n }\n return filters;\n }\n\n clearFilters() {\n const inputs = findAll(this, this._filterSelector);\n for (const input of inputs) {\n input.value = \"\";\n }\n this.filterData();\n }\n\n filterData() {\n this.log(\"filter data\");\n\n this.page = 1;\n\n if (this.options.server) {\n this.reload();\n } else {\n this.data = this.originalData?.slice() ?? [];\n\n // Look for rows matching the filters\n const inputs = findAll(this, this._filterSelector);\n for (const input of inputs) {\n const value = input.value;\n if (value) {\n const name = input.dataset.name;\n this.data = this.data.filter((item) => {\n const str = `${item[name]}`;\n return str.toLowerCase().indexOf(value.toLowerCase()) !== -1;\n });\n }\n }\n this.pageChanged();\n\n const col = this.querySelector(\"thead tr.dg-head-columns th[aria-sort$='scending']\");\n if (this.options.sort && col) {\n this.sortData();\n } else {\n this.renderBody();\n }\n }\n }\n\n /**\n * Data will be sorted then rendered using renderBody\n * @param {Element} baseCol The column that was clicked or null to use current sort\n */\n sortData(baseCol = null) {\n this.log(\"sort data\");\n\n let col = baseCol;\n\n // Early exit\n if (col && this.getColProp(col.getAttribute(\"field\"), \"noSort\")) {\n this.log(\"sorting prevented because column is not sortable\");\n return;\n }\n if (this.plugins.ColumnResizer?.isResizing) {\n this.log(\"sorting prevented because resizing\");\n return;\n }\n if (this.loading) {\n this.log(\"sorting prevented because loading\");\n return;\n }\n\n // We clicked on a column, update sort state\n if (col !== null) {\n // Remove active sort if any\n const haveClasses = (c) => [\"dg-selectable\", \"dg-actions\", \"dg-responsive-toggle\"].includes(c);\n\n const headers = findAll(this, \"thead tr:first-child th\");\n for (const th of headers) {\n // @ts-ignore\n if ([...th.classList].some(haveClasses)) {\n continue;\n }\n if (th !== col) {\n th.setAttribute(\"aria-sort\", \"none\");\n }\n }\n\n // Set tristate col\n if (!col.hasAttribute(\"aria-sort\") || col.getAttribute(\"aria-sort\") === \"none\") {\n col.setAttribute(\"aria-sort\", \"ascending\");\n } else if (col.getAttribute(\"aria-sort\") === \"ascending\") {\n col.setAttribute(\"aria-sort\", \"descending\");\n } else if (col.getAttribute(\"aria-sort\") === \"descending\") {\n col.setAttribute(\"aria-sort\", \"none\");\n }\n } else {\n // Or fetch current sort\n col = this.querySelector(\"thead tr.dg-head-columns th[aria-sort$='scending']\");\n }\n\n if (this.options.server) {\n // Reload data with updated sort\n this.loadData().finally(() => {\n this.renderBody();\n });\n } else {\n const sort = col ? col.getAttribute(\"aria-sort\") : \"none\";\n if (sort === \"none\") {\n const stack = [];\n\n // Restore order while keeping filters\n this.originalData?.some((itemA) => {\n this.data.some((itemB) => {\n if (JSON.stringify(itemA) === JSON.stringify(itemB)) {\n stack.push(itemB);\n return true;\n }\n return false;\n });\n return stack.length === this.data.length;\n });\n\n this.data = stack;\n } else {\n const field = col.getAttribute(\"field\");\n this.data.sort((a, b) => {\n if (!isNaN(a[field]) && !isNaN(b[field])) {\n return sort === \"ascending\" ? a[field] - b[field] : b[field] - a[field];\n }\n const valA = sort === \"ascending\" ? a[field].toUpperCase() : b[field].toUpperCase();\n const valB = sort === \"ascending\" ? b[field].toUpperCase() : a[field].toUpperCase();\n\n switch (true) {\n case valA > valB:\n return 1;\n case valA < valB:\n return -1;\n case valA === valB:\n return 0;\n }\n });\n }\n this.renderBody();\n }\n }\n\n _sort(columnName, sortDir) {\n const col = this.querySelector(`.dg-head-columns th[field=${columnName}]`);\n const dir = sortDir === \"ascending\" ? \"none\" : sortDir === \"descending\" ? \"ascending\" : \"descending\";\n col?.setAttribute(\"aria-sort\", dir);\n this.sortData(col);\n }\n\n sortAsc = (columnName) => this._sort(columnName, \"ascending\");\n sortDesc = (columnName) => this._sort(columnName, \"descending\");\n sortNone = (columnName) => this._sort(columnName, \"none\");\n\n fetchData() {\n if (!this.options.url) {\n return new Promise((resolve, reject) => reject(\"No url set\"));\n }\n\n let base = window.location.href;\n // Fix trailing slash if no extension is present\n if (!base.split(\"/\").pop().includes(\".\")) {\n base += base.endsWith(\"/\") ? \"\" : \"/\";\n }\n const url = new URL(this.options.url, base);\n let params = {\n r: Date.now(),\n };\n if (this.options.server) {\n // 0 based\n params[this.options.serverParams.start] = this.page - 1;\n params[this.options.serverParams.length] = this.options.perPage;\n if (this.options.filter) params[this.options.serverParams.search] = this.getFilters();\n params[this.options.serverParams.sort] = this.getSort() || \"\";\n params[this.options.serverParams.sortDir] = this.getSortDir();\n\n // extra params ?\n if (this.meta?.[this.options.serverParams.paramsKey]) {\n params = Object.assign(params, this.meta[this.options.serverParams.paramsKey]);\n }\n }\n\n appendParamsToUrl(url, params);\n\n return fetch(url).then((response) => {\n const newError = new Error(response.statusText || labels.networkError);\n if (!response.ok) {\n // @ts-ignore\n newError.response = response;\n throw newError;\n }\n return response\n .clone()\n .json()\n .catch((err) => {\n let error = err;\n if (!this.options.debug) {\n error = newError;\n }\n error.response = response;\n throw error;\n });\n });\n }\n\n renderTable() {\n this.log(\"render table\");\n\n if (this.options.menu && this.plugins.ContextMenu) {\n this.plugins.ContextMenu.createMenu();\n }\n\n let sortedColumn;\n\n this.renderHeader();\n if (this.options.defaultSort) {\n // We can have a default sort even with sort disabled\n sortedColumn = this.querySelector(`thead tr.dg-head-columns th[field=\"${this.options.defaultSort}\"]`);\n }\n\n if (sortedColumn) {\n this.sortData(sortedColumn);\n } else {\n this.renderBody();\n }\n\n this.renderFooter();\n }\n\n /**\n * Create table header\n * - One row for the column headers\n * - One row for the filters\n */\n renderHeader() {\n this.log(\"render header\");\n\n const thead = this.thead;\n this.createColumnHeaders(thead);\n this.createColumnFilters(thead);\n\n if (this.options.resizable && this.plugins.ColumnResizer) {\n this.plugins.ColumnResizer.renderResizer(labels.resizeColumn);\n }\n\n dispatch(this, \"headerRendered\");\n }\n\n renderFooter() {\n this.log(\"render footer\");\n\n const tfoot = this.tfoot;\n const td = tfoot.querySelector(\"td\");\n tfoot.removeAttribute(\"hidden\");\n setAttribute(td, \"colspan\", this.columnsLength(true));\n tfoot.style.display = \"\";\n }\n\n /**\n * Create the column headers based on column definitions and set options\n * @param {HTMLTableSectionElement} thead\n */\n createColumnHeaders(thead) {\n // @link https://stackoverflow.com/questions/21064101/understanding-offsetwidth-clientwidth-scrollwidth-and-height-respectively\n const availableWidth = this.clientWidth;\n const colMaxWidth = Math.round((availableWidth / this.columnsLength(true)) * 2);\n\n let idx = 0;\n let tr;\n\n // Create row\n tr = ce(\"tr\");\n this.headerRow = tr;\n tr.setAttribute(\"role\", \"row\");\n tr.setAttribute(\"aria-rowindex\", \"1\");\n tr.setAttribute(\"class\", \"dg-head-columns\");\n\n // We need a real th from the dom to compute the size\n let sampleTh = thead.querySelector(\"tr.dg-head-columns th\");\n if (!sampleTh) {\n sampleTh = ce(\"th\");\n thead.querySelector(\"tr\").appendChild(sampleTh);\n }\n\n if (this.options.selectable && this.plugins.SelectableRows) {\n this.plugins.SelectableRows.createHeaderCol(tr);\n }\n if (this.options.responsive && this.plugins.ResponsiveGrid && this.plugins.ResponsiveGrid.hasHiddenColumns()) {\n this.plugins.ResponsiveGrid.createHeaderCol(tr);\n }\n\n // Create columns\n idx = 0;\n let totalWidth = 0;\n\n for (const column of this.options.columns) {\n if (column.attr) {\n continue;\n }\n const colIdx = idx + this.startColIndex();\n const th = ce(\"th\");\n th.setAttribute(\"scope\", \"col\");\n th.setAttribute(\"role\", \"columnheader button\");\n th.setAttribute(\"aria-colindex\", `${colIdx}`);\n th.setAttribute(\"id\", randstr(\"dg-col-\"));\n if (this.options.sort) {\n th.setAttribute(\"aria-sort\", \"none\");\n }\n th.setAttribute(\"field\", column.field);\n if (this.plugins.ResponsiveGrid && this.options.responsive) {\n setAttribute(th, \"data-responsive\", column.responsive || \"\");\n }\n // Make sure the header fits (+ add some room for sort icon if necessary)\n const computedWidth = getTextWidth(column.title, sampleTh, true) + 20;\n th.dataset.minWidth = `${computedWidth}`;\n applyColumnDefinition(th, column);\n th.tabIndex = 0;\n th.textContent = column.title;\n\n let w = 0;\n // Autosize small based on first/last row ?\n // Take into account minWidth of the header and max available size based on col numbers\n if (this.options.autosize && this.plugins.AutosizeColumn) {\n const colAvailableWidth = Math.min(availableWidth - totalWidth, colMaxWidth);\n w = this.plugins.AutosizeColumn.computeSize(\n th,\n column,\n Number.parseInt(th.dataset.minWidth),\n colAvailableWidth,\n );\n } else {\n w = Math.max(Number.parseInt(th.dataset.minWidth), Number.parseInt(th.getAttribute(\"width\")));\n }\n\n setAttribute(th, \"width\", w);\n if (column.hidden) {\n th.setAttribute(\"hidden\", \"\");\n } else {\n totalWidth += w;\n }\n\n // Reorder columns with drag/drop\n if (this.options.reorder && this.plugins.DraggableHeaders) {\n this.plugins.DraggableHeaders.makeHeaderDraggable(th);\n }\n\n tr.appendChild(th);\n idx++;\n }\n\n // There is too much available width, and we want to avoid fixed layout to split remaining amount\n if (totalWidth < availableWidth) {\n const visibleCols = findAll(tr, \"th:not([hidden],.dg-not-resizable)\");\n if (visibleCols.length) {\n const lastCol = visibleCols[visibleCols.length - 1];\n removeAttribute(lastCol, \"width\");\n }\n }\n\n // Actions\n if (this.options.actions.length && this.plugins.RowActions) {\n this.plugins.RowActions.makeActionHeader(tr);\n }\n\n thead.replaceChild(tr, thead.querySelector(\"tr.dg-head-columns\"));\n\n // Once columns are inserted, we have an actual dom to query\n if (thead.offsetWidth > availableWidth) {\n this.log(`adjust width to fix size, ${thead.offsetWidth} > ${availableWidth}`);\n const scrollbarWidth = this.offsetWidth - this.clientWidth;\n let diff = thead.offsetWidth - availableWidth - scrollbarWidth;\n if (this.options.responsive && this.plugins.ResponsiveGrid) {\n diff += scrollbarWidth;\n }\n // Remove diff for columns that can afford it\n const thWithWidth = findAll(tr, \"th[width]\");\n\n for (const th of thWithWidth) {\n if (hasClass(th, \"dg-not-resizable\")) {\n continue;\n }\n if (diff <= 0) {\n continue;\n }\n const actualWidth = Number.parseInt(th.getAttribute(\"width\"));\n const minWidth = th.dataset.minWidth ? Number.parseInt(th.dataset.minWidth) : 0;\n if (actualWidth > minWidth) {\n let newWidth = actualWidth - diff;\n if (newWidth < minWidth) {\n newWidth = minWidth;\n }\n diff -= actualWidth - newWidth;\n setAttribute(th, \"width\", newWidth);\n }\n }\n }\n\n // Context menu\n if (this.options.menu && this.plugins.ContextMenu) {\n this.plugins.ContextMenu.attachContextMenu();\n }\n\n // Sort col on click\n const rowsWithSort = findAll(tr, \"[aria-sort]\");\n for (const sortableRow of rowsWithSort) {\n sortableRow.addEventListener(\"click\", () => this.sortData(sortableRow));\n }\n\n setAttribute(this.table, \"aria-colcount\", this.columnsLength(true));\n }\n\n createColumnFilters(thead) {\n let idx = 0;\n let tr;\n\n // Create row for filters\n tr = ce(\"tr\");\n this.filterRow = tr;\n tr.setAttribute(\"role\", \"row\");\n tr.setAttribute(\"aria-rowindex\", \"2\");\n tr.setAttribute(\"class\", \"dg-head-filters\");\n if (!this.options.filter) {\n tr.setAttribute(\"hidden\", \"\");\n }\n\n if (this.options.selectable && this.plugins.SelectableRows) {\n this.plugins.SelectableRows.createFilterCol(tr);\n }\n if (this.options.responsive && this.plugins.ResponsiveGrid && this.plugins.ResponsiveGrid.hasHiddenColumns()) {\n this.plugins.ResponsiveGrid.createFilterCol(tr);\n }\n\n for (const column of this.options.columns) {\n if (column.attr) {\n continue;\n }\n const colIdx = idx + this.startColIndex();\n const relatedTh = thead.querySelector(`tr.dg-head-columns th[aria-colindex=\"${colIdx}\"]`);\n if (!relatedTh) {\n console.warn(\"Related th not found\", colIdx);\n continue;\n }\n const th = ce(\"th\");\n th.setAttribute(\"aria-colindex\", `${colIdx}`);\n\n const filter = this.createFilterElement(column, relatedTh);\n if (!this.options.filter) {\n th.tabIndex = 0;\n } else {\n filter.tabIndex = 0;\n }\n\n if (column.hidden) {\n th.setAttribute(\"hidden\", \"\");\n }\n\n th.appendChild(filter);\n tr.appendChild(th);\n idx++;\n }\n\n // Actions\n if (this.options.actions.length && this.plugins.RowActions) {\n this.plugins.RowActions.makeActionFilter(tr);\n }\n\n thead.replaceChild(tr, thead.querySelector(\"tr.dg-head-filters\"));\n\n if (typeof this.options.filterKeypressDelay !== \"number\" || this.options.filterOnEnter)\n this.options.filterKeypressDelay = 0;\n\n // Filter content by field events\n const filteredRows = findAll(tr, this._filterSelector);\n for (const el of filteredRows) {\n const eventName = /select/i.test(el.tagName) ? \"change\" : \"keyup\";\n const eventHandler = debounce((e) => {\n const key = e.keyCode || e.key;\n const isKeyPressFilter = !this.options.filterOnEnter && !this._excludedKeys.some((k) => k === key);\n if (key === 13 || key === \"Enter\" || isKeyPressFilter || e.type === \"change\") {\n this.filterData.call(this);\n }\n }, this.options.filterKeypressDelay);\n el.addEventListener(eventName, eventHandler);\n }\n }\n\n createFilterElement(column, relatedTh) {\n const isSelect = column.filterType === \"select\";\n const filter = isSelect ? ce(\"select\") : ce(\"input\");\n if (isSelect) {\n if (!Array.isArray(column.filterList)) {\n // Gets unique values from column records\n const uniqueValues = [...new Set((this.data ?? []).map((e) => e[column.field]))]\n .filter((v) => v)\n .sort();\n column.filterList = [column.firstFilterOption || this.defaultColumn.firstFilterOption].concat(\n uniqueValues.map((e) => ({ value: e, text: e })),\n );\n }\n\n for (const e of column.filterList) {\n const opt = ce(\"option\");\n opt.value = e.value;\n opt.text = e.text;\n\n if (filter instanceof HTMLSelectElement) {\n filter.add(opt);\n }\n }\n } else {\n //@ts-ignore\n filter.type = \"text\";\n filter.inputMode = \"search\";\n filter.autocomplete = \"off\";\n filter.spellcheck = false;\n }\n // Allows binding filter to this column\n filter.dataset.name = column.field;\n filter.id = randstr(\"dg-filter-\");\n // Don't use aria-label as it triggers autocomplete\n filter.setAttribute(\"aria-labelledby\", relatedTh.getAttribute(\"id\"));\n return filter;\n }\n\n /**\n * Render the data as rows in tbody\n * It will call paginate() at the end\n */\n renderBody() {\n this.log(\"render body\");\n let tr;\n let td;\n let idx;\n const tbody = ce(\"tbody\");\n\n this.data.forEach((item, i) => {\n tr = ce(\"tr\");\n setAttribute(tr, \"role\", \"row\");\n setAttribute(tr, \"hidden\", \"\");\n setAttribute(tr, \"aria-rowindex\", i + 1);\n tr.tabIndex = 0;\n\n if (this.options.selectable && this.plugins.SelectableRows) {\n this.plugins.SelectableRows.createDataCol(tr);\n }\n if (\n this.options.responsive &&\n this.plugins.ResponsiveGrid &&\n this.plugins.ResponsiveGrid.hasHiddenColumns()\n ) {\n this.plugins.ResponsiveGrid.createDataCol(tr);\n }\n\n // Expandable\n if (this.options.expand) {\n tr.classList.add(\"dg-expandable\");\n\n on(tr, \"click\", (ev) => {\n if (this.plugins.ResponsiveGrid) {\n this.plugins.ResponsiveGrid.blockObserver();\n }\n toggleClass(ev.currentTarget, \"dg-expanded\");\n if (this.plugins.ResponsiveGrid) {\n this.plugins.ResponsiveGrid.unblockObserver();\n }\n });\n }\n\n idx = 0;\n\n for (const column of this.options.columns) {\n if (!column) {\n console.error(\"Empty column found!\", this.options.columns);\n }\n // It should be applied as an attr of the row\n if (column.attr) {\n if (item[column.field]) {\n // Special case if we try to write over the class attr\n if (column.attr === \"class\") {\n addClass(tr, item[column.field]);\n } else {\n tr.setAttribute(column.attr, item[column.field]);\n }\n }\n return;\n }\n td = ce(\"td\");\n td.setAttribute(\"role\", \"gridcell\");\n td.setAttribute(\"aria-colindex\", `${idx}${this.startColIndex()}`);\n applyColumnDefinition(td, column);\n // This is required for pure css responsive layout\n td.setAttribute(\"data-name\", column.title);\n td.tabIndex = -1;\n\n // Inline editing ...\n if (column.editable && this.plugins.EditableColumn) {\n addClass(td, \"dg-editable-col\");\n this.plugins.EditableColumn.makeEditableInput(td, column, item, i);\n } else {\n // ... or formatting\n const v = item[column.field] ?? \"\";\n let tv;\n // TODO: make this modular\n switch (column.transform) {\n case \"uppercase\":\n tv = v.toUpperCase();\n break;\n case \"lowercase\":\n tv = v.toLowerCase();\n break;\n default:\n tv = v;\n break;\n }\n if (column.format) {\n // Only use formatting with values or if defaultFormatValue is set\n if (column.defaultFormatValue !== undefined && (tv === \"\" || tv === null)) {\n tv = `${column.defaultFormatValue}`;\n }\n if (typeof column.format === \"string\" && tv) {\n td.innerHTML = interpolate(\n // @ts-ignore\n column.format,\n Object.assign(\n {\n _v: v,\n _tv: tv,\n },\n item,\n ),\n );\n } else if (column.format instanceof Function) {\n const val = column.format.call(this, { column, rowData: item, cellData: tv, td, tr });\n td.innerHTML = val || tv || v;\n }\n } else {\n td.textContent = tv;\n }\n }\n tr.appendChild(td);\n idx++;\n }\n\n // Actions\n if (this.options.actions.length && this.plugins.RowActions) {\n this.plugins.RowActions.makeActionRow(tr, item);\n }\n\n tbody.appendChild(tr);\n });\n\n tbody.setAttribute(\"role\", \"rowgroup\");\n\n // Keep data empty message\n const prev = this.tbody;\n tbody.setAttribute(\"data-empty\", prev.getAttribute(\"data-empty\"));\n this.table.replaceChild(tbody, prev);\n\n if (this.plugins.FixedHeight) {\n this.plugins.FixedHeight.createFakeRow();\n }\n\n this.paginate();\n\n if (this.plugins.SelectableRows) {\n this.plugins.SelectableRows.shouldSelectAll(tbody);\n }\n\n this.data.length && this.classList.remove(\"dg-empty\");\n\n dispatch(this, \"bodyRendered\");\n }\n\n paginate() {\n this.log(\"paginate\");\n\n const total = this.totalRecords();\n const p = this.page || 1;\n const tbody = this.tbody;\n const tfoot = this.tfoot;\n const bodyRows = findAll(tbody, \"tr\");\n\n // Refresh page count in case we added/removed a page\n this.pages = this.totalPages();\n\n let index;\n let high = p * this.options.perPage;\n let low = high - this.options.perPage + 1;\n\n if (high > total) {\n high = total;\n }\n if (!total) {\n low = 0;\n }\n\n // Display all rows within the set indexes\n // For server side paginated grids, we display everything\n // since the server is taking care of actual pagination\n for (const tr of bodyRows) {\n if (this.options.server) {\n removeAttribute(tr, \"hidden\");\n continue;\n }\n index = Number(getAttribute(tr, \"aria-rowindex\"));\n if (index > high || index < low) {\n setAttribute(tr, \"hidden\", \"\");\n } else {\n removeAttribute(tr, \"hidden\");\n }\n }\n\n if (this.options.selectable && this.plugins.SelectableRows) {\n this.plugins.SelectableRows.clearCheckboxes(tbody);\n }\n\n // Store default height and update styles if needed\n if (this.plugins.FixedHeight) {\n this.plugins.FixedHeight.updateFakeRow();\n }\n\n // Enable/disable buttons if shown\n if (this.btnFirst) {\n this.btnFirst.disabled = this.page <= 1;\n this.btnPrev.disabled = this.page <= 1;\n this.btnNext.disabled = this.page >= this.pages;\n this.btnLast.disabled = this.page >= this.pages;\n }\n tfoot.querySelector(\".dg-low\").textContent = low.toString();\n tfoot.querySelector(\".dg-high\").textContent = high.toString();\n tfoot.querySelector(\".dg-total\").textContent = `${this.totalRecords()}`;\n tfoot.toggleAttribute(\"hidden\", this.options.autohidePager && this.options.perPage > this.totalRecords());\n }\n\n /**\n * @returns {number}\n */\n totalPages() {\n return Math.ceil(this.totalRecords() / this.options.perPage);\n }\n\n /**\n * @returns {number}\n */\n totalRecords() {\n if (this.options.server) {\n return this.meta?.[this.options.serverParams.metaFilteredKey] || 0;\n }\n return this.data.length;\n }\n}\n\nexport default DataGrid;\n", "/** @typedef {import(\"../data-grid\").default} DataGrid */\n\nclass BasePlugin {\n /**\n * @param {DataGrid} grid\n */\n constructor(grid) {\n this.grid = grid;\n }\n\n connected() {}\n\n disconnected() {}\n\n /**\n * Handle events within the plugin\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#handling-events\n * @param {Event} event\n */\n handleEvent(event) {\n if (this[`on${event.type}`]) {\n this[`on${event.type}`](event);\n }\n }\n}\n\nexport default BasePlugin;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport elementOffset from \"../utils/elementOffset.js\";\nimport {\n addClass,\n dispatch,\n findAll,\n getAttribute,\n hasClass,\n off,\n on,\n removeAttribute,\n removeClass,\n setAttribute,\n} from \"../utils/shortcuts.js\";\n\n/**\n * Allows to resize columns\n */\nclass ColumnResizer extends BasePlugin {\n constructor(grid) {\n super(grid);\n this.isResizing = false;\n }\n\n /**\n * @param {String} resizeLabel\n */\n renderResizer(resizeLabel) {\n const grid = this.grid;\n const table = grid.table;\n const cols = findAll(grid, \"thead tr.dg-head-columns th\");\n\n for (const col of cols) {\n if (hasClass(col, \"dg-not-resizable\")) {\n continue;\n }\n // Create a resizer element\n const resizer = document.createElement(\"div\");\n addClass(resizer, \"dg-resizer\");\n resizer.ariaLabel = resizeLabel;\n\n // Add a resizer element to the column\n col.appendChild(resizer);\n\n // Handle resizing\n let startX = 0;\n let startW = 0;\n let remainingSpace = 0;\n let max = 0;\n\n const mouseMoveHandler = (e) => {\n if (e.clientX > max) {\n return;\n }\n const newWidth = startW + (e.clientX - startX);\n if (col.dataset.minWidth && newWidth > Number.parseInt(col.dataset.minWidth)) {\n setAttribute(col, \"width\", newWidth);\n }\n };\n\n // When user releases the mouse, remove the existing event listeners\n const mouseUpHandler = () => {\n grid.log(\"resized column\");\n\n // Prevent accidental sorting if mouse is not over resize handler\n setTimeout(() => {\n this.isResizing = false;\n }, 0);\n\n removeClass(resizer, \"dg-resizer-active\");\n if (grid.options.reorder) {\n col.draggable = true;\n }\n col.style.overflow = \"hidden\";\n\n // Remove handlers\n off(document, \"mousemove\", mouseMoveHandler);\n off(document, \"mouseup\", mouseUpHandler);\n\n dispatch(grid, \"columnResized\", {\n col: getAttribute(col, \"field\"),\n width: getAttribute(col, \"width\"),\n });\n };\n\n // Otherwise it could sort the col\n on(resizer, \"click\", (e) => {\n e.stopPropagation();\n });\n\n on(resizer, \"mousedown\", (e) => {\n e.stopPropagation();\n\n this.isResizing = true;\n\n const target = e.target;\n const currentCols = findAll(grid, \"dg-head-columns th\");\n const visibleCols = currentCols.filter((col) => {\n return !col.hasAttribute(\"hidden\");\n });\n const columnIndex = visibleCols.findIndex((column) => column === target.parentNode);\n grid.log(\"resize column\");\n\n addClass(resizer, \"dg-resizer-active\");\n\n // Make sure we don't drag it\n removeAttribute(col, \"draggable\");\n\n // Allow overflow when resizing\n col.style.overflow = \"visible\";\n\n // Show full column height (-1 to avoid scrollbar)\n resizer.style.height = `${table.offsetHeight - 1}px`;\n\n // Register initial data\n startX = e.clientX;\n startW = col.offsetWidth;\n\n remainingSpace = (visibleCols.length - columnIndex) * 30;\n max = elementOffset(target).left + grid.offsetWidth - remainingSpace;\n\n // Remove width from next columns to allow auto layout\n setAttribute(col, \"width\", startW);\n for (let j = 0; j < visibleCols.length; j++) {\n if (j > columnIndex) {\n removeAttribute(cols[j], \"width\");\n }\n }\n\n // Attach handlers\n on(document, \"mousemove\", mouseMoveHandler);\n on(document, \"mouseup\", mouseUpHandler);\n });\n }\n }\n}\n\nexport default ColumnResizer;\n", "/**\n * @param {HTMLElement} el\n * @param {String} type\n * @param {String} prop\n * @returns {HTMLElement}\n */\nexport default function getParentElement(el, type, prop = \"nodeName\") {\n let parent = el;\n while (parent[prop] !== type) {\n parent = parent.parentElement;\n }\n return parent;\n}\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport getParentElement from \"../utils/getParentElement.js\";\nimport { find, off, on, removeAttribute, setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Create a right click menu on the headers\n */\nclass ContextMenu extends BasePlugin {\n connected() {\n /**\n * @type {HTMLUListElement}\n */\n this.menu = this.grid.querySelector(\".dg-menu\");\n }\n disconnected() {\n if (this.grid.headerRow) {\n off(this.grid.headerRow, \"contextmenu\", this);\n }\n }\n\n attachContextMenu() {\n const grid = this.grid;\n on(grid.headerRow, \"contextmenu\", this);\n }\n\n onchange(e) {\n const grid = this.grid;\n const t = e.target;\n const field = t.dataset.name;\n if (t.checked) {\n grid.showColumn(field);\n } else {\n // Prevent hidding last\n if (grid.visibleColumns().length <= 1) {\n // Restore checkbox value\n t.checked = true;\n return;\n }\n grid.hideColumn(field);\n }\n grid.fixPage(); //fixes Chrome footer flexbox resize issues that may appear when there is a large number of columns (i.e. more than 10).\n }\n\n oncontextmenu(e) {\n e.preventDefault();\n const grid = this.grid;\n const target = getParentElement(e.target, \"THEAD\");\n const menu = this.menu;\n const rect = target.getBoundingClientRect();\n let x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n menu.style.top = `${y}px`;\n menu.style.left = `${x}px`;\n\n removeAttribute(menu, \"hidden\");\n if (x + 150 > rect.width) {\n x -= menu.offsetWidth;\n menu.style.left = `${x}px`;\n }\n\n const documentClickHandler = (e) => {\n if (!menu.contains(e.target)) {\n setAttribute(menu, \"hidden\", \"\");\n off(document, \"click\", documentClickHandler);\n }\n };\n on(document, \"click\", documentClickHandler);\n }\n createMenu() {\n const grid = this.grid;\n const menu = this.menu;\n while (menu.lastChild) {\n menu.removeChild(menu.lastChild);\n }\n menu.addEventListener(\"change\", this);\n\n for (const col of grid.options.columns) {\n if (col.attr) {\n continue;\n }\n const li = document.createElement(\"li\");\n const label = document.createElement(\"label\");\n const checkbox = document.createElement(\"input\");\n setAttribute(checkbox, \"type\", \"checkbox\");\n setAttribute(checkbox, \"data-name\", col.field);\n if (!col.hidden) {\n checkbox.checked = true;\n }\n const text = document.createTextNode(col.title);\n\n label.appendChild(checkbox);\n label.appendChild(text);\n\n li.appendChild(label);\n menu.appendChild(li);\n }\n }\n}\n\nexport default ContextMenu;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport getParentElement from \"../utils/getParentElement.js\";\nimport { dispatch, findAll, getAttribute, on, setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Allows to move headers\n */\nclass DraggableHeaders extends BasePlugin {\n /**\n * @param {HTMLTableCellElement} th\n */\n makeHeaderDraggable(th) {\n const grid = this.grid;\n th.draggable = true;\n on(th, \"dragstart\", (e) => {\n if (grid.plugins.ColumnResizer?.isResizing && e.preventDefault) {\n e.preventDefault();\n return;\n }\n grid.log(\"reorder col\");\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", e.target.getAttribute(\"aria-colindex\"));\n });\n on(th, \"dragover\", (e) => {\n if (e.preventDefault) {\n e.preventDefault();\n }\n e.dataTransfer.dropEffect = \"move\";\n return false;\n });\n on(th, \"drop\", (e) => {\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n const t = e.target;\n const target = getParentElement(t, \"TH\");\n const index = Number.parseInt(e.dataTransfer.getData(\"text/plain\"));\n const targetIndex = Number.parseInt(target.getAttribute(\"aria-colindex\"));\n\n if (index === targetIndex) {\n grid.log(\"reordered col stayed the same\");\n return;\n }\n grid.log(`reordered col from ${index} to ${targetIndex}`);\n\n const offset = grid.startColIndex();\n const tmp = grid.options.columns[index - offset];\n grid.options.columns[index - offset] = grid.options.columns[targetIndex - offset];\n grid.options.columns[targetIndex - offset] = tmp;\n\n const swapNodes = (selector, el1) => {\n const rowIndex = el1.parentNode.getAttribute(\"aria-rowindex\");\n const el2 = grid.querySelector(\n `${selector} tr[aria-rowindex=\"${rowIndex}\"] [aria-colindex=\"${targetIndex}\"]`,\n );\n setAttribute(el1, \"aria-colindex\", targetIndex);\n setAttribute(el2, \"aria-colindex\", index);\n const newNode = document.createElement(\"th\");\n el1.parentNode.insertBefore(newNode, el1);\n el2.parentNode.replaceChild(el1, el2);\n newNode.parentNode.replaceChild(el2, newNode);\n };\n\n // Swap all rows in header and body\n for (const el1 of findAll(grid, `thead th[aria-colindex=\"${index}\"]`)) {\n swapNodes(\"thead\", el1);\n }\n for (const el1 of findAll(grid, `tbody td[aria-colindex=\"${index}\"]`)) {\n swapNodes(\"tbody\", el1);\n }\n\n // Updates the columns\n grid.options.columns = findAll(grid, \"thead tr.dg-head-columns th[field]\").map((th) =>\n grid.options.columns.find((c) => c.field === getAttribute(th, \"field\")),\n );\n\n dispatch(grid, \"columnReordered\", {\n col: tmp.field,\n from: index,\n to: targetIndex,\n });\n return false;\n });\n }\n}\n\nexport default DraggableHeaders;\n", "import BasePlugin from \"../core/base-plugin.js\";\n\n/**\n * Allows to paginate with horizontal swipe motions\n */\nclass TouchSupport extends BasePlugin {\n constructor(grid) {\n super(grid);\n this.touch = null;\n }\n connected() {\n const grid = this.grid;\n grid.addEventListener(\"touchstart\", this, { passive: true });\n grid.addEventListener(\"touchmove\", this, { passive: true });\n }\n\n disconnected() {\n const grid = this.grid;\n grid.removeEventListener(\"touchstart\", this);\n grid.removeEventListener(\"touchmove\", this);\n }\n\n ontouchstart(e) {\n this.touch = e.touches[0];\n }\n\n ontouchmove(e) {\n if (!this.touch) {\n return;\n }\n const grid = this.grid;\n const xDiff = this.touch.clientX - e.touches[0].clientX;\n const yDiff = this.touch.clientY - e.touches[0].clientY;\n\n if (Math.abs(xDiff) > Math.abs(yDiff)) {\n if (xDiff > 0) {\n grid.getNext();\n } else {\n grid.getPrev();\n }\n }\n this.touch = null;\n }\n}\n\nexport default TouchSupport;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport { dispatch, findAll, hasClass, setAttribute } from \"../utils/shortcuts.js\";\n\nconst SELECTABLE_CLASS = \"dg-selectable\";\nconst SELECT_ALL_CLASS = \"dg-select-all\";\nconst CHECKBOX_CLASS = \"form-check-input\"; //bs5\n\n/**\n * Allows to select rows\n */\nclass SelectableRows extends BasePlugin {\n disconnected() {\n if (this.selectAll) {\n this.selectAll.removeEventListener(\"change\", this);\n }\n }\n\n /**\n * @param {String} key Return a specific key (eg: id) instead of the whole row\n * @returns {Array}\n */\n getSelection(key = null) {\n const grid = this.grid;\n const selectedData = [];\n\n const inputs = findAll(grid, `tbody .${SELECTABLE_CLASS} input:checked`);\n\n for (const checkbox of inputs) {\n const idx = Number.parseInt(checkbox.dataset.id);\n const item = grid.data[idx - 1];\n if (!item) {\n console.warn(`Item ${idx} not found`);\n }\n if (key) {\n selectedData.push(item[key]);\n } else {\n selectedData.push(item);\n }\n }\n return selectedData;\n }\n\n /**\n * Uncheck box if hidden and visible only\n * @param {HTMLTableSectionElement} tbody\n */\n clearCheckboxes(tbody) {\n const grid = this.grid;\n if (!grid.options.selectVisibleOnly) {\n return;\n }\n const inputs = findAll(tbody, `tr[hidden] .${SELECTABLE_CLASS} input`);\n for (const input of inputs) {\n input.checked = false;\n }\n this.selectAll.checked = false;\n }\n\n colIndex() {\n return this.grid.startColIndex() - 2;\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createHeaderCol(tr) {\n const th = document.createElement(\"th\");\n setAttribute(th, \"scope\", \"col\");\n setAttribute(th, \"role\", \"columnheader button\");\n setAttribute(th, \"aria-colindex\", this.colIndex());\n th.classList.add(...[SELECTABLE_CLASS, \"dg-not-resizable\", \"dg-not-sortable\"]);\n th.tabIndex = 0;\n\n this.selectAll = document.createElement(\"input\");\n this.selectAll.type = \"checkbox\";\n this.selectAll.classList.add(SELECT_ALL_CLASS);\n this.selectAll.classList.add(CHECKBOX_CLASS);\n this.selectAll.addEventListener(\"change\", this);\n\n const label = document.createElement(\"label\");\n label.appendChild(this.selectAll);\n\n th.appendChild(label);\n\n th.setAttribute(\"width\", \"40\");\n tr.appendChild(th);\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createFilterCol(tr) {\n const th = document.createElement(\"th\");\n setAttribute(th, \"role\", \"columnheader button\");\n setAttribute(th, \"aria-colindex\", this.colIndex());\n th.classList.add(SELECTABLE_CLASS);\n th.tabIndex = 0;\n\n tr.appendChild(th);\n }\n\n /**\n * Handles the selectAll checkbox when any other .dg-selectable checkbox is checked on table body.\n * It should check selectAll if all is checked\n * It should uncheck selectAll if any is unchecked\n * @param {HTMLTableSectionElement} tbody\n */\n shouldSelectAll(tbody) {\n if (!this.selectAll) {\n return;\n }\n // Delegate listener for change events on input checkboxes\n tbody.addEventListener(\"change\", this);\n // Make sure state is up to date\n tbody.dispatchEvent(new Event(\"change\"));\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createDataCol(tr) {\n // Create col\n const td = document.createElement(\"td\");\n setAttribute(td, \"role\", \"gridcell button\");\n setAttribute(td, \"aria-colindex\", this.colIndex());\n td.classList.add(SELECTABLE_CLASS);\n\n // Create input\n const selectOne = document.createElement(\"input\");\n // Alias row id for easy retrieval in getSelection\n selectOne.dataset.id = tr.getAttribute(\"aria-rowindex\");\n selectOne.type = \"checkbox\";\n selectOne.classList.add(CHECKBOX_CLASS);\n // Label need to take full space thanks to css to make the whole cell clickable\n const label = document.createElement(\"label\");\n label.classList.add(\"dg-clickable-cell\");\n label.appendChild(selectOne);\n td.appendChild(label);\n\n // Prevent unwanted click behaviour on row\n label.addEventListener(\"click\", this);\n\n tr.appendChild(td);\n }\n\n /**\n * @param {Event} e\n */\n onclick(e) {\n e.stopPropagation();\n }\n\n /**\n * Handle change event on select all or any select checkbox in the table body\n * @param {import(\"../utils/shortcuts.js\").FlexibleEvent} e\n */\n onchange(e) {\n const grid = this.grid;\n if (hasClass(e.target, SELECT_ALL_CLASS)) {\n const visibleOnly = grid.options.selectVisibleOnly;\n const inputs = findAll(grid, `tbody .${SELECTABLE_CLASS} input`);\n for (const cb of inputs) {\n if (visibleOnly && !cb.offsetWidth) {\n return;\n }\n cb.checked = this.selectAll.checked;\n }\n dispatch(grid, \"rowsSelected\", {\n selection: this.getSelection(),\n });\n } else {\n if (!e.target.closest(`.${SELECTABLE_CLASS}`)) {\n return;\n }\n const totalCheckboxes = findAll(grid, `tbody .${SELECTABLE_CLASS} input[type=checkbox]`);\n // @ts-ignore\n const totalChecked = totalCheckboxes.filter((n) => n.checked);\n this.selectAll.checked = totalChecked.length === totalCheckboxes.length;\n\n dispatch(grid, \"rowsSelected\", {\n selection: grid.getSelection(),\n });\n }\n }\n}\n\nexport default SelectableRows;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport { setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Support for fixed table height\n *\n * We should add a fake row to push the footer down in case we don't have enough rows\n */\nclass FixedHeight extends BasePlugin {\n constructor(grid) {\n super(grid);\n\n this.hasFixedHeight = false;\n // If we have a fixed height, make sure we have overflowY set\n if (grid.style.height) {\n grid.style.overflowY = \"auto\";\n this.hasFixedHeight = true;\n }\n }\n\n /**\n */\n createFakeRow() {\n const grid = this.grid;\n const tbody = grid.querySelector(\"tbody\");\n const tr = document.createElement(\"tr\");\n setAttribute(tr, \"role\", \"row\");\n setAttribute(tr, \"hidden\", \"\");\n tr.classList.add(\"dg-fake-row\");\n tr.tabIndex = 0;\n tbody.appendChild(tr);\n }\n\n get fakeRow() {\n return this.grid.querySelector(\".dg-fake-row\");\n }\n\n /**\n * On last page, use a fake row to push footer down\n */\n updateFakeRow() {\n const grid = this.grid;\n const fakeRow = this.fakeRow;\n if (!fakeRow) {\n return;\n }\n\n // We don't need a fake row if we display everything\n if (grid.options.perPage > grid.totalRecords()) {\n return;\n }\n // We are not on last page\n if (grid.page !== grid.totalPages()) {\n return;\n }\n if (!grid.options.autoheight) {\n return;\n }\n // Find remaining missing height\n const max = grid.options.perPage * grid.rowHeight;\n const visibleRows = grid.querySelectorAll(\"tbody tr:not([hidden])\").length;\n const fakeHeight = visibleRows > 1 ? max - visibleRows * grid.rowHeight : max;\n if (fakeHeight > 0) {\n setAttribute(fakeRow, \"height\", fakeHeight);\n fakeRow.removeAttribute(\"hidden\");\n } else {\n fakeRow.removeAttribute(\"height\");\n }\n }\n}\n\nexport default FixedHeight;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport getTextWidth from \"../utils/getTextWidth.js\";\nimport { getAttribute, hasAttribute, setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Allows to resize columns\n */\nclass AutosizeColumn extends BasePlugin {\n /**\n * Autosize col based on column data\n * @param {HTMLTableCellElement} th\n * @param {import(\"../data-grid\").Column} column\n * @param {Number} min\n * @param {Number} max\n * @returns {Number}\n */\n computeSize(th, column, min, max) {\n const grid = this.grid;\n if (hasAttribute(th, \"width\")) {\n return getAttribute(th, \"width\");\n }\n if (!grid.data.length) {\n return;\n }\n const firstVal = grid.data[0];\n const lastVal = grid.data[grid.data.length - 1];\n let v = firstVal[column.field] ? firstVal[column.field].toString() : \"\";\n const v2 = lastVal[column.field] ? lastVal[column.field].toString() : \"\";\n if (v2.length > v.length) {\n v = v2;\n }\n let width = 0;\n if (v.length <= 6) {\n width = min;\n } else if (v.length > 50) {\n width = max;\n } else {\n // Add some extra room to have some spare space\n width = getTextWidth(`${v}0000`, th);\n }\n if (width > max) {\n width = max;\n }\n if (width < min) {\n width = min;\n }\n setAttribute(th, \"width\", width);\n return width;\n }\n}\n\nexport default AutosizeColumn;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport debounce from \"../utils/debounce.js\";\nimport {\n addClass,\n ce,\n find,\n findAll,\n hasClass,\n insertAfter,\n removeAttribute,\n removeClass,\n setAttribute,\n} from \"../utils/shortcuts.js\";\n\nconst RESPONSIVE_CLASS = \"dg-responsive\";\n\nlet obsTo;\n\n/**\n * @param {Array} list\n * @returns {Array}\n */\nfunction sortByPriority(list) {\n return list.sort((a, b) => {\n const v1 = Number.parseInt(a.dataset.responsive) || 1;\n const v2 = Number.parseInt(b.dataset.responsive) || 1;\n return v2 - v1;\n });\n}\n\n/**\n * @type {ResizeObserverCallback}\n */\n//@ts-ignore\nconst callback = debounce((entries) => {\n for (const entry of entries) {\n /**\n * @type {import(\"../data-grid\").default}\n */\n // @ts-ignore\n const grid = entry.target;\n const table = grid.table;\n if (grid.plugins.ResponsiveGrid.observerBlocked) {\n return;\n }\n // check inlineSize (width) and not blockSize (height)\n const contentBoxSize = Array.isArray(entry.contentBoxSize) ? entry.contentBoxSize[0] : entry.contentBoxSize;\n const size = Number.parseInt(contentBoxSize.inlineSize);\n const tableWidth = table.offsetWidth;\n const realTableWidth = findAll(grid.headerRow, \"th\").reduce((result, th) => {\n return result + th.offsetWidth;\n }, 0);\n const diff = (realTableWidth || tableWidth) - size - 1;\n const minWidth = 50;\n const prevAction = grid.plugins.ResponsiveGrid.prevAction;\n // We have an array with the columns to show/hide are in order, most important first\n const headerCols = sortByPriority(\n findAll(grid.headerRow, \"th[field]\")\n .reverse() // Order takes precedence if no priority is set\n .filter((col) => {\n // Leave out unresponsive columns\n return col.dataset.responsive !== \"0\";\n }),\n );\n let changed = false;\n\n grid.log(`table is ${tableWidth}/${realTableWidth} and available size is ${size}. Diff: ${diff}`);\n\n // The table is too big when diff has a high value, otherwise it will be like -1 or -2\n if (diff > 0) {\n if (prevAction === \"show\") {\n return;\n }\n grid.plugins.ResponsiveGrid.prevAction = \"hide\";\n let remaining = diff;\n let cols = headerCols.filter((col) => {\n return !col.hasAttribute(\"hidden\") && col.hasAttribute(\"data-responsive\");\n });\n if (cols.length === 0) {\n cols = headerCols.filter((col) => {\n return !col.hasAttribute(\"hidden\");\n });\n // Always keep one column\n if (cols.length === 1) {\n return;\n }\n }\n\n for (const col of cols) {\n if (remaining < 0) {\n continue;\n }\n\n const colWidth = col.offsetWidth;\n const field = col.getAttribute(\"field\");\n if (!field) {\n continue;\n }\n col.dataset.baseWidth = `${col.offsetWidth}`;\n\n grid.hideColumn(field, false);\n grid.setColProp(field, \"responsiveHidden\", true);\n changed = true;\n\n remaining -= colWidth;\n remaining = Math.round(remaining);\n }\n } else {\n if (prevAction === \"hide\") {\n return;\n }\n grid.plugins.ResponsiveGrid.prevAction = \"show\";\n\n const requiredWidth =\n headerCols\n .filter((col) => {\n return !col.hasAttribute(\"hidden\");\n })\n .reduce((result, col) => {\n const width = col.dataset.minWidth ? Number.parseInt(col.dataset.minWidth) : col.offsetWidth;\n return result + width;\n }, 0) + minWidth; // Add an offset so that inserting column is smoother\n\n // Compute available width to insert columns\n let remaining = size - requiredWidth;\n // Do we have any hidden column that we can restore ?\n const filteredHeaderCols = headerCols\n .slice()\n .reverse() // Reverse the array to restore the columns in the proper order\n .filter((col) => {\n return col.hasAttribute(\"hidden\");\n });\n\n for (const col of filteredHeaderCols) {\n if (remaining < minWidth) {\n continue;\n }\n const colWidth = Number.parseInt(col.dataset.minWidth);\n\n // We need to have enough space to restore it\n if (colWidth > remaining) {\n remaining = -1; // break loop to keep restoring in order\n continue;\n }\n\n const field = col.getAttribute(\"field\");\n if (!field) {\n continue;\n }\n\n grid.showColumn(field, false);\n grid.setColProp(field, \"responsiveHidden\", false);\n changed = true;\n\n remaining -= colWidth;\n remaining = Math.round(remaining);\n }\n }\n\n // Check footer\n const footer = find(grid.table, \"tfoot\");\n const realFooterWidth = findAll(grid.table, \".dg-footer > div\").reduce((result, div) => {\n return result + div.offsetWidth;\n }, 0);\n const availableFooterWidth = footer.offsetWidth - realFooterWidth;\n if (realFooterWidth > size) {\n addClass(footer, \"dg-footer-compact\");\n } else if (availableFooterWidth > 250) {\n removeClass(footer, \"dg-footer-compact\");\n }\n if (changed) {\n grid.renderTable();\n }\n // Prevent resize loop\n setTimeout(() => {\n grid.plugins.ResponsiveGrid.prevAction = null;\n }, 1000);\n grid.table.style.visibility = \"visible\";\n }\n}, 100);\nconst resizeObserver = new ResizeObserver(callback);\n\n/**\n * Responsive data grid\n */\nclass ResponsiveGrid extends BasePlugin {\n constructor(grid) {\n super(grid);\n\n this.observerBlocked = false;\n this.prevAction = null;\n }\n\n connected() {\n if (this.grid.options.responsive) {\n this.observe();\n }\n }\n\n disconnected() {\n this.unobserve();\n }\n\n observe() {\n if (!this.grid.options.responsive) {\n return;\n }\n resizeObserver.observe(this.grid);\n this.grid.style.display = \"block\"; // Otherwise resize doesn't happen\n this.grid.style.overflowX = \"hidden\"; // Prevent scrollbars from appearing\n }\n\n unobserve() {\n resizeObserver.unobserve(this.grid);\n this.grid.style.display = \"unset\";\n this.grid.style.overflowX = \"unset\";\n }\n\n blockObserver() {\n this.observerBlocked = true;\n if (obsTo) {\n clearTimeout(obsTo);\n }\n }\n\n unblockObserver() {\n obsTo = setTimeout(() => {\n this.observerBlocked = false;\n }, 200); // more than debounce\n }\n\n /**\n * @returns {Boolean}\n */\n hasHiddenColumns() {\n let flag = false;\n\n for (const col of this.grid.options.columns) {\n if (col.responsiveHidden) {\n flag = true;\n }\n }\n return flag;\n }\n\n colIndex() {\n return this.grid.startColIndex() - 1;\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createHeaderCol(tr) {\n if (!this.grid.options.responsiveToggle) {\n return;\n }\n const th = ce(\"th\", tr);\n setAttribute(th, \"scope\", \"col\");\n setAttribute(th, \"role\", \"columnheader button\");\n setAttribute(th, \"aria-colindex\", this.colIndex());\n setAttribute(th, \"width\", \"40\");\n th.classList.add(...[`${RESPONSIVE_CLASS}-toggle`, \"dg-not-resizable\", \"dg-not-sortable\"]);\n th.tabIndex = 0;\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createFilterCol(tr) {\n if (!this.grid.options.responsiveToggle) {\n return;\n }\n const th = ce(\"th\", tr);\n setAttribute(th, \"role\", \"columnheader button\");\n setAttribute(th, \"aria-colindex\", this.colIndex());\n th.classList.add(`${RESPONSIVE_CLASS}-toggle`);\n th.tabIndex = 0;\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createDataCol(tr) {\n if (!this.grid.options.responsiveToggle) {\n return;\n }\n // Create col\n const td = document.createElement(\"td\");\n setAttribute(td, \"role\", \"gridcell button\");\n setAttribute(td, \"aria-colindex\", this.colIndex());\n td.classList.add(`${RESPONSIVE_CLASS}-toggle`);\n\n // Create icon\n td.innerHTML = `
\n \n \n\n\n \n
`;\n tr.appendChild(td);\n\n td.addEventListener(\"click\", this);\n td.addEventListener(\"mousedown\", this);\n }\n\n computeLabelWidth() {\n let idealWidth = 0;\n let consideredCol = 0;\n while (idealWidth < 120) {\n consideredCol++;\n const hCol = find(this.grid, `.dg-head-columns th[aria-colindex=\"${consideredCol}\"]`);\n if (hCol) {\n idealWidth += hCol.offsetWidth;\n } else {\n break;\n }\n }\n return idealWidth;\n }\n\n /**\n * @param {Event} ev\n */\n onmousedown(ev) {\n // Avoid selection through double click\n ev.preventDefault();\n }\n\n /**\n * @param {Event} ev\n */\n onclick(ev) {\n // Prevent expandable\n ev.stopPropagation();\n\n // target is the element that triggered the event (e.g., the user clicked on)\n // currentTarget is the element that the event listener is attached to.\n\n /**\n * @type {HTMLTableRowElement}\n */\n //@ts-ignore\n const td = ev.currentTarget;\n const tr = td.parentElement;\n const open = find(td, `.${RESPONSIVE_CLASS}-open`);\n const close = find(td, `.${RESPONSIVE_CLASS}-close`);\n\n this.blockObserver();\n\n const isExpanded = hasClass(tr, `${RESPONSIVE_CLASS}-expanded`);\n if (isExpanded) {\n removeClass(tr, `${RESPONSIVE_CLASS}-expanded`);\n open.style.display = \"unset\";\n close.style.display = \"none\";\n\n // Move back rows and cleanup row\n const childRow = tr.nextElementSibling;\n const hiddenCols = findAll(childRow, `.${RESPONSIVE_CLASS}-hidden`);\n\n for (const col of hiddenCols) {\n // We don't really need to care where we insert them since we are going to redraw anyway\n tr.appendChild(col);\n setAttribute(col, \"hidden\");\n }\n\n childRow.parentElement.removeChild(childRow);\n } else {\n addClass(tr, `${RESPONSIVE_CLASS}-expanded`);\n open.style.display = \"none\";\n close.style.display = \"unset\";\n\n // Create a child row and move rows into it\n const childRow = ce(\"tr\");\n insertAfter(childRow, tr);\n addClass(childRow, `${RESPONSIVE_CLASS}-child-row`);\n\n const childRowTd = ce(\"td\", childRow);\n setAttribute(childRowTd, \"colspan\", this.grid.columnsLength(true));\n\n const childTable = ce(\"table\", childRowTd);\n addClass(childTable, `${RESPONSIVE_CLASS}-table`);\n\n const hiddenCols = findAll(tr, `.${RESPONSIVE_CLASS}-hidden`);\n const idealWidth = this.computeLabelWidth();\n\n for (const col of hiddenCols) {\n const childTableRow = ce(\"tr\", childTable);\n\n // Add label\n const label = col.dataset.name;\n const labelCol = ce(\"th\", childTableRow);\n // It looks much better when aligned with an actual col\n labelCol.style.width = `${idealWidth}px`;\n labelCol.innerHTML = label;\n\n // Add actual row\n childTableRow.appendChild(col);\n removeAttribute(col, \"hidden\");\n }\n }\n\n this.unblockObserver();\n }\n}\n\nexport default ResponsiveGrid;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport interpolate from \"../utils/interpolate.js\";\nimport { dispatch, on, setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Add action on rows\n */\nclass RowActions extends BasePlugin {\n /**\n * @returns {Boolean}\n */\n hasActions() {\n return this.grid.options.actions.length > 0;\n }\n\n /**\n *\n * @param {HTMLTableRowElement} tr\n */\n makeActionHeader(tr) {\n const actionsTh = document.createElement(\"th\");\n setAttribute(actionsTh, \"role\", \"columnheader button\");\n setAttribute(actionsTh, \"aria-colindex\", this.grid.columnsLength(true));\n actionsTh.classList.add(...[\"dg-actions\", \"dg-not-sortable\", \"dg-not-resizable\", this.actionClass]);\n actionsTh.tabIndex = 0;\n tr.appendChild(actionsTh);\n }\n\n /**\n *\n * @param {HTMLTableRowElement} tr\n */\n makeActionFilter(tr) {\n const actionsTh = document.createElement(\"th\");\n actionsTh.setAttribute(\"role\", \"columnheader button\");\n setAttribute(actionsTh, \"aria-colindex\", this.grid.columnsLength(true));\n actionsTh.classList.add(...[\"dg-actions\", this.actionClass]);\n actionsTh.tabIndex = 0;\n tr.appendChild(actionsTh);\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n * @param {Object} item\n */\n makeActionRow(tr, item) {\n const labels = this.grid.labels;\n const td = document.createElement(\"td\");\n setAttribute(td, \"role\", \"gridcell\");\n setAttribute(td, \"aria-colindex\", this.grid.columnsLength(true));\n td.classList.add(...[\"dg-actions\", this.actionClass]);\n td.tabIndex = 0;\n\n // Add menu toggle\n const actionsToggle = document.createElement(\"button\");\n actionsToggle.classList.add(\"dg-actions-toggle\");\n actionsToggle.innerHTML = \"\u2630\";\n td.appendChild(actionsToggle);\n on(actionsToggle, \"click\", (ev) => {\n ev.stopPropagation();\n ev.target.parentElement.classList.toggle(\"dg-actions-expand\");\n });\n\n for (const action of this.grid.options.actions) {\n const button = document.createElement(\"button\");\n if (action.html) {\n button.innerHTML = action.html;\n } else {\n button.innerText = action.title ?? action.name;\n }\n if (action.title) {\n button.title = action.title;\n }\n if (action.url) {\n button.type = \"submit\";\n button.formAction = interpolate(action.url, item);\n }\n if (action.class) {\n button.classList.add(...action.class.split(\" \"));\n }\n const actionHandler = (ev) => {\n ev.stopPropagation();\n if (action.confirm) {\n const c = confirm(labels.areYouSure);\n if (!c) {\n ev.preventDefault();\n return;\n }\n }\n dispatch(this.grid, \"action\", {\n data: item,\n action: action.name,\n });\n };\n button.addEventListener(\"click\", actionHandler);\n td.appendChild(button);\n\n // Row action\n if (action.default) {\n tr.classList.add(\"dg-actionable\");\n tr.addEventListener(\"click\", actionHandler);\n }\n }\n\n tr.appendChild(td);\n }\n\n get actionClass() {\n if (this.grid.options.actions.length < 3 && !this.grid.options.collapseActions) {\n return `dg-actions-${this.grid.options.actions.length}`;\n }\n return \"dg-actions-more\";\n }\n}\n\nexport default RowActions;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport { dispatch } from \"../utils/shortcuts.js\";\n\n/**\n * Make editable inputs in rows\n */\nclass EditableColumn extends BasePlugin {\n /**\n *\n * @param {HTMLTableCellElement} td\n * @param {import(\"../data-grid\").Column} column\n * @param {Object} item\n * @param {number} i\n */\n makeEditableInput(td, column, item, i) {\n const gridId = this.grid.getAttribute(\"id\");\n const input = document.createElement(\"input\");\n input.type = column.editableType || \"text\";\n if (input.type === \"email\") {\n input.inputMode = \"email\";\n }\n if (input.type === \"decimal\") {\n input.type = \"text\";\n input.inputMode = \"decimal\";\n }\n input.autocomplete = \"off\";\n input.spellcheck = false;\n input.tabIndex = 0;\n input.classList.add(\"dg-editable\");\n input.name = `${gridId.replace(\"-\", \"_\")}[${i + 1}][${column.field}]`;\n input.value = item[column.field];\n input.dataset.field = column.field;\n\n // Prevent row action\n input.addEventListener(\"click\", (ev) => ev.stopPropagation());\n // Enter validates edit\n input.addEventListener(\"keypress\", (ev) => {\n if (ev.type === \"keypress\") {\n const key = ev.keyCode || ev.key;\n if (key === 13 || key === \"Enter\") {\n input.blur();\n ev.preventDefault();\n }\n }\n });\n // Save on blur\n input.addEventListener(\"blur\", () => {\n // Only fire on update\n if (input.value === item[input.dataset.field]) {\n return;\n }\n // Update underlying data\n item[input.dataset.field] = input.value;\n // Notify\n dispatch(this.grid, \"edit\", {\n data: item,\n value: input.value,\n });\n });\n td.appendChild(input);\n }\n}\n\nexport default EditableColumn;\n", "import BasePlugin from \"../core/base-plugin.js\";\r\nimport { $ } from \"../utils/shortcuts.js\";\r\n\r\n/**\r\n * Adds an element for showing a spinning icon on grid loading.\r\n */\r\nclass SpinnerSupport extends BasePlugin {\r\n connected() {\r\n // Inserts spinner\r\n if (this.grid.options.spinnerClass && this.grid.plugins.SpinnerSupport) {\r\n this.add();\r\n }\r\n }\r\n\r\n /**\r\n * Adds a spinner element with its associated css styles.\r\n */\r\n add() {\r\n const grid = this.grid;\r\n const classes = grid.options.spinnerClass;\r\n if (!classes) {\r\n return;\r\n }\r\n const cls = classes\r\n .split(\" \")\r\n .map((e) => `.${e}`)\r\n .join(\"\");\r\n\r\n const template = `\r\n\r\n`;\r\n if (!$(\"#dg-styles\")) {\r\n const styleParent = $(\"head\") ?? $(\"body\");\r\n const position = /head/i.test(styleParent.tagName) ? \"beforeend\" : \"afterbegin\";\r\n styleParent.insertAdjacentHTML(position, template);\r\n }\r\n !$(`i${cls}`, grid) && grid.insertAdjacentHTML(\"afterbegin\", ``);\r\n }\r\n}\r\n\r\nexport default SpinnerSupport;\r\n", "\uFEFFimport BasePlugin from \"../core/base-plugin.js\";\nimport { findAll } from \"../utils/shortcuts.js\";\n\n/**\n * @typedef GridState\n * @property {Object} meta\n * @property {Number} pages\n * @property {Number} page\n * @property {Number} perPage\n * @property {Object} filters\n * @property {Array} columns\n * @property {String} sort\n * @property {String} sortDir\n * @property {Number} scrollTo\n */\n\nclass SaveState extends BasePlugin {\n constructor(grid) {\n super(grid);\n this.cachedState = null;\n this.isFilterSortSet = false;\n this.isDataLoaded = false;\n this.isScrolled = false;\n this.log(\"Init\");\n }\n\n connected() {\n this.log(\"connected\");\n const grid = this.grid;\n\n if (!grid.options.saveState) {\n this.log(\"disabled\");\n return;\n }\n\n this.log(\"enabled\");\n\n const cachedState = this._getState();\n if (cachedState) {\n this.log(\"hide columns\");\n\n for (const col of cachedState.columns) {\n if (col.hidden) {\n const hideCol = grid.options.columns.find((c) => c.field === col.field);\n hideCol.hidden = true;\n }\n }\n\n this.log(\"set: meta, pages\");\n grid.options.perPage = cachedState.perPage;\n if (grid.options.server) {\n grid.meta = cachedState.meta;\n grid.pages = cachedState.pages;\n grid.page = cachedState.page;\n }\n }\n\n this.cachedState = cachedState;\n\n const dgLoadData = grid.loadData;\n grid.loadData = function (...args) {\n return new Promise((resolve, reject) => {\n dgLoadData.apply(this, args).finally(() => {\n const saveState = this.plugins.SaveState;\n\n if (!grid.classList.contains(\"dg-initialized\")) {\n saveState.log(\"not init, loadData skipped\");\n return resolve();\n }\n\n saveState.log(\"loadData finished, set param controls\");\n\n if (saveState.cachedState && !saveState.isFilterSortSet) {\n saveState.log(\"set sort and filters\");\n\n const sortableHeaders = findAll(grid, \"thead tr.dg-head-columns th[aria-sort]\");\n for (const el of sortableHeaders) {\n el.setAttribute(\"aria-sort\", \"none\");\n }\n\n grid.querySelector(\n `thead tr.dg-head-columns th[field='${saveState.cachedState.sort}']`,\n )?.setAttribute(\"aria-sort\", saveState.cachedState.sortDir);\n\n const filters = findAll(grid.filterRow, \"[id^=dg-filter]\");\n for (const el of filters) {\n el.value = saveState.cachedState.filters[el.dataset.name];\n }\n saveState.isFilterSortSet = true;\n }\n\n /** @type {GridState} */\n const newState = {\n meta: grid.meta,\n pages: grid.pages,\n page: grid.page,\n perPage: grid.options.perPage,\n filters: {},\n columns: grid.options.columns.map((col) => ({ field: col.field, hidden: col.hidden })),\n sort: grid.getSort(),\n sortDir: grid.getSortDir(),\n scrollTo: window.scrollY,\n };\n\n const filters = grid.getFilters();\n\n for (const key of Object.keys(filters)) {\n newState.filters[key] = filters[key];\n }\n\n saveState.log(\"store new state\");\n saveState._setState(newState);\n\n if (!grid.options.server && saveState.cachedState && !saveState.isDataLoaded) {\n saveState.isDataLoaded = true;\n grid.filterData();\n grid.page = saveState.cachedState.page;\n grid.pageChanged();\n }\n\n resolve();\n });\n });\n };\n\n const updateState = () => {\n const saveState = grid.plugins.SaveState;\n const state = saveState._getState();\n if (!state) {\n return;\n }\n state.columns = grid.options.columns.map((col) => ({ field: col.field, hidden: col.hidden }));\n state.sort = grid.getSort();\n state.sortDir = grid.getSortDir();\n state.scrollTo = window.scrollY;\n saveState._setState(state);\n };\n\n document.addEventListener(\"scrollend\", updateState);\n grid.addEventListener(\"headerRendered\", updateState);\n\n grid.addEventListener(\"bodyRendered\", (ev) => {\n if (!grid.classList.contains(\"dg-initialized\") || grid.classList.contains(\"dg-loading\")) {\n return;\n }\n\n if (!grid.options.server) {\n updateState();\n }\n\n const saveState = grid.plugins.SaveState;\n if (!saveState.cachedState || !saveState.isFilterSortSet) {\n return;\n }\n\n if (!saveState.isDataLoaded) {\n saveState.isDataLoaded = true;\n grid.reload();\n } else if (!saveState.isScrolled) {\n saveState.isScrolled = true;\n window.scrollTo({ top: saveState.cachedState.scrollTo, left: 0, behavior: \"instant\" });\n }\n });\n }\n\n log(message) {\n this.grid.log(`[Save-State] ${message}`);\n }\n\n /**\n * @returns {GridState}\n */\n _getState() {\n let state;\n try {\n state = JSON.parse(sessionStorage.getItem(`gridSaveState_${this.grid.id}`));\n } catch (_) {}\n return state;\n }\n\n /**\n * @param {GridState} state\n */\n _setState(state) {\n sessionStorage.setItem(`gridSaveState_${this.grid.id}`, JSON.stringify(state));\n }\n}\n\nexport default SaveState;\n", "/**\r\n * Data Grid custom element\r\n * https://github.com/lekoala/data-grid/\r\n * @license MIT\r\n */\r\n\r\nimport DataGrid from \"./src/data-grid.js\";\r\n// Optional plugins\r\nimport ColumnResizer from \"./src/plugins/column-resizer.js\";\r\nimport ContextMenu from \"./src/plugins/context-menu.js\";\r\nimport DraggableHeaders from \"./src/plugins/draggable-headers.js\";\r\nimport TouchSupport from \"./src/plugins/touch-support.js\";\r\nimport SelectableRows from \"./src/plugins/selectable-rows.js\";\r\nimport FixedHeight from \"./src/plugins/fixed-height.js\";\r\nimport AutosizeColumn from \"./src/plugins/autosize-column.js\";\r\nimport ResponsiveGrid from \"./src/plugins/responsive-grid.js\";\r\nimport RowActions from \"./src/plugins/row-actions.js\";\r\nimport EditableColumn from \"./src/plugins/editable-column.js\";\r\nimport SpinnerSupport from \"./src/plugins/spinner-support.js\";\r\nimport SaveState from \"./src/plugins/save-state.js\";\r\n\r\n// Using shorthand property names\r\n// This make them reserved and keys will be preserved\r\n// Actual class names are renamed\r\nDataGrid.registerPlugins({\r\n ColumnResizer,\r\n ContextMenu,\r\n DraggableHeaders,\r\n TouchSupport,\r\n SelectableRows,\r\n FixedHeight,\r\n AutosizeColumn,\r\n ResponsiveGrid,\r\n RowActions,\r\n EditableColumn,\r\n SpinnerSupport,\r\n SaveState\r\n});\r\n\r\n// Prevent errors if included multiple times\r\nif (!customElements.get(\"data-grid\")) {\r\n customElements.define(\"data-grid\", DataGrid);\r\n}\r\n\r\nexport default DataGrid;\r\n\r\nconst global = typeof globalThis !== \"undefined\" ? globalThis : self;\r\nglobal.DataGrid = DataGrid;"], + "mappings": "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", "names": ["col", "e", "th", "labels", "filters", "data_grid_default"] } diff --git a/dist/data-grid.min.css b/dist/data-grid.min.css index 8f4639d..20580dd 100644 --- a/dist/data-grid.min.css +++ b/dist/data-grid.min.css @@ -1,3 +1,3 @@ -@keyframes dataGridShow{0%{opacity:1}100%{opacity:.5}}data-grid{--padding: 0.5rem;--padding-x: 0.75rem;--padding-y: 0.5rem;--padding-y-header: 0.75rem;--padding-half: calc(var(--padding) / 2);--color-rgb: var(--bs-primary-rgb, 13, 110, 253);--color: rgb(var(--color-rgb));--highlight-color: #fffcee;--header-background: var(--bs-gray-200, #e9ecef);--header-color: var(--bs-dark, #212529);--input-background: var(--bs-body-bg, #ffffff);--input-border-color: var(--bs-border-color, #e9ecef);--btn-background: var(--bs-body-bg, #ffffff);--btn-color: var(--color);--btn-border-color: var(--bs-border-color, #e9ecef);--body-bg: var(--bs-body-bg, #212529);--body-color: var(--bs-body-color, #212529);--icon-scale: 1;--border-radius: 0.25rem;--row-border-color: #f2f2f2;--responsive-width: 60%;--black: var(--bs-black, #000);--white: var(--bs-white, #fff);--gray: var(--bs-gray, #6c757d);--gray-dark: var(--bs-gray-dark, #343a40);--gray-100: var(--bs-gray-100, #f8f9fa);--gray-200: var(--bs-gray-200, #e9ecef);--gray-300: var(--bs-gray-300, #dee2e6);--gray-400: var(--bs-gray-400, #ced4da);--gray-500: var(--bs-gray-500, #adb5bd);--gray-600: var(--bs-gray-600, #6c757d);--gray-700: var(--bs-gray-700, #495057);--gray-800: var(--bs-gray-800, #343a40);--gray-900: var(--bs-gray-900, #212529);display:block;min-height:6rem;position:relative}data-grid{--scroller-color: 0, 0%;--scroller-color-lightness: 80%;--scroller-hover-factor: 0.8;--scroller-thumb: hsl(var(--scroller-color), var(--scroller-color-lightness));--scroller-thumb-hover: hsl(var(--scroller-color), calc(var(--scroller-color-lightness) * var(--scroller-hover-factor)));--scroller-background: transparent;scrollbar-color:var(--scroller-thumb) var(--scroller-background);scrollbar-width:thin}data-grid::-webkit-scrollbar{width:8px;height:8px}data-grid::-webkit-scrollbar-track{background:rgba(0,0,0,0)}data-grid::-webkit-scrollbar-thumb{background:var(--scroller-thumb)}data-grid::-webkit-scrollbar-thumb:hover{background:var(--scroller-thumb-hover)}data-grid>table[role=grid] tr.dg-head-columns:is(:empty,:has(>:first-child:not([scope=col]))){display:none}data-grid img{border:none;height:auto;max-width:100%;vertical-align:middle}data-grid [hidden]{display:none}data-grid table{display:table;table-layout:fixed;width:100%;max-width:100%;white-space:normal;background:var(--header-background)}data-grid thead,data-grid tfoot{background-color:var(--header-background);color:var(--header-color)}data-grid.dg-loading:not(.dg-initialized) thead,data-grid.dg-loading:not(.dg-initialized) tfoot{background:none}data-grid.dg-loading tbody{animation-name:dataGridShow;animation-timing-function:ease-in;animation-fill-mode:forwards;animation-duration:.3s;pointer-events:none}data-grid.dg-loading:not(:has(th)) tfoot{display:none}data-grid tr{position:relative}data-grid th,data-grid td{empty-cells:show;padding:var(--padding-y) var(--padding-x);text-align:left}data-grid th[tabindex],data-grid td[tabindex]{outline:none;word-break:normal}data-grid th{font-weight:bold;padding:var(--padding-y-header) var(--padding-x)}data-grid th,data-grid td{position:relative;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap}data-grid th.dg-wrap,data-grid td.dg-wrap{white-space:normal;word-break:break-all}data-grid .dg-expandable{cursor:pointer}data-grid .dg-expandable.dg-expanded td{white-space:normal;word-break:break-all}data-grid .dg-clickable-cell{margin:0;position:absolute;top:0;left:0;width:100%;height:100%;cursor:pointer;display:flex;align-items:center;justify-content:center}data-grid[sticky] table thead,data-grid[sticky] table tfoot{z-index:2;position:sticky;margin:0;border:0}data-grid[sticky] table thead{inset-block-start:-1px}data-grid[sticky] table tfoot{inset-block-end:-1px}data-grid .dg-nav-icon,data-grid .dg-skip-icon{width:22px;height:22px;box-sizing:border-box;position:absolute;display:block;top:50%;left:50%;transform:translate(-50%, -50%) scale(var(--icon-scale, 1))}data-grid .dg-nav-icon:before,data-grid .dg-nav-icon:after,data-grid .dg-skip-icon:before,data-grid .dg-skip-icon:after{content:"";display:block;box-sizing:border-box;position:absolute}data-grid .dg-nav-icon::before{width:0;height:10px;border-top:5px solid rgba(0,0,0,0);border-bottom:5px solid rgba(0,0,0,0);border-left:6px solid;top:6px;left:9px}data-grid .dg-skip-icon::before{width:3px;height:10px;background:currentColor;top:6px;left:14px}data-grid .dg-skip-icon::after{width:0;height:10px;border-top:5px solid rgba(0,0,0,0);border-bottom:5px solid rgba(0,0,0,0);border-left:6px solid;top:6px;left:7px}data-grid .dg-rotate{transform:rotate(-180deg)}data-grid button{background-color:var(--btn-background);border:solid 1px var(--btn-border-color);border-radius:var(--border-radius);color:var(--body-color);height:2rem;margin:0 .2rem;padding:0 .5rem;pointer-events:all;text-align:center;cursor:pointer}data-grid button:hover{opacity:.7}data-grid button:disabled:hover{background-color:inherit;border-color:inherit}data-grid input[type=checkbox]{margin:0}data-grid input:not([type=checkbox]),data-grid select{background-color:var(--input-background, "#fff");color:currentColor;box-sizing:border-box;border:1px solid var(--input-border-color, "#f0f0f0");border-radius:var(--border-radius);height:2rem;margin:0 .2rem;padding:0 var(--padding);max-width:none}data-grid input:not([type=checkbox]):focus,data-grid select:focus,data-grid button:focus{box-shadow:0 0 0 var(--padding-half) rgba(var(--color-rgb), 0.25);outline:0}data-grid input:not([type=checkbox])[disabled],data-grid input:not([type=checkbox]):disabled,data-grid select[disabled],data-grid select:disabled,data-grid button[disabled],data-grid button:disabled{opacity:.35;pointer-events:none}data-grid thead tr:nth-child(2) th{padding:0 2px 0 0;background-color:rgba(0,0,0,0)}data-grid thead tr:nth-child(2) th>*{width:100%;border-radius:0;margin:0}data-grid thead tr:nth-child(2) th input:focus{box-shadow:inset 0px 0px 0px 1px var(--color)}data-grid tbody td.dg-editable-col{padding:0;height:0}data-grid tbody td input.dg-editable{width:100%;background:rgba(0,0,0,0);border:0;border-radius:0;margin:0;box-shadow:none;height:100%}data-grid tbody td input.dg-editable:focus{box-shadow:inset 0px 0px 0px 1px var(--color)}data-grid.dg-empty tbody{height:4rem;position:relative}data-grid.dg-empty tbody:before{position:absolute;top:50%;left:50%;content:attr(data-empty);transform:translate(-50%, -50%);opacity:.5;font-size:1.5rem;text-align:center;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:90%}data-grid.dg-empty tr.dg-fake-row{height:4rem;border:none}data-grid.dg-empty.dg-network-error table{color:#842029;background-color:#f8d7da;border:1px solid #f5c2c7}data-grid.dg-empty.dg-network-error tbody{height:auto}data-grid.dg-empty.dg-network-error tbody:before{font-size:2rem;top:auto;transform:translate(-50%)}data-grid.dg-empty.dg-network-error tbody tr:not(.dg-fake-row){display:none}data-grid.dg-empty:not(.dg-network-error) tbody:before{top:auto;transform:translate(-50%, 30%)}data-grid tbody tr{border-bottom:solid 1px var(--row-border-color)}data-grid tbody tr:nth-child(even){background-color:var(--bs-table-striped-bg, #f8f9fa)}data-grid tbody tr:hover{background-color:var(--highlight-color) !important}data-grid tbody tr:focus{background-color:var(--highlight-color) !important;border-bottom-color:var(--highlight-color) !important;outline:none}data-grid tfoot{min-width:280px}data-grid tfoot td{padding:var(--padding-y-header) var(--padding-x)}data-grid tfoot .dg-page-nav{display:flex;align-items:center;min-width:160px}data-grid tfoot .dg-input-page{width:4rem}data-grid tfoot .dg-footer{display:flex;align-items:center;flex-direction:row;justify-content:space-between}data-grid tfoot .dg-pagination{display:flex;text-align:center}data-grid tfoot .dg-pagination button{position:relative;width:2rem}data-grid tfoot .dg-meta{min-width:160px;text-align:right}data-grid tfoot.dg-footer-compact .dg-meta{display:none}data-grid tfoot.dg-footer-compact .dg-input-page{display:none}data-grid [aria-sort]{cursor:pointer;padding-right:1.5rem}data-grid [aria-sort=none]:after,data-grid [aria-sort=none]:before,data-grid [aria-sort=ascending]:before,data-grid [aria-sort=descending]:after{right:.5rem;top:calc(50% - .5rem);border:solid rgba(0,0,0,0);content:" ";height:0;width:0;position:absolute;border-color:rgba(0,0,0,0);border-width:.25rem;margin-left:-0.25rem}data-grid [aria-sort=none]:before{border-bottom-color:currentColor;opacity:.25;top:calc(50% - .6rem)}data-grid [aria-sort=none]:after{border-top-color:currentColor;opacity:.25;bottom:calc(50% - .5rem);top:auto}data-grid [aria-sort=ascending]:before{border-bottom-color:var(--body-color);opacity:.75}data-grid [aria-sort=descending]:after{border-top-color:var(--body-color);opacity:.75;bottom:calc(50% - .5rem);top:auto}[data-bs-theme=dark] data-grid{--scroller-color-lightness: 20%;--highlight-color: #43423e;--header-background: var(--bs-gray-800, #34373b);--header-color: var(--bs-light, #e9ecef);--body-color: var(--bs-body-color, #494e53);--row-border-color: var(--bs-gray-900, #212325)}[data-bs-theme=dark] data-grid tbody tr:nth-child(even){background-color:var(--bs-table-striped-bg, #2c3034)}data-grid[dir=rtl] th,data-grid[dir=rtl] td{text-align:right}data-grid[dir=rtl] [aria-sort]{padding-left:1rem;padding-right:.5rem}data-grid[dir=rtl] [aria-sort=none]:after,data-grid[dir=rtl] [aria-sort=none]:before,data-grid[dir=rtl] [aria-sort=ascending]:before,data-grid[dir=rtl] [aria-sort=descending]:after{left:.75rem;right:auto}data-grid[dir=rtl] tfoot .dg-meta{text-align:left}data-grid .dg-menu{position:absolute;z-index:3;background:var(--body-bg);list-style:none;max-width:150px;margin:0;padding:var(--padding);box-shadow:0 0 1rem rgba(0,0,0,.25);border-radius:var(--border-radius)}data-grid .dg-menu li{margin:0;padding:0}data-grid .dg-menu label{display:flex;align-items:center;margin-bottom:.25em}data-grid .dg-menu input{margin-right:.5em}data-grid .dg-actions{text-overflow:initial;width:100px;text-align:right;white-space:nowrap !important}data-grid .dg-actions button{margin:0}data-grid .dg-actions button+button{margin-left:.5rem}data-grid .dg-actions .dg-actions-toggle{display:none;width:calc(100px - var(--padding-x)*2)}data-grid .dg-actions.dg-actions-1{width:100%}data-grid .dg-actions.dg-actions-2 button{width:calc(50% - .25rem)}data-grid .dg-actions.dg-actions-more button{display:none}data-grid .dg-actions.dg-actions-more button.dg-actions-toggle{display:inline-block}data-grid .dg-actions.dg-actions-expand{position:absolute;right:0;display:flex;align-items:center;justify-content:flex-end;width:100%;height:100%}data-grid .dg-actions.dg-actions-expand.dg-actions-more{width:100%}data-grid .dg-actions.dg-actions-expand.dg-actions-more button{display:inline-block}data-grid tr.dg-actionable{cursor:pointer}data-grid tr.dg-actionable:hover td{background-color:var(--highlight-color)}data-grid .dg-resizer{position:absolute;top:0;right:0;width:6px;z-index:2;cursor:col-resize;-webkit-user-select:none;-moz-user-select:none;user-select:none}data-grid .dg-resizer:before{content:"";display:block;position:absolute;top:var(--padding-y-header);height:1.5rem;right:0;width:2px;background:var(--body-color);opacity:.2}data-grid .dg-resizer:hover:before{opacity:.6}data-grid .dg-resizer.dg-resizer-active{border-right:1px dashed var(--color)}data-grid .dg-resizer.dg-resizer-active:before{opacity:.6}data-grid .dg-responsive-toggle{padding:0;text-align:center}data-grid .dg-responsive-child-row>td{padding:0}data-grid .dg-responsive-table{table-layout:auto;border:0}data-grid .dg-responsive-table td,data-grid .dg-responsive-table th{white-space:normal}data-grid .dg-responsive-table th{max-width:40%}@media only screen and (max-width: 767px){data-grid[responsive] .dg-resizer{display:none}data-grid[responsive] .dg-meta{display:none}data-grid[responsive] .dg-input-page{display:none}data-grid[responsive] table,data-grid[responsive] tbody,data-grid[responsive] tfoot,data-grid[responsive] th,data-grid[responsive] td,data-grid[responsive] tr:not([hidden]){display:block}data-grid[responsive] thead{display:flex;border-bottom:2px solid var(--header-background)}data-grid[responsive] thead>tr{flex-grow:1}data-grid[responsive] thead th{width:auto}data-grid[responsive] tbody tr{padding:0;border:1px solid var(--header-background)}data-grid[responsive] tbody td{border:none;border-bottom:1px solid var(--row-border-color);position:relative;padding-left:calc(100% - var(--responsive-width) - var(--padding)*2)}data-grid[responsive] tbody td:last-child{border:0}data-grid[responsive] tbody td:before{position:absolute;top:0;left:0;padding:var(--padding);width:calc(100% - var(--responsive-width) - var(--padding)*4);content:attr(data-name);display:block;font-weight:bold;background-color:var(--header-background)}data-grid[responsive] tbody td[role=gridcell]{padding-left:calc(100% - var(--responsive-width) - var(--padding)*4 + .5rem)}data-grid[responsive] .dg-selectable{height:28px;margin:2px 1px 2px}data-grid[responsive] td.dg-selectable::before,data-grid[responsive] td.dg-actions::before{padding:0}data-grid[responsive] td.dg-selectable label{padding:5px}data-grid[responsive] td[role=gridcell]{min-height:35px;width:auto}data-grid[responsive] td[data-name]::before{height:100%}data-grid[responsive] td.dg-actions{padding-left:inherit;width:inherit}data-grid[responsive] .dg-actions button{width:inherit !important}data-grid[responsive] tr.dg-head-columns{padding:0;width:calc(100% - var(--responsive-width) - var(--padding)*4)}data-grid[responsive] tr.dg-head-columns th[role="columnheader button"]{padding:.36em 1.3em .36em .75em}data-grid[responsive] tr.dg-head-filters{background:rgba(0,0,0,0);vertical-align:top;padding:0;width:calc(100% - (100% - var(--responsive-width) - var(--padding)*4))}data-grid[responsive] .dg-head-filters th input:not([type=checkbox],[type=radio]){height:2.25em}data-grid[responsive] .dg-head-filters th.dg-selectable{background:rgba(0,0,0,0)}data-grid[responsive] .dg-head-filters th.dg-selectable label::before{content:"Column Filters"}data-grid[responsive] tfoot .dg-page-nav{min-width:revert}data-grid[data-responsive=true] tfoot .dg-page-nav{min-width:revert}} +@keyframes dataGridShow{0%{opacity:1}100%{opacity:.5}}data-grid{--padding: 0.5rem;--padding-x: 0.75rem;--padding-y: 0.5rem;--padding-y-header: 0.75rem;--padding-half: calc(var(--padding) / 2);--color-rgb: var(--bs-primary-rgb, 13, 110, 253);--color: rgb(var(--color-rgb));--highlight-color: #fffcee;--body-background: var(--bs-table-bg, #fff);--striped-background: rgba(0, 0, 0, 0.05);--header-background: var(--bs-gray-200, #e9ecef);--header-color: var(--bs-dark, #212529);--input-background: var(--bs-body-bg, #ffffff);--input-border-color: var(--bs-border-color, #e9ecef);--btn-background: var(--bs-body-bg, #ffffff);--btn-color: var(--color);--btn-border-color: var(--bs-border-color, #e9ecef);--body-bg: var(--bs-body-bg, #212529);--body-color: var(--bs-body-color, #212529);--icon-scale: 1;--border-radius: 0.25rem;--row-border-color: #f2f2f2;--responsive-width: 60%;--black: var(--bs-black, #000);--white: var(--bs-white, #fff);--gray: var(--bs-gray, #6c757d);--gray-dark: var(--bs-gray-dark, #343a40);--gray-100: var(--bs-gray-100, #f8f9fa);--gray-200: var(--bs-gray-200, #e9ecef);--gray-300: var(--bs-gray-300, #dee2e6);--gray-400: var(--bs-gray-400, #ced4da);--gray-500: var(--bs-gray-500, #adb5bd);--gray-600: var(--bs-gray-600, #6c757d);--gray-700: var(--bs-gray-700, #495057);--gray-800: var(--bs-gray-800, #343a40);--gray-900: var(--bs-gray-900, #212529);display:block;min-height:6rem;position:relative}data-grid{--scroller-color: 0, 0%;--scroller-color-lightness: 80%;--scroller-hover-factor: 0.8;--scroller-thumb: hsl(var(--scroller-color), var(--scroller-color-lightness));--scroller-thumb-hover: hsl(var(--scroller-color), calc(var(--scroller-color-lightness) * var(--scroller-hover-factor)));--scroller-background: transparent;scrollbar-color:var(--scroller-thumb) var(--scroller-background);scrollbar-width:thin}data-grid::-webkit-scrollbar{width:8px;height:8px}data-grid::-webkit-scrollbar-track{background:rgba(0,0,0,0)}data-grid::-webkit-scrollbar-thumb{background:var(--scroller-thumb)}data-grid::-webkit-scrollbar-thumb:hover{background:var(--scroller-thumb-hover)}data-grid>table[role=grid] tr.dg-head-columns:is(:empty,:has(>:first-child:not([scope=col]))){display:none}data-grid img{border:none;height:auto;max-width:100%;vertical-align:middle}data-grid [hidden]{display:none}data-grid table{display:table;table-layout:fixed;width:100%;max-width:100%;white-space:normal;background:var(--body-background)}data-grid thead,data-grid tfoot{background-color:var(--header-background);color:var(--header-color)}data-grid.dg-loading:not(.dg-initialized) thead,data-grid.dg-loading:not(.dg-initialized) tfoot{background:none}data-grid.dg-loading tbody{animation-name:dataGridShow;animation-timing-function:ease-in;animation-fill-mode:forwards;animation-duration:.3s;pointer-events:none}data-grid.dg-loading:not(:has(th)) tfoot{display:none}data-grid tr{position:relative}data-grid th,data-grid td{empty-cells:show;padding:var(--padding-y) var(--padding-x);text-align:left}data-grid th[tabindex],data-grid td[tabindex]{outline:none;word-break:normal}data-grid th{font-weight:bold;padding:var(--padding-y-header) var(--padding-x)}data-grid th,data-grid td{position:relative;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap}data-grid th.dg-wrap,data-grid td.dg-wrap{white-space:normal;word-break:break-all}data-grid .dg-expandable{cursor:pointer}data-grid .dg-expandable.dg-expanded td{white-space:normal;word-break:break-all}data-grid .dg-clickable-cell{margin:0;position:absolute;top:0;left:0;width:100%;height:100%;cursor:pointer;display:flex;align-items:center;justify-content:center}data-grid[sticky] table thead,data-grid[sticky] table tfoot{z-index:2;position:sticky;margin:0;border:0}data-grid[sticky] table thead{inset-block-start:-1px}data-grid[sticky] table tfoot{inset-block-end:-1px}data-grid .dg-nav-icon,data-grid .dg-skip-icon{width:22px;height:22px;box-sizing:border-box;position:absolute;display:block;top:50%;left:50%;transform:translate(-50%, -50%) scale(var(--icon-scale, 1))}data-grid .dg-nav-icon:before,data-grid .dg-nav-icon:after,data-grid .dg-skip-icon:before,data-grid .dg-skip-icon:after{content:"";display:block;box-sizing:border-box;position:absolute}data-grid .dg-nav-icon::before{width:0;height:10px;border-top:5px solid rgba(0,0,0,0);border-bottom:5px solid rgba(0,0,0,0);border-left:6px solid;top:6px;left:9px}data-grid .dg-skip-icon::before{width:3px;height:10px;background:currentColor;top:6px;left:14px}data-grid .dg-skip-icon::after{width:0;height:10px;border-top:5px solid rgba(0,0,0,0);border-bottom:5px solid rgba(0,0,0,0);border-left:6px solid;top:6px;left:7px}data-grid .dg-rotate{transform:rotate(-180deg)}data-grid button{background-color:var(--btn-background);border:solid 1px var(--btn-border-color);border-radius:var(--border-radius);color:var(--body-color);height:2rem;margin:0 .2rem;padding:0 .5rem;pointer-events:all;text-align:center;cursor:pointer}data-grid button:hover{opacity:.7}data-grid button:disabled:hover{background-color:inherit;border-color:inherit}data-grid input[type=checkbox]{margin:0}data-grid input:not([type=checkbox]),data-grid select{background-color:var(--input-background, "#fff");color:currentColor;box-sizing:border-box;border:1px solid var(--input-border-color, "#f0f0f0");border-radius:var(--border-radius);height:2rem;margin:0 .2rem;padding:0 var(--padding);max-width:none}data-grid input:not([type=checkbox]):focus,data-grid select:focus,data-grid button:focus{box-shadow:0 0 0 var(--padding-half) rgba(var(--color-rgb), 0.25);outline:0}data-grid input:not([type=checkbox])[disabled],data-grid input:not([type=checkbox]):disabled,data-grid select[disabled],data-grid select:disabled,data-grid button[disabled],data-grid button:disabled{opacity:.35;pointer-events:none}data-grid thead tr:nth-child(2) th{padding:0 2px 0 0;background-color:rgba(0,0,0,0)}data-grid thead tr:nth-child(2) th>*{width:100%;border-radius:0;margin:0}data-grid thead tr:nth-child(2) th input:focus{box-shadow:inset 0px 0px 0px 1px var(--color)}data-grid tbody td.dg-editable-col{padding:0;height:0}data-grid tbody td input.dg-editable{width:100%;background:rgba(0,0,0,0);border:0;border-radius:0;margin:0;box-shadow:none;height:100%}data-grid tbody td input.dg-editable:focus{box-shadow:inset 0px 0px 0px 1px var(--color)}data-grid.dg-empty tbody{height:4rem;position:relative}data-grid.dg-empty tbody:before{position:absolute;top:50%;left:50%;content:attr(data-empty);transform:translate(-50%, -50%);opacity:.5;font-size:1.5rem;text-align:center;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:90%}data-grid.dg-empty tr.dg-fake-row{height:4rem;border:none}data-grid.dg-empty.dg-network-error table{color:#842029;background-color:#f8d7da;border:1px solid #f5c2c7}data-grid.dg-empty.dg-network-error tbody{height:auto}data-grid.dg-empty.dg-network-error tbody:before{font-size:2rem;top:auto;transform:translate(-50%)}data-grid.dg-empty.dg-network-error tbody tr:not(.dg-fake-row){display:none}data-grid.dg-empty:not(.dg-network-error) tbody:before{top:auto;transform:translate(-50%, 30%)}data-grid tbody tr{border-bottom:solid 1px var(--row-border-color)}data-grid tbody tr:nth-child(even){background-color:var(--striped-background)}data-grid tbody tr:hover{background-color:var(--highlight-color) !important}data-grid tbody tr:focus{background-color:var(--highlight-color) !important;border-bottom-color:var(--highlight-color) !important;outline:none}data-grid tfoot{min-width:280px}data-grid tfoot td{padding:var(--padding-y-header) var(--padding-x)}data-grid tfoot .dg-page-nav{display:flex;align-items:center;min-width:160px}data-grid tfoot .dg-input-page{width:4rem}data-grid tfoot .dg-footer{display:flex;align-items:center;flex-direction:row;justify-content:space-between}data-grid tfoot .dg-pagination{display:flex;text-align:center}data-grid tfoot .dg-pagination button{position:relative;width:2rem}data-grid tfoot .dg-meta{min-width:160px;text-align:right}data-grid tfoot.dg-footer-compact .dg-meta{display:none}data-grid tfoot.dg-footer-compact .dg-input-page{display:none}data-grid [aria-sort]{cursor:pointer;padding-right:1.5rem}data-grid [aria-sort=none]:after,data-grid [aria-sort=none]:before,data-grid [aria-sort=ascending]:before,data-grid [aria-sort=descending]:after{right:.5rem;top:calc(50% - .5rem);border:solid rgba(0,0,0,0);content:" ";height:0;width:0;position:absolute;border-color:rgba(0,0,0,0);border-width:.25rem;margin-left:-0.25rem}data-grid [aria-sort=none]:before{border-bottom-color:currentColor;opacity:.25;top:calc(50% - .6rem)}data-grid [aria-sort=none]:after{border-top-color:currentColor;opacity:.25;bottom:calc(50% - .5rem);top:auto}data-grid [aria-sort=ascending]:before{border-bottom-color:var(--body-color);opacity:.75}data-grid [aria-sort=descending]:after{border-top-color:var(--body-color);opacity:.75;bottom:calc(50% - .5rem);top:auto}[data-bs-theme=dark] data-grid{--scroller-color-lightness: 20%;--highlight-color: #43423e;--body-background: #212529;--striped-background: #2c3034;--header-background: var(--bs-gray-800, #34373b);--header-color: var(--bs-light, #e9ecef);--body-color: var(--bs-body-color, #494e53);--row-border-color: var(--bs-gray-900, #212325)}data-grid[dir=rtl] th,data-grid[dir=rtl] td{text-align:right}data-grid[dir=rtl] [aria-sort]{padding-left:1rem;padding-right:.5rem}data-grid[dir=rtl] [aria-sort=none]:after,data-grid[dir=rtl] [aria-sort=none]:before,data-grid[dir=rtl] [aria-sort=ascending]:before,data-grid[dir=rtl] [aria-sort=descending]:after{left:.75rem;right:auto}data-grid[dir=rtl] tfoot .dg-meta{text-align:left}data-grid .dg-menu{position:absolute;z-index:3;background:var(--body-bg);list-style:none;max-width:150px;margin:0;padding:var(--padding);box-shadow:0 0 1rem rgba(0,0,0,.25);border-radius:var(--border-radius)}data-grid .dg-menu li{margin:0;padding:0}data-grid .dg-menu label{display:flex;align-items:center;margin-bottom:.25em}data-grid .dg-menu input{margin-right:.5em}data-grid .dg-actions{text-overflow:initial;width:100px;text-align:right;white-space:nowrap !important}data-grid .dg-actions button{margin:0}data-grid .dg-actions button+button{margin-left:.5rem}data-grid .dg-actions .dg-actions-toggle{display:none;width:calc(100px - var(--padding-x)*2)}data-grid .dg-actions.dg-actions-1{width:100%}data-grid .dg-actions.dg-actions-2 button{width:calc(50% - .25rem)}data-grid .dg-actions.dg-actions-more button{display:none}data-grid .dg-actions.dg-actions-more button.dg-actions-toggle{display:inline-block}data-grid .dg-actions.dg-actions-expand{position:absolute;right:0;display:flex;align-items:center;justify-content:flex-end;width:100%;height:100%}data-grid .dg-actions.dg-actions-expand.dg-actions-more{width:100%}data-grid .dg-actions.dg-actions-expand.dg-actions-more button{display:inline-block}data-grid tr.dg-actionable{cursor:pointer}data-grid tr.dg-actionable:hover td{background-color:var(--highlight-color)}data-grid .dg-resizer{position:absolute;top:0;right:0;width:6px;z-index:2;cursor:col-resize;-webkit-user-select:none;-moz-user-select:none;user-select:none}data-grid .dg-resizer:before{content:"";display:block;position:absolute;top:var(--padding-y-header);height:1.5rem;right:0;width:2px;background:var(--body-color);opacity:.2}data-grid .dg-resizer:hover:before{opacity:.6}data-grid .dg-resizer.dg-resizer-active{border-right:1px dashed var(--color)}data-grid .dg-resizer.dg-resizer-active:before{opacity:.6}data-grid .dg-responsive-toggle{padding:0;text-align:center}data-grid .dg-responsive-child-row>td{padding:0}data-grid .dg-responsive-table{table-layout:auto;border:0}data-grid .dg-responsive-table td,data-grid .dg-responsive-table th{white-space:normal}data-grid .dg-responsive-table th{max-width:40%}@media only screen and (max-width: 767px){data-grid[responsive] .dg-resizer{display:none}data-grid[responsive] .dg-meta{display:none}data-grid[responsive] .dg-input-page{display:none}data-grid[responsive] table,data-grid[responsive] tbody,data-grid[responsive] tfoot,data-grid[responsive] th,data-grid[responsive] td,data-grid[responsive] tr:not([hidden]){display:block}data-grid[responsive] thead{display:flex;border-bottom:2px solid var(--header-background)}data-grid[responsive] thead>tr{flex-grow:1}data-grid[responsive] thead th{width:auto}data-grid[responsive] tbody tr{padding:0;border:1px solid var(--header-background)}data-grid[responsive] tbody td{border:none;border-bottom:1px solid var(--row-border-color);position:relative;padding-left:calc(100% - var(--responsive-width) - var(--padding)*2)}data-grid[responsive] tbody td:last-child{border:0}data-grid[responsive] tbody td:before{position:absolute;top:0;left:0;padding:var(--padding);width:calc(100% - var(--responsive-width) - var(--padding)*4);content:attr(data-name);display:block;font-weight:bold;background-color:var(--header-background)}data-grid[responsive] tbody td[role=gridcell]{padding-left:calc(100% - var(--responsive-width) - var(--padding)*4 + .5rem)}data-grid[responsive] .dg-selectable{height:28px;margin:2px 1px 2px}data-grid[responsive] td.dg-selectable::before,data-grid[responsive] td.dg-actions::before{padding:0}data-grid[responsive] td.dg-selectable label{padding:5px}data-grid[responsive] td[role=gridcell]{min-height:35px;width:auto}data-grid[responsive] td[data-name]::before{height:100%}data-grid[responsive] td.dg-actions{padding-left:inherit;width:inherit}data-grid[responsive] .dg-actions button{width:inherit !important}data-grid[responsive] tr.dg-head-columns{padding:0;width:calc(100% - var(--responsive-width) - var(--padding)*4)}data-grid[responsive] tr.dg-head-columns th[role="columnheader button"]{padding:.36em 1.3em .36em .75em}data-grid[responsive] tr.dg-head-filters{background:rgba(0,0,0,0);vertical-align:top;padding:0;width:calc(100% - (100% - var(--responsive-width) - var(--padding)*4))}data-grid[responsive] .dg-head-filters th input:not([type=checkbox],[type=radio]){height:2.25em}data-grid[responsive] .dg-head-filters th.dg-selectable{background:rgba(0,0,0,0)}data-grid[responsive] .dg-head-filters th.dg-selectable label::before{content:"Column Filters"}data-grid[responsive] tfoot .dg-page-nav{min-width:revert}data-grid[data-responsive=true] tfoot .dg-page-nav{min-width:revert}} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3Njc3MvX2NvcmUuc2NzcyIsIi4uL3Njc3MvX3J0bC5zY3NzIiwiLi4vc2Nzcy9fbWVudS5zY3NzIiwiLi4vc2Nzcy9fYWN0aW9ucy5zY3NzIiwiLi4vc2Nzcy9fcmVzaXplci5zY3NzIiwiLi4vc2Nzcy9fcmVzcG9uc2l2ZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLHdCQUNFLEdBQ0UsU0FBQSxDQUdGLEtBQ0UsVUFBQSxDQUFBLENBSUosVUFDRSxpQkFBQSxDQUNBLG9CQUFBLENBQ0EsbUJBQUEsQ0FDQSwyQkFBQSxDQUNBLHdDQUFBLENBQ0EsZ0RBQUEsQ0FDQSw4QkFBQSxDQUVBLDBCQUFBLENBQ0EsZ0RBQUEsQ0FDQSx1Q0FBQSxDQUNBLDhDQUFBLENBQ0EscURBQUEsQ0FDQSw0Q0FBQSxDQUNBLHlCQUFBLENBQ0EsbURBQUEsQ0FDQSxxQ0FBQSxDQUNBLDJDQUFBLENBQ0EsZUFBQSxDQUNBLHdCQUFBLENBQ0EsMkJBQUEsQ0FDQSx1QkFBQSxDQUVBLDhCQUFBLENBQ0EsOEJBQUEsQ0FDQSwrQkFBQSxDQUNBLHlDQUFBLENBQ0EsdUNBQUEsQ0FDQSx1Q0FBQSxDQUNBLHVDQUFBLENBQ0EsdUNBQUEsQ0FDQSx1Q0FBQSxDQUNBLHVDQUFBLENBQ0EsdUNBQUEsQ0FDQSx1Q0FBQSxDQUNBLHVDQUFBLENBRUEsYUFBQSxDQUNBLGVBQUEsQ0FDQSxpQkFBQSxDQUdBLFVBQ0UsdUJBQUEsQ0FDQSwrQkFBQSxDQUNBLDRCQUFBLENBQ0EsNkVBQUEsQ0FFQSx3SEFBQSxDQUNBLGtDQUFBLENBQ0EsZ0VBQUEsQ0FDQSxvQkFBQSxDQUVBLDZCQUNFLFNBQUEsQ0FDQSxVQUFBLENBR0YsbUNBQ0Usd0JBQUEsQ0FHRixtQ0FDRSxnQ0FBQSxDQUdGLHlDQUNFLHNDQUFBLENBT0EsOEZBQ0UsWUFBQSxDQUtOLGNBQ0UsV0FBQSxDQUNBLFdBQUEsQ0FDQSxjQUFBLENBQ0EscUJBQUEsQ0FHRixtQkFDRSxZQUFBLENBR0YsZ0JBQ0UsYUFBQSxD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 */ \ No newline at end of file +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3Njc3MvX2NvcmUuc2NzcyIsIi4uL3Njc3MvX3J0bC5zY3NzIiwiLi4vc2Nzcy9fbWVudS5zY3NzIiwiLi4vc2Nzcy9fYWN0aW9ucy5zY3NzIiwiLi4vc2Nzcy9fcmVzaXplci5zY3NzIiwiLi4vc2Nzcy9fcmVzcG9uc2l2ZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLHdCQUNFLEdBQ0UsU0FBQSxDQUdGLEtBQ0UsVUFBQSxDQUFBLENBSUosVUFDRSxpQkFBQSxDQUNBLG9CQUFBLENBQ0EsbUJBQUEsQ0FDQSwyQkFBQSxDQUNBLHdDQUFBLENBQ0EsZ0RBQUEsQ0FDQSw4QkFBQSxDQUVBLDBCQUFBLENBQ0EsMkNBQUEsQ0FDQSx5Q0FBQSxDQUNBLGdEQUFBLENBQ0EsdUNBQUEsQ0FDQSw4Q0FBQSxDQUNBLHFEQUFBLENBQ0EsNENBQUEsQ0FDQSx5QkFBQSxDQUNBLG1EQUFBLENBQ0EscUNBQUEsQ0FDQSwyQ0FBQSxDQUNBLGVBQUEsQ0FDQSx3QkFBQSxDQUNBLDJCQUFBLENBQ0EsdUJBQUEsQ0FFQSw4QkFBQSxDQUNBLDhCQUFBLENBQ0EsK0JBQUEsQ0FDQSx5Q0FBQSxDQUNBLHVDQUFBLENBQ0EsdUNBQUEsQ0FDQSx1Q0FBQSxDQUNBLHVDQUFBLENBQ0EsdUNBQUEsQ0FDQSx1Q0FBQSxDQUNBLHVDQUFBLENBQ0EsdUNBQUEsQ0FDQSx1Q0FBQSxDQUVBLGFBQUEsQ0FDQSxlQUFBLENBQ0EsaUJBQUEsQ0FHQSxVQUNFLHVCQUFBLENBQ0EsK0JBQUEsQ0FDQSw0QkFBQSxDQUNBLDZFQUFBLENBRUEsd0hBQUEsQ0FDQSxrQ0FBQSxDQUNBLGdFQUFBLENBQ0Esb0JBQUEsQ0FFQSw2QkFDRSxTQUFBLENBQ0EsVUFBQSxDQUdGLG1DQUNFLHdCQUFBLENBR0YsbUNBQ0UsZ0NBQUEsQ0FHRix5Q0FDRSxzQ0FBQSxDQU9BLDhGQUNFLFlBQUEsQ0FLTixjQUNFLFdBQUEsQ0FDQSxXQUFBLENBQ0EsY0FBQSxDQUNBLHFCQUFBLENBR0YsbUJBQ0Us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 */ \ No newline at end of file diff --git a/dist/data-grid.min.css.map b/dist/data-grid.min.css.map index c838695..06c9cc4 100644 --- a/dist/data-grid.min.css.map +++ b/dist/data-grid.min.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../scss/_core.scss","../scss/_rtl.scss","../scss/_menu.scss","../scss/_actions.scss","../scss/_resizer.scss","../scss/_responsive.scss"],"names":[],"mappings":"AAKA,wBACE,GACE,UAGF,KACE,YAIJ,UACE,kBACA,qBACA,oBACA,4BACA,yCACA,iDACA,+BAEA,2BACA,iDACA,wCACA,+CACA,sDACA,6CACA,0BACA,oDACA,sCACA,4CACA,gBACA,yBACA,4BACA,wBAEA,+BACA,+BACA,gCACA,0CACA,wCACA,wCACA,wCACA,wCACA,wCACA,wCACA,wCACA,wCACA,wCAEA,cACA,gBACA,kBAGA,UACE,wBACA,gCACA,6BACA,8EAEA,yHACA,mCACA,iEACA,qBAEA,6BACE,UACA,WAGF,mCACE,yBAGF,mCACE,iCAGF,yCACE,uCAOA,8FACE,aAKN,cACE,YACA,YACA,eACA,sBAGF,mBACE,aAGF,gBACE,cAGA,mBACA,WACA,eACA,mBAEA,oCAGF,gCAEE,0CACA,0BAME,gGAEE,gBAIJ,2BACE,4BACA,kCACA,6BACA,uBACA,oBAIA,yCACE,aAKN,aACE,kBAGF,0BAEE,iBACA,0CACA,gBAEA,8CACE,aACA,kBAIJ,aACE,iBACA,iDAIF,0BAEE,kBACA,gBACA,gBAEA,uBACA,mBAGA,0CACE,mBACA,qBAKJ,yBACE,eAEA,wCACE,mBACA,qBAIJ,6BACE,SACA,kBACA,MACA,OACA,WACA,YACA,eACA,aACA,mBACA,uBAOA,4DAEE,UACA,gBACA,SACA,SAIF,8BACE,uBAGF,8BACE,qBAKJ,+CAEE,WACA,YACA,sBACA,kBACA,cACA,QACA,SACA,4DAEA,wHAEE,WACA,cACA,sBACA,kBAIJ,+BACE,QACA,YACA,mCACA,sCACA,sBACA,QACA,SAIA,gCACE,UACA,YACA,wBACA,QACA,UAGF,+BACE,QACA,YACA,mCACA,sCACA,sBACA,QACA,SAIJ,qBACE,0BAIF,iBACE,uCACA,yCACA,mCACA,wBACA,YACA,eACA,gBACA,mBACA,kBACA,eAEA,uBACE,WAGF,gCACE,yBACA,qBAKJ,+BACE,SAGF,sDAEE,iDACA,mBACA,sBACA,sDACA,mCACA,YACA,eACA,yBACA,eAMA,yFACE,kEACA,UAGF,uMAEE,YACA,oBAKJ,mCACE,kBACA,+BAEA,qCACE,WACA,gBACA,SAIA,+CACE,8CAMN,mCACE,UACA,SAGF,qCACE,WACA,yBACA,SACA,gBACA,SACA,gBACA,YAEA,2CACE,8CAMF,yBACE,YACA,kBAEA,gCACE,kBACA,QACA,SACA,yBACA,gCACA,WACA,iBACA,kBACA,mBACA,uBACA,gBACA,UAKF,kCACE,YACA,YAKF,0CACE,cACA,yBACA,yBAGF,0CACE,YAEA,iDACE,eACA,SACA,0BAGF,+DACE,aAOF,uDACE,SACA,+BAOR,mBAKE,gDAJA,mCACE,qDAKF,yBACE,mDAGF,yBACE,mDACA,sDACA,aAKJ,gBACE,gBAEA,mBACE,iDAGF,6BACE,aACA,mBACA,gBAGF,+BACE,WAGF,2BACE,aACA,mBACA,mBACA,8BAGF,+BACE,aACA,kBAEA,sCAEE,kBACA,WAIJ,yBAEE,gBACA,iBAIA,2CACE,aAGF,iDACE,aAMN,sBACE,eACA,qBAGF,iJAIE,YACA,sBACA,2BACA,YACA,SACA,QACA,kBACA,2BACA,oBACA,qBAIA,kCACE,iCACA,YACA,sBAGF,iCACE,8BACA,YACA,yBACA,SAIJ,uCACE,sCACA,YAGF,uCACE,mCACA,YACA,yBACA,SAIJ,+BACE,gCACA,2BACA,iDACA,yCACA,4CACA,gDAGE,wDACE,qDC5jBF,4CAEE,iBAEF,+BACE,kBACA,oBAEF,qLAIE,YACA,WAEF,kCACE,gBCjBJ,mBACE,kBACA,UACA,0BACA,gBACA,gBACA,SACA,uBACA,oCACA,mCAEA,sBACE,SACA,UAEF,yBACE,aACA,mBACA,oBAEF,yBACE,kBCrBJ,sBACE,sBACA,YACA,iBACA,8BAEA,6BACE,SAEA,oCACE,kBAGJ,yCACE,aACA,uCAEF,mCACE,WAGF,0CACE,yBAEF,6CACE,aAEA,+DACE,qBAGJ,wCACE,kBACA,QACA,aACA,mBACA,yBACA,WACA,YAEF,wDACE,WAEA,+DACE,qBAIN,2BACE,eAEA,oCACE,wCCpDJ,sBACE,kBACA,MACA,QACA,UACA,UACA,kBACA,iBAEA,6BACE,WACA,cACA,kBACA,4BACA,cACA,QACA,UACA,6BACA,WAEF,mCACE,WAEF,wCACE,qCAEA,+CACE,WC3BN,gCACE,UACA,kBAEF,sCACE,UAEF,+BACE,kBACA,SAEA,oEAEE,mBAGF,kCACE,cAMN,0CAGI,kCACE,aAIF,+BACE,aAEF,qCACE,aAIF,6KAME,cAIF,4BACE,aASA,iDAPA,+BACE,YAEF,+BACE,WAQF,+BACE,UACA,0CAEF,+BACE,YACA,gDACA,kBACA,qEAEA,0CACE,SAEF,sCACE,kBACA,MACA,OACA,uBACA,8DACA,wBACA,cACA,iBACA,0CAEF,8CACE,6EAMN,qCACE,YACA,mBAIA,2FAEE,UAEF,6CACE,YAEF,wCACE,gBACA,WAEF,4CACE,YAEF,oCACE,qBACA,cAGJ,yCACE,yBAGA,yCACE,UACA,8DAEA,wEACE,gCAGJ,yCACE,yBACA,mBACA,UACA,uEAGJ,kFACE,cAEF,wDACE,yBAEF,sEACE,yBAGF,yCACE,iBAKF,mDACE","file":"data-grid.min.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../scss/_core.scss","../scss/_rtl.scss","../scss/_menu.scss","../scss/_actions.scss","../scss/_resizer.scss","../scss/_responsive.scss"],"names":[],"mappings":"AAKA,wBACE,GACE,UAGF,KACE,YAIJ,UACE,kBACA,qBACA,oBACA,4BACA,yCACA,iDACA,+BAEA,2BACA,4CACA,0CACA,iDACA,wCACA,+CACA,sDACA,6CACA,0BACA,oDACA,sCACA,4CACA,gBACA,yBACA,4BACA,wBAEA,+BACA,+BACA,gCACA,0CACA,wCACA,wCACA,wCACA,wCACA,wCACA,wCACA,wCACA,wCACA,wCAEA,cACA,gBACA,kBAGA,UACE,wBACA,gCACA,6BACA,8EAEA,yHACA,mCACA,iEACA,qBAEA,6BACE,UACA,WAGF,mCACE,yBAGF,mCACE,iCAGF,yCACE,uCAOA,8FACE,aAKN,cACE,YACA,YACA,eACA,sBAGF,mBACE,aAGF,gBACE,cAGA,mBACA,WACA,eACA,mBAEA,kCAGF,gCAEE,0CACA,0BAME,gGAEE,gBAIJ,2BACE,4BACA,kCACA,6BACA,uBACA,oBAIA,yCACE,aAKN,aACE,kBAGF,0BAEE,iBACA,0CACA,gBAEA,8CACE,aACA,kBAIJ,aACE,iBACA,iDAIF,0BAEE,kBACA,gBACA,gBAEA,uBACA,mBAGA,0CACE,mBACA,qBAKJ,yBACE,eAEA,wCACE,mBACA,qBAIJ,6BACE,SACA,kBACA,MACA,OACA,WACA,YACA,eACA,aACA,mBACA,uBAOA,4DAEE,UACA,gBACA,SACA,SAIF,8BACE,uBAGF,8BACE,qBAKJ,+CAEE,WACA,YACA,sBACA,kBACA,cACA,QACA,SACA,4DAEA,wHAEE,WACA,cACA,sBACA,kBAIJ,+BACE,QACA,YACA,mCACA,sCACA,sBACA,QACA,SAIA,gCACE,UACA,YACA,wBACA,QACA,UAGF,+BACE,QACA,YACA,mCACA,sCACA,sBACA,QACA,SAIJ,qBACE,0BAIF,iBACE,uCACA,yCACA,mCACA,wBACA,YACA,eACA,gBACA,mBACA,kBACA,eAEA,uBACE,WAGF,gCACE,yBACA,qBAKJ,+BACE,SAGF,sDAEE,iDACA,mBACA,sBACA,sDACA,mCACA,YACA,eACA,yBACA,eAMA,yFACE,kEACA,UAGF,uMAEE,YACA,oBAKJ,mCACE,kBACA,+BAEA,qCACE,WACA,gBACA,SAIA,+CACE,8CAMN,mCACE,UACA,SAGF,qCACE,WACA,yBACA,SACA,gBACA,SACA,gBACA,YAEA,2CACE,8CAMF,yBACE,YACA,kBAEA,gCACE,kBACA,QACA,SACA,yBACA,gCACA,WACA,iBACA,kBACA,mBACA,uBACA,gBACA,UAKF,kCACE,YACA,YAKF,0CACE,cACA,yBACA,yBAGF,0CACE,YAEA,iDACE,eACA,SACA,0BAGF,+DACE,aAOF,uDACE,SACA,+BAOR,mBAKE,gDAJA,mCACE,2CAKF,yBACE,mDAGF,yBACE,mDACA,sDACA,aAKJ,gBACE,gBAEA,mBACE,iDAGF,6BACE,aACA,mBACA,gBAGF,+BACE,WAGF,2BACE,aACA,mBACA,mBACA,8BAGF,+BACE,aACA,kBAEA,sCAEE,kBACA,WAIJ,yBAEE,gBACA,iBAIA,2CACE,aAGF,iDACE,aAMN,sBACE,eACA,qBAGF,iJAIE,YACA,sBACA,2BACA,YACA,SACA,QACA,kBACA,2BACA,oBACA,qBAIA,kCACE,iCACA,YACA,sBAGF,iCACE,8BACA,YACA,yBACA,SAIJ,uCACE,sCACA,YAGF,uCACE,mCACA,YACA,yBACA,SAIJ,+BACE,gCACA,2BACA,2BACA,8BACA,iDACA,yCACA,4CACA,gDC5jBE,4CAEE,iBAEF,+BACE,kBACA,oBAEF,qLAIE,YACA,WAEF,kCACE,gBCjBJ,mBACE,kBACA,UACA,0BACA,gBACA,gBACA,SACA,uBACA,oCACA,mCAEA,sBACE,SACA,UAEF,yBACE,aACA,mBACA,oBAEF,yBACE,kBCrBJ,sBACE,sBACA,YACA,iBACA,8BAEA,6BACE,SAEA,oCACE,kBAGJ,yCACE,aACA,uCAEF,mCACE,WAGF,0CACE,yBAEF,6CACE,aAEA,+DACE,qBAGJ,wCACE,kBACA,QACA,aACA,mBACA,yBACA,WACA,YAEF,wDACE,WAEA,+DACE,qBAIN,2BACE,eAEA,oCACE,wCCpDJ,sBACE,kBACA,MACA,QACA,UACA,UACA,kBACA,iBAEA,6BACE,WACA,cACA,kBACA,4BACA,cACA,QACA,UACA,6BACA,WAEF,mCACE,WAEF,wCACE,qCAEA,+CACE,WC3BN,gCACE,UACA,kBAEF,sCACE,UAEF,+BACE,kBACA,SAEA,oEAEE,mBAGF,kCACE,cAMN,0CAGI,kCACE,aAIF,+BACE,aAEF,qCACE,aAIF,6KAME,cAIF,4BACE,aASA,iDAPA,+BACE,YAEF,+BACE,WAQF,+BACE,UACA,0CAEF,+BACE,YACA,gDACA,kBACA,qEAEA,0CACE,SAEF,sCACE,kBACA,MACA,OACA,uBACA,8DACA,wBACA,cACA,iBACA,0CAEF,8CACE,6EAMN,qCACE,YACA,mBAIA,2FAEE,UAEF,6CACE,YAEF,wCACE,gBACA,WAEF,4CACE,YAEF,oCACE,qBACA,cAGJ,yCACE,yBAGA,yCACE,UACA,8DAEA,wEACE,gCAGJ,yCACE,yBACA,mBACA,UACA,uEAGJ,kFACE,cAEF,wDACE,yBAEF,sEACE,yBAGF,yCACE,iBAKF,mDACE","file":"data-grid.min.css"} \ No newline at end of file diff --git a/dist/data-grid.min.js b/dist/data-grid.min.js index 99c05c3..21b01b7 100644 --- a/dist/data-grid.min.js +++ b/dist/data-grid.min.js @@ -1,4 +1,4 @@ -function W(n){return n.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g,(t,e)=>e.toUpperCase())}function V(n){if(n==="true")return!0;if(n==="false")return!1;if(n===""||n==="null")return null;if(n===Number(n).toString())return Number(n);if(n&&["[","{"].includes(n.substring(0,1)))try{let t=n;return t.indexOf('"')===-1&&(t=t.replace(/'/g,'"')),JSON.parse(decodeURIComponent(t))}catch{return console.error(`Failed to parse ${n}`),{}}return n}var Ot=["scroll","wheel","touchstart","touchmove","touchenter","touchend","touchleave","mouseout","mouseleave","mouseup","mousedown","mousemove","mouseenter","mousewheel","mouseover"];function mt(n){return Ot.includes(n)?{passive:!0}:{}}function $(n,t){return n.getAttribute(t)}function U(n,t){return n.hasAttribute(t)}function c(n,t,e="",i=!1){i&&U(n,t)||n.setAttribute(t,`${e}`)}function L(n,t){U(n,t)&&n.removeAttribute(t)}function A(n,t,e){n.addEventListener(t,e,mt(t))}function O(n,t,e){n.removeEventListener(t,e,mt(t))}function y(n,t,e={},i=!1){let o={};i&&(o.bubbles=!0),e&&(o.detail=e),n.dispatchEvent(new CustomEvent(t,o))}function T(n,t){return n.classList.contains(t)}function E(n,t){n.classList.add(...t.split(" "))}function F(n,t){n.classList.remove(...t.split(" "))}function bt(n,t){n.classList.toggle(t)}function I(n,t=document){return n instanceof HTMLElement?n:t.querySelector(n)}function zt(n,t=document){return Array.from(t.querySelectorAll(n))}function N(n,t){return I(t,n)}function g(n,t){return zt(t,n)}function x(n,t=null){let e=document.createElement(n);return t&&t.appendChild(e),e}function vt(n,t){t.parentNode.insertBefore(n,t.nextSibling)}var Y=class extends HTMLElement{constructor(t={}){super(),this.options=Object.assign({},this.defaultOptions,this.normalizedDataset,t),this.log("constructor"),this.fireEvents=!0,this._ready(),this.log("ready")}get defaultOptions(){return{}}getOption(t){return this.options[t]}setOption(t,e){c(this,`data-${t}`,e)}toggleOption(t){c(this,`data-${t}`,!this.getOption(t))}get normalizedDataset(){let t=this.dataset.config?JSON.parse(this.dataset.config):{},e={...this.dataset};for(let i in e)i!=="config"&&(e[i]=V(e[i]));return Object.assign(e,t),e}static template(){return""}_ready(){}log(t){this.options.debug&&console.log(`[${$(this,"id")}] ${t}`)}handleEvent(t){this[`on${t.type}`]&&this[`on${t.type}`](t)}_connected(){}connectedCallback(){setTimeout(()=>{this.log("connectedCallback");let t=document.createElement("template");t.innerHTML=this.constructor.template(),this.appendChild(t.content.cloneNode(!0)),this._connected(),y(this,"connected")},0)}_disconnected(){}disconnectedCallback(){this.log("disconnectedCallback"),this._disconnected(),y(this,"disconnected")}get transformAttributes(){return{}}attributeChangedCallback(t,e,i){if(e===i)return;this.log(`attributeChangedCallback: ${t}`);let o=!1,r=this.transformAttributes[t]??V,s=t;s.indexOf("data-")===0&&(s=s.slice(5),o=!0),s=W(s),o?this.options[s]=r(i):this[s]=r(i),this.fireEvents&&this[`${s}Changed`]&&this[`${s}Changed`]()}},yt=Y;function J(n,t,e,i=!1){let o=document.createElement("option");o.value=`${t}`,i&&(o.selected=!0),o.label=e,n.appendChild(o)}function Z(n,t={}){for(let e of Object.keys(t))if(Array.isArray(t[e]))for(let i of Object.keys(t[e]))n.searchParams.append(isNaN(i)?`${e}[${i}]`:e,t[e][i]);else n.searchParams.append(e,t[e])}function X(n){if(typeof n=="string"){if(n[0]==="["){let t=n;return t.indexOf('"')===-1&&(t=t.replace(/'/g,'"')),JSON.parse(t)}return n.split(",")}return Array.isArray(n)?n:(console.error("Invalid array",n),[])}function Q(n){let t=n.getBoundingClientRect(),e=window.pageXOffset||document.documentElement.scrollLeft,i=window.pageYOffset||document.documentElement.scrollTop;return{top:t.top+i,left:t.left+e}}function M(n,t){return n.replace(/\{([^}]+)?\}/g,(e,i)=>t[i])}var tt;function _(n,t=document.body,e=!1){let i=window.getComputedStyle(t||document.createElement("div")),o=i.getPropertyValue("font-weight")||"normal",r=i.getPropertyValue("font-size")||"1rem",s=i.getPropertyValue("font-family")||"Arial",l=0;if(e){let u=i.getPropertyValue("padding-left")||"0",h=i.getPropertyValue("padding-right")||"0";l=Number.parseInt(u)+Number.parseInt(h)}tt||(tt=document.createElement("canvas"));let a=tt.getContext("2d");a.font=`${o} ${r} ${s}`;let d=a.measureText(n);return Number.parseInt(d.width)+l}function G(n){return Math.random().toString(36).replace("0.",n||"")}function q(n,t=300){let e=null;return(...i)=>{clearTimeout(e),e=setTimeout(()=>{e=null,n(...i)},t)}}var B={},C={itemsPerPage:"Items per page",gotoPage:"Go to page",gotoFirstPage:"Go to first page",gotoPrevPage:"Go to previous page",gotoNextPage:"Go to next page",gotoLastPage:"Go to last page",of:"of",items:"items",resizeColumn:"Resize column",noData:"No data",areYouSure:"Are you sure?",networkError:"Network response error"};function xt(n,t){t.width&&c(n,"width",t.width),t.class&&E(n,t.class),t.hidden&&(c(n,"hidden",""),t.responsiveHidden&&E(n,"dg-responsive-hidden"))}var et=class n extends yt{_filterSelector="[id^=dg-filter]";_excludedKeys=[37,39,38,40,45,36,35,33,34,27,20,16,17,91,92,18,93,144,231,"ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Insert","Home","End","PageUp","PageDown","Escape","CapsLock","Shift","Control","Meta","Alt","ContextMenu","NumLock","Unidentified"];_ready(){c(this,"id",this.options.id??G("el-"),!0),this.data=[],this.originalData,this.options=this.options||this.defaultOptions,this.fireEvents=!1,this.page=this.options.defaultPage||1,this.pages=0,this.meta,this.plugins={};for(let[t,e]of Object.entries(B))this.plugins[t]=new e(this);for(let t of n.observedAttributes)t.indexOf("data-")===0&&c(this,t,this.options[W(t.slice(5))])}static template(){return` +function W(n){return n.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g,(t,e)=>e.toUpperCase())}function V(n){if(n==="true")return!0;if(n==="false")return!1;if(n===""||n==="null")return null;if(n===Number(n).toString())return Number(n);if(n&&["[","{"].includes(n.substring(0,1)))try{let t=n;return t.indexOf('"')===-1&&(t=t.replace(/'/g,'"')),JSON.parse(decodeURIComponent(t))}catch{return console.error(`Failed to parse ${n}`),{}}return n}var Ot=["scroll","wheel","touchstart","touchmove","touchenter","touchend","touchleave","mouseout","mouseleave","mouseup","mousedown","mousemove","mouseenter","mousewheel","mouseover"];function mt(n){return Ot.includes(n)?{passive:!0}:{}}function $(n,t){return n.getAttribute(t)}function U(n,t){return n.hasAttribute(t)}function c(n,t,e="",i=!1){i&&U(n,t)||n.setAttribute(t,`${e}`)}function L(n,t){U(n,t)&&n.removeAttribute(t)}function A(n,t,e){n.addEventListener(t,e,mt(t))}function O(n,t,e){n.removeEventListener(t,e,mt(t))}function y(n,t,e={},i=!1){let o={};i&&(o.bubbles=!0),e&&(o.detail=e),n.dispatchEvent(new CustomEvent(t,o))}function T(n,t){return n.classList.contains(t)}function E(n,t){n.classList.add(...t.split(" "))}function F(n,t){n.classList.remove(...t.split(" "))}function bt(n,t){n.classList.toggle(t)}function I(n,t=document){return n instanceof HTMLElement?n:t.querySelector(n)}function zt(n,t=document){return Array.from(t.querySelectorAll(n))}function N(n,t){return I(t,n)}function g(n,t){return zt(t,n)}function x(n,t=null){let e=document.createElement(n);return t&&t.appendChild(e),e}function vt(n,t){t.parentNode.insertBefore(n,t.nextSibling)}var Y=class extends HTMLElement{constructor(t={}){super(),this.options=Object.assign({},this.defaultOptions,this.normalizedDataset,t),this.log("constructor"),this.setup=!1,this.fireEvents=!0,this._ready(),this.log("ready")}get defaultOptions(){return{}}getOption(t){return this.options[t]}setOption(t,e){c(this,`data-${t}`,e)}toggleOption(t){c(this,`data-${t}`,!this.getOption(t))}get normalizedDataset(){let t=this.dataset.config?JSON.parse(this.dataset.config):{},e={...this.dataset};for(let i in e)i!=="config"&&(e[i]=V(e[i]));return Object.assign(e,t),e}static template(){return""}_ready(){}log(t){this.options.debug&&console.log(`[${$(this,"id")}] ${t}`)}handleEvent(t){this[`on${t.type}`]&&this[`on${t.type}`](t)}_connected(){}connectedCallback(){this.setup||(this.setup=!0,setTimeout(()=>{this.log("connectedCallback");let t=document.createElement("template");t.innerHTML=this.constructor.template(),this.appendChild(t.content.cloneNode(!0)),this._connected(),y(this,"connected")},0))}_disconnected(){}disconnectedCallback(){setTimeout(()=>{!this.isConnected&&this.setup&&(this.log("disconnectedCallback"),this._disconnected(),y(this,"disconnected"),this.setup=!1)},0)}get transformAttributes(){return{}}attributeChangedCallback(t,e,i){if(e===i)return;this.log(`attributeChangedCallback: ${t}`);let o=!1,r=this.transformAttributes[t]??V,s=t;s.indexOf("data-")===0&&(s=s.slice(5),o=!0),s=W(s),o?this.options[s]=r(i):this[s]=r(i),this.fireEvents&&this[`${s}Changed`]&&this[`${s}Changed`]()}},yt=Y;function J(n,t,e,i=!1){let o=document.createElement("option");o.value=`${t}`,i&&(o.selected=!0),o.label=e,n.appendChild(o)}function Z(n,t={}){for(let e of Object.keys(t))if(Array.isArray(t[e]))for(let i of Object.keys(t[e]))n.searchParams.append(isNaN(i)?`${e}[${i}]`:e,t[e][i]);else n.searchParams.append(e,t[e])}function X(n){if(typeof n=="string"){if(n[0]==="["){let t=n;return t.indexOf('"')===-1&&(t=t.replace(/'/g,'"')),JSON.parse(t)}return n.split(",")}return Array.isArray(n)?n:(console.error("Invalid array",n),[])}function Q(n){let t=n.getBoundingClientRect(),e=window.pageXOffset||document.documentElement.scrollLeft,i=window.pageYOffset||document.documentElement.scrollTop;return{top:t.top+i,left:t.left+e}}function M(n,t){return n.replace(/\{([^}]+)?\}/g,(e,i)=>t[i])}var tt;function _(n,t=document.body,e=!1){let i=window.getComputedStyle(t||document.createElement("div")),o=i.getPropertyValue("font-weight")||"normal",r=i.getPropertyValue("font-size")||"1rem",s=i.getPropertyValue("font-family")||"Arial",l=0;if(e){let u=i.getPropertyValue("padding-left")||"0",h=i.getPropertyValue("padding-right")||"0";l=Number.parseInt(u)+Number.parseInt(h)}tt||(tt=document.createElement("canvas"));let a=tt.getContext("2d");a.font=`${o} ${r} ${s}`;let d=a.measureText(n);return Number.parseInt(d.width)+l}function G(n){return Math.random().toString(36).replace("0.",n||"")}function q(n,t=300){let e=null;return(...i)=>{clearTimeout(e),e=setTimeout(()=>{e=null,n(...i)},t)}}var B={},C={itemsPerPage:"Items per page",gotoPage:"Go to page",gotoFirstPage:"Go to first page",gotoPrevPage:"Go to previous page",gotoNextPage:"Go to next page",gotoLastPage:"Go to last page",of:"of",items:"items",resizeColumn:"Resize column",noData:"No data",areYouSure:"Are you sure?",networkError:"Network response error"};function xt(n,t){t.width&&c(n,"width",t.width),t.class&&E(n,t.class),t.hidden&&(c(n,"hidden",""),t.responsiveHidden&&E(n,"dg-responsive-hidden"))}var et=class n extends yt{_filterSelector="[id^=dg-filter]";_excludedKeys=[37,39,38,40,45,36,35,33,34,27,20,16,17,91,92,18,93,144,231,"ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Insert","Home","End","PageUp","PageDown","Escape","CapsLock","Shift","Control","Meta","Alt","ContextMenu","NumLock","Unidentified"];_ready(){c(this,"id",this.options.id??G("el-"),!0),this.data=[],this.originalData,this.options=this.options||this.defaultOptions,this.fireEvents=!1,this.page=this.options.defaultPage||1,this.pages=0,this.meta,this.plugins={};for(let[t,e]of Object.entries(B))this.plugins[t]=new e(this);for(let t of n.observedAttributes)t.indexOf("data-")===0&&c(this,t,this.options[W(t.slice(5))])}static template(){return` diff --git a/dist/data-grid.min.js.map b/dist/data-grid.min.js.map index 661f49c..87a5a49 100644 --- a/dist/data-grid.min.js.map +++ b/dist/data-grid.min.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/utils/camelize.js", "../src/utils/normalizeData.js", "../src/utils/shortcuts.js", "../src/core/base-element.js", "../src/utils/addSelectOption.js", "../src/utils/appendParamsToUrl.js", "../src/utils/convertArray.js", "../src/utils/elementOffset.js", "../src/utils/interpolate.js", "../src/utils/getTextWidth.js", "../src/utils/randstr.js", "../src/utils/debounce.js", "../src/data-grid.js", "../src/core/base-plugin.js", "../src/plugins/column-resizer.js", "../src/utils/getParentElement.js", "../src/plugins/context-menu.js", "../src/plugins/draggable-headers.js", "../src/plugins/touch-support.js", "../src/plugins/selectable-rows.js", "../src/plugins/fixed-height.js", "../src/plugins/autosize-column.js", "../src/plugins/responsive-grid.js", "../src/plugins/row-actions.js", "../src/plugins/editable-column.js", "../src/plugins/spinner-support.js", "../src/plugins/save-state.js", "../data-grid.js"], - "sourcesContent": ["/**\n * @param {String} str\n * @returns {String}\n */\nexport default function camelize(str) {\n return str.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, (m, chr) => chr.toUpperCase());\n}\n", "/**\n * Parse data attribute and return properly typed data\n * @param {String} v\n * @returns {any}\n */\nexport default function normalizeData(v) {\n // Bool\n if (v === \"true\") {\n return true;\n }\n if (v === \"false\") {\n return false;\n }\n // Null or empty\n if (v === \"\" || v === \"null\") {\n return null;\n }\n // Numeric attributes\n if (v === Number(v).toString()) {\n return Number(v);\n }\n // Only attempt json parsing for array or objects\n if (v && [\"[\", \"{\"].includes(v.substring(0, 1))) {\n try {\n // In case we have only single quoted values, like ['one', 'two', 'three']\n let val = v;\n if (val.indexOf('\"') === -1) {\n val = val.replace(/'/g, '\"');\n }\n return JSON.parse(decodeURIComponent(val));\n } catch {\n console.error(`Failed to parse ${v}`);\n return {};\n }\n }\n return v;\n}\n", "/**\n * @typedef FlexibleHTMLProps\n * @property {boolean} [checked] (HTMLInputElement)\n * @property {string} [value] (HTMLInputElement)\n * @property {number} [rowHeight] (HTMLTableRowElement)\n *\n * A flexible type HTMLElement type that does not require using instanceof all over the place\n * Make sure that your selector is indeed valid\n * Only includes most commons props\n * @typedef {HTMLElement & FlexibleHTMLProps} FlexibleHTMLElement\n */\n\n/**\n * Keep this as reference for easy documentation\n * @typedef {HTMLElement&HTMLInputElement&HTMLTableRowElement} MixedHTMLElement\n */\n\n/**\n * @typedef FlexibleEventProps\n * @property {FlexibleHTMLElement} target\n * @property {FlexibleHTMLElement} currentTarget\n * @property {DataTransfer} [dataTransfer] (DragEvent)\n * @property {number} [clientX] (MouseEvent)\n * @property {number} [clientY] (MouseEvent)\n *\n * @typedef {Event & FlexibleEventProps} FlexibleEvent\n */\n\n/**\n * Keep this as reference for easy documentation\n * @typedef {Event&MouseEvent&InputEvent&DragEvent&FocusEvent&KeyboardEvent&PointerEvent} MixedEvent\n */\n\n/**\n * @callback FlexibleListener\n * @param {FlexibleEvent} event\n */\n\nclass FlexibleEventListenerObject {\n /**\n * @param {FlexibleEvent} e\n */\n handleEvent(e) {}\n}\n\nconst supportedPassiveTypes = [\n \"scroll\",\n \"wheel\",\n \"touchstart\",\n \"touchmove\",\n \"touchenter\",\n \"touchend\",\n \"touchleave\",\n \"mouseout\",\n \"mouseleave\",\n \"mouseup\",\n \"mousedown\",\n \"mousemove\",\n \"mouseenter\",\n \"mousewheel\",\n \"mouseover\",\n];\n\n/**\n * Automatically set passive options based on type\n * @param {string} type\n * @returns {AddEventListenerOptions}\n */\nfunction passiveOpts(type) {\n if (supportedPassiveTypes.includes(type)) {\n return { passive: true };\n }\n return {};\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n * @returns {any}\n */\nexport function getAttribute(el, name) {\n return el.getAttribute(name);\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n * @returns {Boolean}\n */\nexport function hasAttribute(el, name) {\n return el.hasAttribute(name);\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n * @param {any} v\n * @param {Boolean} check Prevent setting if attribute is already there\n */\nexport function setAttribute(el, name, v = \"\", check = false) {\n if (check && hasAttribute(el, name)) return;\n el.setAttribute(name, `${v}`);\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n */\nexport function removeAttribute(el, name) {\n if (hasAttribute(el, name)) {\n el.removeAttribute(name);\n }\n}\n\n/**\n * @param {EventTarget} el\n * @param {String} type\n * @param {EventListenerObject|FlexibleListener} listener\n */\nexport function on(el, type, listener) {\n el.addEventListener(type, listener, passiveOpts(type));\n}\n\n/**\n * @param {EventTarget} el\n * @param {String} type\n * @param {EventListenerObject|FlexibleListener} listener\n */\nexport function off(el, type, listener) {\n el.removeEventListener(type, listener, passiveOpts(type));\n}\n\n/**\n * @param {EventTarget} el\n * @param {String} type\n * @param {EventListenerObject|FlexibleListener} listener\n */\nexport function one(el, type, listener) {\n el.addEventListener(type, listener, {\n once: true,\n });\n}\n\n/**\n * @param {HTMLElement} el\n * @param {String} name\n * @param {any} data\n * @param {Boolean} bubbles\n */\nexport function dispatch(el, name, data = {}, bubbles = false) {\n const opts = {};\n if (bubbles) {\n opts.bubbles = true;\n }\n if (data) {\n opts.detail = data;\n }\n el.dispatchEvent(new CustomEvent(name, opts));\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n * @returns {Boolean}\n */\nexport function hasClass(el, name) {\n return el.classList.contains(name);\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n */\nexport function addClass(el, name) {\n el.classList.add(...name.split(\" \"));\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n */\nexport function removeClass(el, name) {\n el.classList.remove(...name.split(\" \"));\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n */\nexport function toggleClass(el, name) {\n el.classList.toggle(name);\n}\n\n/**\n * @param {String|HTMLElement} selector\n * @param {HTMLElement|Document} base\n * @returns {FlexibleHTMLElement|null}\n */\nexport function $(selector, base = document) {\n if (selector instanceof HTMLElement) {\n return selector;\n }\n return base.querySelector(selector);\n}\n\n/**\n * @param {String} selector\n * @param {Element|Document} base\n * @returns {Array}\n */\nexport function $$(selector, base = document) {\n return Array.from(base.querySelectorAll(selector));\n}\n\n/**\n * Easily retrieve untyped element\n * For actual type, prefer use of el.querySelector\n * @param {HTMLElement} el\n * @param {String|HTMLElement} selector\n * @returns {FlexibleHTMLElement}\n */\nexport function find(el, selector) {\n return $(selector, el);\n}\n\n/**\n * Easily retrieve untyped elements\n * For actual type, prefer use of el.querySelectorAll\n * @param {Element} el\n * @param {String} selector\n * @returns {Array}\n */\nexport function findAll(el, selector) {\n return $$(selector, el);\n}\n\n/**\n * @param {*} el\n * @returns {FlexibleHTMLElement}\n */\nexport function el(el) {\n return el;\n}\n\n/**\n * @template {keyof HTMLElementTagNameMap} K\n * @param {K} tagName\n * @param {HTMLElement} parent\n * @returns {HTMLElementTagNameMap[K]}\n */\nexport function ce(tagName, parent = null) {\n const el = document.createElement(tagName);\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n}\n\n/**\n * @param {HTMLElement} newNode\n * @param {HTMLElement} existingNode\n */\nexport function insertAfter(newNode, existingNode) {\n existingNode.parentNode.insertBefore(newNode, existingNode.nextSibling);\n}\n", "import camelize from \"../utils/camelize.js\";\nimport normalizeData from \"../utils/normalizeData.js\";\nimport { dispatch, getAttribute, setAttribute } from \"../utils/shortcuts.js\";\n\n/** @typedef {import('../data-grid').Options} Options */\n\n/**\n * Base element that does not contain any specific logic\n * related to this project but makes HTMLElemnt usable\n */\nclass BaseElement extends HTMLElement {\n /**\n * @param {Object} options\n */\n constructor(options = {}) {\n super();\n\n /** @type {Options} */\n this.options = Object.assign({}, this.defaultOptions, this.normalizedDataset, options);\n\n this.log(\"constructor\");\n\n this.fireEvents = true;\n this._ready();\n\n this.log(\"ready\");\n }\n\n get defaultOptions() {\n return {};\n }\n\n /**\n * @param {String} opt\n * @returns {any}\n */\n getOption(opt) {\n return this.options[opt];\n }\n\n /**\n * @param {String} opt\n * @param {any} v\n */\n setOption(opt, v) {\n setAttribute(this, `data-${opt}`, v);\n }\n\n /**\n * @param {String} opt\n */\n toggleOption(opt) {\n setAttribute(this, `data-${opt}`, !this.getOption(opt));\n }\n\n get normalizedDataset() {\n const jsonConfig = this.dataset.config ? JSON.parse(this.dataset.config) : {};\n const data = { ...this.dataset };\n for (const key in data) {\n if (key === \"config\") {\n continue;\n }\n data[key] = normalizeData(data[key]);\n }\n // Once normalized, merge into json config\n Object.assign(data, jsonConfig);\n return data;\n }\n\n /**\n * @returns {String}\n */\n static template() {\n return \"\";\n }\n\n /**\n * This is called at the end of constructor. Extend in subclass if needed.\n */\n _ready() {}\n\n /**\n * @param {String|Error} message\n */\n log(message) {\n if (this.options.debug) {\n console.log(`[${getAttribute(this, \"id\")}] ${message}`);\n }\n }\n\n /**\n * Handle events within the component\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#handling-events\n * @param {Event} event\n */\n handleEvent(event) {\n if (this[`on${event.type}`]) {\n this[`on${event.type}`](event);\n }\n }\n\n /**\n * This is called when connected. Extend in subclass if needed.\n */\n _connected() {}\n\n connectedCallback() {\n // ensure whenDefined callbacks run first\n setTimeout(() => {\n this.log(\"connectedCallback\");\n\n // Append only when labels had the opportunity to be set\n // Don't use shadow dom as it makes theming super hard\n const template = document.createElement(\"template\");\n // @ts-ignore\n template.innerHTML = this.constructor.template();\n this.appendChild(template.content.cloneNode(true));\n\n this._connected();\n // @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#life-cycle-events\n dispatch(this, \"connected\");\n }, 0);\n }\n\n /**\n * This is called when disconnected. Extend in subclass if needed.\n */\n _disconnected() {}\n\n disconnectedCallback() {\n this.log(\"disconnectedCallback\");\n this._disconnected();\n // @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#life-cycle-events\n dispatch(this, \"disconnected\");\n }\n\n /**\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#a-props-like-accessor\n * @returns {Object}\n */\n get transformAttributes() {\n return {};\n }\n\n /**\n * This is only meant to work with data attributes\n * This allows us to have properties that reflect automatically in the component\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#reflected-dataset-attributes\n * @param {String} attributeName\n * @param {String} oldValue\n * @param {String} newValue\n */\n attributeChangedCallback(attributeName, oldValue, newValue) {\n // It didn't change\n if (oldValue === newValue) {\n return;\n }\n\n this.log(`attributeChangedCallback: ${attributeName}`);\n\n let isOption = false;\n const transformer = this.transformAttributes[attributeName] ?? normalizeData;\n\n let attr = attributeName;\n // Data attributes are mapped to options while other attributes are mapped as properties\n if (attr.indexOf(\"data-\") === 0) {\n attr = attr.slice(5);\n isOption = true;\n }\n attr = camelize(attr);\n if (isOption) {\n this.options[attr] = transformer(newValue);\n } else {\n this[attr] = transformer(newValue);\n }\n\n // Fire internal event\n if (this.fireEvents && this[`${attr}Changed`]) {\n this[`${attr}Changed`]();\n }\n }\n}\n\nexport default BaseElement;\n", "/**\n * @param {HTMLSelectElement} el\n * @param {String} value\n * @param {String} label\n * @param {Boolean} checked\n */\nexport default function addSelectOption(el, value, label, checked = false) {\n const opt = document.createElement(\"option\");\n opt.value = `${value}`;\n if (checked) {\n opt.selected = true;\n }\n opt.label = label;\n el.appendChild(opt);\n}\n", "/**\n * @param {URL} url\n * @param {Object} params\n */\nexport default function appendParamsToUrl(url, params = {}) {\n for (const key of Object.keys(params)) {\n if (Array.isArray(params[key])) {\n for (const k of Object.keys(params[key])) {\n // @ts-ignore\n url.searchParams.append(isNaN(k) ? `${key}[${k}]` : key, params[key][k]);\n }\n } else {\n url.searchParams.append(key, params[key]);\n }\n }\n}\n", "/**\n * Force value as arrays\n * @param {String|Array} v\n * @returns {Array}\n */\nexport default function convertArray(v) {\n if (typeof v === \"string\") {\n if (v[0] === \"[\") {\n // \"['my', 'value']\" would fail as a json\n let bv = v;\n if (bv.indexOf('\"') === -1) {\n bv = bv.replace(/'/g, '\"');\n }\n return JSON.parse(bv);\n }\n\n return v.split(\",\");\n }\n if (!Array.isArray(v)) {\n console.error(\"Invalid array\", v);\n return [];\n }\n return v;\n}\n", "/**\n * @param {HTMLElement} el\n * @returns {Object}\n */\nexport default function elementOffset(el) {\n const rect = el.getBoundingClientRect();\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return { top: rect.top + scrollTop, left: rect.left + scrollLeft };\n}\n", "/**\n * Replace element within {} by their data value\n * @param {String} str\n * @param {Object} data\n * @returns {String}\n */\nexport default function interpolate(str, data) {\n return str.replace(/\\{([^}]+)?\\}/g, ($1, $2) => data[$2]);\n}\n", "let canvas;\n\n/**\n * Uses canvas.measureText to compute and return the width of the given text of given font in pixels.\n * Getting computed styles only works for dom that are added in the dom\n * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393\n * @param {String} text The text to be rendered.\n * @param {Element} el Target element (defaults to body)\n * @param {Boolean} withPadding Include padding on element\n * @returns {Number}\n */\nexport default function getTextWidth(text, el = document.body, withPadding = false) {\n const styles = window.getComputedStyle(el || document.createElement(\"div\"));\n const fontWeight = styles.getPropertyValue(\"font-weight\") || \"normal\";\n const fontSize = styles.getPropertyValue(\"font-size\") || \"1rem\";\n const fontFamily = styles.getPropertyValue(\"font-family\") || \"Arial\";\n\n let padding = 0;\n if (withPadding) {\n const paddingLeft = styles.getPropertyValue(\"padding-left\") || \"0\";\n const paddingRight = styles.getPropertyValue(\"padding-right\") || \"0\";\n padding = Number.parseInt(paddingLeft) + Number.parseInt(paddingRight);\n }\n\n // re-use canvas object for better performance\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const context = canvas.getContext(\"2d\");\n context.font = `${fontWeight} ${fontSize} ${fontFamily}`;\n const metrics = context.measureText(text);\n return Number.parseInt(metrics.width) + padding;\n}\n", "/**\n * @param {String} prefix\n * @returns {String}\n */\nexport default function randstr(prefix) {\n return Math.random()\n .toString(36)\n .replace(\"0.\", prefix || \"\");\n}\n", "/**\n * Define a function that can be happily passed to addEventListener\n * @typedef {Function & EventListenerOrEventListenerObject} ExtendedFunction\n */\n\n/**\n * @param {Function} handler\n * @param {Number} timeout\n * @returns {ExtendedFunction}\n */\nexport default function debounce(handler, timeout = 300) {\n let timer = null;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n handler(...args);\n }, timeout);\n };\n}\n", "/**\n * Data Grid Web component\n *\n * Credits for inspiration\n * @link https://github.com/riverside/zino-grid\n */\n\nimport BaseElement from \"./core/base-element.js\";\nimport addSelectOption from \"./utils/addSelectOption.js\";\nimport appendParamsToUrl from \"./utils/appendParamsToUrl.js\";\nimport camelize from \"./utils/camelize.js\";\nimport convertArray from \"./utils/convertArray.js\";\nimport elementOffset from \"./utils/elementOffset.js\";\nimport interpolate from \"./utils/interpolate.js\";\nimport getTextWidth from \"./utils/getTextWidth.js\";\nimport randstr from \"./utils/randstr.js\";\nimport debounce from \"./utils/debounce.js\";\nimport {\n $,\n $$,\n dispatch,\n find,\n findAll,\n hasClass,\n removeAttribute,\n getAttribute,\n setAttribute,\n addClass,\n toggleClass,\n on,\n ce,\n} from \"./utils/shortcuts.js\";\n\n/**\n * Column definition\n * @typedef Column\n * @property {String} field - the key in the data\n * @property {String} title - the title to display in the header (defaults to \"field\" if not set)\n * @property {Number} [width] - the width of the column (auto otherwise)\n * @property {String} [class] - class to set on the column (target body or header with th.class or td.class)\n * @property {String} [attr] - don't render the column and set a matching attribute on the row with the value of the field\n * @property {Boolean} [hidden] - hide the column\n * @property {Boolean} [noSort] - allow disabling sort for a given column\n * @property {String | Function} [format] - custom data formatting\n * @property {String} [defaultFormatValue] - default value to use for formatting\n * @property {String} [transform] - custom value transformation\n * @property {Boolean} [editable] - replace with input (EditableColumn module)\n * @property {String} [editableType] - type of input (EditableColumn module)\n * @property {Number} [responsive] - the higher the value, the sooner it will be hidden, disable with 0 (ResponsiveGrid module)\n * @property {Boolean} [responsiveHidden] - hidden through responsive module (ResponsiveGrid module)\n * @property {String} [filterType] - defines a filter field type (\"text\" or \"select\" - defaults to \"text\")\n * @property {Array} [filterList] - defines a custom array to populate a filter select field in the format of [{value: \"\", text: \"\"},...]. When defined, it overrides the default behaviour where the filter select elements are populated by the unique values from the corresponding column records.\n * @property {Object} [firstFilterOption] - defines an object for the first option element of the filter select field. defaults to {value: \"\", text: \"\"}\n */\n\n/**\n * Row action\n * @typedef Action\n * @property {String} title - the title of the button\n * @property {String} name - the name of the action\n * @property {String} class - the class for the button\n * @property {String} url - link for the action\n * @property {String} html - custom button data\n * @property {Boolean} [confirm] - needs confirmation\n * @property {Boolean} default - is the default row action\n */\n\n// Import definitions without importing the actual file\n/** @typedef {import('./plugins/autosize-column').default} AutosizeColumn */\n/** @typedef {import('./plugins/column-resizer').default} ColumnResizer */\n/** @typedef {import('./plugins/context-menu').default} ContextMenu */\n/** @typedef {import('./plugins/draggable-headers').default} DraggableHeaders */\n/** @typedef {import('./plugins/editable-column').default} EditableColumn */\n/** @typedef {import('./plugins/fixed-height').default} FixedHeight */\n/** @typedef {import('./plugins/responsive-grid').default} ResponsiveGrid */\n/** @typedef {import('./plugins/row-actions').default} RowActions */\n/** @typedef {import('./plugins/selectable-rows').default} SelectableRows */\n/** @typedef {import('./plugins/touch-support').default} TouchSupport */\n/** @typedef {import('./plugins/spinner-support').default} SpinnerSupport */\n/** @typedef {import('./plugins/save-state').default} SaveState */\n\n/**\n * These plugins are all optional\n * @typedef {Object} Plugins\n * @property {ColumnResizer} [ColumnResizer] resize handlers in the headers\n * @property {ContextMenu} [ContextMenu] menu to show/hide columns\n * @property {DraggableHeaders} [DraggableHeaders] draggable headers columns\n * @property {EditableColumn} [EditableColumn] draggable headers columns\n * @property {TouchSupport} [TouchSupport] touch swipe\n * @property {SelectableRows} [SelectableRows] create a column with checkboxes to select rows\n * @property {FixedHeight} [FixedHeight] allows having fixed height tables\n * @property {AutosizeColumn} [AutosizeColumn] compute ideal width based on column content\n * @property {ResponsiveGrid} [ResponsiveGrid] hide/show column on the fly\n * @property {RowActions} [RowActions] add action on rows\n * @property {SpinnerSupport} [SpinnerSupport] inserts a spinning icon element to indicate grid loading.\n * @property {SaveState} [SaveState] stores grid filter, sort, and paging.\n */\n\n/**\n * Parameters to pass along or receive from the server\n * @typedef ServerParams\n * @property {String} serverParams.start\n * @property {String} serverParams.length\n * @property {String} serverParams.search\n * @property {String} serverParams.sort\n * @property {String} serverParams.sortDir\n * @property {String} serverParams.dataKey\n * @property {String} serverParams.metaKey\n * @property {String} serverParams.metaTotalKey\n * @property {String} serverParams.metaFilteredKey\n * @property {String} serverParams.optionsKey\n * @property {String} serverParams.paramsKey\n */\n\n/**\n * Available data grid options, plugins included\n * @typedef Options\n * @property {?String} id Custom id for the grid\n * @property {?String} url An URL with data to display in JSON format\n * @property {Boolean} debug Log actions in DevTools console\n * @property {Boolean} filter Allows a filtering functionality\n * @property {Boolean} sort Allows a sort by column functionality\n * @property {String} defaultSort Default sort field if sorting is enabled\n * @property {Boolean} server Is a server side powered grid\n * @property {ServerParams} serverParams Describe keys passed to the server backend\n * @property {String} dir Dir\n * @property {Array} perPageValues Available per page options\n * @property {Boolean} hidePerPage Hides the page size select element\n * @property {Column[]} columns Available columns\n * @property {Number} defaultPage Starting page\n * @property {Number} perPage Number of records displayed per page (page size)\n * @property {Boolean} expand Allow cell content to spawn over multiple lines\n * @property {Action[]} actions Row actions (RowActions module)\n * @property {Boolean} collapseActions Group actions (RowActions module)\n * @property {Boolean} resizable Make columns resizable (ColumnResizer module)\n * @property {Boolean} selectable Allow selecting rows with a checkbox (SelectableRows module)\n * @property {Boolean} selectVisibleOnly Select all only selects visible rows (SelectableRows module)\n * @property {Boolean} autosize Compute column sizes based on given data (Autosize module)\n * @property {Boolean} autoheight Adjust height so that it matches table size (FixedHeight module)\n * @property {Boolean} autohidePager auto-hides the pager when number of records falls below the selected page size\n * @property {Boolean} menu Right click menu on column headers (ContextMenu module)\n * @property {Boolean} reorder Allows a column reordering functionality (DraggableHeaders module)\n * @property {Boolean} responsive Change display mode on small screens (ResponsiveGrid module)\n * @property {Boolean} responsiveToggle Show toggle column (ResponsiveGrid module)\n * @property {Boolean} filterOnEnter Toggles the ability to filter column data by pressing the Enter or Return key\n * @property {String} spinnerClass Sets a space-delimited string of css classes for a spinner (use spinner-border css class for bootstrap 5 spinner)\n * @property {Number} filterKeypressDelay Sets a keypress delay time in milliseconds before triggering filter operation.\n * @property {Boolean} saveState Enable/disable save state plugin (SaveState module)\n * @property {?String} errorMessage A generic text to be displayed in footer when error occurs.\n */\n\n/**\n * Available labels that can be translated\n * @typedef Labels\n * @property {String} itemsPerPage\n * @property {String} gotoPage\n * @property {String} gotoFirstPage\n * @property {String} gotoPrevPage\n * @property {String} gotoNextPage\n * @property {String} gotoLastPage\n * @property {String} of\n * @property {String} items\n * @property {String} resizeColumn\n * @property {String} noData\n * @property {String} areYouSure\n * @property {String} networkError\n */\n\n/**\n * List of registered plugins\n * @type {Plugins}\n */\nlet plugins = {};\n\n/**\n * @type {Labels}\n */\nlet labels = {\n itemsPerPage: \"Items per page\",\n gotoPage: \"Go to page\",\n gotoFirstPage: \"Go to first page\",\n gotoPrevPage: \"Go to previous page\",\n gotoNextPage: \"Go to next page\",\n gotoLastPage: \"Go to last page\",\n of: \"of\",\n items: \"items\",\n resizeColumn: \"Resize column\",\n noData: \"No data\",\n areYouSure: \"Are you sure?\",\n networkError: \"Network response error\",\n};\n\n/**\n * Column definition will update some props on the html element\n * @param {HTMLElement} el\n * @param {Column} column\n */\nfunction applyColumnDefinition(el, column) {\n if (column.width) {\n setAttribute(el, \"width\", column.width);\n }\n if (column.class) {\n addClass(el, column.class);\n }\n if (column.hidden) {\n setAttribute(el, \"hidden\", \"\");\n if (column.responsiveHidden) {\n addClass(el, \"dg-responsive-hidden\");\n }\n }\n}\n\n/**\n */\nclass DataGrid extends BaseElement {\n _filterSelector = \"[id^=dg-filter]\";\n _excludedKeys = [\n 37,\n 39,\n 38,\n 40,\n 45,\n 36,\n 35,\n 33,\n 34,\n 27,\n 20,\n 16,\n 17,\n 91,\n 92,\n 18,\n 93,\n 144,\n 231,\n \"ArrowLeft\",\n \"ArrowRight\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"Insert\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n \"Escape\",\n \"CapsLock\",\n \"Shift\",\n \"Control\",\n \"Meta\",\n \"Alt\",\n \"ContextMenu\",\n \"NumLock\",\n \"Unidentified\",\n ];\n\n _ready() {\n setAttribute(this, \"id\", this.options.id ?? randstr(\"el-\"), true);\n\n /**\n * The grid displays that data\n * @type {Array}\n */\n this.data = [];\n /**\n * We store the original data in this\n * @type {Array}\n */\n this.originalData; // declared uninitialized to allow data preloading before fetch.\n\n // Make the IDE happy\n /**\n * @type {Options}\n */\n this.options = this.options || this.defaultOptions;\n\n // Init values\n this.fireEvents = false;\n this.page = this.options.defaultPage || 1;\n this.pages = 0;\n this.meta; // declared uninitialized to allow data preloading before fetch.\n /**\n * @type {Plugins}\n */\n this.plugins = {};\n // Init plugins\n for (const [pluginName, pluginClass] of Object.entries(plugins)) {\n // @ts-ignore until we can set typeof import ...\n this.plugins[pluginName] = new pluginClass(this);\n }\n\n // Expose options as observed attributes in the dom\n // Do it when fireEvents is disabled to avoid firing change callbacks\n for (const attr of DataGrid.observedAttributes) {\n if (attr.indexOf(\"data-\") === 0) {\n setAttribute(this, attr, this.options[camelize(attr.slice(5))]);\n }\n }\n }\n\n static template() {\n return `\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n`;\n }\n\n /**\n * @returns {Labels}\n */\n get labels() {\n return labels;\n }\n\n /**\n * @returns {Labels}\n */\n static getLabels() {\n return labels;\n }\n\n /**\n * @param {Object} v\n */\n static setLabels(v) {\n labels = Object.assign(labels, v);\n }\n\n /**\n * @returns {Column}\n */\n get defaultColumn() {\n return {\n field: \"\",\n title: \"\",\n width: 0,\n class: \"\",\n attr: \"\",\n hidden: false,\n editable: false,\n noSort: false,\n responsive: 1,\n responsiveHidden: false,\n format: \"\",\n transform: \"\",\n filterType: \"text\",\n firstFilterOption: { value: \"\", text: \"\" },\n };\n }\n\n /**\n * @returns {Options}\n */\n get defaultOptions() {\n return {\n id: null,\n url: null,\n perPage: 10,\n debug: false,\n filter: false,\n menu: false,\n sort: false,\n server: false,\n serverParams: {\n start: \"start\",\n length: \"length\",\n search: \"search\",\n sort: \"sort\",\n sortDir: \"sortDir\",\n dataKey: \"data\",\n metaKey: \"meta\",\n metaTotalKey: \"total\",\n metaFilteredKey: \"filtered\",\n optionsKey: \"options\",\n paramsKey: \"params\",\n },\n defaultSort: \"\",\n reorder: false,\n dir: \"ltr\",\n perPageValues: [10, 25, 50, 100, 250],\n hidePerPage: false,\n columns: [],\n actions: [],\n collapseActions: false,\n selectable: false,\n selectVisibleOnly: true,\n defaultPage: 1,\n resizable: false,\n autosize: true,\n expand: false,\n autoheight: true,\n autohidePager: false,\n responsive: false,\n responsiveToggle: true,\n filterOnEnter: true,\n filterKeypressDelay: 500,\n spinnerClass: \"\",\n saveState: false,\n errorMessage: \"\",\n };\n }\n\n /**\n * Determines if the grid is initialized.\n * @returns {Boolean}\n */\n get isInit() {\n return this.classList.contains(\"dg-initialized\");\n }\n\n /**\n * Determines if data load has failed.\n * @returns {Boolean}\n */\n get hasDataError() {\n return this.classList.contains(\"dg-network-error\");\n }\n\n /**\n * @param {Plugins} list\n */\n static registerPlugins(list) {\n plugins = list;\n }\n\n /**\n * @param {String} plugin\n */\n static unregisterPlugins(plugin = null) {\n if (plugin === null) {\n plugins = {};\n } else {\n delete plugins[plugin];\n }\n }\n\n /**\n * @returns {Plugins}\n */\n static registeredPlugins() {\n return plugins;\n }\n\n /**\n * @param {Object|Array} columns\n * @returns {Column[]}\n */\n convertColumns(columns) {\n const cols = [];\n // Convert key:value objects to actual columns\n if (typeof columns === \"object\" && !Array.isArray(columns)) {\n for (const key of Object.keys(columns)) {\n const col = Object.assign({}, this.defaultColumn);\n col.title = columns[key];\n col.field = key;\n cols.push(col);\n }\n } else {\n for (const item of columns) {\n let col = Object.assign({}, this.defaultColumn);\n if (typeof item === \"string\") {\n col.title = item;\n col.field = item;\n } else if (typeof item === \"object\") {\n col = Object.assign(col, item);\n if (!col.field) {\n console.error(\"Invalid column definition\", item);\n }\n if (!col.title) {\n col.title = col.field;\n }\n } else {\n console.error(\"Column definition must be a string or an object\");\n }\n cols.push(col);\n }\n }\n return cols;\n }\n\n /**\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#reflected-dom-attributes\n * @returns {Array}\n */\n static get observedAttributes() {\n return [\n \"page\",\n \"data-filter\",\n \"data-sort\",\n \"data-debug\",\n \"data-reorder\",\n \"data-menu\",\n \"data-selectable\",\n \"data-url\",\n \"data-per-page\",\n \"data-responsive\",\n ];\n }\n\n get transformAttributes() {\n return {\n columns: (v) => this.convertColumns(convertArray(v)),\n actions: (v) => convertArray(v),\n defaultPage: (v) => Number.parseInt(v),\n perPage: (v) => Number.parseInt(v),\n };\n }\n\n /** @returns {HTMLTableSectionElement} */ //@ts-ignore\n get thead() {\n return $(\"thead\", this);\n }\n\n /** @returns {HTMLTableSectionElement} */ //@ts-ignore\n get tbody() {\n return $(\"tbody\", this);\n }\n\n /** @returns {HTMLTableSectionElement} */ //@ts-ignore\n get tfoot() {\n return $(\"tfoot\", this);\n }\n\n get page() {\n return Number.parseInt(this.getAttribute(\"page\"));\n }\n\n set page(val) {\n setAttribute(this, \"page\", this.constrainPageValue(val));\n }\n\n /**\n * Loads data and configures the grid.\n * @param {Boolean} initOnly\n */\n urlChanged(initOnly = false) {\n if (initOnly && !this.isInit) return;\n this.reconfig();\n this.loadData().then(() => {\n this.configureUi();\n });\n }\n\n /**\n * Clears columns, re-renders table, and repopulates columns to ensure consistent column widths rendering.\n */\n reconfig() {\n const cols = this.options.columns;\n this.options.columns = [];\n this.configureUi();\n this.options.columns = cols;\n }\n\n constrainPageValue(v) {\n let pv = v;\n if (this.pages < pv) {\n pv = this.pages;\n }\n if (pv < 1 || !pv) {\n pv = 1;\n }\n return pv;\n }\n\n fixPage() {\n this.pages = this.totalPages();\n this.page = this.constrainPageValue(this.page);\n\n // Show current page in input\n setAttribute(this.inputPage, \"max\", this.pages);\n this.inputPage.value = `${this.page}`;\n this.inputPage.disabled = this.pages < 2;\n }\n\n pageChanged() {\n this.reload();\n }\n\n responsiveChanged() {\n if (!this.plugins.ResponsiveGrid) {\n return;\n }\n if (this.options.responsive) {\n this.plugins.ResponsiveGrid.observe();\n } else {\n this.plugins.ResponsiveGrid.unobserve();\n }\n }\n\n menuChanged() {\n this.renderHeader();\n }\n\n /**\n * This is the callback for the select control\n */\n changePerPage() {\n this.options.perPage = Number.parseInt(this.selectPerPage.options[this.selectPerPage.selectedIndex].value);\n this.perPageChanged();\n }\n\n /**\n * This is the actual event triggered on attribute change\n */\n perPageChanged() {\n // Refresh UI\n if (\n this.options.perPage !== Number.parseInt(this.selectPerPage.options[this.selectPerPage.selectedIndex].value)\n ) {\n this.perPageValuesChanged();\n }\n // Make sure current page is still valid\n let updatePage = this.page;\n while (updatePage > 1 && this.page * this.options.perPage > this.totalRecords()) {\n updatePage--;\n }\n if (updatePage !== this.page) {\n // Triggers pageChanged, which will trigger reload\n this.page = updatePage;\n } else {\n // Simply reload current page\n this.reload(() => {\n // Preserve distance between top of page and select control if no fixed height\n if (!this.plugins.FixedHeight || !this.plugins.FixedHeight.hasFixedHeight) {\n this.selectPerPage.scrollIntoView();\n }\n });\n }\n }\n\n dirChanged() {\n setAttribute(this, \"dir\", this.options.dir);\n }\n\n defaultSortChanged() {\n this.sortChanged();\n }\n\n /**\n * Populate the select dropdown according to options\n */\n perPageValuesChanged() {\n if (!this.selectPerPage) {\n return;\n }\n while (this.selectPerPage.lastChild) {\n this.selectPerPage.removeChild(this.selectPerPage.lastChild);\n }\n for (const v of this.options.perPageValues) {\n addSelectOption(this.selectPerPage, v, v, v === this.options.perPage);\n }\n }\n\n _connected() {\n /**\n * @type {HTMLTableElement}\n */\n this.table = this.querySelector(\"table\");\n /**\n * @type {HTMLInputElement}\n */\n this.btnFirst = this.querySelector(\".dg-btn-first\");\n /**\n * @type {HTMLInputElement}\n */\n this.btnPrev = this.querySelector(\".dg-btn-prev\");\n /**\n * @type {HTMLInputElement}\n */\n this.btnNext = this.querySelector(\".dg-btn-next\");\n /**\n * @type {HTMLInputElement}\n */\n this.btnLast = this.querySelector(\".dg-btn-last\");\n /**\n * @type {HTMLSelectElement}\n */\n this.selectPerPage = this.querySelector(\".dg-select-per-page\");\n /**\n * @type {HTMLInputElement}\n */\n this.inputPage = this.querySelector(\".dg-input-page\");\n\n this.getFirst = this.getFirst.bind(this);\n this.getPrev = this.getPrev.bind(this);\n this.getNext = this.getNext.bind(this);\n this.getLast = this.getLast.bind(this);\n this.changePerPage = this.changePerPage.bind(this);\n this.gotoPage = this.gotoPage.bind(this);\n\n this.btnFirst.addEventListener(\"click\", this.getFirst);\n this.btnPrev.addEventListener(\"click\", this.getPrev);\n this.btnNext.addEventListener(\"click\", this.getNext);\n this.btnLast.addEventListener(\"click\", this.getLast);\n this.selectPerPage.addEventListener(\"change\", this.changePerPage);\n this.selectPerPage.toggleAttribute(\"hidden\", this.options.hidePerPage);\n this.inputPage.addEventListener(\"input\", this.gotoPage);\n\n for (const plugin of Object.values(this.plugins)) {\n plugin.connected();\n }\n\n // Display even if we don't have data\n this.dirChanged();\n this.perPageValuesChanged();\n\n // @ts-ignore\n this.loadData().finally(() => {\n this.configureUi();\n\n this.sortChanged();\n this.classList.add(\"dg-initialized\"); //acts as a flag to prevent unnecessary server calls down the chain.\n\n this.filterChanged();\n this.reorderChanged();\n\n this.dirChanged();\n this.perPageValuesChanged();\n this.pageChanged();\n\n this.fireEvents = true; // We can now fire attributeChangedCallback events\n\n this.log(\"initialized\");\n });\n }\n\n _disconnected() {\n this.btnFirst?.removeEventListener(\"click\", this.getFirst);\n this.btnPrev?.removeEventListener(\"click\", this.getPrev);\n this.btnNext?.removeEventListener(\"click\", this.getNext);\n this.btnLast?.removeEventListener(\"click\", this.getLast);\n this.selectPerPage?.removeEventListener(\"change\", this.changePerPage);\n this.inputPage?.removeEventListener(\"input\", this.gotoPage);\n\n for (const plugin of Object.values(this.plugins)) {\n plugin.disconnected();\n }\n }\n\n /**\n * @param {string} field\n * @returns {Column}\n */\n getCol(field) {\n let found = null;\n\n for (const col of this.options.columns) {\n if (col.field === field) {\n found = col;\n }\n }\n return found;\n }\n\n getColProp(field, prop) {\n const c = this.getCol(field);\n return c ? c[prop] : null;\n }\n\n setColProp(field, prop, val) {\n const c = this.getCol(field);\n if (c) {\n c[prop] = val;\n }\n }\n\n visibleColumns() {\n return this.options.columns.filter((col) => {\n return !col.hidden;\n });\n }\n\n hiddenColumns() {\n return this.options.columns.filter((col) => {\n return col.hidden === true;\n });\n }\n\n showColumn(field, render = true) {\n this.setColProp(field, \"hidden\", false);\n\n // We need to render the whole table otherwise layout fixed won't do its job\n if (render) this.renderTable();\n\n dispatch(this, \"columnVisibility\", {\n col: field,\n visibility: \"visible\",\n });\n }\n\n hideColumn(field, render = true) {\n this.setColProp(field, \"hidden\", true);\n\n // We need to render the whole table otherwise layout fixed won't do its job\n if (render) this.renderTable();\n\n dispatch(this, \"columnVisibility\", {\n col: field,\n visibility: \"hidden\",\n });\n }\n\n /**\n * Returns the starting index of actual data\n * @returns {Number}\n */\n startColIndex() {\n let start = 1;\n if (this.options.selectable && this.plugins.SelectableRows) {\n start++;\n }\n if (this.options.responsive && this.plugins.ResponsiveGrid && this.plugins.ResponsiveGrid.hasHiddenColumns()) {\n start++;\n }\n return start;\n }\n\n /**\n * @returns {Boolean}\n */\n isSticky() {\n return this.hasAttribute(\"sticky\");\n }\n\n /**\n * @param {Boolean} visibleOnly\n * @returns {Number}\n */\n columnsLength(visibleOnly = false) {\n let len = 0;\n // One column per (visible) column\n for (const col of this.options.columns) {\n if (visibleOnly && col.hidden) {\n continue;\n }\n if (!col.attr) {\n len++;\n }\n }\n // Add one col for selectable checkbox at the beginning\n if (this.options.selectable && this.plugins.SelectableRows) {\n len++;\n }\n // Add one col for actions at the end\n if (this.options.actions.length && this.plugins.RowActions) {\n len++;\n }\n // Add one col for the responsive toggle\n if (this.options.responsive && this.plugins.ResponsiveGrid && this.plugins.ResponsiveGrid.hasHiddenColumns()) {\n len++;\n }\n return len;\n }\n\n /**\n * Global configuration and renderTable\n * This should be called after your data has been loaded\n */\n configureUi() {\n this.table.style.visibility = \"hidden\";\n this.renderTable();\n if (this.options.responsive && this.plugins.ResponsiveGrid) {\n // Let the observer make the table visible\n } else {\n this.table.style.visibility = \"visible\";\n }\n\n // Store row height for later usage\n if (!this.rowHeight) {\n const tr = find(this, \"tbody tr\") || find(this, \"table tr\");\n if (tr) {\n this.rowHeight = tr.offsetHeight;\n }\n }\n this.fixPage();\n }\n\n filterChanged() {\n const row = this.querySelector(\"thead tr.dg-head-filters\");\n if (this.options.filter) {\n removeAttribute(row, \"hidden\");\n } else {\n this.clearFilters();\n setAttribute(row, \"hidden\", \"\");\n }\n }\n\n reorderChanged() {\n const headers = findAll(this, \"thead tr.dg-head-columns th\");\n for (const th of headers) {\n if (th.classList.contains(\"dg-selectable\") || th.classList.contains(\"dg-actions\")) {\n continue;\n }\n if (this.options.reorder && this.plugins.DraggableHeaders) {\n th.draggable = true;\n } else {\n th.removeAttribute(\"draggable\");\n }\n }\n }\n\n sortChanged() {\n this.log(\"toggle sort\");\n\n const headers = findAll(this, \"thead tr.dg-head-columns th\");\n for (const th of headers) {\n const fieldName = th.getAttribute(\"field\");\n if (\n th.classList.contains(\"dg-not-sortable\") ||\n (!this.fireEvents && fieldName === this.options.defaultSort)\n ) {\n return;\n }\n if (this.options.sort && !this.getColProp(fieldName, \"noSort\")) {\n setAttribute(th, \"aria-sort\", \"none\");\n } else {\n removeAttribute(th, \"aria-sort\");\n }\n }\n }\n\n selectableChanged() {\n this.renderTable();\n }\n\n addRow(row) {\n if (!Array.isArray(this.originalData)) {\n return;\n }\n this.log(\"add row\");\n this.originalData.push(row);\n this.data = this.originalData.slice();\n this.sortData();\n }\n\n /**\n * @param {any} value Value to remove. Defaults to last row.\n * @param {String} key The key of the item to remove. Defaults to first column\n */\n removeRow(value = null, key = null) {\n if (!Array.isArray(this.originalData)) {\n return;\n }\n\n let v = value;\n let k = key;\n if (k === null) {\n k = this.options.columns[0].field;\n }\n if (v === null) {\n v = this.originalData[this.originalData.length - 1][k];\n }\n this.log(`remove row ${k}:${v}`);\n for (let i = 0; i < this.originalData.length; i++) {\n if (this.originalData[i][k] === v) {\n this.originalData.splice(i, 1);\n break;\n }\n }\n this.data = this.originalData.slice();\n this.sortData();\n }\n\n /**\n * @param {String} key Return a specific key (eg: id) instead of the whole row\n * @returns {Array}\n */\n getSelection(key = null) {\n if (!this.plugins.SelectableRows) {\n return [];\n }\n return this.plugins.SelectableRows.getSelection(key);\n }\n\n getData() {\n return this.originalData;\n }\n\n clearData() {\n // Already empty\n if (this.data.length === 0) {\n return;\n }\n this.data = this.originalData = [];\n this.renderBody();\n }\n\n /**\n * Preloads the data intended to bypass the initial fetch operation, allowing for faster intial page load time.\n * Subsequent grid actions after initialization will operate as normal.\n * @param {Object} data - an object with meta ({total, filtered, start}) and data (array of objects) properties.\n */\n preload(data) {\n const metaKey = this.options.serverParams.metaKey;\n const dataKey = this.options.serverParams.dataKey;\n if (data?.[metaKey]) {\n this.meta = data[metaKey];\n }\n if (data?.[dataKey]) {\n this.data = this.originalData = data[dataKey];\n }\n }\n\n refresh(cb = null) {\n this.data = this.originalData = [];\n return this.reload(cb);\n }\n\n reload(cb = null) {\n this.log(\"reload\");\n\n // If the data was cleared, we need to render again\n const needRender = !this.originalData?.length;\n this.fixPage();\n // @ts-ignore\n this.loadData().finally(() => {\n if (this.hasDataError) return;\n // If we load data from the server, we redraw the table body\n // Otherwise, we just need to paginate\n this.options.server || needRender ? this.renderBody() : this.paginate();\n if (cb) {\n cb();\n }\n });\n }\n\n /**\n * @returns {Promise}\n */\n loadData() {\n const flagEmpty = () => !this.data.length && this.classList.add(\"dg-empty\");\n const tbody = this.tbody;\n\n // We already have some data\n if (this.meta || this.originalData || this.isInit) {\n // We don't use server side data\n if (!this.options.server || (this.options.server && !this.fireEvents)) {\n this.log(\"skip loadData\");\n flagEmpty();\n return new Promise((resolve) => {\n resolve();\n });\n }\n }\n this.log(\"loadData\");\n this.loading = true;\n this.classList.add(\"dg-loading\");\n this.classList.remove(\"dg-empty\", \"dg-network-error\");\n return (\n this.fetchData()\n .then((response) => {\n // We can get a straight array or an object\n if (Array.isArray(response)) {\n this.data = response;\n } else {\n // Object must contain data key\n if (!response[this.options.serverParams.dataKey]) {\n console.error(\n \"Invalid response, it should contain a data key with an array or be a plain array\",\n response,\n );\n this.options.url = null;\n return;\n }\n\n // We may have a config object\n this.options = Object.assign(\n this.options,\n response[this.options.serverParams.optionsKey] ?? {},\n );\n // It should return meta data (see metaFilteredKey)\n this.meta = response[this.options.serverParams.metaKey] ?? {};\n this.data = response[this.options.serverParams.dataKey];\n }\n this.originalData = this.data.slice();\n this.fixPage();\n\n // Make sure we have a proper set of columns\n if (this.options.columns.length === 0 && this.originalData.length) {\n this.options.columns = this.convertColumns(Object.keys(this.originalData[0]));\n } else {\n this.options.columns = this.convertColumns(this.options.columns);\n }\n })\n .catch((err) => {\n this.log(err);\n tbody.setAttribute(\n \"data-empty\",\n this.options.errorMessage ||\n err.message?.replace(/^\\s+|\\r\\n|\\n|\\r$/g, \"\") ||\n labels.networkError,\n );\n this.classList.add(\"dg-empty\", \"dg-network-error\");\n dispatch(this, \"loadDataFailed\", err);\n })\n // @ts-ignore\n .finally(() => {\n flagEmpty();\n if (!this.hasDataError && tbody.getAttribute(\"data-empty\") !== this.labels.noData) {\n tbody.setAttribute(\"data-empty\", this.labels.noData);\n }\n this.classList.remove(\"dg-loading\");\n setAttribute(this.table, \"aria-rowcount\", this.data.length);\n this.loading = false;\n })\n );\n }\n\n getFirst() {\n if (this.loading) {\n return;\n }\n this.page = 1;\n }\n\n getLast() {\n if (this.loading) {\n return;\n }\n this.page = this.pages;\n }\n\n getPrev() {\n if (this.loading) {\n return;\n }\n this.page = this.page - 1;\n }\n\n getNext() {\n if (this.loading) {\n return;\n }\n this.page = this.page + 1;\n }\n\n gotoPage(event) {\n if (event.type === \"keypress\") {\n const key = event.keyCode || event.key;\n if (key === 13 || key === \"Enter\") {\n event.preventDefault();\n } else {\n return;\n }\n }\n this.page = Number.parseInt(this.inputPage.value);\n }\n\n getSort() {\n const col = this.querySelector(\"thead tr.dg-head-columns th[aria-sort$='scending']\");\n if (col) {\n return col.getAttribute(\"field\");\n }\n return this.options.defaultSort;\n }\n\n getSortDir() {\n const col = this.querySelector(\"thead tr.dg-head-columns th[aria-sort$='scending']\");\n if (col) {\n return col.getAttribute(\"aria-sort\") || \"\";\n }\n return \"\";\n }\n\n getFilters() {\n const filters = [];\n const inputs = findAll(this, this._filterSelector);\n for (const input of inputs) {\n filters[input.dataset.name] = input.value;\n }\n return filters;\n }\n\n clearFilters() {\n const inputs = findAll(this, this._filterSelector);\n for (const input of inputs) {\n input.value = \"\";\n }\n this.filterData();\n }\n\n filterData() {\n this.log(\"filter data\");\n\n this.page = 1;\n\n if (this.options.server) {\n this.reload();\n } else {\n this.data = this.originalData?.slice() ?? [];\n\n // Look for rows matching the filters\n const inputs = findAll(this, this._filterSelector);\n for (const input of inputs) {\n const value = input.value;\n if (value) {\n const name = input.dataset.name;\n this.data = this.data.filter((item) => {\n const str = `${item[name]}`;\n return str.toLowerCase().indexOf(value.toLowerCase()) !== -1;\n });\n }\n }\n this.pageChanged();\n\n const col = this.querySelector(\"thead tr.dg-head-columns th[aria-sort$='scending']\");\n if (this.options.sort && col) {\n this.sortData();\n } else {\n this.renderBody();\n }\n }\n }\n\n /**\n * Data will be sorted then rendered using renderBody\n * @param {Element} baseCol The column that was clicked or null to use current sort\n */\n sortData(baseCol = null) {\n this.log(\"sort data\");\n\n let col = baseCol;\n\n // Early exit\n if (col && this.getColProp(col.getAttribute(\"field\"), \"noSort\")) {\n this.log(\"sorting prevented because column is not sortable\");\n return;\n }\n if (this.plugins.ColumnResizer?.isResizing) {\n this.log(\"sorting prevented because resizing\");\n return;\n }\n if (this.loading) {\n this.log(\"sorting prevented because loading\");\n return;\n }\n\n // We clicked on a column, update sort state\n if (col !== null) {\n // Remove active sort if any\n const haveClasses = (c) => [\"dg-selectable\", \"dg-actions\", \"dg-responsive-toggle\"].includes(c);\n\n const headers = findAll(this, \"thead tr:first-child th\");\n for (const th of headers) {\n // @ts-ignore\n if ([...th.classList].some(haveClasses)) {\n continue;\n }\n if (th !== col) {\n th.setAttribute(\"aria-sort\", \"none\");\n }\n }\n\n // Set tristate col\n if (!col.hasAttribute(\"aria-sort\") || col.getAttribute(\"aria-sort\") === \"none\") {\n col.setAttribute(\"aria-sort\", \"ascending\");\n } else if (col.getAttribute(\"aria-sort\") === \"ascending\") {\n col.setAttribute(\"aria-sort\", \"descending\");\n } else if (col.getAttribute(\"aria-sort\") === \"descending\") {\n col.setAttribute(\"aria-sort\", \"none\");\n }\n } else {\n // Or fetch current sort\n col = this.querySelector(\"thead tr.dg-head-columns th[aria-sort$='scending']\");\n }\n\n if (this.options.server) {\n // Reload data with updated sort\n this.loadData().finally(() => {\n this.renderBody();\n });\n } else {\n const sort = col ? col.getAttribute(\"aria-sort\") : \"none\";\n if (sort === \"none\") {\n const stack = [];\n\n // Restore order while keeping filters\n this.originalData?.some((itemA) => {\n this.data.some((itemB) => {\n if (JSON.stringify(itemA) === JSON.stringify(itemB)) {\n stack.push(itemB);\n return true;\n }\n return false;\n });\n return stack.length === this.data.length;\n });\n\n this.data = stack;\n } else {\n const field = col.getAttribute(\"field\");\n this.data.sort((a, b) => {\n if (!isNaN(a[field]) && !isNaN(b[field])) {\n return sort === \"ascending\" ? a[field] - b[field] : b[field] - a[field];\n }\n const valA = sort === \"ascending\" ? a[field].toUpperCase() : b[field].toUpperCase();\n const valB = sort === \"ascending\" ? b[field].toUpperCase() : a[field].toUpperCase();\n\n switch (true) {\n case valA > valB:\n return 1;\n case valA < valB:\n return -1;\n case valA === valB:\n return 0;\n }\n });\n }\n this.renderBody();\n }\n }\n\n _sort(columnName, sortDir) {\n const col = this.querySelector(`.dg-head-columns th[field=${columnName}]`);\n const dir = sortDir === \"ascending\" ? \"none\" : sortDir === \"descending\" ? \"ascending\" : \"descending\";\n col?.setAttribute(\"aria-sort\", dir);\n this.sortData(col);\n }\n\n sortAsc = (columnName) => this._sort(columnName, \"ascending\");\n sortDesc = (columnName) => this._sort(columnName, \"descending\");\n sortNone = (columnName) => this._sort(columnName, \"none\");\n\n fetchData() {\n if (!this.options.url) {\n return new Promise((resolve, reject) => reject(\"No url set\"));\n }\n\n let base = window.location.href;\n // Fix trailing slash if no extension is present\n if (!base.split(\"/\").pop().includes(\".\")) {\n base += base.endsWith(\"/\") ? \"\" : \"/\";\n }\n const url = new URL(this.options.url, base);\n let params = {\n r: Date.now(),\n };\n if (this.options.server) {\n // 0 based\n params[this.options.serverParams.start] = this.page - 1;\n params[this.options.serverParams.length] = this.options.perPage;\n if (this.options.filter) params[this.options.serverParams.search] = this.getFilters();\n params[this.options.serverParams.sort] = this.getSort() || \"\";\n params[this.options.serverParams.sortDir] = this.getSortDir();\n\n // extra params ?\n if (this.meta?.[this.options.serverParams.paramsKey]) {\n params = Object.assign(params, this.meta[this.options.serverParams.paramsKey]);\n }\n }\n\n appendParamsToUrl(url, params);\n\n return fetch(url).then((response) => {\n const newError = new Error(response.statusText || labels.networkError);\n if (!response.ok) {\n // @ts-ignore\n newError.response = response;\n throw newError;\n }\n return response\n .clone()\n .json()\n .catch((err) => {\n let error = err;\n if (!this.options.debug) {\n error = newError;\n }\n error.response = response;\n throw error;\n });\n });\n }\n\n renderTable() {\n this.log(\"render table\");\n\n if (this.options.menu && this.plugins.ContextMenu) {\n this.plugins.ContextMenu.createMenu();\n }\n\n let sortedColumn;\n\n this.renderHeader();\n if (this.options.defaultSort) {\n // We can have a default sort even with sort disabled\n sortedColumn = this.querySelector(`thead tr.dg-head-columns th[field=\"${this.options.defaultSort}\"]`);\n }\n\n if (sortedColumn) {\n this.sortData(sortedColumn);\n } else {\n this.renderBody();\n }\n\n this.renderFooter();\n }\n\n /**\n * Create table header\n * - One row for the column headers\n * - One row for the filters\n */\n renderHeader() {\n this.log(\"render header\");\n\n const thead = this.thead;\n this.createColumnHeaders(thead);\n this.createColumnFilters(thead);\n\n if (this.options.resizable && this.plugins.ColumnResizer) {\n this.plugins.ColumnResizer.renderResizer(labels.resizeColumn);\n }\n\n dispatch(this, \"headerRendered\");\n }\n\n renderFooter() {\n this.log(\"render footer\");\n\n const tfoot = this.tfoot;\n const td = tfoot.querySelector(\"td\");\n tfoot.removeAttribute(\"hidden\");\n setAttribute(td, \"colspan\", this.columnsLength(true));\n tfoot.style.display = \"\";\n }\n\n /**\n * Create the column headers based on column definitions and set options\n * @param {HTMLTableSectionElement} thead\n */\n createColumnHeaders(thead) {\n // @link https://stackoverflow.com/questions/21064101/understanding-offsetwidth-clientwidth-scrollwidth-and-height-respectively\n const availableWidth = this.clientWidth;\n const colMaxWidth = Math.round((availableWidth / this.columnsLength(true)) * 2);\n\n let idx = 0;\n let tr;\n\n // Create row\n tr = ce(\"tr\");\n this.headerRow = tr;\n tr.setAttribute(\"role\", \"row\");\n tr.setAttribute(\"aria-rowindex\", \"1\");\n tr.setAttribute(\"class\", \"dg-head-columns\");\n\n // We need a real th from the dom to compute the size\n let sampleTh = thead.querySelector(\"tr.dg-head-columns th\");\n if (!sampleTh) {\n sampleTh = ce(\"th\");\n thead.querySelector(\"tr\").appendChild(sampleTh);\n }\n\n if (this.options.selectable && this.plugins.SelectableRows) {\n this.plugins.SelectableRows.createHeaderCol(tr);\n }\n if (this.options.responsive && this.plugins.ResponsiveGrid && this.plugins.ResponsiveGrid.hasHiddenColumns()) {\n this.plugins.ResponsiveGrid.createHeaderCol(tr);\n }\n\n // Create columns\n idx = 0;\n let totalWidth = 0;\n\n for (const column of this.options.columns) {\n if (column.attr) {\n continue;\n }\n const colIdx = idx + this.startColIndex();\n const th = ce(\"th\");\n th.setAttribute(\"scope\", \"col\");\n th.setAttribute(\"role\", \"columnheader button\");\n th.setAttribute(\"aria-colindex\", `${colIdx}`);\n th.setAttribute(\"id\", randstr(\"dg-col-\"));\n if (this.options.sort) {\n th.setAttribute(\"aria-sort\", \"none\");\n }\n th.setAttribute(\"field\", column.field);\n if (this.plugins.ResponsiveGrid && this.options.responsive) {\n setAttribute(th, \"data-responsive\", column.responsive || \"\");\n }\n // Make sure the header fits (+ add some room for sort icon if necessary)\n const computedWidth = getTextWidth(column.title, sampleTh, true) + 20;\n th.dataset.minWidth = `${computedWidth}`;\n applyColumnDefinition(th, column);\n th.tabIndex = 0;\n th.textContent = column.title;\n\n let w = 0;\n // Autosize small based on first/last row ?\n // Take into account minWidth of the header and max available size based on col numbers\n if (this.options.autosize && this.plugins.AutosizeColumn) {\n const colAvailableWidth = Math.min(availableWidth - totalWidth, colMaxWidth);\n w = this.plugins.AutosizeColumn.computeSize(\n th,\n column,\n Number.parseInt(th.dataset.minWidth),\n colAvailableWidth,\n );\n } else {\n w = Math.max(Number.parseInt(th.dataset.minWidth), Number.parseInt(th.getAttribute(\"width\")));\n }\n\n setAttribute(th, \"width\", w);\n if (column.hidden) {\n th.setAttribute(\"hidden\", \"\");\n } else {\n totalWidth += w;\n }\n\n // Reorder columns with drag/drop\n if (this.options.reorder && this.plugins.DraggableHeaders) {\n this.plugins.DraggableHeaders.makeHeaderDraggable(th);\n }\n\n tr.appendChild(th);\n idx++;\n }\n\n // There is too much available width, and we want to avoid fixed layout to split remaining amount\n if (totalWidth < availableWidth) {\n const visibleCols = findAll(tr, \"th:not([hidden],.dg-not-resizable)\");\n if (visibleCols.length) {\n const lastCol = visibleCols[visibleCols.length - 1];\n removeAttribute(lastCol, \"width\");\n }\n }\n\n // Actions\n if (this.options.actions.length && this.plugins.RowActions) {\n this.plugins.RowActions.makeActionHeader(tr);\n }\n\n thead.replaceChild(tr, thead.querySelector(\"tr.dg-head-columns\"));\n\n // Once columns are inserted, we have an actual dom to query\n if (thead.offsetWidth > availableWidth) {\n this.log(`adjust width to fix size, ${thead.offsetWidth} > ${availableWidth}`);\n const scrollbarWidth = this.offsetWidth - this.clientWidth;\n let diff = thead.offsetWidth - availableWidth - scrollbarWidth;\n if (this.options.responsive && this.plugins.ResponsiveGrid) {\n diff += scrollbarWidth;\n }\n // Remove diff for columns that can afford it\n const thWithWidth = findAll(tr, \"th[width]\");\n\n for (const th of thWithWidth) {\n if (hasClass(th, \"dg-not-resizable\")) {\n continue;\n }\n if (diff <= 0) {\n continue;\n }\n const actualWidth = Number.parseInt(th.getAttribute(\"width\"));\n const minWidth = th.dataset.minWidth ? Number.parseInt(th.dataset.minWidth) : 0;\n if (actualWidth > minWidth) {\n let newWidth = actualWidth - diff;\n if (newWidth < minWidth) {\n newWidth = minWidth;\n }\n diff -= actualWidth - newWidth;\n setAttribute(th, \"width\", newWidth);\n }\n }\n }\n\n // Context menu\n if (this.options.menu && this.plugins.ContextMenu) {\n this.plugins.ContextMenu.attachContextMenu();\n }\n\n // Sort col on click\n const rowsWithSort = findAll(tr, \"[aria-sort]\");\n for (const sortableRow of rowsWithSort) {\n sortableRow.addEventListener(\"click\", () => this.sortData(sortableRow));\n }\n\n setAttribute(this.table, \"aria-colcount\", this.columnsLength(true));\n }\n\n createColumnFilters(thead) {\n let idx = 0;\n let tr;\n\n // Create row for filters\n tr = ce(\"tr\");\n this.filterRow = tr;\n tr.setAttribute(\"role\", \"row\");\n tr.setAttribute(\"aria-rowindex\", \"2\");\n tr.setAttribute(\"class\", \"dg-head-filters\");\n if (!this.options.filter) {\n tr.setAttribute(\"hidden\", \"\");\n }\n\n if (this.options.selectable && this.plugins.SelectableRows) {\n this.plugins.SelectableRows.createFilterCol(tr);\n }\n if (this.options.responsive && this.plugins.ResponsiveGrid && this.plugins.ResponsiveGrid.hasHiddenColumns()) {\n this.plugins.ResponsiveGrid.createFilterCol(tr);\n }\n\n for (const column of this.options.columns) {\n if (column.attr) {\n continue;\n }\n const colIdx = idx + this.startColIndex();\n const relatedTh = thead.querySelector(`tr.dg-head-columns th[aria-colindex=\"${colIdx}\"]`);\n if (!relatedTh) {\n console.warn(\"Related th not found\", colIdx);\n continue;\n }\n const th = ce(\"th\");\n th.setAttribute(\"aria-colindex\", `${colIdx}`);\n\n const filter = this.createFilterElement(column, relatedTh);\n if (!this.options.filter) {\n th.tabIndex = 0;\n } else {\n filter.tabIndex = 0;\n }\n\n if (column.hidden) {\n th.setAttribute(\"hidden\", \"\");\n }\n\n th.appendChild(filter);\n tr.appendChild(th);\n idx++;\n }\n\n // Actions\n if (this.options.actions.length && this.plugins.RowActions) {\n this.plugins.RowActions.makeActionFilter(tr);\n }\n\n thead.replaceChild(tr, thead.querySelector(\"tr.dg-head-filters\"));\n\n if (typeof this.options.filterKeypressDelay !== \"number\" || this.options.filterOnEnter)\n this.options.filterKeypressDelay = 0;\n\n // Filter content by field events\n const filteredRows = findAll(tr, this._filterSelector);\n for (const el of filteredRows) {\n const eventName = /select/i.test(el.tagName) ? \"change\" : \"keyup\";\n const eventHandler = debounce((e) => {\n const key = e.keyCode || e.key;\n const isKeyPressFilter = !this.options.filterOnEnter && !this._excludedKeys.some((k) => k === key);\n if (key === 13 || key === \"Enter\" || isKeyPressFilter || e.type === \"change\") {\n this.filterData.call(this);\n }\n }, this.options.filterKeypressDelay);\n el.addEventListener(eventName, eventHandler);\n }\n }\n\n createFilterElement(column, relatedTh) {\n const isSelect = column.filterType === \"select\";\n const filter = isSelect ? ce(\"select\") : ce(\"input\");\n if (isSelect) {\n if (!Array.isArray(column.filterList)) {\n // Gets unique values from column records\n const uniqueValues = [...new Set((this.data ?? []).map((e) => e[column.field]))]\n .filter((v) => v)\n .sort();\n column.filterList = [column.firstFilterOption || this.defaultColumn.firstFilterOption].concat(\n uniqueValues.map((e) => ({ value: e, text: e })),\n );\n }\n\n for (const e of column.filterList) {\n const opt = ce(\"option\");\n opt.value = e.value;\n opt.text = e.text;\n\n if (filter instanceof HTMLSelectElement) {\n filter.add(opt);\n }\n }\n } else {\n //@ts-ignore\n filter.type = \"text\";\n filter.inputMode = \"search\";\n filter.autocomplete = \"off\";\n filter.spellcheck = false;\n }\n // Allows binding filter to this column\n filter.dataset.name = column.field;\n filter.id = randstr(\"dg-filter-\");\n // Don't use aria-label as it triggers autocomplete\n filter.setAttribute(\"aria-labelledby\", relatedTh.getAttribute(\"id\"));\n return filter;\n }\n\n /**\n * Render the data as rows in tbody\n * It will call paginate() at the end\n */\n renderBody() {\n this.log(\"render body\");\n let tr;\n let td;\n let idx;\n const tbody = ce(\"tbody\");\n\n this.data.forEach((item, i) => {\n tr = ce(\"tr\");\n setAttribute(tr, \"role\", \"row\");\n setAttribute(tr, \"hidden\", \"\");\n setAttribute(tr, \"aria-rowindex\", i + 1);\n tr.tabIndex = 0;\n\n if (this.options.selectable && this.plugins.SelectableRows) {\n this.plugins.SelectableRows.createDataCol(tr);\n }\n if (\n this.options.responsive &&\n this.plugins.ResponsiveGrid &&\n this.plugins.ResponsiveGrid.hasHiddenColumns()\n ) {\n this.plugins.ResponsiveGrid.createDataCol(tr);\n }\n\n // Expandable\n if (this.options.expand) {\n tr.classList.add(\"dg-expandable\");\n\n on(tr, \"click\", (ev) => {\n if (this.plugins.ResponsiveGrid) {\n this.plugins.ResponsiveGrid.blockObserver();\n }\n toggleClass(ev.currentTarget, \"dg-expanded\");\n if (this.plugins.ResponsiveGrid) {\n this.plugins.ResponsiveGrid.unblockObserver();\n }\n });\n }\n\n idx = 0;\n\n for (const column of this.options.columns) {\n if (!column) {\n console.error(\"Empty column found!\", this.options.columns);\n }\n // It should be applied as an attr of the row\n if (column.attr) {\n if (item[column.field]) {\n // Special case if we try to write over the class attr\n if (column.attr === \"class\") {\n addClass(tr, item[column.field]);\n } else {\n tr.setAttribute(column.attr, item[column.field]);\n }\n }\n return;\n }\n td = ce(\"td\");\n td.setAttribute(\"role\", \"gridcell\");\n td.setAttribute(\"aria-colindex\", `${idx}${this.startColIndex()}`);\n applyColumnDefinition(td, column);\n // This is required for pure css responsive layout\n td.setAttribute(\"data-name\", column.title);\n td.tabIndex = -1;\n\n // Inline editing ...\n if (column.editable && this.plugins.EditableColumn) {\n addClass(td, \"dg-editable-col\");\n this.plugins.EditableColumn.makeEditableInput(td, column, item, i);\n } else {\n // ... or formatting\n const v = item[column.field] ?? \"\";\n let tv;\n // TODO: make this modular\n switch (column.transform) {\n case \"uppercase\":\n tv = v.toUpperCase();\n break;\n case \"lowercase\":\n tv = v.toLowerCase();\n break;\n default:\n tv = v;\n break;\n }\n if (column.format) {\n // Only use formatting with values or if defaultFormatValue is set\n if (column.defaultFormatValue !== undefined && (tv === \"\" || tv === null)) {\n tv = `${column.defaultFormatValue}`;\n }\n if (typeof column.format === \"string\" && tv) {\n td.innerHTML = interpolate(\n // @ts-ignore\n column.format,\n Object.assign(\n {\n _v: v,\n _tv: tv,\n },\n item,\n ),\n );\n } else if (column.format instanceof Function) {\n const val = column.format.call(this, { column, rowData: item, cellData: tv, td, tr });\n td.innerHTML = val || tv || v;\n }\n } else {\n td.textContent = tv;\n }\n }\n tr.appendChild(td);\n idx++;\n }\n\n // Actions\n if (this.options.actions.length && this.plugins.RowActions) {\n this.plugins.RowActions.makeActionRow(tr, item);\n }\n\n tbody.appendChild(tr);\n });\n\n tbody.setAttribute(\"role\", \"rowgroup\");\n\n // Keep data empty message\n const prev = this.tbody;\n tbody.setAttribute(\"data-empty\", prev.getAttribute(\"data-empty\"));\n this.table.replaceChild(tbody, prev);\n\n if (this.plugins.FixedHeight) {\n this.plugins.FixedHeight.createFakeRow();\n }\n\n this.paginate();\n\n if (this.plugins.SelectableRows) {\n this.plugins.SelectableRows.shouldSelectAll(tbody);\n }\n\n this.data.length && this.classList.remove(\"dg-empty\");\n\n dispatch(this, \"bodyRendered\");\n }\n\n paginate() {\n this.log(\"paginate\");\n\n const total = this.totalRecords();\n const p = this.page || 1;\n const tbody = this.tbody;\n const tfoot = this.tfoot;\n const bodyRows = findAll(tbody, \"tr\");\n\n // Refresh page count in case we added/removed a page\n this.pages = this.totalPages();\n\n let index;\n let high = p * this.options.perPage;\n let low = high - this.options.perPage + 1;\n\n if (high > total) {\n high = total;\n }\n if (!total) {\n low = 0;\n }\n\n // Display all rows within the set indexes\n // For server side paginated grids, we display everything\n // since the server is taking care of actual pagination\n for (const tr of bodyRows) {\n if (this.options.server) {\n removeAttribute(tr, \"hidden\");\n continue;\n }\n index = Number(getAttribute(tr, \"aria-rowindex\"));\n if (index > high || index < low) {\n setAttribute(tr, \"hidden\", \"\");\n } else {\n removeAttribute(tr, \"hidden\");\n }\n }\n\n if (this.options.selectable && this.plugins.SelectableRows) {\n this.plugins.SelectableRows.clearCheckboxes(tbody);\n }\n\n // Store default height and update styles if needed\n if (this.plugins.FixedHeight) {\n this.plugins.FixedHeight.updateFakeRow();\n }\n\n // Enable/disable buttons if shown\n if (this.btnFirst) {\n this.btnFirst.disabled = this.page <= 1;\n this.btnPrev.disabled = this.page <= 1;\n this.btnNext.disabled = this.page >= this.pages;\n this.btnLast.disabled = this.page >= this.pages;\n }\n tfoot.querySelector(\".dg-low\").textContent = low.toString();\n tfoot.querySelector(\".dg-high\").textContent = high.toString();\n tfoot.querySelector(\".dg-total\").textContent = `${this.totalRecords()}`;\n tfoot.toggleAttribute(\"hidden\", this.options.autohidePager && this.options.perPage > this.totalRecords());\n }\n\n /**\n * @returns {number}\n */\n totalPages() {\n return Math.ceil(this.totalRecords() / this.options.perPage);\n }\n\n /**\n * @returns {number}\n */\n totalRecords() {\n if (this.options.server) {\n return this.meta?.[this.options.serverParams.metaFilteredKey] || 0;\n }\n return this.data.length;\n }\n}\n\nexport default DataGrid;\n", "/** @typedef {import(\"../data-grid\").default} DataGrid */\n\nclass BasePlugin {\n /**\n * @param {DataGrid} grid\n */\n constructor(grid) {\n this.grid = grid;\n }\n\n connected() {}\n\n disconnected() {}\n\n /**\n * Handle events within the plugin\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#handling-events\n * @param {Event} event\n */\n handleEvent(event) {\n if (this[`on${event.type}`]) {\n this[`on${event.type}`](event);\n }\n }\n}\n\nexport default BasePlugin;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport elementOffset from \"../utils/elementOffset.js\";\nimport {\n addClass,\n dispatch,\n findAll,\n getAttribute,\n hasClass,\n off,\n on,\n removeAttribute,\n removeClass,\n setAttribute,\n} from \"../utils/shortcuts.js\";\n\n/**\n * Allows to resize columns\n */\nclass ColumnResizer extends BasePlugin {\n constructor(grid) {\n super(grid);\n this.isResizing = false;\n }\n\n /**\n * @param {String} resizeLabel\n */\n renderResizer(resizeLabel) {\n const grid = this.grid;\n const table = grid.table;\n const cols = findAll(grid, \"thead tr.dg-head-columns th\");\n\n for (const col of cols) {\n if (hasClass(col, \"dg-not-resizable\")) {\n continue;\n }\n // Create a resizer element\n const resizer = document.createElement(\"div\");\n addClass(resizer, \"dg-resizer\");\n resizer.ariaLabel = resizeLabel;\n\n // Add a resizer element to the column\n col.appendChild(resizer);\n\n // Handle resizing\n let startX = 0;\n let startW = 0;\n let remainingSpace = 0;\n let max = 0;\n\n const mouseMoveHandler = (e) => {\n if (e.clientX > max) {\n return;\n }\n const newWidth = startW + (e.clientX - startX);\n if (col.dataset.minWidth && newWidth > Number.parseInt(col.dataset.minWidth)) {\n setAttribute(col, \"width\", newWidth);\n }\n };\n\n // When user releases the mouse, remove the existing event listeners\n const mouseUpHandler = () => {\n grid.log(\"resized column\");\n\n // Prevent accidental sorting if mouse is not over resize handler\n setTimeout(() => {\n this.isResizing = false;\n }, 0);\n\n removeClass(resizer, \"dg-resizer-active\");\n if (grid.options.reorder) {\n col.draggable = true;\n }\n col.style.overflow = \"hidden\";\n\n // Remove handlers\n off(document, \"mousemove\", mouseMoveHandler);\n off(document, \"mouseup\", mouseUpHandler);\n\n dispatch(grid, \"columnResized\", {\n col: getAttribute(col, \"field\"),\n width: getAttribute(col, \"width\"),\n });\n };\n\n // Otherwise it could sort the col\n on(resizer, \"click\", (e) => {\n e.stopPropagation();\n });\n\n on(resizer, \"mousedown\", (e) => {\n e.stopPropagation();\n\n this.isResizing = true;\n\n const target = e.target;\n const currentCols = findAll(grid, \"dg-head-columns th\");\n const visibleCols = currentCols.filter((col) => {\n return !col.hasAttribute(\"hidden\");\n });\n const columnIndex = visibleCols.findIndex((column) => column === target.parentNode);\n grid.log(\"resize column\");\n\n addClass(resizer, \"dg-resizer-active\");\n\n // Make sure we don't drag it\n removeAttribute(col, \"draggable\");\n\n // Allow overflow when resizing\n col.style.overflow = \"visible\";\n\n // Show full column height (-1 to avoid scrollbar)\n resizer.style.height = `${table.offsetHeight - 1}px`;\n\n // Register initial data\n startX = e.clientX;\n startW = col.offsetWidth;\n\n remainingSpace = (visibleCols.length - columnIndex) * 30;\n max = elementOffset(target).left + grid.offsetWidth - remainingSpace;\n\n // Remove width from next columns to allow auto layout\n setAttribute(col, \"width\", startW);\n for (let j = 0; j < visibleCols.length; j++) {\n if (j > columnIndex) {\n removeAttribute(cols[j], \"width\");\n }\n }\n\n // Attach handlers\n on(document, \"mousemove\", mouseMoveHandler);\n on(document, \"mouseup\", mouseUpHandler);\n });\n }\n }\n}\n\nexport default ColumnResizer;\n", "/**\n * @param {HTMLElement} el\n * @param {String} type\n * @param {String} prop\n * @returns {HTMLElement}\n */\nexport default function getParentElement(el, type, prop = \"nodeName\") {\n let parent = el;\n while (parent[prop] !== type) {\n parent = parent.parentElement;\n }\n return parent;\n}\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport getParentElement from \"../utils/getParentElement.js\";\nimport { find, off, on, removeAttribute, setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Create a right click menu on the headers\n */\nclass ContextMenu extends BasePlugin {\n connected() {\n /**\n * @type {HTMLUListElement}\n */\n this.menu = this.grid.querySelector(\".dg-menu\");\n }\n disconnected() {\n if (this.grid.headerRow) {\n off(this.grid.headerRow, \"contextmenu\", this);\n }\n }\n\n attachContextMenu() {\n const grid = this.grid;\n on(grid.headerRow, \"contextmenu\", this);\n }\n\n onchange(e) {\n const grid = this.grid;\n const t = e.target;\n const field = t.dataset.name;\n if (t.checked) {\n grid.showColumn(field);\n } else {\n // Prevent hidding last\n if (grid.visibleColumns().length <= 1) {\n // Restore checkbox value\n t.checked = true;\n return;\n }\n grid.hideColumn(field);\n }\n grid.fixPage(); //fixes Chrome footer flexbox resize issues that may appear when there is a large number of columns (i.e. more than 10).\n }\n\n oncontextmenu(e) {\n e.preventDefault();\n const grid = this.grid;\n const target = getParentElement(e.target, \"THEAD\");\n const menu = this.menu;\n const rect = target.getBoundingClientRect();\n let x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n menu.style.top = `${y}px`;\n menu.style.left = `${x}px`;\n\n removeAttribute(menu, \"hidden\");\n if (x + 150 > rect.width) {\n x -= menu.offsetWidth;\n menu.style.left = `${x}px`;\n }\n\n const documentClickHandler = (e) => {\n if (!menu.contains(e.target)) {\n setAttribute(menu, \"hidden\", \"\");\n off(document, \"click\", documentClickHandler);\n }\n };\n on(document, \"click\", documentClickHandler);\n }\n createMenu() {\n const grid = this.grid;\n const menu = this.menu;\n while (menu.lastChild) {\n menu.removeChild(menu.lastChild);\n }\n menu.addEventListener(\"change\", this);\n\n for (const col of grid.options.columns) {\n if (col.attr) {\n continue;\n }\n const li = document.createElement(\"li\");\n const label = document.createElement(\"label\");\n const checkbox = document.createElement(\"input\");\n setAttribute(checkbox, \"type\", \"checkbox\");\n setAttribute(checkbox, \"data-name\", col.field);\n if (!col.hidden) {\n checkbox.checked = true;\n }\n const text = document.createTextNode(col.title);\n\n label.appendChild(checkbox);\n label.appendChild(text);\n\n li.appendChild(label);\n menu.appendChild(li);\n }\n }\n}\n\nexport default ContextMenu;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport getParentElement from \"../utils/getParentElement.js\";\nimport { dispatch, findAll, getAttribute, on, setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Allows to move headers\n */\nclass DraggableHeaders extends BasePlugin {\n /**\n * @param {HTMLTableCellElement} th\n */\n makeHeaderDraggable(th) {\n const grid = this.grid;\n th.draggable = true;\n on(th, \"dragstart\", (e) => {\n if (grid.plugins.ColumnResizer?.isResizing && e.preventDefault) {\n e.preventDefault();\n return;\n }\n grid.log(\"reorder col\");\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", e.target.getAttribute(\"aria-colindex\"));\n });\n on(th, \"dragover\", (e) => {\n if (e.preventDefault) {\n e.preventDefault();\n }\n e.dataTransfer.dropEffect = \"move\";\n return false;\n });\n on(th, \"drop\", (e) => {\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n const t = e.target;\n const target = getParentElement(t, \"TH\");\n const index = Number.parseInt(e.dataTransfer.getData(\"text/plain\"));\n const targetIndex = Number.parseInt(target.getAttribute(\"aria-colindex\"));\n\n if (index === targetIndex) {\n grid.log(\"reordered col stayed the same\");\n return;\n }\n grid.log(`reordered col from ${index} to ${targetIndex}`);\n\n const offset = grid.startColIndex();\n const tmp = grid.options.columns[index - offset];\n grid.options.columns[index - offset] = grid.options.columns[targetIndex - offset];\n grid.options.columns[targetIndex - offset] = tmp;\n\n const swapNodes = (selector, el1) => {\n const rowIndex = el1.parentNode.getAttribute(\"aria-rowindex\");\n const el2 = grid.querySelector(\n `${selector} tr[aria-rowindex=\"${rowIndex}\"] [aria-colindex=\"${targetIndex}\"]`,\n );\n setAttribute(el1, \"aria-colindex\", targetIndex);\n setAttribute(el2, \"aria-colindex\", index);\n const newNode = document.createElement(\"th\");\n el1.parentNode.insertBefore(newNode, el1);\n el2.parentNode.replaceChild(el1, el2);\n newNode.parentNode.replaceChild(el2, newNode);\n };\n\n // Swap all rows in header and body\n for (const el1 of findAll(grid, `thead th[aria-colindex=\"${index}\"]`)) {\n swapNodes(\"thead\", el1);\n }\n for (const el1 of findAll(grid, `tbody td[aria-colindex=\"${index}\"]`)) {\n swapNodes(\"tbody\", el1);\n }\n\n // Updates the columns\n grid.options.columns = findAll(grid, \"thead tr.dg-head-columns th[field]\").map((th) =>\n grid.options.columns.find((c) => c.field === getAttribute(th, \"field\")),\n );\n\n dispatch(grid, \"columnReordered\", {\n col: tmp.field,\n from: index,\n to: targetIndex,\n });\n return false;\n });\n }\n}\n\nexport default DraggableHeaders;\n", "import BasePlugin from \"../core/base-plugin.js\";\n\n/**\n * Allows to paginate with horizontal swipe motions\n */\nclass TouchSupport extends BasePlugin {\n constructor(grid) {\n super(grid);\n this.touch = null;\n }\n connected() {\n const grid = this.grid;\n grid.addEventListener(\"touchstart\", this, { passive: true });\n grid.addEventListener(\"touchmove\", this, { passive: true });\n }\n\n disconnected() {\n const grid = this.grid;\n grid.removeEventListener(\"touchstart\", this);\n grid.removeEventListener(\"touchmove\", this);\n }\n\n ontouchstart(e) {\n this.touch = e.touches[0];\n }\n\n ontouchmove(e) {\n if (!this.touch) {\n return;\n }\n const grid = this.grid;\n const xDiff = this.touch.clientX - e.touches[0].clientX;\n const yDiff = this.touch.clientY - e.touches[0].clientY;\n\n if (Math.abs(xDiff) > Math.abs(yDiff)) {\n if (xDiff > 0) {\n grid.getNext();\n } else {\n grid.getPrev();\n }\n }\n this.touch = null;\n }\n}\n\nexport default TouchSupport;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport { dispatch, findAll, hasClass, setAttribute } from \"../utils/shortcuts.js\";\n\nconst SELECTABLE_CLASS = \"dg-selectable\";\nconst SELECT_ALL_CLASS = \"dg-select-all\";\nconst CHECKBOX_CLASS = \"form-check-input\"; //bs5\n\n/**\n * Allows to select rows\n */\nclass SelectableRows extends BasePlugin {\n disconnected() {\n if (this.selectAll) {\n this.selectAll.removeEventListener(\"change\", this);\n }\n }\n\n /**\n * @param {String} key Return a specific key (eg: id) instead of the whole row\n * @returns {Array}\n */\n getSelection(key = null) {\n const grid = this.grid;\n const selectedData = [];\n\n const inputs = findAll(grid, `tbody .${SELECTABLE_CLASS} input:checked`);\n\n for (const checkbox of inputs) {\n const idx = Number.parseInt(checkbox.dataset.id);\n const item = grid.data[idx - 1];\n if (!item) {\n console.warn(`Item ${idx} not found`);\n }\n if (key) {\n selectedData.push(item[key]);\n } else {\n selectedData.push(item);\n }\n }\n return selectedData;\n }\n\n /**\n * Uncheck box if hidden and visible only\n * @param {HTMLTableSectionElement} tbody\n */\n clearCheckboxes(tbody) {\n const grid = this.grid;\n if (!grid.options.selectVisibleOnly) {\n return;\n }\n const inputs = findAll(tbody, `tr[hidden] .${SELECTABLE_CLASS} input`);\n for (const input of inputs) {\n input.checked = false;\n }\n this.selectAll.checked = false;\n }\n\n colIndex() {\n return this.grid.startColIndex() - 2;\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createHeaderCol(tr) {\n const th = document.createElement(\"th\");\n setAttribute(th, \"scope\", \"col\");\n setAttribute(th, \"role\", \"columnheader button\");\n setAttribute(th, \"aria-colindex\", this.colIndex());\n th.classList.add(...[SELECTABLE_CLASS, \"dg-not-resizable\", \"dg-not-sortable\"]);\n th.tabIndex = 0;\n\n this.selectAll = document.createElement(\"input\");\n this.selectAll.type = \"checkbox\";\n this.selectAll.classList.add(SELECT_ALL_CLASS);\n this.selectAll.classList.add(CHECKBOX_CLASS);\n this.selectAll.addEventListener(\"change\", this);\n\n const label = document.createElement(\"label\");\n label.appendChild(this.selectAll);\n\n th.appendChild(label);\n\n th.setAttribute(\"width\", \"40\");\n tr.appendChild(th);\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createFilterCol(tr) {\n const th = document.createElement(\"th\");\n setAttribute(th, \"role\", \"columnheader button\");\n setAttribute(th, \"aria-colindex\", this.colIndex());\n th.classList.add(SELECTABLE_CLASS);\n th.tabIndex = 0;\n\n tr.appendChild(th);\n }\n\n /**\n * Handles the selectAll checkbox when any other .dg-selectable checkbox is checked on table body.\n * It should check selectAll if all is checked\n * It should uncheck selectAll if any is unchecked\n * @param {HTMLTableSectionElement} tbody\n */\n shouldSelectAll(tbody) {\n if (!this.selectAll) {\n return;\n }\n // Delegate listener for change events on input checkboxes\n tbody.addEventListener(\"change\", this);\n // Make sure state is up to date\n tbody.dispatchEvent(new Event(\"change\"));\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createDataCol(tr) {\n // Create col\n const td = document.createElement(\"td\");\n setAttribute(td, \"role\", \"gridcell button\");\n setAttribute(td, \"aria-colindex\", this.colIndex());\n td.classList.add(SELECTABLE_CLASS);\n\n // Create input\n const selectOne = document.createElement(\"input\");\n // Alias row id for easy retrieval in getSelection\n selectOne.dataset.id = tr.getAttribute(\"aria-rowindex\");\n selectOne.type = \"checkbox\";\n selectOne.classList.add(CHECKBOX_CLASS);\n // Label need to take full space thanks to css to make the whole cell clickable\n const label = document.createElement(\"label\");\n label.classList.add(\"dg-clickable-cell\");\n label.appendChild(selectOne);\n td.appendChild(label);\n\n // Prevent unwanted click behaviour on row\n label.addEventListener(\"click\", this);\n\n tr.appendChild(td);\n }\n\n /**\n * @param {Event} e\n */\n onclick(e) {\n e.stopPropagation();\n }\n\n /**\n * Handle change event on select all or any select checkbox in the table body\n * @param {import(\"../utils/shortcuts.js\").FlexibleEvent} e\n */\n onchange(e) {\n const grid = this.grid;\n if (hasClass(e.target, SELECT_ALL_CLASS)) {\n const visibleOnly = grid.options.selectVisibleOnly;\n const inputs = findAll(grid, `tbody .${SELECTABLE_CLASS} input`);\n for (const cb of inputs) {\n if (visibleOnly && !cb.offsetWidth) {\n return;\n }\n cb.checked = this.selectAll.checked;\n }\n dispatch(grid, \"rowsSelected\", {\n selection: this.getSelection(),\n });\n } else {\n if (!e.target.closest(`.${SELECTABLE_CLASS}`)) {\n return;\n }\n const totalCheckboxes = findAll(grid, `tbody .${SELECTABLE_CLASS} input[type=checkbox]`);\n // @ts-ignore\n const totalChecked = totalCheckboxes.filter((n) => n.checked);\n this.selectAll.checked = totalChecked.length === totalCheckboxes.length;\n\n dispatch(grid, \"rowsSelected\", {\n selection: grid.getSelection(),\n });\n }\n }\n}\n\nexport default SelectableRows;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport { setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Support for fixed table height\n *\n * We should add a fake row to push the footer down in case we don't have enough rows\n */\nclass FixedHeight extends BasePlugin {\n constructor(grid) {\n super(grid);\n\n this.hasFixedHeight = false;\n // If we have a fixed height, make sure we have overflowY set\n if (grid.style.height) {\n grid.style.overflowY = \"auto\";\n this.hasFixedHeight = true;\n }\n }\n\n /**\n */\n createFakeRow() {\n const grid = this.grid;\n const tbody = grid.querySelector(\"tbody\");\n const tr = document.createElement(\"tr\");\n setAttribute(tr, \"role\", \"row\");\n setAttribute(tr, \"hidden\", \"\");\n tr.classList.add(\"dg-fake-row\");\n tr.tabIndex = 0;\n tbody.appendChild(tr);\n }\n\n get fakeRow() {\n return this.grid.querySelector(\".dg-fake-row\");\n }\n\n /**\n * On last page, use a fake row to push footer down\n */\n updateFakeRow() {\n const grid = this.grid;\n const fakeRow = this.fakeRow;\n if (!fakeRow) {\n return;\n }\n\n // We don't need a fake row if we display everything\n if (grid.options.perPage > grid.totalRecords()) {\n return;\n }\n // We are not on last page\n if (grid.page !== grid.totalPages()) {\n return;\n }\n if (!grid.options.autoheight) {\n return;\n }\n // Find remaining missing height\n const max = grid.options.perPage * grid.rowHeight;\n const visibleRows = grid.querySelectorAll(\"tbody tr:not([hidden])\").length;\n const fakeHeight = visibleRows > 1 ? max - visibleRows * grid.rowHeight : max;\n if (fakeHeight > 0) {\n setAttribute(fakeRow, \"height\", fakeHeight);\n fakeRow.removeAttribute(\"hidden\");\n } else {\n fakeRow.removeAttribute(\"height\");\n }\n }\n}\n\nexport default FixedHeight;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport getTextWidth from \"../utils/getTextWidth.js\";\nimport { getAttribute, hasAttribute, setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Allows to resize columns\n */\nclass AutosizeColumn extends BasePlugin {\n /**\n * Autosize col based on column data\n * @param {HTMLTableCellElement} th\n * @param {import(\"../data-grid\").Column} column\n * @param {Number} min\n * @param {Number} max\n * @returns {Number}\n */\n computeSize(th, column, min, max) {\n const grid = this.grid;\n if (hasAttribute(th, \"width\")) {\n return getAttribute(th, \"width\");\n }\n if (!grid.data.length) {\n return;\n }\n const firstVal = grid.data[0];\n const lastVal = grid.data[grid.data.length - 1];\n let v = firstVal[column.field] ? firstVal[column.field].toString() : \"\";\n const v2 = lastVal[column.field] ? lastVal[column.field].toString() : \"\";\n if (v2.length > v.length) {\n v = v2;\n }\n let width = 0;\n if (v.length <= 6) {\n width = min;\n } else if (v.length > 50) {\n width = max;\n } else {\n // Add some extra room to have some spare space\n width = getTextWidth(`${v}0000`, th);\n }\n if (width > max) {\n width = max;\n }\n if (width < min) {\n width = min;\n }\n setAttribute(th, \"width\", width);\n return width;\n }\n}\n\nexport default AutosizeColumn;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport debounce from \"../utils/debounce.js\";\nimport {\n addClass,\n ce,\n find,\n findAll,\n hasClass,\n insertAfter,\n removeAttribute,\n removeClass,\n setAttribute,\n} from \"../utils/shortcuts.js\";\n\nconst RESPONSIVE_CLASS = \"dg-responsive\";\n\nlet obsTo;\n\n/**\n * @param {Array} list\n * @returns {Array}\n */\nfunction sortByPriority(list) {\n return list.sort((a, b) => {\n const v1 = Number.parseInt(a.dataset.responsive) || 1;\n const v2 = Number.parseInt(b.dataset.responsive) || 1;\n return v2 - v1;\n });\n}\n\n/**\n * @type {ResizeObserverCallback}\n */\n//@ts-ignore\nconst callback = debounce((entries) => {\n for (const entry of entries) {\n /**\n * @type {import(\"../data-grid\").default}\n */\n // @ts-ignore\n const grid = entry.target;\n const table = grid.table;\n if (grid.plugins.ResponsiveGrid.observerBlocked) {\n return;\n }\n // check inlineSize (width) and not blockSize (height)\n const contentBoxSize = Array.isArray(entry.contentBoxSize) ? entry.contentBoxSize[0] : entry.contentBoxSize;\n const size = Number.parseInt(contentBoxSize.inlineSize);\n const tableWidth = table.offsetWidth;\n const realTableWidth = findAll(grid.headerRow, \"th\").reduce((result, th) => {\n return result + th.offsetWidth;\n }, 0);\n const diff = (realTableWidth || tableWidth) - size - 1;\n const minWidth = 50;\n const prevAction = grid.plugins.ResponsiveGrid.prevAction;\n // We have an array with the columns to show/hide are in order, most important first\n const headerCols = sortByPriority(\n findAll(grid.headerRow, \"th[field]\")\n .reverse() // Order takes precedence if no priority is set\n .filter((col) => {\n // Leave out unresponsive columns\n return col.dataset.responsive !== \"0\";\n }),\n );\n let changed = false;\n\n grid.log(`table is ${tableWidth}/${realTableWidth} and available size is ${size}. Diff: ${diff}`);\n\n // The table is too big when diff has a high value, otherwise it will be like -1 or -2\n if (diff > 0) {\n if (prevAction === \"show\") {\n return;\n }\n grid.plugins.ResponsiveGrid.prevAction = \"hide\";\n let remaining = diff;\n let cols = headerCols.filter((col) => {\n return !col.hasAttribute(\"hidden\") && col.hasAttribute(\"data-responsive\");\n });\n if (cols.length === 0) {\n cols = headerCols.filter((col) => {\n return !col.hasAttribute(\"hidden\");\n });\n // Always keep one column\n if (cols.length === 1) {\n return;\n }\n }\n\n for (const col of cols) {\n if (remaining < 0) {\n continue;\n }\n\n const colWidth = col.offsetWidth;\n const field = col.getAttribute(\"field\");\n if (!field) {\n continue;\n }\n col.dataset.baseWidth = `${col.offsetWidth}`;\n\n grid.hideColumn(field, false);\n grid.setColProp(field, \"responsiveHidden\", true);\n changed = true;\n\n remaining -= colWidth;\n remaining = Math.round(remaining);\n }\n } else {\n if (prevAction === \"hide\") {\n return;\n }\n grid.plugins.ResponsiveGrid.prevAction = \"show\";\n\n const requiredWidth =\n headerCols\n .filter((col) => {\n return !col.hasAttribute(\"hidden\");\n })\n .reduce((result, col) => {\n const width = col.dataset.minWidth ? Number.parseInt(col.dataset.minWidth) : col.offsetWidth;\n return result + width;\n }, 0) + minWidth; // Add an offset so that inserting column is smoother\n\n // Compute available width to insert columns\n let remaining = size - requiredWidth;\n // Do we have any hidden column that we can restore ?\n const filteredHeaderCols = headerCols\n .slice()\n .reverse() // Reverse the array to restore the columns in the proper order\n .filter((col) => {\n return col.hasAttribute(\"hidden\");\n });\n\n for (const col of filteredHeaderCols) {\n if (remaining < minWidth) {\n continue;\n }\n const colWidth = Number.parseInt(col.dataset.minWidth);\n\n // We need to have enough space to restore it\n if (colWidth > remaining) {\n remaining = -1; // break loop to keep restoring in order\n continue;\n }\n\n const field = col.getAttribute(\"field\");\n if (!field) {\n continue;\n }\n\n grid.showColumn(field, false);\n grid.setColProp(field, \"responsiveHidden\", false);\n changed = true;\n\n remaining -= colWidth;\n remaining = Math.round(remaining);\n }\n }\n\n // Check footer\n const footer = find(grid.table, \"tfoot\");\n const realFooterWidth = findAll(grid.table, \".dg-footer > div\").reduce((result, div) => {\n return result + div.offsetWidth;\n }, 0);\n const availableFooterWidth = footer.offsetWidth - realFooterWidth;\n if (realFooterWidth > size) {\n addClass(footer, \"dg-footer-compact\");\n } else if (availableFooterWidth > 250) {\n removeClass(footer, \"dg-footer-compact\");\n }\n if (changed) {\n grid.renderTable();\n }\n // Prevent resize loop\n setTimeout(() => {\n grid.plugins.ResponsiveGrid.prevAction = null;\n }, 1000);\n grid.table.style.visibility = \"visible\";\n }\n}, 100);\nconst resizeObserver = new ResizeObserver(callback);\n\n/**\n * Responsive data grid\n */\nclass ResponsiveGrid extends BasePlugin {\n constructor(grid) {\n super(grid);\n\n this.observerBlocked = false;\n this.prevAction = null;\n }\n\n connected() {\n if (this.grid.options.responsive) {\n this.observe();\n }\n }\n\n disconnected() {\n this.unobserve();\n }\n\n observe() {\n if (!this.grid.options.responsive) {\n return;\n }\n resizeObserver.observe(this.grid);\n this.grid.style.display = \"block\"; // Otherwise resize doesn't happen\n this.grid.style.overflowX = \"hidden\"; // Prevent scrollbars from appearing\n }\n\n unobserve() {\n resizeObserver.unobserve(this.grid);\n this.grid.style.display = \"unset\";\n this.grid.style.overflowX = \"unset\";\n }\n\n blockObserver() {\n this.observerBlocked = true;\n if (obsTo) {\n clearTimeout(obsTo);\n }\n }\n\n unblockObserver() {\n obsTo = setTimeout(() => {\n this.observerBlocked = false;\n }, 200); // more than debounce\n }\n\n /**\n * @returns {Boolean}\n */\n hasHiddenColumns() {\n let flag = false;\n\n for (const col of this.grid.options.columns) {\n if (col.responsiveHidden) {\n flag = true;\n }\n }\n return flag;\n }\n\n colIndex() {\n return this.grid.startColIndex() - 1;\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createHeaderCol(tr) {\n if (!this.grid.options.responsiveToggle) {\n return;\n }\n const th = ce(\"th\", tr);\n setAttribute(th, \"scope\", \"col\");\n setAttribute(th, \"role\", \"columnheader button\");\n setAttribute(th, \"aria-colindex\", this.colIndex());\n setAttribute(th, \"width\", \"40\");\n th.classList.add(...[`${RESPONSIVE_CLASS}-toggle`, \"dg-not-resizable\", \"dg-not-sortable\"]);\n th.tabIndex = 0;\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createFilterCol(tr) {\n if (!this.grid.options.responsiveToggle) {\n return;\n }\n const th = ce(\"th\", tr);\n setAttribute(th, \"role\", \"columnheader button\");\n setAttribute(th, \"aria-colindex\", this.colIndex());\n th.classList.add(`${RESPONSIVE_CLASS}-toggle`);\n th.tabIndex = 0;\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createDataCol(tr) {\n if (!this.grid.options.responsiveToggle) {\n return;\n }\n // Create col\n const td = document.createElement(\"td\");\n setAttribute(td, \"role\", \"gridcell button\");\n setAttribute(td, \"aria-colindex\", this.colIndex());\n td.classList.add(`${RESPONSIVE_CLASS}-toggle`);\n\n // Create icon\n td.innerHTML = `
\n \n \n\n\n \n
`;\n tr.appendChild(td);\n\n td.addEventListener(\"click\", this);\n td.addEventListener(\"mousedown\", this);\n }\n\n computeLabelWidth() {\n let idealWidth = 0;\n let consideredCol = 0;\n while (idealWidth < 120) {\n consideredCol++;\n const hCol = find(this.grid, `.dg-head-columns th[aria-colindex=\"${consideredCol}\"]`);\n if (hCol) {\n idealWidth += hCol.offsetWidth;\n } else {\n break;\n }\n }\n return idealWidth;\n }\n\n /**\n * @param {Event} ev\n */\n onmousedown(ev) {\n // Avoid selection through double click\n ev.preventDefault();\n }\n\n /**\n * @param {Event} ev\n */\n onclick(ev) {\n // Prevent expandable\n ev.stopPropagation();\n\n // target is the element that triggered the event (e.g., the user clicked on)\n // currentTarget is the element that the event listener is attached to.\n\n /**\n * @type {HTMLTableRowElement}\n */\n //@ts-ignore\n const td = ev.currentTarget;\n const tr = td.parentElement;\n const open = find(td, `.${RESPONSIVE_CLASS}-open`);\n const close = find(td, `.${RESPONSIVE_CLASS}-close`);\n\n this.blockObserver();\n\n const isExpanded = hasClass(tr, `${RESPONSIVE_CLASS}-expanded`);\n if (isExpanded) {\n removeClass(tr, `${RESPONSIVE_CLASS}-expanded`);\n open.style.display = \"unset\";\n close.style.display = \"none\";\n\n // Move back rows and cleanup row\n const childRow = tr.nextElementSibling;\n const hiddenCols = findAll(childRow, `.${RESPONSIVE_CLASS}-hidden`);\n\n for (const col of hiddenCols) {\n // We don't really need to care where we insert them since we are going to redraw anyway\n tr.appendChild(col);\n setAttribute(col, \"hidden\");\n }\n\n childRow.parentElement.removeChild(childRow);\n } else {\n addClass(tr, `${RESPONSIVE_CLASS}-expanded`);\n open.style.display = \"none\";\n close.style.display = \"unset\";\n\n // Create a child row and move rows into it\n const childRow = ce(\"tr\");\n insertAfter(childRow, tr);\n addClass(childRow, `${RESPONSIVE_CLASS}-child-row`);\n\n const childRowTd = ce(\"td\", childRow);\n setAttribute(childRowTd, \"colspan\", this.grid.columnsLength(true));\n\n const childTable = ce(\"table\", childRowTd);\n addClass(childTable, `${RESPONSIVE_CLASS}-table`);\n\n const hiddenCols = findAll(tr, `.${RESPONSIVE_CLASS}-hidden`);\n const idealWidth = this.computeLabelWidth();\n\n for (const col of hiddenCols) {\n const childTableRow = ce(\"tr\", childTable);\n\n // Add label\n const label = col.dataset.name;\n const labelCol = ce(\"th\", childTableRow);\n // It looks much better when aligned with an actual col\n labelCol.style.width = `${idealWidth}px`;\n labelCol.innerHTML = label;\n\n // Add actual row\n childTableRow.appendChild(col);\n removeAttribute(col, \"hidden\");\n }\n }\n\n this.unblockObserver();\n }\n}\n\nexport default ResponsiveGrid;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport interpolate from \"../utils/interpolate.js\";\nimport { dispatch, on, setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Add action on rows\n */\nclass RowActions extends BasePlugin {\n /**\n * @returns {Boolean}\n */\n hasActions() {\n return this.grid.options.actions.length > 0;\n }\n\n /**\n *\n * @param {HTMLTableRowElement} tr\n */\n makeActionHeader(tr) {\n const actionsTh = document.createElement(\"th\");\n setAttribute(actionsTh, \"role\", \"columnheader button\");\n setAttribute(actionsTh, \"aria-colindex\", this.grid.columnsLength(true));\n actionsTh.classList.add(...[\"dg-actions\", \"dg-not-sortable\", \"dg-not-resizable\", this.actionClass]);\n actionsTh.tabIndex = 0;\n tr.appendChild(actionsTh);\n }\n\n /**\n *\n * @param {HTMLTableRowElement} tr\n */\n makeActionFilter(tr) {\n const actionsTh = document.createElement(\"th\");\n actionsTh.setAttribute(\"role\", \"columnheader button\");\n setAttribute(actionsTh, \"aria-colindex\", this.grid.columnsLength(true));\n actionsTh.classList.add(...[\"dg-actions\", this.actionClass]);\n actionsTh.tabIndex = 0;\n tr.appendChild(actionsTh);\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n * @param {Object} item\n */\n makeActionRow(tr, item) {\n const labels = this.grid.labels;\n const td = document.createElement(\"td\");\n setAttribute(td, \"role\", \"gridcell\");\n setAttribute(td, \"aria-colindex\", this.grid.columnsLength(true));\n td.classList.add(...[\"dg-actions\", this.actionClass]);\n td.tabIndex = 0;\n\n // Add menu toggle\n const actionsToggle = document.createElement(\"button\");\n actionsToggle.classList.add(\"dg-actions-toggle\");\n actionsToggle.innerHTML = \"\u2630\";\n td.appendChild(actionsToggle);\n on(actionsToggle, \"click\", (ev) => {\n ev.stopPropagation();\n ev.target.parentElement.classList.toggle(\"dg-actions-expand\");\n });\n\n for (const action of this.grid.options.actions) {\n const button = document.createElement(\"button\");\n if (action.html) {\n button.innerHTML = action.html;\n } else {\n button.innerText = action.title ?? action.name;\n }\n if (action.title) {\n button.title = action.title;\n }\n if (action.url) {\n button.type = \"submit\";\n button.formAction = interpolate(action.url, item);\n }\n if (action.class) {\n button.classList.add(...action.class.split(\" \"));\n }\n const actionHandler = (ev) => {\n ev.stopPropagation();\n if (action.confirm) {\n const c = confirm(labels.areYouSure);\n if (!c) {\n ev.preventDefault();\n return;\n }\n }\n dispatch(this.grid, \"action\", {\n data: item,\n action: action.name,\n });\n };\n button.addEventListener(\"click\", actionHandler);\n td.appendChild(button);\n\n // Row action\n if (action.default) {\n tr.classList.add(\"dg-actionable\");\n tr.addEventListener(\"click\", actionHandler);\n }\n }\n\n tr.appendChild(td);\n }\n\n get actionClass() {\n if (this.grid.options.actions.length < 3 && !this.grid.options.collapseActions) {\n return `dg-actions-${this.grid.options.actions.length}`;\n }\n return \"dg-actions-more\";\n }\n}\n\nexport default RowActions;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport { dispatch } from \"../utils/shortcuts.js\";\n\n/**\n * Make editable inputs in rows\n */\nclass EditableColumn extends BasePlugin {\n /**\n *\n * @param {HTMLTableCellElement} td\n * @param {import(\"../data-grid\").Column} column\n * @param {Object} item\n * @param {number} i\n */\n makeEditableInput(td, column, item, i) {\n const gridId = this.grid.getAttribute(\"id\");\n const input = document.createElement(\"input\");\n input.type = column.editableType || \"text\";\n if (input.type === \"email\") {\n input.inputMode = \"email\";\n }\n if (input.type === \"decimal\") {\n input.type = \"text\";\n input.inputMode = \"decimal\";\n }\n input.autocomplete = \"off\";\n input.spellcheck = false;\n input.tabIndex = 0;\n input.classList.add(\"dg-editable\");\n input.name = `${gridId.replace(\"-\", \"_\")}[${i + 1}][${column.field}]`;\n input.value = item[column.field];\n input.dataset.field = column.field;\n\n // Prevent row action\n input.addEventListener(\"click\", (ev) => ev.stopPropagation());\n // Enter validates edit\n input.addEventListener(\"keypress\", (ev) => {\n if (ev.type === \"keypress\") {\n const key = ev.keyCode || ev.key;\n if (key === 13 || key === \"Enter\") {\n input.blur();\n ev.preventDefault();\n }\n }\n });\n // Save on blur\n input.addEventListener(\"blur\", () => {\n // Only fire on update\n if (input.value === item[input.dataset.field]) {\n return;\n }\n // Update underlying data\n item[input.dataset.field] = input.value;\n // Notify\n dispatch(this.grid, \"edit\", {\n data: item,\n value: input.value,\n });\n });\n td.appendChild(input);\n }\n}\n\nexport default EditableColumn;\n", "import BasePlugin from \"../core/base-plugin.js\";\r\nimport { $ } from \"../utils/shortcuts.js\";\r\n\r\n/**\r\n * Adds an element for showing a spinning icon on grid loading.\r\n */\r\nclass SpinnerSupport extends BasePlugin {\r\n connected() {\r\n // Inserts spinner\r\n if (this.grid.options.spinnerClass && this.grid.plugins.SpinnerSupport) {\r\n this.add();\r\n }\r\n }\r\n\r\n /**\r\n * Adds a spinner element with its associated css styles.\r\n */\r\n add() {\r\n const grid = this.grid;\r\n const classes = grid.options.spinnerClass;\r\n if (!classes) {\r\n return;\r\n }\r\n const cls = classes\r\n .split(\" \")\r\n .map((e) => `.${e}`)\r\n .join(\"\");\r\n\r\n const template = `\r\n\r\n`;\r\n if (!$(\"#dg-styles\")) {\r\n const styleParent = $(\"head\") ?? $(\"body\");\r\n const position = /head/i.test(styleParent.tagName) ? \"beforeend\" : \"afterbegin\";\r\n styleParent.insertAdjacentHTML(position, template);\r\n }\r\n !$(`i${cls}`, grid) && grid.insertAdjacentHTML(\"afterbegin\", ``);\r\n }\r\n}\r\n\r\nexport default SpinnerSupport;\r\n", "\uFEFFimport BasePlugin from \"../core/base-plugin.js\";\nimport { findAll } from \"../utils/shortcuts.js\";\n\n/**\n * @typedef GridState\n * @property {Object} meta\n * @property {Number} pages\n * @property {Number} page\n * @property {Number} perPage\n * @property {Object} filters\n * @property {Array} columns\n * @property {String} sort\n * @property {String} sortDir\n * @property {Number} scrollTo\n */\n\nclass SaveState extends BasePlugin {\n constructor(grid) {\n super(grid);\n this.cachedState = null;\n this.isFilterSortSet = false;\n this.isDataLoaded = false;\n this.isScrolled = false;\n this.log(\"Init\");\n }\n\n connected() {\n this.log(\"connected\");\n const grid = this.grid;\n\n if (!grid.options.saveState) {\n this.log(\"disabled\");\n return;\n }\n\n this.log(\"enabled\");\n\n const cachedState = this._getState();\n if (cachedState) {\n this.log(\"hide columns\");\n\n for (const col of cachedState.columns) {\n if (col.hidden) {\n const hideCol = grid.options.columns.find((c) => c.field === col.field);\n hideCol.hidden = true;\n }\n }\n\n this.log(\"set: meta, pages\");\n grid.options.perPage = cachedState.perPage;\n if (grid.options.server) {\n grid.meta = cachedState.meta;\n grid.pages = cachedState.pages;\n grid.page = cachedState.page;\n }\n }\n\n this.cachedState = cachedState;\n\n const dgLoadData = grid.loadData;\n grid.loadData = function (...args) {\n return new Promise((resolve, reject) => {\n dgLoadData.apply(this, args).finally(() => {\n const saveState = this.plugins.SaveState;\n\n if (!grid.classList.contains(\"dg-initialized\")) {\n saveState.log(\"not init, loadData skipped\");\n return resolve();\n }\n\n saveState.log(\"loadData finished, set param controls\");\n\n if (saveState.cachedState && !saveState.isFilterSortSet) {\n saveState.log(\"set sort and filters\");\n\n const sortableHeaders = findAll(grid, \"thead tr.dg-head-columns th[aria-sort]\");\n for (const el of sortableHeaders) {\n el.setAttribute(\"aria-sort\", \"none\");\n }\n\n grid.querySelector(\n `thead tr.dg-head-columns th[field='${saveState.cachedState.sort}']`,\n )?.setAttribute(\"aria-sort\", saveState.cachedState.sortDir);\n\n const filters = findAll(grid.filterRow, \"[id^=dg-filter]\");\n for (const el of filters) {\n el.value = saveState.cachedState.filters[el.dataset.name];\n }\n saveState.isFilterSortSet = true;\n }\n\n /** @type {GridState} */\n const newState = {\n meta: grid.meta,\n pages: grid.pages,\n page: grid.page,\n perPage: grid.options.perPage,\n filters: {},\n columns: grid.options.columns.map((col) => ({ field: col.field, hidden: col.hidden })),\n sort: grid.getSort(),\n sortDir: grid.getSortDir(),\n scrollTo: window.scrollY,\n };\n\n const filters = grid.getFilters();\n\n for (const key of Object.keys(filters)) {\n newState.filters[key] = filters[key];\n }\n\n saveState.log(\"store new state\");\n saveState._setState(newState);\n\n if (!grid.options.server && saveState.cachedState && !saveState.isDataLoaded) {\n saveState.isDataLoaded = true;\n grid.filterData();\n grid.page = saveState.cachedState.page;\n grid.pageChanged();\n }\n\n resolve();\n });\n });\n };\n\n const updateState = () => {\n const saveState = grid.plugins.SaveState;\n const state = saveState._getState();\n if (!state) {\n return;\n }\n state.columns = grid.options.columns.map((col) => ({ field: col.field, hidden: col.hidden }));\n state.sort = grid.getSort();\n state.sortDir = grid.getSortDir();\n state.scrollTo = window.scrollY;\n saveState._setState(state);\n };\n\n document.addEventListener(\"scrollend\", updateState);\n grid.addEventListener(\"headerRendered\", updateState);\n\n grid.addEventListener(\"bodyRendered\", (ev) => {\n if (!grid.classList.contains(\"dg-initialized\") || grid.classList.contains(\"dg-loading\")) {\n return;\n }\n\n if (!grid.options.server) {\n updateState();\n }\n\n const saveState = grid.plugins.SaveState;\n if (!saveState.cachedState || !saveState.isFilterSortSet) {\n return;\n }\n\n if (!saveState.isDataLoaded) {\n saveState.isDataLoaded = true;\n grid.reload();\n } else if (!saveState.isScrolled) {\n saveState.isScrolled = true;\n window.scrollTo({ top: saveState.cachedState.scrollTo, left: 0, behavior: \"instant\" });\n }\n });\n }\n\n log(message) {\n this.grid.log(`[Save-State] ${message}`);\n }\n\n /**\n * @returns {GridState}\n */\n _getState() {\n let state;\n try {\n state = JSON.parse(sessionStorage.getItem(`gridSaveState_${this.grid.id}`));\n } catch (_) {}\n return state;\n }\n\n /**\n * @param {GridState} state\n */\n _setState(state) {\n sessionStorage.setItem(`gridSaveState_${this.grid.id}`, JSON.stringify(state));\n }\n}\n\nexport default SaveState;\n", "/**\r\n * Data Grid custom element\r\n * https://github.com/lekoala/data-grid/\r\n * @license MIT\r\n */\r\n\r\nimport DataGrid from \"./src/data-grid.js\";\r\n// Optional plugins\r\nimport ColumnResizer from \"./src/plugins/column-resizer.js\";\r\nimport ContextMenu from \"./src/plugins/context-menu.js\";\r\nimport DraggableHeaders from \"./src/plugins/draggable-headers.js\";\r\nimport TouchSupport from \"./src/plugins/touch-support.js\";\r\nimport SelectableRows from \"./src/plugins/selectable-rows.js\";\r\nimport FixedHeight from \"./src/plugins/fixed-height.js\";\r\nimport AutosizeColumn from \"./src/plugins/autosize-column.js\";\r\nimport ResponsiveGrid from \"./src/plugins/responsive-grid.js\";\r\nimport RowActions from \"./src/plugins/row-actions.js\";\r\nimport EditableColumn from \"./src/plugins/editable-column.js\";\r\nimport SpinnerSupport from \"./src/plugins/spinner-support.js\";\r\nimport SaveState from \"./src/plugins/save-state.js\";\r\n\r\n// Using shorthand property names\r\n// This make them reserved and keys will be preserved\r\n// Actual class names are renamed\r\nDataGrid.registerPlugins({\r\n ColumnResizer,\r\n ContextMenu,\r\n DraggableHeaders,\r\n TouchSupport,\r\n SelectableRows,\r\n FixedHeight,\r\n AutosizeColumn,\r\n ResponsiveGrid,\r\n RowActions,\r\n EditableColumn,\r\n SpinnerSupport,\r\n SaveState\r\n});\r\n\r\n// Prevent errors if included multiple times\r\nif (!customElements.get(\"data-grid\")) {\r\n customElements.define(\"data-grid\", DataGrid);\r\n}\r\n\r\nexport default DataGrid;\r\n\r\nconst global = typeof globalThis !== \"undefined\" ? globalThis : self;\r\nglobal.DataGrid = DataGrid;"], - "mappings": "AAIe,SAARA,EAA0BC,EAAK,CAClC,OAAOA,EAAI,YAAY,EAAE,QAAQ,oBAAqB,CAACC,EAAGC,IAAQA,EAAI,YAAY,CAAC,CACvF,CCDe,SAARC,EAA+BC,EAAG,CAErC,GAAIA,IAAM,OACN,MAAO,GAEX,GAAIA,IAAM,QACN,MAAO,GAGX,GAAIA,IAAM,IAAMA,IAAM,OAClB,OAAO,KAGX,GAAIA,IAAM,OAAOA,CAAC,EAAE,SAAS,EACzB,OAAO,OAAOA,CAAC,EAGnB,GAAIA,GAAK,CAAC,IAAK,GAAG,EAAE,SAASA,EAAE,UAAU,EAAG,CAAC,CAAC,EAC1C,GAAI,CAEA,IAAIC,EAAMD,EACV,OAAIC,EAAI,QAAQ,GAAG,IAAM,KACrBA,EAAMA,EAAI,QAAQ,KAAM,GAAG,GAExB,KAAK,MAAM,mBAAmBA,CAAG,CAAC,CAC7C,MAAQ,CACJ,eAAQ,MAAM,mBAAmBD,CAAC,EAAE,EAC7B,CAAC,CACZ,CAEJ,OAAOA,CACX,CCSA,IAAME,GAAwB,CAC1B,SACA,QACA,aACA,YACA,aACA,WACA,aACA,WACA,aACA,UACA,YACA,YACA,aACA,aACA,WACJ,EAOA,SAASC,GAAYC,EAAM,CACvB,OAAIF,GAAsB,SAASE,CAAI,EAC5B,CAAE,QAAS,EAAK,EAEpB,CAAC,CACZ,CAOO,SAASC,EAAaC,EAAIC,EAAM,CACnC,OAAOD,EAAG,aAAaC,CAAI,CAC/B,CAOO,SAASC,EAAaF,EAAIC,EAAM,CACnC,OAAOD,EAAG,aAAaC,CAAI,CAC/B,CAQO,SAASE,EAAaH,EAAIC,EAAMG,EAAI,GAAIC,EAAQ,GAAO,CACtDA,GAASH,EAAaF,EAAIC,CAAI,GAClCD,EAAG,aAAaC,EAAM,GAAGG,CAAC,EAAE,CAChC,CAMO,SAASE,EAAgBN,EAAIC,EAAM,CAClCC,EAAaF,EAAIC,CAAI,GACrBD,EAAG,gBAAgBC,CAAI,CAE/B,CAOO,SAASM,EAAGP,EAAIF,EAAMU,EAAU,CACnCR,EAAG,iBAAiBF,EAAMU,EAAUX,GAAYC,CAAI,CAAC,CACzD,CAOO,SAASW,EAAIT,EAAIF,EAAMU,EAAU,CACpCR,EAAG,oBAAoBF,EAAMU,EAAUX,GAAYC,CAAI,CAAC,CAC5D,CAmBO,SAASY,EAASC,EAAIC,EAAMC,EAAO,CAAC,EAAGC,EAAU,GAAO,CAC3D,IAAMC,EAAO,CAAC,EACVD,IACAC,EAAK,QAAU,IAEfF,IACAE,EAAK,OAASF,GAElBF,EAAG,cAAc,IAAI,YAAYC,EAAMG,CAAI,CAAC,CAChD,CAOO,SAASC,EAASL,EAAIC,EAAM,CAC/B,OAAOD,EAAG,UAAU,SAASC,CAAI,CACrC,CAMO,SAASK,EAASN,EAAIC,EAAM,CAC/BD,EAAG,UAAU,IAAI,GAAGC,EAAK,MAAM,GAAG,CAAC,CACvC,CAMO,SAASM,EAAYP,EAAIC,EAAM,CAClCD,EAAG,UAAU,OAAO,GAAGC,EAAK,MAAM,GAAG,CAAC,CAC1C,CAMO,SAASO,GAAYR,EAAIC,EAAM,CAClCD,EAAG,UAAU,OAAOC,CAAI,CAC5B,CAOO,SAASQ,EAAEC,EAAUC,EAAO,SAAU,CACzC,OAAID,aAAoB,YACbA,EAEJC,EAAK,cAAcD,CAAQ,CACtC,CAOO,SAASE,GAAGF,EAAUC,EAAO,SAAU,CAC1C,OAAO,MAAM,KAAKA,EAAK,iBAAiBD,CAAQ,CAAC,CACrD,CASO,SAASG,EAAKb,EAAIU,EAAU,CAC/B,OAAOD,EAAEC,EAAUV,CAAE,CACzB,CASO,SAASc,EAAQd,EAAIU,EAAU,CAClC,OAAOE,GAAGF,EAAUV,CAAE,CAC1B,CAgBO,SAASe,EAAGC,EAASC,EAAS,KAAM,CACvC,IAAMC,EAAK,SAAS,cAAcF,CAAO,EACzC,OAAIC,GACAA,EAAO,YAAYC,CAAE,EAElBA,CACX,CAMO,SAASC,GAAYC,EAASC,EAAc,CAC/CA,EAAa,WAAW,aAAaD,EAASC,EAAa,WAAW,CAC1E,CC9PA,IAAMC,EAAN,cAA0B,WAAY,CAIlC,YAAYC,EAAU,CAAC,EAAG,CACtB,MAAM,EAGN,KAAK,QAAU,OAAO,OAAO,CAAC,EAAG,KAAK,eAAgB,KAAK,kBAAmBA,CAAO,EAErF,KAAK,IAAI,aAAa,EAEtB,KAAK,WAAa,GAClB,KAAK,OAAO,EAEZ,KAAK,IAAI,OAAO,CACpB,CAEA,IAAI,gBAAiB,CACjB,MAAO,CAAC,CACZ,CAMA,UAAUC,EAAK,CACX,OAAO,KAAK,QAAQA,CAAG,CAC3B,CAMA,UAAUA,EAAKC,EAAG,CACdC,EAAa,KAAM,QAAQF,CAAG,GAAIC,CAAC,CACvC,CAKA,aAAaD,EAAK,CACdE,EAAa,KAAM,QAAQF,CAAG,GAAI,CAAC,KAAK,UAAUA,CAAG,CAAC,CAC1D,CAEA,IAAI,mBAAoB,CACpB,IAAMG,EAAa,KAAK,QAAQ,OAAS,KAAK,MAAM,KAAK,QAAQ,MAAM,EAAI,CAAC,EACtEC,EAAO,CAAE,GAAG,KAAK,OAAQ,EAC/B,QAAWC,KAAOD,EACVC,IAAQ,WAGZD,EAAKC,CAAG,EAAIC,EAAcF,EAAKC,CAAG,CAAC,GAGvC,cAAO,OAAOD,EAAMD,CAAU,EACvBC,CACX,CAKA,OAAO,UAAW,CACd,MAAO,EACX,CAKA,QAAS,CAAC,CAKV,IAAIG,EAAS,CACL,KAAK,QAAQ,OACb,QAAQ,IAAI,IAAIC,EAAa,KAAM,IAAI,CAAC,KAAKD,CAAO,EAAE,CAE9D,CAOA,YAAYE,EAAO,CACX,KAAK,KAAKA,EAAM,IAAI,EAAE,GACtB,KAAK,KAAKA,EAAM,IAAI,EAAE,EAAEA,CAAK,CAErC,CAKA,YAAa,CAAC,CAEd,mBAAoB,CAEhB,WAAW,IAAM,CACb,KAAK,IAAI,mBAAmB,EAI5B,IAAMC,EAAW,SAAS,cAAc,UAAU,EAElDA,EAAS,UAAY,KAAK,YAAY,SAAS,EAC/C,KAAK,YAAYA,EAAS,QAAQ,UAAU,EAAI,CAAC,EAEjD,KAAK,WAAW,EAEhBC,EAAS,KAAM,WAAW,CAC9B,EAAG,CAAC,CACR,CAKA,eAAgB,CAAC,CAEjB,sBAAuB,CACnB,KAAK,IAAI,sBAAsB,EAC/B,KAAK,cAAc,EAEnBA,EAAS,KAAM,cAAc,CACjC,CAMA,IAAI,qBAAsB,CACtB,MAAO,CAAC,CACZ,CAUA,yBAAyBC,EAAeC,EAAUC,EAAU,CAExD,GAAID,IAAaC,EACb,OAGJ,KAAK,IAAI,6BAA6BF,CAAa,EAAE,EAErD,IAAIG,EAAW,GACTC,EAAc,KAAK,oBAAoBJ,CAAa,GAAKN,EAE3DW,EAAOL,EAEPK,EAAK,QAAQ,OAAO,IAAM,IAC1BA,EAAOA,EAAK,MAAM,CAAC,EACnBF,EAAW,IAEfE,EAAOC,EAASD,CAAI,EAChBF,EACA,KAAK,QAAQE,CAAI,EAAID,EAAYF,CAAQ,EAEzC,KAAKG,CAAI,EAAID,EAAYF,CAAQ,EAIjC,KAAK,YAAc,KAAK,GAAGG,CAAI,SAAS,GACxC,KAAK,GAAGA,CAAI,SAAS,EAAE,CAE/B,CACJ,EAEOE,GAAQrB,ECjLA,SAARsB,EAAiCC,EAAIC,EAAOC,EAAOC,EAAU,GAAO,CACvE,IAAMC,EAAM,SAAS,cAAc,QAAQ,EAC3CA,EAAI,MAAQ,GAAGH,CAAK,GAChBE,IACAC,EAAI,SAAW,IAEnBA,EAAI,MAAQF,EACZF,EAAG,YAAYI,CAAG,CACtB,CCVe,SAARC,EAAmCC,EAAKC,EAAS,CAAC,EAAG,CACxD,QAAWC,KAAO,OAAO,KAAKD,CAAM,EAChC,GAAI,MAAM,QAAQA,EAAOC,CAAG,CAAC,EACzB,QAAWC,KAAK,OAAO,KAAKF,EAAOC,CAAG,CAAC,EAEnCF,EAAI,aAAa,OAAO,MAAMG,CAAC,EAAI,GAAGD,CAAG,IAAIC,CAAC,IAAMD,EAAKD,EAAOC,CAAG,EAAEC,CAAC,CAAC,OAG3EH,EAAI,aAAa,OAAOE,EAAKD,EAAOC,CAAG,CAAC,CAGpD,CCVe,SAARE,EAA8BC,EAAG,CACpC,GAAI,OAAOA,GAAM,SAAU,CACvB,GAAIA,EAAE,CAAC,IAAM,IAAK,CAEd,IAAIC,EAAKD,EACT,OAAIC,EAAG,QAAQ,GAAG,IAAM,KACpBA,EAAKA,EAAG,QAAQ,KAAM,GAAG,GAEtB,KAAK,MAAMA,CAAE,CACxB,CAEA,OAAOD,EAAE,MAAM,GAAG,CACtB,CACA,OAAK,MAAM,QAAQA,CAAC,EAIbA,GAHH,QAAQ,MAAM,gBAAiBA,CAAC,EACzB,CAAC,EAGhB,CCnBe,SAARE,EAA+BC,EAAI,CACtC,IAAMC,EAAOD,EAAG,sBAAsB,EAChCE,EAAa,OAAO,aAAe,SAAS,gBAAgB,WAC5DC,EAAY,OAAO,aAAe,SAAS,gBAAgB,UACjE,MAAO,CAAE,IAAKF,EAAK,IAAME,EAAW,KAAMF,EAAK,KAAOC,CAAW,CACrE,CCHe,SAARE,EAA6BC,EAAKC,EAAM,CAC3C,OAAOD,EAAI,QAAQ,gBAAiB,CAACE,EAAIC,IAAOF,EAAKE,CAAE,CAAC,CAC5D,CCRA,IAAIC,GAWW,SAARC,EAA8BC,EAAMC,EAAK,SAAS,KAAMC,EAAc,GAAO,CAChF,IAAMC,EAAS,OAAO,iBAAiBF,GAAM,SAAS,cAAc,KAAK,CAAC,EACpEG,EAAaD,EAAO,iBAAiB,aAAa,GAAK,SACvDE,EAAWF,EAAO,iBAAiB,WAAW,GAAK,OACnDG,EAAaH,EAAO,iBAAiB,aAAa,GAAK,QAEzDI,EAAU,EACd,GAAIL,EAAa,CACb,IAAMM,EAAcL,EAAO,iBAAiB,cAAc,GAAK,IACzDM,EAAeN,EAAO,iBAAiB,eAAe,GAAK,IACjEI,EAAU,OAAO,SAASC,CAAW,EAAI,OAAO,SAASC,CAAY,CACzE,CAGKX,KACDA,GAAS,SAAS,cAAc,QAAQ,GAE5C,IAAMY,EAAUZ,GAAO,WAAW,IAAI,EACtCY,EAAQ,KAAO,GAAGN,CAAU,IAAIC,CAAQ,IAAIC,CAAU,GACtD,IAAMK,EAAUD,EAAQ,YAAYV,CAAI,EACxC,OAAO,OAAO,SAASW,EAAQ,KAAK,EAAIJ,CAC5C,CC5Be,SAARK,EAAyBC,EAAQ,CACpC,OAAO,KAAK,OAAO,EACd,SAAS,EAAE,EACX,QAAQ,KAAMA,GAAU,EAAE,CACnC,CCEe,SAARC,EAA0BC,EAASC,EAAU,IAAK,CACrD,IAAIC,EAAQ,KACZ,MAAO,IAAIC,IAAS,CAChB,aAAaD,CAAK,EAClBA,EAAQ,WAAW,IAAM,CACrBA,EAAQ,KACRF,EAAQ,GAAGG,CAAI,CACnB,EAAGF,CAAO,CACd,CACJ,CCyJA,IAAIG,EAAU,CAAC,EAKXC,EAAS,CACT,aAAc,iBACd,SAAU,aACV,cAAe,mBACf,aAAc,sBACd,aAAc,kBACd,aAAc,kBACd,GAAI,KACJ,MAAO,QACP,aAAc,gBACd,OAAQ,UACR,WAAY,gBACZ,aAAc,wBAClB,EAOA,SAASC,GAAsBC,EAAIC,EAAQ,CACnCA,EAAO,OACPC,EAAaF,EAAI,QAASC,EAAO,KAAK,EAEtCA,EAAO,OACPE,EAASH,EAAIC,EAAO,KAAK,EAEzBA,EAAO,SACPC,EAAaF,EAAI,SAAU,EAAE,EACzBC,EAAO,kBACPE,EAASH,EAAI,sBAAsB,EAG/C,CAIA,IAAMI,GAAN,MAAMC,UAAiBC,EAAY,CAC/B,gBAAkB,kBAClB,cAAgB,CACZ,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,IACA,YACA,aACA,UACA,YACA,SACA,OACA,MACA,SACA,WACA,SACA,WACA,QACA,UACA,OACA,MACA,cACA,UACA,cACJ,EAEA,QAAS,CACLJ,EAAa,KAAM,KAAM,KAAK,QAAQ,IAAMK,EAAQ,KAAK,EAAG,EAAI,EAMhE,KAAK,KAAO,CAAC,EAKb,KAAK,aAML,KAAK,QAAU,KAAK,SAAW,KAAK,eAGpC,KAAK,WAAa,GAClB,KAAK,KAAO,KAAK,QAAQ,aAAe,EACxC,KAAK,MAAQ,EACb,KAAK,KAIL,KAAK,QAAU,CAAC,EAEhB,OAAW,CAACC,EAAYC,CAAW,IAAK,OAAO,QAAQZ,CAAO,EAE1D,KAAK,QAAQW,CAAU,EAAI,IAAIC,EAAY,IAAI,EAKnD,QAAWC,KAAQL,EAAS,mBACpBK,EAAK,QAAQ,OAAO,IAAM,GAC1BR,EAAa,KAAMQ,EAAM,KAAK,QAAQC,EAASD,EAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAG1E,CAEA,OAAO,UAAW,CACd,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAM0BZ,EAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mEAMaA,EAAO,YAAY;AAAA;AAAA;AAAA,gFAGNA,EAAO,aAAa,iBAAiBA,EAAO,aAAa;AAAA;AAAA;AAAA,+EAG1DA,EAAO,YAAY,iBAAiBA,EAAO,YAAY;AAAA;AAAA;AAAA,sGAGhCA,EAAO,QAAQ;AAAA,qEAChDA,EAAO,YAAY,iBAAiBA,EAAO,YAAY;AAAA;AAAA;AAAA,qEAGvDA,EAAO,YAAY,iBAAiBA,EAAO,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,mFAKzCA,EAAO,EAAE,oCAAoCA,EAAO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CASxI,CAKA,IAAI,QAAS,CACT,OAAOA,CACX,CAKA,OAAO,WAAY,CACf,OAAOA,CACX,CAKA,OAAO,UAAUc,EAAG,CAChBd,EAAS,OAAO,OAAOA,EAAQc,CAAC,CACpC,CAKA,IAAI,eAAgB,CAChB,MAAO,CACH,MAAO,GACP,MAAO,GACP,MAAO,EACP,MAAO,GACP,KAAM,GACN,OAAQ,GACR,SAAU,GACV,OAAQ,GACR,WAAY,EACZ,iBAAkB,GAClB,OAAQ,GACR,UAAW,GACX,WAAY,OACZ,kBAAmB,CAAE,MAAO,GAAI,KAAM,EAAG,CAC7C,CACJ,CAKA,IAAI,gBAAiB,CACjB,MAAO,CACH,GAAI,KACJ,IAAK,KACL,QAAS,GACT,MAAO,GACP,OAAQ,GACR,KAAM,GACN,KAAM,GACN,OAAQ,GACR,aAAc,CACV,MAAO,QACP,OAAQ,SACR,OAAQ,SACR,KAAM,OACN,QAAS,UACT,QAAS,OACT,QAAS,OACT,aAAc,QACd,gBAAiB,WACjB,WAAY,UACZ,UAAW,QACf,EACA,YAAa,GACb,QAAS,GACT,IAAK,MACL,cAAe,CAAC,GAAI,GAAI,GAAI,IAAK,GAAG,EACpC,YAAa,GACb,QAAS,CAAC,EACV,QAAS,CAAC,EACV,gBAAiB,GACjB,WAAY,GACZ,kBAAmB,GACnB,YAAa,EACb,UAAW,GACX,SAAU,GACV,OAAQ,GACR,WAAY,GACZ,cAAe,GACf,WAAY,GACZ,iBAAkB,GAClB,cAAe,GACf,oBAAqB,IACrB,aAAc,GACd,UAAW,GACX,aAAc,EAClB,CACJ,CAMA,IAAI,QAAS,CACT,OAAO,KAAK,UAAU,SAAS,gBAAgB,CACnD,CAMA,IAAI,cAAe,CACf,OAAO,KAAK,UAAU,SAAS,kBAAkB,CACrD,CAKA,OAAO,gBAAgBC,EAAM,CACzBhB,EAAUgB,CACd,CAKA,OAAO,kBAAkBC,EAAS,KAAM,CAChCA,IAAW,KACXjB,EAAU,CAAC,EAEX,OAAOA,EAAQiB,CAAM,CAE7B,CAKA,OAAO,mBAAoB,CACvB,OAAOjB,CACX,CAMA,eAAekB,EAAS,CACpB,IAAMC,EAAO,CAAC,EAEd,GAAI,OAAOD,GAAY,UAAY,CAAC,MAAM,QAAQA,CAAO,EACrD,QAAWE,KAAO,OAAO,KAAKF,CAAO,EAAG,CACpC,IAAMG,EAAM,OAAO,OAAO,CAAC,EAAG,KAAK,aAAa,EAChDA,EAAI,MAAQH,EAAQE,CAAG,EACvBC,EAAI,MAAQD,EACZD,EAAK,KAAKE,CAAG,CACjB,KAEA,SAAWC,KAAQJ,EAAS,CACxB,IAAIG,EAAM,OAAO,OAAO,CAAC,EAAG,KAAK,aAAa,EAC1C,OAAOC,GAAS,UAChBD,EAAI,MAAQC,EACZD,EAAI,MAAQC,GACL,OAAOA,GAAS,UACvBD,EAAM,OAAO,OAAOA,EAAKC,CAAI,EACxBD,EAAI,OACL,QAAQ,MAAM,4BAA6BC,CAAI,EAE9CD,EAAI,QACLA,EAAI,MAAQA,EAAI,QAGpB,QAAQ,MAAM,iDAAiD,EAEnEF,EAAK,KAAKE,CAAG,CACjB,CAEJ,OAAOF,CACX,CAMA,WAAW,oBAAqB,CAC5B,MAAO,CACH,OACA,cACA,YACA,aACA,eACA,YACA,kBACA,WACA,gBACA,iBACJ,CACJ,CAEA,IAAI,qBAAsB,CACtB,MAAO,CACH,QAAUJ,GAAM,KAAK,eAAeQ,EAAaR,CAAC,CAAC,EACnD,QAAUA,GAAMQ,EAAaR,CAAC,EAC9B,YAAcA,GAAM,OAAO,SAASA,CAAC,EACrC,QAAUA,GAAM,OAAO,SAASA,CAAC,CACrC,CACJ,CAGA,IAAI,OAAQ,CACR,OAAOS,EAAE,QAAS,IAAI,CAC1B,CAGA,IAAI,OAAQ,CACR,OAAOA,EAAE,QAAS,IAAI,CAC1B,CAGA,IAAI,OAAQ,CACR,OAAOA,EAAE,QAAS,IAAI,CAC1B,CAEA,IAAI,MAAO,CACP,OAAO,OAAO,SAAS,KAAK,aAAa,MAAM,CAAC,CACpD,CAEA,IAAI,KAAKC,EAAK,CACVpB,EAAa,KAAM,OAAQ,KAAK,mBAAmBoB,CAAG,CAAC,CAC3D,CAMA,WAAWC,EAAW,GAAO,CACrBA,GAAY,CAAC,KAAK,SACtB,KAAK,SAAS,EACd,KAAK,SAAS,EAAE,KAAK,IAAM,CACvB,KAAK,YAAY,CACrB,CAAC,EACL,CAKA,UAAW,CACP,IAAMP,EAAO,KAAK,QAAQ,QAC1B,KAAK,QAAQ,QAAU,CAAC,EACxB,KAAK,YAAY,EACjB,KAAK,QAAQ,QAAUA,CAC3B,CAEA,mBAAmBJ,EAAG,CAClB,IAAIY,EAAKZ,EACT,OAAI,KAAK,MAAQY,IACbA,EAAK,KAAK,QAEVA,EAAK,GAAK,CAACA,KACXA,EAAK,GAEFA,CACX,CAEA,SAAU,CACN,KAAK,MAAQ,KAAK,WAAW,EAC7B,KAAK,KAAO,KAAK,mBAAmB,KAAK,IAAI,EAG7CtB,EAAa,KAAK,UAAW,MAAO,KAAK,KAAK,EAC9C,KAAK,UAAU,MAAQ,GAAG,KAAK,IAAI,GACnC,KAAK,UAAU,SAAW,KAAK,MAAQ,CAC3C,CAEA,aAAc,CACV,KAAK,OAAO,CAChB,CAEA,mBAAoB,CACX,KAAK,QAAQ,iBAGd,KAAK,QAAQ,WACb,KAAK,QAAQ,eAAe,QAAQ,EAEpC,KAAK,QAAQ,eAAe,UAAU,EAE9C,CAEA,aAAc,CACV,KAAK,aAAa,CACtB,CAKA,eAAgB,CACZ,KAAK,QAAQ,QAAU,OAAO,SAAS,KAAK,cAAc,QAAQ,KAAK,cAAc,aAAa,EAAE,KAAK,EACzG,KAAK,eAAe,CACxB,CAKA,gBAAiB,CAGT,KAAK,QAAQ,UAAY,OAAO,SAAS,KAAK,cAAc,QAAQ,KAAK,cAAc,aAAa,EAAE,KAAK,GAE3G,KAAK,qBAAqB,EAG9B,IAAIuB,EAAa,KAAK,KACtB,KAAOA,EAAa,GAAK,KAAK,KAAO,KAAK,QAAQ,QAAU,KAAK,aAAa,GAC1EA,IAEAA,IAAe,KAAK,KAEpB,KAAK,KAAOA,EAGZ,KAAK,OAAO,IAAM,EAEV,CAAC,KAAK,QAAQ,aAAe,CAAC,KAAK,QAAQ,YAAY,iBACvD,KAAK,cAAc,eAAe,CAE1C,CAAC,CAET,CAEA,YAAa,CACTvB,EAAa,KAAM,MAAO,KAAK,QAAQ,GAAG,CAC9C,CAEA,oBAAqB,CACjB,KAAK,YAAY,CACrB,CAKA,sBAAuB,CACnB,GAAK,KAAK,cAGV,MAAO,KAAK,cAAc,WACtB,KAAK,cAAc,YAAY,KAAK,cAAc,SAAS,EAE/D,QAAWU,KAAK,KAAK,QAAQ,cACzBc,EAAgB,KAAK,cAAed,EAAGA,EAAGA,IAAM,KAAK,QAAQ,OAAO,EAE5E,CAEA,YAAa,CAIT,KAAK,MAAQ,KAAK,cAAc,OAAO,EAIvC,KAAK,SAAW,KAAK,cAAc,eAAe,EAIlD,KAAK,QAAU,KAAK,cAAc,cAAc,EAIhD,KAAK,QAAU,KAAK,cAAc,cAAc,EAIhD,KAAK,QAAU,KAAK,cAAc,cAAc,EAIhD,KAAK,cAAgB,KAAK,cAAc,qBAAqB,EAI7D,KAAK,UAAY,KAAK,cAAc,gBAAgB,EAEpD,KAAK,SAAW,KAAK,SAAS,KAAK,IAAI,EACvC,KAAK,QAAU,KAAK,QAAQ,KAAK,IAAI,EACrC,KAAK,QAAU,KAAK,QAAQ,KAAK,IAAI,EACrC,KAAK,QAAU,KAAK,QAAQ,KAAK,IAAI,EACrC,KAAK,cAAgB,KAAK,cAAc,KAAK,IAAI,EACjD,KAAK,SAAW,KAAK,SAAS,KAAK,IAAI,EAEvC,KAAK,SAAS,iBAAiB,QAAS,KAAK,QAAQ,EACrD,KAAK,QAAQ,iBAAiB,QAAS,KAAK,OAAO,EACnD,KAAK,QAAQ,iBAAiB,QAAS,KAAK,OAAO,EACnD,KAAK,QAAQ,iBAAiB,QAAS,KAAK,OAAO,EACnD,KAAK,cAAc,iBAAiB,SAAU,KAAK,aAAa,EAChE,KAAK,cAAc,gBAAgB,SAAU,KAAK,QAAQ,WAAW,EACrE,KAAK,UAAU,iBAAiB,QAAS,KAAK,QAAQ,EAEtD,QAAWE,KAAU,OAAO,OAAO,KAAK,OAAO,EAC3CA,EAAO,UAAU,EAIrB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAG1B,KAAK,SAAS,EAAE,QAAQ,IAAM,CAC1B,KAAK,YAAY,EAEjB,KAAK,YAAY,EACjB,KAAK,UAAU,IAAI,gBAAgB,EAEnC,KAAK,cAAc,EACnB,KAAK,eAAe,EAEpB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAEjB,KAAK,WAAa,GAElB,KAAK,IAAI,aAAa,CAC1B,CAAC,CACL,CAEA,eAAgB,CACZ,KAAK,UAAU,oBAAoB,QAAS,KAAK,QAAQ,EACzD,KAAK,SAAS,oBAAoB,QAAS,KAAK,OAAO,EACvD,KAAK,SAAS,oBAAoB,QAAS,KAAK,OAAO,EACvD,KAAK,SAAS,oBAAoB,QAAS,KAAK,OAAO,EACvD,KAAK,eAAe,oBAAoB,SAAU,KAAK,aAAa,EACpE,KAAK,WAAW,oBAAoB,QAAS,KAAK,QAAQ,EAE1D,QAAWA,KAAU,OAAO,OAAO,KAAK,OAAO,EAC3CA,EAAO,aAAa,CAE5B,CAMA,OAAOa,EAAO,CACV,IAAIC,EAAQ,KAEZ,QAAWV,KAAO,KAAK,QAAQ,QACvBA,EAAI,QAAUS,IACdC,EAAQV,GAGhB,OAAOU,CACX,CAEA,WAAWD,EAAOE,EAAM,CACpB,IAAMC,EAAI,KAAK,OAAOH,CAAK,EAC3B,OAAOG,EAAIA,EAAED,CAAI,EAAI,IACzB,CAEA,WAAWF,EAAOE,EAAMP,EAAK,CACzB,IAAMQ,EAAI,KAAK,OAAOH,CAAK,EACvBG,IACAA,EAAED,CAAI,EAAIP,EAElB,CAEA,gBAAiB,CACb,OAAO,KAAK,QAAQ,QAAQ,OAAQJ,GACzB,CAACA,EAAI,MACf,CACL,CAEA,eAAgB,CACZ,OAAO,KAAK,QAAQ,QAAQ,OAAQA,GACzBA,EAAI,SAAW,EACzB,CACL,CAEA,WAAWS,EAAOI,EAAS,GAAM,CAC7B,KAAK,WAAWJ,EAAO,SAAU,EAAK,EAGlCI,GAAQ,KAAK,YAAY,EAE7BC,EAAS,KAAM,mBAAoB,CAC/B,IAAKL,EACL,WAAY,SAChB,CAAC,CACL,CAEA,WAAWA,EAAOI,EAAS,GAAM,CAC7B,KAAK,WAAWJ,EAAO,SAAU,EAAI,EAGjCI,GAAQ,KAAK,YAAY,EAE7BC,EAAS,KAAM,mBAAoB,CAC/B,IAAKL,EACL,WAAY,QAChB,CAAC,CACL,CAMA,eAAgB,CACZ,IAAIM,EAAQ,EACZ,OAAI,KAAK,QAAQ,YAAc,KAAK,QAAQ,gBACxCA,IAEA,KAAK,QAAQ,YAAc,KAAK,QAAQ,gBAAkB,KAAK,QAAQ,eAAe,iBAAiB,GACvGA,IAEGA,CACX,CAKA,UAAW,CACP,OAAO,KAAK,aAAa,QAAQ,CACrC,CAMA,cAAcC,EAAc,GAAO,CAC/B,IAAIC,EAAM,EAEV,QAAWjB,KAAO,KAAK,QAAQ,QACvBgB,GAAehB,EAAI,QAGlBA,EAAI,MACLiB,IAIR,OAAI,KAAK,QAAQ,YAAc,KAAK,QAAQ,gBACxCA,IAGA,KAAK,QAAQ,QAAQ,QAAU,KAAK,QAAQ,YAC5CA,IAGA,KAAK,QAAQ,YAAc,KAAK,QAAQ,gBAAkB,KAAK,QAAQ,eAAe,iBAAiB,GACvGA,IAEGA,CACX,CAMA,aAAc,CAUV,GATA,KAAK,MAAM,MAAM,WAAa,SAC9B,KAAK,YAAY,EACb,KAAK,QAAQ,YAAc,KAAK,QAAQ,iBAGxC,KAAK,MAAM,MAAM,WAAa,WAI9B,CAAC,KAAK,UAAW,CACjB,IAAMC,EAAKC,EAAK,KAAM,UAAU,GAAKA,EAAK,KAAM,UAAU,EACtDD,IACA,KAAK,UAAYA,EAAG,aAE5B,CACA,KAAK,QAAQ,CACjB,CAEA,eAAgB,CACZ,IAAME,EAAM,KAAK,cAAc,0BAA0B,EACrD,KAAK,QAAQ,OACbC,EAAgBD,EAAK,QAAQ,GAE7B,KAAK,aAAa,EAClBpC,EAAaoC,EAAK,SAAU,EAAE,EAEtC,CAEA,gBAAiB,CACb,IAAME,EAAUC,EAAQ,KAAM,6BAA6B,EAC3D,QAAWC,KAAMF,EACTE,EAAG,UAAU,SAAS,eAAe,GAAKA,EAAG,UAAU,SAAS,YAAY,IAG5E,KAAK,QAAQ,SAAW,KAAK,QAAQ,iBACrCA,EAAG,UAAY,GAEfA,EAAG,gBAAgB,WAAW,EAG1C,CAEA,aAAc,CACV,KAAK,IAAI,aAAa,EAEtB,IAAMF,EAAUC,EAAQ,KAAM,6BAA6B,EAC3D,QAAWC,KAAMF,EAAS,CACtB,IAAMG,EAAYD,EAAG,aAAa,OAAO,EACzC,GACIA,EAAG,UAAU,SAAS,iBAAiB,GACtC,CAAC,KAAK,YAAcC,IAAc,KAAK,QAAQ,YAEhD,OAEA,KAAK,QAAQ,MAAQ,CAAC,KAAK,WAAWA,EAAW,QAAQ,EACzDzC,EAAawC,EAAI,YAAa,MAAM,EAEpCH,EAAgBG,EAAI,WAAW,CAEvC,CACJ,CAEA,mBAAoB,CAChB,KAAK,YAAY,CACrB,CAEA,OAAOJ,EAAK,CACH,MAAM,QAAQ,KAAK,YAAY,IAGpC,KAAK,IAAI,SAAS,EAClB,KAAK,aAAa,KAAKA,CAAG,EAC1B,KAAK,KAAO,KAAK,aAAa,MAAM,EACpC,KAAK,SAAS,EAClB,CAMA,UAAUM,EAAQ,KAAM3B,EAAM,KAAM,CAChC,GAAI,CAAC,MAAM,QAAQ,KAAK,YAAY,EAChC,OAGJ,IAAIL,EAAIgC,EACJC,EAAI5B,EACJ4B,IAAM,OACNA,EAAI,KAAK,QAAQ,QAAQ,CAAC,EAAE,OAE5BjC,IAAM,OACNA,EAAI,KAAK,aAAa,KAAK,aAAa,OAAS,CAAC,EAAEiC,CAAC,GAEzD,KAAK,IAAI,cAAcA,CAAC,IAAIjC,CAAC,EAAE,EAC/B,QAASkC,EAAI,EAAGA,EAAI,KAAK,aAAa,OAAQA,IAC1C,GAAI,KAAK,aAAaA,CAAC,EAAED,CAAC,IAAMjC,EAAG,CAC/B,KAAK,aAAa,OAAOkC,EAAG,CAAC,EAC7B,KACJ,CAEJ,KAAK,KAAO,KAAK,aAAa,MAAM,EACpC,KAAK,SAAS,CAClB,CAMA,aAAa7B,EAAM,KAAM,CACrB,OAAK,KAAK,QAAQ,eAGX,KAAK,QAAQ,eAAe,aAAaA,CAAG,EAFxC,CAAC,CAGhB,CAEA,SAAU,CACN,OAAO,KAAK,YAChB,CAEA,WAAY,CAEJ,KAAK,KAAK,SAAW,IAGzB,KAAK,KAAO,KAAK,aAAe,CAAC,EACjC,KAAK,WAAW,EACpB,CAOA,QAAQ8B,EAAM,CACV,IAAMC,EAAU,KAAK,QAAQ,aAAa,QACpCC,EAAU,KAAK,QAAQ,aAAa,QACtCF,IAAOC,CAAO,IACd,KAAK,KAAOD,EAAKC,CAAO,GAExBD,IAAOE,CAAO,IACd,KAAK,KAAO,KAAK,aAAeF,EAAKE,CAAO,EAEpD,CAEA,QAAQC,EAAK,KAAM,CACf,YAAK,KAAO,KAAK,aAAe,CAAC,EAC1B,KAAK,OAAOA,CAAE,CACzB,CAEA,OAAOA,EAAK,KAAM,CACd,KAAK,IAAI,QAAQ,EAGjB,IAAMC,EAAa,CAAC,KAAK,cAAc,OACvC,KAAK,QAAQ,EAEb,KAAK,SAAS,EAAE,QAAQ,IAAM,CACtB,KAAK,eAGT,KAAK,QAAQ,QAAUA,EAAa,KAAK,WAAW,EAAI,KAAK,SAAS,EAClED,GACAA,EAAG,EAEX,CAAC,CACL,CAKA,UAAW,CACP,IAAME,EAAY,IAAM,CAAC,KAAK,KAAK,QAAU,KAAK,UAAU,IAAI,UAAU,EACpEC,EAAQ,KAAK,MAGnB,OAAI,KAAK,MAAQ,KAAK,cAAgB,KAAK,UAEnC,CAAC,KAAK,QAAQ,QAAW,KAAK,QAAQ,QAAU,CAAC,KAAK,aACtD,KAAK,IAAI,eAAe,EACxBD,EAAU,EACH,IAAI,QAASE,GAAY,CAC5BA,EAAQ,CACZ,CAAC,IAGT,KAAK,IAAI,UAAU,EACnB,KAAK,QAAU,GACf,KAAK,UAAU,IAAI,YAAY,EAC/B,KAAK,UAAU,OAAO,WAAY,kBAAkB,EAEhD,KAAK,UAAU,EACV,KAAMC,GAAa,CAEhB,GAAI,MAAM,QAAQA,CAAQ,EACtB,KAAK,KAAOA,MACT,CAEH,GAAI,CAACA,EAAS,KAAK,QAAQ,aAAa,OAAO,EAAG,CAC9C,QAAQ,MACJ,mFACAA,CACJ,EACA,KAAK,QAAQ,IAAM,KACnB,MACJ,CAGA,KAAK,QAAU,OAAO,OAClB,KAAK,QACLA,EAAS,KAAK,QAAQ,aAAa,UAAU,GAAK,CAAC,CACvD,EAEA,KAAK,KAAOA,EAAS,KAAK,QAAQ,aAAa,OAAO,GAAK,CAAC,EAC5D,KAAK,KAAOA,EAAS,KAAK,QAAQ,aAAa,OAAO,CAC1D,CACA,KAAK,aAAe,KAAK,KAAK,MAAM,EACpC,KAAK,QAAQ,EAGT,KAAK,QAAQ,QAAQ,SAAW,GAAK,KAAK,aAAa,OACvD,KAAK,QAAQ,QAAU,KAAK,eAAe,OAAO,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,EAE5E,KAAK,QAAQ,QAAU,KAAK,eAAe,KAAK,QAAQ,OAAO,CAEvE,CAAC,EACA,MAAOC,GAAQ,CACZ,KAAK,IAAIA,CAAG,EACZH,EAAM,aACF,aACA,KAAK,QAAQ,cACTG,EAAI,SAAS,QAAQ,oBAAqB,EAAE,GAC5C1D,EAAO,YACf,EACA,KAAK,UAAU,IAAI,WAAY,kBAAkB,EACjDkC,EAAS,KAAM,iBAAkBwB,CAAG,CACxC,CAAC,EAEA,QAAQ,IAAM,CACXJ,EAAU,EACN,CAAC,KAAK,cAAgBC,EAAM,aAAa,YAAY,IAAM,KAAK,OAAO,QACvEA,EAAM,aAAa,aAAc,KAAK,OAAO,MAAM,EAEvD,KAAK,UAAU,OAAO,YAAY,EAClCnD,EAAa,KAAK,MAAO,gBAAiB,KAAK,KAAK,MAAM,EAC1D,KAAK,QAAU,EACnB,CAAC,EAEb,CAEA,UAAW,CACH,KAAK,UAGT,KAAK,KAAO,EAChB,CAEA,SAAU,CACF,KAAK,UAGT,KAAK,KAAO,KAAK,MACrB,CAEA,SAAU,CACF,KAAK,UAGT,KAAK,KAAO,KAAK,KAAO,EAC5B,CAEA,SAAU,CACF,KAAK,UAGT,KAAK,KAAO,KAAK,KAAO,EAC5B,CAEA,SAASuD,EAAO,CACZ,GAAIA,EAAM,OAAS,WAAY,CAC3B,IAAMxC,EAAMwC,EAAM,SAAWA,EAAM,IACnC,GAAIxC,IAAQ,IAAMA,IAAQ,QACtBwC,EAAM,eAAe,MAErB,OAER,CACA,KAAK,KAAO,OAAO,SAAS,KAAK,UAAU,KAAK,CACpD,CAEA,SAAU,CACN,IAAMvC,EAAM,KAAK,cAAc,oDAAoD,EACnF,OAAIA,EACOA,EAAI,aAAa,OAAO,EAE5B,KAAK,QAAQ,WACxB,CAEA,YAAa,CACT,IAAMA,EAAM,KAAK,cAAc,oDAAoD,EACnF,OAAIA,GACOA,EAAI,aAAa,WAAW,GAAK,EAGhD,CAEA,YAAa,CACT,IAAMwC,EAAU,CAAC,EACXC,EAASlB,EAAQ,KAAM,KAAK,eAAe,EACjD,QAAWmB,KAASD,EAChBD,EAAQE,EAAM,QAAQ,IAAI,EAAIA,EAAM,MAExC,OAAOF,CACX,CAEA,cAAe,CACX,IAAMC,EAASlB,EAAQ,KAAM,KAAK,eAAe,EACjD,QAAWmB,KAASD,EAChBC,EAAM,MAAQ,GAElB,KAAK,WAAW,CACpB,CAEA,YAAa,CAKT,GAJA,KAAK,IAAI,aAAa,EAEtB,KAAK,KAAO,EAER,KAAK,QAAQ,OACb,KAAK,OAAO,MACT,CACH,KAAK,KAAO,KAAK,cAAc,MAAM,GAAK,CAAC,EAG3C,IAAMD,EAASlB,EAAQ,KAAM,KAAK,eAAe,EACjD,QAAWmB,KAASD,EAAQ,CACxB,IAAMf,EAAQgB,EAAM,MACpB,GAAIhB,EAAO,CACP,IAAMiB,EAAOD,EAAM,QAAQ,KAC3B,KAAK,KAAO,KAAK,KAAK,OAAQzC,GACd,GAAGA,EAAK0C,CAAI,CAAC,GACd,YAAY,EAAE,QAAQjB,EAAM,YAAY,CAAC,IAAM,EAC7D,CACL,CACJ,CACA,KAAK,YAAY,EAEjB,IAAM1B,EAAM,KAAK,cAAc,oDAAoD,EAC/E,KAAK,QAAQ,MAAQA,EACrB,KAAK,SAAS,EAEd,KAAK,WAAW,CAExB,CACJ,CAMA,SAAS4C,EAAU,KAAM,CACrB,KAAK,IAAI,WAAW,EAEpB,IAAI5C,EAAM4C,EAGV,GAAI5C,GAAO,KAAK,WAAWA,EAAI,aAAa,OAAO,EAAG,QAAQ,EAAG,CAC7D,KAAK,IAAI,kDAAkD,EAC3D,MACJ,CACA,GAAI,KAAK,QAAQ,eAAe,WAAY,CACxC,KAAK,IAAI,oCAAoC,EAC7C,MACJ,CACA,GAAI,KAAK,QAAS,CACd,KAAK,IAAI,mCAAmC,EAC5C,MACJ,CAGA,GAAIA,IAAQ,KAAM,CAEd,IAAM6C,EAAejC,GAAM,CAAC,gBAAiB,aAAc,sBAAsB,EAAE,SAASA,CAAC,EAEvFU,EAAUC,EAAQ,KAAM,yBAAyB,EACvD,QAAWC,KAAMF,EAET,CAAC,GAAGE,EAAG,SAAS,EAAE,KAAKqB,CAAW,GAGlCrB,IAAOxB,GACPwB,EAAG,aAAa,YAAa,MAAM,EAKvC,CAACxB,EAAI,aAAa,WAAW,GAAKA,EAAI,aAAa,WAAW,IAAM,OACpEA,EAAI,aAAa,YAAa,WAAW,EAClCA,EAAI,aAAa,WAAW,IAAM,YACzCA,EAAI,aAAa,YAAa,YAAY,EACnCA,EAAI,aAAa,WAAW,IAAM,cACzCA,EAAI,aAAa,YAAa,MAAM,CAE5C,MAEIA,EAAM,KAAK,cAAc,oDAAoD,EAGjF,GAAI,KAAK,QAAQ,OAEb,KAAK,SAAS,EAAE,QAAQ,IAAM,CAC1B,KAAK,WAAW,CACpB,CAAC,MACE,CACH,IAAM8C,EAAO9C,EAAMA,EAAI,aAAa,WAAW,EAAI,OACnD,GAAI8C,IAAS,OAAQ,CACjB,IAAMC,EAAQ,CAAC,EAGf,KAAK,cAAc,KAAMC,IACrB,KAAK,KAAK,KAAMC,GACR,KAAK,UAAUD,CAAK,IAAM,KAAK,UAAUC,CAAK,GAC9CF,EAAM,KAAKE,CAAK,EACT,IAEJ,EACV,EACMF,EAAM,SAAW,KAAK,KAAK,OACrC,EAED,KAAK,KAAOA,CAChB,KAAO,CACH,IAAMtC,EAAQT,EAAI,aAAa,OAAO,EACtC,KAAK,KAAK,KAAK,CAACkD,EAAGC,IAAM,CACrB,GAAI,CAAC,MAAMD,EAAEzC,CAAK,CAAC,GAAK,CAAC,MAAM0C,EAAE1C,CAAK,CAAC,EACnC,OAAOqC,IAAS,YAAcI,EAAEzC,CAAK,EAAI0C,EAAE1C,CAAK,EAAI0C,EAAE1C,CAAK,EAAIyC,EAAEzC,CAAK,EAE1E,IAAM2C,EAAON,IAAS,YAAcI,EAAEzC,CAAK,EAAE,YAAY,EAAI0C,EAAE1C,CAAK,EAAE,YAAY,EAC5E4C,EAAOP,IAAS,YAAcK,EAAE1C,CAAK,EAAE,YAAY,EAAIyC,EAAEzC,CAAK,EAAE,YAAY,EAElF,OAAQ,GAAM,CACV,KAAK2C,EAAOC,EACR,MAAO,GACX,KAAKD,EAAOC,EACR,MAAO,GACX,KAAKD,IAASC,EACV,MAAO,EACf,CACJ,CAAC,CACL,CACA,KAAK,WAAW,CACpB,CACJ,CAEA,MAAMC,EAAYC,EAAS,CACvB,IAAMvD,EAAM,KAAK,cAAc,6BAA6BsD,CAAU,GAAG,EACnEE,EAAMD,IAAY,YAAc,OAASA,IAAY,aAAe,YAAc,aACxFvD,GAAK,aAAa,YAAawD,CAAG,EAClC,KAAK,SAASxD,CAAG,CACrB,CAEA,QAAWsD,GAAe,KAAK,MAAMA,EAAY,WAAW,EAC5D,SAAYA,GAAe,KAAK,MAAMA,EAAY,YAAY,EAC9D,SAAYA,GAAe,KAAK,MAAMA,EAAY,MAAM,EAExD,WAAY,CACR,GAAI,CAAC,KAAK,QAAQ,IACd,OAAO,IAAI,QAAQ,CAAClB,EAASqB,IAAWA,EAAO,YAAY,CAAC,EAGhE,IAAIC,EAAO,OAAO,SAAS,KAEtBA,EAAK,MAAM,GAAG,EAAE,IAAI,EAAE,SAAS,GAAG,IACnCA,GAAQA,EAAK,SAAS,GAAG,EAAI,GAAK,KAEtC,IAAMC,EAAM,IAAI,IAAI,KAAK,QAAQ,IAAKD,CAAI,EACtCE,EAAS,CACT,EAAG,KAAK,IAAI,CAChB,EACA,OAAI,KAAK,QAAQ,SAEbA,EAAO,KAAK,QAAQ,aAAa,KAAK,EAAI,KAAK,KAAO,EACtDA,EAAO,KAAK,QAAQ,aAAa,MAAM,EAAI,KAAK,QAAQ,QACpD,KAAK,QAAQ,SAAQA,EAAO,KAAK,QAAQ,aAAa,MAAM,EAAI,KAAK,WAAW,GACpFA,EAAO,KAAK,QAAQ,aAAa,IAAI,EAAI,KAAK,QAAQ,GAAK,GAC3DA,EAAO,KAAK,QAAQ,aAAa,OAAO,EAAI,KAAK,WAAW,EAGxD,KAAK,OAAO,KAAK,QAAQ,aAAa,SAAS,IAC/CA,EAAS,OAAO,OAAOA,EAAQ,KAAK,KAAK,KAAK,QAAQ,aAAa,SAAS,CAAC,IAIrFC,EAAkBF,EAAKC,CAAM,EAEtB,MAAMD,CAAG,EAAE,KAAMtB,GAAa,CACjC,IAAMyB,EAAW,IAAI,MAAMzB,EAAS,YAAczD,EAAO,YAAY,EACrE,GAAI,CAACyD,EAAS,GAEV,MAAAyB,EAAS,SAAWzB,EACdyB,EAEV,OAAOzB,EACF,MAAM,EACN,KAAK,EACL,MAAOC,GAAQ,CACZ,IAAIyB,EAAQzB,EACZ,MAAK,KAAK,QAAQ,QACdyB,EAAQD,GAEZC,EAAM,SAAW1B,EACX0B,CACV,CAAC,CACT,CAAC,CACL,CAEA,aAAc,CACV,KAAK,IAAI,cAAc,EAEnB,KAAK,QAAQ,MAAQ,KAAK,QAAQ,aAClC,KAAK,QAAQ,YAAY,WAAW,EAGxC,IAAIC,EAEJ,KAAK,aAAa,EACd,KAAK,QAAQ,cAEbA,EAAe,KAAK,cAAc,sCAAsC,KAAK,QAAQ,WAAW,IAAI,GAGpGA,EACA,KAAK,SAASA,CAAY,EAE1B,KAAK,WAAW,EAGpB,KAAK,aAAa,CACtB,CAOA,cAAe,CACX,KAAK,IAAI,eAAe,EAExB,IAAMC,EAAQ,KAAK,MACnB,KAAK,oBAAoBA,CAAK,EAC9B,KAAK,oBAAoBA,CAAK,EAE1B,KAAK,QAAQ,WAAa,KAAK,QAAQ,eACvC,KAAK,QAAQ,cAAc,cAAcrF,EAAO,YAAY,EAGhEkC,EAAS,KAAM,gBAAgB,CACnC,CAEA,cAAe,CACX,KAAK,IAAI,eAAe,EAExB,IAAMoD,EAAQ,KAAK,MACbC,EAAKD,EAAM,cAAc,IAAI,EACnCA,EAAM,gBAAgB,QAAQ,EAC9BlF,EAAamF,EAAI,UAAW,KAAK,cAAc,EAAI,CAAC,EACpDD,EAAM,MAAM,QAAU,EAC1B,CAMA,oBAAoBD,EAAO,CAEvB,IAAMG,EAAiB,KAAK,YACtBC,EAAc,KAAK,MAAOD,EAAiB,KAAK,cAAc,EAAI,EAAK,CAAC,EAE1EE,EAAM,EACNpD,EAGJA,EAAKqD,EAAG,IAAI,EACZ,KAAK,UAAYrD,EACjBA,EAAG,aAAa,OAAQ,KAAK,EAC7BA,EAAG,aAAa,gBAAiB,GAAG,EACpCA,EAAG,aAAa,QAAS,iBAAiB,EAG1C,IAAIsD,EAAWP,EAAM,cAAc,uBAAuB,EACrDO,IACDA,EAAWD,EAAG,IAAI,EAClBN,EAAM,cAAc,IAAI,EAAE,YAAYO,CAAQ,GAG9C,KAAK,QAAQ,YAAc,KAAK,QAAQ,gBACxC,KAAK,QAAQ,eAAe,gBAAgBtD,CAAE,EAE9C,KAAK,QAAQ,YAAc,KAAK,QAAQ,gBAAkB,KAAK,QAAQ,eAAe,iBAAiB,GACvG,KAAK,QAAQ,eAAe,gBAAgBA,CAAE,EAIlDoD,EAAM,EACN,IAAIG,EAAa,EAEjB,QAAW1F,KAAU,KAAK,QAAQ,QAAS,CACvC,GAAIA,EAAO,KACP,SAEJ,IAAM2F,EAASJ,EAAM,KAAK,cAAc,EAClC9C,EAAK+C,EAAG,IAAI,EAClB/C,EAAG,aAAa,QAAS,KAAK,EAC9BA,EAAG,aAAa,OAAQ,qBAAqB,EAC7CA,EAAG,aAAa,gBAAiB,GAAGkD,CAAM,EAAE,EAC5ClD,EAAG,aAAa,KAAMnC,EAAQ,SAAS,CAAC,EACpC,KAAK,QAAQ,MACbmC,EAAG,aAAa,YAAa,MAAM,EAEvCA,EAAG,aAAa,QAASzC,EAAO,KAAK,EACjC,KAAK,QAAQ,gBAAkB,KAAK,QAAQ,YAC5CC,EAAawC,EAAI,kBAAmBzC,EAAO,YAAc,EAAE,EAG/D,IAAM4F,EAAgBC,EAAa7F,EAAO,MAAOyF,EAAU,EAAI,EAAI,GACnEhD,EAAG,QAAQ,SAAW,GAAGmD,CAAa,GACtC9F,GAAsB2C,EAAIzC,CAAM,EAChCyC,EAAG,SAAW,EACdA,EAAG,YAAczC,EAAO,MAExB,IAAI8F,EAAI,EAGR,GAAI,KAAK,QAAQ,UAAY,KAAK,QAAQ,eAAgB,CACtD,IAAMC,EAAoB,KAAK,IAAIV,EAAiBK,EAAYJ,CAAW,EAC3EQ,EAAI,KAAK,QAAQ,eAAe,YAC5BrD,EACAzC,EACA,OAAO,SAASyC,EAAG,QAAQ,QAAQ,EACnCsD,CACJ,CACJ,MACID,EAAI,KAAK,IAAI,OAAO,SAASrD,EAAG,QAAQ,QAAQ,EAAG,OAAO,SAASA,EAAG,aAAa,OAAO,CAAC,CAAC,EAGhGxC,EAAawC,EAAI,QAASqD,CAAC,EACvB9F,EAAO,OACPyC,EAAG,aAAa,SAAU,EAAE,EAE5BiD,GAAcI,EAId,KAAK,QAAQ,SAAW,KAAK,QAAQ,kBACrC,KAAK,QAAQ,iBAAiB,oBAAoBrD,CAAE,EAGxDN,EAAG,YAAYM,CAAE,EACjB8C,GACJ,CAGA,GAAIG,EAAaL,EAAgB,CAC7B,IAAMW,EAAcxD,EAAQL,EAAI,oCAAoC,EACpE,GAAI6D,EAAY,OAAQ,CACpB,IAAMC,EAAUD,EAAYA,EAAY,OAAS,CAAC,EAClD1D,EAAgB2D,EAAS,OAAO,CACpC,CACJ,CAUA,GAPI,KAAK,QAAQ,QAAQ,QAAU,KAAK,QAAQ,YAC5C,KAAK,QAAQ,WAAW,iBAAiB9D,CAAE,EAG/C+C,EAAM,aAAa/C,EAAI+C,EAAM,cAAc,oBAAoB,CAAC,EAG5DA,EAAM,YAAcG,EAAgB,CACpC,KAAK,IAAI,6BAA6BH,EAAM,WAAW,MAAMG,CAAc,EAAE,EAC7E,IAAMa,EAAiB,KAAK,YAAc,KAAK,YAC3CC,EAAOjB,EAAM,YAAcG,EAAiBa,EAC5C,KAAK,QAAQ,YAAc,KAAK,QAAQ,iBACxCC,GAAQD,GAGZ,IAAME,EAAc5D,EAAQL,EAAI,WAAW,EAE3C,QAAWM,KAAM2D,EAAa,CAI1B,GAHIC,EAAS5D,EAAI,kBAAkB,GAG/B0D,GAAQ,EACR,SAEJ,IAAMG,EAAc,OAAO,SAAS7D,EAAG,aAAa,OAAO,CAAC,EACtD8D,EAAW9D,EAAG,QAAQ,SAAW,OAAO,SAASA,EAAG,QAAQ,QAAQ,EAAI,EAC9E,GAAI6D,EAAcC,EAAU,CACxB,IAAIC,EAAWF,EAAcH,EACzBK,EAAWD,IACXC,EAAWD,GAEfJ,GAAQG,EAAcE,EACtBvG,EAAawC,EAAI,QAAS+D,CAAQ,CACtC,CACJ,CACJ,CAGI,KAAK,QAAQ,MAAQ,KAAK,QAAQ,aAClC,KAAK,QAAQ,YAAY,kBAAkB,EAI/C,IAAMC,EAAejE,EAAQL,EAAI,aAAa,EAC9C,QAAWuE,KAAeD,EACtBC,EAAY,iBAAiB,QAAS,IAAM,KAAK,SAASA,CAAW,CAAC,EAG1EzG,EAAa,KAAK,MAAO,gBAAiB,KAAK,cAAc,EAAI,CAAC,CACtE,CAEA,oBAAoBiF,EAAO,CACvB,IAAIK,EAAM,EACNpD,EAGJA,EAAKqD,EAAG,IAAI,EACZ,KAAK,UAAYrD,EACjBA,EAAG,aAAa,OAAQ,KAAK,EAC7BA,EAAG,aAAa,gBAAiB,GAAG,EACpCA,EAAG,aAAa,QAAS,iBAAiB,EACrC,KAAK,QAAQ,QACdA,EAAG,aAAa,SAAU,EAAE,EAG5B,KAAK,QAAQ,YAAc,KAAK,QAAQ,gBACxC,KAAK,QAAQ,eAAe,gBAAgBA,CAAE,EAE9C,KAAK,QAAQ,YAAc,KAAK,QAAQ,gBAAkB,KAAK,QAAQ,eAAe,iBAAiB,GACvG,KAAK,QAAQ,eAAe,gBAAgBA,CAAE,EAGlD,QAAWnC,KAAU,KAAK,QAAQ,QAAS,CACvC,GAAIA,EAAO,KACP,SAEJ,IAAM2F,EAASJ,EAAM,KAAK,cAAc,EAClCoB,EAAYzB,EAAM,cAAc,wCAAwCS,CAAM,IAAI,EACxF,GAAI,CAACgB,EAAW,CACZ,QAAQ,KAAK,uBAAwBhB,CAAM,EAC3C,QACJ,CACA,IAAMlD,EAAK+C,EAAG,IAAI,EAClB/C,EAAG,aAAa,gBAAiB,GAAGkD,CAAM,EAAE,EAE5C,IAAMiB,EAAS,KAAK,oBAAoB5G,EAAQ2G,CAAS,EACpD,KAAK,QAAQ,OAGdC,EAAO,SAAW,EAFlBnE,EAAG,SAAW,EAKdzC,EAAO,QACPyC,EAAG,aAAa,SAAU,EAAE,EAGhCA,EAAG,YAAYmE,CAAM,EACrBzE,EAAG,YAAYM,CAAE,EACjB8C,GACJ,CAGI,KAAK,QAAQ,QAAQ,QAAU,KAAK,QAAQ,YAC5C,KAAK,QAAQ,WAAW,iBAAiBpD,CAAE,EAG/C+C,EAAM,aAAa/C,EAAI+C,EAAM,cAAc,oBAAoB,CAAC,GAE5D,OAAO,KAAK,QAAQ,qBAAwB,UAAY,KAAK,QAAQ,iBACrE,KAAK,QAAQ,oBAAsB,GAGvC,IAAM2B,EAAerE,EAAQL,EAAI,KAAK,eAAe,EACrD,QAAWpC,KAAM8G,EAAc,CAC3B,IAAMC,EAAY,UAAU,KAAK/G,EAAG,OAAO,EAAI,SAAW,QACpDgH,EAAeC,EAAUC,GAAM,CACjC,IAAMjG,EAAMiG,EAAE,SAAWA,EAAE,IACrBC,EAAmB,CAAC,KAAK,QAAQ,eAAiB,CAAC,KAAK,cAAc,KAAMtE,GAAMA,IAAM5B,CAAG,GAC7FA,IAAQ,IAAMA,IAAQ,SAAWkG,GAAoBD,EAAE,OAAS,WAChE,KAAK,WAAW,KAAK,IAAI,CAEjC,EAAG,KAAK,QAAQ,mBAAmB,EACnClH,EAAG,iBAAiB+G,EAAWC,CAAY,CAC/C,CACJ,CAEA,oBAAoB/G,EAAQ2G,EAAW,CACnC,IAAMQ,EAAWnH,EAAO,aAAe,SACjC4G,EAASO,EAAW3B,EAAG,QAAQ,EAAIA,EAAG,OAAO,EACnD,GAAI2B,EAAU,CACV,GAAI,CAAC,MAAM,QAAQnH,EAAO,UAAU,EAAG,CAEnC,IAAMoH,EAAe,CAAC,GAAG,IAAI,KAAK,KAAK,MAAQ,CAAC,GAAG,IAAKH,GAAMA,EAAEjH,EAAO,KAAK,CAAC,CAAC,CAAC,EAC1E,OAAQW,GAAMA,CAAC,EACf,KAAK,EACVX,EAAO,WAAa,CAACA,EAAO,mBAAqB,KAAK,cAAc,iBAAiB,EAAE,OACnFoH,EAAa,IAAKH,IAAO,CAAE,MAAOA,EAAG,KAAMA,CAAE,EAAE,CACnD,CACJ,CAEA,QAAWA,KAAKjH,EAAO,WAAY,CAC/B,IAAMqH,EAAM7B,EAAG,QAAQ,EACvB6B,EAAI,MAAQJ,EAAE,MACdI,EAAI,KAAOJ,EAAE,KAETL,aAAkB,mBAClBA,EAAO,IAAIS,CAAG,CAEtB,CACJ,MAEIT,EAAO,KAAO,OACdA,EAAO,UAAY,SACnBA,EAAO,aAAe,MACtBA,EAAO,WAAa,GAGxB,OAAAA,EAAO,QAAQ,KAAO5G,EAAO,MAC7B4G,EAAO,GAAKtG,EAAQ,YAAY,EAEhCsG,EAAO,aAAa,kBAAmBD,EAAU,aAAa,IAAI,CAAC,EAC5DC,CACX,CAMA,YAAa,CACT,KAAK,IAAI,aAAa,EACtB,IAAIzE,EACAiD,EACAG,EACEnC,EAAQoC,EAAG,OAAO,EAExB,KAAK,KAAK,QAAQ,CAACtE,EAAM2B,IAAM,CAC3BV,EAAKqD,EAAG,IAAI,EACZvF,EAAakC,EAAI,OAAQ,KAAK,EAC9BlC,EAAakC,EAAI,SAAU,EAAE,EAC7BlC,EAAakC,EAAI,gBAAiBU,EAAI,CAAC,EACvCV,EAAG,SAAW,EAEV,KAAK,QAAQ,YAAc,KAAK,QAAQ,gBACxC,KAAK,QAAQ,eAAe,cAAcA,CAAE,EAG5C,KAAK,QAAQ,YACb,KAAK,QAAQ,gBACb,KAAK,QAAQ,eAAe,iBAAiB,GAE7C,KAAK,QAAQ,eAAe,cAAcA,CAAE,EAI5C,KAAK,QAAQ,SACbA,EAAG,UAAU,IAAI,eAAe,EAEhCmF,EAAGnF,EAAI,QAAUoF,GAAO,CAChB,KAAK,QAAQ,gBACb,KAAK,QAAQ,eAAe,cAAc,EAE9CC,GAAYD,EAAG,cAAe,aAAa,EACvC,KAAK,QAAQ,gBACb,KAAK,QAAQ,eAAe,gBAAgB,CAEpD,CAAC,GAGLhC,EAAM,EAEN,QAAWvF,KAAU,KAAK,QAAQ,QAAS,CAKvC,GAJKA,GACD,QAAQ,MAAM,sBAAuB,KAAK,QAAQ,OAAO,EAGzDA,EAAO,KAAM,CACTkB,EAAKlB,EAAO,KAAK,IAEbA,EAAO,OAAS,QAChBE,EAASiC,EAAIjB,EAAKlB,EAAO,KAAK,CAAC,EAE/BmC,EAAG,aAAanC,EAAO,KAAMkB,EAAKlB,EAAO,KAAK,CAAC,GAGvD,MACJ,CAUA,GATAoF,EAAKI,EAAG,IAAI,EACZJ,EAAG,aAAa,OAAQ,UAAU,EAClCA,EAAG,aAAa,gBAAiB,GAAGG,CAAG,GAAG,KAAK,cAAc,CAAC,EAAE,EAChEzF,GAAsBsF,EAAIpF,CAAM,EAEhCoF,EAAG,aAAa,YAAapF,EAAO,KAAK,EACzCoF,EAAG,SAAW,GAGVpF,EAAO,UAAY,KAAK,QAAQ,eAChCE,EAASkF,EAAI,iBAAiB,EAC9B,KAAK,QAAQ,eAAe,kBAAkBA,EAAIpF,EAAQkB,EAAM2B,CAAC,MAC9D,CAEH,IAAMlC,EAAIO,EAAKlB,EAAO,KAAK,GAAK,GAC5ByH,EAEJ,OAAQzH,EAAO,UAAW,CACtB,IAAK,YACDyH,EAAK9G,EAAE,YAAY,EACnB,MACJ,IAAK,YACD8G,EAAK9G,EAAE,YAAY,EACnB,MACJ,QACI8G,EAAK9G,EACL,KACR,CACA,GAAIX,EAAO,QAKP,GAHIA,EAAO,qBAAuB,SAAcyH,IAAO,IAAMA,IAAO,QAChEA,EAAK,GAAGzH,EAAO,kBAAkB,IAEjC,OAAOA,EAAO,QAAW,UAAYyH,EACrCrC,EAAG,UAAYsC,EAEX1H,EAAO,OACP,OAAO,OACH,CACI,GAAIW,EACJ,IAAK8G,CACT,EACAvG,CACJ,CACJ,UACOlB,EAAO,kBAAkB,SAAU,CAC1C,IAAMqB,EAAMrB,EAAO,OAAO,KAAK,KAAM,CAAE,OAAAA,EAAQ,QAASkB,EAAM,SAAUuG,EAAI,GAAArC,EAAI,GAAAjD,CAAG,CAAC,EACpFiD,EAAG,UAAY/D,GAAOoG,GAAM9G,CAChC,OAEAyE,EAAG,YAAcqC,CAEzB,CACAtF,EAAG,YAAYiD,CAAE,EACjBG,GACJ,CAGI,KAAK,QAAQ,QAAQ,QAAU,KAAK,QAAQ,YAC5C,KAAK,QAAQ,WAAW,cAAcpD,EAAIjB,CAAI,EAGlDkC,EAAM,YAAYjB,CAAE,CACxB,CAAC,EAEDiB,EAAM,aAAa,OAAQ,UAAU,EAGrC,IAAMuE,EAAO,KAAK,MAClBvE,EAAM,aAAa,aAAcuE,EAAK,aAAa,YAAY,CAAC,EAChE,KAAK,MAAM,aAAavE,EAAOuE,CAAI,EAE/B,KAAK,QAAQ,aACb,KAAK,QAAQ,YAAY,cAAc,EAG3C,KAAK,SAAS,EAEV,KAAK,QAAQ,gBACb,KAAK,QAAQ,eAAe,gBAAgBvE,CAAK,EAGrD,KAAK,KAAK,QAAU,KAAK,UAAU,OAAO,UAAU,EAEpDrB,EAAS,KAAM,cAAc,CACjC,CAEA,UAAW,CACP,KAAK,IAAI,UAAU,EAEnB,IAAM6F,EAAQ,KAAK,aAAa,EAC1BC,EAAI,KAAK,MAAQ,EACjBzE,EAAQ,KAAK,MACb+B,EAAQ,KAAK,MACb2C,EAAWtF,EAAQY,EAAO,IAAI,EAGpC,KAAK,MAAQ,KAAK,WAAW,EAE7B,IAAI2E,EACAC,EAAOH,EAAI,KAAK,QAAQ,QACxBI,EAAMD,EAAO,KAAK,QAAQ,QAAU,EAEpCA,EAAOJ,IACPI,EAAOJ,GAENA,IACDK,EAAM,GAMV,QAAW9F,KAAM2F,EAAU,CACvB,GAAI,KAAK,QAAQ,OAAQ,CACrBxF,EAAgBH,EAAI,QAAQ,EAC5B,QACJ,CACA4F,EAAQ,OAAOG,EAAa/F,EAAI,eAAe,CAAC,EAC5C4F,EAAQC,GAAQD,EAAQE,EACxBhI,EAAakC,EAAI,SAAU,EAAE,EAE7BG,EAAgBH,EAAI,QAAQ,CAEpC,CAEI,KAAK,QAAQ,YAAc,KAAK,QAAQ,gBACxC,KAAK,QAAQ,eAAe,gBAAgBiB,CAAK,EAIjD,KAAK,QAAQ,aACb,KAAK,QAAQ,YAAY,cAAc,EAIvC,KAAK,WACL,KAAK,SAAS,SAAW,KAAK,MAAQ,EACtC,KAAK,QAAQ,SAAW,KAAK,MAAQ,EACrC,KAAK,QAAQ,SAAW,KAAK,MAAQ,KAAK,MAC1C,KAAK,QAAQ,SAAW,KAAK,MAAQ,KAAK,OAE9C+B,EAAM,cAAc,SAAS,EAAE,YAAc8C,EAAI,SAAS,EAC1D9C,EAAM,cAAc,UAAU,EAAE,YAAc6C,EAAK,SAAS,EAC5D7C,EAAM,cAAc,WAAW,EAAE,YAAc,GAAG,KAAK,aAAa,CAAC,GACrEA,EAAM,gBAAgB,SAAU,KAAK,QAAQ,eAAiB,KAAK,QAAQ,QAAU,KAAK,aAAa,CAAC,CAC5G,CAKA,YAAa,CACT,OAAO,KAAK,KAAK,KAAK,aAAa,EAAI,KAAK,QAAQ,OAAO,CAC/D,CAKA,cAAe,CACX,OAAI,KAAK,QAAQ,OACN,KAAK,OAAO,KAAK,QAAQ,aAAa,eAAe,GAAK,EAE9D,KAAK,KAAK,MACrB,CACJ,EAEOgD,EAAQhI,GCl6Df,IAAMiI,GAAN,KAAiB,CAIb,YAAYC,EAAM,CACd,KAAK,KAAOA,CAChB,CAEA,WAAY,CAAC,CAEb,cAAe,CAAC,CAOhB,YAAYC,EAAO,CACX,KAAK,KAAKA,EAAM,IAAI,EAAE,GACtB,KAAK,KAAKA,EAAM,IAAI,EAAE,EAAEA,CAAK,CAErC,CACJ,EAEOC,EAAQH,GCRf,IAAMI,GAAN,cAA4BC,CAAW,CACnC,YAAYC,EAAM,CACd,MAAMA,CAAI,EACV,KAAK,WAAa,EACtB,CAKA,cAAcC,EAAa,CACvB,IAAMD,EAAO,KAAK,KACZE,EAAQF,EAAK,MACbG,EAAOC,EAAQJ,EAAM,6BAA6B,EAExD,QAAWK,KAAOF,EAAM,CACpB,GAAIG,EAASD,EAAK,kBAAkB,EAChC,SAGJ,IAAME,EAAU,SAAS,cAAc,KAAK,EAC5CC,EAASD,EAAS,YAAY,EAC9BA,EAAQ,UAAYN,EAGpBI,EAAI,YAAYE,CAAO,EAGvB,IAAIE,EAAS,EACTC,EAAS,EACTC,EAAiB,EACjBC,EAAM,EAEJC,EAAoBC,GAAM,CAC5B,GAAIA,EAAE,QAAUF,EACZ,OAEJ,IAAMG,EAAWL,GAAUI,EAAE,QAAUL,GACnCJ,EAAI,QAAQ,UAAYU,EAAW,OAAO,SAASV,EAAI,QAAQ,QAAQ,GACvEW,EAAaX,EAAK,QAASU,CAAQ,CAE3C,EAGME,EAAiB,IAAM,CACzBjB,EAAK,IAAI,gBAAgB,EAGzB,WAAW,IAAM,CACb,KAAK,WAAa,EACtB,EAAG,CAAC,EAEJkB,EAAYX,EAAS,mBAAmB,EACpCP,EAAK,QAAQ,UACbK,EAAI,UAAY,IAEpBA,EAAI,MAAM,SAAW,SAGrBc,EAAI,SAAU,YAAaN,CAAgB,EAC3CM,EAAI,SAAU,UAAWF,CAAc,EAEvCG,EAASpB,EAAM,gBAAiB,CAC5B,IAAKqB,EAAahB,EAAK,OAAO,EAC9B,MAAOgB,EAAahB,EAAK,OAAO,CACpC,CAAC,CACL,EAGAiB,EAAGf,EAAS,QAAUO,GAAM,CACxBA,EAAE,gBAAgB,CACtB,CAAC,EAEDQ,EAAGf,EAAS,YAAcO,GAAM,CAC5BA,EAAE,gBAAgB,EAElB,KAAK,WAAa,GAElB,IAAMS,EAAST,EAAE,OAEXU,EADcpB,EAAQJ,EAAM,oBAAoB,EACtB,OAAQK,GAC7B,CAACA,EAAI,aAAa,QAAQ,CACpC,EACKoB,EAAcD,EAAY,UAAWE,GAAWA,IAAWH,EAAO,UAAU,EAClFvB,EAAK,IAAI,eAAe,EAExBQ,EAASD,EAAS,mBAAmB,EAGrCoB,EAAgBtB,EAAK,WAAW,EAGhCA,EAAI,MAAM,SAAW,UAGrBE,EAAQ,MAAM,OAAS,GAAGL,EAAM,aAAe,CAAC,KAGhDO,EAASK,EAAE,QACXJ,EAASL,EAAI,YAEbM,GAAkBa,EAAY,OAASC,GAAe,GACtDb,EAAMgB,EAAcL,CAAM,EAAE,KAAOvB,EAAK,YAAcW,EAGtDK,EAAaX,EAAK,QAASK,CAAM,EACjC,QAASmB,EAAI,EAAGA,EAAIL,EAAY,OAAQK,IAChCA,EAAIJ,GACJE,EAAgBxB,EAAK0B,CAAC,EAAG,OAAO,EAKxCP,EAAG,SAAU,YAAaT,CAAgB,EAC1CS,EAAG,SAAU,UAAWL,CAAc,CAC1C,CAAC,CACL,CACJ,CACJ,EAEOa,GAAQhC,GCnIA,SAARiC,EAAkCC,EAAIC,EAAMC,EAAO,WAAY,CAClE,IAAIC,EAASH,EACb,KAAOG,EAAOD,CAAI,IAAMD,GACpBE,EAASA,EAAO,cAEpB,OAAOA,CACX,CCLA,IAAMC,GAAN,cAA0BC,CAAW,CACjC,WAAY,CAIR,KAAK,KAAO,KAAK,KAAK,cAAc,UAAU,CAClD,CACA,cAAe,CACP,KAAK,KAAK,WACVC,EAAI,KAAK,KAAK,UAAW,cAAe,IAAI,CAEpD,CAEA,mBAAoB,CAChB,IAAMC,EAAO,KAAK,KAClBC,EAAGD,EAAK,UAAW,cAAe,IAAI,CAC1C,CAEA,SAASE,EAAG,CACR,IAAMF,EAAO,KAAK,KACZG,EAAID,EAAE,OACNE,EAAQD,EAAE,QAAQ,KACxB,GAAIA,EAAE,QACFH,EAAK,WAAWI,CAAK,MAClB,CAEH,GAAIJ,EAAK,eAAe,EAAE,QAAU,EAAG,CAEnCG,EAAE,QAAU,GACZ,MACJ,CACAH,EAAK,WAAWI,CAAK,CACzB,CACAJ,EAAK,QAAQ,CACjB,CAEA,cAAcE,EAAG,CACbA,EAAE,eAAe,EACjB,IAAMF,EAAO,KAAK,KACZK,EAASC,EAAiBJ,EAAE,OAAQ,OAAO,EAC3CK,EAAO,KAAK,KACZC,EAAOH,EAAO,sBAAsB,EACtCI,EAAIP,EAAE,QAAUM,EAAK,KACnBE,EAAIR,EAAE,QAAUM,EAAK,IAE3BD,EAAK,MAAM,IAAM,GAAGG,CAAC,KACrBH,EAAK,MAAM,KAAO,GAAGE,CAAC,KAEtBE,EAAgBJ,EAAM,QAAQ,EAC1BE,EAAI,IAAMD,EAAK,QACfC,GAAKF,EAAK,YACVA,EAAK,MAAM,KAAO,GAAGE,CAAC,MAG1B,IAAMG,EAAwBV,GAAM,CAC3BK,EAAK,SAASL,EAAE,MAAM,IACvBW,EAAaN,EAAM,SAAU,EAAE,EAC/BR,EAAI,SAAU,QAASa,CAAoB,EAEnD,EACAX,EAAG,SAAU,QAASW,CAAoB,CAC9C,CACA,YAAa,CACT,IAAMZ,EAAO,KAAK,KACZO,EAAO,KAAK,KAClB,KAAOA,EAAK,WACRA,EAAK,YAAYA,EAAK,SAAS,EAEnCA,EAAK,iBAAiB,SAAU,IAAI,EAEpC,QAAWO,KAAOd,EAAK,QAAQ,QAAS,CACpC,GAAIc,EAAI,KACJ,SAEJ,IAAMC,EAAK,SAAS,cAAc,IAAI,EAChCC,EAAQ,SAAS,cAAc,OAAO,EACtCC,EAAW,SAAS,cAAc,OAAO,EAC/CJ,EAAaI,EAAU,OAAQ,UAAU,EACzCJ,EAAaI,EAAU,YAAaH,EAAI,KAAK,EACxCA,EAAI,SACLG,EAAS,QAAU,IAEvB,IAAMC,EAAO,SAAS,eAAeJ,EAAI,KAAK,EAE9CE,EAAM,YAAYC,CAAQ,EAC1BD,EAAM,YAAYE,CAAI,EAEtBH,EAAG,YAAYC,CAAK,EACpBT,EAAK,YAAYQ,CAAE,CACvB,CACJ,CACJ,EAEOI,GAAQtB,GC7Ff,IAAMuB,GAAN,cAA+BC,CAAW,CAItC,oBAAoBC,EAAI,CACpB,IAAMC,EAAO,KAAK,KAClBD,EAAG,UAAY,GACfE,EAAGF,EAAI,YAAcG,GAAM,CACvB,GAAIF,EAAK,QAAQ,eAAe,YAAcE,EAAE,eAAgB,CAC5DA,EAAE,eAAe,EACjB,MACJ,CACAF,EAAK,IAAI,aAAa,EACtBE,EAAE,aAAa,cAAgB,OAC/BA,EAAE,aAAa,QAAQ,aAAcA,EAAE,OAAO,aAAa,eAAe,CAAC,CAC/E,CAAC,EACDD,EAAGF,EAAI,WAAaG,IACZA,EAAE,gBACFA,EAAE,eAAe,EAErBA,EAAE,aAAa,WAAa,OACrB,GACV,EACDD,EAAGF,EAAI,OAASG,GAAM,CACdA,EAAE,iBACFA,EAAE,gBAAgB,EAEtB,IAAMC,EAAID,EAAE,OACNE,EAASC,EAAiBF,EAAG,IAAI,EACjCG,EAAQ,OAAO,SAASJ,EAAE,aAAa,QAAQ,YAAY,CAAC,EAC5DK,EAAc,OAAO,SAASH,EAAO,aAAa,eAAe,CAAC,EAExE,GAAIE,IAAUC,EAAa,CACvBP,EAAK,IAAI,+BAA+B,EACxC,MACJ,CACAA,EAAK,IAAI,sBAAsBM,CAAK,OAAOC,CAAW,EAAE,EAExD,IAAMC,EAASR,EAAK,cAAc,EAC5BS,EAAMT,EAAK,QAAQ,QAAQM,EAAQE,CAAM,EAC/CR,EAAK,QAAQ,QAAQM,EAAQE,CAAM,EAAIR,EAAK,QAAQ,QAAQO,EAAcC,CAAM,EAChFR,EAAK,QAAQ,QAAQO,EAAcC,CAAM,EAAIC,EAE7C,IAAMC,EAAY,CAACC,EAAUC,IAAQ,CACjC,IAAMC,EAAWD,EAAI,WAAW,aAAa,eAAe,EACtDE,EAAMd,EAAK,cACb,GAAGW,CAAQ,sBAAsBE,CAAQ,sBAAsBN,CAAW,IAC9E,EACAQ,EAAaH,EAAK,gBAAiBL,CAAW,EAC9CQ,EAAaD,EAAK,gBAAiBR,CAAK,EACxC,IAAMU,EAAU,SAAS,cAAc,IAAI,EAC3CJ,EAAI,WAAW,aAAaI,EAASJ,CAAG,EACxCE,EAAI,WAAW,aAAaF,EAAKE,CAAG,EACpCE,EAAQ,WAAW,aAAaF,EAAKE,CAAO,CAChD,EAGA,QAAWJ,KAAOK,EAAQjB,EAAM,2BAA2BM,CAAK,IAAI,EAChEI,EAAU,QAASE,CAAG,EAE1B,QAAWA,KAAOK,EAAQjB,EAAM,2BAA2BM,CAAK,IAAI,EAChEI,EAAU,QAASE,CAAG,EAI1B,OAAAZ,EAAK,QAAQ,QAAUiB,EAAQjB,EAAM,oCAAoC,EAAE,IAAKD,GAC5EC,EAAK,QAAQ,QAAQ,KAAMkB,GAAMA,EAAE,QAAUC,EAAapB,EAAI,OAAO,CAAC,CAC1E,EAEAqB,EAASpB,EAAM,kBAAmB,CAC9B,IAAKS,EAAI,MACT,KAAMH,EACN,GAAIC,CACR,CAAC,EACM,EACX,CAAC,CACL,CACJ,EAEOc,GAAQxB,GCjFf,IAAMyB,GAAN,cAA2BC,CAAW,CAClC,YAAYC,EAAM,CACd,MAAMA,CAAI,EACV,KAAK,MAAQ,IACjB,CACA,WAAY,CACR,IAAMA,EAAO,KAAK,KAClBA,EAAK,iBAAiB,aAAc,KAAM,CAAE,QAAS,EAAK,CAAC,EAC3DA,EAAK,iBAAiB,YAAa,KAAM,CAAE,QAAS,EAAK,CAAC,CAC9D,CAEA,cAAe,CACX,IAAMA,EAAO,KAAK,KAClBA,EAAK,oBAAoB,aAAc,IAAI,EAC3CA,EAAK,oBAAoB,YAAa,IAAI,CAC9C,CAEA,aAAaC,EAAG,CACZ,KAAK,MAAQA,EAAE,QAAQ,CAAC,CAC5B,CAEA,YAAYA,EAAG,CACX,GAAI,CAAC,KAAK,MACN,OAEJ,IAAMD,EAAO,KAAK,KACZE,EAAQ,KAAK,MAAM,QAAUD,EAAE,QAAQ,CAAC,EAAE,QAC1CE,EAAQ,KAAK,MAAM,QAAUF,EAAE,QAAQ,CAAC,EAAE,QAE5C,KAAK,IAAIC,CAAK,EAAI,KAAK,IAAIC,CAAK,IAC5BD,EAAQ,EACRF,EAAK,QAAQ,EAEbA,EAAK,QAAQ,GAGrB,KAAK,MAAQ,IACjB,CACJ,EAEOI,GAAQN,GC1Cf,IAAMO,EAAmB,gBACnBC,GAAmB,gBACnBC,GAAiB,mBAKjBC,GAAN,cAA6BC,CAAW,CACpC,cAAe,CACP,KAAK,WACL,KAAK,UAAU,oBAAoB,SAAU,IAAI,CAEzD,CAMA,aAAaC,EAAM,KAAM,CACrB,IAAMC,EAAO,KAAK,KACZC,EAAe,CAAC,EAEhBC,EAASC,EAAQH,EAAM,UAAUN,CAAgB,gBAAgB,EAEvE,QAAWU,KAAYF,EAAQ,CAC3B,IAAMG,EAAM,OAAO,SAASD,EAAS,QAAQ,EAAE,EACzCE,EAAON,EAAK,KAAKK,EAAM,CAAC,EACzBC,GACD,QAAQ,KAAK,QAAQD,CAAG,YAAY,EAEpCN,EACAE,EAAa,KAAKK,EAAKP,CAAG,CAAC,EAE3BE,EAAa,KAAKK,CAAI,CAE9B,CACA,OAAOL,CACX,CAMA,gBAAgBM,EAAO,CAEnB,GAAI,CADS,KAAK,KACR,QAAQ,kBACd,OAEJ,IAAML,EAASC,EAAQI,EAAO,eAAeb,CAAgB,QAAQ,EACrE,QAAWc,KAASN,EAChBM,EAAM,QAAU,GAEpB,KAAK,UAAU,QAAU,EAC7B,CAEA,UAAW,CACP,OAAO,KAAK,KAAK,cAAc,EAAI,CACvC,CAKA,gBAAgBC,EAAI,CAChB,IAAMC,EAAK,SAAS,cAAc,IAAI,EACtCC,EAAaD,EAAI,QAAS,KAAK,EAC/BC,EAAaD,EAAI,OAAQ,qBAAqB,EAC9CC,EAAaD,EAAI,gBAAiB,KAAK,SAAS,CAAC,EACjDA,EAAG,UAAU,IAAQhB,EAAkB,mBAAoB,iBAAkB,EAC7EgB,EAAG,SAAW,EAEd,KAAK,UAAY,SAAS,cAAc,OAAO,EAC/C,KAAK,UAAU,KAAO,WACtB,KAAK,UAAU,UAAU,IAAIf,EAAgB,EAC7C,KAAK,UAAU,UAAU,IAAIC,EAAc,EAC3C,KAAK,UAAU,iBAAiB,SAAU,IAAI,EAE9C,IAAMgB,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,YAAY,KAAK,SAAS,EAEhCF,EAAG,YAAYE,CAAK,EAEpBF,EAAG,aAAa,QAAS,IAAI,EAC7BD,EAAG,YAAYC,CAAE,CACrB,CAKA,gBAAgBD,EAAI,CAChB,IAAMC,EAAK,SAAS,cAAc,IAAI,EACtCC,EAAaD,EAAI,OAAQ,qBAAqB,EAC9CC,EAAaD,EAAI,gBAAiB,KAAK,SAAS,CAAC,EACjDA,EAAG,UAAU,IAAIhB,CAAgB,EACjCgB,EAAG,SAAW,EAEdD,EAAG,YAAYC,CAAE,CACrB,CAQA,gBAAgBH,EAAO,CACd,KAAK,YAIVA,EAAM,iBAAiB,SAAU,IAAI,EAErCA,EAAM,cAAc,IAAI,MAAM,QAAQ,CAAC,EAC3C,CAKA,cAAcE,EAAI,CAEd,IAAMI,EAAK,SAAS,cAAc,IAAI,EACtCF,EAAaE,EAAI,OAAQ,iBAAiB,EAC1CF,EAAaE,EAAI,gBAAiB,KAAK,SAAS,CAAC,EACjDA,EAAG,UAAU,IAAInB,CAAgB,EAGjC,IAAMoB,EAAY,SAAS,cAAc,OAAO,EAEhDA,EAAU,QAAQ,GAAKL,EAAG,aAAa,eAAe,EACtDK,EAAU,KAAO,WACjBA,EAAU,UAAU,IAAIlB,EAAc,EAEtC,IAAMgB,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,UAAU,IAAI,mBAAmB,EACvCA,EAAM,YAAYE,CAAS,EAC3BD,EAAG,YAAYD,CAAK,EAGpBA,EAAM,iBAAiB,QAAS,IAAI,EAEpCH,EAAG,YAAYI,CAAE,CACrB,CAKA,QAAQE,EAAG,CACPA,EAAE,gBAAgB,CACtB,CAMA,SAASA,EAAG,CACR,IAAMf,EAAO,KAAK,KAClB,GAAIgB,EAASD,EAAE,OAAQpB,EAAgB,EAAG,CACtC,IAAMsB,EAAcjB,EAAK,QAAQ,kBAC3BE,EAASC,EAAQH,EAAM,UAAUN,CAAgB,QAAQ,EAC/D,QAAWwB,KAAMhB,EAAQ,CACrB,GAAIe,GAAe,CAACC,EAAG,YACnB,OAEJA,EAAG,QAAU,KAAK,UAAU,OAChC,CACAC,EAASnB,EAAM,eAAgB,CAC3B,UAAW,KAAK,aAAa,CACjC,CAAC,CACL,KAAO,CACH,GAAI,CAACe,EAAE,OAAO,QAAQ,IAAIrB,CAAgB,EAAE,EACxC,OAEJ,IAAM0B,EAAkBjB,EAAQH,EAAM,UAAUN,CAAgB,uBAAuB,EAEjF2B,EAAeD,EAAgB,OAAQE,GAAMA,EAAE,OAAO,EAC5D,KAAK,UAAU,QAAUD,EAAa,SAAWD,EAAgB,OAEjED,EAASnB,EAAM,eAAgB,CAC3B,UAAWA,EAAK,aAAa,CACjC,CAAC,CACL,CACJ,CACJ,EAEOuB,GAAQ1B,GClLf,IAAM2B,GAAN,cAA0BC,CAAW,CACjC,YAAYC,EAAM,CACd,MAAMA,CAAI,EAEV,KAAK,eAAiB,GAElBA,EAAK,MAAM,SACXA,EAAK,MAAM,UAAY,OACvB,KAAK,eAAiB,GAE9B,CAIA,eAAgB,CAEZ,IAAMC,EADO,KAAK,KACC,cAAc,OAAO,EAClCC,EAAK,SAAS,cAAc,IAAI,EACtCC,EAAaD,EAAI,OAAQ,KAAK,EAC9BC,EAAaD,EAAI,SAAU,EAAE,EAC7BA,EAAG,UAAU,IAAI,aAAa,EAC9BA,EAAG,SAAW,EACdD,EAAM,YAAYC,CAAE,CACxB,CAEA,IAAI,SAAU,CACV,OAAO,KAAK,KAAK,cAAc,cAAc,CACjD,CAKA,eAAgB,CACZ,IAAMF,EAAO,KAAK,KACZI,EAAU,KAAK,QAarB,GAZI,CAACA,GAKDJ,EAAK,QAAQ,QAAUA,EAAK,aAAa,GAIzCA,EAAK,OAASA,EAAK,WAAW,GAG9B,CAACA,EAAK,QAAQ,WACd,OAGJ,IAAMK,EAAML,EAAK,QAAQ,QAAUA,EAAK,UAClCM,EAAcN,EAAK,iBAAiB,wBAAwB,EAAE,OAC9DO,EAAaD,EAAc,EAAID,EAAMC,EAAcN,EAAK,UAAYK,EACtEE,EAAa,GACbJ,EAAaC,EAAS,SAAUG,CAAU,EAC1CH,EAAQ,gBAAgB,QAAQ,GAEhCA,EAAQ,gBAAgB,QAAQ,CAExC,CACJ,EAEOI,GAAQV,GChEf,IAAMW,GAAN,cAA6BC,CAAW,CASpC,YAAYC,EAAIC,EAAQC,EAAKC,EAAK,CAC9B,IAAMC,EAAO,KAAK,KAClB,GAAIC,EAAaL,EAAI,OAAO,EACxB,OAAOM,EAAaN,EAAI,OAAO,EAEnC,GAAI,CAACI,EAAK,KAAK,OACX,OAEJ,IAAMG,EAAWH,EAAK,KAAK,CAAC,EACtBI,EAAUJ,EAAK,KAAKA,EAAK,KAAK,OAAS,CAAC,EAC1CK,EAAIF,EAASN,EAAO,KAAK,EAAIM,EAASN,EAAO,KAAK,EAAE,SAAS,EAAI,GAC/DS,EAAKF,EAAQP,EAAO,KAAK,EAAIO,EAAQP,EAAO,KAAK,EAAE,SAAS,EAAI,GAClES,EAAG,OAASD,EAAE,SACdA,EAAIC,GAER,IAAIC,EAAQ,EACZ,OAAIF,EAAE,QAAU,EACZE,EAAQT,EACDO,EAAE,OAAS,GAClBE,EAAQR,EAGRQ,EAAQC,EAAa,GAAGH,CAAC,OAAQT,CAAE,EAEnCW,EAAQR,IACRQ,EAAQR,GAERQ,EAAQT,IACRS,EAAQT,GAEZW,EAAab,EAAI,QAASW,CAAK,EACxBA,CACX,CACJ,EAEOG,GAAQhB,GCrCf,IAAMiB,EAAmB,gBAErBC,GAMJ,SAASC,GAAeC,EAAM,CAC1B,OAAOA,EAAK,KAAK,CAACC,EAAGC,IAAM,CACvB,IAAMC,EAAK,OAAO,SAASF,EAAE,QAAQ,UAAU,GAAK,EAEpD,OADW,OAAO,SAASC,EAAE,QAAQ,UAAU,GAAK,GACxCC,CAChB,CAAC,CACL,CAMA,IAAMC,GAAWC,EAAUC,GAAY,CACnC,QAAWC,KAASD,EAAS,CAKzB,IAAME,EAAOD,EAAM,OACbE,EAAQD,EAAK,MACnB,GAAIA,EAAK,QAAQ,eAAe,gBAC5B,OAGJ,IAAME,EAAiB,MAAM,QAAQH,EAAM,cAAc,EAAIA,EAAM,eAAe,CAAC,EAAIA,EAAM,eACvFI,EAAO,OAAO,SAASD,EAAe,UAAU,EAChDE,EAAaH,EAAM,YACnBI,EAAiBC,EAAQN,EAAK,UAAW,IAAI,EAAE,OAAO,CAACO,EAAQC,IAC1DD,EAASC,EAAG,YACpB,CAAC,EACEC,GAAQJ,GAAkBD,GAAcD,EAAO,EAC/CO,EAAW,GACXC,EAAaX,EAAK,QAAQ,eAAe,WAEzCY,EAAarB,GACfe,EAAQN,EAAK,UAAW,WAAW,EAC9B,QAAQ,EACR,OAAQa,GAEEA,EAAI,QAAQ,aAAe,GACrC,CACT,EACIC,EAAU,GAKd,GAHAd,EAAK,IAAI,YAAYI,CAAU,IAAIC,CAAc,0BAA0BF,CAAI,WAAWM,CAAI,EAAE,EAG5FA,EAAO,EAAG,CACV,GAAIE,IAAe,OACf,OAEJX,EAAK,QAAQ,eAAe,WAAa,OACzC,IAAIe,EAAYN,EACZO,EAAOJ,EAAW,OAAQC,GACnB,CAACA,EAAI,aAAa,QAAQ,GAAKA,EAAI,aAAa,iBAAiB,CAC3E,EACD,GAAIG,EAAK,SAAW,IAChBA,EAAOJ,EAAW,OAAQC,GACf,CAACA,EAAI,aAAa,QAAQ,CACpC,EAEGG,EAAK,SAAW,GAChB,OAIR,QAAWH,KAAOG,EAAM,CACpB,GAAID,EAAY,EACZ,SAGJ,IAAME,EAAWJ,EAAI,YACfK,EAAQL,EAAI,aAAa,OAAO,EACjCK,IAGLL,EAAI,QAAQ,UAAY,GAAGA,EAAI,WAAW,GAE1Cb,EAAK,WAAWkB,EAAO,EAAK,EAC5BlB,EAAK,WAAWkB,EAAO,mBAAoB,EAAI,EAC/CJ,EAAU,GAEVC,GAAaE,EACbF,EAAY,KAAK,MAAMA,CAAS,EACpC,CACJ,KAAO,CACH,GAAIJ,IAAe,OACf,OAEJX,EAAK,QAAQ,eAAe,WAAa,OAEzC,IAAMmB,EACFP,EACK,OAAQC,GACE,CAACA,EAAI,aAAa,QAAQ,CACpC,EACA,OAAO,CAACN,EAAQM,IAAQ,CACrB,IAAMO,EAAQP,EAAI,QAAQ,SAAW,OAAO,SAASA,EAAI,QAAQ,QAAQ,EAAIA,EAAI,YACjF,OAAON,EAASa,CACpB,EAAG,CAAC,EAAIV,EAGZK,EAAYZ,EAAOgB,EAEjBE,EAAqBT,EACtB,MAAM,EACN,QAAQ,EACR,OAAQC,GACEA,EAAI,aAAa,QAAQ,CACnC,EAEL,QAAWA,KAAOQ,EAAoB,CAClC,GAAIN,EAAYL,EACZ,SAEJ,IAAMO,EAAW,OAAO,SAASJ,EAAI,QAAQ,QAAQ,EAGrD,GAAII,EAAWF,EAAW,CACtBA,EAAY,GACZ,QACJ,CAEA,IAAMG,EAAQL,EAAI,aAAa,OAAO,EACjCK,IAILlB,EAAK,WAAWkB,EAAO,EAAK,EAC5BlB,EAAK,WAAWkB,EAAO,mBAAoB,EAAK,EAChDJ,EAAU,GAEVC,GAAaE,EACbF,EAAY,KAAK,MAAMA,CAAS,EACpC,CACJ,CAGA,IAAMO,EAASC,EAAKvB,EAAK,MAAO,OAAO,EACjCwB,EAAkBlB,EAAQN,EAAK,MAAO,kBAAkB,EAAE,OAAO,CAACO,EAAQkB,IACrElB,EAASkB,EAAI,YACrB,CAAC,EACEC,EAAuBJ,EAAO,YAAcE,EAC9CA,EAAkBrB,EAClBwB,EAASL,EAAQ,mBAAmB,EAC7BI,EAAuB,KAC9BE,EAAYN,EAAQ,mBAAmB,EAEvCR,GACAd,EAAK,YAAY,EAGrB,WAAW,IAAM,CACbA,EAAK,QAAQ,eAAe,WAAa,IAC7C,EAAG,GAAI,EACPA,EAAK,MAAM,MAAM,WAAa,SAClC,CACJ,EAAG,GAAG,EACA6B,GAAiB,IAAI,eAAejC,EAAQ,EAK5CkC,GAAN,cAA6BC,CAAW,CACpC,YAAY/B,EAAM,CACd,MAAMA,CAAI,EAEV,KAAK,gBAAkB,GACvB,KAAK,WAAa,IACtB,CAEA,WAAY,CACJ,KAAK,KAAK,QAAQ,YAClB,KAAK,QAAQ,CAErB,CAEA,cAAe,CACX,KAAK,UAAU,CACnB,CAEA,SAAU,CACD,KAAK,KAAK,QAAQ,aAGvB6B,GAAe,QAAQ,KAAK,IAAI,EAChC,KAAK,KAAK,MAAM,QAAU,QAC1B,KAAK,KAAK,MAAM,UAAY,SAChC,CAEA,WAAY,CACRA,GAAe,UAAU,KAAK,IAAI,EAClC,KAAK,KAAK,MAAM,QAAU,QAC1B,KAAK,KAAK,MAAM,UAAY,OAChC,CAEA,eAAgB,CACZ,KAAK,gBAAkB,GACnBvC,IACA,aAAaA,EAAK,CAE1B,CAEA,iBAAkB,CACdA,GAAQ,WAAW,IAAM,CACrB,KAAK,gBAAkB,EAC3B,EAAG,GAAG,CACV,CAKA,kBAAmB,CACf,IAAI0C,EAAO,GAEX,QAAWnB,KAAO,KAAK,KAAK,QAAQ,QAC5BA,EAAI,mBACJmB,EAAO,IAGf,OAAOA,CACX,CAEA,UAAW,CACP,OAAO,KAAK,KAAK,cAAc,EAAI,CACvC,CAKA,gBAAgBC,EAAI,CAChB,GAAI,CAAC,KAAK,KAAK,QAAQ,iBACnB,OAEJ,IAAMzB,EAAK0B,EAAG,KAAMD,CAAE,EACtBE,EAAa3B,EAAI,QAAS,KAAK,EAC/B2B,EAAa3B,EAAI,OAAQ,qBAAqB,EAC9C2B,EAAa3B,EAAI,gBAAiB,KAAK,SAAS,CAAC,EACjD2B,EAAa3B,EAAI,QAAS,IAAI,EAC9BA,EAAG,UAAU,IAAQ,GAAGnB,CAAgB,UAAW,mBAAoB,iBAAkB,EACzFmB,EAAG,SAAW,CAClB,CAKA,gBAAgByB,EAAI,CAChB,GAAI,CAAC,KAAK,KAAK,QAAQ,iBACnB,OAEJ,IAAMzB,EAAK0B,EAAG,KAAMD,CAAE,EACtBE,EAAa3B,EAAI,OAAQ,qBAAqB,EAC9C2B,EAAa3B,EAAI,gBAAiB,KAAK,SAAS,CAAC,EACjDA,EAAG,UAAU,IAAI,GAAGnB,CAAgB,SAAS,EAC7CmB,EAAG,SAAW,CAClB,CAKA,cAAcyB,EAAI,CACd,GAAI,CAAC,KAAK,KAAK,QAAQ,iBACnB,OAGJ,IAAMG,EAAK,SAAS,cAAc,IAAI,EACtCD,EAAaC,EAAI,OAAQ,iBAAiB,EAC1CD,EAAaC,EAAI,gBAAiB,KAAK,SAAS,CAAC,EACjDA,EAAG,UAAU,IAAI,GAAG/C,CAAgB,SAAS,EAG7C+C,EAAG,UAAY,8CAA8C/C,CAAgB;AAAA;AAAA;AAAA;AAAA,cAIvEA,CAAgB;AAAA;AAAA,cAGtB4C,EAAG,YAAYG,CAAE,EAEjBA,EAAG,iBAAiB,QAAS,IAAI,EACjCA,EAAG,iBAAiB,YAAa,IAAI,CACzC,CAEA,mBAAoB,CAChB,IAAIC,EAAa,EACbC,EAAgB,EACpB,KAAOD,EAAa,KAAK,CACrBC,IACA,IAAMC,EAAOhB,EAAK,KAAK,KAAM,sCAAsCe,CAAa,IAAI,EACpF,GAAIC,EACAF,GAAcE,EAAK,gBAEnB,MAER,CACA,OAAOF,CACX,CAKA,YAAYG,EAAI,CAEZA,EAAG,eAAe,CACtB,CAKA,QAAQA,EAAI,CAERA,EAAG,gBAAgB,EASnB,IAAMJ,EAAKI,EAAG,cACRP,EAAKG,EAAG,cACRK,EAAOlB,EAAKa,EAAI,IAAI/C,CAAgB,OAAO,EAC3CqD,EAAQnB,EAAKa,EAAI,IAAI/C,CAAgB,QAAQ,EAKnD,GAHA,KAAK,cAAc,EAEAsD,EAASV,EAAI,GAAG5C,CAAgB,WAAW,EAC9C,CACZuC,EAAYK,EAAI,GAAG5C,CAAgB,WAAW,EAC9CoD,EAAK,MAAM,QAAU,QACrBC,EAAM,MAAM,QAAU,OAGtB,IAAME,EAAWX,EAAG,mBACdY,EAAavC,EAAQsC,EAAU,IAAIvD,CAAgB,SAAS,EAElE,QAAWwB,KAAOgC,EAEdZ,EAAG,YAAYpB,CAAG,EAClBsB,EAAatB,EAAK,QAAQ,EAG9B+B,EAAS,cAAc,YAAYA,CAAQ,CAC/C,KAAO,CACHjB,EAASM,EAAI,GAAG5C,CAAgB,WAAW,EAC3CoD,EAAK,MAAM,QAAU,OACrBC,EAAM,MAAM,QAAU,QAGtB,IAAME,EAAWV,EAAG,IAAI,EACxBY,GAAYF,EAAUX,CAAE,EACxBN,EAASiB,EAAU,GAAGvD,CAAgB,YAAY,EAElD,IAAM0D,EAAab,EAAG,KAAMU,CAAQ,EACpCT,EAAaY,EAAY,UAAW,KAAK,KAAK,cAAc,EAAI,CAAC,EAEjE,IAAMC,EAAad,EAAG,QAASa,CAAU,EACzCpB,EAASqB,EAAY,GAAG3D,CAAgB,QAAQ,EAEhD,IAAMwD,EAAavC,EAAQ2B,EAAI,IAAI5C,CAAgB,SAAS,EACtDgD,EAAa,KAAK,kBAAkB,EAE1C,QAAWxB,KAAOgC,EAAY,CAC1B,IAAMI,EAAgBf,EAAG,KAAMc,CAAU,EAGnCE,EAAQrC,EAAI,QAAQ,KACpBsC,EAAWjB,EAAG,KAAMe,CAAa,EAEvCE,EAAS,MAAM,MAAQ,GAAGd,CAAU,KACpCc,EAAS,UAAYD,EAGrBD,EAAc,YAAYpC,CAAG,EAC7BuC,EAAgBvC,EAAK,QAAQ,CACjC,CACJ,CAEA,KAAK,gBAAgB,CACzB,CACJ,EAEOwC,GAAQvB,GC/Yf,IAAMwB,GAAN,cAAyBC,CAAW,CAIhC,YAAa,CACT,OAAO,KAAK,KAAK,QAAQ,QAAQ,OAAS,CAC9C,CAMA,iBAAiBC,EAAI,CACjB,IAAMC,EAAY,SAAS,cAAc,IAAI,EAC7CC,EAAaD,EAAW,OAAQ,qBAAqB,EACrDC,EAAaD,EAAW,gBAAiB,KAAK,KAAK,cAAc,EAAI,CAAC,EACtEA,EAAU,UAAU,IAAQ,aAAc,kBAAmB,mBAAoB,KAAK,WAAY,EAClGA,EAAU,SAAW,EACrBD,EAAG,YAAYC,CAAS,CAC5B,CAMA,iBAAiBD,EAAI,CACjB,IAAMC,EAAY,SAAS,cAAc,IAAI,EAC7CA,EAAU,aAAa,OAAQ,qBAAqB,EACpDC,EAAaD,EAAW,gBAAiB,KAAK,KAAK,cAAc,EAAI,CAAC,EACtEA,EAAU,UAAU,IAAQ,aAAc,KAAK,WAAY,EAC3DA,EAAU,SAAW,EACrBD,EAAG,YAAYC,CAAS,CAC5B,CAMA,cAAcD,EAAIG,EAAM,CACpB,IAAMC,EAAS,KAAK,KAAK,OACnBC,EAAK,SAAS,cAAc,IAAI,EACtCH,EAAaG,EAAI,OAAQ,UAAU,EACnCH,EAAaG,EAAI,gBAAiB,KAAK,KAAK,cAAc,EAAI,CAAC,EAC/DA,EAAG,UAAU,IAAQ,aAAc,KAAK,WAAY,EACpDA,EAAG,SAAW,EAGd,IAAMC,EAAgB,SAAS,cAAc,QAAQ,EACrDA,EAAc,UAAU,IAAI,mBAAmB,EAC/CA,EAAc,UAAY,SAC1BD,EAAG,YAAYC,CAAa,EAC5BC,EAAGD,EAAe,QAAUE,GAAO,CAC/BA,EAAG,gBAAgB,EACnBA,EAAG,OAAO,cAAc,UAAU,OAAO,mBAAmB,CAChE,CAAC,EAED,QAAWC,KAAU,KAAK,KAAK,QAAQ,QAAS,CAC5C,IAAMC,EAAS,SAAS,cAAc,QAAQ,EAC1CD,EAAO,KACPC,EAAO,UAAYD,EAAO,KAE1BC,EAAO,UAAYD,EAAO,OAASA,EAAO,KAE1CA,EAAO,QACPC,EAAO,MAAQD,EAAO,OAEtBA,EAAO,MACPC,EAAO,KAAO,SACdA,EAAO,WAAaC,EAAYF,EAAO,IAAKN,CAAI,GAEhDM,EAAO,OACPC,EAAO,UAAU,IAAI,GAAGD,EAAO,MAAM,MAAM,GAAG,CAAC,EAEnD,IAAMG,EAAiBJ,GAAO,CAE1B,GADAA,EAAG,gBAAgB,EACfC,EAAO,SAEH,CADM,QAAQL,EAAO,UAAU,EAC3B,CACJI,EAAG,eAAe,EAClB,MACJ,CAEJK,EAAS,KAAK,KAAM,SAAU,CAC1B,KAAMV,EACN,OAAQM,EAAO,IACnB,CAAC,CACL,EACAC,EAAO,iBAAiB,QAASE,CAAa,EAC9CP,EAAG,YAAYK,CAAM,EAGjBD,EAAO,UACPT,EAAG,UAAU,IAAI,eAAe,EAChCA,EAAG,iBAAiB,QAASY,CAAa,EAElD,CAEAZ,EAAG,YAAYK,CAAE,CACrB,CAEA,IAAI,aAAc,CACd,OAAI,KAAK,KAAK,QAAQ,QAAQ,OAAS,GAAK,CAAC,KAAK,KAAK,QAAQ,gBACpD,cAAc,KAAK,KAAK,QAAQ,QAAQ,MAAM,GAElD,iBACX,CACJ,EAEOS,GAAQhB,GC7Gf,IAAMiB,GAAN,cAA6BC,CAAW,CAQpC,kBAAkBC,EAAIC,EAAQC,EAAMC,EAAG,CACnC,IAAMC,EAAS,KAAK,KAAK,aAAa,IAAI,EACpCC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,KAAOJ,EAAO,cAAgB,OAChCI,EAAM,OAAS,UACfA,EAAM,UAAY,SAElBA,EAAM,OAAS,YACfA,EAAM,KAAO,OACbA,EAAM,UAAY,WAEtBA,EAAM,aAAe,MACrBA,EAAM,WAAa,GACnBA,EAAM,SAAW,EACjBA,EAAM,UAAU,IAAI,aAAa,EACjCA,EAAM,KAAO,GAAGD,EAAO,QAAQ,IAAK,GAAG,CAAC,IAAID,EAAI,CAAC,KAAKF,EAAO,KAAK,IAClEI,EAAM,MAAQH,EAAKD,EAAO,KAAK,EAC/BI,EAAM,QAAQ,MAAQJ,EAAO,MAG7BI,EAAM,iBAAiB,QAAUC,GAAOA,EAAG,gBAAgB,CAAC,EAE5DD,EAAM,iBAAiB,WAAaC,GAAO,CACvC,GAAIA,EAAG,OAAS,WAAY,CACxB,IAAMC,EAAMD,EAAG,SAAWA,EAAG,KACzBC,IAAQ,IAAMA,IAAQ,WACtBF,EAAM,KAAK,EACXC,EAAG,eAAe,EAE1B,CACJ,CAAC,EAEDD,EAAM,iBAAiB,OAAQ,IAAM,CAE7BA,EAAM,QAAUH,EAAKG,EAAM,QAAQ,KAAK,IAI5CH,EAAKG,EAAM,QAAQ,KAAK,EAAIA,EAAM,MAElCG,EAAS,KAAK,KAAM,OAAQ,CACxB,KAAMN,EACN,MAAOG,EAAM,KACjB,CAAC,EACL,CAAC,EACDL,EAAG,YAAYK,CAAK,CACxB,CACJ,EAEOI,GAAQX,GCzDf,IAAMY,GAAN,cAA6BC,CAAW,CACpC,WAAY,CAEJ,KAAK,KAAK,QAAQ,cAAgB,KAAK,KAAK,QAAQ,gBACpD,KAAK,IAAI,CAEjB,CAKA,KAAM,CACF,IAAMC,EAAO,KAAK,KACZC,EAAUD,EAAK,QAAQ,aAC7B,GAAI,CAACC,EACD,OAEJ,IAAMC,EAAMD,EACP,MAAM,GAAG,EACT,IAAKE,GAAM,IAAIA,CAAC,EAAE,EAClB,KAAK,EAAE,EAENC,EAAW;AAAA;AAAA,cAEXF,CAAG;AAAA,+BACcA,CAAG;AAAA,8CACYA,CAAG;AAAA;AAAA,4BAErBA,CAAG;AAAA;AAAA;AAAA,EAIvB,GAAI,CAACG,EAAE,YAAY,EAAG,CAClB,IAAMC,EAAcD,EAAE,MAAM,GAAKA,EAAE,MAAM,EACnCE,EAAW,QAAQ,KAAKD,EAAY,OAAO,EAAI,YAAc,aACnEA,EAAY,mBAAmBC,EAAUH,CAAQ,CACrD,CACA,CAACC,EAAE,IAAIH,CAAG,GAAIF,CAAI,GAAKA,EAAK,mBAAmB,aAAc,aAAaC,CAAO,QAAQ,CAC7F,CACJ,EAEOO,GAAQV,GC/Bf,IAAMW,GAAN,cAAwBC,CAAW,CAC/B,YAAYC,EAAM,CACd,MAAMA,CAAI,EACV,KAAK,YAAc,KACnB,KAAK,gBAAkB,GACvB,KAAK,aAAe,GACpB,KAAK,WAAa,GAClB,KAAK,IAAI,MAAM,CACnB,CAEA,WAAY,CACR,KAAK,IAAI,WAAW,EACpB,IAAMA,EAAO,KAAK,KAElB,GAAI,CAACA,EAAK,QAAQ,UAAW,CACzB,KAAK,IAAI,UAAU,EACnB,MACJ,CAEA,KAAK,IAAI,SAAS,EAElB,IAAMC,EAAc,KAAK,UAAU,EACnC,GAAIA,EAAa,CACb,KAAK,IAAI,cAAc,EAEvB,QAAWC,KAAOD,EAAY,QAC1B,GAAIC,EAAI,OAAQ,CACZ,IAAMC,EAAUH,EAAK,QAAQ,QAAQ,KAAMI,GAAMA,EAAE,QAAUF,EAAI,KAAK,EACtEC,EAAQ,OAAS,EACrB,CAGJ,KAAK,IAAI,kBAAkB,EAC3BH,EAAK,QAAQ,QAAUC,EAAY,QAC/BD,EAAK,QAAQ,SACbA,EAAK,KAAOC,EAAY,KACxBD,EAAK,MAAQC,EAAY,MACzBD,EAAK,KAAOC,EAAY,KAEhC,CAEA,KAAK,YAAcA,EAEnB,IAAMI,EAAaL,EAAK,SACxBA,EAAK,SAAW,YAAaM,EAAM,CAC/B,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CACpCH,EAAW,MAAM,KAAMC,CAAI,EAAE,QAAQ,IAAM,CACvC,IAAMG,EAAY,KAAK,QAAQ,UAE/B,GAAI,CAACT,EAAK,UAAU,SAAS,gBAAgB,EACzC,OAAAS,EAAU,IAAI,4BAA4B,EACnCF,EAAQ,EAKnB,GAFAE,EAAU,IAAI,uCAAuC,EAEjDA,EAAU,aAAe,CAACA,EAAU,gBAAiB,CACrDA,EAAU,IAAI,sBAAsB,EAEpC,IAAMC,EAAkBC,EAAQX,EAAM,wCAAwC,EAC9E,QAAWY,KAAMF,EACbE,EAAG,aAAa,YAAa,MAAM,EAGvCZ,EAAK,cACD,sCAAsCS,EAAU,YAAY,IAAI,IACpE,GAAG,aAAa,YAAaA,EAAU,YAAY,OAAO,EAE1D,IAAMI,EAAUF,EAAQX,EAAK,UAAW,iBAAiB,EACzD,QAAWY,KAAMC,EACbD,EAAG,MAAQH,EAAU,YAAY,QAAQG,EAAG,QAAQ,IAAI,EAE5DH,EAAU,gBAAkB,EAChC,CAGA,IAAMK,EAAW,CACb,KAAMd,EAAK,KACX,MAAOA,EAAK,MACZ,KAAMA,EAAK,KACX,QAASA,EAAK,QAAQ,QACtB,QAAS,CAAC,EACV,QAASA,EAAK,QAAQ,QAAQ,IAAKE,IAAS,CAAE,MAAOA,EAAI,MAAO,OAAQA,EAAI,MAAO,EAAE,EACrF,KAAMF,EAAK,QAAQ,EACnB,QAASA,EAAK,WAAW,EACzB,SAAU,OAAO,OACrB,EAEMa,EAAUb,EAAK,WAAW,EAEhC,QAAWe,KAAO,OAAO,KAAKF,CAAO,EACjCC,EAAS,QAAQC,CAAG,EAAIF,EAAQE,CAAG,EAGvCN,EAAU,IAAI,iBAAiB,EAC/BA,EAAU,UAAUK,CAAQ,EAExB,CAACd,EAAK,QAAQ,QAAUS,EAAU,aAAe,CAACA,EAAU,eAC5DA,EAAU,aAAe,GACzBT,EAAK,WAAW,EAChBA,EAAK,KAAOS,EAAU,YAAY,KAClCT,EAAK,YAAY,GAGrBO,EAAQ,CACZ,CAAC,CACL,CAAC,CACL,EAEA,IAAMS,EAAc,IAAM,CACtB,IAAMP,EAAYT,EAAK,QAAQ,UACzBiB,EAAQR,EAAU,UAAU,EAC7BQ,IAGLA,EAAM,QAAUjB,EAAK,QAAQ,QAAQ,IAAKE,IAAS,CAAE,MAAOA,EAAI,MAAO,OAAQA,EAAI,MAAO,EAAE,EAC5Fe,EAAM,KAAOjB,EAAK,QAAQ,EAC1BiB,EAAM,QAAUjB,EAAK,WAAW,EAChCiB,EAAM,SAAW,OAAO,QACxBR,EAAU,UAAUQ,CAAK,EAC7B,EAEA,SAAS,iBAAiB,YAAaD,CAAW,EAClDhB,EAAK,iBAAiB,iBAAkBgB,CAAW,EAEnDhB,EAAK,iBAAiB,eAAiBkB,GAAO,CAC1C,GAAI,CAAClB,EAAK,UAAU,SAAS,gBAAgB,GAAKA,EAAK,UAAU,SAAS,YAAY,EAClF,OAGCA,EAAK,QAAQ,QACdgB,EAAY,EAGhB,IAAMP,EAAYT,EAAK,QAAQ,UAC3B,CAACS,EAAU,aAAe,CAACA,EAAU,kBAIpCA,EAAU,aAGHA,EAAU,aAClBA,EAAU,WAAa,GACvB,OAAO,SAAS,CAAE,IAAKA,EAAU,YAAY,SAAU,KAAM,EAAG,SAAU,SAAU,CAAC,IAJrFA,EAAU,aAAe,GACzBT,EAAK,OAAO,GAKpB,CAAC,CACL,CAEA,IAAImB,EAAS,CACT,KAAK,KAAK,IAAI,gBAAgBA,CAAO,EAAE,CAC3C,CAKA,WAAY,CACR,IAAIF,EACJ,GAAI,CACAA,EAAQ,KAAK,MAAM,eAAe,QAAQ,iBAAiB,KAAK,KAAK,EAAE,EAAE,CAAC,CAC9E,MAAY,CAAC,CACb,OAAOA,CACX,CAKA,UAAUA,EAAO,CACb,eAAe,QAAQ,iBAAiB,KAAK,KAAK,EAAE,GAAI,KAAK,UAAUA,CAAK,CAAC,CACjF,CACJ,EAEOG,GAAQtB,GCpKfuB,EAAS,gBAAgB,CACvB,cAAAC,GACA,YAAAC,GACA,iBAAAC,GACA,aAAAC,GACA,eAAAC,GACA,YAAAC,GACA,eAAAC,GACA,eAAAC,GACA,WAAAC,GACA,eAAAC,GACA,eAAAC,GACA,UAAAC,EACF,CAAC,EAGI,eAAe,IAAI,WAAW,GACjC,eAAe,OAAO,YAAaZ,CAAQ,EAG7C,IAAOA,GAAQA,EAETa,GAAS,OAAO,WAAe,IAAc,WAAa,KAChEA,GAAO,SAAWb", + "sourcesContent": ["/**\n * @param {String} str\n * @returns {String}\n */\nexport default function camelize(str) {\n return str.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, (m, chr) => chr.toUpperCase());\n}\n", "/**\n * Parse data attribute and return properly typed data\n * @param {String} v\n * @returns {any}\n */\nexport default function normalizeData(v) {\n // Bool\n if (v === \"true\") {\n return true;\n }\n if (v === \"false\") {\n return false;\n }\n // Null or empty\n if (v === \"\" || v === \"null\") {\n return null;\n }\n // Numeric attributes\n if (v === Number(v).toString()) {\n return Number(v);\n }\n // Only attempt json parsing for array or objects\n if (v && [\"[\", \"{\"].includes(v.substring(0, 1))) {\n try {\n // In case we have only single quoted values, like ['one', 'two', 'three']\n let val = v;\n if (val.indexOf('\"') === -1) {\n val = val.replace(/'/g, '\"');\n }\n return JSON.parse(decodeURIComponent(val));\n } catch {\n console.error(`Failed to parse ${v}`);\n return {};\n }\n }\n return v;\n}\n", "/**\n * @typedef FlexibleHTMLProps\n * @property {boolean} [checked] (HTMLInputElement)\n * @property {string} [value] (HTMLInputElement)\n * @property {number} [rowHeight] (HTMLTableRowElement)\n *\n * A flexible type HTMLElement type that does not require using instanceof all over the place\n * Make sure that your selector is indeed valid\n * Only includes most commons props\n * @typedef {HTMLElement & FlexibleHTMLProps} FlexibleHTMLElement\n */\n\n/**\n * Keep this as reference for easy documentation\n * @typedef {HTMLElement&HTMLInputElement&HTMLTableRowElement} MixedHTMLElement\n */\n\n/**\n * @typedef FlexibleEventProps\n * @property {FlexibleHTMLElement} target\n * @property {FlexibleHTMLElement} currentTarget\n * @property {DataTransfer} [dataTransfer] (DragEvent)\n * @property {number} [clientX] (MouseEvent)\n * @property {number} [clientY] (MouseEvent)\n *\n * @typedef {Event & FlexibleEventProps} FlexibleEvent\n */\n\n/**\n * Keep this as reference for easy documentation\n * @typedef {Event&MouseEvent&InputEvent&DragEvent&FocusEvent&KeyboardEvent&PointerEvent} MixedEvent\n */\n\n/**\n * @callback FlexibleListener\n * @param {FlexibleEvent} event\n */\n\nclass FlexibleEventListenerObject {\n /**\n * @param {FlexibleEvent} e\n */\n handleEvent(e) {}\n}\n\nconst supportedPassiveTypes = [\n \"scroll\",\n \"wheel\",\n \"touchstart\",\n \"touchmove\",\n \"touchenter\",\n \"touchend\",\n \"touchleave\",\n \"mouseout\",\n \"mouseleave\",\n \"mouseup\",\n \"mousedown\",\n \"mousemove\",\n \"mouseenter\",\n \"mousewheel\",\n \"mouseover\",\n];\n\n/**\n * Automatically set passive options based on type\n * @param {string} type\n * @returns {AddEventListenerOptions}\n */\nfunction passiveOpts(type) {\n if (supportedPassiveTypes.includes(type)) {\n return { passive: true };\n }\n return {};\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n * @returns {any}\n */\nexport function getAttribute(el, name) {\n return el.getAttribute(name);\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n * @returns {Boolean}\n */\nexport function hasAttribute(el, name) {\n return el.hasAttribute(name);\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n * @param {any} v\n * @param {Boolean} check Prevent setting if attribute is already there\n */\nexport function setAttribute(el, name, v = \"\", check = false) {\n if (check && hasAttribute(el, name)) return;\n el.setAttribute(name, `${v}`);\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n */\nexport function removeAttribute(el, name) {\n if (hasAttribute(el, name)) {\n el.removeAttribute(name);\n }\n}\n\n/**\n * @param {EventTarget} el\n * @param {String} type\n * @param {EventListenerObject|FlexibleListener} listener\n */\nexport function on(el, type, listener) {\n el.addEventListener(type, listener, passiveOpts(type));\n}\n\n/**\n * @param {EventTarget} el\n * @param {String} type\n * @param {EventListenerObject|FlexibleListener} listener\n */\nexport function off(el, type, listener) {\n el.removeEventListener(type, listener, passiveOpts(type));\n}\n\n/**\n * @param {EventTarget} el\n * @param {String} type\n * @param {EventListenerObject|FlexibleListener} listener\n */\nexport function one(el, type, listener) {\n el.addEventListener(type, listener, {\n once: true,\n });\n}\n\n/**\n * @param {HTMLElement} el\n * @param {String} name\n * @param {any} data\n * @param {Boolean} bubbles\n */\nexport function dispatch(el, name, data = {}, bubbles = false) {\n const opts = {};\n if (bubbles) {\n opts.bubbles = true;\n }\n if (data) {\n opts.detail = data;\n }\n el.dispatchEvent(new CustomEvent(name, opts));\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n * @returns {Boolean}\n */\nexport function hasClass(el, name) {\n return el.classList.contains(name);\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n */\nexport function addClass(el, name) {\n el.classList.add(...name.split(\" \"));\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n */\nexport function removeClass(el, name) {\n el.classList.remove(...name.split(\" \"));\n}\n\n/**\n * @param {Element} el\n * @param {String} name\n */\nexport function toggleClass(el, name) {\n el.classList.toggle(name);\n}\n\n/**\n * @param {String|HTMLElement} selector\n * @param {HTMLElement|Document} base\n * @returns {FlexibleHTMLElement|null}\n */\nexport function $(selector, base = document) {\n if (selector instanceof HTMLElement) {\n return selector;\n }\n return base.querySelector(selector);\n}\n\n/**\n * @param {String} selector\n * @param {Element|Document} base\n * @returns {Array}\n */\nexport function $$(selector, base = document) {\n return Array.from(base.querySelectorAll(selector));\n}\n\n/**\n * Easily retrieve untyped element\n * For actual type, prefer use of el.querySelector\n * @param {HTMLElement} el\n * @param {String|HTMLElement} selector\n * @returns {FlexibleHTMLElement}\n */\nexport function find(el, selector) {\n return $(selector, el);\n}\n\n/**\n * Easily retrieve untyped elements\n * For actual type, prefer use of el.querySelectorAll\n * @param {Element} el\n * @param {String} selector\n * @returns {Array}\n */\nexport function findAll(el, selector) {\n return $$(selector, el);\n}\n\n/**\n * @param {*} el\n * @returns {FlexibleHTMLElement}\n */\nexport function el(el) {\n return el;\n}\n\n/**\n * @template {keyof HTMLElementTagNameMap} K\n * @param {K} tagName\n * @param {HTMLElement} parent\n * @returns {HTMLElementTagNameMap[K]}\n */\nexport function ce(tagName, parent = null) {\n const el = document.createElement(tagName);\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n}\n\n/**\n * @param {HTMLElement} newNode\n * @param {HTMLElement} existingNode\n */\nexport function insertAfter(newNode, existingNode) {\n existingNode.parentNode.insertBefore(newNode, existingNode.nextSibling);\n}\n", "import camelize from \"../utils/camelize.js\";\nimport normalizeData from \"../utils/normalizeData.js\";\nimport { dispatch, getAttribute, setAttribute } from \"../utils/shortcuts.js\";\n\n/** @typedef {import('../data-grid').Options} Options */\n\n/**\n * Base element that does not contain any specific logic\n * related to this project but makes HTMLElemnt usable\n */\nclass BaseElement extends HTMLElement {\n /**\n * @param {Object} options\n */\n constructor(options = {}) {\n super();\n\n /** @type {Options} */\n this.options = Object.assign({}, this.defaultOptions, this.normalizedDataset, options);\n\n this.log(\"constructor\");\n\n this.setup = false;\n this.fireEvents = true;\n this._ready();\n\n this.log(\"ready\");\n }\n\n get defaultOptions() {\n return {};\n }\n\n /**\n * @param {String} opt\n * @returns {any}\n */\n getOption(opt) {\n return this.options[opt];\n }\n\n /**\n * @param {String} opt\n * @param {any} v\n */\n setOption(opt, v) {\n setAttribute(this, `data-${opt}`, v);\n }\n\n /**\n * @param {String} opt\n */\n toggleOption(opt) {\n setAttribute(this, `data-${opt}`, !this.getOption(opt));\n }\n\n get normalizedDataset() {\n const jsonConfig = this.dataset.config ? JSON.parse(this.dataset.config) : {};\n const data = { ...this.dataset };\n for (const key in data) {\n if (key === \"config\") {\n continue;\n }\n data[key] = normalizeData(data[key]);\n }\n // Once normalized, merge into json config\n Object.assign(data, jsonConfig);\n return data;\n }\n\n /**\n * @returns {String}\n */\n static template() {\n return \"\";\n }\n\n /**\n * This is called at the end of constructor. Extend in subclass if needed.\n */\n _ready() {}\n\n /**\n * @param {String|Error} message\n */\n log(message) {\n if (this.options.debug) {\n console.log(`[${getAttribute(this, \"id\")}] ${message}`);\n }\n }\n\n /**\n * Handle events within the component\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#handling-events\n * @param {Event} event\n */\n handleEvent(event) {\n if (this[`on${event.type}`]) {\n this[`on${event.type}`](event);\n }\n }\n\n /**\n * This is called when connected. Extend in subclass if needed.\n */\n _connected() {}\n\n connectedCallback() {\n // already connected\n if (this.setup) {\n return;\n }\n this.setup = true;\n // ensure whenDefined callbacks run first\n setTimeout(() => {\n this.log(\"connectedCallback\");\n\n // Append only when labels had the opportunity to be set\n // Don't use shadow dom as it makes theming super hard\n const template = document.createElement(\"template\");\n // @ts-ignore\n template.innerHTML = this.constructor.template();\n this.appendChild(template.content.cloneNode(true));\n\n this._connected();\n // @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#life-cycle-events\n dispatch(this, \"connected\");\n }, 0);\n }\n\n /**\n * This is called when disconnected. Extend in subclass if needed.\n */\n _disconnected() {}\n\n /**\n * @link https://nolanlawson.com/2024/12/01/avoiding-unnecessary-cleanup-work-in-disconnectedcallback/\n */\n disconnectedCallback() {\n setTimeout(() => {\n if (!this.isConnected && this.setup) {\n this.log(\"disconnectedCallback\");\n this._disconnected();\n // @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#life-cycle-events\n dispatch(this, \"disconnected\");\n this.setup = false;\n }\n }, 0);\n }\n\n /**\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#a-props-like-accessor\n * @returns {Object}\n */\n get transformAttributes() {\n return {};\n }\n\n /**\n * This is only meant to work with data attributes\n * This allows us to have properties that reflect automatically in the component\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#reflected-dataset-attributes\n * @param {String} attributeName\n * @param {String} oldValue\n * @param {String} newValue\n */\n attributeChangedCallback(attributeName, oldValue, newValue) {\n // It didn't change\n if (oldValue === newValue) {\n return;\n }\n\n this.log(`attributeChangedCallback: ${attributeName}`);\n\n let isOption = false;\n const transformer = this.transformAttributes[attributeName] ?? normalizeData;\n\n let attr = attributeName;\n // Data attributes are mapped to options while other attributes are mapped as properties\n if (attr.indexOf(\"data-\") === 0) {\n attr = attr.slice(5);\n isOption = true;\n }\n attr = camelize(attr);\n if (isOption) {\n this.options[attr] = transformer(newValue);\n } else {\n this[attr] = transformer(newValue);\n }\n\n // Fire internal event\n if (this.fireEvents && this[`${attr}Changed`]) {\n this[`${attr}Changed`]();\n }\n }\n}\n\nexport default BaseElement;\n", "/**\n * @param {HTMLSelectElement} el\n * @param {String} value\n * @param {String} label\n * @param {Boolean} checked\n */\nexport default function addSelectOption(el, value, label, checked = false) {\n const opt = document.createElement(\"option\");\n opt.value = `${value}`;\n if (checked) {\n opt.selected = true;\n }\n opt.label = label;\n el.appendChild(opt);\n}\n", "/**\n * @param {URL} url\n * @param {Object} params\n */\nexport default function appendParamsToUrl(url, params = {}) {\n for (const key of Object.keys(params)) {\n if (Array.isArray(params[key])) {\n for (const k of Object.keys(params[key])) {\n // @ts-ignore\n url.searchParams.append(isNaN(k) ? `${key}[${k}]` : key, params[key][k]);\n }\n } else {\n url.searchParams.append(key, params[key]);\n }\n }\n}\n", "/**\n * Force value as arrays\n * @param {String|Array} v\n * @returns {Array}\n */\nexport default function convertArray(v) {\n if (typeof v === \"string\") {\n if (v[0] === \"[\") {\n // \"['my', 'value']\" would fail as a json\n let bv = v;\n if (bv.indexOf('\"') === -1) {\n bv = bv.replace(/'/g, '\"');\n }\n return JSON.parse(bv);\n }\n\n return v.split(\",\");\n }\n if (!Array.isArray(v)) {\n console.error(\"Invalid array\", v);\n return [];\n }\n return v;\n}\n", "/**\n * @param {HTMLElement} el\n * @returns {Object}\n */\nexport default function elementOffset(el) {\n const rect = el.getBoundingClientRect();\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return { top: rect.top + scrollTop, left: rect.left + scrollLeft };\n}\n", "/**\n * Replace element within {} by their data value\n * @param {String} str\n * @param {Object} data\n * @returns {String}\n */\nexport default function interpolate(str, data) {\n return str.replace(/\\{([^}]+)?\\}/g, ($1, $2) => data[$2]);\n}\n", "let canvas;\n\n/**\n * Uses canvas.measureText to compute and return the width of the given text of given font in pixels.\n * Getting computed styles only works for dom that are added in the dom\n * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393\n * @param {String} text The text to be rendered.\n * @param {Element} el Target element (defaults to body)\n * @param {Boolean} withPadding Include padding on element\n * @returns {Number}\n */\nexport default function getTextWidth(text, el = document.body, withPadding = false) {\n const styles = window.getComputedStyle(el || document.createElement(\"div\"));\n const fontWeight = styles.getPropertyValue(\"font-weight\") || \"normal\";\n const fontSize = styles.getPropertyValue(\"font-size\") || \"1rem\";\n const fontFamily = styles.getPropertyValue(\"font-family\") || \"Arial\";\n\n let padding = 0;\n if (withPadding) {\n const paddingLeft = styles.getPropertyValue(\"padding-left\") || \"0\";\n const paddingRight = styles.getPropertyValue(\"padding-right\") || \"0\";\n padding = Number.parseInt(paddingLeft) + Number.parseInt(paddingRight);\n }\n\n // re-use canvas object for better performance\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const context = canvas.getContext(\"2d\");\n context.font = `${fontWeight} ${fontSize} ${fontFamily}`;\n const metrics = context.measureText(text);\n return Number.parseInt(metrics.width) + padding;\n}\n", "/**\n * @param {String} prefix\n * @returns {String}\n */\nexport default function randstr(prefix) {\n return Math.random()\n .toString(36)\n .replace(\"0.\", prefix || \"\");\n}\n", "/**\n * Define a function that can be happily passed to addEventListener\n * @typedef {Function & EventListenerOrEventListenerObject} ExtendedFunction\n */\n\n/**\n * @param {Function} handler\n * @param {Number} timeout\n * @returns {ExtendedFunction}\n */\nexport default function debounce(handler, timeout = 300) {\n let timer = null;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n handler(...args);\n }, timeout);\n };\n}\n", "/**\n * Data Grid Web component\n *\n * Credits for inspiration\n * @link https://github.com/riverside/zino-grid\n */\n\nimport BaseElement from \"./core/base-element.js\";\nimport addSelectOption from \"./utils/addSelectOption.js\";\nimport appendParamsToUrl from \"./utils/appendParamsToUrl.js\";\nimport camelize from \"./utils/camelize.js\";\nimport convertArray from \"./utils/convertArray.js\";\nimport elementOffset from \"./utils/elementOffset.js\";\nimport interpolate from \"./utils/interpolate.js\";\nimport getTextWidth from \"./utils/getTextWidth.js\";\nimport randstr from \"./utils/randstr.js\";\nimport debounce from \"./utils/debounce.js\";\nimport {\n $,\n $$,\n dispatch,\n find,\n findAll,\n hasClass,\n removeAttribute,\n getAttribute,\n setAttribute,\n addClass,\n toggleClass,\n on,\n ce,\n} from \"./utils/shortcuts.js\";\n\n/**\n * Column definition\n * @typedef Column\n * @property {String} field - the key in the data\n * @property {String} title - the title to display in the header (defaults to \"field\" if not set)\n * @property {Number} [width] - the width of the column (auto otherwise)\n * @property {String} [class] - class to set on the column (target body or header with th.class or td.class)\n * @property {String} [attr] - don't render the column and set a matching attribute on the row with the value of the field\n * @property {Boolean} [hidden] - hide the column\n * @property {Boolean} [noSort] - allow disabling sort for a given column\n * @property {String | Function} [format] - custom data formatting\n * @property {String} [defaultFormatValue] - default value to use for formatting\n * @property {String} [transform] - custom value transformation\n * @property {Boolean} [editable] - replace with input (EditableColumn module)\n * @property {String} [editableType] - type of input (EditableColumn module)\n * @property {Number} [responsive] - the higher the value, the sooner it will be hidden, disable with 0 (ResponsiveGrid module)\n * @property {Boolean} [responsiveHidden] - hidden through responsive module (ResponsiveGrid module)\n * @property {String} [filterType] - defines a filter field type (\"text\" or \"select\" - defaults to \"text\")\n * @property {Array} [filterList] - defines a custom array to populate a filter select field in the format of [{value: \"\", text: \"\"},...]. When defined, it overrides the default behaviour where the filter select elements are populated by the unique values from the corresponding column records.\n * @property {Object} [firstFilterOption] - defines an object for the first option element of the filter select field. defaults to {value: \"\", text: \"\"}\n */\n\n/**\n * Row action\n * @typedef Action\n * @property {String} title - the title of the button\n * @property {String} name - the name of the action\n * @property {String} class - the class for the button\n * @property {String} url - link for the action\n * @property {String} html - custom button data\n * @property {Boolean} [confirm] - needs confirmation\n * @property {Boolean} default - is the default row action\n */\n\n// Import definitions without importing the actual file\n/** @typedef {import('./plugins/autosize-column').default} AutosizeColumn */\n/** @typedef {import('./plugins/column-resizer').default} ColumnResizer */\n/** @typedef {import('./plugins/context-menu').default} ContextMenu */\n/** @typedef {import('./plugins/draggable-headers').default} DraggableHeaders */\n/** @typedef {import('./plugins/editable-column').default} EditableColumn */\n/** @typedef {import('./plugins/fixed-height').default} FixedHeight */\n/** @typedef {import('./plugins/responsive-grid').default} ResponsiveGrid */\n/** @typedef {import('./plugins/row-actions').default} RowActions */\n/** @typedef {import('./plugins/selectable-rows').default} SelectableRows */\n/** @typedef {import('./plugins/touch-support').default} TouchSupport */\n/** @typedef {import('./plugins/spinner-support').default} SpinnerSupport */\n/** @typedef {import('./plugins/save-state').default} SaveState */\n\n/**\n * These plugins are all optional\n * @typedef {Object} Plugins\n * @property {ColumnResizer} [ColumnResizer] resize handlers in the headers\n * @property {ContextMenu} [ContextMenu] menu to show/hide columns\n * @property {DraggableHeaders} [DraggableHeaders] draggable headers columns\n * @property {EditableColumn} [EditableColumn] draggable headers columns\n * @property {TouchSupport} [TouchSupport] touch swipe\n * @property {SelectableRows} [SelectableRows] create a column with checkboxes to select rows\n * @property {FixedHeight} [FixedHeight] allows having fixed height tables\n * @property {AutosizeColumn} [AutosizeColumn] compute ideal width based on column content\n * @property {ResponsiveGrid} [ResponsiveGrid] hide/show column on the fly\n * @property {RowActions} [RowActions] add action on rows\n * @property {SpinnerSupport} [SpinnerSupport] inserts a spinning icon element to indicate grid loading.\n * @property {SaveState} [SaveState] stores grid filter, sort, and paging.\n */\n\n/**\n * Parameters to pass along or receive from the server\n * @typedef ServerParams\n * @property {String} serverParams.start\n * @property {String} serverParams.length\n * @property {String} serverParams.search\n * @property {String} serverParams.sort\n * @property {String} serverParams.sortDir\n * @property {String} serverParams.dataKey\n * @property {String} serverParams.metaKey\n * @property {String} serverParams.metaTotalKey\n * @property {String} serverParams.metaFilteredKey\n * @property {String} serverParams.optionsKey\n * @property {String} serverParams.paramsKey\n */\n\n/**\n * Available data grid options, plugins included\n * @typedef Options\n * @property {?String} id Custom id for the grid\n * @property {?String} url An URL with data to display in JSON format\n * @property {Boolean} debug Log actions in DevTools console\n * @property {Boolean} filter Allows a filtering functionality\n * @property {Boolean} sort Allows a sort by column functionality\n * @property {String} defaultSort Default sort field if sorting is enabled\n * @property {Boolean} server Is a server side powered grid\n * @property {ServerParams} serverParams Describe keys passed to the server backend\n * @property {String} dir Dir\n * @property {Array} perPageValues Available per page options\n * @property {Boolean} hidePerPage Hides the page size select element\n * @property {Column[]} columns Available columns\n * @property {Number} defaultPage Starting page\n * @property {Number} perPage Number of records displayed per page (page size)\n * @property {Boolean} expand Allow cell content to spawn over multiple lines\n * @property {Action[]} actions Row actions (RowActions module)\n * @property {Boolean} collapseActions Group actions (RowActions module)\n * @property {Boolean} resizable Make columns resizable (ColumnResizer module)\n * @property {Boolean} selectable Allow selecting rows with a checkbox (SelectableRows module)\n * @property {Boolean} selectVisibleOnly Select all only selects visible rows (SelectableRows module)\n * @property {Boolean} autosize Compute column sizes based on given data (Autosize module)\n * @property {Boolean} autoheight Adjust height so that it matches table size (FixedHeight module)\n * @property {Boolean} autohidePager auto-hides the pager when number of records falls below the selected page size\n * @property {Boolean} menu Right click menu on column headers (ContextMenu module)\n * @property {Boolean} reorder Allows a column reordering functionality (DraggableHeaders module)\n * @property {Boolean} responsive Change display mode on small screens (ResponsiveGrid module)\n * @property {Boolean} responsiveToggle Show toggle column (ResponsiveGrid module)\n * @property {Boolean} filterOnEnter Toggles the ability to filter column data by pressing the Enter or Return key\n * @property {String} spinnerClass Sets a space-delimited string of css classes for a spinner (use spinner-border css class for bootstrap 5 spinner)\n * @property {Number} filterKeypressDelay Sets a keypress delay time in milliseconds before triggering filter operation.\n * @property {Boolean} saveState Enable/disable save state plugin (SaveState module)\n * @property {?String} errorMessage A generic text to be displayed in footer when error occurs.\n */\n\n/**\n * Available labels that can be translated\n * @typedef Labels\n * @property {String} itemsPerPage\n * @property {String} gotoPage\n * @property {String} gotoFirstPage\n * @property {String} gotoPrevPage\n * @property {String} gotoNextPage\n * @property {String} gotoLastPage\n * @property {String} of\n * @property {String} items\n * @property {String} resizeColumn\n * @property {String} noData\n * @property {String} areYouSure\n * @property {String} networkError\n */\n\n/**\n * List of registered plugins\n * @type {Plugins}\n */\nlet plugins = {};\n\n/**\n * @type {Labels}\n */\nlet labels = {\n itemsPerPage: \"Items per page\",\n gotoPage: \"Go to page\",\n gotoFirstPage: \"Go to first page\",\n gotoPrevPage: \"Go to previous page\",\n gotoNextPage: \"Go to next page\",\n gotoLastPage: \"Go to last page\",\n of: \"of\",\n items: \"items\",\n resizeColumn: \"Resize column\",\n noData: \"No data\",\n areYouSure: \"Are you sure?\",\n networkError: \"Network response error\",\n};\n\n/**\n * Column definition will update some props on the html element\n * @param {HTMLElement} el\n * @param {Column} column\n */\nfunction applyColumnDefinition(el, column) {\n if (column.width) {\n setAttribute(el, \"width\", column.width);\n }\n if (column.class) {\n addClass(el, column.class);\n }\n if (column.hidden) {\n setAttribute(el, \"hidden\", \"\");\n if (column.responsiveHidden) {\n addClass(el, \"dg-responsive-hidden\");\n }\n }\n}\n\n/**\n */\nclass DataGrid extends BaseElement {\n _filterSelector = \"[id^=dg-filter]\";\n _excludedKeys = [\n 37,\n 39,\n 38,\n 40,\n 45,\n 36,\n 35,\n 33,\n 34,\n 27,\n 20,\n 16,\n 17,\n 91,\n 92,\n 18,\n 93,\n 144,\n 231,\n \"ArrowLeft\",\n \"ArrowRight\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"Insert\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n \"Escape\",\n \"CapsLock\",\n \"Shift\",\n \"Control\",\n \"Meta\",\n \"Alt\",\n \"ContextMenu\",\n \"NumLock\",\n \"Unidentified\",\n ];\n\n _ready() {\n setAttribute(this, \"id\", this.options.id ?? randstr(\"el-\"), true);\n\n /**\n * The grid displays that data\n * @type {Array}\n */\n this.data = [];\n /**\n * We store the original data in this\n * @type {Array}\n */\n this.originalData; // declared uninitialized to allow data preloading before fetch.\n\n // Make the IDE happy\n /**\n * @type {Options}\n */\n this.options = this.options || this.defaultOptions;\n\n // Init values\n this.fireEvents = false;\n this.page = this.options.defaultPage || 1;\n this.pages = 0;\n this.meta; // declared uninitialized to allow data preloading before fetch.\n /**\n * @type {Plugins}\n */\n this.plugins = {};\n // Init plugins\n for (const [pluginName, pluginClass] of Object.entries(plugins)) {\n // @ts-ignore until we can set typeof import ...\n this.plugins[pluginName] = new pluginClass(this);\n }\n\n // Expose options as observed attributes in the dom\n // Do it when fireEvents is disabled to avoid firing change callbacks\n for (const attr of DataGrid.observedAttributes) {\n if (attr.indexOf(\"data-\") === 0) {\n setAttribute(this, attr, this.options[camelize(attr.slice(5))]);\n }\n }\n }\n\n static template() {\n return `\n\n \n \n \n \n \n \n \n \n \n \n \n
\n`;\n }\n\n /**\n * @returns {Labels}\n */\n get labels() {\n return labels;\n }\n\n /**\n * @returns {Labels}\n */\n static getLabels() {\n return labels;\n }\n\n /**\n * @param {Object} v\n */\n static setLabels(v) {\n labels = Object.assign(labels, v);\n }\n\n /**\n * @returns {Column}\n */\n get defaultColumn() {\n return {\n field: \"\",\n title: \"\",\n width: 0,\n class: \"\",\n attr: \"\",\n hidden: false,\n editable: false,\n noSort: false,\n responsive: 1,\n responsiveHidden: false,\n format: \"\",\n transform: \"\",\n filterType: \"text\",\n firstFilterOption: { value: \"\", text: \"\" },\n };\n }\n\n /**\n * @returns {Options}\n */\n get defaultOptions() {\n return {\n id: null,\n url: null,\n perPage: 10,\n debug: false,\n filter: false,\n menu: false,\n sort: false,\n server: false,\n serverParams: {\n start: \"start\",\n length: \"length\",\n search: \"search\",\n sort: \"sort\",\n sortDir: \"sortDir\",\n dataKey: \"data\",\n metaKey: \"meta\",\n metaTotalKey: \"total\",\n metaFilteredKey: \"filtered\",\n optionsKey: \"options\",\n paramsKey: \"params\",\n },\n defaultSort: \"\",\n reorder: false,\n dir: \"ltr\",\n perPageValues: [10, 25, 50, 100, 250],\n hidePerPage: false,\n columns: [],\n actions: [],\n collapseActions: false,\n selectable: false,\n selectVisibleOnly: true,\n defaultPage: 1,\n resizable: false,\n autosize: true,\n expand: false,\n autoheight: true,\n autohidePager: false,\n responsive: false,\n responsiveToggle: true,\n filterOnEnter: true,\n filterKeypressDelay: 500,\n spinnerClass: \"\",\n saveState: false,\n errorMessage: \"\",\n };\n }\n\n /**\n * Determines if the grid is initialized.\n * @returns {Boolean}\n */\n get isInit() {\n return this.classList.contains(\"dg-initialized\");\n }\n\n /**\n * Determines if data load has failed.\n * @returns {Boolean}\n */\n get hasDataError() {\n return this.classList.contains(\"dg-network-error\");\n }\n\n /**\n * @param {Plugins} list\n */\n static registerPlugins(list) {\n plugins = list;\n }\n\n /**\n * @param {String} plugin\n */\n static unregisterPlugins(plugin = null) {\n if (plugin === null) {\n plugins = {};\n } else {\n delete plugins[plugin];\n }\n }\n\n /**\n * @returns {Plugins}\n */\n static registeredPlugins() {\n return plugins;\n }\n\n /**\n * @param {Object|Array} columns\n * @returns {Column[]}\n */\n convertColumns(columns) {\n const cols = [];\n // Convert key:value objects to actual columns\n if (typeof columns === \"object\" && !Array.isArray(columns)) {\n for (const key of Object.keys(columns)) {\n const col = Object.assign({}, this.defaultColumn);\n col.title = columns[key];\n col.field = key;\n cols.push(col);\n }\n } else {\n for (const item of columns) {\n let col = Object.assign({}, this.defaultColumn);\n if (typeof item === \"string\") {\n col.title = item;\n col.field = item;\n } else if (typeof item === \"object\") {\n col = Object.assign(col, item);\n if (!col.field) {\n console.error(\"Invalid column definition\", item);\n }\n if (!col.title) {\n col.title = col.field;\n }\n } else {\n console.error(\"Column definition must be a string or an object\");\n }\n cols.push(col);\n }\n }\n return cols;\n }\n\n /**\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#reflected-dom-attributes\n * @returns {Array}\n */\n static get observedAttributes() {\n return [\n \"page\",\n \"data-filter\",\n \"data-sort\",\n \"data-debug\",\n \"data-reorder\",\n \"data-menu\",\n \"data-selectable\",\n \"data-url\",\n \"data-per-page\",\n \"data-responsive\",\n ];\n }\n\n get transformAttributes() {\n return {\n columns: (v) => this.convertColumns(convertArray(v)),\n actions: (v) => convertArray(v),\n defaultPage: (v) => Number.parseInt(v),\n perPage: (v) => Number.parseInt(v),\n };\n }\n\n /** @returns {HTMLTableSectionElement} */\n get thead() {\n //@ts-ignore\n return $(\"thead\", this);\n }\n\n /** @returns {HTMLTableSectionElement} */\n get tbody() {\n //@ts-ignore\n return $(\"tbody\", this);\n }\n\n /** @returns {HTMLTableSectionElement} */\n get tfoot() {\n //@ts-ignore\n return $(\"tfoot\", this);\n }\n\n get page() {\n return Number.parseInt(this.getAttribute(\"page\"));\n }\n\n set page(val) {\n setAttribute(this, \"page\", this.constrainPageValue(val));\n }\n\n /**\n * Loads data and configures the grid.\n * @param {Boolean} initOnly\n */\n urlChanged(initOnly = false) {\n if (initOnly && !this.isInit) return;\n this.reconfig();\n this.loadData().then(() => {\n this.configureUi();\n });\n }\n\n /**\n * Clears columns, re-renders table, and repopulates columns to ensure consistent column widths rendering.\n */\n reconfig() {\n const cols = this.options.columns;\n this.options.columns = [];\n this.configureUi();\n this.options.columns = cols;\n }\n\n constrainPageValue(v) {\n let pv = v;\n if (this.pages < pv) {\n pv = this.pages;\n }\n if (pv < 1 || !pv) {\n pv = 1;\n }\n return pv;\n }\n\n fixPage() {\n this.pages = this.totalPages();\n this.page = this.constrainPageValue(this.page);\n\n // Show current page in input\n setAttribute(this.inputPage, \"max\", this.pages);\n this.inputPage.value = `${this.page}`;\n this.inputPage.disabled = this.pages < 2;\n }\n\n pageChanged() {\n this.reload();\n }\n\n responsiveChanged() {\n if (!this.plugins.ResponsiveGrid) {\n return;\n }\n if (this.options.responsive) {\n this.plugins.ResponsiveGrid.observe();\n } else {\n this.plugins.ResponsiveGrid.unobserve();\n }\n }\n\n menuChanged() {\n this.renderHeader();\n }\n\n /**\n * This is the callback for the select control\n */\n changePerPage() {\n this.options.perPage = Number.parseInt(this.selectPerPage.options[this.selectPerPage.selectedIndex].value);\n this.perPageChanged();\n }\n\n /**\n * This is the actual event triggered on attribute change\n */\n perPageChanged() {\n // Refresh UI\n if (\n this.options.perPage !== Number.parseInt(this.selectPerPage.options[this.selectPerPage.selectedIndex].value)\n ) {\n this.perPageValuesChanged();\n }\n // Make sure current page is still valid\n let updatePage = this.page;\n while (updatePage > 1 && this.page * this.options.perPage > this.totalRecords()) {\n updatePage--;\n }\n if (updatePage !== this.page) {\n // Triggers pageChanged, which will trigger reload\n this.page = updatePage;\n } else {\n // Simply reload current page\n this.reload(() => {\n // Preserve distance between top of page and select control if no fixed height\n if (!this.plugins.FixedHeight || !this.plugins.FixedHeight.hasFixedHeight) {\n this.selectPerPage.scrollIntoView();\n }\n });\n }\n }\n\n dirChanged() {\n setAttribute(this, \"dir\", this.options.dir);\n }\n\n defaultSortChanged() {\n this.sortChanged();\n }\n\n /**\n * Populate the select dropdown according to options\n */\n perPageValuesChanged() {\n if (!this.selectPerPage) {\n return;\n }\n while (this.selectPerPage.lastChild) {\n this.selectPerPage.removeChild(this.selectPerPage.lastChild);\n }\n for (const v of this.options.perPageValues) {\n addSelectOption(this.selectPerPage, v, v, v === this.options.perPage);\n }\n }\n\n _connected() {\n /**\n * @type {HTMLTableElement}\n */\n this.table = this.querySelector(\"table\");\n /**\n * @type {HTMLInputElement}\n */\n this.btnFirst = this.querySelector(\".dg-btn-first\");\n /**\n * @type {HTMLInputElement}\n */\n this.btnPrev = this.querySelector(\".dg-btn-prev\");\n /**\n * @type {HTMLInputElement}\n */\n this.btnNext = this.querySelector(\".dg-btn-next\");\n /**\n * @type {HTMLInputElement}\n */\n this.btnLast = this.querySelector(\".dg-btn-last\");\n /**\n * @type {HTMLSelectElement}\n */\n this.selectPerPage = this.querySelector(\".dg-select-per-page\");\n /**\n * @type {HTMLInputElement}\n */\n this.inputPage = this.querySelector(\".dg-input-page\");\n\n this.getFirst = this.getFirst.bind(this);\n this.getPrev = this.getPrev.bind(this);\n this.getNext = this.getNext.bind(this);\n this.getLast = this.getLast.bind(this);\n this.changePerPage = this.changePerPage.bind(this);\n this.gotoPage = this.gotoPage.bind(this);\n\n this.btnFirst.addEventListener(\"click\", this.getFirst);\n this.btnPrev.addEventListener(\"click\", this.getPrev);\n this.btnNext.addEventListener(\"click\", this.getNext);\n this.btnLast.addEventListener(\"click\", this.getLast);\n this.selectPerPage.addEventListener(\"change\", this.changePerPage);\n this.selectPerPage.toggleAttribute(\"hidden\", this.options.hidePerPage);\n this.inputPage.addEventListener(\"input\", this.gotoPage);\n\n for (const plugin of Object.values(this.plugins)) {\n plugin.connected();\n }\n\n // Display even if we don't have data\n this.dirChanged();\n this.perPageValuesChanged();\n\n // @ts-ignore\n this.loadData().finally(() => {\n this.configureUi();\n\n this.sortChanged();\n this.classList.add(\"dg-initialized\"); //acts as a flag to prevent unnecessary server calls down the chain.\n\n this.filterChanged();\n this.reorderChanged();\n\n this.dirChanged();\n this.perPageValuesChanged();\n this.pageChanged();\n\n this.fireEvents = true; // We can now fire attributeChangedCallback events\n\n this.log(\"initialized\");\n });\n }\n\n _disconnected() {\n this.btnFirst?.removeEventListener(\"click\", this.getFirst);\n this.btnPrev?.removeEventListener(\"click\", this.getPrev);\n this.btnNext?.removeEventListener(\"click\", this.getNext);\n this.btnLast?.removeEventListener(\"click\", this.getLast);\n this.selectPerPage?.removeEventListener(\"change\", this.changePerPage);\n this.inputPage?.removeEventListener(\"input\", this.gotoPage);\n\n for (const plugin of Object.values(this.plugins)) {\n plugin.disconnected();\n }\n }\n\n /**\n * @param {string} field\n * @returns {Column}\n */\n getCol(field) {\n let found = null;\n\n for (const col of this.options.columns) {\n if (col.field === field) {\n found = col;\n }\n }\n return found;\n }\n\n getColProp(field, prop) {\n const c = this.getCol(field);\n return c ? c[prop] : null;\n }\n\n setColProp(field, prop, val) {\n const c = this.getCol(field);\n if (c) {\n c[prop] = val;\n }\n }\n\n visibleColumns() {\n return this.options.columns.filter((col) => {\n return !col.hidden;\n });\n }\n\n hiddenColumns() {\n return this.options.columns.filter((col) => {\n return col.hidden === true;\n });\n }\n\n showColumn(field, render = true) {\n this.setColProp(field, \"hidden\", false);\n\n // We need to render the whole table otherwise layout fixed won't do its job\n if (render) this.renderTable();\n\n dispatch(this, \"columnVisibility\", {\n col: field,\n visibility: \"visible\",\n });\n }\n\n hideColumn(field, render = true) {\n this.setColProp(field, \"hidden\", true);\n\n // We need to render the whole table otherwise layout fixed won't do its job\n if (render) this.renderTable();\n\n dispatch(this, \"columnVisibility\", {\n col: field,\n visibility: \"hidden\",\n });\n }\n\n /**\n * Returns the starting index of actual data\n * @returns {Number}\n */\n startColIndex() {\n let start = 1;\n if (this.options.selectable && this.plugins.SelectableRows) {\n start++;\n }\n if (this.options.responsive && this.plugins.ResponsiveGrid && this.plugins.ResponsiveGrid.hasHiddenColumns()) {\n start++;\n }\n return start;\n }\n\n /**\n * @returns {Boolean}\n */\n isSticky() {\n return this.hasAttribute(\"sticky\");\n }\n\n /**\n * @param {Boolean} visibleOnly\n * @returns {Number}\n */\n columnsLength(visibleOnly = false) {\n let len = 0;\n // One column per (visible) column\n for (const col of this.options.columns) {\n if (visibleOnly && col.hidden) {\n continue;\n }\n if (!col.attr) {\n len++;\n }\n }\n // Add one col for selectable checkbox at the beginning\n if (this.options.selectable && this.plugins.SelectableRows) {\n len++;\n }\n // Add one col for actions at the end\n if (this.options.actions.length && this.plugins.RowActions) {\n len++;\n }\n // Add one col for the responsive toggle\n if (this.options.responsive && this.plugins.ResponsiveGrid && this.plugins.ResponsiveGrid.hasHiddenColumns()) {\n len++;\n }\n return len;\n }\n\n /**\n * Global configuration and renderTable\n * This should be called after your data has been loaded\n */\n configureUi() {\n this.table.style.visibility = \"hidden\";\n this.renderTable();\n if (this.options.responsive && this.plugins.ResponsiveGrid) {\n // Let the observer make the table visible\n } else {\n this.table.style.visibility = \"visible\";\n }\n\n // Store row height for later usage\n if (!this.rowHeight) {\n const tr = find(this, \"tbody tr\") || find(this, \"table tr\");\n if (tr) {\n this.rowHeight = tr.offsetHeight;\n }\n }\n this.fixPage();\n }\n\n filterChanged() {\n const row = this.querySelector(\"thead tr.dg-head-filters\");\n if (this.options.filter) {\n removeAttribute(row, \"hidden\");\n } else {\n this.clearFilters();\n setAttribute(row, \"hidden\", \"\");\n }\n }\n\n reorderChanged() {\n const headers = findAll(this, \"thead tr.dg-head-columns th\");\n for (const th of headers) {\n if (th.classList.contains(\"dg-selectable\") || th.classList.contains(\"dg-actions\")) {\n continue;\n }\n if (this.options.reorder && this.plugins.DraggableHeaders) {\n th.draggable = true;\n } else {\n th.removeAttribute(\"draggable\");\n }\n }\n }\n\n sortChanged() {\n this.log(\"toggle sort\");\n\n const headers = findAll(this, \"thead tr.dg-head-columns th\");\n for (const th of headers) {\n const fieldName = th.getAttribute(\"field\");\n if (\n th.classList.contains(\"dg-not-sortable\") ||\n (!this.fireEvents && fieldName === this.options.defaultSort)\n ) {\n return;\n }\n if (this.options.sort && !this.getColProp(fieldName, \"noSort\")) {\n setAttribute(th, \"aria-sort\", \"none\");\n } else {\n removeAttribute(th, \"aria-sort\");\n }\n }\n }\n\n selectableChanged() {\n this.renderTable();\n }\n\n addRow(row) {\n if (!Array.isArray(this.originalData)) {\n return;\n }\n this.log(\"add row\");\n this.originalData.push(row);\n this.data = this.originalData.slice();\n this.sortData();\n }\n\n /**\n * @param {any} value Value to remove. Defaults to last row.\n * @param {String} key The key of the item to remove. Defaults to first column\n */\n removeRow(value = null, key = null) {\n if (!Array.isArray(this.originalData)) {\n return;\n }\n\n let v = value;\n let k = key;\n if (k === null) {\n k = this.options.columns[0].field;\n }\n if (v === null) {\n v = this.originalData[this.originalData.length - 1][k];\n }\n this.log(`remove row ${k}:${v}`);\n for (let i = 0; i < this.originalData.length; i++) {\n if (this.originalData[i][k] === v) {\n this.originalData.splice(i, 1);\n break;\n }\n }\n this.data = this.originalData.slice();\n this.sortData();\n }\n\n /**\n * @param {String} key Return a specific key (eg: id) instead of the whole row\n * @returns {Array}\n */\n getSelection(key = null) {\n if (!this.plugins.SelectableRows) {\n return [];\n }\n return this.plugins.SelectableRows.getSelection(key);\n }\n\n getData() {\n return this.originalData;\n }\n\n clearData() {\n // Already empty\n if (this.data.length === 0) {\n return;\n }\n this.data = this.originalData = [];\n this.renderBody();\n }\n\n /**\n * Preloads the data intended to bypass the initial fetch operation, allowing for faster intial page load time.\n * Subsequent grid actions after initialization will operate as normal.\n * @param {Object} data - an object with meta ({total, filtered, start}) and data (array of objects) properties.\n */\n preload(data) {\n const metaKey = this.options.serverParams.metaKey;\n const dataKey = this.options.serverParams.dataKey;\n if (data?.[metaKey]) {\n this.meta = data[metaKey];\n }\n if (data?.[dataKey]) {\n this.data = this.originalData = data[dataKey];\n }\n }\n\n refresh(cb = null) {\n this.data = this.originalData = [];\n return this.reload(cb);\n }\n\n reload(cb = null) {\n this.log(\"reload\");\n\n // If the data was cleared, we need to render again\n const needRender = !this.originalData?.length;\n this.fixPage();\n // @ts-ignore\n this.loadData().finally(() => {\n if (this.hasDataError) return;\n // If we load data from the server, we redraw the table body\n // Otherwise, we just need to paginate\n this.options.server || needRender ? this.renderBody() : this.paginate();\n if (cb) {\n cb();\n }\n });\n }\n\n /**\n * @returns {Promise}\n */\n loadData() {\n const flagEmpty = () => !this.data.length && this.classList.add(\"dg-empty\");\n const tbody = this.tbody;\n\n // We already have some data\n if (this.meta || this.originalData || this.isInit) {\n // We don't use server side data\n if (!this.options.server || (this.options.server && !this.fireEvents)) {\n this.log(\"skip loadData\");\n flagEmpty();\n return new Promise((resolve) => {\n resolve();\n });\n }\n }\n this.log(\"loadData\");\n this.loading = true;\n this.classList.add(\"dg-loading\");\n this.classList.remove(\"dg-empty\", \"dg-network-error\");\n return (\n this.fetchData()\n .then((response) => {\n // We can get a straight array or an object\n if (Array.isArray(response)) {\n this.data = response;\n } else {\n // Object must contain data key\n if (!response[this.options.serverParams.dataKey]) {\n console.error(\n \"Invalid response, it should contain a data key with an array or be a plain array\",\n response,\n );\n this.options.url = null;\n return;\n }\n\n // We may have a config object\n this.options = Object.assign(\n this.options,\n response[this.options.serverParams.optionsKey] ?? {},\n );\n // It should return meta data (see metaFilteredKey)\n this.meta = response[this.options.serverParams.metaKey] ?? {};\n this.data = response[this.options.serverParams.dataKey];\n }\n this.originalData = this.data.slice();\n this.fixPage();\n\n // Make sure we have a proper set of columns\n if (this.options.columns.length === 0 && this.originalData.length) {\n this.options.columns = this.convertColumns(Object.keys(this.originalData[0]));\n } else {\n this.options.columns = this.convertColumns(this.options.columns);\n }\n })\n .catch((err) => {\n this.log(err);\n tbody.setAttribute(\n \"data-empty\",\n this.options.errorMessage ||\n err.message?.replace(/^\\s+|\\r\\n|\\n|\\r$/g, \"\") ||\n labels.networkError,\n );\n this.classList.add(\"dg-empty\", \"dg-network-error\");\n dispatch(this, \"loadDataFailed\", err);\n })\n // @ts-ignore\n .finally(() => {\n flagEmpty();\n if (!this.hasDataError && tbody.getAttribute(\"data-empty\") !== this.labels.noData) {\n tbody.setAttribute(\"data-empty\", this.labels.noData);\n }\n this.classList.remove(\"dg-loading\");\n setAttribute(this.table, \"aria-rowcount\", this.data.length);\n this.loading = false;\n })\n );\n }\n\n getFirst() {\n if (this.loading) {\n return;\n }\n this.page = 1;\n }\n\n getLast() {\n if (this.loading) {\n return;\n }\n this.page = this.pages;\n }\n\n getPrev() {\n if (this.loading) {\n return;\n }\n this.page = this.page - 1;\n }\n\n getNext() {\n if (this.loading) {\n return;\n }\n this.page = this.page + 1;\n }\n\n gotoPage(event) {\n if (event.type === \"keypress\") {\n const key = event.keyCode || event.key;\n if (key === 13 || key === \"Enter\") {\n event.preventDefault();\n } else {\n return;\n }\n }\n this.page = Number.parseInt(this.inputPage.value);\n }\n\n getSort() {\n const col = this.querySelector(\"thead tr.dg-head-columns th[aria-sort$='scending']\");\n if (col) {\n return col.getAttribute(\"field\");\n }\n return this.options.defaultSort;\n }\n\n getSortDir() {\n const col = this.querySelector(\"thead tr.dg-head-columns th[aria-sort$='scending']\");\n if (col) {\n return col.getAttribute(\"aria-sort\") || \"\";\n }\n return \"\";\n }\n\n getFilters() {\n const filters = [];\n const inputs = findAll(this, this._filterSelector);\n for (const input of inputs) {\n filters[input.dataset.name] = input.value;\n }\n return filters;\n }\n\n clearFilters() {\n const inputs = findAll(this, this._filterSelector);\n for (const input of inputs) {\n input.value = \"\";\n }\n this.filterData();\n }\n\n filterData() {\n this.log(\"filter data\");\n\n this.page = 1;\n\n if (this.options.server) {\n this.reload();\n } else {\n this.data = this.originalData?.slice() ?? [];\n\n // Look for rows matching the filters\n const inputs = findAll(this, this._filterSelector);\n for (const input of inputs) {\n const value = input.value;\n if (value) {\n const name = input.dataset.name;\n this.data = this.data.filter((item) => {\n const str = `${item[name]}`;\n return str.toLowerCase().indexOf(value.toLowerCase()) !== -1;\n });\n }\n }\n this.pageChanged();\n\n const col = this.querySelector(\"thead tr.dg-head-columns th[aria-sort$='scending']\");\n if (this.options.sort && col) {\n this.sortData();\n } else {\n this.renderBody();\n }\n }\n }\n\n /**\n * Data will be sorted then rendered using renderBody\n * @param {Element} baseCol The column that was clicked or null to use current sort\n */\n sortData(baseCol = null) {\n this.log(\"sort data\");\n\n let col = baseCol;\n\n // Early exit\n if (col && this.getColProp(col.getAttribute(\"field\"), \"noSort\")) {\n this.log(\"sorting prevented because column is not sortable\");\n return;\n }\n if (this.plugins.ColumnResizer?.isResizing) {\n this.log(\"sorting prevented because resizing\");\n return;\n }\n if (this.loading) {\n this.log(\"sorting prevented because loading\");\n return;\n }\n\n // We clicked on a column, update sort state\n if (col !== null) {\n // Remove active sort if any\n const haveClasses = (c) => [\"dg-selectable\", \"dg-actions\", \"dg-responsive-toggle\"].includes(c);\n\n const headers = findAll(this, \"thead tr:first-child th\");\n for (const th of headers) {\n // @ts-ignore\n if ([...th.classList].some(haveClasses)) {\n continue;\n }\n if (th !== col) {\n th.setAttribute(\"aria-sort\", \"none\");\n }\n }\n\n // Set tristate col\n if (!col.hasAttribute(\"aria-sort\") || col.getAttribute(\"aria-sort\") === \"none\") {\n col.setAttribute(\"aria-sort\", \"ascending\");\n } else if (col.getAttribute(\"aria-sort\") === \"ascending\") {\n col.setAttribute(\"aria-sort\", \"descending\");\n } else if (col.getAttribute(\"aria-sort\") === \"descending\") {\n col.setAttribute(\"aria-sort\", \"none\");\n }\n } else {\n // Or fetch current sort\n col = this.querySelector(\"thead tr.dg-head-columns th[aria-sort$='scending']\");\n }\n\n if (this.options.server) {\n // Reload data with updated sort\n this.loadData().finally(() => {\n this.renderBody();\n });\n } else {\n const sort = col ? col.getAttribute(\"aria-sort\") : \"none\";\n if (sort === \"none\") {\n const stack = [];\n\n // Restore order while keeping filters\n this.originalData?.some((itemA) => {\n this.data.some((itemB) => {\n if (JSON.stringify(itemA) === JSON.stringify(itemB)) {\n stack.push(itemB);\n return true;\n }\n return false;\n });\n return stack.length === this.data.length;\n });\n\n this.data = stack;\n } else {\n const field = col.getAttribute(\"field\");\n this.data.sort((a, b) => {\n if (!isNaN(a[field]) && !isNaN(b[field])) {\n return sort === \"ascending\" ? a[field] - b[field] : b[field] - a[field];\n }\n const valA = sort === \"ascending\" ? a[field].toUpperCase() : b[field].toUpperCase();\n const valB = sort === \"ascending\" ? b[field].toUpperCase() : a[field].toUpperCase();\n\n switch (true) {\n case valA > valB:\n return 1;\n case valA < valB:\n return -1;\n case valA === valB:\n return 0;\n }\n });\n }\n this.renderBody();\n }\n }\n\n _sort(columnName, sortDir) {\n const col = this.querySelector(`.dg-head-columns th[field=${columnName}]`);\n const dir = sortDir === \"ascending\" ? \"none\" : sortDir === \"descending\" ? \"ascending\" : \"descending\";\n col?.setAttribute(\"aria-sort\", dir);\n this.sortData(col);\n }\n\n sortAsc = (columnName) => this._sort(columnName, \"ascending\");\n sortDesc = (columnName) => this._sort(columnName, \"descending\");\n sortNone = (columnName) => this._sort(columnName, \"none\");\n\n fetchData() {\n if (!this.options.url) {\n return new Promise((resolve, reject) => reject(\"No url set\"));\n }\n\n let base = window.location.href;\n // Fix trailing slash if no extension is present\n if (!base.split(\"/\").pop().includes(\".\")) {\n base += base.endsWith(\"/\") ? \"\" : \"/\";\n }\n const url = new URL(this.options.url, base);\n let params = {\n r: Date.now(),\n };\n if (this.options.server) {\n // 0 based\n params[this.options.serverParams.start] = this.page - 1;\n params[this.options.serverParams.length] = this.options.perPage;\n if (this.options.filter) params[this.options.serverParams.search] = this.getFilters();\n params[this.options.serverParams.sort] = this.getSort() || \"\";\n params[this.options.serverParams.sortDir] = this.getSortDir();\n\n // extra params ?\n if (this.meta?.[this.options.serverParams.paramsKey]) {\n params = Object.assign(params, this.meta[this.options.serverParams.paramsKey]);\n }\n }\n\n appendParamsToUrl(url, params);\n\n return fetch(url).then((response) => {\n const newError = new Error(response.statusText || labels.networkError);\n if (!response.ok) {\n // @ts-ignore\n newError.response = response;\n throw newError;\n }\n return response\n .clone()\n .json()\n .catch((err) => {\n let error = err;\n if (!this.options.debug) {\n error = newError;\n }\n error.response = response;\n throw error;\n });\n });\n }\n\n renderTable() {\n this.log(\"render table\");\n\n if (this.options.menu && this.plugins.ContextMenu) {\n this.plugins.ContextMenu.createMenu();\n }\n\n let sortedColumn;\n\n this.renderHeader();\n if (this.options.defaultSort) {\n // We can have a default sort even with sort disabled\n sortedColumn = this.querySelector(`thead tr.dg-head-columns th[field=\"${this.options.defaultSort}\"]`);\n }\n\n if (sortedColumn) {\n this.sortData(sortedColumn);\n } else {\n this.renderBody();\n }\n\n this.renderFooter();\n }\n\n /**\n * Create table header\n * - One row for the column headers\n * - One row for the filters\n */\n renderHeader() {\n this.log(\"render header\");\n\n const thead = this.thead;\n this.createColumnHeaders(thead);\n this.createColumnFilters(thead);\n\n if (this.options.resizable && this.plugins.ColumnResizer) {\n this.plugins.ColumnResizer.renderResizer(labels.resizeColumn);\n }\n\n dispatch(this, \"headerRendered\");\n }\n\n renderFooter() {\n this.log(\"render footer\");\n\n const tfoot = this.tfoot;\n const td = tfoot.querySelector(\"td\");\n tfoot.removeAttribute(\"hidden\");\n setAttribute(td, \"colspan\", this.columnsLength(true));\n tfoot.style.display = \"\";\n }\n\n /**\n * Create the column headers based on column definitions and set options\n * @param {HTMLTableSectionElement} thead\n */\n createColumnHeaders(thead) {\n // @link https://stackoverflow.com/questions/21064101/understanding-offsetwidth-clientwidth-scrollwidth-and-height-respectively\n const availableWidth = this.clientWidth;\n const colMaxWidth = Math.round((availableWidth / this.columnsLength(true)) * 2);\n\n let idx = 0;\n let tr;\n\n // Create row\n tr = ce(\"tr\");\n this.headerRow = tr;\n tr.setAttribute(\"role\", \"row\");\n tr.setAttribute(\"aria-rowindex\", \"1\");\n tr.setAttribute(\"class\", \"dg-head-columns\");\n\n // We need a real th from the dom to compute the size\n let sampleTh = thead.querySelector(\"tr.dg-head-columns th\");\n if (!sampleTh) {\n sampleTh = ce(\"th\");\n thead.querySelector(\"tr\").appendChild(sampleTh);\n }\n\n if (this.options.selectable && this.plugins.SelectableRows) {\n this.plugins.SelectableRows.createHeaderCol(tr);\n }\n if (this.options.responsive && this.plugins.ResponsiveGrid && this.plugins.ResponsiveGrid.hasHiddenColumns()) {\n this.plugins.ResponsiveGrid.createHeaderCol(tr);\n }\n\n // Create columns\n idx = 0;\n let totalWidth = 0;\n\n for (const column of this.options.columns) {\n if (column.attr) {\n continue;\n }\n const colIdx = idx + this.startColIndex();\n const th = ce(\"th\");\n th.setAttribute(\"scope\", \"col\");\n th.setAttribute(\"role\", \"columnheader button\");\n th.setAttribute(\"aria-colindex\", `${colIdx}`);\n th.setAttribute(\"id\", randstr(\"dg-col-\"));\n if (this.options.sort) {\n th.setAttribute(\"aria-sort\", \"none\");\n }\n th.setAttribute(\"field\", column.field);\n if (this.plugins.ResponsiveGrid && this.options.responsive) {\n setAttribute(th, \"data-responsive\", column.responsive || \"\");\n }\n // Make sure the header fits (+ add some room for sort icon if necessary)\n const computedWidth = getTextWidth(column.title, sampleTh, true) + 20;\n th.dataset.minWidth = `${computedWidth}`;\n applyColumnDefinition(th, column);\n th.tabIndex = 0;\n th.textContent = column.title;\n\n let w = 0;\n // Autosize small based on first/last row ?\n // Take into account minWidth of the header and max available size based on col numbers\n if (this.options.autosize && this.plugins.AutosizeColumn) {\n const colAvailableWidth = Math.min(availableWidth - totalWidth, colMaxWidth);\n w = this.plugins.AutosizeColumn.computeSize(\n th,\n column,\n Number.parseInt(th.dataset.minWidth),\n colAvailableWidth,\n );\n } else {\n w = Math.max(Number.parseInt(th.dataset.minWidth), Number.parseInt(th.getAttribute(\"width\")));\n }\n\n setAttribute(th, \"width\", w);\n if (column.hidden) {\n th.setAttribute(\"hidden\", \"\");\n } else {\n totalWidth += w;\n }\n\n // Reorder columns with drag/drop\n if (this.options.reorder && this.plugins.DraggableHeaders) {\n this.plugins.DraggableHeaders.makeHeaderDraggable(th);\n }\n\n tr.appendChild(th);\n idx++;\n }\n\n // There is too much available width, and we want to avoid fixed layout to split remaining amount\n if (totalWidth < availableWidth) {\n const visibleCols = findAll(tr, \"th:not([hidden],.dg-not-resizable)\");\n if (visibleCols.length) {\n const lastCol = visibleCols[visibleCols.length - 1];\n removeAttribute(lastCol, \"width\");\n }\n }\n\n // Actions\n if (this.options.actions.length && this.plugins.RowActions) {\n this.plugins.RowActions.makeActionHeader(tr);\n }\n\n thead.replaceChild(tr, thead.querySelector(\"tr.dg-head-columns\"));\n\n // Once columns are inserted, we have an actual dom to query\n if (thead.offsetWidth > availableWidth) {\n this.log(`adjust width to fix size, ${thead.offsetWidth} > ${availableWidth}`);\n const scrollbarWidth = this.offsetWidth - this.clientWidth;\n let diff = thead.offsetWidth - availableWidth - scrollbarWidth;\n if (this.options.responsive && this.plugins.ResponsiveGrid) {\n diff += scrollbarWidth;\n }\n // Remove diff for columns that can afford it\n const thWithWidth = findAll(tr, \"th[width]\");\n\n for (const th of thWithWidth) {\n if (hasClass(th, \"dg-not-resizable\")) {\n continue;\n }\n if (diff <= 0) {\n continue;\n }\n const actualWidth = Number.parseInt(th.getAttribute(\"width\"));\n const minWidth = th.dataset.minWidth ? Number.parseInt(th.dataset.minWidth) : 0;\n if (actualWidth > minWidth) {\n let newWidth = actualWidth - diff;\n if (newWidth < minWidth) {\n newWidth = minWidth;\n }\n diff -= actualWidth - newWidth;\n setAttribute(th, \"width\", newWidth);\n }\n }\n }\n\n // Context menu\n if (this.options.menu && this.plugins.ContextMenu) {\n this.plugins.ContextMenu.attachContextMenu();\n }\n\n // Sort col on click\n const rowsWithSort = findAll(tr, \"[aria-sort]\");\n for (const sortableRow of rowsWithSort) {\n sortableRow.addEventListener(\"click\", () => this.sortData(sortableRow));\n }\n\n setAttribute(this.table, \"aria-colcount\", this.columnsLength(true));\n }\n\n createColumnFilters(thead) {\n let idx = 0;\n let tr;\n\n // Create row for filters\n tr = ce(\"tr\");\n this.filterRow = tr;\n tr.setAttribute(\"role\", \"row\");\n tr.setAttribute(\"aria-rowindex\", \"2\");\n tr.setAttribute(\"class\", \"dg-head-filters\");\n if (!this.options.filter) {\n tr.setAttribute(\"hidden\", \"\");\n }\n\n if (this.options.selectable && this.plugins.SelectableRows) {\n this.plugins.SelectableRows.createFilterCol(tr);\n }\n if (this.options.responsive && this.plugins.ResponsiveGrid && this.plugins.ResponsiveGrid.hasHiddenColumns()) {\n this.plugins.ResponsiveGrid.createFilterCol(tr);\n }\n\n for (const column of this.options.columns) {\n if (column.attr) {\n continue;\n }\n const colIdx = idx + this.startColIndex();\n const relatedTh = thead.querySelector(`tr.dg-head-columns th[aria-colindex=\"${colIdx}\"]`);\n if (!relatedTh) {\n console.warn(\"Related th not found\", colIdx);\n continue;\n }\n const th = ce(\"th\");\n th.setAttribute(\"aria-colindex\", `${colIdx}`);\n\n const filter = this.createFilterElement(column, relatedTh);\n if (!this.options.filter) {\n th.tabIndex = 0;\n } else {\n filter.tabIndex = 0;\n }\n\n if (column.hidden) {\n th.setAttribute(\"hidden\", \"\");\n }\n\n th.appendChild(filter);\n tr.appendChild(th);\n idx++;\n }\n\n // Actions\n if (this.options.actions.length && this.plugins.RowActions) {\n this.plugins.RowActions.makeActionFilter(tr);\n }\n\n thead.replaceChild(tr, thead.querySelector(\"tr.dg-head-filters\"));\n\n if (typeof this.options.filterKeypressDelay !== \"number\" || this.options.filterOnEnter)\n this.options.filterKeypressDelay = 0;\n\n // Filter content by field events\n const filteredRows = findAll(tr, this._filterSelector);\n for (const el of filteredRows) {\n const eventName = /select/i.test(el.tagName) ? \"change\" : \"keyup\";\n const eventHandler = debounce((e) => {\n const key = e.keyCode || e.key;\n const isKeyPressFilter = !this.options.filterOnEnter && !this._excludedKeys.some((k) => k === key);\n if (key === 13 || key === \"Enter\" || isKeyPressFilter || e.type === \"change\") {\n this.filterData.call(this);\n }\n }, this.options.filterKeypressDelay);\n el.addEventListener(eventName, eventHandler);\n }\n }\n\n createFilterElement(column, relatedTh) {\n const isSelect = column.filterType === \"select\";\n const filter = isSelect ? ce(\"select\") : ce(\"input\");\n if (isSelect) {\n if (!Array.isArray(column.filterList)) {\n // Gets unique values from column records\n const uniqueValues = [...new Set((this.data ?? []).map((e) => e[column.field]))]\n .filter((v) => v)\n .sort();\n column.filterList = [column.firstFilterOption || this.defaultColumn.firstFilterOption].concat(\n uniqueValues.map((e) => ({ value: e, text: e })),\n );\n }\n\n for (const e of column.filterList) {\n const opt = ce(\"option\");\n opt.value = e.value;\n opt.text = e.text;\n\n if (filter instanceof HTMLSelectElement) {\n filter.add(opt);\n }\n }\n } else {\n //@ts-ignore\n filter.type = \"text\";\n filter.inputMode = \"search\";\n filter.autocomplete = \"off\";\n filter.spellcheck = false;\n }\n // Allows binding filter to this column\n filter.dataset.name = column.field;\n filter.id = randstr(\"dg-filter-\");\n // Don't use aria-label as it triggers autocomplete\n filter.setAttribute(\"aria-labelledby\", relatedTh.getAttribute(\"id\"));\n return filter;\n }\n\n /**\n * Render the data as rows in tbody\n * It will call paginate() at the end\n */\n renderBody() {\n this.log(\"render body\");\n let tr;\n let td;\n let idx;\n const tbody = ce(\"tbody\");\n\n this.data.forEach((item, i) => {\n tr = ce(\"tr\");\n setAttribute(tr, \"role\", \"row\");\n setAttribute(tr, \"hidden\", \"\");\n setAttribute(tr, \"aria-rowindex\", i + 1);\n tr.tabIndex = 0;\n\n if (this.options.selectable && this.plugins.SelectableRows) {\n this.plugins.SelectableRows.createDataCol(tr);\n }\n if (\n this.options.responsive &&\n this.plugins.ResponsiveGrid &&\n this.plugins.ResponsiveGrid.hasHiddenColumns()\n ) {\n this.plugins.ResponsiveGrid.createDataCol(tr);\n }\n\n // Expandable\n if (this.options.expand) {\n tr.classList.add(\"dg-expandable\");\n\n on(tr, \"click\", (ev) => {\n if (this.plugins.ResponsiveGrid) {\n this.plugins.ResponsiveGrid.blockObserver();\n }\n toggleClass(ev.currentTarget, \"dg-expanded\");\n if (this.plugins.ResponsiveGrid) {\n this.plugins.ResponsiveGrid.unblockObserver();\n }\n });\n }\n\n idx = 0;\n\n for (const column of this.options.columns) {\n if (!column) {\n console.error(\"Empty column found!\", this.options.columns);\n }\n // It should be applied as an attr of the row\n if (column.attr) {\n if (item[column.field]) {\n // Special case if we try to write over the class attr\n if (column.attr === \"class\") {\n addClass(tr, item[column.field]);\n } else {\n tr.setAttribute(column.attr, item[column.field]);\n }\n }\n return;\n }\n td = ce(\"td\");\n td.setAttribute(\"role\", \"gridcell\");\n td.setAttribute(\"aria-colindex\", `${idx}${this.startColIndex()}`);\n applyColumnDefinition(td, column);\n // This is required for pure css responsive layout\n td.setAttribute(\"data-name\", column.title);\n td.tabIndex = -1;\n\n // Inline editing ...\n if (column.editable && this.plugins.EditableColumn) {\n addClass(td, \"dg-editable-col\");\n this.plugins.EditableColumn.makeEditableInput(td, column, item, i);\n } else {\n // ... or formatting\n const v = item[column.field] ?? \"\";\n let tv;\n // TODO: make this modular\n switch (column.transform) {\n case \"uppercase\":\n tv = v.toUpperCase();\n break;\n case \"lowercase\":\n tv = v.toLowerCase();\n break;\n default:\n tv = v;\n break;\n }\n if (column.format) {\n // Only use formatting with values or if defaultFormatValue is set\n if (column.defaultFormatValue !== undefined && (tv === \"\" || tv === null)) {\n tv = `${column.defaultFormatValue}`;\n }\n if (typeof column.format === \"string\" && tv) {\n td.innerHTML = interpolate(\n // @ts-ignore\n column.format,\n Object.assign(\n {\n _v: v,\n _tv: tv,\n },\n item,\n ),\n );\n } else if (column.format instanceof Function) {\n const val = column.format.call(this, { column, rowData: item, cellData: tv, td, tr });\n td.innerHTML = val || tv || v;\n }\n } else {\n td.textContent = tv;\n }\n }\n tr.appendChild(td);\n idx++;\n }\n\n // Actions\n if (this.options.actions.length && this.plugins.RowActions) {\n this.plugins.RowActions.makeActionRow(tr, item);\n }\n\n tbody.appendChild(tr);\n });\n\n tbody.setAttribute(\"role\", \"rowgroup\");\n\n // Keep data empty message\n const prev = this.tbody;\n tbody.setAttribute(\"data-empty\", prev.getAttribute(\"data-empty\"));\n this.table.replaceChild(tbody, prev);\n\n if (this.plugins.FixedHeight) {\n this.plugins.FixedHeight.createFakeRow();\n }\n\n this.paginate();\n\n if (this.plugins.SelectableRows) {\n this.plugins.SelectableRows.shouldSelectAll(tbody);\n }\n\n this.data.length && this.classList.remove(\"dg-empty\");\n\n dispatch(this, \"bodyRendered\");\n }\n\n paginate() {\n this.log(\"paginate\");\n\n const total = this.totalRecords();\n const p = this.page || 1;\n const tbody = this.tbody;\n const tfoot = this.tfoot;\n const bodyRows = findAll(tbody, \"tr\");\n\n // Refresh page count in case we added/removed a page\n this.pages = this.totalPages();\n\n let index;\n let high = p * this.options.perPage;\n let low = high - this.options.perPage + 1;\n\n if (high > total) {\n high = total;\n }\n if (!total) {\n low = 0;\n }\n\n // Display all rows within the set indexes\n // For server side paginated grids, we display everything\n // since the server is taking care of actual pagination\n for (const tr of bodyRows) {\n if (this.options.server) {\n removeAttribute(tr, \"hidden\");\n continue;\n }\n index = Number(getAttribute(tr, \"aria-rowindex\"));\n if (index > high || index < low) {\n setAttribute(tr, \"hidden\", \"\");\n } else {\n removeAttribute(tr, \"hidden\");\n }\n }\n\n if (this.options.selectable && this.plugins.SelectableRows) {\n this.plugins.SelectableRows.clearCheckboxes(tbody);\n }\n\n // Store default height and update styles if needed\n if (this.plugins.FixedHeight) {\n this.plugins.FixedHeight.updateFakeRow();\n }\n\n // Enable/disable buttons if shown\n if (this.btnFirst) {\n this.btnFirst.disabled = this.page <= 1;\n this.btnPrev.disabled = this.page <= 1;\n this.btnNext.disabled = this.page >= this.pages;\n this.btnLast.disabled = this.page >= this.pages;\n }\n tfoot.querySelector(\".dg-low\").textContent = low.toString();\n tfoot.querySelector(\".dg-high\").textContent = high.toString();\n tfoot.querySelector(\".dg-total\").textContent = `${this.totalRecords()}`;\n tfoot.toggleAttribute(\"hidden\", this.options.autohidePager && this.options.perPage > this.totalRecords());\n }\n\n /**\n * @returns {number}\n */\n totalPages() {\n return Math.ceil(this.totalRecords() / this.options.perPage);\n }\n\n /**\n * @returns {number}\n */\n totalRecords() {\n if (this.options.server) {\n return this.meta?.[this.options.serverParams.metaFilteredKey] || 0;\n }\n return this.data.length;\n }\n}\n\nexport default DataGrid;\n", "/** @typedef {import(\"../data-grid\").default} DataGrid */\n\nclass BasePlugin {\n /**\n * @param {DataGrid} grid\n */\n constructor(grid) {\n this.grid = grid;\n }\n\n connected() {}\n\n disconnected() {}\n\n /**\n * Handle events within the plugin\n * @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#handling-events\n * @param {Event} event\n */\n handleEvent(event) {\n if (this[`on${event.type}`]) {\n this[`on${event.type}`](event);\n }\n }\n}\n\nexport default BasePlugin;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport elementOffset from \"../utils/elementOffset.js\";\nimport {\n addClass,\n dispatch,\n findAll,\n getAttribute,\n hasClass,\n off,\n on,\n removeAttribute,\n removeClass,\n setAttribute,\n} from \"../utils/shortcuts.js\";\n\n/**\n * Allows to resize columns\n */\nclass ColumnResizer extends BasePlugin {\n constructor(grid) {\n super(grid);\n this.isResizing = false;\n }\n\n /**\n * @param {String} resizeLabel\n */\n renderResizer(resizeLabel) {\n const grid = this.grid;\n const table = grid.table;\n const cols = findAll(grid, \"thead tr.dg-head-columns th\");\n\n for (const col of cols) {\n if (hasClass(col, \"dg-not-resizable\")) {\n continue;\n }\n // Create a resizer element\n const resizer = document.createElement(\"div\");\n addClass(resizer, \"dg-resizer\");\n resizer.ariaLabel = resizeLabel;\n\n // Add a resizer element to the column\n col.appendChild(resizer);\n\n // Handle resizing\n let startX = 0;\n let startW = 0;\n let remainingSpace = 0;\n let max = 0;\n\n const mouseMoveHandler = (e) => {\n if (e.clientX > max) {\n return;\n }\n const newWidth = startW + (e.clientX - startX);\n if (col.dataset.minWidth && newWidth > Number.parseInt(col.dataset.minWidth)) {\n setAttribute(col, \"width\", newWidth);\n }\n };\n\n // When user releases the mouse, remove the existing event listeners\n const mouseUpHandler = () => {\n grid.log(\"resized column\");\n\n // Prevent accidental sorting if mouse is not over resize handler\n setTimeout(() => {\n this.isResizing = false;\n }, 0);\n\n removeClass(resizer, \"dg-resizer-active\");\n if (grid.options.reorder) {\n col.draggable = true;\n }\n col.style.overflow = \"hidden\";\n\n // Remove handlers\n off(document, \"mousemove\", mouseMoveHandler);\n off(document, \"mouseup\", mouseUpHandler);\n\n dispatch(grid, \"columnResized\", {\n col: getAttribute(col, \"field\"),\n width: getAttribute(col, \"width\"),\n });\n };\n\n // Otherwise it could sort the col\n on(resizer, \"click\", (e) => {\n e.stopPropagation();\n });\n\n on(resizer, \"mousedown\", (e) => {\n e.stopPropagation();\n\n this.isResizing = true;\n\n const target = e.target;\n const currentCols = findAll(grid, \"dg-head-columns th\");\n const visibleCols = currentCols.filter((col) => {\n return !col.hasAttribute(\"hidden\");\n });\n const columnIndex = visibleCols.findIndex((column) => column === target.parentNode);\n grid.log(\"resize column\");\n\n addClass(resizer, \"dg-resizer-active\");\n\n // Make sure we don't drag it\n removeAttribute(col, \"draggable\");\n\n // Allow overflow when resizing\n col.style.overflow = \"visible\";\n\n // Show full column height (-1 to avoid scrollbar)\n resizer.style.height = `${table.offsetHeight - 1}px`;\n\n // Register initial data\n startX = e.clientX;\n startW = col.offsetWidth;\n\n remainingSpace = (visibleCols.length - columnIndex) * 30;\n max = elementOffset(target).left + grid.offsetWidth - remainingSpace;\n\n // Remove width from next columns to allow auto layout\n setAttribute(col, \"width\", startW);\n for (let j = 0; j < visibleCols.length; j++) {\n if (j > columnIndex) {\n removeAttribute(cols[j], \"width\");\n }\n }\n\n // Attach handlers\n on(document, \"mousemove\", mouseMoveHandler);\n on(document, \"mouseup\", mouseUpHandler);\n });\n }\n }\n}\n\nexport default ColumnResizer;\n", "/**\n * @param {HTMLElement} el\n * @param {String} type\n * @param {String} prop\n * @returns {HTMLElement}\n */\nexport default function getParentElement(el, type, prop = \"nodeName\") {\n let parent = el;\n while (parent[prop] !== type) {\n parent = parent.parentElement;\n }\n return parent;\n}\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport getParentElement from \"../utils/getParentElement.js\";\nimport { find, off, on, removeAttribute, setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Create a right click menu on the headers\n */\nclass ContextMenu extends BasePlugin {\n connected() {\n /**\n * @type {HTMLUListElement}\n */\n this.menu = this.grid.querySelector(\".dg-menu\");\n }\n disconnected() {\n if (this.grid.headerRow) {\n off(this.grid.headerRow, \"contextmenu\", this);\n }\n }\n\n attachContextMenu() {\n const grid = this.grid;\n on(grid.headerRow, \"contextmenu\", this);\n }\n\n onchange(e) {\n const grid = this.grid;\n const t = e.target;\n const field = t.dataset.name;\n if (t.checked) {\n grid.showColumn(field);\n } else {\n // Prevent hidding last\n if (grid.visibleColumns().length <= 1) {\n // Restore checkbox value\n t.checked = true;\n return;\n }\n grid.hideColumn(field);\n }\n grid.fixPage(); //fixes Chrome footer flexbox resize issues that may appear when there is a large number of columns (i.e. more than 10).\n }\n\n oncontextmenu(e) {\n e.preventDefault();\n const grid = this.grid;\n const target = getParentElement(e.target, \"THEAD\");\n const menu = this.menu;\n const rect = target.getBoundingClientRect();\n let x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n menu.style.top = `${y}px`;\n menu.style.left = `${x}px`;\n\n removeAttribute(menu, \"hidden\");\n if (x + 150 > rect.width) {\n x -= menu.offsetWidth;\n menu.style.left = `${x}px`;\n }\n\n const documentClickHandler = (e) => {\n if (!menu.contains(e.target)) {\n setAttribute(menu, \"hidden\", \"\");\n off(document, \"click\", documentClickHandler);\n }\n };\n on(document, \"click\", documentClickHandler);\n }\n createMenu() {\n const grid = this.grid;\n const menu = this.menu;\n while (menu.lastChild) {\n menu.removeChild(menu.lastChild);\n }\n menu.addEventListener(\"change\", this);\n\n for (const col of grid.options.columns) {\n if (col.attr) {\n continue;\n }\n const li = document.createElement(\"li\");\n const label = document.createElement(\"label\");\n const checkbox = document.createElement(\"input\");\n setAttribute(checkbox, \"type\", \"checkbox\");\n setAttribute(checkbox, \"data-name\", col.field);\n if (!col.hidden) {\n checkbox.checked = true;\n }\n const text = document.createTextNode(col.title);\n\n label.appendChild(checkbox);\n label.appendChild(text);\n\n li.appendChild(label);\n menu.appendChild(li);\n }\n }\n}\n\nexport default ContextMenu;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport getParentElement from \"../utils/getParentElement.js\";\nimport { dispatch, findAll, getAttribute, on, setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Allows to move headers\n */\nclass DraggableHeaders extends BasePlugin {\n /**\n * @param {HTMLTableCellElement} th\n */\n makeHeaderDraggable(th) {\n const grid = this.grid;\n th.draggable = true;\n on(th, \"dragstart\", (e) => {\n if (grid.plugins.ColumnResizer?.isResizing && e.preventDefault) {\n e.preventDefault();\n return;\n }\n grid.log(\"reorder col\");\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", e.target.getAttribute(\"aria-colindex\"));\n });\n on(th, \"dragover\", (e) => {\n if (e.preventDefault) {\n e.preventDefault();\n }\n e.dataTransfer.dropEffect = \"move\";\n return false;\n });\n on(th, \"drop\", (e) => {\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n const t = e.target;\n const target = getParentElement(t, \"TH\");\n const index = Number.parseInt(e.dataTransfer.getData(\"text/plain\"));\n const targetIndex = Number.parseInt(target.getAttribute(\"aria-colindex\"));\n\n if (index === targetIndex) {\n grid.log(\"reordered col stayed the same\");\n return;\n }\n grid.log(`reordered col from ${index} to ${targetIndex}`);\n\n const offset = grid.startColIndex();\n const tmp = grid.options.columns[index - offset];\n grid.options.columns[index - offset] = grid.options.columns[targetIndex - offset];\n grid.options.columns[targetIndex - offset] = tmp;\n\n const swapNodes = (selector, el1) => {\n const rowIndex = el1.parentNode.getAttribute(\"aria-rowindex\");\n const el2 = grid.querySelector(\n `${selector} tr[aria-rowindex=\"${rowIndex}\"] [aria-colindex=\"${targetIndex}\"]`,\n );\n setAttribute(el1, \"aria-colindex\", targetIndex);\n setAttribute(el2, \"aria-colindex\", index);\n const newNode = document.createElement(\"th\");\n el1.parentNode.insertBefore(newNode, el1);\n el2.parentNode.replaceChild(el1, el2);\n newNode.parentNode.replaceChild(el2, newNode);\n };\n\n // Swap all rows in header and body\n for (const el1 of findAll(grid, `thead th[aria-colindex=\"${index}\"]`)) {\n swapNodes(\"thead\", el1);\n }\n for (const el1 of findAll(grid, `tbody td[aria-colindex=\"${index}\"]`)) {\n swapNodes(\"tbody\", el1);\n }\n\n // Updates the columns\n grid.options.columns = findAll(grid, \"thead tr.dg-head-columns th[field]\").map((th) =>\n grid.options.columns.find((c) => c.field === getAttribute(th, \"field\")),\n );\n\n dispatch(grid, \"columnReordered\", {\n col: tmp.field,\n from: index,\n to: targetIndex,\n });\n return false;\n });\n }\n}\n\nexport default DraggableHeaders;\n", "import BasePlugin from \"../core/base-plugin.js\";\n\n/**\n * Allows to paginate with horizontal swipe motions\n */\nclass TouchSupport extends BasePlugin {\n constructor(grid) {\n super(grid);\n this.touch = null;\n }\n connected() {\n const grid = this.grid;\n grid.addEventListener(\"touchstart\", this, { passive: true });\n grid.addEventListener(\"touchmove\", this, { passive: true });\n }\n\n disconnected() {\n const grid = this.grid;\n grid.removeEventListener(\"touchstart\", this);\n grid.removeEventListener(\"touchmove\", this);\n }\n\n ontouchstart(e) {\n this.touch = e.touches[0];\n }\n\n ontouchmove(e) {\n if (!this.touch) {\n return;\n }\n const grid = this.grid;\n const xDiff = this.touch.clientX - e.touches[0].clientX;\n const yDiff = this.touch.clientY - e.touches[0].clientY;\n\n if (Math.abs(xDiff) > Math.abs(yDiff)) {\n if (xDiff > 0) {\n grid.getNext();\n } else {\n grid.getPrev();\n }\n }\n this.touch = null;\n }\n}\n\nexport default TouchSupport;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport { dispatch, findAll, hasClass, setAttribute } from \"../utils/shortcuts.js\";\n\nconst SELECTABLE_CLASS = \"dg-selectable\";\nconst SELECT_ALL_CLASS = \"dg-select-all\";\nconst CHECKBOX_CLASS = \"form-check-input\"; //bs5\n\n/**\n * Allows to select rows\n */\nclass SelectableRows extends BasePlugin {\n disconnected() {\n if (this.selectAll) {\n this.selectAll.removeEventListener(\"change\", this);\n }\n }\n\n /**\n * @param {String} key Return a specific key (eg: id) instead of the whole row\n * @returns {Array}\n */\n getSelection(key = null) {\n const grid = this.grid;\n const selectedData = [];\n\n const inputs = findAll(grid, `tbody .${SELECTABLE_CLASS} input:checked`);\n\n for (const checkbox of inputs) {\n const idx = Number.parseInt(checkbox.dataset.id);\n const item = grid.data[idx - 1];\n if (!item) {\n console.warn(`Item ${idx} not found`);\n }\n if (key) {\n selectedData.push(item[key]);\n } else {\n selectedData.push(item);\n }\n }\n return selectedData;\n }\n\n /**\n * Uncheck box if hidden and visible only\n * @param {HTMLTableSectionElement} tbody\n */\n clearCheckboxes(tbody) {\n const grid = this.grid;\n if (!grid.options.selectVisibleOnly) {\n return;\n }\n const inputs = findAll(tbody, `tr[hidden] .${SELECTABLE_CLASS} input`);\n for (const input of inputs) {\n input.checked = false;\n }\n this.selectAll.checked = false;\n }\n\n colIndex() {\n return this.grid.startColIndex() - 2;\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createHeaderCol(tr) {\n const th = document.createElement(\"th\");\n setAttribute(th, \"scope\", \"col\");\n setAttribute(th, \"role\", \"columnheader button\");\n setAttribute(th, \"aria-colindex\", this.colIndex());\n th.classList.add(...[SELECTABLE_CLASS, \"dg-not-resizable\", \"dg-not-sortable\"]);\n th.tabIndex = 0;\n\n this.selectAll = document.createElement(\"input\");\n this.selectAll.type = \"checkbox\";\n this.selectAll.classList.add(SELECT_ALL_CLASS);\n this.selectAll.classList.add(CHECKBOX_CLASS);\n this.selectAll.addEventListener(\"change\", this);\n\n const label = document.createElement(\"label\");\n label.appendChild(this.selectAll);\n\n th.appendChild(label);\n\n th.setAttribute(\"width\", \"40\");\n tr.appendChild(th);\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createFilterCol(tr) {\n const th = document.createElement(\"th\");\n setAttribute(th, \"role\", \"columnheader button\");\n setAttribute(th, \"aria-colindex\", this.colIndex());\n th.classList.add(SELECTABLE_CLASS);\n th.tabIndex = 0;\n\n tr.appendChild(th);\n }\n\n /**\n * Handles the selectAll checkbox when any other .dg-selectable checkbox is checked on table body.\n * It should check selectAll if all is checked\n * It should uncheck selectAll if any is unchecked\n * @param {HTMLTableSectionElement} tbody\n */\n shouldSelectAll(tbody) {\n if (!this.selectAll) {\n return;\n }\n // Delegate listener for change events on input checkboxes\n tbody.addEventListener(\"change\", this);\n // Make sure state is up to date\n tbody.dispatchEvent(new Event(\"change\"));\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createDataCol(tr) {\n // Create col\n const td = document.createElement(\"td\");\n setAttribute(td, \"role\", \"gridcell button\");\n setAttribute(td, \"aria-colindex\", this.colIndex());\n td.classList.add(SELECTABLE_CLASS);\n\n // Create input\n const selectOne = document.createElement(\"input\");\n // Alias row id for easy retrieval in getSelection\n selectOne.dataset.id = tr.getAttribute(\"aria-rowindex\");\n selectOne.type = \"checkbox\";\n selectOne.classList.add(CHECKBOX_CLASS);\n // Label need to take full space thanks to css to make the whole cell clickable\n const label = document.createElement(\"label\");\n label.classList.add(\"dg-clickable-cell\");\n label.appendChild(selectOne);\n td.appendChild(label);\n\n // Prevent unwanted click behaviour on row\n label.addEventListener(\"click\", this);\n\n tr.appendChild(td);\n }\n\n /**\n * @param {Event} e\n */\n onclick(e) {\n e.stopPropagation();\n }\n\n /**\n * Handle change event on select all or any select checkbox in the table body\n * @param {import(\"../utils/shortcuts.js\").FlexibleEvent} e\n */\n onchange(e) {\n const grid = this.grid;\n if (hasClass(e.target, SELECT_ALL_CLASS)) {\n const visibleOnly = grid.options.selectVisibleOnly;\n const inputs = findAll(grid, `tbody .${SELECTABLE_CLASS} input`);\n for (const cb of inputs) {\n if (visibleOnly && !cb.offsetWidth) {\n return;\n }\n cb.checked = this.selectAll.checked;\n }\n dispatch(grid, \"rowsSelected\", {\n selection: this.getSelection(),\n });\n } else {\n if (!e.target.closest(`.${SELECTABLE_CLASS}`)) {\n return;\n }\n const totalCheckboxes = findAll(grid, `tbody .${SELECTABLE_CLASS} input[type=checkbox]`);\n // @ts-ignore\n const totalChecked = totalCheckboxes.filter((n) => n.checked);\n this.selectAll.checked = totalChecked.length === totalCheckboxes.length;\n\n dispatch(grid, \"rowsSelected\", {\n selection: grid.getSelection(),\n });\n }\n }\n}\n\nexport default SelectableRows;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport { setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Support for fixed table height\n *\n * We should add a fake row to push the footer down in case we don't have enough rows\n */\nclass FixedHeight extends BasePlugin {\n constructor(grid) {\n super(grid);\n\n this.hasFixedHeight = false;\n // If we have a fixed height, make sure we have overflowY set\n if (grid.style.height) {\n grid.style.overflowY = \"auto\";\n this.hasFixedHeight = true;\n }\n }\n\n /**\n */\n createFakeRow() {\n const grid = this.grid;\n const tbody = grid.querySelector(\"tbody\");\n const tr = document.createElement(\"tr\");\n setAttribute(tr, \"role\", \"row\");\n setAttribute(tr, \"hidden\", \"\");\n tr.classList.add(\"dg-fake-row\");\n tr.tabIndex = 0;\n tbody.appendChild(tr);\n }\n\n get fakeRow() {\n return this.grid.querySelector(\".dg-fake-row\");\n }\n\n /**\n * On last page, use a fake row to push footer down\n */\n updateFakeRow() {\n const grid = this.grid;\n const fakeRow = this.fakeRow;\n if (!fakeRow) {\n return;\n }\n\n // We don't need a fake row if we display everything\n if (grid.options.perPage > grid.totalRecords()) {\n return;\n }\n // We are not on last page\n if (grid.page !== grid.totalPages()) {\n return;\n }\n if (!grid.options.autoheight) {\n return;\n }\n // Find remaining missing height\n const max = grid.options.perPage * grid.rowHeight;\n const visibleRows = grid.querySelectorAll(\"tbody tr:not([hidden])\").length;\n const fakeHeight = visibleRows > 1 ? max - visibleRows * grid.rowHeight : max;\n if (fakeHeight > 0) {\n setAttribute(fakeRow, \"height\", fakeHeight);\n fakeRow.removeAttribute(\"hidden\");\n } else {\n fakeRow.removeAttribute(\"height\");\n }\n }\n}\n\nexport default FixedHeight;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport getTextWidth from \"../utils/getTextWidth.js\";\nimport { getAttribute, hasAttribute, setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Allows to resize columns\n */\nclass AutosizeColumn extends BasePlugin {\n /**\n * Autosize col based on column data\n * @param {HTMLTableCellElement} th\n * @param {import(\"../data-grid\").Column} column\n * @param {Number} min\n * @param {Number} max\n * @returns {Number}\n */\n computeSize(th, column, min, max) {\n const grid = this.grid;\n if (hasAttribute(th, \"width\")) {\n return getAttribute(th, \"width\");\n }\n if (!grid.data.length) {\n return;\n }\n const firstVal = grid.data[0];\n const lastVal = grid.data[grid.data.length - 1];\n let v = firstVal[column.field] ? firstVal[column.field].toString() : \"\";\n const v2 = lastVal[column.field] ? lastVal[column.field].toString() : \"\";\n if (v2.length > v.length) {\n v = v2;\n }\n let width = 0;\n if (v.length <= 6) {\n width = min;\n } else if (v.length > 50) {\n width = max;\n } else {\n // Add some extra room to have some spare space\n width = getTextWidth(`${v}0000`, th);\n }\n if (width > max) {\n width = max;\n }\n if (width < min) {\n width = min;\n }\n setAttribute(th, \"width\", width);\n return width;\n }\n}\n\nexport default AutosizeColumn;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport debounce from \"../utils/debounce.js\";\nimport {\n addClass,\n ce,\n find,\n findAll,\n hasClass,\n insertAfter,\n removeAttribute,\n removeClass,\n setAttribute,\n} from \"../utils/shortcuts.js\";\n\nconst RESPONSIVE_CLASS = \"dg-responsive\";\n\nlet obsTo;\n\n/**\n * @param {Array} list\n * @returns {Array}\n */\nfunction sortByPriority(list) {\n return list.sort((a, b) => {\n const v1 = Number.parseInt(a.dataset.responsive) || 1;\n const v2 = Number.parseInt(b.dataset.responsive) || 1;\n return v2 - v1;\n });\n}\n\n/**\n * @type {ResizeObserverCallback}\n */\n//@ts-ignore\nconst callback = debounce((entries) => {\n for (const entry of entries) {\n /**\n * @type {import(\"../data-grid\").default}\n */\n // @ts-ignore\n const grid = entry.target;\n const table = grid.table;\n if (grid.plugins.ResponsiveGrid.observerBlocked) {\n return;\n }\n // check inlineSize (width) and not blockSize (height)\n const contentBoxSize = Array.isArray(entry.contentBoxSize) ? entry.contentBoxSize[0] : entry.contentBoxSize;\n const size = Number.parseInt(contentBoxSize.inlineSize);\n const tableWidth = table.offsetWidth;\n const realTableWidth = findAll(grid.headerRow, \"th\").reduce((result, th) => {\n return result + th.offsetWidth;\n }, 0);\n const diff = (realTableWidth || tableWidth) - size - 1;\n const minWidth = 50;\n const prevAction = grid.plugins.ResponsiveGrid.prevAction;\n // We have an array with the columns to show/hide are in order, most important first\n const headerCols = sortByPriority(\n findAll(grid.headerRow, \"th[field]\")\n .reverse() // Order takes precedence if no priority is set\n .filter((col) => {\n // Leave out unresponsive columns\n return col.dataset.responsive !== \"0\";\n }),\n );\n let changed = false;\n\n grid.log(`table is ${tableWidth}/${realTableWidth} and available size is ${size}. Diff: ${diff}`);\n\n // The table is too big when diff has a high value, otherwise it will be like -1 or -2\n if (diff > 0) {\n if (prevAction === \"show\") {\n return;\n }\n grid.plugins.ResponsiveGrid.prevAction = \"hide\";\n let remaining = diff;\n let cols = headerCols.filter((col) => {\n return !col.hasAttribute(\"hidden\") && col.hasAttribute(\"data-responsive\");\n });\n if (cols.length === 0) {\n cols = headerCols.filter((col) => {\n return !col.hasAttribute(\"hidden\");\n });\n // Always keep one column\n if (cols.length === 1) {\n return;\n }\n }\n\n for (const col of cols) {\n if (remaining < 0) {\n continue;\n }\n\n const colWidth = col.offsetWidth;\n const field = col.getAttribute(\"field\");\n if (!field) {\n continue;\n }\n col.dataset.baseWidth = `${col.offsetWidth}`;\n\n grid.hideColumn(field, false);\n grid.setColProp(field, \"responsiveHidden\", true);\n changed = true;\n\n remaining -= colWidth;\n remaining = Math.round(remaining);\n }\n } else {\n if (prevAction === \"hide\") {\n return;\n }\n grid.plugins.ResponsiveGrid.prevAction = \"show\";\n\n const requiredWidth =\n headerCols\n .filter((col) => {\n return !col.hasAttribute(\"hidden\");\n })\n .reduce((result, col) => {\n const width = col.dataset.minWidth ? Number.parseInt(col.dataset.minWidth) : col.offsetWidth;\n return result + width;\n }, 0) + minWidth; // Add an offset so that inserting column is smoother\n\n // Compute available width to insert columns\n let remaining = size - requiredWidth;\n // Do we have any hidden column that we can restore ?\n const filteredHeaderCols = headerCols\n .slice()\n .reverse() // Reverse the array to restore the columns in the proper order\n .filter((col) => {\n return col.hasAttribute(\"hidden\");\n });\n\n for (const col of filteredHeaderCols) {\n if (remaining < minWidth) {\n continue;\n }\n const colWidth = Number.parseInt(col.dataset.minWidth);\n\n // We need to have enough space to restore it\n if (colWidth > remaining) {\n remaining = -1; // break loop to keep restoring in order\n continue;\n }\n\n const field = col.getAttribute(\"field\");\n if (!field) {\n continue;\n }\n\n grid.showColumn(field, false);\n grid.setColProp(field, \"responsiveHidden\", false);\n changed = true;\n\n remaining -= colWidth;\n remaining = Math.round(remaining);\n }\n }\n\n // Check footer\n const footer = find(grid.table, \"tfoot\");\n const realFooterWidth = findAll(grid.table, \".dg-footer > div\").reduce((result, div) => {\n return result + div.offsetWidth;\n }, 0);\n const availableFooterWidth = footer.offsetWidth - realFooterWidth;\n if (realFooterWidth > size) {\n addClass(footer, \"dg-footer-compact\");\n } else if (availableFooterWidth > 250) {\n removeClass(footer, \"dg-footer-compact\");\n }\n if (changed) {\n grid.renderTable();\n }\n // Prevent resize loop\n setTimeout(() => {\n grid.plugins.ResponsiveGrid.prevAction = null;\n }, 1000);\n grid.table.style.visibility = \"visible\";\n }\n}, 100);\nconst resizeObserver = new ResizeObserver(callback);\n\n/**\n * Responsive data grid\n */\nclass ResponsiveGrid extends BasePlugin {\n constructor(grid) {\n super(grid);\n\n this.observerBlocked = false;\n this.prevAction = null;\n }\n\n connected() {\n if (this.grid.options.responsive) {\n this.observe();\n }\n }\n\n disconnected() {\n this.unobserve();\n }\n\n observe() {\n if (!this.grid.options.responsive) {\n return;\n }\n resizeObserver.observe(this.grid);\n this.grid.style.display = \"block\"; // Otherwise resize doesn't happen\n this.grid.style.overflowX = \"hidden\"; // Prevent scrollbars from appearing\n }\n\n unobserve() {\n resizeObserver.unobserve(this.grid);\n this.grid.style.display = \"unset\";\n this.grid.style.overflowX = \"unset\";\n }\n\n blockObserver() {\n this.observerBlocked = true;\n if (obsTo) {\n clearTimeout(obsTo);\n }\n }\n\n unblockObserver() {\n obsTo = setTimeout(() => {\n this.observerBlocked = false;\n }, 200); // more than debounce\n }\n\n /**\n * @returns {Boolean}\n */\n hasHiddenColumns() {\n let flag = false;\n\n for (const col of this.grid.options.columns) {\n if (col.responsiveHidden) {\n flag = true;\n }\n }\n return flag;\n }\n\n colIndex() {\n return this.grid.startColIndex() - 1;\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createHeaderCol(tr) {\n if (!this.grid.options.responsiveToggle) {\n return;\n }\n const th = ce(\"th\", tr);\n setAttribute(th, \"scope\", \"col\");\n setAttribute(th, \"role\", \"columnheader button\");\n setAttribute(th, \"aria-colindex\", this.colIndex());\n setAttribute(th, \"width\", \"40\");\n th.classList.add(...[`${RESPONSIVE_CLASS}-toggle`, \"dg-not-resizable\", \"dg-not-sortable\"]);\n th.tabIndex = 0;\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createFilterCol(tr) {\n if (!this.grid.options.responsiveToggle) {\n return;\n }\n const th = ce(\"th\", tr);\n setAttribute(th, \"role\", \"columnheader button\");\n setAttribute(th, \"aria-colindex\", this.colIndex());\n th.classList.add(`${RESPONSIVE_CLASS}-toggle`);\n th.tabIndex = 0;\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n */\n createDataCol(tr) {\n if (!this.grid.options.responsiveToggle) {\n return;\n }\n // Create col\n const td = document.createElement(\"td\");\n setAttribute(td, \"role\", \"gridcell button\");\n setAttribute(td, \"aria-colindex\", this.colIndex());\n td.classList.add(`${RESPONSIVE_CLASS}-toggle`);\n\n // Create icon\n td.innerHTML = `
\n \n \n\n\n \n
`;\n tr.appendChild(td);\n\n td.addEventListener(\"click\", this);\n td.addEventListener(\"mousedown\", this);\n }\n\n computeLabelWidth() {\n let idealWidth = 0;\n let consideredCol = 0;\n while (idealWidth < 120) {\n consideredCol++;\n const hCol = find(this.grid, `.dg-head-columns th[aria-colindex=\"${consideredCol}\"]`);\n if (hCol) {\n idealWidth += hCol.offsetWidth;\n } else {\n break;\n }\n }\n return idealWidth;\n }\n\n /**\n * @param {Event} ev\n */\n onmousedown(ev) {\n // Avoid selection through double click\n ev.preventDefault();\n }\n\n /**\n * @param {Event} ev\n */\n onclick(ev) {\n // Prevent expandable\n ev.stopPropagation();\n\n // target is the element that triggered the event (e.g., the user clicked on)\n // currentTarget is the element that the event listener is attached to.\n\n /**\n * @type {HTMLTableRowElement}\n */\n //@ts-ignore\n const td = ev.currentTarget;\n const tr = td.parentElement;\n const open = find(td, `.${RESPONSIVE_CLASS}-open`);\n const close = find(td, `.${RESPONSIVE_CLASS}-close`);\n\n this.blockObserver();\n\n const isExpanded = hasClass(tr, `${RESPONSIVE_CLASS}-expanded`);\n if (isExpanded) {\n removeClass(tr, `${RESPONSIVE_CLASS}-expanded`);\n open.style.display = \"unset\";\n close.style.display = \"none\";\n\n // Move back rows and cleanup row\n const childRow = tr.nextElementSibling;\n const hiddenCols = findAll(childRow, `.${RESPONSIVE_CLASS}-hidden`);\n\n for (const col of hiddenCols) {\n // We don't really need to care where we insert them since we are going to redraw anyway\n tr.appendChild(col);\n setAttribute(col, \"hidden\");\n }\n\n childRow.parentElement.removeChild(childRow);\n } else {\n addClass(tr, `${RESPONSIVE_CLASS}-expanded`);\n open.style.display = \"none\";\n close.style.display = \"unset\";\n\n // Create a child row and move rows into it\n const childRow = ce(\"tr\");\n insertAfter(childRow, tr);\n addClass(childRow, `${RESPONSIVE_CLASS}-child-row`);\n\n const childRowTd = ce(\"td\", childRow);\n setAttribute(childRowTd, \"colspan\", this.grid.columnsLength(true));\n\n const childTable = ce(\"table\", childRowTd);\n addClass(childTable, `${RESPONSIVE_CLASS}-table`);\n\n const hiddenCols = findAll(tr, `.${RESPONSIVE_CLASS}-hidden`);\n const idealWidth = this.computeLabelWidth();\n\n for (const col of hiddenCols) {\n const childTableRow = ce(\"tr\", childTable);\n\n // Add label\n const label = col.dataset.name;\n const labelCol = ce(\"th\", childTableRow);\n // It looks much better when aligned with an actual col\n labelCol.style.width = `${idealWidth}px`;\n labelCol.innerHTML = label;\n\n // Add actual row\n childTableRow.appendChild(col);\n removeAttribute(col, \"hidden\");\n }\n }\n\n this.unblockObserver();\n }\n}\n\nexport default ResponsiveGrid;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport interpolate from \"../utils/interpolate.js\";\nimport { dispatch, on, setAttribute } from \"../utils/shortcuts.js\";\n\n/**\n * Add action on rows\n */\nclass RowActions extends BasePlugin {\n /**\n * @returns {Boolean}\n */\n hasActions() {\n return this.grid.options.actions.length > 0;\n }\n\n /**\n *\n * @param {HTMLTableRowElement} tr\n */\n makeActionHeader(tr) {\n const actionsTh = document.createElement(\"th\");\n setAttribute(actionsTh, \"role\", \"columnheader button\");\n setAttribute(actionsTh, \"aria-colindex\", this.grid.columnsLength(true));\n actionsTh.classList.add(...[\"dg-actions\", \"dg-not-sortable\", \"dg-not-resizable\", this.actionClass]);\n actionsTh.tabIndex = 0;\n tr.appendChild(actionsTh);\n }\n\n /**\n *\n * @param {HTMLTableRowElement} tr\n */\n makeActionFilter(tr) {\n const actionsTh = document.createElement(\"th\");\n actionsTh.setAttribute(\"role\", \"columnheader button\");\n setAttribute(actionsTh, \"aria-colindex\", this.grid.columnsLength(true));\n actionsTh.classList.add(...[\"dg-actions\", this.actionClass]);\n actionsTh.tabIndex = 0;\n tr.appendChild(actionsTh);\n }\n\n /**\n * @param {HTMLTableRowElement} tr\n * @param {Object} item\n */\n makeActionRow(tr, item) {\n const labels = this.grid.labels;\n const td = document.createElement(\"td\");\n setAttribute(td, \"role\", \"gridcell\");\n setAttribute(td, \"aria-colindex\", this.grid.columnsLength(true));\n td.classList.add(...[\"dg-actions\", this.actionClass]);\n td.tabIndex = 0;\n\n // Add menu toggle\n const actionsToggle = document.createElement(\"button\");\n actionsToggle.classList.add(\"dg-actions-toggle\");\n actionsToggle.innerHTML = \"\u2630\";\n td.appendChild(actionsToggle);\n on(actionsToggle, \"click\", (ev) => {\n ev.stopPropagation();\n ev.target.parentElement.classList.toggle(\"dg-actions-expand\");\n });\n\n for (const action of this.grid.options.actions) {\n const button = document.createElement(\"button\");\n if (action.html) {\n button.innerHTML = action.html;\n } else {\n button.innerText = action.title ?? action.name;\n }\n if (action.title) {\n button.title = action.title;\n }\n if (action.url) {\n button.type = \"submit\";\n button.formAction = interpolate(action.url, item);\n }\n if (action.class) {\n button.classList.add(...action.class.split(\" \"));\n }\n const actionHandler = (ev) => {\n ev.stopPropagation();\n if (action.confirm) {\n const c = confirm(labels.areYouSure);\n if (!c) {\n ev.preventDefault();\n return;\n }\n }\n dispatch(this.grid, \"action\", {\n data: item,\n action: action.name,\n });\n };\n button.addEventListener(\"click\", actionHandler);\n td.appendChild(button);\n\n // Row action\n if (action.default) {\n tr.classList.add(\"dg-actionable\");\n tr.addEventListener(\"click\", actionHandler);\n }\n }\n\n tr.appendChild(td);\n }\n\n get actionClass() {\n if (this.grid.options.actions.length < 3 && !this.grid.options.collapseActions) {\n return `dg-actions-${this.grid.options.actions.length}`;\n }\n return \"dg-actions-more\";\n }\n}\n\nexport default RowActions;\n", "import BasePlugin from \"../core/base-plugin.js\";\nimport { dispatch } from \"../utils/shortcuts.js\";\n\n/**\n * Make editable inputs in rows\n */\nclass EditableColumn extends BasePlugin {\n /**\n *\n * @param {HTMLTableCellElement} td\n * @param {import(\"../data-grid\").Column} column\n * @param {Object} item\n * @param {number} i\n */\n makeEditableInput(td, column, item, i) {\n const gridId = this.grid.getAttribute(\"id\");\n const input = document.createElement(\"input\");\n input.type = column.editableType || \"text\";\n if (input.type === \"email\") {\n input.inputMode = \"email\";\n }\n if (input.type === \"decimal\") {\n input.type = \"text\";\n input.inputMode = \"decimal\";\n }\n input.autocomplete = \"off\";\n input.spellcheck = false;\n input.tabIndex = 0;\n input.classList.add(\"dg-editable\");\n input.name = `${gridId.replace(\"-\", \"_\")}[${i + 1}][${column.field}]`;\n input.value = item[column.field];\n input.dataset.field = column.field;\n\n // Prevent row action\n input.addEventListener(\"click\", (ev) => ev.stopPropagation());\n // Enter validates edit\n input.addEventListener(\"keypress\", (ev) => {\n if (ev.type === \"keypress\") {\n const key = ev.keyCode || ev.key;\n if (key === 13 || key === \"Enter\") {\n input.blur();\n ev.preventDefault();\n }\n }\n });\n // Save on blur\n input.addEventListener(\"blur\", () => {\n // Only fire on update\n if (input.value === item[input.dataset.field]) {\n return;\n }\n // Update underlying data\n item[input.dataset.field] = input.value;\n // Notify\n dispatch(this.grid, \"edit\", {\n data: item,\n value: input.value,\n });\n });\n td.appendChild(input);\n }\n}\n\nexport default EditableColumn;\n", "import BasePlugin from \"../core/base-plugin.js\";\r\nimport { $ } from \"../utils/shortcuts.js\";\r\n\r\n/**\r\n * Adds an element for showing a spinning icon on grid loading.\r\n */\r\nclass SpinnerSupport extends BasePlugin {\r\n connected() {\r\n // Inserts spinner\r\n if (this.grid.options.spinnerClass && this.grid.plugins.SpinnerSupport) {\r\n this.add();\r\n }\r\n }\r\n\r\n /**\r\n * Adds a spinner element with its associated css styles.\r\n */\r\n add() {\r\n const grid = this.grid;\r\n const classes = grid.options.spinnerClass;\r\n if (!classes) {\r\n return;\r\n }\r\n const cls = classes\r\n .split(\" \")\r\n .map((e) => `.${e}`)\r\n .join(\"\");\r\n\r\n const template = `\r\n\r\n`;\r\n if (!$(\"#dg-styles\")) {\r\n const styleParent = $(\"head\") ?? $(\"body\");\r\n const position = /head/i.test(styleParent.tagName) ? \"beforeend\" : \"afterbegin\";\r\n styleParent.insertAdjacentHTML(position, template);\r\n }\r\n !$(`i${cls}`, grid) && grid.insertAdjacentHTML(\"afterbegin\", ``);\r\n }\r\n}\r\n\r\nexport default SpinnerSupport;\r\n", "\uFEFFimport BasePlugin from \"../core/base-plugin.js\";\nimport { findAll } from \"../utils/shortcuts.js\";\n\n/**\n * @typedef GridState\n * @property {Object} meta\n * @property {Number} pages\n * @property {Number} page\n * @property {Number} perPage\n * @property {Object} filters\n * @property {Array} columns\n * @property {String} sort\n * @property {String} sortDir\n * @property {Number} scrollTo\n */\n\nclass SaveState extends BasePlugin {\n constructor(grid) {\n super(grid);\n this.cachedState = null;\n this.isFilterSortSet = false;\n this.isDataLoaded = false;\n this.isScrolled = false;\n this.log(\"Init\");\n }\n\n connected() {\n this.log(\"connected\");\n const grid = this.grid;\n\n if (!grid.options.saveState) {\n this.log(\"disabled\");\n return;\n }\n\n this.log(\"enabled\");\n\n const cachedState = this._getState();\n if (cachedState) {\n this.log(\"hide columns\");\n\n for (const col of cachedState.columns) {\n if (col.hidden) {\n const hideCol = grid.options.columns.find((c) => c.field === col.field);\n hideCol.hidden = true;\n }\n }\n\n this.log(\"set: meta, pages\");\n grid.options.perPage = cachedState.perPage;\n if (grid.options.server) {\n grid.meta = cachedState.meta;\n grid.pages = cachedState.pages;\n grid.page = cachedState.page;\n }\n }\n\n this.cachedState = cachedState;\n\n const dgLoadData = grid.loadData;\n grid.loadData = function (...args) {\n return new Promise((resolve, reject) => {\n dgLoadData.apply(this, args).finally(() => {\n const saveState = this.plugins.SaveState;\n\n if (!grid.classList.contains(\"dg-initialized\")) {\n saveState.log(\"not init, loadData skipped\");\n return resolve();\n }\n\n saveState.log(\"loadData finished, set param controls\");\n\n if (saveState.cachedState && !saveState.isFilterSortSet) {\n saveState.log(\"set sort and filters\");\n\n const sortableHeaders = findAll(grid, \"thead tr.dg-head-columns th[aria-sort]\");\n for (const el of sortableHeaders) {\n el.setAttribute(\"aria-sort\", \"none\");\n }\n\n grid.querySelector(\n `thead tr.dg-head-columns th[field='${saveState.cachedState.sort}']`,\n )?.setAttribute(\"aria-sort\", saveState.cachedState.sortDir);\n\n const filters = findAll(grid.filterRow, \"[id^=dg-filter]\");\n for (const el of filters) {\n el.value = saveState.cachedState.filters[el.dataset.name];\n }\n saveState.isFilterSortSet = true;\n }\n\n /** @type {GridState} */\n const newState = {\n meta: grid.meta,\n pages: grid.pages,\n page: grid.page,\n perPage: grid.options.perPage,\n filters: {},\n columns: grid.options.columns.map((col) => ({ field: col.field, hidden: col.hidden })),\n sort: grid.getSort(),\n sortDir: grid.getSortDir(),\n scrollTo: window.scrollY,\n };\n\n const filters = grid.getFilters();\n\n for (const key of Object.keys(filters)) {\n newState.filters[key] = filters[key];\n }\n\n saveState.log(\"store new state\");\n saveState._setState(newState);\n\n if (!grid.options.server && saveState.cachedState && !saveState.isDataLoaded) {\n saveState.isDataLoaded = true;\n grid.filterData();\n grid.page = saveState.cachedState.page;\n grid.pageChanged();\n }\n\n resolve();\n });\n });\n };\n\n const updateState = () => {\n const saveState = grid.plugins.SaveState;\n const state = saveState._getState();\n if (!state) {\n return;\n }\n state.columns = grid.options.columns.map((col) => ({ field: col.field, hidden: col.hidden }));\n state.sort = grid.getSort();\n state.sortDir = grid.getSortDir();\n state.scrollTo = window.scrollY;\n saveState._setState(state);\n };\n\n document.addEventListener(\"scrollend\", updateState);\n grid.addEventListener(\"headerRendered\", updateState);\n\n grid.addEventListener(\"bodyRendered\", (ev) => {\n if (!grid.classList.contains(\"dg-initialized\") || grid.classList.contains(\"dg-loading\")) {\n return;\n }\n\n if (!grid.options.server) {\n updateState();\n }\n\n const saveState = grid.plugins.SaveState;\n if (!saveState.cachedState || !saveState.isFilterSortSet) {\n return;\n }\n\n if (!saveState.isDataLoaded) {\n saveState.isDataLoaded = true;\n grid.reload();\n } else if (!saveState.isScrolled) {\n saveState.isScrolled = true;\n window.scrollTo({ top: saveState.cachedState.scrollTo, left: 0, behavior: \"instant\" });\n }\n });\n }\n\n log(message) {\n this.grid.log(`[Save-State] ${message}`);\n }\n\n /**\n * @returns {GridState}\n */\n _getState() {\n let state;\n try {\n state = JSON.parse(sessionStorage.getItem(`gridSaveState_${this.grid.id}`));\n } catch (_) {}\n return state;\n }\n\n /**\n * @param {GridState} state\n */\n _setState(state) {\n sessionStorage.setItem(`gridSaveState_${this.grid.id}`, JSON.stringify(state));\n }\n}\n\nexport default SaveState;\n", "/**\r\n * Data Grid custom element\r\n * https://github.com/lekoala/data-grid/\r\n * @license MIT\r\n */\r\n\r\nimport DataGrid from \"./src/data-grid.js\";\r\n// Optional plugins\r\nimport ColumnResizer from \"./src/plugins/column-resizer.js\";\r\nimport ContextMenu from \"./src/plugins/context-menu.js\";\r\nimport DraggableHeaders from \"./src/plugins/draggable-headers.js\";\r\nimport TouchSupport from \"./src/plugins/touch-support.js\";\r\nimport SelectableRows from \"./src/plugins/selectable-rows.js\";\r\nimport FixedHeight from \"./src/plugins/fixed-height.js\";\r\nimport AutosizeColumn from \"./src/plugins/autosize-column.js\";\r\nimport ResponsiveGrid from \"./src/plugins/responsive-grid.js\";\r\nimport RowActions from \"./src/plugins/row-actions.js\";\r\nimport EditableColumn from \"./src/plugins/editable-column.js\";\r\nimport SpinnerSupport from \"./src/plugins/spinner-support.js\";\r\nimport SaveState from \"./src/plugins/save-state.js\";\r\n\r\n// Using shorthand property names\r\n// This make them reserved and keys will be preserved\r\n// Actual class names are renamed\r\nDataGrid.registerPlugins({\r\n ColumnResizer,\r\n ContextMenu,\r\n DraggableHeaders,\r\n TouchSupport,\r\n SelectableRows,\r\n FixedHeight,\r\n AutosizeColumn,\r\n ResponsiveGrid,\r\n RowActions,\r\n EditableColumn,\r\n SpinnerSupport,\r\n SaveState\r\n});\r\n\r\n// Prevent errors if included multiple times\r\nif (!customElements.get(\"data-grid\")) {\r\n customElements.define(\"data-grid\", DataGrid);\r\n}\r\n\r\nexport default DataGrid;\r\n\r\nconst global = typeof globalThis !== \"undefined\" ? globalThis : self;\r\nglobal.DataGrid = DataGrid;"], + "mappings": "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", "names": ["camelize", "str", "m", "chr", "normalizeData", "v", "val", "supportedPassiveTypes", "passiveOpts", "type", "getAttribute", "el", "name", "hasAttribute", "setAttribute", "v", "check", "removeAttribute", "on", "listener", "off", "dispatch", "el", "name", "data", "bubbles", "opts", "hasClass", "addClass", "removeClass", "toggleClass", "$", "selector", "base", "$$", "find", "findAll", "ce", "tagName", "parent", "el", "insertAfter", "newNode", "existingNode", "BaseElement", "options", "opt", "v", "setAttribute", "jsonConfig", "data", "key", "normalizeData", "message", "getAttribute", "event", "template", "dispatch", "attributeName", "oldValue", "newValue", "isOption", "transformer", "attr", "camelize", "base_element_default", "addSelectOption", "el", "value", "label", "checked", "opt", "appendParamsToUrl", "url", "params", "key", "k", "convertArray", "v", "bv", "elementOffset", "el", "rect", "scrollLeft", "scrollTop", "interpolate", "str", "data", "$1", "$2", "canvas", "getTextWidth", "text", "el", "withPadding", "styles", "fontWeight", "fontSize", "fontFamily", "padding", "paddingLeft", "paddingRight", "context", "metrics", "randstr", "prefix", "debounce", "handler", "timeout", "timer", "args", "plugins", "labels", "applyColumnDefinition", "el", "column", "setAttribute", "addClass", "DataGrid", "_DataGrid", "base_element_default", "randstr", "pluginName", "pluginClass", "attr", "camelize", "v", "list", "plugin", "columns", "cols", "key", "col", "item", "convertArray", "$", "val", "initOnly", "pv", "updatePage", "addSelectOption", "field", "found", "prop", "c", "render", "dispatch", "start", "visibleOnly", "len", "tr", "find", "row", "removeAttribute", "headers", "findAll", "th", "fieldName", "value", "k", "i", "data", "metaKey", "dataKey", "cb", "needRender", "flagEmpty", "tbody", "resolve", "response", "err", "event", "filters", "inputs", "input", "name", "baseCol", "haveClasses", "sort", "stack", "itemA", "itemB", "a", "b", "valA", "valB", "columnName", "sortDir", "dir", "reject", "base", "url", "params", "appendParamsToUrl", "newError", "error", "sortedColumn", "thead", "tfoot", "td", "availableWidth", "colMaxWidth", "idx", "ce", "sampleTh", "totalWidth", "colIdx", "computedWidth", "getTextWidth", "w", "colAvailableWidth", "visibleCols", "lastCol", "scrollbarWidth", "diff", "thWithWidth", "hasClass", "actualWidth", "minWidth", "newWidth", "rowsWithSort", "sortableRow", "relatedTh", "filter", "filteredRows", "eventName", "eventHandler", "debounce", "e", "isKeyPressFilter", "isSelect", "uniqueValues", "opt", "on", "ev", "toggleClass", "tv", "interpolate", "prev", "total", "p", "bodyRows", "index", "high", "low", "getAttribute", "data_grid_default", "BasePlugin", "grid", "event", "base_plugin_default", "ColumnResizer", "base_plugin_default", "grid", "resizeLabel", "table", "cols", "findAll", "col", "hasClass", "resizer", "addClass", "startX", "startW", "remainingSpace", "max", "mouseMoveHandler", "e", "newWidth", "setAttribute", "mouseUpHandler", "removeClass", "off", "dispatch", "getAttribute", "on", "target", "visibleCols", "columnIndex", "column", "removeAttribute", "elementOffset", "j", "column_resizer_default", "getParentElement", "el", "type", "prop", "parent", "ContextMenu", "base_plugin_default", "off", "grid", "on", "e", "t", "field", "target", "getParentElement", "menu", "rect", "x", "y", "removeAttribute", "documentClickHandler", "setAttribute", "col", "li", "label", "checkbox", "text", "context_menu_default", "DraggableHeaders", "base_plugin_default", "th", "grid", "on", "e", "t", "target", "getParentElement", "index", "targetIndex", "offset", "tmp", "swapNodes", "selector", "el1", "rowIndex", "el2", "setAttribute", "newNode", "findAll", "c", "getAttribute", "dispatch", "draggable_headers_default", "TouchSupport", "base_plugin_default", "grid", "e", "xDiff", "yDiff", "touch_support_default", "SELECTABLE_CLASS", "SELECT_ALL_CLASS", "CHECKBOX_CLASS", "SelectableRows", "base_plugin_default", "key", "grid", "selectedData", "inputs", "findAll", "checkbox", "idx", "item", "tbody", "input", "tr", "th", "setAttribute", "label", "td", "selectOne", "e", "hasClass", "visibleOnly", "cb", "dispatch", "totalCheckboxes", "totalChecked", "n", "selectable_rows_default", "FixedHeight", "base_plugin_default", "grid", "tbody", "tr", "setAttribute", "fakeRow", "max", "visibleRows", "fakeHeight", "fixed_height_default", "AutosizeColumn", "base_plugin_default", "th", "column", "min", "max", "grid", "hasAttribute", "getAttribute", "firstVal", "lastVal", "v", "v2", "width", "getTextWidth", "setAttribute", "autosize_column_default", "RESPONSIVE_CLASS", "obsTo", "sortByPriority", "list", "a", "b", "v1", "callback", "debounce", "entries", "entry", "grid", "table", "contentBoxSize", "size", "tableWidth", "realTableWidth", "findAll", "result", "th", "diff", "minWidth", "prevAction", "headerCols", "col", "changed", "remaining", "cols", "colWidth", "field", "requiredWidth", "width", "filteredHeaderCols", "footer", "find", "realFooterWidth", "div", "availableFooterWidth", "addClass", "removeClass", "resizeObserver", "ResponsiveGrid", "base_plugin_default", "flag", "tr", "ce", "setAttribute", "td", "idealWidth", "consideredCol", "hCol", "ev", "open", "close", "hasClass", "childRow", "hiddenCols", "insertAfter", "childRowTd", "childTable", "childTableRow", "label", "labelCol", "removeAttribute", "responsive_grid_default", "RowActions", "base_plugin_default", "tr", "actionsTh", "setAttribute", "item", "labels", "td", "actionsToggle", "on", "ev", "action", "button", "interpolate", "actionHandler", "dispatch", "row_actions_default", "EditableColumn", "base_plugin_default", "td", "column", "item", "i", "gridId", "input", "ev", "key", "dispatch", "editable_column_default", "SpinnerSupport", "base_plugin_default", "grid", "classes", "cls", "e", "template", "$", "styleParent", "position", "spinner_support_default", "SaveState", "base_plugin_default", "grid", "cachedState", "col", "hideCol", "c", "dgLoadData", "args", "resolve", "reject", "saveState", "sortableHeaders", "findAll", "el", "filters", "newState", "key", "updateState", "state", "ev", "message", "save_state_default", "data_grid_default", "column_resizer_default", "context_menu_default", "draggable_headers_default", "touch_support_default", "selectable_rows_default", "fixed_height_default", "autosize_column_default", "responsive_grid_default", "row_actions_default", "editable_column_default", "spinner_support_default", "save_state_default", "global"] } diff --git a/package.json b/package.json index 3ab43fd..58430c3 100644 --- a/package.json +++ b/package.json @@ -47,20 +47,20 @@ ] }, "devDependencies": { - "@happy-dom/global-registrator": "^15.11.6", - "ava": "^5.3.1", - "esbuild": "*", - "jsdoc": "^4.0.3", + "@happy-dom/global-registrator": "^15.11.7", + "ava": "^6.2.0", + "esbuild": "^0.24.0", + "jsdoc": "^4.0.4", "jsdoc-plugin-intersection": "^1.0.4", - "jsdoc-to-markdown": "^8.0.3", + "jsdoc-to-markdown": "^9.1.1", "jsdoc-tsimport-plugin": "^1.0.5" }, "author": "LeKoala", "license": "MIT", "dependencies": { "autoprefixer": "^10.4.20", - "postcss": "^8.4.45", - "postcss-cli": "^10.1.0", - "sass": "1.77.6" + "postcss": "^8.4.49", + "postcss-cli": "^11.0.0", + "sass": "^1.82.0" } } diff --git a/scss/_core.scss b/scss/_core.scss index f3b2c71..9039a98 100644 --- a/scss/_core.scss +++ b/scss/_core.scss @@ -1,5 +1,5 @@ /** - * Data Grid Web Component v2.0.11 + * Data Grid Web Component v2.0.11 * https://github.com/lekoala/data-grid */ @@ -23,6 +23,8 @@ data-grid { --color: rgb(var(--color-rgb)); --highlight-color: #fffcee; + --body-background: var(--bs-table-bg, #fff); + --striped-background: rgba(0, 0, 0, 0.05); --header-background: var(--bs-gray-200, #e9ecef); --header-color: var(--bs-dark, #212529); --input-background: var(--bs-body-bg, #ffffff); @@ -114,7 +116,7 @@ data-grid { max-width: 100%; white-space: normal; // Background needs to be on the table, not on the component in case the table overflows the component - background: var(--header-background); + background: var(--body-background); } thead, @@ -140,7 +142,7 @@ data-grid { pointer-events: none; // disable clicks while loading } - &:not(:has(th)) { + &:not(:has(th)) { tfoot { display: none; } @@ -346,7 +348,7 @@ data-grid { padding: 0 2px 0 0; background-color: transparent; - > * { + > * { width: 100%; border-radius: 0; margin: 0; @@ -440,10 +442,10 @@ data-grid { } } - // Zebra rows + // Zebra/striped rows tbody tr { &:nth-child(even) { - background-color: var(--bs-table-striped-bg, #f8f9fa); + background-color: var(--striped-background); } border-bottom: solid 1px var(--row-border-color); @@ -565,14 +567,11 @@ data-grid { [data-bs-theme="dark"] data-grid { --scroller-color-lightness: 20%; --highlight-color: #43423e; + --body-background: #212529; + --striped-background: #2c3034; --header-background: var(--bs-gray-800, #34373b); --header-color: var(--bs-light, #e9ecef); --body-color: var(--bs-body-color, #494e53); --row-border-color: var(--bs-gray-900, #212325); - - tbody tr { - &:nth-child(even) { - background-color: var(--bs-table-striped-bg, #2c3034); - } - } } + diff --git a/src/core/base-element.js b/src/core/base-element.js index 6290181..3451114 100644 --- a/src/core/base-element.js +++ b/src/core/base-element.js @@ -20,6 +20,7 @@ class BaseElement extends HTMLElement { this.log("constructor"); + this.setup = false; this.fireEvents = true; this._ready(); @@ -105,6 +106,11 @@ class BaseElement extends HTMLElement { _connected() {} connectedCallback() { + // already connected + if (this.setup) { + return; + } + this.setup = true; // ensure whenDefined callbacks run first setTimeout(() => { this.log("connectedCallback"); @@ -127,11 +133,19 @@ class BaseElement extends HTMLElement { */ _disconnected() {} + /** + * @link https://nolanlawson.com/2024/12/01/avoiding-unnecessary-cleanup-work-in-disconnectedcallback/ + */ disconnectedCallback() { - this.log("disconnectedCallback"); - this._disconnected(); - // @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#life-cycle-events - dispatch(this, "disconnected"); + setTimeout(() => { + if (!this.isConnected && this.setup) { + this.log("disconnectedCallback"); + this._disconnected(); + // @link https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4#life-cycle-events + dispatch(this, "disconnected"); + this.setup = false; + } + }, 0); } /** diff --git a/src/data-grid.js b/src/data-grid.js index 146b9a1..0bc6955 100644 --- a/src/data-grid.js +++ b/src/data-grid.js @@ -541,18 +541,21 @@ class DataGrid extends BaseElement { }; } - /** @returns {HTMLTableSectionElement} */ //@ts-ignore + /** @returns {HTMLTableSectionElement} */ get thead() { + //@ts-ignore return $("thead", this); } - /** @returns {HTMLTableSectionElement} */ //@ts-ignore + /** @returns {HTMLTableSectionElement} */ get tbody() { + //@ts-ignore return $("tbody", this); } - /** @returns {HTMLTableSectionElement} */ //@ts-ignore + /** @returns {HTMLTableSectionElement} */ get tfoot() { + //@ts-ignore return $("tfoot", this); }