From 103e30ed7ea0000cefd300a8558e96a7716d633e Mon Sep 17 00:00:00 2001
From: Andrew Nacin
Date: Sun, 2 May 2010 19:09:10 +0000
Subject: [PATCH] Alot of drag/drop/sortable improvements to nav menu admin UI.
props koopersmith, fixes #12675.
git-svn-id: https://develop.svn.wordpress.org/trunk@14337 602fd350-edb4-49c9-b593-d223f7449a82
---
wp-admin/css/nav-menu.css | 2 +-
wp-admin/css/nav-menu.dev.css | 71 +++--
wp-admin/includes/nav-menu.php | 40 ++-
wp-admin/js/nav-menu.dev.js | 496 ++++++++++++++-------------------
wp-admin/js/nav-menu.js | 2 +-
wp-admin/nav-menus.php | 2 +-
wp-includes/script-loader.php | 4 +-
7 files changed, 295 insertions(+), 322 deletions(-)
diff --git a/wp-admin/css/nav-menu.css b/wp-admin/css/nav-menu.css
index 2650166600..800f1f2e89 100644
--- a/wp-admin/css/nav-menu.css
+++ b/wp-admin/css/nav-menu.css
@@ -1 +1 @@
-#nav-menus-frame{margin-left:300px;}#menu-settings-column{display:block;width:281px;margin-left:-300px;clear:both;float:left;}#menu-settings-column .inside{padding:0 10px;}#menu-settings-column .handlediv{background:url("../images/menu-bits.gif") no-repeat scroll 0 -110px;}#wpbody{position:relative;}#menu-management-liquid{float:left;min-width:100%;}#menu-management{position:relative;margin-right:20px;margin-top:-3px;width:100%;}#menu-management .menu-edit{margin-bottom:20px;}#nav-menu-header,#post-body{border-color:#ccc;border-style:solid;}#nav-menu-header{background:url("../images/gray-grad.png") repeat-x scroll left top #dfdfdf;border-width:1px 1px 0 1px;-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;-khtml-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;-khtml-border-top-right-radius:6px;border-top-right-radius:6px;}#post-body{background:#fff;padding:0 0 10px 10px;border-width:0 1px 1px 1px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;-khtml-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;-khtml-border-bottom-right-radius:6px;border-bottom-right-radius:6px;}.post-body-plain{padding:10px 10px 0 0;}#menu-management .menu-add-new abbr{font-weight:bold;}#menu-management .nav-tabs{padding-left:30px;}#menu-management .nav-tab{background:#f4f4f4;font-weight:bold;border-color:#dfdfdf;}#menu-management .nav-tab-active{background:#ececec;border-color:#ccc;border-bottom-color:#ececec;}#menu-management #major-publishing-actions #delete-action{float:right;margin-right:10px;}#menu-name-label{margin-top:-2px;}#wpbody .open-label{display:inline-block;}#wpbody .open-label span{padding-right:10px;}.js .label-with-default-title{color:#aaa;font-style:italic;}#menu-management .inside{padding:0 10px;}.postbox .howto input{width:180px;float:right;}.customlinkdiv .howto input{width:210px;}#menu-container .submit{margin:0 0 10px;padding:0;}.submitdelete,.submitclose{font-size:11px;}#cancel-save{color:#f00;text-decoration:underline;font-size:11px;margin-left:20px;margin-top:5px;}#cancel-save:hover{background-color:#F00;color:#fff;}.list-controls{float:left;}.add-to-menu{float:right;}.postbox img.waiting{display:none;vertical-align:middle;}form.processing .postbox img.waiting{display:inline;}.button-controls{margin:10px 0;}.show-all,.hide-all{cursor:pointer;}.hide-all{display:none;}#create-menu-name{width:159px;}#manage-menu .inside{padding:0;}#available-links dt{display:block;}#add-custom-link .howto{font-size:11px;}#add-custom-link label span{display:block;float:left;margin-top:5px;padding-right:5px;}.menu-item-textbox{width:180px;}.howto span{margin-top:4px;display:block;float:left;}.quick-search{width:190px;}.list-wrap{display:none;clear:both;margin-bottom:10px;}.list-container{max-height:200px;overflow-y:auto;padding:10px 10px 5px;border:1px solid #DFDFDF;-moz-border-radius:4px;}.postbox p.submit{margin-bottom:0;}.list li{display:none;margin:0;margin-bottom:5px;}.list li .menu-item-title{cursor:pointer;display:block;}.list li .menu-item-title input{margin-right:3px;margin-top:-3px;}.list li li .menu-item-title{margin-left:14px;}.list li li li .menu-item-title{margin-left:28px;}.list li li li li .menu-item-title{margin-left:42px;}.list li li li li li .menu-item-title{margin-left:56px;}.list li li li li li li .menu-item-title{margin-left:70px;}.list li li li li li li li .menu-item-title{margin-left:84px;}.list li li li li li li li li .menu-item-title{margin-left:98px;}.list li li li li li li li li li .menu-item-title{margin-left:112px;}#menu-container .inside{padding-bottom:10px;}.menu{padding-top:1em;}.menu ul{width:100%;}.menu li{margin:0;}.menu li dl{clear:both;line-height:1.5em;position:relative;}.menu li dl dt{background:url("../images/gray-grad.png") repeat-x scroll left top #DFDFDF;border:1px solid #E6E6E6;clear:both;position:relative;padding-left:10px;height:auto;width:400px;line-height:35px;text-shadow:0 1px 0 #FFF;font-weight:bold;overflow:hidden;}.menu li.deleting dl dt{background-color:#f66;background-image:none;text-shadow:0 0 0 #ccc;}.menu li dl.menu-item-edit-inactive dt{border-radius:6px;-webkit-border-radius:6px;-moz-border-radius:6px;-khtml-border-radius:6px;}.menu li dl.menu-item-edit-active dt{-moz-border-radius:6px 6px 0 0;-webkit-border-top-right-radius:6px;-webkit-border-top-left-radius:6px;-khtml-border-top-right-radius:6px;-khtml-border-top-left-radius:6px;border-top-right-radius:6px;border-top-left-radius:6px;}.js .menu li dl dt{cursor:move;}.no-js .menu li dl{margin-top:13px;}.menu li .item-title{padding:7px 0;line-height:20px;display:block;margin-right:13em;}.menu li .sortable-placeholder{width:430px;}.menu li div.sortable-placeholder{background:#f5f5f5;border:1px dashed #bbb;margin:10px 0;padding-top:40px;}.menu li dl.sortable-placeholder{background:#f5f5f5;padding-bottom:40px;}.menu li li{margin-left:20px;}.dropzone{height:7px;margin:3px 0 3px 0;}.item-type{text-transform:uppercase;font-size:11px;color:#999;padding-right:10px;}.item-controls{font-size:11px;position:absolute;right:20px;top:-1px;}.item-controls a{text-decoration:none;}.item-controls a:hover{cursor:pointer;}.item-controls .item-order{padding-right:10px;}.item-controls .item-order a{font-weight:bold;}body.js .item-order{display:none;}.item-controls .menu-item-delete:hover{color:#f00;}.item-edit{background:url("../images/menu-bits.gif") no-repeat scroll 0 -105px;position:absolute;right:-20px;top:0;display:block;width:23px;height:36px;overflow:hidden;text-indent:-999em;border-bottom:1px solid #eee;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;-khtml-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}.menu-item-settings{background:#F9F9F9;width:400px;padding:10px 0 10px 10px;border:solid #E6E6E6;border-width:0 1px 1px 1px;-moz-border-radius:0 0 6px 6px;-webkit-border-bottom-right-radius:6px;-webkit-border-bottom-left-radius:6px;-khtml-border-bottom-right-radius:6px;-khtml-border-bottom-left-radius:6px;}.menu-item-settings.menu-item-edit-active{display:block;}.menu-item-settings.menu-item-edit-inactive{display:none;}.add-menu-item-pagelinks{margin:.5em auto;text-align:center;}.link-to-original{display:block;margin:0 0 10px;padding:3px 5px 5px;font-size:11px;color:#777;font-style:italic;border:1px solid #dfdfdf;border-radius:6px;-webkit-border-radius:6px;-moz-border-radius:6px;-khtml-border-radius:6px;}.link-to-original a{padding-left:4px;font-style:normal;}.hidden-field{display:none;}.menu-item-settings .description-thin,.menu-item-settings .description-wide{margin-right:10px;float:left;}.description-thin{width:190px;height:40px;}.description-wide{width:390px;}.menu-item-actions{padding-top:15px;line-height:25px;}.save-menu-item{padding-left:10px;float:right;}#cancel-save{cursor:pointer;}#cancel-save:hover{color:#fff!important;}#update-menu-item{color:#fff!important;}#update-menu-item:hover,#update-menu-item:active,#update-menu-item:focus{color:#eaf2fa!important;border-color:#13455b!important;}.major-publishing-actions{padding:5px 10px;border-bottom:1px solid #eee;}.major-publishing-actions .publishing-action{text-align:right;float:right;line-height:23px;}.major-publishing-actions .delete-action{line-height:25px;vertical-align:middle;text-align:left;float:right;padding-right:15px;}.menu-name-label span{font-size:11px;font-style:normal;}.submitbox .submitclose{color:#21759B;border-bottom:1px solid #21759B;padding:1px 2px;text-decoration:none;}.submitbox .submitclose:hover{background:#21759B;color:#fff;}.menu-item-settings:after,.button-controls:after,#menu-item-url-wrap:after,#menu-item-name-wrap:after{content:".";display:block;height:0;clear:both;visibility:hidden;}.menu-item-settings,.button-controls,#menu-item-url-wrap,#menu-item-name-wrap{display:block;}
\ No newline at end of file
+#nav-menus-frame{margin-left:300px;}#menu-settings-column{display:block;width:281px;margin-left:-300px;clear:both;float:left;}#menu-settings-column .inside{padding:0 10px;}#menu-settings-column .handlediv{background:url("../images/menu-bits.gif") no-repeat scroll 0 -110px;}#wpbody{position:relative;}#menu-management-liquid{float:left;min-width:100%;}#menu-management{position:relative;margin-right:20px;margin-top:-3px;width:100%;}#menu-management .menu-edit{margin-bottom:20px;}#nav-menu-header,#post-body{border-color:#ccc;border-style:solid;}#nav-menu-header{background:url("../images/gray-grad.png") repeat-x scroll left top #dfdfdf;border-width:1px 1px 0 1px;-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;-khtml-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;-khtml-border-top-right-radius:6px;border-top-right-radius:6px;}#post-body{background:#fff;padding:0 0 10px 10px;border-width:0 1px 1px 1px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;-khtml-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;-khtml-border-bottom-right-radius:6px;border-bottom-right-radius:6px;}#post-body-content{position:relative;}.post-body-plain{padding:10px 10px 0 0;}#menu-management .menu-add-new abbr{font-weight:bold;}#menu-management .nav-tabs{padding-left:30px;}#menu-management .nav-tab{background:#f4f4f4;font-weight:bold;border-color:#dfdfdf;}#menu-management .nav-tab-active{background:#ececec;border-color:#ccc;border-bottom-color:#ececec;}#menu-management #major-publishing-actions #delete-action{float:right;margin-right:10px;}#menu-name-label{margin-top:-2px;}#wpbody .open-label{display:inline-block;}#wpbody .open-label span{padding-right:10px;}.js .input-with-default-title{color:#aaa;font-style:italic;}#menu-management .inside{padding:0 10px;}.postbox .howto input{width:180px;float:right;}.customlinkdiv .howto input{width:210px;}#menu-container .submit{margin:0 0 10px;padding:0;}.submitdelete,.submitclose{font-size:11px;}#cancel-save{color:#f00;text-decoration:underline;font-size:11px;margin-left:20px;margin-top:5px;}#cancel-save:hover{background-color:#F00;color:#fff;}.list-controls{float:left;}.add-to-menu{float:right;}.postbox img.waiting{display:none;vertical-align:middle;}form.processing .postbox img.waiting{display:inline;}.button-controls{margin:10px 0;}.show-all,.hide-all{cursor:pointer;}.hide-all{display:none;}#create-menu-name{width:159px;}#manage-menu .inside{padding:0;}#available-links dt{display:block;}#add-custom-link .howto{font-size:11px;}#add-custom-link label span{display:block;float:left;margin-top:5px;padding-right:5px;}.menu-item-textbox{width:180px;}.howto span{margin-top:4px;display:block;float:left;}.quick-search{width:190px;}.list-wrap{display:none;clear:both;margin-bottom:10px;}.list-container{max-height:200px;overflow-y:auto;padding:10px 10px 5px;border:1px solid #DFDFDF;-moz-border-radius:4px;}.postbox p.submit{margin-bottom:0;}.list li{display:none;margin:0;margin-bottom:5px;}.list li .menu-item-title{cursor:pointer;display:block;}.list li .menu-item-title input{margin-right:3px;margin-top:-3px;}.list li li .menu-item-title{margin-left:14px;}.list li li li .menu-item-title{margin-left:28px;}.list li li li li .menu-item-title{margin-left:42px;}.list li li li li li .menu-item-title{margin-left:56px;}.list li li li li li li .menu-item-title{margin-left:70px;}.list li li li li li li li .menu-item-title{margin-left:84px;}.list li li li li li li li li .menu-item-title{margin-left:98px;}.list li li li li li li li li li .menu-item-title{margin-left:112px;}#menu-container .inside{padding-bottom:10px;}.menu{padding-top:1em;}.menu ul{width:100%;}.menu li{margin-bottom:0;}.menu li dl{clear:both;line-height:1.5em;position:relative;margin-top:13px;}.menu li dl dt{background:url("../images/gray-grad.png") repeat-x scroll left top #DFDFDF;border:1px solid #E6E6E6;clear:both;position:relative;padding-left:10px;height:auto;width:400px;line-height:35px;text-shadow:0 1px 0 #FFF;font-weight:bold;overflow:hidden;}.menu li dl.menu-item-edit-inactive dt{border-radius:6px;-webkit-border-radius:6px;-moz-border-radius:6px;-khtml-border-radius:6px;}.menu li dl.menu-item-edit-active dt{-moz-border-radius:6px 6px 0 0;-webkit-border-top-right-radius:6px;-webkit-border-top-left-radius:6px;-khtml-border-top-right-radius:6px;-khtml-border-top-left-radius:6px;border-top-right-radius:6px;border-top-left-radius:6px;}.js .menu li dl dt{cursor:move;}.menu li.deleting dl dt{background-color:#faa;}.menu li .item-title{padding:7px 0;line-height:20px;display:block;margin-right:13em;}li.menu-item.ui-sortable-helper dl{margin-top:0;}li.menu-item.ui-sortable-helper .menu-item-transport dl{margin-top:13px;}.menu .sortable-placeholder{height:35px;width:410px;margin-top:13px;}.menu-item-depth-0{margin-left:0;}.menu-item-depth-1{margin-left:30px;}.menu-item-depth-2{margin-left:60px;}.menu-item-depth-3{margin-left:90px;}.menu-item-depth-4{margin-left:120px;}.menu-item-depth-5{margin-left:150px;}.menu-item-depth-6{margin-left:180px;}.menu-item-depth-7{margin-left:210px;}.menu-item-depth-8{margin-left:240px;}.menu-item-depth-9{margin-left:270px;}.menu-item-depth-10{margin-left:300px;}.menu-item-depth-11{margin-left:330px;}.menu-item-depth-0 .menu-item-transport{margin-left:0;}.menu-item-depth-1 .menu-item-transport{margin-left:-30px;}.menu-item-depth-2 .menu-item-transport{margin-left:-60px;}.menu-item-depth-3 .menu-item-transport{margin-left:-90px;}.menu-item-depth-4 .menu-item-transport{margin-left:-120px;}.menu-item-depth-5 .menu-item-transport{margin-left:-150px;}.menu-item-depth-6 .menu-item-transport{margin-left:-180px;}.menu-item-depth-7 .menu-item-transport{margin-left:-210px;}.menu-item-depth-8 .menu-item-transport{margin-left:-240px;}.menu-item-depth-9 .menu-item-transport{margin-left:-270px;}.menu-item-depth-10 .menu-item-transport{margin-left:-300px;}.menu-item-depth-11 .menu-item-transport{margin-left:-330px;}.item-type{text-transform:uppercase;font-size:11px;color:#999;padding-right:10px;}.item-controls{font-size:11px;position:absolute;right:20px;top:-1px;}.item-controls a{text-decoration:none;}.item-controls a:hover{cursor:pointer;}.item-controls .item-order{padding-right:10px;}.item-controls .item-order a{font-weight:bold;}body.js .item-order{display:none;}.item-controls .menu-item-delete:hover{color:#f00;}.item-edit{background:url("../images/menu-bits.gif") no-repeat scroll 0 -105px;position:absolute;right:-20px;top:0;display:block;width:23px;height:36px;overflow:hidden;text-indent:-999em;border-bottom:1px solid #eee;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;-khtml-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}.menu-item-settings{background:#F9F9F9;width:400px;padding:10px 0 10px 10px;border:solid #E6E6E6;border-width:0 1px 1px 1px;-moz-border-radius:0 0 6px 6px;-webkit-border-bottom-right-radius:6px;-webkit-border-bottom-left-radius:6px;-khtml-border-bottom-right-radius:6px;-khtml-border-bottom-left-radius:6px;}.menu-item-settings.menu-item-edit-active{display:block;}.menu-item-settings.menu-item-edit-inactive{display:none;}.add-menu-item-pagelinks{margin:.5em auto;text-align:center;}.link-to-original{display:block;margin:0 0 10px;padding:3px 5px 5px;font-size:11px;color:#777;font-style:italic;border:1px solid #dfdfdf;border-radius:6px;-webkit-border-radius:6px;-moz-border-radius:6px;-khtml-border-radius:6px;}.link-to-original a{padding-left:4px;font-style:normal;}.hidden-field{display:none;}.menu-item-settings .description-thin,.menu-item-settings .description-wide{margin-right:10px;float:left;}.description-thin{width:190px;height:40px;}.description-wide{width:390px;}.menu-item-actions{padding-top:15px;line-height:25px;}.save-menu-item{padding-left:10px;float:right;}#cancel-save{cursor:pointer;}#cancel-save:hover{color:#fff!important;}#update-menu-item{color:#fff!important;}#update-menu-item:hover,#update-menu-item:active,#update-menu-item:focus{color:#eaf2fa!important;border-color:#13455b!important;}.major-publishing-actions{padding:5px 10px;border-bottom:1px solid #eee;}.major-publishing-actions .publishing-action{text-align:right;float:right;line-height:23px;}.major-publishing-actions .delete-action{line-height:25px;vertical-align:middle;text-align:left;float:right;padding-right:15px;}.menu-name-label span{font-size:11px;font-style:normal;}.submitbox .submitclose{color:#21759B;border-bottom:1px solid #21759B;padding:1px 2px;text-decoration:none;}.submitbox .submitclose:hover{background:#21759B;color:#fff;}.menu-item-settings:after,.button-controls:after,#menu-item-url-wrap:after,#menu-item-name-wrap:after{content:".";display:block;height:0;clear:both;visibility:hidden;}.menu-item-settings,.button-controls,#menu-item-url-wrap,#menu-item-name-wrap{display:block;}
\ No newline at end of file
diff --git a/wp-admin/css/nav-menu.dev.css b/wp-admin/css/nav-menu.dev.css
index 313c0660c6..ca666b4013 100644
--- a/wp-admin/css/nav-menu.dev.css
+++ b/wp-admin/css/nav-menu.dev.css
@@ -79,6 +79,10 @@
border-bottom-right-radius: 6px;
}
+ #post-body-content {
+ position: relative;
+ }
+
.post-body-plain {
padding: 10px 10px 0 0;
}
@@ -119,7 +123,7 @@
padding-right: 10px;
}
- .js .label-with-default-title {
+ .js .input-with-default-title {
color: #aaa;
font-style: italic;
}
@@ -203,12 +207,13 @@ form.processing .postbox img.waiting {
.menu ul.sub-menu {
}
.menu li {
- margin: 0;
+ margin-bottom: 0;
}
.menu li dl {
clear:both;
line-height:1.5em;
position:relative;
+ margin-top: 13px;
}
.menu li dl dt {
background: url("../images/gray-grad.png") repeat-x scroll left top #DFDFDF;
@@ -223,12 +228,6 @@ form.processing .postbox img.waiting {
font-weight:bold;
overflow: hidden;
}
- .menu li.deleting dl dt {
- background-color:#f66;
- background-image: none;
- text-shadow: 0 0 0 #ccc;
- }
-
.menu li dl.menu-item-edit-inactive dt {
border-radius: 6px;
-webkit-border-radius: 6px;
@@ -247,8 +246,10 @@ form.processing .postbox img.waiting {
.js .menu li dl dt {
cursor: move;
}
-.no-js .menu li dl {
- margin-top: 13px;
+.menu li dl dt:hover {
+}
+.menu li.deleting dl dt {
+ background-color:#faa;
}
.menu li .item-title {
@@ -258,25 +259,45 @@ form.processing .postbox img.waiting {
margin-right:13em;
}
-.menu li .sortable-placeholder {
- width: 430px;
+/* Sortables */
+li.menu-item.ui-sortable-helper dl {
+ margin-top: 0;
}
-.menu li div.sortable-placeholder {
- background: #f5f5f5;
- border: 1px dashed #bbb;
- margin: 10px 0;
- padding-top:40px;
+ li.menu-item.ui-sortable-helper .menu-item-transport dl {
+ margin-top: 13px;
+ }
+.menu .sortable-placeholder {
+ height: 35px;
+ width: 410px;
+ margin-top: 13px;
}
-.menu li dl.sortable-placeholder {
- background: #f5f5f5;
- padding-bottom:40px;
-}
+/* WARNING: The factor of 30px is hardcoded into the nav-menus javascript. */
+.menu-item-depth-0 { margin-left: 0px; }
+.menu-item-depth-1 { margin-left: 30px; }
+.menu-item-depth-2 { margin-left: 60px; }
+.menu-item-depth-3 { margin-left: 90px; }
+.menu-item-depth-4 { margin-left: 120px; }
+.menu-item-depth-5 { margin-left: 150px; }
+.menu-item-depth-6 { margin-left: 180px; }
+.menu-item-depth-7 { margin-left: 210px; }
+.menu-item-depth-8 { margin-left: 240px; }
+.menu-item-depth-9 { margin-left: 270px; }
+.menu-item-depth-10 { margin-left: 300px; }
+.menu-item-depth-11 { margin-left: 330px; }
-.menu li li { margin-left: 20px; }
-
-/* Drag and Drop */
-.dropzone { height: 7px; margin: 3px 0 3px 0; }
+.menu-item-depth-0 .menu-item-transport { margin-left: 0px; }
+.menu-item-depth-1 .menu-item-transport { margin-left: -30px; }
+.menu-item-depth-2 .menu-item-transport { margin-left: -60px; }
+.menu-item-depth-3 .menu-item-transport { margin-left: -90px; }
+.menu-item-depth-4 .menu-item-transport { margin-left: -120px; }
+.menu-item-depth-5 .menu-item-transport { margin-left: -150px; }
+.menu-item-depth-6 .menu-item-transport { margin-left: -180px; }
+.menu-item-depth-7 .menu-item-transport { margin-left: -210px; }
+.menu-item-depth-8 .menu-item-transport { margin-left: -240px; }
+.menu-item-depth-9 .menu-item-transport { margin-left: -270px; }
+.menu-item-depth-10 .menu-item-transport { margin-left: -300px; }
+.menu-item-depth-11 .menu-item-transport { margin-left: -330px; }
/* Menu item controls */
.item-type { text-transform: uppercase; font-size: 11px; color: #999999; padding-right: 10px; }
diff --git a/wp-admin/includes/nav-menu.php b/wp-admin/includes/nav-menu.php
index 6e705682d9..3e33d88f79 100644
--- a/wp-admin/includes/nav-menu.php
+++ b/wp-admin/includes/nav-menu.php
@@ -8,7 +8,24 @@
* @uses Walker_Nav_Menu
*/
class Walker_Nav_Menu_Edit extends Walker_Nav_Menu {
-
+ /**
+ * @see Walker_Nav_Menu::start_lvl()
+ * @since 3.0.0
+ *
+ * @param string $output Passed by reference.
+ * @param int $depth Depth of page.
+ */
+ function start_lvl(&$output, $depth) {}
+
+ /**
+ * @see Walker_Nav_Menu::end_lvl()
+ * @since 3.0.0
+ *
+ * @param string $output Passed by reference.
+ * @param int $depth Depth of page.
+ */
+ function end_lvl(&$output, $depth) {}
+
/**
* @see Walker::start_el()
* @since 3.0.0
@@ -41,7 +58,7 @@ class Walker_Nav_Menu_Edit extends Walker_Nav_Menu {
$original_title = $original_object->post_title;
}
?>
-
diff --git a/wp-admin/js/nav-menu.dev.js b/wp-admin/js/nav-menu.dev.js
index b246332d69..4ecdb733b2 100644
--- a/wp-admin/js/nav-menu.dev.js
+++ b/wp-admin/js/nav-menu.dev.js
@@ -8,17 +8,11 @@
* @subpackage Administration
*/
-var WPNavMenuHandler = function () {
- var $ = jQuery,
- activeHovering = false,
- currentDropzone = null,
+var WPNavMenuHandler = function ($) {
+ var autoCompleteData = {},
- customLinkNameInput,
- customLinkURLInput,
- customLinkNameDefault,
- customLinkURLDefault,
-
- autoCompleteData = {},
+ menuItemDepthPerLevel = 30, // Do not use directly. Use depthToPx and pxToDepth instead.
+ globalMaxDepth = 11,
formatAutocompleteResponse = function( resultRow, pos, total, queryTerm ) {
if ( resultRow && resultRow[0] ) {
@@ -80,83 +74,85 @@ var WPNavMenuHandler = function () {
return itemData;
},
+
+ recalculateMenuItemPositions = function() {
+ menuList.find('.menu-item-data-position').val( function(index) { return index + 1; } );
+ },
+
+ depthToPx = function(depth) {
+ return depth * menuItemDepthPerLevel;
+ },
+
+ pxToDepth = function(px) {
+ return Math.floor(px / menuItemDepthPerLevel);
+ },
- getParentMenuItemDBId = function() {
- var allInputs = this.getElementsByTagName('input'),
- i = allInputs.length,
- j,
- parentEl,
- parentInputs;
-
- while( i-- ) {
- if ( -1 != allInputs[i].name.indexOf('menu-item-parent-id[' + parseInt(this.id.replace('menu-item-', ''), 10) + ']') ) {
- /* This LI element is not in a submenu */
- if ( ! this.parentNode.className || -1 == this.parentNode.className.indexOf('sub-menu') ) {
- allInputs[i].value = 0;
-
- /* This LI is in a submenu, so need to get the parent's object ID (which is different from the parent's DB ID, the ID in its attributes) */
- } else if ( 'LI' == this.parentNode.parentNode.nodeName && -1 != this.parentNode.parentNode.id.indexOf('menu-item-') ) {
- parentEl = this.parentNode.parentNode;
- parentInputs = parentEl.getElementsByTagName('input');
- j = parentInputs.length;
- while ( j-- ) {
- if ( parentInputs[j].name && -1 != parentInputs[j].name.indexOf('menu-item-object-id[' + parseInt(parentEl.id.replace('menu-item-', ''), 10) + ']') ) {
- allInputs[i].value = parseInt(parentInputs[j].value, 10);
- break;
- }
- }
+ menuList;
+
+ // jQuery extensions
+ $.fn.extend({
+ menuItemDepth : function() {
+ return pxToDepth( this.eq(0).css('margin-left').slice(0, -2) );
+ },
+ updateDepthClass : function(current, prev) {
+ return this.each(function(){
+ var t = $(this);
+ prev = prev || t.menuItemDepth();
+ $(this).removeClass('menu-item-depth-'+ prev )
+ .addClass('menu-item-depth-'+ current );
+ });
+ },
+ shiftDepthClass : function(change) {
+ return this.each(function(){
+ var t = $(this),
+ depth = t.menuItemDepth();
+ $(this).removeClass('menu-item-depth-'+ depth )
+ .addClass('menu-item-depth-'+ (depth + change) );
+ });
+ },
+ childMenuItems : function() {
+ var result = $();
+ this.each(function(){
+ var t = $(this), depth = t.menuItemDepth(), next = t.next();
+ while( next.length && next.menuItemDepth() > depth ) {
+ result = result.add( next );
+ next = next.next();
}
- break;
- }
- }
- },
+ });
+ return result;
+ },
+ updateParentMenuItemDBId : function() {
+ return this.each(function(){
+ var item = $(this),
+ input = item.find('.menu-item-data-parent-id'),
+ depth = item.menuItemDepth(),
+ parent = item.prev();
- makeDroppable = function(el) {
- var that = this;
-
- $(el).droppable({
- accept: '.menu li',
- tolerance: 'pointer',
- drop: function(e, ui) {
- that.eventOnDrop(ui.draggable[0], this, ui, e);
- },
-
- over: function(e,ui) {
- that.eventOnDragOver(ui.draggable[0], this, ui, e);
- },
-
- out: function(e, ui) {
- that.eventOnDragOut(ui.draggable[0], this, ui, e);
- }
- });
- },
-
- menuList,
-
- setupListItemsDragAndDrop = function(list) {
- if ( ! list )
- return;
-
- var dummyListItem = document.getElementById(list.id + '-dummy-list-item'),
- menuListItems = list.getElementsByTagName('li'),
- i = menuListItems.length;
-
- if ( ! dummyListItem ) {
- dummyListItem = document.createElement('li');
- dummyListItem.id = list.id + '-dummy-list-item';
- list.appendChild(dummyListItem);
- this.setupListItemDragAndDrop(dummyListItem);
- }
-
- while ( i-- )
- this.setupListItemDragAndDrop(menuListItems[i]);
- };
+ if( depth == 0 ) { // Item is on the top level, has no parent
+ input.val(0);
+ } else { // Find the parent item, and retrieve its object id.
+ while( parent.menuItemDepth() != depth - 1 ) {
+ parent = parent.prev();
+ }
+ input.val( parent.find('.menu-item-data-object-id').val() );
+ }
+ });
+ },
+ hideAdvancedMenuItemFields : function() {
+ return this.each(function(){
+ var that = $(this);
+ $('.hide-column-tog').not(':checked').each(function(){
+ that.find('.field-' + $(this).val() ).addClass('hidden-field');
+ });
+ });
+ },
+ });
return {
// Functions that run on init.
init : function() {
- menuList = document.getElementById('menu-to-edit');
+ menuList = $('#menu-to-edit');
this.attachMenuEditListeners();
@@ -164,8 +160,8 @@ var WPNavMenuHandler = function () {
this.attachTabsPanelListeners();
- // init drag and drop
- setupListItemsDragAndDrop.call(this, menuList);
+ if( menuList.length ) // If no menu, we're in the + tab.
+ this.initSortables();
this.initToggles();
},
@@ -183,14 +179,106 @@ var WPNavMenuHandler = function () {
$('.field-' + field).addClass('hidden-field');
}
// hide fields
- this.hideAdvancedMenuItemFields();
+ menuList.hideAdvancedMenuItemFields();
},
- hideAdvancedMenuItemFields : function(container) {
- container = container || '.menu';
- $('.hide-column-tog').not(':checked').each(function(){
- $(container).find('.field-' + $(this).val() ).addClass('hidden-field');
+ initSortables : function() {
+ var currentDepth = 0, originalDepth, minDepth, maxDepth,
+ menuLeft = menuList.offset().left;
+
+ menuList.sortable({
+ handle: ' > dl',
+ placeholder: 'sortable-placeholder',
+ start: function(e, ui) {
+ var next, height, width, parent, children, maxChildDepth,
+ transport = ui.item.children('.menu-item-transport');
+
+ // Set depths
+ originalDepth = ui.item.menuItemDepth();
+ updateCurrentDepth(ui, originalDepth);
+
+ // Attach child elements to parent
+ // Skip the placeholder
+ parent = ( ui.item.next()[0] == ui.placeholder[0] ) ? ui.item.next() : ui.item;
+ children = parent.childMenuItems();
+ transport.append( children );
+
+ // Now that the element is complete, we can update...
+ updateDepthRange(ui);
+
+ // Update the height of the placeholder to match the moving item.
+ height = transport.outerHeight();
+ // If there are children, account for distance between top of children and parent
+ height += ( height > 0 ) ? (ui.placeholder.css('margin-top').slice(0, -2) * 1) : 0;
+ height += ui.item.outerHeight();
+ height -= 2; // Subtract 2 for borders
+ ui.placeholder.height(height);
+
+ // Update the width of the placeholder to match the moving item.
+ maxChildDepth = originalDepth;
+ children.each(function(){
+ var depth = $(this).menuItemDepth();
+ maxChildDepth = (depth > maxChildDepth) ? depth : maxChildDepth;
+ });
+ width = ui.item.find('dl dt').outerWidth(); // Get original width
+ width += depthToPx(maxChildDepth - originalDepth); // Account for children
+ width -= 2; // Subtract 2 for borders
+ ui.placeholder.width(width);
+ },
+ stop: function(e, ui) {
+ var children, depthChange = currentDepth - originalDepth;
+
+ // Return child elements to the list
+ children = ui.item.children('.menu-item-transport').children().insertAfter(ui.item);
+
+ // Update depth classes
+ if( depthChange != 0 ) {
+ ui.item.updateDepthClass( currentDepth );
+ children.shiftDepthClass( depthChange );
+ }
+ // Finally, update the item/menu data.
+ ui.item.updateParentMenuItemDBId();
+ recalculateMenuItemPositions();
+ },
+ change: function(e, ui) {
+ // Make sure the placeholder is inside the menu.
+ // Otherwise fix it, or we're in trouble.
+ if( ! ui.placeholder.parent().hasClass('menu') )
+ ui.placeholder.appendTo(menuList);
+
+ updateDepthRange(ui);
+ },
+ sort: function(e, ui) {
+ var depth = pxToDepth(ui.item.offset().left - menuLeft);
+ // Check and correct if depth is not within range.
+ if ( depth < minDepth ) depth = minDepth;
+ else if ( depth > maxDepth ) depth = maxDepth;
+
+ if( depth != currentDepth )
+ updateCurrentDepth(ui, depth);
+ }
});
+
+ function updateDepthRange(ui) {
+ var prev = ui.placeholder.prev(),
+ next = ui.placeholder.next(), depth;
+
+ // Make sure we don't select the moving item.
+ if( prev[0] == ui.item[0] ) prev = prev.prev();
+ if( next[0] == ui.item[0] ) next = next.next();
+
+ minDepth = (next.length) ? next.menuItemDepth() : 0;
+
+ if( prev.length )
+ maxDepth = ( (depth = prev.menuItemDepth() + 1) > globalMaxDepth ) ? globalMaxDepth : depth;
+ else
+ maxDepth = 0;
+ }
+
+ function updateCurrentDepth(ui, depth) {
+ ui.placeholder.updateDepthClass( depth, currentDepth );
+ currentDepth = depth;
+ }
},
attachMenuEditListeners : function() {
@@ -209,29 +297,42 @@ var WPNavMenuHandler = function () {
}
});
},
+
+ /**
+ * An interface for managing default values for input elements
+ * that is both JS and accessibility-friendly.
+ *
+ * Input elements that add the class 'input-with-default-title'
+ * will have their values set to the provided HTML title when empty.
+ */
+ setupInputWithDefaultTitle : function() {
+ var name = 'input-with-default-title';
+
+ $('.' + name).each( function(){
+ var $t = $(this), title = $t.attr('title'), val = $t.val();
+ $t.data( name, title );
+
+ if( '' == val ) $t.val( title );
+ else if ( title == val ) return;
+ else $t.removeClass( name );
+ }).focus( function(){
+ var $t = $(this);
+ if( $t.val() == $t.data(name) )
+ $t.val('').removeClass( name );
+ }).blur( function(){
+ var $t = $(this);
+ if( '' == $t.val() )
+ $t.val( $t.data(name) ).addClass( name );
+ });
+ },
attachMenuMetaListeners : function(formEL) {
if ( ! formEL )
return;
- var that = this, lwd = 'label-with-default-title';
+ var that = this;
+ this.setupInputWithDefaultTitle();
- $('.'+lwd).each(function(){
- var $t = $(this), title = $t.attr('title'), val = $t.val();
- $t.data(lwd, title);
- if( '' == val ) $t.val(title);
- else if ( title == val ) return;
- else $t.removeClass(lwd);
- }).focus(function(){
- var $t = $(this);
- if( $t.val() == $t.data(lwd) )
- $t.val('').removeClass(lwd);
- }).blur(function(){
- var $t = $(this);
- if( '' == $t.val() )
- $t.val( $t.data(lwd) ).addClass(lwd);
- });
-
// auto-suggest for the quick-search boxes
$('input.quick-search').each(function(i, el) {
that.setupQuickSearchEventListeners(el);
@@ -240,9 +341,6 @@ var WPNavMenuHandler = function () {
$(formEL).bind('submit', function(e) {
return that.eventSubmitMetaForm.call(that, this, e);
});
- $(formEL).find('input:submit').click(function() {
- $(this).siblings('img.waiting').show();
- });
},
attachTabsPanelListeners : function() {
@@ -288,19 +386,6 @@ var WPNavMenuHandler = function () {
});
},
- setupListItemDragAndDrop : function(el) {
- var defLists = el.getElementsByTagName('dl'),
- dropZone = this.makeListItemDropzone(el),
- i = defLists.length;
-
- makeDroppable.call(this, dropZone);
- this.makeListItemDraggable(el);
-
- while( i-- ) {
- makeDroppable.call(this, defLists[i]);
- }
- },
-
/**
* Set up quick-search input fields' events.
*
@@ -398,78 +483,6 @@ var WPNavMenuHandler = function () {
}
},
- /**
- * Callback for the drag over action when dragging a list item.
- *
- * @param object draggedEl The DOM element being dragged
- * @param object dropEl The DOM element on top of which we're dropping.
- */
- eventOnDragOver : function(draggedEl, dropEl) {
- activeHovering = true;
- currentDropzone = dropEl;
- dropEl.className += ' sortable-placeholder';
- },
-
- /**
- * Callback for the drag out action when dragging a list item.
- *
- * @param object draggedEl The DOM element being dragged
- * @param object dropEl The DOM element on top of which we're dropping.
- */
- eventOnDragOut : function(draggedEl, dropEl) {
- activeHovering = false;
-
- /* delay the disappearance of the droppable area so it doesn't flicker in and out */
- (function(that) {
- setTimeout(function() {
- if ( that != currentDropzone || ( ! activeHovering && that.className && -1 != that.className.indexOf('sortable-placeholder') ) ) {
- that.className = that.className.replace(/sortable-placeholder/g, '');
- }
- }, 800);
- })(dropEl);
- },
-
- /**
- * Callback for the drop action when dragging and dropping a list item.
- *
- * @param object draggedEl The DOM element being dragged (and now dropped)
- * @param object dropEl The DOM element on top of which we're dropping.
- */
- eventOnDrop : function(draggedEl, dropEl) {
- var dropIntoSublist = !! ( -1 == dropEl.className.indexOf('dropzone') ),
- subLists = dropEl.parentNode.getElementsByTagName('ul'),
- hasSublist = false,
- i = subLists.length,
- subList;
-
- activeHovering = false;
-
- dropEl.className = dropEl.className.replace(/sortable-placeholder/g, '');
-
- if ( dropIntoSublist ) {
- while ( i-- ) {
- if ( subLists[i] && 1 != subLists[i].className.indexOf('sub-menu') ) {
- hasSublist = true;
- subList = subLists[i];
- }
- }
-
- if ( ! hasSublist ) {
- subList = document.createElement('ul');
- subList.className = 'sub-menu';
- dropEl.parentNode.appendChild(subList);
- }
-
- subList.appendChild(draggedEl);
- } else {
- dropEl.parentNode.parentNode.insertBefore(draggedEl, dropEl.parentNode);
- }
-
- this.recalculateSortOrder(menuList);
-
- getParentMenuItemDBId.call(draggedEl);
- },
-
/**
* Callback for the meta form submit action listener.
*
@@ -487,6 +500,7 @@ var WPNavMenuHandler = function () {
processMethod = function(){},
re = new RegExp('menu-item\\[(\[^\\]\]*)');
+ thisForm.className = thisForm.className + ' processing',
that = this;
params['action'] = '';
@@ -534,46 +548,12 @@ var WPNavMenuHandler = function () {
$.post( ajaxurl, params, function(menuMarkup) {
processMethod.call(that, menuMarkup, params);
- $(thisForm).find('img.waiting').hide();
+ thisForm.className = thisForm.className.replace(/processing/g, '');
});
return false;
},
- makeListItemDraggable : function(el) {
- // make menu item draggable
- $(el).draggable({
- handle: ' > dl',
- opacity: .8,
- addClasses: false,
- helper: 'clone',
- zIndex: 100
- });
- },
-
- /**
- * Add the child element that acts as the dropzone for drag-n-drop.
- *
- * @param object el The parent object to which we'll prepend the dropzone.
- * @return object The dropzone DOM element.
- */
- makeListItemDropzone : function(el) {
- if ( ! el )
- return false;
- var divs = el.getElementsByTagName('div'),
- i = divs.length,
- dropZone = document.createElement('div');
-
- while( i-- ) {
- if ( divs[i].className && -1 != divs[i].className.indexOf('dropzone') && ( el == divs[i].parentNode ) )
- return divs[i];
- }
-
- dropZone.className = 'dropzone';
- el.insertBefore(dropZone, el.firstChild);
- return dropZone;
- },
-
/**
* Process the add menu item request response into menu list item.
*
@@ -581,27 +561,7 @@ var WPNavMenuHandler = function () {
* @param object req The request arguments.
*/
processAddMenuItemResponse : function( menuMarkup, req ) {
- if ( ! req )
- req = {};
- var dropZone,
- dummyListItem = document.getElementById(menuList.id + '-dummy-list-item'),
- i,
- listElements,
- wrap = document.createElement('ul');
-
- wrap.innerHTML = menuMarkup;
- listElements = wrap.getElementsByTagName('li');
- i = listElements.length;
- while ( i-- ) {
- this.setupListItemDragAndDrop(listElements[i]);
- if ( dummyListItem )
- menuList.insertBefore(listElements[i], dummyListItem);
- else
- menuList.appendChild(listElements[i]);
- }
-
- this.recalculateSortOrder(menuList);
- this.hideAdvancedMenuItemFields(menuList);
+ $(menuMarkup).hideAdvancedMenuItemFields().appendTo( menuList );
/* set custom link form back to defaults */
$('#custom-menu-item-name').val('').blur();
@@ -668,46 +628,20 @@ var WPNavMenuHandler = function () {
}
},
- recalculateSortOrder : function(parentEl) {
- var allInputs = parentEl.getElementsByTagName('input'),
- i,
- j = 0;
-
- for( i = 0; i < allInputs.length; i++ ) {
- if ( allInputs[i].name && -1 != allInputs[i].name.indexOf('menu-item-position') ) {
- allInputs[i].value = ++j;
- }
- }
- },
-
removeMenuItem : function(el) {
- if ( ! el )
- return false;
-
- var subMenus = el.getElementsByTagName('ul'),
- subs,
- i;
-
- if ( subMenus[0] ) {
- subs = subMenus[0].getElementsByTagName('li');
- for ( i = 0; i < subs.length; i++ ) {
- if ( subs[i].id && -1 != subs[i].id.indexOf('menu-item-') && subs[i].parentNode == subMenus[0] ) {
- el.parentNode.insertBefore(subs[i], el);
- }
- }
- }
-
- el.className += ' deleting';
- $(el).fadeOut( 350 , function() {
- this.parentNode.removeChild(this);
- });
+ el = $(el)
+ var children = el.childMenuItems();
- this.recalculateSortOrder(menuList);
+ el.addClass('deleting').fadeOut( 350 , function() {
+ el.remove();
+ children.shiftDepthClass(-1).updateParentMenuItemDBId();
+ recalculateMenuItemPositions();
+ });
}
}
}
-var wpNavMenu = new WPNavMenuHandler();
+var wpNavMenu = new WPNavMenuHandler(jQuery);
jQuery(function() {
wpNavMenu.init();
diff --git a/wp-admin/js/nav-menu.js b/wp-admin/js/nav-menu.js
index 3ae3b677a6..0e44529bdb 100644
--- a/wp-admin/js/nav-menu.js
+++ b/wp-admin/js/nav-menu.js
@@ -1 +1 @@
-var WPNavMenuHandler=function(){var h=jQuery,a=false,j=null,g,d,m,i,l={},n=function(p,t,q,s){if(p&&p[0]){var r=h.parseJSON(p[0]);if(r.post_title){if(r.ID&&r.post_type){l[r.post_title]={ID:r.ID,object_type:r.post_type}}return r.post_title}}},o=function(p,t,q,s){if(p&&p[0]){var r=h.parseJSON(p[0]);if(r.post_title){return r.post_title}}},b=function(v,u){if(!v){return false}u=u||document;var q=["menu-item-db-id","menu-item-object-id","menu-item-object","menu-item-parent-id","menu-item-position","menu-item-type","menu-item-append","menu-item-title","menu-item-url","menu-item-description","menu-item-attr-title","menu-item-target","menu-item-classes","menu-item-xfn"],p={},r=u.getElementsByTagName("input"),t=r.length,s,w=document.getElementById("nav-menu-meta-object-id").value;while(t--){s=q.length;while(s--){if(r[t]&&r[t].name&&"menu-item["+v+"]["+q[s]+"]"==r[t].name){p[q[s]]=r[t].value}}}return p},c=function(){var t=this.getElementsByTagName("input"),q=t.length,p,s,r;while(q--){if(-1!=t[q].name.indexOf("menu-item-parent-id["+parseInt(this.id.replace("menu-item-",""),10)+"]")){if(!this.parentNode.className||-1==this.parentNode.className.indexOf("sub-menu")){t[q].value=0}else{if("LI"==this.parentNode.parentNode.nodeName&&-1!=this.parentNode.parentNode.id.indexOf("menu-item-")){s=this.parentNode.parentNode;r=s.getElementsByTagName("input");p=r.length;while(p--){if(r[p].name&&-1!=r[p].name.indexOf("menu-item-object-id["+parseInt(s.id.replace("menu-item-",""),10)+"]")){t[q].value=parseInt(r[p].value,10);break}}}}break}}},e=function(p){var q=this;h(p).droppable({accept:".menu li",tolerance:"pointer",drop:function(s,r){q.eventOnDrop(r.draggable[0],this,r,s)},over:function(s,r){q.eventOnDragOver(r.draggable[0],this,r,s)},out:function(s,r){q.eventOnDragOut(r.draggable[0],this,r,s)}})},k,f=function(s){if(!s){return}var q=document.getElementById(s.id+"-dummy-list-item"),p=s.getElementsByTagName("li"),r=p.length;if(!q){q=document.createElement("li");q.id=s.id+"-dummy-list-item";s.appendChild(q);this.setupListItemDragAndDrop(q)}while(r--){this.setupListItemDragAndDrop(p[r])}};return{init:function(){k=document.getElementById("menu-to-edit");this.attachMenuEditListeners();this.attachMenuMetaListeners(document.getElementById("nav-menu-meta"));this.attachTabsPanelListeners();f.call(this,k);this.initToggles()},initToggles:function(){postboxes.add_postbox_toggles("nav-menus");columns.useCheckboxesForHidden();columns.checked=function(p){h(".field-"+p).removeClass("hidden-field")};columns.unchecked=function(p){h(".field-"+p).addClass("hidden-field")};this.hideAdvancedMenuItemFields()},hideAdvancedMenuItemFields:function(p){p=p||".menu";h(".hide-column-tog").not(":checked").each(function(){h(p).find(".field-"+h(this).val()).addClass("hidden-field")})},attachMenuEditListeners:function(){var p=this;h("#update-nav-menu").bind("click",function(q){if(q.target&&q.target.className){if(-1!=q.target.className.indexOf("item-edit")){return p.eventOnClickEditLink(q.target)}else{if(-1!=q.target.className.indexOf("menu-delete")){return p.eventOnClickMenuDelete(q.target)}else{if(-1!=q.target.className.indexOf("item-delete")){return p.eventOnClickMenuItemDelete(q.target)}else{if(-1!=q.target.className.indexOf("item-close")){return p.eventOnClickCloseLink(q.target)}}}}}})},attachMenuMetaListeners:function(q){if(!q){return}var r=this,p="label-with-default-title";h("."+p).each(function(){var u=h(this),t=u.attr("title"),s=u.val();u.data(p,t);if(""==s){u.val(t)}else{if(t==s){return}else{u.removeClass(p)}}}).focus(function(){var s=h(this);if(s.val()==s.data(p)){s.val("").removeClass(p)}}).blur(function(){var s=h(this);if(""==s.val()){s.val(s.data(p)).addClass(p)}});h("input.quick-search").each(function(s,t){r.setupQuickSearchEventListeners(t)});h(q).bind("submit",function(s){return r.eventSubmitMetaForm.call(r,this,s)});h(q).find("input:submit").click(function(){h(this).siblings("img.waiting").show()})},attachTabsPanelListeners:function(){h("#menu-settings-column").bind("click",function(u){if(u.target&&u.target.className&&-1!=u.target.className.indexOf("nav-tab-link")){var v,q=/#(.*)$/.exec(u.target.href),t,w=h(u.target).parents(".inside").first()[0],p=w?w.getElementsByTagName("input"):[],r=p.length;while(r--){p[r].checked=false}h(".tabs-panel",w).each(function(){if(this.className){this.className=this.className.replace("tabs-panel-active","tabs-panel-inactive")}});h(".tabs",w).each(function(){this.className=this.className.replace("tabs","")});u.target.parentNode.className+=" tabs";if(q&&q[1]){v=document.getElementById(q[1]);if(v){v.className=v.className.replace("tabs-panel-inactive","tabs-panel-active")}}return false}else{if(u.target&&u.target.className&&-1!=u.target.className.indexOf("select-all")){var s=/#(.*)$/.exec(u.target.href);if(s&&s[1]){h("#"+s[1]+" .tabs-panel-active input[type=checkbox]").attr("checked","checked");return false}}}})},setupListItemDragAndDrop:function(r){var p=r.getElementsByTagName("dl"),s=this.makeListItemDropzone(r),q=p.length;e.call(this,s);this.makeListItemDraggable(r);while(q--){e.call(this,p[q])}},setupQuickSearchEventListeners:function(p){var q=this;h(p).autocomplete(ajaxurl+"?action=menu-quick-search&type="+p.name,{delay:500,formatItem:n,formatResult:o,minchars:2,multiple:false}).bind("blur",function(t){var r=l[this.value],s=this;if(r){h.post(ajaxurl+"?action=menu-quick-search&type=get-post-item&response-format=markup",r,function(u){q.processQuickSearchQueryResponse.call(q,u,r);l[s.value]=false})}})},eventOnClickEditLink:function(p){var r,q=/#(.*)$/.exec(p.href);if(q&&q[1]){r=h("#"+q[1]);if(0!=r.length){if(r.hasClass("menu-item-edit-inactive")){r.slideDown("fast").siblings("dl").andSelf().removeClass("menu-item-edit-inactive").addClass("menu-item-edit-active")}else{r.slideUp("fast").siblings("dl").andSelf().removeClass("menu-item-edit-active").addClass("menu-item-edit-inactive")}return false}}},eventOnClickCloseLink:function(p){h(p).closest(".menu-item-settings").siblings("dl").find(".item-edit").click();return false},eventOnClickMenuDelete:function(p){if(confirm(navMenuL10n.warnDeleteMenu)){return true}else{return false}},eventOnClickMenuItemDelete:function(p){var s,r,q=this;if(confirm(navMenuL10n.warnDeleteMenuItem)){r=/_wpnonce=([a-zA-Z0-9]*)$/.exec(p.href);if(r&&r[1]){s=parseInt(p.id.replace("delete-",""),10);h.post(ajaxurl,{action:"delete-menu-item","menu-item":s,_wpnonce:r[1]},function(t){if("1"==t){q.removeMenuItem(document.getElementById("menu-item-"+s))}});return false}return true}else{return false}},eventOnDragOver:function(p,q){a=true;j=q;q.className+=" sortable-placeholder"},eventOnDragOut:function(p,q){a=false;(function(r){setTimeout(function(){if(r!=j||(!a&&r.className&&-1!=r.className.indexOf("sortable-placeholder"))){r.className=r.className.replace(/sortable-placeholder/g,"")}},800)})(q)},eventOnDrop:function(s,v){var t=!!(-1==v.className.indexOf("dropzone")),q=v.parentNode.getElementsByTagName("ul"),u=false,r=q.length,p;a=false;v.className=v.className.replace(/sortable-placeholder/g,"");if(t){while(r--){if(q[r]&&1!=q[r].className.indexOf("sub-menu")){u=true;p=q[r]}}if(!u){p=document.createElement("ul");p.className="sub-menu";v.parentNode.appendChild(p)}p.appendChild(s)}else{v.parentNode.parentNode.insertBefore(s,v.parentNode)}this.recalculateSortOrder(k);c.call(s)},eventSubmitMetaForm:function(q,w){var u=q.getElementsByTagName("input"),t=u.length,s,y,p,v,r={},x=function(){},z=new RegExp("menu-item\\[([^\\]]*)");that=this;r.action="";while(t--){if(u[t].name&&-1!=u[t].name.indexOf("menu-item-object-id")&&u[t].checked||("undefined"!=typeof u[t].id&&"custom-menu-item-url"==u[t].id&&""!=u[t].value&&"http://"!=u[t].value)){r.action="add-menu-item";x=that.processAddMenuItemResponse;v=z.exec(u[t].name);p="undefined"==typeof v[1]?0:parseInt(v[1],10);y=b(p);for(s in y){r["menu-item["+p+"]["+s+"]"]=y[s]}u[t].checked=false}else{if(""==r.action&&""!=u[t].value&&u[t].className&&-1!=u[t].className.search(/quick-search\b[^-]/)){r.action="menu-quick-search";r.q=u[t].value;r["response-format"]="markup";r.type=u[t].name;x=that.processQuickSearchQueryResponse}}}r.menu=q.elements.menu.value;r["menu-settings-column-nonce"]=q.elements["menu-settings-column-nonce"].value;h.post(ajaxurl,r,function(A){x.call(that,A,r);h(q).find("img.waiting").hide()});return false},makeListItemDraggable:function(p){h(p).draggable({handle:" > dl",opacity:0.8,addClasses:false,helper:"clone",zIndex:100})},makeListItemDropzone:function(r){if(!r){return false}var q=r.getElementsByTagName("div"),p=q.length,s=document.createElement("div");while(p--){if(q[p].className&&-1!=q[p].className.indexOf("dropzone")&&(r==q[p].parentNode)){return q[p]}}s.className="dropzone";r.insertBefore(s,r.firstChild);return s},processAddMenuItemResponse:function(p,u){if(!u){u={}}var v,q=document.getElementById(k.id+"-dummy-list-item"),s,r,t=document.createElement("ul");t.innerHTML=p;r=t.getElementsByTagName("li");s=r.length;while(s--){this.setupListItemDragAndDrop(r[s]);if(q){k.insertBefore(r[s],q)}else{k.appendChild(r[s])}}this.recalculateSortOrder(k);this.hideAdvancedMenuItemFields(k);h("#custom-menu-item-name").val("").blur();h("#custom-menu-item-url").val("http://")},processQuickSearchQueryResponse:function(t,y){if(!y){y={}}var q=document.createElement("ul"),p=document.getElementById("nav-menu-meta"),u,x,r,z,v,w=new RegExp("menu-item\\[([^\\]]*)"),s;r=w.exec(t);if(r&&r[1]){v=r[1];while(p.elements["menu-item["+v+"][menu-item-type]"]){v--}if(v!=r[1]){t=t.replace(new RegExp("menu-item\\["+r[1]+"\\]","g"),"menu-item["+v+"]")}}q.innerHTML=t;x=q.getElementsByTagName("li");if(x[0]&&y.object_type){s=document.getElementById(y.object_type+"-search-checklist");if(s){s.appendChild(x[0])}}else{if(y.type){r=/quick-search-(posttype|taxonomy)-([a-zA-Z_-]*)/.exec(y.type);if(r&&r[2]){s=document.getElementById(r[2]+"-search-checklist");if(s){u=x.length;if(!u){z=document.createElement("li");z.appendChild(document.createTextNode(navMenuL10n.noResultsFound));s.appendChild(z)}while(u--){s.appendChild(x[u])}}}}}},recalculateSortOrder:function(r){var s=r.getElementsByTagName("input"),q,p=0;for(q=0;qo){l=l.add(n);n=n.next()}});return l},updateParentMenuItemDBId:function(){return this.each(function(){var n=d(this),l=n.find(".menu-item-data-parent-id"),o=n.menuItemDepth(),m=n.prev();if(o==0){l.val(0)}else{while(m.menuItemDepth()!=o-1){m=m.prev()}l.val(m.find(".menu-item-data-object-id").val())}})},hideAdvancedMenuItemFields:function(){return this.each(function(){var l=d(this);d(".hide-column-tog").not(":checked").each(function(){l.find(".field-"+d(this).val()).addClass("hidden-field")})})},});return{init:function(){g=d("#menu-to-edit");this.attachMenuEditListeners();this.attachMenuMetaListeners(document.getElementById("nav-menu-meta"));this.attachTabsPanelListeners();if(g.length){this.initSortables()}this.initToggles()},initToggles:function(){postboxes.add_postbox_toggles("nav-menus");columns.useCheckboxesForHidden();columns.checked=function(l){d(".field-"+l).removeClass("hidden-field")};columns.unchecked=function(l){d(".field-"+l).addClass("hidden-field")};g.hideAdvancedMenuItemFields()},initSortables:function(){var o=0,m,p,r,n=g.offset().left;g.sortable({handle:" > dl",placeholder:"sortable-placeholder",start:function(w,x){var v,z,s,y,t,A,u=x.item.children(".menu-item-transport");m=x.item.menuItemDepth();l(x,m);y=(x.item.next()[0]==x.placeholder[0])?x.item.next():x.item;t=y.childMenuItems();u.append(t);q(x);z=u.outerHeight();z+=(z>0)?(x.placeholder.css("margin-top").slice(0,-2)*1):0;z+=x.item.outerHeight();z-=2;x.placeholder.height(z);A=m;t.each(function(){var B=d(this).menuItemDepth();A=(B>A)?B:A});s=x.item.find("dl dt").outerWidth();s+=e(A-m);s-=2;x.placeholder.width(s)},stop:function(v,u){var t,s=o-m;t=u.item.children(".menu-item-transport").children().insertAfter(u.item);if(s!=0){u.item.updateDepthClass(o);t.shiftDepthClass(s)}u.item.updateParentMenuItemDBId();a()},change:function(t,s){if(!s.placeholder.parent().hasClass("menu")){s.placeholder.appendTo(g)}q(s)},sort:function(t,s){var u=i(s.item.offset().left-n);if(ur){u=r}}if(u!=o){l(s,u)}}});function q(u){var t=u.placeholder.prev(),s=u.placeholder.next(),v;if(t[0]==u.item[0]){t=t.prev()}if(s[0]==u.item[0]){s=s.next()}p=(s.length)?s.menuItemDepth():0;if(t.length){r=((v=t.menuItemDepth()+1)>c)?c:v}else{r=0}}function l(s,t){s.placeholder.updateDepthClass(t,o);o=t}},attachMenuEditListeners:function(){var l=this;d("#update-nav-menu").bind("click",function(m){if(m.target&&m.target.className){if(-1!=m.target.className.indexOf("item-edit")){return l.eventOnClickEditLink(m.target)}else{if(-1!=m.target.className.indexOf("menu-delete")){return l.eventOnClickMenuDelete(m.target)}else{if(-1!=m.target.className.indexOf("item-delete")){return l.eventOnClickMenuItemDelete(m.target)}else{if(-1!=m.target.className.indexOf("item-close")){return l.eventOnClickCloseLink(m.target)}}}}}})},setupInputWithDefaultTitle:function(){var l="input-with-default-title";d("."+l).each(function(){var o=d(this),n=o.attr("title"),m=o.val();o.data(l,n);if(""==m){o.val(n)}else{if(n==m){return}else{o.removeClass(l)}}}).focus(function(){var m=d(this);if(m.val()==m.data(l)){m.val("").removeClass(l)}}).blur(function(){var m=d(this);if(""==m.val()){m.val(m.data(l)).addClass(l)}})},attachMenuMetaListeners:function(l){if(!l){return}var m=this;this.setupInputWithDefaultTitle();d("input.quick-search").each(function(n,o){m.setupQuickSearchEventListeners(o)});d(l).bind("submit",function(n){return m.eventSubmitMetaForm.call(m,this,n)})},attachTabsPanelListeners:function(){d("#menu-settings-column").bind("click",function(q){if(q.target&&q.target.className&&-1!=q.target.className.indexOf("nav-tab-link")){var r,m=/#(.*)$/.exec(q.target.href),p,s=d(q.target).parents(".inside").first()[0],l=s?s.getElementsByTagName("input"):[],n=l.length;while(n--){l[n].checked=false}d(".tabs-panel",s).each(function(){if(this.className){this.className=this.className.replace("tabs-panel-active","tabs-panel-inactive")}});d(".tabs",s).each(function(){this.className=this.className.replace("tabs","")});q.target.parentNode.className+=" tabs";if(m&&m[1]){r=document.getElementById(m[1]);if(r){r.className=r.className.replace("tabs-panel-inactive","tabs-panel-active")}}return false}else{if(q.target&&q.target.className&&-1!=q.target.className.indexOf("select-all")){var o=/#(.*)$/.exec(q.target.href);if(o&&o[1]){d("#"+o[1]+" .tabs-panel-active input[type=checkbox]").attr("checked","checked");return false}}}})},setupQuickSearchEventListeners:function(l){var m=this;d(l).autocomplete(ajaxurl+"?action=menu-quick-search&type="+l.name,{delay:500,formatItem:j,formatResult:k,minchars:2,multiple:false}).bind("blur",function(p){var n=h[this.value],o=this;if(n){d.post(ajaxurl+"?action=menu-quick-search&type=get-post-item&response-format=markup",n,function(q){m.processQuickSearchQueryResponse.call(m,q,n);h[o.value]=false})}})},eventOnClickEditLink:function(l){var n,m=/#(.*)$/.exec(l.href);if(m&&m[1]){n=d("#"+m[1]);if(0!=n.length){if(n.hasClass("menu-item-edit-inactive")){n.slideDown("fast").siblings("dl").andSelf().removeClass("menu-item-edit-inactive").addClass("menu-item-edit-active")}else{n.slideUp("fast").siblings("dl").andSelf().removeClass("menu-item-edit-active").addClass("menu-item-edit-inactive")}return false}}},eventOnClickCloseLink:function(l){d(l).closest(".menu-item-settings").siblings("dl").find(".item-edit").click();return false},eventOnClickMenuDelete:function(l){if(confirm(navMenuL10n.warnDeleteMenu)){return true}else{return false}},eventOnClickMenuItemDelete:function(l){var o,n,m=this;if(confirm(navMenuL10n.warnDeleteMenuItem)){n=/_wpnonce=([a-zA-Z0-9]*)$/.exec(l.href);if(n&&n[1]){o=parseInt(l.id.replace("delete-",""),10);d.post(ajaxurl,{action:"delete-menu-item","menu-item":o,_wpnonce:n[1]},function(p){if("1"==p){m.removeMenuItem(document.getElementById("menu-item-"+o))}});return false}return true}else{return false}},eventSubmitMetaForm:function(m,s){var q=m.getElementsByTagName("input"),p=q.length,o,u,l,r,n={},t=function(){},v=new RegExp("menu-item\\[([^\\]]*)");m.className=m.className+" processing",that=this;n.action="";while(p--){if(q[p].name&&-1!=q[p].name.indexOf("menu-item-object-id")&&q[p].checked||("undefined"!=typeof q[p].id&&"custom-menu-item-url"==q[p].id&&""!=q[p].value&&"http://"!=q[p].value)){n.action="add-menu-item";t=that.processAddMenuItemResponse;r=v.exec(q[p].name);l="undefined"==typeof r[1]?0:parseInt(r[1],10);u=b(l);for(o in u){n["menu-item["+l+"]["+o+"]"]=u[o]}q[p].checked=false}else{if(""==n.action&&""!=q[p].value&&q[p].className&&-1!=q[p].className.search(/quick-search\b[^-]/)){n.action="menu-quick-search";n.q=q[p].value;n["response-format"]="markup";n.type=q[p].name;t=that.processQuickSearchQueryResponse}}}n.menu=m.elements.menu.value;n["menu-settings-column-nonce"]=m.elements["menu-settings-column-nonce"].value;d.post(ajaxurl,n,function(w){t.call(that,w,n);m.className=m.className.replace(/processing/g,"")});return false},processAddMenuItemResponse:function(l,m){d(l).hideAdvancedMenuItemFields().appendTo(g);d("#custom-menu-item-name").val("").blur();d("#custom-menu-item-url").val("http://")},processQuickSearchQueryResponse:function(p,u){if(!u){u={}}var m=document.createElement("ul"),l=document.getElementById("nav-menu-meta"),q,t,n,v,r,s=new RegExp("menu-item\\[([^\\]]*)"),o;n=s.exec(p);if(n&&n[1]){r=n[1];while(l.elements["menu-item["+r+"][menu-item-type]"]){r--}if(r!=n[1]){p=p.replace(new RegExp("menu-item\\["+n[1]+"\\]","g"),"menu-item["+r+"]")}}m.innerHTML=p;t=m.getElementsByTagName("li");if(t[0]&&u.object_type){o=document.getElementById(u.object_type+"-search-checklist");if(o){o.appendChild(t[0])}}else{if(u.type){n=/quick-search-(posttype|taxonomy)-([a-zA-Z_-]*)/.exec(u.type);if(n&&n[2]){o=document.getElementById(n[2]+"-search-checklist");if(o){q=t.length;if(!q){v=document.createElement("li");v.appendChild(document.createTextNode(navMenuL10n.noResultsFound));o.appendChild(v)}while(q--){o.appendChild(t[q])}}}}}},removeMenuItem:function(m){m=d(m);var l=m.childMenuItems();m.addClass("deleting").fadeOut(350,function(){m.remove();l.shiftDepthClass(-1).updateParentMenuItemDBId();a()})}}};var wpNavMenu=new WPNavMenuHandler(jQuery);jQuery(function(){wpNavMenu.init()});
\ No newline at end of file
diff --git a/wp-admin/nav-menus.php b/wp-admin/nav-menus.php
index 9315d1f553..b600895839 100644
--- a/wp-admin/nav-menus.php
+++ b/wp-admin/nav-menus.php
@@ -384,7 +384,7 @@ require_once( 'admin-header.php' );
diff --git a/wp-includes/script-loader.php b/wp-includes/script-loader.php
index 239d972635..c2a47900e5 100644
--- a/wp-includes/script-loader.php
+++ b/wp-includes/script-loader.php
@@ -393,7 +393,7 @@ function wp_default_scripts( &$scripts ) {
) );
// Custom Navigation
- $scripts->add( 'nav-menu', "/wp-admin/js/nav-menu$suffix.js", false, '20100502' );
+ $scripts->add( 'nav-menu', "/wp-admin/js/nav-menu$suffix.js", false, '20100502a' );
$scripts->localize( 'nav-menu', 'navMenuL10n', array(
'custom' => _x('Custom', 'menu nav item type'),
'thickbox' => _x('Edit Menu Item', 'Thickbox Title'),
@@ -474,7 +474,7 @@ function wp_default_styles( &$styles ) {
$styles->add( 'farbtastic', '/wp-admin/css/farbtastic.css', array(), '1.2' );
$styles->add( 'jcrop', '/wp-includes/js/jcrop/jquery.Jcrop.css', array(), '0.9.8' );
$styles->add( 'imgareaselect', '/wp-includes/js/imgareaselect/imgareaselect.css', array(), '0.9.1' );
- $styles->add( 'nav-menu', "/wp-admin/css/nav-menu$suffix.css", array(), '20100429a' );
+ $styles->add( 'nav-menu', "/wp-admin/css/nav-menu$suffix.css", array(), '20100501a' );
foreach ( $rtl_styles as $rtl_style ) {
$styles->add_data( $rtl_style, 'rtl', true );