Changed files: web2py/applications/admin/controllers/default.py web2py/applications/admin/static/ajax_editor.js web2py/applications/admin/views/default/edit.html web2py/applications/admin/views/layout.html web2py/applications/admin/views/web2py_ajax.html
this time patch is more intrusive than from last time, because i had to change html layout to make "flash" field available. Still missing part is relogin but this time this is just response to your request :) I don't know why it does not work from konqueror as jquery should be portable that much? Anyway for now this is MozillaFirefox only untill I found out what is not working in my JavaScript code :-\ On Mon, Feb 23, 2009 at 7:52 PM, Boris Manojlovic < boris.manojlo...@gmail.com> wrote: > will try to do it asap :) > only missing will be "relogin" as i still didn't look into session issue. > You would have to open new window(tab) and login there untill i find some > nice solution for session timeout. > > > On Mon, Feb 23, 2009 at 7:16 PM, mdipierro <mdipie...@cs.depaul.edu>wrote: > >> >> ok but can you send me a patch that does 1,2,3? >> >> On Feb 23, 9:59 am, Boris Manojlovic <boris.manojlo...@gmail.com> >> wrote: >> > hello, >> > 1) what exactly you need is very simple to achive as putting with JS >> value >> > into some <div> (or I'm missing your point, which i think is case here) >> > 2) this is done already trough javascript (ajax_editor.js) as that was >> > needed for successful "save" functionality (or resolve redirect is >> received >> > if it is not sent) >> > 3) that is still to be done on client side - server side is same (and >> > implemented) code as it was before for /edit/ control,JSON should >> contain >> > standard errors you receive by HTML as you can see in patch >> > >> > >> > >> > On Mon, Feb 23, 2009 at 4:41 AM, mdipierro <mdipie...@cs.depaul.edu> >> wrote: >> > >> > > Boris. I really like this but we need >> > >> > > 1) make hash value visible and readonly >> > > 2) return the same when it was saved as well >> > > 3) some kind of notification (possibly in the form of flash) that >> > > informs the user if the file was saved or not. >> > >> > > Massimo >> > >> > > On Feb 22, 12:43 pm, Boris Manojlovic <boris.manojlo...@gmail.com> >> > > wrote: >> > > > Please try this patch last one was non working... >> > >> > > > On Sun, Feb 22, 2009 at 7:16 PM, Boris Manojlovic < >> > >> > > > boris.manojlo...@gmail.com> wrote: >> > > > > Hello to All, >> > >> > > > > i have started to work on something called "ajax" code editor. >> > > > > What exactly does it mean? >> > >> > > > > 1. No need for reloads on editor page (just think about undo >> redo in >> > > > > editor window) >> > > > > 2. No "terrible loss of code" if you are logged out >> (application >> > > > > timeout... with that "great" redirect to login page...) >> > > > > 3. speed gain >> > >> > > > > Current implementation has "save" functionality only and it works >> just >> > > from >> > > > > firefox (konqueror ignores my jquery code and same for opera...). >> > > > > Most coding as it would be expected should (and is) done on client >> side >> > > and >> > > > > will degrade depending if user use javascript at all - no script >> no >> > > ajax >> > > > > anyway. >> > > > > All messages in current stage are json passed to client. >> > > > > Patch against latest SVN from google code >> > >> > > > > P.S. Comments welcome and needed (to continue on this idea or not) >> > > > > -- >> > > > > "Only two things are infinite, the universe and human stupidity, >> and >> > > I'm >> > > > > not sure about the former."-Albert Einstein >> > >> > > > -- >> > > > "Only two things are infinite, the universe and human stupidity, and >> I'm >> > > not >> > > > sure about the former."-Albert Einstein >> > >> > > > ajax_editor.patch >> > > > 7KViewDownload >> > >> > -- >> > "Only two things are infinite, the universe and human stupidity, and I'm >> not >> > sure about the former."-Albert Einstein >> >> >> > > > -- > "Only two things are infinite, the universe and human stupidity, and I'm > not sure about the former."-Albert Einstein > -- "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."-Albert Einstein --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "web2py Web Framework" group. To post to this group, send email to web2py@googlegroups.com To unsubscribe from this group, send email to web2py+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/web2py?hl=en -~----------~----~----~----~------~----~------~--~---
--- web2py_orig/applications/admin/controllers/default.py 2009-02-22 02:22:10.000000000 +0100 +++ web2py/applications/admin/controllers/default.py 2009-02-23 20:55:08.000000000 +0100 @@ -425,6 +425,9 @@ def edit(): """ File edit handler """ + # Load json only if it is ajax edited... + if request.vars.has_key('from_ajax'): + import gluon.contrib.simplejson as json filename = '/'.join(request.args) @@ -450,7 +453,10 @@ data1 = open(path, 'r').read() except IOError: session.flash = 'Invalid action' - redirect(URL(r=request, f='site')) + if request.vars.has_key('from_ajax'): + return json.dumps({'error': 'Invalid action'}) + else: + redirect(URL(r=request, f='site')) file_hash = md5_hash(data) open(path, 'w').write(data) @@ -461,7 +467,10 @@ data = open(path, 'r').read() except IOError: session.flash = 'Invalid action' - redirect(URL(r=request, f='site')) + if request.vars.has_key('from_ajax'): + return json.dumps({'error': 'Invalid action'}) + else: + redirect(URL(r=request, f='site')) file_hash = md5_hash(data) @@ -469,7 +478,11 @@ session.flash = T('file changed on disk') data = request.vars.data.replace('\r\n', '\n').strip() + '\n' open(path + '.1', 'w').write(data) - redirect(URL(r=request, f='resolve', args=request.args)) + if request.vars.has_key('from_ajax'): + #return json.dumps({'error': session.flash, 'resolve': 'true'}) + return json.dumps({'error': 'file changed on disk', 'resolve': 'true'}) + else: + redirect(URL(r=request, f='resolve', args=request.args)) elif request.vars.data: open(path + '.bak', 'w').write(data) data = request.vars.data.replace('\r\n', '\n').strip() + '\n' @@ -504,15 +517,18 @@ else: (controller, functions) = (None, None) - return dict(app=request.args[0], - filename=filename, - filetype=filetype, - data=data, - edit_controller=edit_controller, - file_hash=file_hash, - controller=controller, - functions=functions) - + if request.vars.has_key('from_ajax'): + return json.dumps({'file_hash': file_hash,'error' :''}) + #return response.json(file_hash) # maybe? + else: + return dict(app=request.args[0], + filename=filename, + filetype=filetype, + data=data, + edit_controller=edit_controller, + file_hash=file_hash, + controller=controller, + functions=functions) def resolve(): """ """ --- web2py_orig/applications/admin/static/ajax_editor.js 1970-01-01 01:00:00.000000000 +0100 +++ web2py/applications/admin/static/ajax_editor.js 2009-02-23 21:09:40.000000000 +0100 @@ -0,0 +1,53 @@ +function prepareDataForSave(name,data) { + var obj = new Object(); + obj.Name = name; + obj.Data = data; + return obj; +} + +function prepareMultiPartPOST(data) { + var boundary = 'sPlItME' + Math.floor(Math.random()*10000); + var reqdata = '--' + boundary; + //console.log(data.length); + for (var i=0;i < data.length;i++) + { + reqdata += "\r\n" ; + reqdata += 'content-disposition: form-data; name="' + data[i].Name + '"'; + reqdata += "\r\n" ; + reqdata += data[i].Data; + reqdata += "\r\n" ; + reqdata += '--' + boundary; + } + return new Array(reqdata,boundary); +} + +function doClickSave() { + var dataForPost = prepareMultiPartPOST( + new Array( + prepareDataForSave('data', area.textarea.value), + prepareDataForSave('file_hash', $("input[name='file_hash']").val()), + prepareDataForSave('from_ajax','true') + ) + ) + //console.info(area.textarea.value); + $.ajax({ + type: "POST", + contentType: 'multipart/form-data;boundary="' + dataForPost[1] + '"', + url: self.location.href, + dataType: "json", + data: dataForPost[0], + success: function(json){ + //console.info( json.file_hash ); + if (json.error == '') { + $("input[name='file_hash']").val(json.file_hash); + //console.info($("input[name='file_hash']").val()); + $('.flash').text('saved with file_hash= "' + json.file_hash + '"'); + $('.flash').removeClass('error'); // remove error class if we had it in previous call... + } else { + $('.flash').addClass('error'); + $('.flash').text('THERE WERE ERRORS SAVING FILE = "' + json.error + '"'); + } + $('.flash').slideDown('slow'); + } + }); +} --- web2py_orig/applications/admin/views/default/edit.html 2009-02-22 02:22:09.000000000 +0100 +++ web2py/applications/admin/views/default/edit.html 2009-02-22 19:02:49.000000000 +0100 @@ -2,7 +2,12 @@ <script language="Javascript" type="text/javascript" src="{{=URL(r=request,c='static',f='edit_area/edit_area_full.js')}}"></script><script language="Javascript" type="text/javascript"> editAreaLoader.init({id: "body",start_highlight: true,allow_resize: "both",allow_toggle: true,language: "en",syntax: "{{=filetype}}",replace_tab_by_spaces: 4}); </script> +<script language="Javascript" type="text/javascript" src="/{{=request.application}}/static/ajax_editor.js"></script><script language="Javascript" type="text/javascript"> +$(document).ready(function(){ + $("form").bind("submit", function() { doClickSave();return false; }); +}); +</script> <h1>Editing file "{{=filename}}"</h1> {{if functions:}} --- web2py_orig/applications/admin/views/layout.html 2009-02-22 02:22:10.000000000 +0100 +++ web2py/applications/admin/views/layout.html 2009-02-23 20:23:15.000000000 +0100 @@ -31,9 +31,11 @@ <div id="main_inner" class="fixed"> <div id="primaryContent_columnless"> <div id="columnA_columnless"> + <div class="flash"> {{if response.flash:}} - <div class="flash">{{=response.flash}}</div> + {{=response.flash}} {{pass}} + </div> {{include}} </div> </div> --- web2py_orig/applications/admin/views/web2py_ajax.html 2009-02-22 02:22:10.000000000 +0100 +++ web2py/applications/admin/views/web2py_ajax.html 2009-02-23 20:43:09.000000000 +0100 @@ -22,8 +22,11 @@ $(document).ready(function() { $('.hidden').hide(); $('.error').hide().slideDown('slow'); -$('.flash').hide().slideDown('slow') -$('.flash').click(function() { $(this).fadeOut('slow'); return false; }); +if ($('.flash').text() == '') + $('.flash').hide().slideDown('slow'); +else + $('.flash').hide(); +$('.flash').click(function() { $(this).slideUp('slow'); return false; }); //changed from default fadeout as it is too much intrusive :) $('input.string').attr('size',50); $('textarea.text').attr('cols',50).attr('rows',10); $('input.integer').keyup(function(){this.value=this.value.reverse().replace(/[^0-9\-]|\-(?=.)/g,'').reverse();});