From f1b8716b93f9cb7a1a863744a08f559825a918a8 Mon Sep 17 00:00:00 2001 From: Andrew Ozz Date: Sun, 31 May 2009 11:34:08 +0000 Subject: [PATCH] Reload the widget form with the ajax response after save, add Close link to the widgets, don't auto-close on save to show possible errors returned from validation git-svn-id: https://develop.svn.wordpress.org/trunk@11498 602fd350-edb4-49c9-b593-d223f7449a82 --- wp-admin/admin-ajax.php | 20 ++++++++++++-- wp-admin/css/widgets.css | 14 +++++++++- wp-admin/includes/widgets.php | 13 ++++++--- wp-admin/js/widgets.dev.js | 51 +++++++++++++++++++++++------------ wp-admin/js/widgets.js | 2 +- wp-includes/script-loader.php | 4 +-- wp-includes/widgets.php | 2 +- 7 files changed, 79 insertions(+), 27 deletions(-) diff --git a/wp-admin/admin-ajax.php b/wp-admin/admin-ajax.php index d671583350..7cbb85dc01 100644 --- a/wp-admin/admin-ajax.php +++ b/wp-admin/admin-ajax.php @@ -1289,6 +1289,9 @@ case 'save-widget' : $id_base = $_POST['id_base']; $widget_id = $_POST['widget-id']; $sidebar_id = $_POST['sidebar']; + $multi_number = !empty($_POST['multi_number']) ? (int) $_POST['multi_number'] : 0; + $settings = isset($_POST['widget-' . $id_base]) && is_array($_POST['widget-' . $id_base]) ? $_POST['widget-' . $id_base] : false; + $error = '

' . __('An error has occured. Please reload the page and try again.') . '

'; $sidebars = wp_get_sidebars_widgets(); $sidebar = isset($sidebars[$sidebar_id]) ? $sidebars[$sidebar_id] : array(); @@ -1297,10 +1300,17 @@ case 'save-widget' : if ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) { if ( !isset($wp_registered_widgets[$widget_id]) ) - die('-1'); + die($error); $sidebar = array_diff( $sidebar, array($widget_id) ); $_POST = array('sidebar' => $sidebar_id, 'widget-' . $id_base => array(), 'the-widget-id' => $widget_id, 'delete_widget' => '1'); + } elseif ( $settings && preg_match( '/__i__|%i%/', key($settings) ) ) { + if ( !$multi_number ) + die($error); + + $_POST['widget-' . $id_base] = array( $multi_number => array_shift($settings) ); + $widget_id = $id_base . '-' . $multi_number; + $sidebar[] = $widget_id; } $_POST['widget-id'] = $sidebar; @@ -1324,7 +1334,13 @@ case 'save-widget' : die(); } - die('1'); + if ( !empty($_POST['add_new']) ) + die(); + + if ( $form = $wp_registered_widget_controls[$widget_id] ) + call_user_func_array( $form['callback'], $form['params'] ); + + die(); break; default : do_action( 'wp_ajax_' . $_POST['action'] ); diff --git a/wp-admin/css/widgets.css b/wp-admin/css/widgets.css index 116c52dded..4275f95b1c 100644 --- a/wp-admin/css/widgets.css +++ b/wp-admin/css/widgets.css @@ -188,7 +188,7 @@ a.widget-action { .widget .widget-inside, .widget .widget-description { - padding: 15px; + padding: 12px 12px 10px; font-size: 11px; line-height: 16px; } @@ -226,6 +226,18 @@ a.widget-action { text-decoration: none; } +.widget-control-actions a:hover { + text-decoration: underline; +} + +.widget-control-actions .ajax-feedback { + padding-bottom: 3px; +} + +.widget-control-actions div.alignleft { + margin-top: 6px; +} + div#sidebar-info { padding: 0 1em; margin-bottom: 1em; diff --git a/wp-admin/includes/widgets.php b/wp-admin/includes/widgets.php index 84ca9e1480..45b97d81a0 100644 --- a/wp-admin/includes/widgets.php +++ b/wp-admin/includes/widgets.php @@ -168,12 +168,13 @@ function wp_widget_control( $sidebar_args ) {
+
" . __('There are no options for this widget.') . "

