From dcde386e79a0db0ec112185eb88297ab25a0a23c Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 14 Sep 2012 18:12:18 +0530 Subject: [PATCH] added export to reports using downloadify --- css/ui/views.css | 12 ++ js/core.min.js | 10 +- js/legacy/utils/msgprint.js | 1 + js/lib/downloadify/download.png | Bin 0 -> 2500 bytes js/lib/downloadify/downloadify.min.js | 3 + js/lib/downloadify/downloadify.swf | Bin 0 -> 2625 bytes js/lib/downloadify/swfobject.js | 4 + js/wn/dom.js | 11 ++ js/wn/request.js | 2 +- js/wn/ui/appframe.js | 11 +- js/wn/views/container.js | 9 +- js/wn/views/grid_report.js | 152 +++++++++++++++++++++++++- 12 files changed, 198 insertions(+), 17 deletions(-) create mode 100644 js/lib/downloadify/download.png create mode 100644 js/lib/downloadify/downloadify.min.js create mode 100644 js/lib/downloadify/downloadify.swf create mode 100644 js/lib/downloadify/swfobject.js diff --git a/css/ui/views.css b/css/ui/views.css index aa0c4177bd..af43efcd83 100644 --- a/css/ui/views.css +++ b/css/ui/views.css @@ -35,3 +35,15 @@ div.appframe-toolbar { border-bottom: 1px solid #ccc; } +div.appframe-toolbar .label { + margin: 2px 2px; +} + +div.appframe-toolbar input, div.appframe-toolbar select { + font-size: 80%; + margin: 2px 2px; +} +div.appframe-toolbar button { + padding: 3px 7px !important; +} + diff --git a/js/core.min.js b/js/core.min.js index 04ef28c232..fe5fb2a061 100644 --- a/js/core.min.js +++ b/js/core.min.js @@ -57,7 +57,7 @@ $(ele).css('-box-shadow','0px 0px '+spread+'px rgba(0,0,0,0.3);')};(function($){ this.selectedIndex=0;return $(this);} $.fn.set_working=function(){var ele=this.get(0);$(ele).attr('disabled','disabled');if(ele.loading_img){$(ele.loading_img).toggle(true);}else{ele.loading_img=$('').insertAfter(ele);}} -$.fn.done_working=function(){var ele=this.get(0);$(ele).attr('disabled',null);if(ele.loading_img){$(ele.loading_img).toggle(false);};}})(jQuery); +$.fn.done_working=function(){var ele=this.get(0);$(ele).attr('disabled',null);if(ele.loading_img){$(ele.loading_img).toggle(false);};}})(jQuery);wn.to_csv=function(data){var res=[];$.each(data,function(i,row){row=$.map(row,function(col){return typeof(col)==="string"?('"'+col.replace(/"/g,'\"')+'"'):col;});res.push(row.join(","));});return res.join("\n");} /* * lib/js/wn/model.js */ @@ -234,8 +234,9 @@ $(page).bind('show',onshow);if(onshow) $(page).bind('hide',onhide);page.label=label;wn.pages[label]=page;return page;},change_to:function(label){if(this.page&&this.page.label==label){return;} var me=this;if(label.tagName){var page=label;}else{var page=wn.pages[label];} if(!page){console.log('Page not found '+label);return;} -if(this.page){$(this.page).toggle(false);$(this.page).trigger('hide');} -this.page=page;$(this.page).fadeIn();this.page._route=window.location.hash;document.title=this.page.label;$(this.page).trigger('show');scroll(0,0);return this.page;}});wn.views.add_module_btn=function(parent,module){$(parent).append(repl('\ %(module)s Home\ ',{module:module,module_small:module.toLowerCase()}));} @@ -271,8 +272,7 @@ msgprint(r.server_messages);} if(r.exc){r.exc=JSON.parse(r.exc);if(r.exc instanceof Array){$.each(r.exc,function(i,v){if(v)console.log(v);})}else{console.log(r.exc);}};if(r['403']){wn.container.change_to('403');} if(r.docs){LocalDB.sync(r.docs);}} wn.request.call=function(opts){wn.request.prepare(opts);var ajax_args={url:opts.url||wn.request.url,data:opts.args,type:opts.type||'POST',dataType:opts.dataType||'json',success:function(r,xhr){wn.request.cleanup(opts,r);opts.success&&opts.success(r,xhr.responseText);},error:function(xhr,textStatus){wn.request.cleanup(opts,{});show_alert('Unable to complete request: '+textStatus) -opts.error&&opts.error(xhr)}};if(opts.progress_bar){var interval=null;$.extend(ajax_args,{xhr:function(){var xhr=jQuery.ajaxSettings.xhr();interval=setInterval(function(){if(xhr.readyState>2){var total=parseInt(xhr.getResponseHeader('Original-Length')||0)||parseInt(xhr.getResponseHeader('Content-Length'));var completed=parseInt(xhr.responseText.length);var percent=(100.0/total*completed).toFixed(2) -opts.progress_bar.css('width',(percent<10?10:percent)+'%');}},50);wn.last_xhr=xhr;return xhr;},complete:function(){opts.progress_bar.css('width','100%');clearInterval(interval);}})} +opts.error&&opts.error(xhr)}};if(opts.progress_bar){var interval=null;$.extend(ajax_args,{xhr:function(){var xhr=jQuery.ajaxSettings.xhr();interval=setInterval(function(){if(xhr.readyState>2){var total=parseInt(xhr.getResponseHeader('Original-Length')||0)||parseInt(xhr.getResponseHeader('Content-Length'));var completed=parseInt(xhr.responseText.length);var percent=(100.0/total*completed).toFixed(2);opts.progress_bar.css('width',(percent<10?10:percent)+'%');}},50);wn.last_xhr=xhr;return xhr;},complete:function(){opts.progress_bar.css('width','100%');clearInterval(interval);}})} $.ajax(ajax_args);} wn.call=function(opts){var args=$.extend({},opts.args) if(opts.module&&opts.page){args.cmd=opts.module+'.page.'+opts.page+'.'+opts.page+'.'+opts.method}else if(opts.method){args.cmd=opts.method;} diff --git a/js/legacy/utils/msgprint.js b/js/legacy/utils/msgprint.js index f5b0f912bd..089273755a 100644 --- a/js/legacy/utils/msgprint.js +++ b/js/legacy/utils/msgprint.js @@ -58,6 +58,7 @@ function msgprint(msg, title) { msg_dialog.msg_area.append(msg); msg_dialog.show(); + return msg_dialog; } // Floating Message diff --git a/js/lib/downloadify/download.png b/js/lib/downloadify/download.png new file mode 100644 index 0000000000000000000000000000000000000000..d2fabbf5a2bae5496b4d5db6fbd4c5338ff46cff GIT binary patch literal 2500 zcmV;#2|MnEsHmv0u&|t*o~o*Io}QqtuCA)8tm5M0 z!otI+r>L~FwydnKsHm#3v9YhOu(!9khlhx{xw)I0od5s-$jHfecXwxJXI@@jkB^Uj zet&awbI#7sZ*Om+qNBdPzV*cn*8l(rnn^@KRCwClS!=Gwk|h{OAv>yII7nhNf?*KJNibeVBKp7+NjBU+7XVy(U<{iGuz?6)h?W}& zQNsWjkLL!Lcl(=_;ydW>Yi3W`mis@e9vk^~W8XMrovCH@b zKo5%yGP5?0Tc*NZO(C-$vuk)x_HZx`abmfwFqn%&w6VPk1s+`T7lsO|Q9x=KDO@L@ z2lfSqSg^L)KwFR(lmm^1+?Mrft&7c5e+m+0)CSCd+93D9*-B;z~U zXDsTvJx*wGS~6I4g(M%<9r*!sG07{~SJfV>%A12dt2~7gwcrsJSXHH9%0>ze_vDF9 z%6wI!6jo?1PD}2Kejv%>bAZ3j=ks5mpW4so=Z}VC@4O*1TF)L2*lbG~Hc&m|QJr;~LlJurv^hok+CK$hvWakOS z4oQ}_U@VbjA^MmsUPUq%y+ec zgY5A$8D^Is&74`}d!CE%ypExbr4~Elx9A+7O$W8GW3s*D?8)b)fF72bXf|2nI1Tey z=UHsIdCaciIq6`#+VUmmF3E2$4Q4D&c3Lh^0pk0&hyy#I>6qt7py7!}$hiShzH5BH zZF5xh$9xC{N%X;8wlQ>Fhi=RYT`$#!BTC^>2|i7m4Hrd{Z~%QWndo6S(ZW!h;8>Zg$&A*C!UNXaFq%w8e5g(M1nSl| zE6r6V{e8{2{=e=Oek>_1FND>JLl9<9lDJ&dF;t2(hcAtEyVzb6#PQ zQ00t%(&e%~1@y2KrSWkaHC5F_SO&}rwlg2j$;097*fLn!EAzxY=h5jV+D{UA_+3r@ z71yaNCI^AcW&MevhfP-*cqW?$L2hGrV%h5P#6NshE{<3`7>oQ`JKRKj%WH>Qgbj9{ z1Ic=Jm-Q`|^)sp+b~)7!zlMuGUy#A9>$zD;aWCSSMJy_NCEyAO%yKWZ^8@^p_kijJ| z-s`%7fT=MnhKnLeImGl@JCtCRr3IxvVlaA_T9JMD|87>{qFJ@!R!VGQ*Kzgr;Pk>$OnS zXC%=?*C!g1)TLn5NTM$VLq`(jLogI15&y3ZBzY4}^7bl{muy$R8lY<1wxWmQ5u3!v z#!pr&w6-1@=%GzkP1`m+o*OFO**7c2&)V62O(I!u?{F-oR4iw^Js`H*FBxsBb5ZA* z?g2jc<-DDjy_}V0rt%3LdK#lA^U*6y@3@t}wwFd3-xpm!ofAn8`>+g`P80Nnv;30L zrrIBEfCrcSLI2Tw^nq;my-mKQEu%;N3O>4EDS!3-TZx^cqH2FUC;IM=ey*yjS?*$A zRsDEp%V<-bd8?|{En?9wb~}Hw+il2qjgXz4*?sJkL{*c1Cl~Qb8LYV@lHsqZZy^>& zSsu!XZ6|){$Y@igymf5*7O`qpVc2ZKaMRJyrU>~G=G{14dstLCVHd}nM^*ZCLB8jj zrpZ#@V4pX=S(x;C?-cD%)O-8h_YG}VL&FQTjnpr?pf`0*^G)&V`edD%+}3`Tph{7{n)xxc_RUxwmOojGjqE;AJFd z(IotXUke5o5{h8ZInmw(gR2$c|39G%GTaG8NEhT%bapMxmk92E1sDM8vG0LscT3>_ O0000+JCW$?cC$cOh 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 literal 0 HcmV?d00001 diff --git a/js/lib/downloadify/swfobject.js b/js/lib/downloadify/swfobject.js new file mode 100644 index 0000000000..8eafe9dd83 --- /dev/null +++ b/js/lib/downloadify/swfobject.js @@ -0,0 +1,4 @@ +/* SWFObject v2.2 + is released under the MIT License +*/ +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab"+label+" ").appendTo(this.toolbar); + return $(""+label+" ").appendTo(this.toolbar); }, add_select: function(label, options) { this.add_toolbar(); - return $("").add_options(options).appendTo(this.toolbar); }, + add_data: function(label) { + this.add_toolbar(); + return $("") + .appendTo(this.toolbar); + }, add_date: function(label, date) { this.add_toolbar(); - return $("").datepicker({ + return $("").datepicker({ dateFormat: sys_defaults.date_format.replace("yyyy", "yy"), changeYear: true, }).val(dateutil.str_to_user(date) || "").appendTo(this.toolbar); diff --git a/js/wn/views/container.js b/js/wn/views/container.js index 15bb4bd573..c63d49b1c2 100644 --- a/js/wn/views/container.js +++ b/js/wn/views/container.js @@ -25,6 +25,7 @@ wn.views.Container = Class.extend({ change_to: function(label) { if(this.page && this.page.label == label) { // don't trigger double events + //$(this.page).trigger('show'); return; } @@ -41,14 +42,16 @@ wn.views.Container = Class.extend({ } // hide current - if(this.page) { + if(this.page && this.page != page) { $(this.page).toggle(false); $(this.page).trigger('hide'); } // show new - this.page = page; - $(this.page).fadeIn(); + if(!this.page || this.page != page) { + this.page = page; + $(this.page).fadeIn(); + } this.page._route = window.location.hash; document.title = this.page.label; $(this.page).trigger('show'); diff --git a/js/wn/views/grid_report.js b/js/wn/views/grid_report.js index 4b91c23aa1..95c9a1e2e5 100644 --- a/js/wn/views/grid_report.js +++ b/js/wn/views/grid_report.js @@ -99,6 +99,36 @@ wn.views.GridReport = Class.extend({
') .appendTo(this.wrapper); }, + make_grid_wrapper: function() { + $('
\ + Print \ + | \ + Export \ +
').appendTo(this.wrapper); + + this.wrapper.find(".grid-report-export").click(function() { return me.export(); }); + + this.grid_wrapper = $("
") + .appendTo(this.wrapper); + this.id = wn.dom.set_unique_id(this.grid_wrapper.get(0)); + + var me = this; + // bind show event to reset cur_report_grid + // and refresh filters from url + // this must be called after init + // because "wn.container.page" will only be set + // once "load" event is over. + + $(wn.container.page).bind('show', function() { + // reapply filters on show + wn.cur_grid_report = me; + me.apply_filters_from_route(); + me.refresh(); + }); + + this.apply_filters_from_route(); + }, load_filters: function(callback) { // override callback(); @@ -109,13 +139,21 @@ wn.views.GridReport = Class.extend({ v.fieldname = v.fieldname || v.label.replace(/ /g, '_').toLowerCase(); var input = null; if(v.fieldtype=='Select') { - input = me.appframe.add_select(v.label, ["Select "+v.options]); + input = me.appframe.add_select(v.label, [v.default_value]); } else if(v.fieldtype=='Button') { input = me.appframe.add_button(v.label); + if(v.icon) { + $('').prependTo(input); + } } else if(v.fieldtype=='Date') { input = me.appframe.add_date(v.label); } else if(v.fieldtype=='Label') { input = me.appframe.add_label(v.label); + } else if(v.fieldtype=='Data') { + input = me.appframe.add_data(v.label); + } + if(v.cssClass) { + input && input.addClass(v.cssClass); } input && (input.get(0).opts = v); me.filter_inputs[v.fieldname] = input; @@ -131,15 +169,35 @@ wn.views.GridReport = Class.extend({ wn.dom.set_style('.slick-cell { font-size: 12px; }'); }, refresh: function() { - this.prepare_data(); this.render(); }, + apply_filters_from_route: function() { + var hash = window.location.hash; + var me = this; + if(hash.indexOf('/') != -1) { + $.each(hash.split('/').splice(1).join('/').split('&'), function(i, f) { + var f = f.split("="); + me.filter_inputs[f[0]].val(decodeURIComponent(f[1])); + }); + } + }, + set_route: function() { + wn.set_route(wn.container.page.page_name, $.map(this.filter_inputs, function(v) { + var val = v.val(); + var opts = v.get(0).opts; + if(val && val != opts.default_value) + return encodeURIComponent(opts.fieldname) + + '=' + encodeURIComponent(val); + }).join('&')) + }, render: function() { // new slick grid this.waiting.toggle(false); - this.grid_wrapper = $("
") - .appendTo(this.wrapper); - this.id = wn.dom.set_unique_id(this.grid_wrapper.get(0)); + + if(!this.grid_wrapper) this.make_grid_wrapper(); + + this.apply_link_formatters(); + this.prepare_data(); this.grid = new Slick.Grid("#"+this.id, this.dataView, this.columns, this.options); @@ -162,11 +220,58 @@ wn.views.GridReport = Class.extend({ this.dataView.setFilter(this.dataview_filter); this.dataView.endUpdate(); }, + export: function() { + var me = this; + var res = [$.map(this.columns, function(v) { return v.name; })]; + var col_map = $.map(this.columns, function(v) { return v.field; }); + + for (var i=0, len=this.dataView.getLength(); iYou must have Flash 10 installed to download this file.

'); + + Downloadify.create(id ,{ + filename: function(){ + return me.title + '.csv'; + }, + data: function(){ + return wn.to_csv(res); + }, + swf: 'js/lib/downloadify/downloadify.swf', + downloadImage: 'js/lib/downloadify/download.png', + onComplete: function(){ msgobj.hide(); }, + onCancel: function(){ msgobj.hide(); }, + onError: function(){ msgobj.hide(); }, + width: 100, + height: 30, + transparent: true, + append: false + }); + + return false; + }, options: { editable: false, enableColumnReorder: false }, dataview_filter: function(item) { + var filters = wn.cur_grid_report.filter_inputs; + for (i in filters) { + var filter = filters[i].get(0); + if(filter.opts.filter && !filter.opts.filter($(filter).val(), item, filter.opts)) { + return false; + } + } return true; }, date_formatter: function(row, cell, value, columnDef, dataContext) { @@ -174,5 +279,42 @@ wn.views.GridReport = Class.extend({ }, currency_formatter: function(row, cell, value, columnDef, dataContext) { return "
" + fmt_money(value) + "
"; + }, + text_formatter: function(row, cell, value, columnDef, dataContext) { + return "" + value + "
"; + }, + apply_link_formatters: function() { + var me = this; + $.each(this.columns, function(i, col) { + if(col.link_formatter) { + col.formatter = function(row, cell, value, columnDef, dataContext) { + // added link and open button to links + // link_formatter must have + // filter_input, open_btn (true / false), doctype (will be eval'd) + + // make link to add a filter + var link_formatter = wn.cur_grid_report.columns[cell].link_formatter; + var html = repl('\ + %(value)s', { + value: value, + col_name: link_formatter.filter_input, + page_name: wn.container.page.page_name + }) + + // make icon to open form + if(link_formatter.open_btn) { + html += repl(' \ + ', { + value: value, + doctype: eval(link_formatter.doctype) + }); + } + return html; + } + } + }) } }) \ No newline at end of file