From 7c58582b9a8f6f6077f721578813646438f38824 Mon Sep 17 00:00:00 2001 From: Gaetan Delannay Date: Tue, 10 Feb 2015 17:20:50 +0100 Subject: [PATCH] [gen] Anti-double-click system. --- fields/pod.py | 31 ++++----- fields/search.py | 1 + fields/workflow.py | 6 +- gen/mixins/__init__.py | 7 +-- gen/ui/appy.css | 1 + gen/ui/appy.js | 121 ++++++++++++++++++++++++------------ gen/ui/loading.gif | Bin 0 -> 1281 bytes gen/ui/loadingBig.gif | Bin 0 -> 10766 bytes gen/ui/loadingBtn.gif | Bin 0 -> 1516 bytes gen/ui/loadingPod.gif | Bin 0 -> 3429 bytes gen/ui/waiting.gif | Bin 2975 -> 0 bytes gen/wrappers/ToolWrapper.py | 1 + gen/wrappers/__init__.py | 24 +++---- 13 files changed, 117 insertions(+), 75 deletions(-) create mode 100644 gen/ui/loading.gif create mode 100644 gen/ui/loadingBig.gif create mode 100644 gen/ui/loadingBtn.gif create mode 100644 gen/ui/loadingPod.gif delete mode 100644 gen/ui/waiting.gif diff --git a/fields/pod.py b/fields/pod.py index dde9045..27cdb11 100644 --- a/fields/pod.py +++ b/fields/pod.py @@ -66,8 +66,8 @@ class Pod(Field): ''') + onclick=":'generatePod(this,%s,%s,%s,%s,%s,null,%s)' % (q(uid), \ + q(name), q(info.template), q(fmt), q(ztool.getQueryInfo()), gc)"/>''') pxView = pxCell = Px(''' - :search.translated ''') diff --git a/fields/workflow.py b/fields/workflow.py index 0e3ffbc..9f1682d 100644 --- a/fields/workflow.py +++ b/fields/workflow.py @@ -472,10 +472,10 @@ class UiTransition: css=ztool.getButtonCss(label, inButtons)"> + onclick=":'triggerTransition(%s,this,%s,%s)' % \ + (q(formId), q(transition.confirm), back)"/> = 0) { + if (node.elements[i].type == 'button') { clickOn(node.elements[i]); } + i = i - 1; + } + return; + } + // Disable any click on p_node to be protected against double-click + var cn = (node.className)? 'unclickable ' + node.className : 'unclickable'; + node.className = cn; + /* For a button, show the preloader directly. For a link, show it only after + a while, if the target page is still not there. */ + if (node.tagName != 'A') injectChunk(node, loadingButton); + else setTimeout(function(){injectChunk(node, loadingLink)}, 700); +} + function getAjaxHook(hookId, forceTop) { /* Gets the XHTML element whose ID is p_hookId: it will be the placeholder for the result of an ajax request. If p_hookId starts with ':', we search @@ -136,32 +160,22 @@ function getAjaxChunk(pos) { // This function is the callback called by the AJAX machinery (see function // askAjaxChunk below) when an Ajax response is available. // First, find back the correct XMLHttpRequest object - if ( (typeof(xhrObjects[pos]) != 'undefined') && - (xhrObjects[pos].freed == 0)) { - var hook = xhrObjects[pos].hook; - if (hook && (xhrObjects[pos].xhr.readyState == 1)) { - // The request has been initialized: display the waiting radar - var hookElem = getAjaxHook(hook); - if (hookElem) - injectChunk(hookElem, "
<\/div>", true); - } - if (xhrObjects[pos].xhr.readyState == 4) { - // We have received the HTML chunk - var hookElem = getAjaxHook(hook); - if (hookElem) { - var content = xhrObjects[pos].xhr.responseText; - var searchTop = hook[0] == ':'; - var injected = injectChunk(hookElem, content, false, searchTop); - // Call a custom Javascript function if required - if (xhrObjects[pos].onGet) { - xhrObjects[pos].onGet(xhrObjects[pos], injected); - } - // Display the Appy message if present - var msg = xhrObjects[pos].xhr.getResponseHeader('Appy-Message'); - if (msg) showAppyMessage(decodeURIComponent(escape(msg))); - } - xhrObjects[pos].freed = 1; + var rq = xhrObjects[pos]; + if ( (typeof(rq) != 'undefined') && (rq.freed == 0)) { + if ((!rq.hook) || (rq.xhr.readyState != 4)) return; + // We have received the HTML chunk + var hookElem = getAjaxHook(rq.hook); + if (hookElem) { + var content = rq.xhr.responseText; + var searchTop = rq.hook[0] == ':'; + var injected = injectChunk(hookElem, content, false, searchTop); + // Call a custom Javascript function if required + if (rq.onGet) rq.onGet(rq, injected); + // Display the Appy message if present + var msg = rq.xhr.getResponseHeader('Appy-Message'); + if (msg) showAppyMessage(decodeURIComponent(escape(msg))); } + rq.freed = 1; } } @@ -217,6 +231,8 @@ function askAjaxChunk(hook, mode, url, px, params, beforeSend, onGet) { if (mode == 'GET') { urlFull = urlFull + '?' + paramsFull; } + // Display the preloader + injectChunk(getAjaxHook(rq.hook), loadingZone, true); // Perform the asynchronous HTTP GET or POST rq.xhr.open(mode, urlFull, true); if (mode == 'POST') { @@ -651,8 +667,8 @@ function initSlaves(objectUrl, layoutType, requestValues, errors) { function submitAppyForm(button) { var f = document.getElementById('appyForm'); // On which button has the user clicked ? - f.button.value = button; - f.submit(); + f.button.value = button.id; + f.submit(); clickOn(button); } function submitForm(formId, msg, showComment, back) { @@ -661,8 +677,8 @@ function submitForm(formId, msg, showComment, back) { /* Submit the form and either refresh the entire page (back is null) or ajax-refresh a given part only (p_back corresponds to the id of the DOM node to be refreshed. */ - if (back) askAjax(back, formId); - else f.submit(); + if (back) { askAjax(back, formId); } + else { f.submit(); clickOn(f) } } else { // Ask a confirmation to the user before proceeding @@ -674,9 +690,9 @@ function submitForm(formId, msg, showComment, back) { } // Function used for triggering a workflow transition -function triggerTransition(formId, transitionId, msg, back) { +function triggerTransition(formId, node, msg, back) { var f = document.getElementById(formId); - f.transition.value = transitionId; + f.transition.value = node.id; submitForm(formId, msg, true, back); } @@ -789,8 +805,17 @@ function toggleCookie(cookieId, display, defaultValue) { createCookie(cookieId, newState); } +function podDownloadStatus(node, data) { + // Checks the status of cookie "podDownload" + var status = readCookie('podDownload'); + // Stop the timeout if the download is complete + if (status == 'false') return; + clearInterval(podTimeout); + for (var key in data) node.setAttribute(key, data[key]); +} + // Function that allows to generate a document from a pod template -function generatePod(uid, fieldName, template, podFormat, queryData, +function generatePod(node, uid, fieldName, template, podFormat, queryData, customParams, getChecked, mailing) { var f = document.getElementById('podForm'); f.objectUid.value = uid; @@ -814,7 +839,22 @@ function generatePod(uid, fieldName, template, podFormat, queryData, f.checkedSem.value = node['_appy_objs_sem']; } } + // Submitting the form at the end blocks the animated gifs on FF f.submit(); + // If p_node is an image, replace it with a preloader to prevent double-clicks + if (node.tagName == 'IMG') { + var data = {'src': node.src, 'class': node.className, + 'onclick': node.attributes.onclick.value}; + node.setAttribute('onclick', ''); + node.className = ''; + var src2 = node.src.replace(podFormat + '.png', 'loadingPod.gif'); + node.setAttribute('src', src2); + // Initialize the pod download cookie. "false" means: not downloaded yet + createCookie('podDownload', 'false'); + // Set a timer that will check the cookie value + podTimeout = window.setInterval(function(){ + podDownloadStatus(node, data)}, 700); + } } // Function that allows to (un-)freeze a document from a pod template @@ -961,7 +1001,7 @@ function doConfirm() { from the popup when relevant. */ var f = document.getElementById(action); transferComment(confirmForm, f); - f.submit(); + f.submit(); clickOn(f); } else if (actionType == 'url') { goto(action) } // Go to some URL else if (actionType == 'script') { eval(action) } // Exec some JS code @@ -970,7 +1010,7 @@ function doConfirm() { var f = document.getElementById(elems[0]); // Submit the form in elems[0] and execute the JS code in elems[1] transferComment(confirmForm, f); - f.submit(); + f.submit(); clickOn(f); eval(elems[1]); } else if (actionType == 'form-script') { @@ -1031,13 +1071,13 @@ function manageTab(tabId, action) { function showTab(tabId) { // 1st, show the tab to show manageTab(tabId, 'show'); - // Compute the number of tabs. + // Compute the number of tabs var idParts = tabId.split('_'); var prefix = idParts[0] + '_'; - // Store the currently selected tab in a cookie. + // Store the currently selected tab in a cookie createCookie('tab_' + idParts[0], tabId); var nbOfTabs = idParts[2]*1; - // Then, hide the other tabs. + // Then, hide the other tabs for (var i=0; iv^SgOnr6BkobR8mt_Q&U&d($vz@*3#3}GiB10DbuFRnKft5yg5r2 zEm^W`$(mJb)~s8zWz&`|+qUf4wP(-1Jx2~5IdbgCnNw%ZoI7*n(v>UMuH3nG=gz%5 zPaZva^6bf*S8v|Dd-LVfmoMMG{Q33g&%ZzaX#*7hbNji51UowhxEkphFf%eRFev_H z;bdd5XV3w%89?4-U=uwszraIBs{h22qLVpR^DnF@@mj0aj7_B^l1dRZzFEtFDx=ol z&@tq|rdk?VwU-Q+%OX#Z>NREBJWSZs%OI;SGZ5iWF1%m@Qh)kw8CK^YYfz~(6YF$t z^nhx}!>U0R$p(`qiy0@ACt5Vj0^3lv*%6zYkaf6p+061{g3!G;PSK6XZIPSb?wGY0Fc<6;Xe z_F^qG;OT32d|T$)6R6XWIEIcv!t(5D%4Hj6F6LP@jnAuBrAKB<2GY1@b*i$QV+~ru+ zFZ63;N>t&Sz8sjIs`g^_6p9sAo%4HLA4Mqeod=~r!U-zJsu#tI`B<$$&J;OTlfhQl ufD-v{?D2%0<#Md118w-U2AGN77-J11G30=?nmd0vD1$;A!bn`Mw*~+~rSEP4 literal 0 HcmV?d00001 diff --git a/gen/ui/loadingBig.gif b/gen/ui/loadingBig.gif new file mode 100644 index 0000000000000000000000000000000000000000..423d1844ac632fa903f0b617cdf03135217c54e7 GIT binary patch literal 10766 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 literal 0 HcmV?d00001 diff --git a/gen/ui/loadingBtn.gif b/gen/ui/loadingBtn.gif new file mode 100644 index 0000000000000000000000000000000000000000..b56931f1426331d47ae67f57189bc0e5599cb1ab GIT binary patch literal 1516 zcmZ?wbhEHb%wynVXpv!viHoVJs;Q}~>FMj4GjGn4MN5_}Te4==nl{N6wr&bLQNcE0?ZZxpw8wtvh$_-Ffop$&+VK-n@GA=G~hwpT2zg_T|s7 zKY#xH`Hut?|8x7fh6Fo12DlpO889<4Ffb_oWZ~ptkY~^VvKc_mU|{Wdpx&2~IWJ?? zx}4Yh3Utnwt!Ias5&_xv%VC0$x4*O+Y;NvsMJG<_^m zy8Xr5pTAXlTd!}i>HgYu_wc9XcJHtM@Xb}uSFWjRH%L!uN~%;&@0h65P~PlZP(5ju zc6xw+pj2{V+w7&yu41+lE1VWuiX|@Fw0XtOlLo{ ztb6*eMoRMs_ghPh@%spQubbxpQw^6YP`oif{GT4k%`MEQ<6OPzZv zBxCb)mn>Ufwn9(BTTIL^U~9{U4Hi}&dkz}w=pHh`ng%yP9lLYwY6}JfgC!-o_bck8 z+4DW-J3joVai-+NlA=r{7nMmaDisr4_%`<}-L%zU{{w@@>_7%~d(Ll*WkU~rsL0FN zsB-RV_P0mVe*gDP;R?#dv-I<@o{p<}j z9bHF5qnjF7y|D|L&!h5kew#YTtOj`_&&(~~K;G@Z!vqGPH;lqJnrP2da8@eRh-1=v zvg1wF-YJ4?pCc`FrXAlZc%f+jhaI{)hg{BPoUqca-1D@dQMp9EEHzy;OP()RD7tAv zqi9ljx>%KCP5;C>@smqaDl)6{<}UMYkzB|pD&ECAtA6=rv-z!4#iwWY&fc=mq(yvc zMpw_${U%hfUklVc5HSZ6LdT*HYGofwT>GY-v0V=KYOI|JRF_>|F>5rQcb|NjV5=&>D*IvyL z{HJfuw*szUb3lk;(5H(nTxf^OWKfi%J@MY@4$qtJ`bE>wBl0WywoUROzTI zp0UWd-z|4uZP((}naa^oF;WE!y4P&WcS?4Z*y)+zD;%)>u&IR=+mVw-dip078LR;_ C{Gx&Y literal 0 HcmV?d00001 diff --git a/gen/ui/loadingPod.gif b/gen/ui/loadingPod.gif new file mode 100644 index 0000000000000000000000000000000000000000..72f720502b8da51f2b892a84cec7ab46835d5155 GIT binary patch literal 3429 zcmcJR{cjWZ9mns^clOz5`_AV(-}(8@j?Y=tqQLkeY-|d5PH;>CCRG;PKr zmQ{>K8xM}lAOaG*Y3NviV1kOWilHd%0aYoOrRx|E9o^KHMWai*ZbDN9sOly(_HnKW zkgfYE_#d$Sdc8mI_jhGoZPl_C24Rrn2-5V;rm@pw*WbI|^Mjt^uZx|VJ8%BuX5YTP zv#+1M_V%^A|GJxQOJ}l~?&rGmgZZ<+JUji-^u|WgsKmQ)Fej9B_}M1mt^V+pR^}`E@>mqFZ~Q{!abJ_=acjr8Tb1rRIqZ4 zfoCyQ@~Iw_Ll7S>>i@F zGgCr#a#X*PIVFG|d;s_RGPd=UppO)ECAvk>3EV*~KnMB@$Q@#DJW-wNs#@B&ySUSs zchoMY3#aODG=5!GYZ9H+F6D`dI}V5|N_9OkoavZeY$HkZ0{hu+mrGXctRe{! z)g9nGfwJ#1hL~)}JP6`3ORg=NmtoCANFd~M#+=MkXuz{?wHmZ!jf#m0V-D11#kSfM z&r<}qtJf41_;pIK(~K$9Pn$GbQXv>$xHA9JDmr%JKcX_eT| z#=ewTD4k0e@3Yrq|4}LS4`#k}2*6&q_vr)nX4sdm=25U8sm@*Dwpr=I(Ny_q@hc-M zkDqE-RLT8?s9!%Q{-(ceS*o(~@Z|311ew`cgRFQjMh^EKFVr!Qn@mZS7Cj96jR>C-<3Xms25dnlv1AgazC#TUAz2JYL$I z6^Tf~>QxS0*?3`+=0y3AiY<_&C0A&w>`$tnO3b2{=fxh@VCp*1*U{_TfjFcWctObZ z#(}QUrvPvRL_O_*8%{cYRr~`VV`1VzWx7$!(#0;fYV}d_ zhv(B4`%tp&bW2;sWO9epM`nMF{u%jfd9|}R{;PKzu$8-}lQ&k0s*79YC0QJKzMXGU zEdpY9B1oGgns&7&ZL}l*tkXlNM!SEt-RE@p_=FZ{kPSZC$=g}CY~!%r7-BRcKM6WJ zt#sU^;sMo*wP+X4GN$(RngLZQyW!M&^8FaMQJV!nzi;%+&s05>yx#V6nb)g+e&A<% zey&&MRlVL=!2Y4q%4Qx_=95DcRoNGhrm94TRV}vuV!ART52P|TnqwnxwKs?O1N-CQ z+vHG)sUNIp>R}INK3?)pv6q!3Gf6VR4GOjaa*bgEf@Bpt=i=>NOPwj06Wk8c*(_Qk z3X>H`(aZ!ibNYFYDJ%u+yG4g0VG1f(%4E{7`Jj2|l@v;pu?f_ohJD={MXN>}OHch) z5zFHeW}cpk<&}GKM^tW21uL6{ zpa@$VrMW1|5azNVl4pNp44O?O6?Mr%K8Q*@(^DITZFP{yR*W#HcD2kJA#5@mNkwrw z>NfkmVa0C<#D!4HCYLQoqVaRE!&fGvqUj8Iekv|;awe1(ARo)?)!#KTtIYaPRLLT34NYbNXpk zEz1o2uIrZL@j{r<;s>k|j_$1&H~Q2!v}F}lWv1<1u4R8LPq*e*__BV9L^#=wdp3tw zxy?Rn&;-4M@Z9&psA#bzasEY)G6_bzK&0GuTIP70Z_u??b#i+*;?Fu0@C@bsto>UF zBA}9nZ<9DCPKGH?-Jp6|+Wq>ONk1u1J*P2_y>(y2eWq%F9Wa`!d7ufbA?bQ%!2#s= z^QXT`&uuR@ z*pJzEJY9)fuuHo?5SMY6UqBYKVr@Uw@7%Jqnz!P&%PTV>lqWb|pgcj7V2OvFkY*da zYbc&YlGjBi6cS6 dF%fhB(D(f#M)uWx;VH96TAK*rTVPth`X55}KGpyL literal 0 HcmV?d00001 diff --git a/gen/ui/waiting.gif b/gen/ui/waiting.gif deleted file mode 100644 index af7a8d0d7f5261f0fac4f2614f2445d26ae33143..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2975 zcmciEdr(tX9tZHtB@glrH-S7zFfZ~ZkOw4$7!r~|paku%`$1^}+sr zI5Y%@hvA_^Fc^eRC)~CTc6Gs#5jZ*uj~s#NG<@?-c=RY78-or9Or_wlWANQ~VM7B< zCgGMX@V)ooi4*XH58(JXJar1*z70>GhQIv=A3T6xeFZ=J41W44oSK4X&%$S(fxrF= z@7{$oGjMtuo;wHQarp2dyni45@B^Hkg;%b?3m0H}JDi_~H*dmAm*A>Z@ad=Fy?gN1 zEqLu3T(btYwZS`g;M%pYx*FEkLyrgU*#jFJVKfRSCg7PfFp+@YehV*NgyrRM!v@&W z0$W>QO$`i(VRJKVYQp|sOa42fF%XaWyy1YwRGOWI-YbXF>OZgF@Ph0w>tAS>)z;O> zLK|OP|CFrusddlGY^G9lLtbcI+f%aEmu22(*1goQab25f{j*PR#N@w_Xms=h<3jp{ zf-&mJ4lI$t!IsVx1`1@dL@C&c=L#h9u7qwm-igzQox5K*+p7oDbl#9;KxfxG2Jvjh z;URg#Jm#wfBqsAXA;ENG7E1*npZhz5!1SNE-9bRPbeW==xvBwF7K_d1h_nW)v&!!W zIcz>hC{k#RhDvLo?ieTUzO%=3K5>>Vvo_K?TI4=zZc+F|%jA=wHkUQeZjNF&kw`p^6wQt74j-mXlvjew0Im*N&|+|AX4AJ3@NJ(XL1{^5ZY^ zf7t|fDm3cwc>Ctuscou48to-ZADN@TsmEQd8k@==IAtc)dRjle?wXGm2T)Lq578QholS$b~!{xA9 zU5G}*JNxtV_yc4nok!$m(qfTt7lp(a6$mo;vO?)mHsug9OA3HWsrZmXVN6Kmav4w; z6{!>=3h|k2<~**Qy`kBf#7jy{#YTfhuiJr_mlwYYK-{xwXpWdXPvh(Z@ z-XgedzK1r>rH`W%M8}ckw%!i98kD=JC zdPHd~6mRdQgc?vUYg7uUsOyn&Z#t}2?aE{S745#g_=?C|N~w?)I!>q4fXP%6Q7ib5 z$mc=X#WIt&m=zVw%mACs<%)aUSXdU7OC%s}@OT1#OTr?G-T^h0)}MpEXGgdrA9;2@ z5qROZftydJ(!x{|EqLs%pZzLMUcLI@?N4bc!KRs1FHWhg#>bN5=Y3H{|CUBPhqRPu za*?M|Q7Fz|jXW#DMM|kin8(jSqVf{0dO(zi+N$4|E;B_AO7jo1sFZ!U*Y>tnB^C1D z4}}^)JZ>|Z)cI^`h)gDtfahz2t60e(Gp{okz#5oyYGMKbeSRKPRrzCX9~OxU2!h80 zD`T2hrovgXlx(i#VqgmRWnBe24C^Hl*{?R?W4DCE`0x;gFGx5O2cGm}v5^h!;4+%DMX0O%y-BObU@O+D z4h!=*8N4oFtuz?53Xzb*XXgOFzshMfXhj@08%+qHxqL-Kxq6KPf^K((MUN2-CW-tn zFlTY-b(n;p-}xTY`tF$%a#L`iW249Pvi)`zHtCglSEQ3Osr_7kY70Sl;un24PQNBl zY*4ANEi$gG9APd@2eG9wi^tm&3%OSy42tP-p*GZwNVC#k6{vi@1huwoUs|I%V2zhW z-c(5U;kE8yFjnO;soxiixd2V;igCZGP?RtH0{9$XJM>tD%I93?0KMLBH)9SSgF;1f z8_bz?iNYv@6q;v&f}zH~{46)Ub4&H~*x zohE8tzDO*V_H|a0q9iIOPxu{Z!h-y$jK|z#8wzu(O}WvL=T2Z_9h*0E*3d@r*8L(9@&{UzV=FOya=3xgiR2p2i3|@-qj_NHMtHEY0EALC`^cn+Fmy}Fx)o8!^8py85 z#Ao-^4whql|2k?@iy&*A~M5ZY3UBq*b~%i`9oM3SaX zv%T9L^Ven4>dxKWLBBJQ!3(1FctWSIh&ip5H9#(pMp?04Zd9xx4kQ;OXA3P>+vUqZ za20*^GO9XUQv6SFoyVgy$Sk2!9f_0x+B}0vrttF%?+v;3AKdt-9Ta|PJJ&m$)MsT2 zx$Uh(li5s>GxgkXeJ(Fel{BAwxL+yHsu!ouVBYBPjx7y;FyIz@nidZCYUFv`)Y+|f z)FMqmlxI(LqoP&~rX}*I^nl%AsR#}({0+(ELCmbTxPzLNfFJ~dC_CYJC+4pLye~eE zda#Pmo!YK0_Jxla)?x9vc(Ms4`}#4L}d%5VN;pyCDP$9&vcxk=DYe+ w_qqf6tor+r(Vod{nwEKTB%16voy`;*_jrD4LmsX%DY@bQucvb1m+jH|4{Lay-T(jq diff --git a/gen/wrappers/ToolWrapper.py b/gen/wrappers/ToolWrapper.py index f0eed3f..cb0b96b 100644 --- a/gen/wrappers/ToolWrapper.py +++ b/gen/wrappers/ToolWrapper.py @@ -223,6 +223,7 @@ class ToolWrapper(AbstractWrapper): searchInfo.default.name or ''" href=":'%s?className=%s&search=%s' % \ (queryUrl, className, queryParam)" + onclick="clickOn(this)" class=":(not currentSearch and (currentClass==className) and \ (currentPage=='query')) and \ 'current' or ''">::_(className + '_plural') diff --git a/gen/wrappers/__init__.py b/gen/wrappers/__init__.py index e944131..88236c5 100644 --- a/gen/wrappers/__init__.py +++ b/gen/wrappers/__init__.py @@ -457,35 +457,35 @@ class AbstractWrapper(object): css=ztool.getButtonCss(label, small=False)"> - - - - - - +