diff --git a/README.txt b/README.txt index 2007f0a..aa64469 100644 --- a/README.txt +++ b/README.txt @@ -1,8 +1,8 @@ === pageMash > pageManagement === Contributors: JoelStarnes Tags: order pages, ajax, re-order, drag-and-drop, admin, manage, page, pages, sidebar, header, hide, -Requires at least: 2.1 -Tested up to: 2.5 +Requires at least: 2.0 +Tested up to: 2.4-bleeding Stable tag: 1.0.4 Organise page order and manage page structure with this simple drag-and-drop Ajax interface. @@ -38,7 +38,7 @@ The code here is very simple and flexible, for more information look up `wp_list If you have any questions or comments, please drop me an email: http://joelstarnes.co.uk/contact = Do I need any special code in my template = -No. You no longer need to add the pageMash parameter as you did with the previous versions [<1.0.2]. You can leave the code in as it will do no harm, but it's good to keep your template clean of unnecessary code. +No. You no longer need to add the pageMash parameter as you did with the previous versions [<1.0.2]. You can leave the code in as it will do no harm, but it's a good idea to keep your template clean of unnecessary code. == Screenshots == @@ -68,7 +68,6 @@ No. You no longer need to add the pageMash parameter as you did with the previou 1.0.4 > Removed shorthand PHP and updated CSS and JS headers to admin_print_scripts hook. - == Localization == Currently only available in english. \ No newline at end of file diff --git a/inlineEdit.v1.2.js b/inlineEdit.v1.2.js new file mode 100644 index 0000000..de79d35 --- /dev/null +++ b/inlineEdit.v1.2.js @@ -0,0 +1,47 @@ +var inlineEdit = new Class({ + getOptions: function(){ + return { + onComplete: function(el,oldContent,newContent){ + }, + type: 'input' + }; + }, + initialize: function(element,options){ + this.setOptions(this.getOptions(), options); + if(!element.innerHTML.toLowerCase().match('<'+this.options.type)){ + this.editting = element; + this.oldContent = element.innerHTML; + var content = this.oldContent.trim().replace(new RegExp("
", "gi"), "\n"); + this.inputBox = new Element(this.options.type).setProperty('value',content).setStyles('margin:0;background:transparent;width:99.5%;font-size:100%;border:0;'); + if(!this.inputBox.value){this.inputBox.setHTML(content)} + this.editting.setHTML(''); + this.inputBox.injectInside(this.editting); + (function(){this.inputBox.focus()}.bind(this)).delay(300); + this.inputBox.addEvent('change',this.onSave.bind(this)); + this.inputBox.addEvent('blur',this.onSave.bind(this)); + this.inputBox.addEvent('keyup',this.onKeyUp.bindWithEvent(this)); + this.fireEvent('onStart', [this.editting]); + } + }, + onKeyUp: function(e){ + if("enter" == e.key) + { + this.onSave(); + } + }, + onSave: function(){ + this.inputBox.removeEvents(); + this.newContent = this.inputBox.value.trim().replace(new RegExp("\n", "gi"), "
"); + this.editting.setHTML(this.newContent); + this.fireEvent('onComplete', [this.editting,this.oldContent,this.newContent]); + } +}); + +Element.extend({ + inlineEdit: function(options) { + return new inlineEdit(this, options); + } +}); + +inlineEdit.implement(new Events); +inlineEdit.implement(new Options); diff --git a/nested.js b/nested.js index 8879786..64a5423 100644 --- a/nested.js +++ b/nested.js @@ -231,10 +231,11 @@ var Nested = new Class({ $$(listEl.childNodes).each(function(node, i) { kids = $E('ul', node); /* set 'this.options.parentTag' straight to 'ul' to avoid safari bug */ serial[i] = { - id: node.id, - hide: (node.hasClass('remove')) ? 'exclude' : "", - children: (kids) ? this.serialize(kids) : [] + id: node.id }; + if (node.hasClass('remove')) serial[i].hide = true; + if (node.hasClass('renamed')) serial[i].renamed = $E('span.title', node).innerHTML; + if (kids) serial[i].children = this.serialize(kids); }.bind(this)); return serial; }, diff --git a/pagemash-css.php b/pagemash-css.php new file mode 100644 index 0000000..e056de6 --- /dev/null +++ b/pagemash-css.php @@ -0,0 +1,91 @@ + +/* __ __ _ + WordPress Plugin | \/ | | | + _ __ __ _ __ _ ___| \ / | __ _ ___| |__ + | '_ \ / _` |/ _` |/ _ \ |\/| |/ _` / __| '_ \ + | |_) | (_| | (_| | __/ | | | (_| \__ \ | | | + | .__/ \__,_|\__, |\___|_| |_|\__,_|___/_| |_| + | | __/ | Author: Joel Starnes + |_| |___/ URL: pagemash.joelstarnes.co.uk + + >>CSS styling for pageMash Admin +*/ + + + +body.wp-admin div#wpwrap div#wpcontent ul#pageMash_pages { + margin:0 0 0 0; + list-style:none; +} +ul#pageMash_pages li.collapsed ul { display:none; } +ul#pageMash_pages li.children { + background-image: url('collapse.png'); +} +ul#pageMash_pages li.collapsed.children { + background-image: url('expand.png'); +} +ul#pageMash_pages li { + display:block; + margin:2px 0 0 0; + border-bottom:1px solid #aaa; border-right:1px solid #aaa; border-top:1px solid #ccc; border-left:1px solid #ccc; + padding:4px 6px 4px 24px; + background:#F1F1F1 url('page.png') no-repeat 4px 4px; + list-style-type:none; +} +ul#pageMash_pages li span.title { font-weight: bold; } +ul#pageMash_pages li.collapsed.children span.title { text-decoration: underline; } +ul#pageMash_pages li.collapsed.children li span.title { text-decoration: none; } +#update_status { + font-weight:bold; + display:block; + border:2px solid #AC604C; + background-color: #DDA37A; + padding: 2px 6px; +} +ul#pageMash_pages li.remove { + color:grey; + border-style:dashed; + border-color:#aaa; + opacity:.5; + filter:alpha(opacity=50); zoom:1; /* ie hack[has layout] for opacity */ +} +ul#pageMash_pages li.remove a { color:grey; } +ul#pageMash_pages li span.pageMash_box { + font-weight:normal; + font-size: 1em; + line-height: 110%; + border:1px solid #bbb; + background-color: #eee; + padding: 0px 3px; + margin: 0; + opacity:.5; + filter:alpha(opacity=50); zoom:1; /* ie hack[has layout] for opacity */ +} +ul#pageMash_pages li .pageMash_box:hover { + opacity:1; + filter:alpha(opacity=100); zoom:1; /* ie hack[has layout] for opacity */ +} +ul#pageMash_pages li .pageMash_box .pageMash_pageFunctions { display:none; } +ul#pageMash_pages li .pageMash_box:hover .more { display:none; } +ul#pageMash_pages li .pageMash_box:hover .pageMash_pageFunctions { display:inline; } +ul#pageMash_pages li .pageMash_box a { border:0; } +ul#pageMash_pages li.renaming>.pageMash_box { display:none; } +ul#pageMash_pages li.renaming>span.title { + border:1px solid #aaa; + background-color: #ccc; +} +ul#pageMash_pages li.renaming li span.title input { + font-weight:bold; +} + +#pageMash_code {display:block; border:solid 3px #858EF4; background-color:#211E1E; padding:7px; margin:0px;} +#pageMash_code .white{color:#DADADA;} +#pageMash_code .purple{color:#9B2E4D; font-weight:bold;} +#pageMash_code .green{color:#00FF00;} +#pageMash_code .blue{color:#858EF4;} +#pageMash_code .yellow{color:#C1C144;} +#pageMash_code .orange{color:#EC9E00;} \ No newline at end of file diff --git a/pagemash-js.php b/pagemash-js.php new file mode 100644 index 0000000..c6c2de4 --- /dev/null +++ b/pagemash-js.php @@ -0,0 +1,194 @@ + +/* __ __ _ + WordPress Plugin | \/ | | | + _ __ __ _ __ _ ___| \ / | __ _ ___| |__ + | '_ \ / _` |/ _` |/ _ \ |\/| |/ _` / __| '_ \ + | |_) | (_| | (_| | __/ | | | (_| \__ \ | | | + | .__/ \__,_|\__, |\___|_| |_|\__,_|___/_| |_| + | | __/ | Author: Joel Starnes + |_| |___/ URL: pagemash.joelstarnes.co.uk + + >>Main javascript include +*/ + +window.addEvent('domready', function(){ + // When logging debug messages with console.warn + // if user doesn't have Firebug, write them to the DOM instead + if (typeof console == "undefined") { + // Create an unordered list to display warning messages + var logsOutput = document.createElement('ul'); + $("debug_list").appendChild(logsOutput); + + // Define console.warn() function + console = { + warn: function(msg) { + logsOutput.innerHTML += '
  • ' + msg + '
  • '; + } + }; + // Create an empty function for all other console methods + var consoleMethods = ["log", "debug", "info", "error", "assert", "dir", "dirxml", "group", + "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; + for (var i = 0; i < consoleMethods.length; ++i) + console[consoleMethods[i]] = function() {} + } +}); + +/* add timeout to Ajax class */ +Ajax = Ajax.extend({ + request: function(){ + if (this.options.timeout) { + this.timeoutTimer=window.setTimeout(this.callTimeout.bindAsEventListener(this), this.options.timeout); + this.addEvent('onComplete', this.removeTimer); + } + this.parent(); + }, + callTimeout: function () { + this.transport.abort(); + this.onFailure(); + if (this.options.onTimeout) { + this.options.onTimeout(); + + } + }, + removeTimer: function() { + window.clearTimeout(this.timeoutTimer); + } +}); +/* function to retrieve list data and send to server in JSON format */ +var SaveList = function() { + var theDump = sortIt.serialize(); + console.group('Database Update'); + console.time('Update Chronometer'); + new Ajax('saveList.php', { + method: 'post', + postBody: 'm='+Json.toString(theDump), + // update: "debug_list", + onComplete: function() { + $('update_status').setText('Database Updated'); + new Fx.Style($('update_status'), 'opacity', {duration: 500}).start(0,1).chain(function() { + new Fx.Style($('update_status'), 'opacity', {duration: 1500}).start(1,0); + }); + console.log('Database Successfully Updated'); + console.timeEnd('Update Chronometer'); + console.groupEnd(); + }, + timeout: 8500, + onTimeout: function() { + $('update_status').setText('Error: Update Timeout'); + new Fx.Style($('update_status'), 'opacity', {duration: 200}).start(0,1); + console.timeEnd('Update Chronometer'); + console.error('Error: update confirmation not recieved'); + console.groupEnd(); + } + }).request(); +}; +/* toggle the remove class of grandparent */ + + var toggleRemove = function(el) { + el.parentNode.parentNode.parentNode.toggleClass('remove'); + console.log("Page: '%s' has been %s", $E('span.title', el.parentNode.parentNode.parentNode).innerHTML, (el.parentNode.parentNode.hasClass('remove') ? 'HIDDEN': 'MADE VISIBLE' )); + } + + + +/* ******** dom ready ******** */ +window.addEvent('domready', function(){ + sortIt = new Nested('pageMash_pages', { + collapse: true, + onComplete: function(el) { + el.setStyle('background-color', '#F1F1F1'); + sortIt.altColor(); + SaveList(); + + $ES('li','pageMash_pages').each(function(el) { + if( el.getElement('ul') ){ + el.addClass('children'); + } else { + el.removeClass('children'); + } + }); + } + }); + Nested.implement({ + /* alternate the colours of top level nodes */ + altColor: function(){ + var odd = 1; + this.list.getChildren().each(function(element, i){ + if(odd==1){ + odd=0; + element.setStyle('background-color', '#CFE8A8'); + }else{ + odd=1; + element.setStyle('background-color', '#D8E8E6'); + } + }); + } + }); + sortIt.altColor(); + $('update_status').setStyle('opacity', 0); + + + $('pageMash_submit').addEvent('click', function(e){ + e = new Event(e); + SaveList(); + e.stop(); + }); + + + var pageMashInfo = new Fx.Slide('pageMashInfo'); + $('pageMashInfo_toggle').addEvent('click', function(e){ + e = new Event(e); + pageMashInfo.toggle(); + e.stop(); + switch($('pageMashInfo_toggle').getText()) { + case "Show Further Info": + $('pageMashInfo_toggle').setText('Hide Further Info'); + break + case "Hide Further Info": + $('pageMashInfo_toggle').setText('Show Further Info'); + break + } + }); + pageMashInfo.hide(); + $('pageMashInfo_toggle').setText('Show Further Info'); + + + /* loop through each page */ + $ES('li','pageMash_pages').each(function(el) { + /* If the li has a 'ul' child; it has children pages */ + if( el.getElement('ul') ) el.addClass('children'); + + /* on page dblClick add this event */ + el.addEvent('dblclick', function(e){ + e = new Event(e); + if(el.hasClass('children')) el.toggleClass('collapsed'); + e.stop(); + }); + }); + + /* disable drag text-selection for IE */ + if (typeof document.body.onselectstart!="undefined") + document.body.onselectstart=function(){return false} + +/* InlineEdit: rename pages */ +$$('#pageMash_pages li span.title').each(function(el){ //#pageMash_pages li span.title + el.setStyle('cursor','pointer'); + $E('a.rename', el.parentNode).addEvent('click',function(){ + el.inlineEdit({ + onStart:function(el){ + el.parentNode.addClass('renaming'); + }, + onComplete:function(el,oldContent,newContent){ + el.parentNode.removeClass('renaming').addClass('renamed'); + console.log("Page: '%s' has been RENAMED to: '%s'", oldContent, newContent); + } + }); + }); +}); + +console.info("We're all up and running.") +}); /* close dom ready */ \ No newline at end of file diff --git a/pagemash.php b/pagemash.php index a682aa0..8c6c3e1 100644 --- a/pagemash.php +++ b/pagemash.php @@ -4,7 +4,7 @@ Plugin Name: pageMash Plugin URI: http://joelstarnes.co.uk/pagemash/ Description: pageMash > pageManagement [WP_Admin > Manage > pageMash] Author: Joel Starnes -Version: 1.0.4 +Version: 1.1.0 Author URI: http://joelstarnes.co.uk/ CHANGELOG: @@ -12,15 +12,16 @@ Release: Date: Description: 0.1.0 10 Feb 2008 Initial release 0.1.1 12 Feb 2008 Minor fixes > Removed external include 0.1.2 15 Feb 2008 Minor fixes > Fixed CSS&JS headers to only display on pagemash -1.0.0 beta 19 Feb 2008 Major update > Recusive page handles unlimited nested children, - collapsable list items, interface makeover... +1.0.0 beta 19 Feb 2008 Major update > Recusive page handles unlimited nested children, collapsable list items, interface makeover... 1.0.1 beta 14 Mar 2008 Fixed IE > drag selects text 1.0.2 16 Mar 2008 Major code rewrite for exclude pages, funct hooks onto wp_list_pages 1.0.3 18 Mar 2008 Fixed datatype bug causing array problems 1.0.4 11 Apr 2008 removed shorthand PHP and updated CSS and JS headers to admin_print_scripts hook. +1.1.0 24 Apr 2008 Added quick rename, externalised scripts, changed display of edit|hide|rename links, deregisters prototype FIXME: @fixme with instantUpdateFeature hide will not send the update + @todo readme txt CMS, mass edit pages, exclude pages, manage, organise, */ #########CONFIG OPTIONS############################################ @@ -63,6 +64,9 @@ Garrett Murphey - Page Link Manager [http://gmurphey.com/2006/10/05/wordpress-pl Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +//Global Vars +$pageMash_rel_dir = 'wp-content/plugins/pagemash/'; +$pageMash_abs_dir = get_bloginfo('wpurl').'/'.$pageMash_rel_dir; function pageMash_getPages($post_parent){ //this is a recurrsive function which calls itself to produce a nested list of elements @@ -75,19 +79,20 @@ function pageMash_getPages($post_parent){ } if ($pageposts == true){ //if $pageposts == true then it does have sub-page(s), so list them. - echo '