Make WordPress Core

Ticket #32688: 32688.8.diff

File 32688.8.diff, 32.9 KB (added by westonruter, 11 years ago)

Additional changes: https://github.com/xwp/wordpress-develop/compare/8ade858...3fe53c2a

  • tests/qunit/fixtures/customize-menus.js

    diff --git tests/qunit/fixtures/customize-menus.js tests/qunit/fixtures/customize-menus.js
    index b2d85e4..8478510 100755
     
     1
    12window._wpCustomizeNavMenusSettings = {
    23        'nonce': 'yo',
    34        'phpIntMax': '2147483647',
    45        'menuItemTransport': 'postMessage',
    56        'allMenus': [{
    67                'term_id': '2',
    7                 'name': 'Awesome menu',
    8                 'slug': 'awesome-menu',
     8                'name': 'Social Menu',
     9                'slug': 'social-menu',
    910                'term_group': '0',
    1011                'term_taxonomy_id': '2',
    1112                'taxonomy': 'nav_menu',
    window._wpCustomizeNavMenusSettings = { 
    1415                'count': '0'
    1516        }, {
    1617                'term_id': '3',
    17                 'name': 'Cool Menu',
    18                 'slug': 'cool-menu',
     18                'name': 'Primary Menu',
     19                'slug': 'primary-menu',
    1920                'term_group': '0',
    2021                'term_taxonomy_id': '3',
    2122                'taxonomy': 'nav_menu',
    window._wpCustomizeNavMenusSettings = { 
    4849                        'nav_menu_term_id': 0
    4950                }
    5051        },
    51         'itemTypes': {
    52                 'postTypes': {
    53                         'page': {
    54                                 'label': 'Page'
    55                         },
    56                         'post': {
    57                                 'label': 'Post'
    58                         }
     52        'itemTypes': [
     53                {
     54                        'title': 'Post',
     55                        'type': 'post_type',
     56                        'object': 'post'
     57                },
     58                {
     59                        'title': 'Page',
     60                        'type': 'post_type',
     61                        'object': 'page'
     62                },
     63                {
     64                        'title': 'Category',
     65                        'type': 'taxonomy',
     66                        'object': 'category'
     67                },
     68                {
     69                        'title': 'Tag',
     70                        'type': 'taxonomy',
     71                        'object': 'post_tag'
    5972                },
    60                 'taxonomies': {
    61                         'post_tag': {
    62                                 'label': 'Tag'
    63                         },
    64                         'post_format': {
    65                                 'label': 'Format'
    66                         },
    67                         'category': {
    68                                 'label': 'Category'
    69                         }
     73                {
     74                        'title': 'Format',
     75                        'type': 'taxonomy',
     76                        'object': 'post_format'
    7077                }
    71         },
     78        ],
    7279        'l10n': {
    7380                'custom_label': 'Custom Link',
    7481                'customizingMenus': 'Customizing ▸ Menus',
    window._wpCustomizeNavMenusSettings = { 
    97104                'untitled': '(no label)'
    98105        }
    99106};
    100 
    101107window._wpCustomizeSettings.panels.nav_menus = {
    102108        'id': 'nav_menus',
    103109        'description': '<p>This panel is used for managing navigation menus for content you have already published on your site. You can create menus and add items for existing content such as pages, posts, categories, tags, formats, or custom links.</p><p>Menus can be displayed in locations defined by your theme or in <a href="javascript:wp.customize.panel( "widgets" ).focus();">widget areas</a> by adding a &#8220;Custom Menu&#8221; widget.</p>',
    window._wpCustomizeSettings.panels.nav_menus = { 
    109115        'instanceNumber': 2
    110116};
    111117
     118// Nav Menu Locations
     119window._wpCustomizeSettings.sections.menu_locations = {
     120        'id': 'menu_locations',
     121        'description': '<p>Your theme contains 1 menu location. Select which menu you would like to use.<\/p><p>You can also place menus in widget areas with the Custom Menu widget.<\/p>',
     122        'priority': 5,
     123        'panel': 'nav_menus',
     124        'type': 'default',
     125        'title': 'Menu Locations',
     126        'content': '',
     127        'active': true,
     128        'instanceNumber': 13,
     129        'customizeAction': 'Customizing &#9656; Menus'
     130};
     131window._wpCustomizeSettings.settings['nav_menu_locations[social]'] = {
     132        'value': 2,
     133        'transport': 'postMessage',
     134        'dirty': false
     135};
     136window._wpCustomizeSettings.controls['nav_menu_locations[social]'] = {
     137        'settings': { 'default': 'nav_menu_locations[social]' },
     138        'type': 'nav_menu_location',
     139        'priority': 10,
     140        'active': true,
     141        'section': 'menu_locations',
     142        'content': '<li id="customize-control-nav_menu_locations-social" class="customize-control customize-control-nav_menu_location"> <label> <span class="customize-control-title">Social Links Menu</span> <select data-customize-setting-link="nav_menu_locations[social]"> <option value="0">&mdash; Select &mdash;</option><option value="59">Prim</option><option value="60" selected="selected">Social</option><option value="61">test11</option><option value="62">test222</option><option value="63">test333</option> </select> </label> </li>',
     143        'label': 'Social Links Menu',
     144        'description': '',
     145        'instanceNumber': 40,
     146        'locationId': 'social'
     147};
     148window._wpCustomizeSettings.settings['nav_menu_locations[primary]'] = {
     149        'value': 3,
     150        'transport': 'postMessage',
     151        'dirty': false
     152};
     153window._wpCustomizeSettings.controls['nav_menu_locations[primary]'] = {
     154        'active': true,
     155        'content': '<li id="customize-control-nav_menu_locations-primary" class="customize-control customize-control-nav_menu_location"> <label> <span class="customize-control-title">Primary Menu</span> <select data-customize-setting-link="nav_menu_locations[primary]"> <option value="0">&mdash; Select &mdash;</option><option value="59" selected="selected">Prim</option><option value="60">Social</option><option value="61">test11</option><option value="62">test222</option><option value="63">test333</option> </select> </label> </li>',
     156        'description': '',
     157        'instanceNumber': 39,
     158        'label': 'Primary Menu',
     159        'locationId': 'primary',
     160        'priority': 10,
     161        'section': 'menu_locations',
     162        'settings': {
     163                'default': 'nav_menu_locations[primary]'
     164        },
     165        'type': 'nav_menu_location'
     166};
     167
     168// Nav Menus
     169window._wpCustomizeSettings.sections['nav_menu[3]'] = {
     170        'id': 'nav_menu[3]',
     171        'description': '',
     172        'priority': 10,
     173        'panel': 'nav_menus',
     174        'type': 'nav_menu',
     175        'title': 'Primary Menu',
     176        'content': '',
     177        'active': true,
     178        'instanceNumber': 15,
     179        'customizeAction': 'Customizing &#9656; Menus',
     180        'menu_id': 3
     181};
     182window._wpCustomizeSettings.settings['nav_menu[3]'] = {
     183        'value': {
     184                'name': 'Primary menu',
     185                'description': '',
     186                'parent': 0,
     187                'auto_add': false
     188        },
     189        'transport': 'postMessage',
     190        'dirty': false
     191};
     192
     193window._wpCustomizeSettings.sections['nav_menu[2]'] = {
     194        'id': 'nav_menu[2]',
     195        'description': '',
     196        'priority': 10,
     197        'panel': 'nav_menus',
     198        'type': 'nav_menu',
     199        'title': 'Social menu',
     200        'content': '',
     201        'active': true,
     202        'instanceNumber': 14,
     203        'customizeAction': 'Customizing &#9656; Menus',
     204        'menu_id': 2
     205};
     206window._wpCustomizeSettings.settings['nav_menu[2]'] = {
     207        'value': {
     208                'name': 'Social menu',
     209                'description': '',
     210                'parent': 0,
     211                'auto_add': false
     212        },
     213        'transport': 'postMessage',
     214        'dirty': false
     215};
     216
     217// Menu items
     218window._wpCustomizeSettings.settings['nav_menu_item[2000]'] = {
     219        'dirty': false,
     220        'transport': 'postMessage',
     221        'value': {
     222                'attr_title': '',
     223                'classes': [
     224                        ''
     225                ],
     226                'description': '',
     227                'menu_item_parent': 0,
     228                'nav_menu_term_id': 3,
     229                'object': 'page',
     230                'object_id': 2,
     231                'original_title': 'Sample Page',
     232                'position': 1,
     233                'status': 'publish',
     234                'target': '',
     235                'title': 'Sample Page',
     236                'type': 'post_type',
     237                'type_label': 'Page',
     238                'url': 'http://src.wordpress-develop.dev/sample-page/',
     239                'xfn': ''
     240        }
     241};
     242window._wpCustomizeSettings.controls['nav_menu_item[2000]'] = {
     243        'active': true,
     244        'attr_title': '',
     245        'classes': '',
     246        'content': '<li id="customize-control-nav_menu_item-2000" class="customize-control customize-control-nav_menu_item"> </li>',
     247        'depth': 0,
     248        'description': '',
     249        'el_classes': 'menu-item menu-item-depth-0 menu-item-page menu-item-edit-inactive',
     250        'instanceNumber': 42,
     251        'item_type': 'post_type',
     252        'item_type_label': 'Page',
     253        'label': 'Sample Page',
     254        'menu_item_id': 2000,
     255        'original_title': 'Sample Page',
     256        'parent': 0,
     257        'priority': 1,
     258        'section': 'nav_menu[3]',
     259        'settings': {
     260                'default': 'nav_menu_item[2000]'
     261        },
     262        'target': '',
     263        'title': 'Sample Page',
     264        'type': 'nav_menu_item',
     265        'url': 'http://src.wordpress-develop.dev/sample-page/',
     266        'xfn': ''
     267};
     268
     269window._wpCustomizeSettings.settings['nav_menu_item[2001]'] = {
     270        'dirty': false,
     271        'transport': 'postMessage',
     272        'value': {
     273                'attr_title': '',
     274                'classes': [
     275                        ''
     276                ],
     277                'description': '',
     278                'menu_item_parent': 0,
     279                'nav_menu_term_id': 3,
     280                'object': 'custom',
     281                'object_id': 2001,
     282                'original_title': '',
     283                'position': 2,
     284                'status': 'publish',
     285                'target': '',
     286                'title': 'Example',
     287                'type': 'custom',
     288                'type_label': 'Custom Link',
     289                'url': 'http://example.com/',
     290                'xfn': ''
     291        }
     292};
     293window._wpCustomizeSettings.controls['nav_menu_item[2001]'] = {
     294        'active': true,
     295        'attr_title': '',
     296        'classes': '',
     297        'content': '<li id="customize-control-nav_menu_item-2001" class="customize-control customize-control-nav_menu_item"> </li>',
     298        'depth': 0,
     299        'description': '',
     300        'el_classes': 'menu-item menu-item-depth-0 menu-item-custom menu-item-edit-inactive',
     301        'instanceNumber': 46,
     302        'item_type': 'custom',
     303        'item_type_label': 'Custom Link',
     304        'label': 'Example',
     305        'menu_item_id': 2001,
     306        'original_title': '',
     307        'parent': 0,
     308        'priority': 2,
     309        'section': 'nav_menu[3]',
     310        'settings': {
     311                'default': 'nav_menu_item[2001]'
     312        },
     313        'target': '',
     314        'title': 'Example',
     315        'type': 'nav_menu_item',
     316        'url': 'http://example.com/',
     317        'xfn': ''
     318};
     319
     320window._wpCustomizeSettings.settings['nav_menu_item[2002]'] = {
     321        'dirty': false,
     322        'transport': 'postMessage',
     323        'value': {
     324                'attr_title': '',
     325                'classes': '',
     326                'description': '',
     327                'menu_item_parent': 2001,
     328                'nav_menu_term_id': 3,
     329                'object': '',
     330                'object_id': 0,
     331                'original_title': 'Sub-Example',
     332                'position': 3,
     333                'status': 'publish',
     334                'target': '',
     335                'title': 'Example',
     336                'type': 'custom',
     337                'type_label': 'Custom Link',
     338                'url': 'http://sub.example.com/',
     339                'xfn': ''
     340        }
     341};
     342window._wpCustomizeSettings.controls['nav_menu_item[2002]'] = {
     343        'active': true,
     344        'attr_title': '',
     345        'classes': '',
     346        'content': '<li id="customize-control-nav_menu_item-2002" class="customize-control customize-control-nav_menu_item"> </li>',
     347        'depth': 0,
     348        'description': '',
     349        'el_classes': 'menu-item menu-item-depth-0 menu-item-custom menu-item-edit-inactive',
     350        'instanceNumber': 46,
     351        'item_type': 'custom',
     352        'item_type_label': 'Custom Link',
     353        'label': 'Sub-Example',
     354        'menu_item_id': 2001,
     355        'original_title': '',
     356        'parent': 2001,
     357        'priority': 3,
     358        'section': 'nav_menu[3]',
     359        'settings': {
     360                'default': 'nav_menu_item[2002]'
     361        },
     362        'target': '',
     363        'title': 'Sub-Example',
     364        'type': 'nav_menu_item',
     365        'url': 'http://sub.example.com/',
     366        'xfn': ''
     367};
     368
     369// Meta controls
     370window._wpCustomizeSettings.sections.add_menu = {
     371        'id': 'add_menu',
     372        'description': '',
     373        'priority': 999,
     374        'panel': 'nav_menus',
     375        'type': 'new_menu',
     376        'title': 'Add a Menu',
     377        'content': '<li id="accordion-section-add_menu" class="accordion-section-new-menu">\n\t\t\t<button type="button" class="button-secondary add-new-menu-item add-menu-toggle" aria-expanded="false">\n\t\t\t\tAdd a Menu\t\t\t<\/button>\n\t\t\t<ul class="new-menu-section-content"><\/ul>\n\t\t<\/li>',
     378        'active': true,
     379        'instanceNumber': 16,
     380        'customizeAction': 'Customizing &#9656; Menus'
     381};
     382window._wpCustomizeSettings.controls.new_menu_name = {
     383        'settings': { 'default': 'new_menu_name' },
     384        'type': 'text',
     385        'priority': 10,
     386        'active': true,
     387        'section': 'add_menu',
     388        'content': '<li id="customize-control-new_menu_name" class="customize-control customize-control-text"> <label> <input type="text" class="menu-name-field" placeholder="New menu name"  value="" data-customize-setting-link="new_menu_name" /> </label> </li>',
     389        'label': '',
     390        'description': '',
     391        'instanceNumber': 46
     392};
     393window._wpCustomizeSettings.settings.new_menu_name = {
     394        'value': '',
     395        'transport': 'postMessage',
     396        'dirty': false
     397};
     398
     399// From nav-menu.js
    112400window.wpNavMenu = {
    113401        'options': {
    114402                'menuItemDepthPerLevel': 30,
    window.wpNavMenu = { 
    120408        'isRTL': false,
    121409        'negateIfRTL': 1
    122410};
    123 
  • tests/qunit/fixtures/customize-settings.js

    diff --git tests/qunit/fixtures/customize-settings.js tests/qunit/fixtures/customize-settings.js
    index f5a7fc9..af1a2cf 100644
    window.wp.customize = window.wp.customize || { get: function(){} }; 
    33
    44var customizerRootElement;
    55customizerRootElement = jQuery( '<div id="customize-theme-controls"><ul></ul></div>' );
    6 customizerRootElement.css( { position: 'absolute', left: -1000 } ); // remove from view
     6customizerRootElement.css( { position: 'absolute', left: -10000, top: -10000 } ); // remove from view
    77jQuery( document.body ).append( customizerRootElement );
    88
    99window._wpCustomizeSettings = {
    window._wpCustomizeControlsL10n = {}; 
    136136
    137137jQuery.ajaxSetup( {
    138138        beforeSend: function( e, data ) {
    139                 if ( data.data.indexOf( 'wp_customize' ) !== -1 ) {
     139                if ( data.url.indexOf( '//example.org' ) !== -1 ) {
    140140                        return false;
    141141                }
    142142        }
  • tests/qunit/index.html

    diff --git tests/qunit/index.html tests/qunit/index.html
    index ba9b0cf..71599d4 100644
     
    3434                <script src="../../src/wp-includes/js/customize-models.js"></script>
    3535                <script src="../../src/wp-includes/js/shortcode.js"></script>
    3636                <script src="../../src/wp-admin/js/customize-controls.js"></script>
     37
     38                <script type='text/javascript' src='../../src/wp-includes/js/jquery/ui/core.js'></script>
     39                <script type='text/javascript' src='../../src/wp-includes/js/jquery/ui/widget.js'></script>
     40                <script type='text/javascript' src='../../src/wp-includes/js/jquery/ui/mouse.js'></script>
     41                <script type='text/javascript' src='../../src/wp-includes/js/jquery/ui/sortable.js'></script>
     42                <script type='text/javascript' src='../../src/wp-includes/js/jquery/ui/draggable.js'></script>
     43                <script type='text/javascript' src='../../src/wp-includes/js/jquery/ui/droppable.js'></script>
     44
     45                <script src="../../src/wp-admin/js/nav-menu.js"></script>
    3746                <script src="../../src/wp-admin/js/customize-nav-menus.js"></script>
    3847                <script src="../../src/wp-admin/js/word-count.js"></script>
    3948
     
    115124                        </li>
    116125                </script>
    117126
    118                 <!-- TinyMCE -->
     127                <!-- Templates for Customizer Menus -->
     128                <script type="text/html" id="tmpl-customize-control-nav_menu-content">
     129                                        <button type="button" class="button-secondary add-new-menu-item" aria-label="Add or remove menu items" aria-expanded="false" aria-controls="available-menu-items">
     130                        Add Items               </button>
     131                <button type="button" class="not-a-button reorder-toggle" aria-label="Reorder menu items" aria-describedby="reorder-items-desc-{{ data.menu_id }}">
     132                        <span class="reorder">Reorder</span>
     133                        <span class="reorder-done">Done</span>
     134                </button>
     135                <p class="screen-reader-text" id="reorder-items-desc-{{ data.menu_id }}">When in reorder mode, additional controls to reorder menu items will be available in the items list above.</p>
     136                <span class="add-menu-item-loading spinner"></span>
     137                <span class="menu-delete-item">
     138                        <button type="button" class="not-a-button menu-delete">
     139                                Delete menu <span class="screen-reader-text">{{ data.menu_name }}</span>
     140                        </button>
     141                </span>
     142                                <ul class="menu-settings">
     143                        <li class="customize-control">
     144                                <span class="customize-control-title">Menu locations</span>
     145                        </li>
     146
     147                                                <li class="customize-control customize-control-checkbox assigned-menu-location">
     148                                <label>
     149                                        <input type="checkbox" data-menu-id="{{ data.menu_id }}" data-location-id="primary" class="menu-location" /> Primary Menu                                       <span class="theme-location-set">(Current: <span class="current-menu-location-name-primary"></span>)</span>
     150                                </label>
     151                        </li>
     152                                                <li class="customize-control customize-control-checkbox assigned-menu-location">
     153                                <label>
     154                                        <input type="checkbox" data-menu-id="{{ data.menu_id }}" data-location-id="social" class="menu-location" /> Social Links Menu                                   <span class="theme-location-set">(Current: <span class="current-menu-location-name-social"></span>)</span>
     155                                </label>
     156                        </li>
     157
     158                </ul>
     159                                </script>
     160                                <script type="text/html" id="tmpl-customize-control-nav_menu_name-content">
     161                                        <label>
     162                        <# if ( data.label ) { #>
     163                                <span class="customize-control-title screen-reader-text">{{ data.label }}</span>
     164                        <# } #>
     165                        <input type="text" class="menu-name-field live-update-section-title" />
     166                </label>
     167                                </script>
     168                                <script type="text/html" id="tmpl-customize-control-nav_menu_auto_add-content">
     169                                        <span class="customize-control-title">Menu options</span>
     170                <label>
     171                        <input type="checkbox" class="auto_add" />
     172                        Automatically add new top-level pages to this menu              </label>
     173                                </script>
     174                                <script type="text/html" id="tmpl-customize-control-nav_menu_item-content">
     175                                        <div class="menu-item-bar">
     176                        <div class="menu-item-handle">
     177                                <span class="item-type" aria-hidden="true">{{ data.item_type_label }}</span>
     178                                <span class="item-title" aria-hidden="true">
     179                                        <span class="spinner"></span>
     180                                        <span class="menu-item-title<# if ( ! data.title ) { #> no-title<# } #>">{{ data.title || wp.customize.Menus.data.l10n.untitled }}</span>
     181                                </span>
     182                                <span class="item-controls">
     183                                        <button type="button" class="not-a-button item-edit" aria-expanded="false"><span class="screen-reader-text">Edit menu item: {{ data.title || wp.customize.Menus.data.l10n.untitled }} ({{ data.item_type_label }})</span><span class="toggle-indicator" aria-hidden="true"></span></button>
     184                                        <button type="button" class="not-a-button item-delete submitdelete deletion"><span class="screen-reader-text">Remove Menu Item: {{ data.title || wp.customize.Menus.data.l10n.untitled }} ({{ data.item_type_label }})</span></button>
     185                                </span>
     186                        </div>
     187                </div>
     188
     189                <div class="menu-item-settings" id="menu-item-settings-{{ data.menu_item_id }}">
     190                        <# if ( 'custom' === data.item_type ) { #>
     191                        <p class="field-url description description-thin">
     192                                <label for="edit-menu-item-url-{{ data.menu_item_id }}">
     193                                        URL<br />
     194                                        <input class="widefat code edit-menu-item-url" type="text" id="edit-menu-item-url-{{ data.menu_item_id }}" name="menu-item-url" />
     195                                </label>
     196                        </p>
     197                <# } #>
     198                        <p class="description description-thin">
     199                                <label for="edit-menu-item-title-{{ data.menu_item_id }}">
     200                                        Navigation Label<br />
     201                                        <input type="text" id="edit-menu-item-title-{{ data.menu_item_id }}" class="widefat edit-menu-item-title" name="menu-item-title" />
     202                                </label>
     203                        </p>
     204                        <p class="field-link-target description description-thin">
     205                                <label for="edit-menu-item-target-{{ data.menu_item_id }}">
     206                                        <input type="checkbox" id="edit-menu-item-target-{{ data.menu_item_id }}" class="edit-menu-item-target" value="_blank" name="menu-item-target" />
     207                                        Open link in a new tab                          </label>
     208                        </p>
     209                        <p class="field-attr-title description description-thin">
     210                                <label for="edit-menu-item-attr-title-{{ data.menu_item_id }}">
     211                                        Title Attribute<br />
     212                                        <input type="text" id="edit-menu-item-attr-title-{{ data.menu_item_id }}" class="widefat edit-menu-item-attr-title" name="menu-item-attr-title" />
     213                                </label>
     214                        </p>
     215                        <p class="field-css-classes description description-thin">
     216                                <label for="edit-menu-item-classes-{{ data.menu_item_id }}">
     217                                        CSS Classes<br />
     218                                        <input type="text" id="edit-menu-item-classes-{{ data.menu_item_id }}" class="widefat code edit-menu-item-classes" name="menu-item-classes" />
     219                                </label>
     220                        </p>
     221                        <p class="field-xfn description description-thin">
     222                                <label for="edit-menu-item-xfn-{{ data.menu_item_id }}">
     223                                        Link Relationship (XFN)<br />
     224                                        <input type="text" id="edit-menu-item-xfn-{{ data.menu_item_id }}" class="widefat code edit-menu-item-xfn" name="menu-item-xfn" />
     225                                </label>
     226                        </p>
     227                        <p class="field-description description description-thin">
     228                                <label for="edit-menu-item-description-{{ data.menu_item_id }}">
     229                                        Description<br />
     230                                        <textarea id="edit-menu-item-description-{{ data.menu_item_id }}" class="widefat edit-menu-item-description" rows="3" cols="20" name="menu-item-description">{{ data.description }}</textarea>
     231                                        <span class="description">The description will be displayed in the menu if the current theme supports it.</span>
     232                                </label>
     233                        </p>
     234
     235                        <div class="menu-item-actions description-thin submitbox">
     236                                <# if ( ( 'post_type' === data.item_type || 'taxonomy' === data.item_type ) && '' !== data.original_title ) { #>
     237                                <p class="link-to-original">
     238                                        Original: <a class="original-link" href="{{ data.url }}">{{ data.original_title }}</a>                          </p>
     239                                <# } #>
     240
     241                                <button type="button" class="not-a-button item-delete submitdelete deletion">Remove</button>
     242                                <span class="spinner"></span>
     243                        </div>
     244                        <input type="hidden" name="menu-item-db-id[{{ data.menu_item_id }}]" class="menu-item-data-db-id" value="{{ data.menu_item_id }}" />
     245                        <input type="hidden" name="menu-item-parent-id[{{ data.menu_item_id }}]" class="menu-item-data-parent-id" value="{{ data.parent }}" />
     246                </div><!-- .menu-item-settings-->
     247                <ul class="menu-item-transport"></ul>
     248                </script>
     249
     250                                <script type="text/html" id="tmpl-available-menu-item">
     251                        <li id="menu-item-tpl-{{ data.id }}" class="menu-item-tpl" data-menu-item-id="{{ data.id }}">
     252                                <div class="menu-item-bar">
     253                                        <div class="menu-item-handle">
     254                                                <span class="item-type" aria-hidden="true">{{ data.type_label }}</span>
     255                                                <span class="item-title" aria-hidden="true">
     256                                                        <span class="menu-item-title<# if ( ! data.title ) { #> no-title<# } #>">{{ data.title || wp.customize.Menus.data.l10n.untitled }}</span>
     257                                                </span>
     258                                                <button type="button" class="not-a-button item-add">
     259                                                        <span class="screen-reader-text">Add to menu: {{ data.title || wp.customize.Menus.data.l10n.untitled }} ({{ data.type_label }})</span>
     260                                                </button>
     261                                        </div>
     262                                </div>
     263                        </li>
     264                </script>
     265
     266                <script type="text/html" id="tmpl-menu-item-reorder-nav">
     267                        <div class="menu-item-reorder-nav">
     268                                <button type="button" class="menus-move-up">Move up</button><button type="button" class="menus-move-down">Move down</button><button type="button" class="menus-move-left">Move one level up</button><button type="button" class="menus-move-right">Move one level down</button>                 </div>
     269                </script>
     270                <div hidden>
     271                        <div id="available-menu-items" class="accordion-container">
     272                        <div class="customize-section-title">
     273                                <button type="button" class="customize-section-back" tabindex="-1">
     274                                        <span class="screen-reader-text">Back</span>
     275                                </button>
     276                                <h3>
     277                                        <span class="customize-action">
     278                                                Customizing &#9656; Menus                                       </span>
     279                                        Add Menu Items                          </h3>
     280                        </div>
     281                        <div id="available-menu-items-search" class="accordion-section cannot-expand">
     282                                <div class="accordion-section-title">
     283                                        <label class="screen-reader-text" for="menu-items-search">Search Menu Items</label>
     284                                        <input type="text" id="menu-items-search" placeholder="Search menu items&hellip;" aria-describedby="menu-items-search-desc" />
     285                                        <p class="screen-reader-text" id="menu-items-search-desc">The search results will be updated as you type.</p>
     286                                        <span class="spinner"></span>
     287                                        <span class="clear-results"><span class="screen-reader-text">Clear Results</span></span>
     288                                </div>
     289                                <ul class="accordion-section-content" data-type="search"></ul>
     290                        </div>
     291                        <div id="new-custom-menu-item" class="accordion-section">
     292                                <h4 class="accordion-section-title" role="presentation">
     293                                        Custom Links                                    <button type="button" class="not-a-button" aria-expanded="false">
     294                                                <span class="screen-reader-text">Toggle section: Custom Links</span>
     295                                                <span class="toggle-indicator" aria-hidden="true"></span>
     296                                        </button>
     297                                </h4>
     298                                <div class="accordion-section-content">
     299                                        <input type="hidden" value="custom" id="custom-menu-item-type" name="menu-item[-1][menu-item-type]" />
     300                                        <p id="menu-item-url-wrap">
     301                                                <label class="howto" for="custom-menu-item-url">
     302                                                        <span>URL</span>
     303                                                        <input id="custom-menu-item-url" name="menu-item[-1][menu-item-url]" type="text" class="code menu-item-textbox" value="http://">
     304                                                </label>
     305                                        </p>
     306                                        <p id="menu-item-name-wrap">
     307                                                <label class="howto" for="custom-menu-item-name">
     308                                                        <span>Link Text</span>
     309                                                        <input id="custom-menu-item-name" name="menu-item[-1][menu-item-title]" type="text" class="regular-text menu-item-textbox">
     310                                                </label>
     311                                        </p>
     312                                        <p class="button-controls">
     313                                                <span class="add-to-menu">
     314                                                        <input type="submit" class="button-secondary submit-add-to-menu right" value="Add to Menu" name="add-custom-menu-item" id="custom-menu-item-submit">
     315                                                        <span class="spinner"></span>
     316                                                </span>
     317                                        </p>
     318                                </div>
     319                        </div>
     320                        <div id="available-menu-items-post_type-post" class="accordion-section">
     321                                        <h4 class="accordion-section-title" role="presentation">
     322                                                Post                                            <span class="spinner"></span>
     323                                                <span class="no-items">No items</span>
     324                                                <button type="button" class="not-a-button" aria-expanded="false">
     325                                                        <span class="screen-reader-text">Toggle section: Post</span>
     326                                                        <span class="toggle-indicator" aria-hidden="true"></span>
     327                                                </button>
     328                                        </h4>
     329                                        <ul class="accordion-section-content" data-type="post_type" data-object="post"></ul>
     330                                </div>
     331                                                                <div id="available-menu-items-post_type-page" class="accordion-section">
     332                                        <h4 class="accordion-section-title" role="presentation">
     333                                                Page                                            <span class="spinner"></span>
     334                                                <span class="no-items">No items</span>
     335                                                <button type="button" class="not-a-button" aria-expanded="false">
     336                                                        <span class="screen-reader-text">Toggle section: Page</span>
     337                                                        <span class="toggle-indicator" aria-hidden="true"></span>
     338                                                </button>
     339                                        </h4>
     340                                        <ul class="accordion-section-content" data-type="post_type" data-object="page"></ul>
     341                                </div>
     342                                                                <div id="available-menu-items-taxonomy-category" class="accordion-section">
     343                                        <h4 class="accordion-section-title" role="presentation">
     344                                                Category                                                <span class="spinner"></span>
     345                                                <span class="no-items">No items</span>
     346                                                <button type="button" class="not-a-button" aria-expanded="false">
     347                                                        <span class="screen-reader-text">Toggle section: Category</span>
     348                                                        <span class="toggle-indicator" aria-hidden="true"></span>
     349                                                </button>
     350                                        </h4>
     351                                        <ul class="accordion-section-content" data-type="taxonomy" data-object="category"></ul>
     352                                </div>
     353                                                                <div id="available-menu-items-taxonomy-post_tag" class="accordion-section">
     354                                        <h4 class="accordion-section-title" role="presentation">
     355                                                Tag                                             <span class="spinner"></span>
     356                                                <span class="no-items">No items</span>
     357                                                <button type="button" class="not-a-button" aria-expanded="false">
     358                                                        <span class="screen-reader-text">Toggle section: Tag</span>
     359                                                        <span class="toggle-indicator" aria-hidden="true"></span>
     360                                                </button>
     361                                        </h4>
     362                                        <ul class="accordion-section-content" data-type="taxonomy" data-object="post_tag"></ul>
     363                                </div>
     364                                                                <div id="available-menu-items-taxonomy-post_format" class="accordion-section">
     365                                        <h4 class="accordion-section-title" role="presentation">
     366                                                Format                                          <span class="spinner"></span>
     367                                                <span class="no-items">No items</span>
     368                                                <button type="button" class="not-a-button" aria-expanded="false">
     369                                                        <span class="screen-reader-text">Toggle section: Format</span>
     370                                                        <span class="toggle-indicator" aria-hidden="true"></span>
     371                                                </button>
     372                                        </h4>
     373                                        <ul class="accordion-section-content" data-type="taxonomy" data-object="post_format"></ul>
     374                                </div>
     375                                                </div><!-- #available-menu-items -->
     376                        </div><!-- end nav menu templates -->
     377
    119378
    120379                <script src="../../src/wp-includes/js/tinymce/tinymce.js"></script>
    121380                <script src="editor/js/utils.js"></script>
  • tests/qunit/vendor/sinon-qunit.js

    diff --git tests/qunit/vendor/sinon-qunit.js tests/qunit/vendor/sinon-qunit.js
    index c26232f..a9dca78 100644
    sinon.config = { 
    5757            expected = null;
    5858        }
    5959
     60
    6061        return qTest(testName, expected, sinon.test(callback), async);
    6162    };
    6263}(this));
  • tests/qunit/wp-admin/js/customize-nav-menus.js

    diff --git tests/qunit/wp-admin/js/customize-nav-menus.js tests/qunit/wp-admin/js/customize-nav-menus.js
    index ba50106..45d16d2 100755
     
    11/* global wp */
    2 jQuery( function( ) {
     2jQuery( window ).load( function (){
    33
    44        var api = wp.customize,
    5         settings = window._wpCustomizeNavMenusSettings,
    6         navMenu = window.wpNavMenu;
    7        
    8         module( 'Customize Nav Menus', {
    9                 setup: function() {
    10             window._wpCustomizeNavMenusSettings = settings;
    11             window.wpNavMenu = navMenu;
    12                 },
    13                 teardown: function() {
    14                         // restore defaults
    15             window._wpCustomizeNavMenusSettings = settings;
    16             window.wpNavMenu = navMenu;
    17                 }
    18 
    19         });
     5                primaryMenuId = 3,
     6                socialMenuId = 2;
    207
     8        module( 'Customize Nav Menus' );
    219
    2210        /**
    2311         * Generate 20 ids and verify they are all unique.
    jQuery( function( ) { 
    2614                var testIterations = 20,
    2715                        ids = [ api.Menus.generatePlaceholderAutoIncrementId() ];
    2816
    29                 while( testIterations-- > 0 ) {
     17                while ( testIterations ) {
    3018                        var placeholderID = api.Menus.generatePlaceholderAutoIncrementId();
    3119
    3220                        ok( -1 === ids.indexOf( placeholderID ) );
    3321                        ids.push( placeholderID );
     22                        testIterations -= 1;
    3423                }
    3524
    3625        } );
    3726
    3827        test( 'it should parse _wpCustomizeMenusSettings.defaults into itself', function() {
    3928                deepEqual( window._wpCustomizeNavMenusSettings, api.Menus.data );
    40         });
     29        } );
     30
     31        test( 'empty menus should have no Menu Item Controls', function() {
     32                ok( 0 === wp.customize.Menus.getMenuControl( socialMenuId ).getMenuItemControls().length, 'empty menus' );
     33        } );
     34
     35        test( 'populated menus should have no Menu Item Controls', function() {
     36                ok( 0 !== wp.customize.Menus.getMenuControl( primaryMenuId ).getMenuItemControls().length, 'non-empty menus' );
     37        } );
     38
     39        // @todo Add tests for api.Menus.AvailableMenuItemsPanelView (and api.Menus.AvailableItemCollection, api.Menus.AvailableItemCollection, api.Menus.AvailableItemModel)
    4140
     41        test( 'there is a properly configured MenusPanel', function() {
     42                var panel, sections;
     43
     44                panel = api.panel( 'nav_menus' );
     45                ok( panel );
     46                ok( panel.extended( api.Menus.MenusPanel ) );
     47
     48                sections = panel.sections();
     49                ok( 'menu_locations' === sections[0].id, 'first section is menu_locations' );
     50                ok( sections[1].extended( api.Menus.MenuSection ), 'second section is MenuSection' );
     51                ok( sections[ sections.length - 1 ].extended( api.Menus.NewMenuSection ), 'last section is NewMenuSection' );
     52        } );
     53        // @todo Add more tests for api.Menus.MenusPanel behaviors
     54
     55        test( 'there an expected MenuSection for the primary menu', function() {
     56                var section, controls;
     57
     58                section = api.section( 'nav_menu[' + primaryMenuId + ']' );
     59                ok( section, 'section exists' );
     60                ok( section.extended( api.Menus.MenuSection ), 'section is a api.Menus.MenuSection' );
     61                ok( section.deferred.initSortables, 'has section.deferred.initSortables' );
     62                ok( section.active(), 'section active() is true' );
     63                ok( section.active.set( false ).get(), 'section active() cannot be set false' );
     64
     65                controls = section.controls();
     66                ok( controls[0].extended( api.Menus.MenuNameControl ), 'first control in menu section is MenuNameControl' );
     67                ok( controls[1].extended( api.Menus.MenuItemControl ), 'second control in menu section is MenuItemControl' );
     68                console.info( 'noep', controls[ controls.length - 1].id )
     69                ok( controls[ controls.length - 1 ].extended( api.Menus.MenuAutoAddControl ), 'last control in menu section is a MenuAutoAddControl' );
     70        } );
     71        // @todo Add more tests for api.Menus.MenuSection behaviors
     72
     73        test( 'changing a MenuNameControl change the corresponding menu value', function() {
     74                var section, control;
     75
     76                section = api.section( 'nav_menu[' + primaryMenuId + ']' );
     77                control = section.controls()[0];
     78                ok( control.extended( api.Menus.MenuNameControl ), 'control is a MenuNameControl' );
     79                equal( control.setting().name, 'Primary menu' );
     80                ok( ! control.setting._dirty );
     81                control.container.find( 'input[type=text]:first' ).val( 'Main menu' ).trigger( 'change' );
     82                equal( control.setting().name, 'Main menu' );
     83                ok( control.setting._dirty );
     84        } );
     85        // @todo Add more tests for api.Menus.MenuNameControl
     86
     87        test( 'manipulating a MenuItemControl works', function() {
     88                var section, control, value;
     89                section = api.section( 'nav_menu[' + primaryMenuId + ']' );
     90                ok( section );
     91
     92                control = section.controls()[1];
     93                ok( control.extended( api.Menus.MenuItemControl ), 'control is a MenuItemControl' );
     94
     95                control.actuallyEmbed();
     96
     97                control.container.find( '.edit-menu-item-title' ).val( 'Hello World' ).trigger( 'change' );
     98                equal( control.setting().title, 'Hello World' );
     99                value = _.clone( control.setting() );
     100                value.title = 'Hola Mundo';
     101                equal( control.container.find( '.edit-menu-item-title' ).val(), 'Hello World' );
     102                equal( value.position, 1 );
     103                equal( control.priority(), 1 );
     104
     105                // @todo test control.moveDown();
     106        } );
     107        // @todo Add more tests for api.Menus.MenuItemControl
     108
     109        // @todo Add tests for api.Menus.NewMenuSection
     110        // @todo Add tests for api.Menus.MenuLocationControl
     111        // @todo Add tests for api.Menus.MenuAutoAddControl
     112        // @todo Add tests for api.Menus.MenuControl
     113        // @todo Add tests for api.Menus.NewMenuControl
     114        // @todo Add tests for api.Menus.applySavedData
     115        // @todo Add tests for api.Menus.focusMenuItemControl
     116
     117        test( 'api.Menus.getMenuControl() should return the expected control', function() {
     118                var control = api.Menus.getMenuControl( primaryMenuId );
     119                ok( !! control, 'control is returned' );
     120                ok( control.extended( api.Menus.MenuControl ), 'control is a MenuControl' );
     121        } );
     122
     123        test( 'api.Menus.getMenuItemControl() should return the expected control', function() {
     124                var control = api.Menus.getMenuItemControl( 2000 );
     125                ok( !! control, 'control is returned' );
     126                ok( control.extended( api.Menus.MenuItemControl ), 'control is a MenuItemControl' );
     127        } );
    42128
    43 });
     129} );