\n"; ?> - +
@@ -183,9 +184,15 @@ function wp_widget_control( $sidebar_args ) {
- +
+ | + +
- +
+ + +

diff --git a/wp-admin/js/widgets.dev.js b/wp-admin/js/widgets.dev.js index 76db49864e..8561b45d62 100644 --- a/wp-admin/js/widgets.dev.js +++ b/wp-admin/js/widgets.dev.js @@ -92,7 +92,7 @@ wpWidgets = { ui.item.draggable('destroy'); if ( ui.item.hasClass('deleting') ) { - wpWidgets.save( ui.item, 1, 0, 0, 1 ); // delete widget + wpWidgets.save( ui.item, 1, 0, 1 ); // delete widget ui.item.remove(); return; } @@ -112,7 +112,7 @@ wpWidgets = { rem = 'div#' + id; } wpWidgets.addEvents(ui.item); - wpWidgets.save( ui.item, 0, 0, 0, 1 ); + wpWidgets.save( ui.item, 0, 0, 1 ); ui.item.find('input.add_new').val(''); ui.item.find('a.widget-action').click(); return; @@ -125,12 +125,7 @@ wpWidgets = { } }).not(':visible').sortable('disable'); wpWidgets.resize(); - - $('.widget-inside label').each(function(){ - var f = $(this).attr('for'); - if ( f && f == $('input', this).attr('id') ) - $(this).removeAttr('for'); - }); + wpWidgets.fixLabels(); }, saveOrder : function(sb) { @@ -153,10 +148,10 @@ wpWidgets = { this.resize(); }, - save : function(widget, del, close, animate, order) { + save : function(widget, del, animate, order) { var sb = widget.parents('.widgets-sortables').attr('id'), data = widget.find('form').serialize(), a; widget = $(widget); - $('#' + sb).parents('.widgets-holder-wrap').find('.ajax-feedback').css('visibility', 'visible'); + widget.find('.ajax-feedback').css('visibility', 'visible'); a = { action: 'save-widget', @@ -191,12 +186,13 @@ wpWidgets = { widget.remove(); wpWidgets.resize(); } - } else if ( close ) { - widget.find('.widget-inside').slideUp('fast', function(){ - widget.css({'width':'','marginLeft':''}); + } else { + $('.ajax-feedback').css('visibility', 'hidden'); + if ( r && r.length > 2 ) { + $('.widget-content', widget).html(r); wpWidgets.appendTitle(widget); - $('.ajax-feedback').css('visibility', 'hidden'); - }); + wpWidgets.fixLabels(widget); + } } if ( order ) wpWidgets.saveOrder(); @@ -230,6 +226,23 @@ wpWidgets = { KhtmlUserSelect: n }); }, + + fixLabels : function(sc) { + sc = sc || document; + + $('.widget-inside label', sc).each(function(){ + var f = $(this).attr('for'); + + if ( f && f == $('input', this).attr('id') ) + $(this).removeAttr('for'); + }); + }, + + close : function(widget) { + widget.find('.widget-inside').slideUp('fast', function(){ + widget.css({'width':'','marginLeft':''}); + }); + }, addEvents : function(sc) { sc = sc || document; @@ -249,11 +262,15 @@ wpWidgets = { return false; }); $('.widget-control-save', sc).click(function(){ - wpWidgets.save( $(this).parents('.widget'), 0, 1, 1, 0 ); + wpWidgets.save( $(this).parents('.widget'), 0, 1, 0 ); return false; }); $('.widget-control-remove', sc).click(function(){ - wpWidgets.save( $(this).parents('.widget'), 1, 1, 1, 0 ); + wpWidgets.save( $(this).parents('.widget'), 1, 1, 0 ); + return false; + }); + $('.widget-control-close', sc).click(function(){ + wpWidgets.close( $(this).parents('.widget') ); return false; }); } diff --git a/wp-admin/js/widgets.js b/wp-admin/js/widgets.js index 3e032d483c..6bd0c185c4 100644 --- a/wp-admin/js/widgets.js +++ b/wp-admin/js/widgets.js @@ -1 +1 @@ -var wpWidgets;(function(a){wpWidgets={init:function(){var b;a("#widgets-right div.sidebar-name").click(function(){var d=a(this).siblings(".widgets-sortables");if(d.is(":visible")){d.sortable("disable");a(this).parent().addClass("closed")}else{a(this).parent().removeClass("closed");d.sortable("enable").sortable("refresh")}});a("#widgets-left div.sidebar-name").click(function(){if(a(this).siblings(".widget-holder").is(":visible")){a(this).parent().addClass("closed")}else{a(this).parent().removeClass("closed")}});a("#widgets-right .widget, #wp_inactive_widgets .widget").each(function(){wpWidgets.appendTitle(this)});this.addEvents();a(".widget-error").parents(".widget").find("a.widget-action").click();a("#available-widgets").droppable({tolerance:"pointer",accept:function(c){return a(c).parent().attr("id")!="widget-list"},drop:function(d,c){c.draggable.addClass("deleting");a("#removing-widget").hide().children("span").html("")},over:function(d,c){c.draggable.addClass("deleting");a(".widget-placeholder").hide();if(c.draggable.hasClass("ui-sortable-helper")){a("#removing-widget").show().children("span").html(c.draggable.find(".widget-title h4").html())}},out:function(d,c){c.draggable.removeClass("deleting");a(".widget-placeholder").show();a("#removing-widget").hide().children("span").html("")}});a("#widget-list .widget").draggable({connectToSortable:".widgets-sortables",handle:".widget-title",distance:2,helper:"clone",zIndex:5,containment:"document",start:function(d,c){wpWidgets.fixWebkit(1);c.helper.find(".widget-description").hide()},stop:function(d,c){if(b){a(b).hide()}b="";wpWidgets.fixWebkit()}});a(".widgets-sortables").sortable({placeholder:"widget-placeholder",connectWith:".widgets-sortables",items:".widget",handle:".widget-title",cursor:"move",distance:2,containment:"document",start:function(d,c){wpWidgets.fixWebkit(1);c.item.find(".widget-inside").hide();c.item.css({marginLeft:"",width:""})},stop:function(f,c){if(c.item.hasClass("ui-draggable")){c.item.draggable("destroy")}if(c.item.hasClass("deleting")){wpWidgets.save(c.item,1,0,0,1);c.item.remove();return}var d=c.item.find("input.add_new").val(),i=c.item.find("input.multi_number").val(),h=c.item.attr("id"),g=a(this).attr("id");c.item.css({marginLeft:"",width:""});wpWidgets.fixWebkit();if(d){if("multi"==d){c.item.html(c.item.html().replace(/<[^<>]+>/g,function(e){return e.replace(/__i__|%i%/g,i)}));c.item.attr("id",h.replace(/__i__|%i%/g,i));i++;a("div#"+h).find("input.multi_number").val(i)}else{if("single"==d){c.item.attr("id","new-"+h);b="div#"+h}}wpWidgets.addEvents(c.item);wpWidgets.save(c.item,0,0,0,1);c.item.find("input.add_new").val("");c.item.find("a.widget-action").click();return}wpWidgets.saveOrder(g)},receive:function(d,c){if(!a(this).is(":visible")){a(this).sortable("cancel")}}}).not(":visible").sortable("disable");wpWidgets.resize();a(".widget-inside label").each(function(){var c=a(this).attr("for");if(c&&c==a("input",this).attr("id")){a(this).removeAttr("for")}})},saveOrder:function(c){if(c){a("#"+c).parents(".widgets-holder-wrap").find(".ajax-feedback").css("visibility","visible")}var b={action:"widgets-order",savewidgets:a("#_wpnonce_widgets").val(),sidebars:[]};a(".widgets-sortables").each(function(){b["sidebars["+a(this).attr("id")+"]"]=a(this).sortable("toArray").join(",")});a.post(ajaxurl,b,function(){a(".ajax-feedback").css("visibility","hidden")});this.resize()},save:function(g,d,h,e,b){var i=g.parents(".widgets-sortables").attr("id"),f=g.find("form").serialize(),c;g=a(g);a("#"+i).parents(".widgets-holder-wrap").find(".ajax-feedback").css("visibility","visible");c={action:"save-widget",savewidgets:a("#_wpnonce_widgets").val(),sidebar:i};if(d){c.delete_widget=1}f+="&"+a.param(c);a.post(ajaxurl,f,function(j){var k;if(d){if(!a(".widget_number",g).val()){k=a(".widget-id",g).val();a("#available-widgets .widget-id").each(function(){if(a(this).val()==k){a(this).parents(".widget").show()}})}if(e){b=0;g.slideUp("fast",function(){a(this).remove();wpWidgets.saveOrder()})}else{g.remove();wpWidgets.resize()}}else{if(h){g.find(".widget-inside").slideUp("fast",function(){g.css({width:"",marginLeft:""});wpWidgets.appendTitle(g);a(".ajax-feedback").css("visibility","hidden")})}}if(b){wpWidgets.saveOrder()}})},appendTitle:function(b){a('input[type="text"]',b).each(function(){var c;if(this.id.indexOf("title")!=-1){c=a(this).val().replace(/<[^<>]+>/g,"").replace(//g,">");if(c){a(".widget-title .in-widget-title",b).html(": "+c)}return false}})},resize:function(){a(".widgets-sortables").not("#wp_inactive_widgets").each(function(){var c=50,b=a(".widget",this).length;c=c+parseInt(b*48,10);a(this).css("minHeight",c+"px")})},fixWebkit:function(b){b=b?"none":"";a("body").css({WebkitUserSelect:b,KhtmlUserSelect:b})},addEvents:function(b){b=b||document;a("a.widget-action",b).click(function(){var d=parseInt(a(this).parents(".widget").find(".widget-width").val(),10),e={},c=a(this).parents(".widget-top").siblings(".widget-inside");if(c.is(":hidden")){if(d>250&&c.parents(".widgets-sortables").length){e.width=d+30+"px";if(c.parents(".widget-liquid-right").length){e.marginLeft=235-d+"px"}c.parents(".widget").css(e)}c.slideDown("fast")}else{c.slideUp("fast",function(){c.parents(".widget").css({width:"",marginLeft:""})})}return false});a(".widget-control-save",b).click(function(){wpWidgets.save(a(this).parents(".widget"),0,1,1,0);return false});a(".widget-control-remove",b).click(function(){wpWidgets.save(a(this).parents(".widget"),1,1,1,0);return false})}};a(document).ready(function(){wpWidgets.init()})})(jQuery); \ No newline at end of file +var wpWidgets;(function(a){wpWidgets={init:function(){var b;a("#widgets-right div.sidebar-name").click(function(){var d=a(this).siblings(".widgets-sortables");if(d.is(":visible")){d.sortable("disable");a(this).parent().addClass("closed")}else{a(this).parent().removeClass("closed");d.sortable("enable").sortable("refresh")}});a("#widgets-left div.sidebar-name").click(function(){if(a(this).siblings(".widget-holder").is(":visible")){a(this).parent().addClass("closed")}else{a(this).parent().removeClass("closed")}});a("#widgets-right .widget, #wp_inactive_widgets .widget").each(function(){wpWidgets.appendTitle(this)});this.addEvents();a(".widget-error").parents(".widget").find("a.widget-action").click();a("#available-widgets").droppable({tolerance:"pointer",accept:function(c){return a(c).parent().attr("id")!="widget-list"},drop:function(d,c){c.draggable.addClass("deleting");a("#removing-widget").hide().children("span").html("")},over:function(d,c){c.draggable.addClass("deleting");a(".widget-placeholder").hide();if(c.draggable.hasClass("ui-sortable-helper")){a("#removing-widget").show().children("span").html(c.draggable.find(".widget-title h4").html())}},out:function(d,c){c.draggable.removeClass("deleting");a(".widget-placeholder").show();a("#removing-widget").hide().children("span").html("")}});a("#widget-list .widget").draggable({connectToSortable:".widgets-sortables",handle:".widget-title",distance:2,helper:"clone",zIndex:5,containment:"document",start:function(d,c){wpWidgets.fixWebkit(1);c.helper.find(".widget-description").hide()},stop:function(d,c){if(b){a(b).hide()}b="";wpWidgets.fixWebkit()}});a(".widgets-sortables").sortable({placeholder:"widget-placeholder",connectWith:".widgets-sortables",items:".widget",handle:".widget-title",cursor:"move",distance:2,containment:"document",start:function(d,c){wpWidgets.fixWebkit(1);c.item.find(".widget-inside").hide();c.item.css({marginLeft:"",width:""})},stop:function(f,c){if(c.item.hasClass("ui-draggable")){c.item.draggable("destroy")}if(c.item.hasClass("deleting")){wpWidgets.save(c.item,1,0,1);c.item.remove();return}var d=c.item.find("input.add_new").val(),i=c.item.find("input.multi_number").val(),h=c.item.attr("id"),g=a(this).attr("id");c.item.css({marginLeft:"",width:""});wpWidgets.fixWebkit();if(d){if("multi"==d){c.item.html(c.item.html().replace(/<[^<>]+>/g,function(e){return e.replace(/__i__|%i%/g,i)}));c.item.attr("id",h.replace(/__i__|%i%/g,i));i++;a("div#"+h).find("input.multi_number").val(i)}else{if("single"==d){c.item.attr("id","new-"+h);b="div#"+h}}wpWidgets.addEvents(c.item);wpWidgets.save(c.item,0,0,1);c.item.find("input.add_new").val("");c.item.find("a.widget-action").click();return}wpWidgets.saveOrder(g)},receive:function(d,c){if(!a(this).is(":visible")){a(this).sortable("cancel")}}}).not(":visible").sortable("disable");wpWidgets.resize();wpWidgets.fixLabels()},saveOrder:function(c){if(c){a("#"+c).parents(".widgets-holder-wrap").find(".ajax-feedback").css("visibility","visible")}var b={action:"widgets-order",savewidgets:a("#_wpnonce_widgets").val(),sidebars:[]};a(".widgets-sortables").each(function(){b["sidebars["+a(this).attr("id")+"]"]=a(this).sortable("toArray").join(",")});a.post(ajaxurl,b,function(){a(".ajax-feedback").css("visibility","hidden")});this.resize()},save:function(g,d,e,b){var h=g.parents(".widgets-sortables").attr("id"),f=g.find("form").serialize(),c;g=a(g);g.find(".ajax-feedback").css("visibility","visible");c={action:"save-widget",savewidgets:a("#_wpnonce_widgets").val(),sidebar:h};if(d){c.delete_widget=1}f+="&"+a.param(c);a.post(ajaxurl,f,function(i){var j;if(d){if(!a(".widget_number",g).val()){j=a(".widget-id",g).val();a("#available-widgets .widget-id").each(function(){if(a(this).val()==j){a(this).parents(".widget").show()}})}if(e){b=0;g.slideUp("fast",function(){a(this).remove();wpWidgets.saveOrder()})}else{g.remove();wpWidgets.resize()}}else{a(".ajax-feedback").css("visibility","hidden");if(i&&i.length>2){a(".widget-content",g).html(i);wpWidgets.appendTitle(g);wpWidgets.fixLabels(g)}}if(b){wpWidgets.saveOrder()}})},appendTitle:function(b){a('input[type="text"]',b).each(function(){var c;if(this.id.indexOf("title")!=-1){c=a(this).val().replace(/<[^<>]+>/g,"").replace(//g,">");if(c){a(".widget-title .in-widget-title",b).html(": "+c)}return false}})},resize:function(){a(".widgets-sortables").not("#wp_inactive_widgets").each(function(){var c=50,b=a(".widget",this).length;c=c+parseInt(b*48,10);a(this).css("minHeight",c+"px")})},fixWebkit:function(b){b=b?"none":"";a("body").css({WebkitUserSelect:b,KhtmlUserSelect:b})},fixLabels:function(b){b=b||document;a(".widget-inside label",b).each(function(){var c=a(this).attr("for");if(c&&c==a("input",this).attr("id")){a(this).removeAttr("for")}})},close:function(b){b.find(".widget-inside").slideUp("fast",function(){b.css({width:"",marginLeft:""})})},addEvents:function(b){b=b||document;a("a.widget-action",b).click(function(){var d=parseInt(a(this).parents(".widget").find(".widget-width").val(),10),e={},c=a(this).parents(".widget-top").siblings(".widget-inside");if(c.is(":hidden")){if(d>250&&c.parents(".widgets-sortables").length){e.width=d+30+"px";if(c.parents(".widget-liquid-right").length){e.marginLeft=235-d+"px"}c.parents(".widget").css(e)}c.slideDown("fast")}else{c.slideUp("fast",function(){c.parents(".widget").css({width:"",marginLeft:""})})}return false});a(".widget-control-save",b).click(function(){wpWidgets.save(a(this).parents(".widget"),0,1,0);return false});a(".widget-control-remove",b).click(function(){wpWidgets.save(a(this).parents(".widget"),1,1,0);return false});a(".widget-control-close",b).click(function(){wpWidgets.close(a(this).parents(".widget"));return false})}};a(document).ready(function(){wpWidgets.init()})})(jQuery); \ No newline at end of file diff --git a/wp-includes/script-loader.php b/wp-includes/script-loader.php index d83ef8e923..192ab3e609 100644 --- a/wp-includes/script-loader.php +++ b/wp-includes/script-loader.php @@ -332,7 +332,7 @@ function wp_default_scripts( &$scripts ) { $scripts->add( 'media-upload', "/wp-admin/js/media-upload$suffix.js", array( 'thickbox' ), '20090114' ); $scripts->add_data( 'media-upload', 'group', 1 ); - $scripts->add( 'admin-widgets', "/wp-admin/js/widgets$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable' ), '20090524' ); + $scripts->add( 'admin-widgets', "/wp-admin/js/widgets$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable' ), '20090530' ); $scripts->add_data( 'admin-widgets', 'group', 1 ); $scripts->add( 'word-count', "/wp-admin/js/word-count$suffix.js", array( 'jquery' ), '20090422' ); @@ -438,7 +438,7 @@ function wp_default_styles( &$styles ) { $styles->add( 'global', '/wp-admin/css/global.css', array(), '20090514' ); $styles->add( 'media', '/wp-admin/css/media.css', array(), '20090516' ); - $styles->add( 'widgets', '/wp-admin/css/widgets.css', array(), '20090514' ); + $styles->add( 'widgets', '/wp-admin/css/widgets.css', array(), '20090530' ); $styles->add( 'dashboard', '/wp-admin/css/dashboard.css', array(), '20090514' ); $styles->add( 'install', '/wp-admin/css/install.css', array(), '20090514' ); $styles->add( 'theme-editor', '/wp-admin/css/theme-editor.css', array(), '20090514' ); diff --git a/wp-includes/widgets.php b/wp-includes/widgets.php index f23f39e151..c8b345f271 100644 --- a/wp-includes/widgets.php +++ b/wp-includes/widgets.php @@ -297,7 +297,7 @@ class WP_Widget { $settings = wp_convert_widget_settings($this->id_base, $this->option_name, $settings); } - unset($settings['_multiwidget']); + unset($settings['_multiwidget'], $settings['__i__']); return $settings; } }