[zeam.form.silva][Sylvain Viollon] Update and remove debug console.
[email protected] Fri, 23 Aug 2013 16:16:04 +0200
Newsgroups
gmane.comp.web.zope.silva.cvs
Message-ID
<[email protected] >
author: Sylvain Viollon
date: Fri Aug 23 16:16:01 2013 +0200
revision: 423:22aad581f579 in zeam.form.silva
branch: 2.4
details: https://hg.infrae.com/zeam.form.silva?cmd=changeset;node=22aad581f579
modified: src/zeam/form/silva/widgets/file.py src/zeam/form/silva/widgets/static/upload.js src/zeam/form/silva/widgets/static/upload.min.js
added:
removed:
log: Update and remove debug console.
diffstat:
src/zeam/form/silva/widgets/file.py | 6 ++++--
src/zeam/form/silva/widgets/static/upload.js | 6 ------
src/zeam/form/silva/widgets/static/upload.min.js | 2 +-
3 files changed, 5 insertions(+), 9 deletions(-)
diffs (76 lines):
diff -r 92616fe11f07 -r 22aad581f579 src/zeam/form/silva/widgets/file.py
--- a/src/zeam/form/silva/widgets/file.py Mon Aug 19 17:57:20 2013 +0200
+++ b/src/zeam/form/silva/widgets/file.py Fri Aug 23 16:16:01 2013 +0200
@@ -4,7 +4,6 @@
import logging
import json
-import uuid
from five import grok
from zope.interface import Interface
@@ -106,7 +105,10 @@
super(FileWidgetInput, self).update()
def uploadIdentifier(self):
- return str(uuid.uuid1())
+ manager = self.request.environ.get('infrae.fileupload.manager')
+ if manager is None:
+ raise interfaces.Error('The upload component is not available')
+ return manager.create_identifier()
def uploadURL(self):
manager = self.request.environ.get('infrae.fileupload.manager')
diff -r 92616fe11f07 -r 22aad581f579 src/zeam/form/silva/widgets/static/upload.js
--- a/src/zeam/form/silva/widgets/static/upload.js Mon Aug 19 17:57:20 2013 +0200
+++ b/src/zeam/form/silva/widgets/static/upload.js Fri Aug 23 16:16:01 2013 +0200
@@ -314,19 +314,16 @@
start = $.Deferred(),
api = {
start: function() {
- console !== undefined && console.log('Start called.');
$.ajax({
type: 'GET',
dataType: 'jsonp',
url: url + '?clear&' + IDENTIFIER_KEY + '=' + identifier}).then(function(info) {
- console !== undefined && console.log('Clear succeed.');
if (info['success']) {
$('body').append($upload);
$field.attr('form', 'upload-' + identifier + '-form');
start.done(function() {
api.register(IFrameStatusChecker($upload.find('iframe'), identifier, result));
api.register(PollStatusChecker(url, identifier, result));
- console !== undefined && console.log('Submit upload form.');
$upload.find('form').submit();
}).resolve({state: 'starting', received: 0, size: 0});
} else {
@@ -387,13 +384,11 @@
type: 'GET',
dataType: 'jsonp',
url: url + '?clear&' + IDENTIFIER_KEY + '=' + identifier}).then(function(info) {
- console !== undefined && console.log('Clear success.');
if (info['success']) {
start.done(function() {
$popup.dialog('close');
api.register(IFrameStatusChecker($popup.find('iframe'), identifier, result));
api.register(PollStatusChecker(url, identifier, result));
- console !== undefined && console.log('Submit upload form.');
$popup.find('form').submit();
}).resolve({state: 'starting', received: 0, size: 0});
} else {
@@ -457,7 +452,6 @@
$trigger.remove();
$file.on('change', function() {
- console !== undefined && console.log('Start upload on change event.');
ui.get(true).start();
});
} : function($field, set_objection) {
diff -r 92616fe11f07 -r 22aad581f579 src/zeam/form/silva/widgets/static/upload.min.js
--- a/src/zeam/form/silva/widgets/static/upload.min.js Mon Aug 19 17:57:20 2013 +0200
+++ b/src/zeam/form/silva/widgets/static/upload.min.js Fri Aug 23 16:16:01 2013 +0200
@@ -1,1 +1,1 @@
-(function($,jsontemplate){var IDENTIFIER_KEY="X-Progress-ID",POLL_NETWORK_RETRIES=5,POLL_NETWORK_DELAY=500,POLL_MISSING_RETRIES=20,DONT_NEED_POPUP=function(){var $test=$('<div style="display:none;"><form id="testform1"><input type="file" form="testform2" /></form><form id="testform2"></form></div>'),supported=!1;return $("body").append($test),supported=0===$test.find("#testform1")[0].length&&1===$test.find("#testform2")[0].length,$test.remove(),supported}(),PollStatusChecker=function(url,identifier,result){var poll_retries=POLL_NETWORK_RETRIES,poll_timeout=null,missing_retries=POLL_MISSING_RETRIES,deferred=$.Deferred(),poll=function(){$.ajax({type:"GET",dataType:"jsonp",url:url+"/status?"+IDENTIFIER_KEY+"="+identifier}).then(function(info){var error=null;result.notify(info),"starting"==in
fo.state&&(missing_retries-=1,missing_retries||(error=info.error||"Upload does not start",deferred.reject({message:"Upload failed ("+error+")."}))),"done"==info.state||"error"==info.state?"d
one"==info.state?deferred.resolve(info):(error=info.error||"Unknow error",deferred.reject({message:"Upload failed ("+error+")."})):"pending"==result.state()&&missing_retries&&(poll_retries=POLL_NETWORK_RETRIES,poll_timeout=setTimeout(poll,POLL_NETWORK_DELAY))},function(){"pending"==result.state()&&(poll_retries?(poll_retries-=1,poll_timeout=setTimeout(poll,POLL_NETWORK_DELAY)):deferred.reject({message:"Upload failed (Cannot check the status of the upload)."}))})};return{promise:deferred.promise,start:function(){poll_timeout=setTimeout(poll,POLL_NETWORK_DELAY)},always:function(){null!==poll_timeout&&(clearTimeout(poll_timeout),poll_timeout=null)}}},IFrameStatusChecker=function($iframe,identifier){var iframe=$iframe.get(0),iframe_window=iframe.contentWindow,iframe_document=iframe_window.doc
ument,deferred=$.Deferred(),fail=function(){setTimeout(function(){deferred.reject({message:"Upload failed (File too big or server error)."})},POLL_NETWORK_DELAY)},load=function(){var $body=$
(iframe_document.body);$body.data("upload-identifier")==identifier?deferred.resolve($body.data("upload-info")):fail()};return iframe_window.addEventListener?(iframe_window.addEventListener("load",load,!1),iframe_window.addEventListener("error",fail,!1)):(iframe_window.attachEvent("onload",load),iframe_window.attachEvent("onerror",fail)),{promise:deferred.promise}},UploadStatusMessage=function($display){var $empty=$display.children(".upload-display-empty"),$uploading=$display.children(".upload-display-uploading"),$done=$display.children(".upload-display-complete"),empty=$empty.children("i").text(),uploading=jsontemplate.Template($uploading.children("i").text(),{}),done=jsontemplate.Template($done.children("i").text(),{}),state="empty",defaults={filename:"","content-type":"n/a"},original=$d
isplay.data("upload-status"),api={start:function(data){"starting"!=state&&($uploading.children("i").text(uploading.expand($.extend({},defaults,data))),$empty.hide(),$done.hide(),$uploading.s
how(),state="starting")},progress:function(data){"uploading"!=state&&"uploading"==data.state&&($uploading.children("i").text(uploading.expand($.extend({},defaults,data))),state="uploading")},done:function(data){"done"!=state&&($done.children("i").text(done.expand($.extend({},defaults,data))),$empty.hide(),$uploading.hide(),$done.show(),state="done")},fail:function(data){("empty"!=state||data.message)&&($empty.children("i").text(data.message||empty),"empty"!=state&&($uploading.hide(),$done.hide(),$empty.show(),state="empty"))}};return original&&api.done(original),api},UploadProgress=function($progress){var progress=0;return{start:function(){$progress.progressbar({value:0}).show()},progress:function(data){var updated=0;"uploading"==data.state&&(updated=100*data.received/data.size),updated!=
progress&&($progress.progressbar({value:updated}),progress=updated)},always:function(){$progress.hide(),progress=0}}},UploadUI=function($field,set_objection,get_upload){var $input=$field.chi
ldren(".upload-input"),$cancel=$field.children(".upload-cancel"),$clear=$field.children(".upload-clear"),upload=null,objection=null,progress=UploadProgress($field.children(".upload-progress")),status=UploadStatusMessage($field.children(".upload-display")),api={get:function(create){return null==upload&&create&&(upload=get_upload(),upload.register(status),upload.register(progress),upload.register(ui)),upload}},ui={start:function(){void 0!==set_objection&&(objection=$.Deferred(),set_objection(function(){if("pending"==objection.state()){var $dialog=$('<div title="Uploading file"><p>Please wait until the upload is finished ...</p><p class="progress"></p></div>'),$progress=$dialog.find("p.progress"),progress=0;return $dialog.dialog({modal:!0,closeOnEscape:!1,resizable:!1,draggable:!1,beforeClos
e:function(){return!1}}),$progress.progressbar({value:0}),api.get().register({progress:function(data){var updated=0;"uploading"==data.state&&(updated=100*data.received/data.size),updated!=pr
ogress&&($progress.progressbar({value:updated}),progress=updated)}}),objection.always(function(){$dialog.dialog("close").remove(),objection=null})}return null})),$cancel.show()},done:function(){$input.attr("value",$field.data("upload-identifier"))},always:function(){null!==objection&&objection.resolve(),$cancel.hide(),upload=null}};return $cancel.on("click",function(){var upload=api.get();null!==upload&&upload.cancel()}),$clear.on("click",function(){var upload=api.get(!0);upload.cancel(),$input.attr("value","")}),api},UploadForm=function($field,identifier,url){var $upload=$('<div style="display:none"><iframe width="0" height="0" style="display:none"src="about:blank" class="upload-iframe" name="upload-'+identifier+'-iframe"></iframe>'+'<form class="upload-form" enctype="multipart/form-data
"'+'method="POST" action="'+url+"?"+IDENTIFIER_KEY+"="+identifier+'" target="upload-'+identifier+'-iframe" id="upload-'+identifier+'-form">'+'<input type="reset" class="upload-reset" /></for
m></div>'),result=$.Deferred().fail(function(){$upload.find(".upload-reset").click(),$upload.find(".upload-iframe").attr("src","javascript:false;")}).always(function(){$upload.remove(),$field.removeAttr("form")}),start=$.Deferred(),api={start:function(){void 0!==console&&console.log("Start called."),$.ajax({type:"GET",dataType:"jsonp",url:url+"?clear&"+IDENTIFIER_KEY+"="+identifier}).then(function(info){if(void 0!==console&&console.log("Clear succeed."),info.success)$("body").append($upload),$field.attr("form","upload-"+identifier+"-form"),start.done(function(){api.register(IFrameStatusChecker($upload.find("iframe"),identifier,result)),api.register(PollStatusChecker(url,identifier,result)),void 0!==console&&console.log("Submit upload form."),$upload.find("form").submit()}).resolve({state:
"starting",received:0,size:0});else{var error=info.error||"Unknow error";result.reject({message:"Upload failed ("+error+")."})}},function(){result.reject({message:"Upload failed."})})},cance
l:function(){result.reject({})},register:function(plugin){void 0!==plugin.start&&start.done(plugin.start),void 0!==plugin.promise&&plugin.promise().then(function(data){result.resolve(data)},function(data){result.reject(data)});for(var event in{progress:1,done:1,fail:1,always:1})void 0!==plugin[event]&&result[event](plugin[event]);return api}};return api},UploadPopup=function(identifier,url){var $popup=$('<div title="Upload a file"><form class="upload-form" enctype="multipart/form-data"method="POST" action="'+url+"?"+IDENTIFIER_KEY+"="+identifier+'" target="upload-'+identifier+'-iframe" id="upload-'+identifier+'-form">'+'<input type="file" name="file-we-are-uploading" class="upload-file" /></form>'+'<iframe width="0" height="0" style="display:none"'+'src="about:blank" class="upload-iframe
" name="upload-'+identifier+'-iframe"></iframe></div>'),result=$.Deferred().fail(function(){$popup.find(".upload-iframe").attr("src","javascript:false;")}).always(function(){$popup.remove()}
),start=$.Deferred(),api={start:function(){var send=function(){$.ajax({type:"GET",dataType:"jsonp",url:url+"?clear&"+IDENTIFIER_KEY+"="+identifier}).then(function(info){if(void 0!==console&&console.log("Clear success."),info.success)start.done(function(){$popup.dialog("close"),api.register(IFrameStatusChecker($popup.find("iframe"),identifier,result)),api.register(PollStatusChecker(url,identifier,result)),void 0!==console&&console.log("Submit upload form."),$popup.find("form").submit()}).resolve({state:"starting",received:0,size:0});else{var error=info.error||"Unknow error";result.reject({message:"Upload failed ("+error+")."})}},function(){result.reject({message:"Upload failed."})})};$popup.find(".upload-file").on("change",function(){send()}),$popup.dialog({buttons:{Send:function(){send()}
}})},cancel:function(){result.reject({})},register:function(plugin){void 0!==plugin.start&&start.done(plugin.start),void 0!==plugin.promise&&plugin.promise().then(function(data){result.resol
ve(data)},function(data){result.reject(data)});for(var event in{progress:1,done:1,fail:1,always:1})void 0!==plugin[event]&&result[event](plugin[event]);return api}};return api},UploadField=DONT_NEED_POPUP?function($field,set_objection){var $trigger=$field.children(".upload-trigger"),$file=$field.children(".upload-file-input"),ui=UploadUI($field,set_objection,function(){return UploadForm($file,$field.data("upload-identifier"),$field.data("upload-url")).register({start:function(){$file.hide()},always:function(){$file.show()}})});$trigger.remove(),$file.on("change",function(){void 0!==console&&console.log("Start upload on change event."),ui.get(!0).start()})}:function($field,set_objection){var $trigger=$field.children(".upload-trigger"),$file=$field.children(".upload-file-input"),ui=UploadUI
($field,set_objection,function(){return UploadPopup($field.data("upload-identifier"),$field.data("upload-url")).register({start:function(){$trigger.hide()},always:function(){$trigger.show()}
})});$file.detach(),$trigger.show(),$trigger.on("click",function(){ui.get(!0).start()})};$(document).on("loadwidget-smiform",".form-fields-container",function(event,data){$(this).find(".upload-file").each(function(){UploadField($(this),data.set_objection)}),event.stopPropagation()})})(jQuery,jsontemplate);
\ No newline at end of file
+(function($,jsontemplate){var IDENTIFIER_KEY="X-Progress-ID",POLL_NETWORK_RETRIES=5,POLL_NETWORK_DELAY=500,POLL_MISSING_RETRIES=20,DONT_NEED_POPUP=function(){var $test=$('<div style="display:none;"><form id="testform1"><input type="file" form="testform2" /></form><form id="testform2"></form></div>'),supported=!1;return $("body").append($test),supported=0===$test.find("#testform1")[0].length&&1===$test.find("#testform2")[0].length,$test.remove(),supported}(),PollStatusChecker=function(url,identifier,result){var poll_retries=POLL_NETWORK_RETRIES,poll_timeout=null,missing_retries=POLL_MISSING_RETRIES,deferred=$.Deferred(),poll=function(){$.ajax({type:"GET",dataType:"jsonp",url:url+"/status?"+IDENTIFIER_KEY+"="+identifier}).then(function(info){var error=null;result.notify(info),"starting"==in
fo.state&&(missing_retries-=1,missing_retries||(error=info.error||"Upload does not start",deferred.reject({message:"Upload failed ("+error+")."}))),"done"==info.state||"error"==info.state?"d
one"==info.state?deferred.resolve(info):(error=info.error||"Unknow error",deferred.reject({message:"Upload failed ("+error+")."})):"pending"==result.state()&&missing_retries&&(poll_retries=POLL_NETWORK_RETRIES,poll_timeout=setTimeout(poll,POLL_NETWORK_DELAY))},function(){"pending"==result.state()&&(poll_retries?(poll_retries-=1,poll_timeout=setTimeout(poll,POLL_NETWORK_DELAY)):deferred.reject({message:"Upload failed (Cannot check the status of the upload)."}))})};return{promise:deferred.promise,start:function(){poll_timeout=setTimeout(poll,POLL_NETWORK_DELAY)},always:function(){null!==poll_timeout&&(clearTimeout(poll_timeout),poll_timeout=null)}}},IFrameStatusChecker=function($iframe,identifier){var iframe=$iframe.get(0),iframe_window=iframe.contentWindow,iframe_document=iframe_window.doc
ument,deferred=$.Deferred(),fail=function(){setTimeout(function(){deferred.reject({message:"Upload failed (File too big or server error)."})},POLL_NETWORK_DELAY)},load=function(){var $body=$
(iframe_document.body);$body.data("upload-identifier")==identifier?deferred.resolve($body.data("upload-info")):fail()};return iframe_window.addEventListener?(iframe_window.addEventListener("load",load,!1),iframe_window.addEventListener("error",fail,!1)):(iframe_window.attachEvent("onload",load),iframe_window.attachEvent("onerror",fail)),{promise:deferred.promise}},UploadStatusMessage=function($display){var $empty=$display.children(".upload-display-empty"),$uploading=$display.children(".upload-display-uploading"),$done=$display.children(".upload-display-complete"),empty=$empty.children("i").text(),uploading=jsontemplate.Template($uploading.children("i").text(),{}),done=jsontemplate.Template($done.children("i").text(),{}),state="empty",defaults={filename:"","content-type":"n/a"},original=$d
isplay.data("upload-status"),api={start:function(data){"starting"!=state&&($uploading.children("i").text(uploading.expand($.extend({},defaults,data))),$empty.hide(),$done.hide(),$uploading.s
how(),state="starting")},progress:function(data){"uploading"!=state&&"uploading"==data.state&&($uploading.children("i").text(uploading.expand($.extend({},defaults,data))),state="uploading")},done:function(data){"done"!=state&&($done.children("i").text(done.expand($.extend({},defaults,data))),$empty.hide(),$uploading.hide(),$done.show(),state="done")},fail:function(data){("empty"!=state||data.message)&&($empty.children("i").text(data.message||empty),"empty"!=state&&($uploading.hide(),$done.hide(),$empty.show(),state="empty"))}};return original&&api.done(original),api},UploadProgress=function($progress){var progress=0;return{start:function(){$progress.progressbar({value:0}).show()},progress:function(data){var updated=0;"uploading"==data.state&&(updated=100*data.received/data.size),updated!=
progress&&($progress.progressbar({value:updated}),progress=updated)},always:function(){$progress.hide(),progress=0}}},UploadUI=function($field,set_objection,get_upload){var $input=$field.chi
ldren(".upload-input"),$cancel=$field.children(".upload-cancel"),$clear=$field.children(".upload-clear"),upload=null,objection=null,progress=UploadProgress($field.children(".upload-progress")),status=UploadStatusMessage($field.children(".upload-display")),api={get:function(create){return null==upload&&create&&(upload=get_upload(),upload.register(status),upload.register(progress),upload.register(ui)),upload}},ui={start:function(){void 0!==set_objection&&(objection=$.Deferred(),set_objection(function(){if("pending"==objection.state()){var $dialog=$('<div title="Uploading file"><p>Please wait until the upload is finished ...</p><p class="progress"></p></div>'),$progress=$dialog.find("p.progress"),progress=0;return $dialog.dialog({modal:!0,closeOnEscape:!1,resizable:!1,draggable:!1,beforeClos
e:function(){return!1}}),$progress.progressbar({value:0}),api.get().register({progress:function(data){var updated=0;"uploading"==data.state&&(updated=100*data.received/data.size),updated!=pr
ogress&&($progress.progressbar({value:updated}),progress=updated)}}),objection.always(function(){$dialog.dialog("close").remove(),objection=null})}return null})),$cancel.show()},done:function(){$input.attr("value",$field.data("upload-identifier"))},always:function(){null!==objection&&objection.resolve(),$cancel.hide(),upload=null}};return $cancel.on("click",function(){var upload=api.get();null!==upload&&upload.cancel()}),$clear.on("click",function(){var upload=api.get(!0);upload.cancel(),$input.attr("value","")}),api},UploadForm=function($field,identifier,url){var $upload=$('<div style="display:none"><iframe width="0" height="0" style="display:none"src="about:blank" class="upload-iframe" name="upload-'+identifier+'-iframe"></iframe>'+'<form class="upload-form" enctype="multipart/form-data
"'+'method="POST" action="'+url+"?"+IDENTIFIER_KEY+"="+identifier+'" target="upload-'+identifier+'-iframe" id="upload-'+identifier+'-form">'+'<input type="reset" class="upload-reset" /></for
m></div>'),result=$.Deferred().fail(function(){$upload.find(".upload-reset").click(),$upload.find(".upload-iframe").attr("src","javascript:false;")}).always(function(){$upload.remove(),$field.removeAttr("form")}),start=$.Deferred(),api={start:function(){$.ajax({type:"GET",dataType:"jsonp",url:url+"?clear&"+IDENTIFIER_KEY+"="+identifier}).then(function(info){if(info.success)$("body").append($upload),$field.attr("form","upload-"+identifier+"-form"),start.done(function(){api.register(IFrameStatusChecker($upload.find("iframe"),identifier,result)),api.register(PollStatusChecker(url,identifier,result)),$upload.find("form").submit()}).resolve({state:"starting",received:0,size:0});else{var error=info.error||"Unknow error";result.reject({message:"Upload failed ("+error+")."})}},function(){result.r
eject({message:"Upload failed."})})},cancel:function(){result.reject({})},register:function(plugin){void 0!==plugin.start&&start.done(plugin.start),void 0!==plugin.promise&&plugin.promise().
then(function(data){result.resolve(data)},function(data){result.reject(data)});for(var event in{progress:1,done:1,fail:1,always:1})void 0!==plugin[event]&&result[event](plugin[event]);return api}};return api},UploadPopup=function(identifier,url){var $popup=$('<div title="Upload a file"><form class="upload-form" enctype="multipart/form-data"method="POST" action="'+url+"?"+IDENTIFIER_KEY+"="+identifier+'" target="upload-'+identifier+'-iframe" id="upload-'+identifier+'-form">'+'<input type="file" name="file-we-are-uploading" class="upload-file" /></form>'+'<iframe width="0" height="0" style="display:none"'+'src="about:blank" class="upload-iframe" name="upload-'+identifier+'-iframe"></iframe></div>'),result=$.Deferred().fail(function(){$popup.find(".upload-iframe").attr("src","javascript:fal
se;")}).always(function(){$popup.remove()}),start=$.Deferred(),api={start:function(){var send=function(){$.ajax({type:"GET",dataType:"jsonp",url:url+"?clear&"+IDENTIFIER_KEY+"="+identifier})
.then(function(info){if(info.success)start.done(function(){$popup.dialog("close"),api.register(IFrameStatusChecker($popup.find("iframe"),identifier,result)),api.register(PollStatusChecker(url,identifier,result)),$popup.find("form").submit()}).resolve({state:"starting",received:0,size:0});else{var error=info.error||"Unknow error";result.reject({message:"Upload failed ("+error+")."})}},function(){result.reject({message:"Upload failed."})})};$popup.find(".upload-file").on("change",function(){send()}),$popup.dialog({buttons:{Send:function(){send()}}})},cancel:function(){result.reject({})},register:function(plugin){void 0!==plugin.start&&start.done(plugin.start),void 0!==plugin.promise&&plugin.promise().then(function(data){result.resolve(data)},function(data){result.reject(data)});for(var even
t in{progress:1,done:1,fail:1,always:1})void 0!==plugin[event]&&result[event](plugin[event]);return api}};return api},UploadField=DONT_NEED_POPUP?function($field,set_objection){var $trigger=
$field.children(".upload-trigger"),$file=$field.children(".upload-file-input"),ui=UploadUI($field,set_objection,function(){return UploadForm($file,$field.data("upload-identifier"),$field.data("upload-url")).register({start:function(){$file.hide()},always:function(){$file.show()}})});$trigger.remove(),$file.on("change",function(){ui.get(!0).start()})}:function($field,set_objection){var $trigger=$field.children(".upload-trigger"),$file=$field.children(".upload-file-input"),ui=UploadUI($field,set_objection,function(){return UploadPopup($field.data("upload-identifier"),$field.data("upload-url")).register({start:function(){$trigger.hide()},always:function(){$trigger.show()}})});$file.detach(),$trigger.show(),$trigger.on("click",function(){ui.get(!0).start()})};$(document).on("loadwidget-smifor
m",".form-fields-container",function(event,data){$(this).find(".upload-file").each(function(){UploadField($(this),data.set_objection)}),event.stopPropagation()})})(jQuery,jsontemplate);
\ No newline at end of file