From ca09b77d620896e202fa5eb4da4d30eed0c92ba3 Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Sat, 9 Jan 2010 13:05:24 +0100 Subject: Avoid whitespace because of toolbar pickers FS#1841 --- lib/scripts/edit.js | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/scripts/edit.js') diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js index ef0a9a106..a80c8a06e 100644 --- a/lib/scripts/edit.js +++ b/lib/scripts/edit.js @@ -68,6 +68,7 @@ function createPicker(id,props,edid){ picker.id = id; picker.style.position = 'absolute'; picker.style.marginLeft = '-10000px'; // no display:none, to keep access keys working + picker.style.marginTop = '-10000px'; for(var key in list){ if (!list.hasOwnProperty(key)) continue; -- cgit v1.2.3 From be615a48b77032ed713b970521ed46503be853e7 Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Wed, 25 Nov 2009 15:47:59 +0100 Subject: Support for adding IDs and classes to toolbar buttons Ignore-this: 87db996b332355addacd81b1ac13b0ab darcs-hash:20091125144759-6e07b-601ea98a48d9d3c9dd3508cdb9cde9b86c83a5a3.gz --- lib/scripts/edit.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'lib/scripts/edit.js') diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js index a80c8a06e..7b30ddca4 100644 --- a/lib/scripts/edit.js +++ b/lib/scripts/edit.js @@ -12,12 +12,15 @@ * * @author Andreas Gohr */ -function createToolButton(icon,label,key,id){ +function createToolButton(icon,label,key,id,classname){ var btn = document.createElement('button'); var ico = document.createElement('img'); // preapare the basic button stuff btn.className = 'toolbutton'; + if(classname){ + btn.className += ' '+classname; + } btn.title = label; if(key){ btn.title += ' ['+key.toUpperCase()+']'; -- cgit v1.2.3 From 3c743051cd4555135bdbf55c27733a2281463b4c Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Tue, 26 Jan 2010 10:23:46 +0100 Subject: do not use "editor cleverness" on selected text This patch disables all keyhandling (as used for automatic list indention) when some text is selected. This fixes unexpected behavior when selecting some text at the start of a list item and hitting backspace. --- lib/scripts/edit.js | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/scripts/edit.js') diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js index a80c8a06e..d7391b7e7 100644 --- a/lib/scripts/edit.js +++ b/lib/scripts/edit.js @@ -152,6 +152,7 @@ function keyHandler(e){ e.keyCode != 32) return; var field = e.target; var selection = getSelection(field); + if(selection.getLength()) return; //there was text selected, keep standard behavior var search = "\n"+field.value.substr(0,selection.start); var linestart = Math.max(search.lastIndexOf("\n"), search.lastIndexOf("\r")); //IE workaround -- cgit v1.2.3 From efb07c4e8b07eb4c07287d1bd6c0297ced02e3c8 Mon Sep 17 00:00:00 2001 From: Adrian Lang Date: Tue, 26 Jan 2010 12:37:59 +0100 Subject: Cancel list if the last item is empty (two enter) --- lib/scripts/edit.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'lib/scripts/edit.js') diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js index 4d8ead858..483fcc3cc 100644 --- a/lib/scripts/edit.js +++ b/lib/scripts/edit.js @@ -166,8 +166,14 @@ function keyHandler(e){ // keep current indention for lists and code var match = search.match(/(\n +([\*-] ?)?)/); if(match){ + var match2 = search.match(/^\n +[\*-]\s*$/); + // Cancel list if the last item is empty (i. e. two times enter) + if (match2 && field.value.substr(selection.start).match(/^($|\n)/)) { + field.value = field.value.substr(0, linestart) + "\n"; + } else { + insertAtCarret(field.id,match[1]); + } var scroll = field.scrollHeight; - insertAtCarret(field.id,match[1]); field.scrollTop += (field.scrollHeight - scroll); e.preventDefault(); // prevent enter key return false; -- cgit v1.2.3 From de5459f07034d89b2e370a95d13ab2cb4446cefb Mon Sep 17 00:00:00 2001 From: Adrian Lang Date: Thu, 11 Feb 2010 10:09:36 +0100 Subject: Do not delete content after list on two enters --- lib/scripts/edit.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'lib/scripts/edit.js') diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js index 483fcc3cc..235a91cd6 100644 --- a/lib/scripts/edit.js +++ b/lib/scripts/edit.js @@ -169,7 +169,11 @@ function keyHandler(e){ var match2 = search.match(/^\n +[\*-]\s*$/); // Cancel list if the last item is empty (i. e. two times enter) if (match2 && field.value.substr(selection.start).match(/^($|\n)/)) { - field.value = field.value.substr(0, linestart) + "\n"; + field.value = field.value.substr(0, linestart) + "\n" + + field.value.substr(selection.start); + selection.start = linestart + 1; + selection.end = linestart + 1; + setSelection(selection); } else { insertAtCarret(field.id,match[1]); } -- cgit v1.2.3 From 17b6bb19df81789531768172eb9e272a188625d9 Mon Sep 17 00:00:00 2001 From: Adrian Lang Date: Tue, 23 Feb 2010 15:02:49 +0100 Subject: Fix textarea scrolling for list editing --- lib/scripts/edit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/scripts/edit.js') diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js index 235a91cd6..58433f25c 100644 --- a/lib/scripts/edit.js +++ b/lib/scripts/edit.js @@ -166,6 +166,7 @@ function keyHandler(e){ // keep current indention for lists and code var match = search.match(/(\n +([\*-] ?)?)/); if(match){ + var scroll = field.scrollHeight; var match2 = search.match(/^\n +[\*-]\s*$/); // Cancel list if the last item is empty (i. e. two times enter) if (match2 && field.value.substr(selection.start).match(/^($|\n)/)) { @@ -177,7 +178,6 @@ function keyHandler(e){ } else { insertAtCarret(field.id,match[1]); } - var scroll = field.scrollHeight; field.scrollTop += (field.scrollHeight - scroll); e.preventDefault(); // prevent enter key return false; -- cgit v1.2.3 From fda42deb082e4bdb560818a9c23b96f9312176d5 Mon Sep 17 00:00:00 2001 From: Adrian Lang Date: Mon, 15 Mar 2010 16:57:38 +0100 Subject: Various JavaScript fixes * Syntax error fixed * lock refresh event is now attached to the whole edit form since it bubbles up and we cannot be sure that the wikitext input exists on all edit forms * Updated findPos(X|Y) * Easier and less error-prone way of getting the section edit button in the highlight mouseover event handler --- lib/scripts/edit.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'lib/scripts/edit.js') diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js index 58433f25c..b756e9488 100644 --- a/lib/scripts/edit.js +++ b/lib/scripts/edit.js @@ -386,8 +386,7 @@ var locktimer = new locktimer_class(); locktimer.sack.onCompletion = locktimer.refreshed; // register refresh event - addEvent($('dw__editform').elements.wikitext,'keypress',function(){locktimer.refresh();}); - + addEvent($('dw__editform'),'keypress',function(){locktimer.refresh();}); // start timer locktimer.reset(); }; -- cgit v1.2.3 From 26ee1edf9c1750df399baebcb70afb49778b4a92 Mon Sep 17 00:00:00 2001 From: Adrian Lang Date: Thu, 25 Mar 2010 15:01:25 +0100 Subject: Rewrite JavaScript change check --- lib/scripts/edit.js | 59 +++++++++++++++++++++++------------------------------ 1 file changed, 26 insertions(+), 33 deletions(-) (limited to 'lib/scripts/edit.js') diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js index b756e9488..eeca27353 100644 --- a/lib/scripts/edit.js +++ b/lib/scripts/edit.js @@ -260,9 +260,9 @@ var textChanged = false; /** * Check for changes before leaving the page */ -function changeCheck(msg){ +function changeCheck(){ if(textChanged){ - var ok = confirm(msg); + var ok = confirm(LANG.notsavedyet); if(ok){ // remove a possibly saved draft using ajax var dwform = $('dw__editform'); @@ -289,57 +289,50 @@ function changeCheck(msg){ * JSnocheck class), add handlers to monitor changes * * Sets focus to the editbox as well - * - * @fixme this is old and crappy code. needs to be redone */ -function initChangeCheck(msg){ - var edit_text = document.getElementById('wiki__text'); - if(!edit_text) return; - if(edit_text.readOnly) return; - if(!$('dw__editform')) return; +addInitEvent(function (){ + var editform = $('dw__editform'); + if (!editform) return; + + var edit_text = $('wiki__text'); + if(edit_text) { + if(edit_text.readOnly) return; + + // set focus + edit_text.focus(); + } + + var checkfunc = function(){ + textChanged = true; //global var + summaryCheck(); + }; + addEvent(editform, 'change', checkfunc); + addEvent(editform, 'keydown', checkfunc); // add change check for links var links = document.getElementsByTagName('a'); for(var i=0; i < links.length; i++){ if(links[i].className.indexOf('JSnocheck') == -1){ - links[i].onclick = function(){ - var rc = changeCheck(msg); - if(window.event) window.event.returnValue = rc; - return rc; - }; + addEvent(links[i], 'click', changeCheck); } } // add change check for forms var forms = document.forms; for(i=0; i < forms.length; i++){ if(forms[i].className.indexOf('JSnocheck') == -1){ - forms[i].onsubmit = function(){ - var rc = changeCheck(msg); - if(window.event) window.event.returnValue = rc; - return rc; - }; + addEvent(forms[i], 'submit', changeCheck); } } // reset change memory var on submit - var btn_save = document.getElementById('edbtn__save'); - btn_save.onclick = function(){ textChanged = false; }; - var btn_prev = document.getElementById('edbtn__preview'); - btn_prev.onclick = function(){ textChanged = false; }; + addEvent($('edbtn__save'), 'click', function(){ textChanged = false; }); + addEvent($('edbtn__preview'), 'click', function(){ textChanged = false; }); - // add change memory setter - edit_text.onchange = function(){ - textChanged = true; //global var - summaryCheck(); - }; - var summary = document.getElementById('edit__summary'); + var summary = $('edit__summary'); addEvent(summary, 'change', summaryCheck); addEvent(summary, 'keyup', summaryCheck); if (textChanged) summaryCheck(); - - // set focus - edit_text.focus(); -} +}); /** * Checks if a summary was entered - if not the style is changed -- cgit v1.2.3 From 7d54a99ffcfd517bfc9bc5e18eb3f87922617077 Mon Sep 17 00:00:00 2001 From: Adrian Lang Date: Thu, 25 Mar 2010 15:45:54 +0100 Subject: Do not try to save a draft in alternative editors --- lib/scripts/edit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/scripts/edit.js') diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js index eeca27353..9437aa14e 100644 --- a/lib/scripts/edit.js +++ b/lib/scripts/edit.js @@ -420,7 +420,7 @@ var locktimer = new locktimer_class(); // refresh every minute only if(now.getTime() - locktimer.lasttime.getTime() > 30*1000){ //FIXME decide on time var params = 'call=lock&id='+encodeURIComponent(locktimer.pageid); - if(locktimer.draft){ + if(locktimer.draft && dwform.elements.wikitext){ var dwform = $('dw__editform'); params += '&prefix='+encodeURIComponent(dwform.elements.prefix.value); params += '&wikitext='+encodeURIComponent(dwform.elements.wikitext.value); -- cgit v1.2.3 From 288007e19d34550294a9ad820b6ffa11bba0e5b3 Mon Sep 17 00:00:00 2001 From: Adrian Lang Date: Mon, 26 Apr 2010 16:18:20 +0200 Subject: Fix lock refresh and draft saving --- lib/scripts/edit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/scripts/edit.js') diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js index 9437aa14e..e66154f83 100644 --- a/lib/scripts/edit.js +++ b/lib/scripts/edit.js @@ -420,8 +420,8 @@ var locktimer = new locktimer_class(); // refresh every minute only if(now.getTime() - locktimer.lasttime.getTime() > 30*1000){ //FIXME decide on time var params = 'call=lock&id='+encodeURIComponent(locktimer.pageid); + var dwform = $('dw__editform'); if(locktimer.draft && dwform.elements.wikitext){ - var dwform = $('dw__editform'); params += '&prefix='+encodeURIComponent(dwform.elements.prefix.value); params += '&wikitext='+encodeURIComponent(dwform.elements.wikitext.value); params += '&suffix='+encodeURIComponent(dwform.elements.suffix.value); -- cgit v1.2.3 From 40f3c0b59813d467030d51948d518069141fd998 Mon Sep 17 00:00:00 2001 From: Gina Haeussge Date: Sun, 27 Jun 2010 12:25:15 +0200 Subject: FS#433: Editor now uses onbeforeunload event to capture ANY leaving of it besides via Save or Preview button. This has been successfully tested in FF, Chrome and IE6/7/8. Opera does not support onbeforeunload, therefore the draft is kept if the user navigates away from the editor. Please test this. --- lib/scripts/edit.js | 59 +++++++++++++++++++++-------------------------------- 1 file changed, 23 insertions(+), 36 deletions(-) (limited to 'lib/scripts/edit.js') diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js index e66154f83..5178dba4c 100644 --- a/lib/scripts/edit.js +++ b/lib/scripts/edit.js @@ -258,35 +258,30 @@ function currentHeadlineLevel(textboxId){ var textChanged = false; /** - * Check for changes before leaving the page + * Delete the draft before leaving the page */ -function changeCheck(){ - if(textChanged){ - var ok = confirm(LANG.notsavedyet); - if(ok){ - // remove a possibly saved draft using ajax - var dwform = $('dw__editform'); - if(dwform){ - var params = 'call=draftdel'; - params += '&id='+encodeURIComponent(dwform.elements.id.value); - - var sackobj = new sack(DOKU_BASE + 'lib/exe/ajax.php'); - sackobj.AjaxFailedAlert = ''; - sackobj.encodeURIString = false; - sackobj.runAJAX(params); - // we send this request blind without waiting for - // and handling the returned data - } +function deleteDraft() { + if (is_opera) return; + + // remove a possibly saved draft using ajax + var dwform = $('dw__editform'); + if(dwform){ + var params = 'call=draftdel'; + params += '&id='+encodeURIComponent(dwform.elements.id.value); + + var sackobj = new sack(DOKU_BASE + 'lib/exe/ajax.php'); + // this needs to be synchronous and GET to not be aborted upon page unload + sackobj.asynchronous = false; + sackobj.method = 'GET'; + sackobj.AjaxFailedAlert = ''; + sackobj.encodeURIString = false; + sackobj.runAJAX(params); } - return ok; - }else{ - return true; - } } /** - * Add changeCheck to all Links and Forms (except those with a - * JSnocheck class), add handlers to monitor changes + * Activate "not saved" dialog, add draft deletion to page unload, + * add handlers to monitor changes * * Sets focus to the editbox as well */ @@ -309,20 +304,12 @@ addInitEvent(function (){ addEvent(editform, 'change', checkfunc); addEvent(editform, 'keydown', checkfunc); - // add change check for links - var links = document.getElementsByTagName('a'); - for(var i=0; i < links.length; i++){ - if(links[i].className.indexOf('JSnocheck') == -1){ - addEvent(links[i], 'click', changeCheck); - } - } - // add change check for forms - var forms = document.forms; - for(i=0; i < forms.length; i++){ - if(forms[i].className.indexOf('JSnocheck') == -1){ - addEvent(forms[i], 'submit', changeCheck); + window.onbeforeunload = function(){ + if(textChanged) { + return LANG.notsavedyet; } } + window.onunload = deleteDraft; // reset change memory var on submit addEvent($('edbtn__save'), 'click', function(){ textChanged = false; }); -- cgit v1.2.3 From bbbf585321cf3464191ccd772baef4ee26a24e3b Mon Sep 17 00:00:00 2001 From: Michael Hamann Date: Sun, 27 Jun 2010 15:16:39 +0200 Subject: Added missing ";" in edit.js --- lib/scripts/edit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/scripts/edit.js') diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js index 5178dba4c..b9767fdc0 100644 --- a/lib/scripts/edit.js +++ b/lib/scripts/edit.js @@ -308,7 +308,7 @@ addInitEvent(function (){ if(textChanged) { return LANG.notsavedyet; } - } + }; window.onunload = deleteDraft; // reset change memory var on submit -- cgit v1.2.3 From 136982455ae0eddc18744176db33fbd7b421e11c Mon Sep 17 00:00:00 2001 From: Michael Hamann Date: Sun, 27 Jun 2010 18:34:57 +0200 Subject: Fixed automatic insertion of listbullets in Opera FS#1877 The keydown event can't be prevented in Opera (see http://www.quirksmode.org/dom/events/keys.html) so this switches back to keypress in Opera (keypress doesn't give the correct key codes in Firefox). Furthermore Opera replaces '\n' by '\r\n' when inserting text, thus the offset for cursor/selection placement was wrong. --- lib/scripts/edit.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'lib/scripts/edit.js') diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js index b9767fdc0..b507e804b 100644 --- a/lib/scripts/edit.js +++ b/lib/scripts/edit.js @@ -169,7 +169,7 @@ function keyHandler(e){ var scroll = field.scrollHeight; var match2 = search.match(/^\n +[\*-]\s*$/); // Cancel list if the last item is empty (i. e. two times enter) - if (match2 && field.value.substr(selection.start).match(/^($|\n)/)) { + if (match2 && field.value.substr(selection.start).match(/^($|\r?\n)/)) { field.value = field.value.substr(0, linestart) + "\n" + field.value.substr(selection.start); selection.start = linestart + 1; @@ -222,7 +222,13 @@ function keyHandler(e){ addInitEvent(function(){ var field = $('wiki__text'); if(!field) return; - addEvent(field,'keydown',keyHandler); + // in Firefox, keypress doesn't send the correct keycodes, + // in Opera, the default of keydown can't be prevented + if (is_opera) { + addEvent(field,'keypress',keyHandler); + } else { + addEvent(field,'keydown',keyHandler); + } }); /** -- cgit v1.2.3 From d259f728f887b2ad76a2531705eac51b7dda8676 Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Wed, 11 Aug 2010 14:01:40 +0200 Subject: fixed locktimer/draft saving on new pages When creating new pages, no date field is added in the edit form. --- lib/scripts/edit.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib/scripts/edit.js') diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js index b507e804b..01262bcef 100644 --- a/lib/scripts/edit.js +++ b/lib/scripts/edit.js @@ -418,7 +418,9 @@ var locktimer = new locktimer_class(); params += '&prefix='+encodeURIComponent(dwform.elements.prefix.value); params += '&wikitext='+encodeURIComponent(dwform.elements.wikitext.value); params += '&suffix='+encodeURIComponent(dwform.elements.suffix.value); - params += '&date='+encodeURIComponent(dwform.elements.date.value); + if(dwform.elements.date){ + params += '&date='+encodeURIComponent(dwform.elements.date.value); + } } locktimer.sack.runAJAX(params); locktimer.lasttime = now; -- cgit v1.2.3