customizer-menu.js (11916B)
1 (function (root, CP_Customizer, $) { 2 3 CP_Customizer.addModule(function (CP_Customizer) { 4 _.extend(CP_Customizer, { 5 menu: { 6 7 getGlobalOption: function(name, defaultValue){ 8 if (cpCustomizerGlobal && cpCustomizerGlobal.pluginOptions && cpCustomizerGlobal.pluginOptions.hasOwnProperty(name)) { 9 return cpCustomizerGlobal.pluginOptions[name]; 10 } 11 12 return defaultValue; 13 }, 14 15 getPrimaryLocationModName: function() { 16 var primaryLocation = this.getGlobalOption("primaryMenuLocation", "primary"); 17 return 'nav_menu_locations[' + primaryLocation + ']'; 18 }, 19 20 getHomeUrl: function() { 21 var primaryMenuHomeUrl = this.getGlobalOption("homeUrl", CP_Customizer.preview.data().siteURL); 22 return primaryMenuHomeUrl; 23 }, 24 25 canSetPrimaryLocation: function() { 26 var canSetPrimaryLocation = this.getGlobalOption("canSetPrimaryLocation", true); 27 return canSetPrimaryLocation; 28 }, 29 30 getPrimaryLocationDefaultLanguageMenu: function() { 31 var primaryLocationDefaultLanguageMenu = this.getGlobalOption("primaryLocationDefaultLanguageMenu", -1); 32 return primaryLocationDefaultLanguageMenu; 33 }, 34 35 createPrimaryMenu: function () { 36 var api = root.wp.customize; 37 var customizeId, 38 name = name || root.CP_Customizer.translateCompanionString("Main Menu"), 39 placeholderId = api.Menus.generatePlaceholderAutoIncrementId(); 40 41 customizeId = 'nav_menu[' + String(placeholderId) + ']'; 42 43 api.create(customizeId, customizeId, {}, { 44 type: 'nav_menu', 45 transport: api.Menus.data.settingTransport, 46 previewer: api.previewer 47 }); 48 49 api(customizeId).set($.extend({}, 50 api.Menus.data.defaultSettingValues.nav_menu, { 51 name: name 52 } 53 )); 54 55 56 menuSection = new api.Menus.MenuSection(customizeId, { 57 params: { 58 id: customizeId, 59 panel: 'nav_menus', 60 title: name, 61 customizeAction: api.Menus.data.l10n.customizingMenus, 62 type: 'nav_menu', 63 priority: 10, 64 menu_id: placeholderId 65 } 66 }); 67 api.section.add(customizeId, menuSection); 68 69 if (this.canSetPrimaryLocation()) { 70 // set location 71 api(this.getPrimaryLocationModName()).set(placeholderId); 72 } 73 74 var defaultMenu = this.getPrimaryLocationDefaultLanguageMenu(); 75 76 if (defaultMenu !== -1) { 77 wp.customize.bind("save-request-params", function (query) { 78 query.icl_translation_of = defaultMenu; 79 return query; 80 }); 81 } 82 83 84 // create home page menu item; 85 86 this.addAnchorToPrimaryMenu('#page-top', 'Home'); 87 }, 88 89 90 getPrimaryMenuID: function () { 91 var menuId = wp.customize(this.getPrimaryLocationModName()).get(); 92 if (wp.customize('nav_menu[' + menuId + ']')) { 93 return menuId; 94 } else { 95 return false; 96 } 97 }, 98 99 getPrimaryMenu: function () { 100 var menuId = CP_Customizer.menu.getPrimaryMenuID(); 101 if (menuId !== false) { 102 return wp.customize('nav_menu[' + menuId + ']').get(); 103 } else { 104 return false; 105 } 106 }, 107 108 focusPrimaryMenuCustomize: function () { 109 var menuId = CP_Customizer.menu.getPrimaryMenuID(); 110 if (menuId !== false) { 111 wp.customize.section('nav_menu[' + menuId + ']').focus(); 112 return true; 113 } 114 115 return false; 116 }, 117 118 getPrimaryMenuControl: function () { 119 var api = root.wp.customize; 120 var menuId = CP_Customizer.menu.getPrimaryMenuID(); 121 122 if (menuId) { 123 return api.Menus.getMenuControl(menuId); 124 } else { 125 return false; 126 } 127 }, 128 129 addAnchorToPrimaryMenu: function (anchor, title) { 130 var api = root.wp.customize; 131 var customizeId, placeholderId, settingArgs, setting, menuItemControl, menuId, menuControl, position = 0, 132 priority = 10; 133 134 menuId = CP_Customizer.menu.getPrimaryMenuID(); 135 menuControl = CP_Customizer.menu.getPrimaryMenuControl(); 136 137 if (!menuId || !menuControl) { 138 return; 139 } 140 141 _.each(menuControl.getMenuItemControls(), function (control) { 142 if (false === control.setting()) { 143 return; 144 } 145 priority = Math.max(priority, control.priority()); 146 if (0 === control.setting().menu_item_parent) { 147 position = Math.max(position, control.setting().position); 148 } 149 }); 150 position += 1; 151 priority += 1; 152 153 var url = CP_Customizer.menu.getHomeUrl(); 154 if (anchor.replace(/#/, '').length) { 155 url = CP_Customizer.preview.data().pageURL + "#" + anchor.replace(/#/, ''); 156 } 157 158 var item = $.extend({}, 159 api.Menus.data.defaultSettingValues.nav_menu_item, { 160 'title': title, 161 'url': url, 162 'type': 'custom', 163 'type_label': api.Menus.data.l10n.custom_label, 164 'object': 'custom' 165 }, { 166 nav_menu_term_id: menuId, 167 original_title: title, 168 position: position 169 }); 170 171 172 placeholderId = api.Menus.generatePlaceholderAutoIncrementId(); 173 customizeId = 'nav_menu_item[' + String(placeholderId) + ']'; 174 settingArgs = { 175 type: 'nav_menu_item', 176 transport: api.Menus.data.settingTransport, 177 previewer: api.previewer 178 }; 179 180 setting = api.create(customizeId, customizeId, {}, settingArgs); 181 setting.set(item); 182 183 menuItemControl = new api.controlConstructor.nav_menu_item(customizeId, { 184 params: { 185 type: 'nav_menu_item', 186 content: '<li id="customize-control-nav_menu_item-' + String(placeholderId) + '" class="customize-control customize-control-nav_menu_item"></li>', 187 section: menuControl.id, 188 priority: priority, 189 active: true, 190 settings: { 191 'default': customizeId 192 }, 193 menu_item_id: placeholderId 194 }, 195 previewer: api.previewer 196 }); 197 198 api.control.add(customizeId, menuItemControl); 199 menuControl.debouncedReflowMenuItems(); 200 201 202 203 }, 204 205 anchorExistsInPrimaryMenu: function (anchor) { 206 var menuControl = CP_Customizer.menu.getPrimaryMenuControl(); 207 208 if (!menuControl) { 209 return false; 210 } 211 212 anchor = anchor.replace(/#/, ''); 213 214 var itemsControl = menuControl.getMenuItemControls(); 215 for (var i = 0; i < itemsControl.length; i++) { 216 var itemControl = itemsControl[i]; 217 var url = (itemControl.setting.get().url || "").split("#").pop().trim(); 218 if (url === anchor) { 219 return true; 220 } 221 } 222 223 return false; 224 }, 225 226 227 updatePrimaryMenuAnchor: function (oldAnchor, options) { 228 var menuControl = CP_Customizer.menu.getPrimaryMenuControl(); 229 230 if (!menuControl) { 231 return false; 232 } 233 234 oldAnchor = oldAnchor.replace(/#/, ''); 235 var newAnchor = options.anchor.replace(/#/, ''); 236 var title = options.title; 237 238 var itemsControl = menuControl.getMenuItemControls(); 239 for (var i = 0; i < itemsControl.length; i++) { 240 var itemControl = itemsControl[i]; 241 var url = (itemControl.setting.get().url || "").split("#").pop().trim(); 242 if (url === oldAnchor) { 243 var itemData = itemControl.setting(); 244 if (itemData) { 245 itemData = _.clone(itemData); 246 itemData.title = title; 247 itemData.url = CP_Customizer.preview.data().pageURL + "#" + newAnchor; 248 itemControl.setting.set(itemData); 249 return true; 250 } 251 } 252 } 253 254 return false; 255 }, 256 257 removeAnchorFromPrimaryMenu: function (anchor) { 258 var api = root.wp.customize; 259 var menuControl = CP_Customizer.menu.getPrimaryMenuControl(); 260 261 if (!menuControl) { 262 return false; 263 } 264 265 anchor = anchor.replace(/#/, ''); 266 267 var itemsControl = menuControl.getMenuItemControls(); 268 for (var i = 0; i < itemsControl.length; i++) { 269 var itemControl = itemsControl[i]; 270 var url = (itemControl.setting.get().url || "").split("#").pop(); 271 if (url === anchor) { 272 itemControl.setting.set(false); 273 api.control.remove(itemControl.id); 274 return true; 275 } 276 } 277 278 return false; 279 } 280 } 281 }); 282 }); 283 284 })(window, CP_Customizer, jQuery);