[ Index ] |
PHP Cross Reference of BuddyPress |
[Summary view] [Print] [Text view]
1 /* global wp, BP_Nouveau, JSON */ 2 /* jshint devel: true */ 3 /* jshint browser: true */ 4 /* @since 3.0.0 */ 5 /* @version 10.0.0 */ 6 window.wp = window.wp || {}; 7 window.bp = window.bp || {}; 8 9 ( function( bp, $ ) { 10 11 // Bail if not set. 12 if ( typeof BP_Nouveau === 'undefined' ) { 13 return; 14 } 15 16 /** 17 * [Nouveau description] 18 * @type {Object} 19 */ 20 bp.Nouveau = { 21 /** 22 * [start description] 23 * @return {[type]} [description] 24 */ 25 start: function() { 26 27 // Setup globals. 28 this.setupGlobals(); 29 30 // Adjust Document/Forms properties. 31 this.prepareDocument(); 32 33 // Init the BuddyPress objects. 34 this.initObjects(); 35 36 // Set BuddyPress HeartBeat. 37 this.setHeartBeat(); 38 39 // Listen to events ("Add hooks!"). 40 this.addListeners(); 41 }, 42 43 /** 44 * [setupGlobals description] 45 * @return {[type]} [description] 46 */ 47 setupGlobals: function() { 48 this.ajax_request = null; 49 50 // Object Globals. 51 this.objects = $.map( BP_Nouveau.objects, function( value ) { return value; } ); 52 this.objectNavParent = BP_Nouveau.object_nav_parent; 53 54 // HeartBeat Global. 55 this.heartbeat = wp.heartbeat || {}; 56 57 // An object containing each query var. 58 this.querystring = this.getLinkParams(); 59 }, 60 61 /** 62 * [prepareDocument description] 63 * @return {[type]} [description] 64 */ 65 prepareDocument: function() { 66 67 // Remove the no-js class and add the js one. 68 if ( $( 'body' ).hasClass( 'no-js' ) ) { 69 $('body').removeClass( 'no-js' ).addClass( 'js' ); 70 } 71 72 // Log Warnings into the console instead of the screen. 73 if ( BP_Nouveau.warnings && 'undefined' !== typeof console && console.warn ) { 74 $.each( BP_Nouveau.warnings, function( w, warning ) { 75 console.warn( warning ); 76 } ); 77 } 78 79 // Remove the directory title if there's a widget containing it. 80 if ( $( '.buddypress_object_nav .widget-title' ).length ) { 81 var text = $( '.buddypress_object_nav .widget-title' ).html(); 82 83 $( 'body' ).find( '*:contains("' + text + '")' ).each( function( e, element ) { 84 if ( ! $( element ).hasClass( 'widget-title' ) && text === $( element ).html() && ! $( element ).is( 'a' ) ) { 85 $( element ).remove(); 86 } 87 } ); 88 } 89 }, 90 91 /** Helpers *******************************************************************/ 92 93 /** 94 * [getStorage description] 95 * @param {[type]} type [description] 96 * @param {[type]} property [description] 97 * @return {[type]} [description] 98 */ 99 getStorage: function( type, property ) { 100 var store = sessionStorage.getItem( type ); 101 102 if ( store ) { 103 store = JSON.parse( store ); 104 } else { 105 store = {}; 106 } 107 108 if ( undefined !== property ) { 109 return store[property] || false; 110 } 111 112 return store; 113 }, 114 115 /** 116 * [setStorage description] 117 * @param {[type]} type [description] 118 * @param {[type]} property [description] 119 * @param {[type]} value [description] 120 */ 121 setStorage: function( type, property, value ) { 122 var store = this.getStorage( type ); 123 124 if ( undefined === value && undefined !== store[ property ] ) { 125 delete store[ property ]; 126 } else { 127 // Set property. 128 store[ property ] = value; 129 } 130 131 sessionStorage.setItem( type, JSON.stringify( store ) ); 132 133 return sessionStorage.getItem( type ) !== null; 134 }, 135 136 /** 137 * [getLinkParams description] 138 * @param {[type]} url [description] 139 * @param {[type]} param [description] 140 * @return {[type]} [description] 141 */ 142 getLinkParams: function( url, param ) { 143 var qs; 144 if ( url ) { 145 qs = ( -1 !== url.indexOf( '?' ) ) ? '?' + url.split( '?' )[1] : ''; 146 } else { 147 qs = document.location.search; 148 } 149 150 if ( ! qs ) { 151 return null; 152 } 153 154 var params = qs.replace( /(^\?)/, '' ).split( '&' ).map( function( n ) { 155 return n = n.split( '=' ), this[n[0]] = n[1], this; 156 }.bind( {} ) )[0]; 157 158 if ( param ) { 159 return params[param]; 160 } 161 162 return params; 163 }, 164 165 /** 166 * URL Decode a query variable. 167 * 168 * @param {string} qv The query variable to decode. 169 * @param {object} chars The specific characters to use. Optional. 170 * @return {string} The URL decoded variable. 171 */ 172 urlDecode: function( qv, chars ) { 173 var specialChars = chars || { 174 amp: '&', 175 lt: '<', 176 gt: '>', 177 quot: '"', 178 '#039': '\'' 179 }; 180 181 return decodeURIComponent( qv.replace( /\+/g, ' ' ) ).replace( /&([^;]+);/g, function( v, q ) { 182 return specialChars[q] || ''; 183 } ); 184 }, 185 186 /** 187 * [ajax description] 188 * @param {[type]} post_data [description] 189 * @param {[type]} object [description] 190 * @return {[type]} [description] 191 */ 192 ajax: function( post_data, object ) { 193 if ( this.ajax_request ) { 194 this.ajax_request.abort(); 195 } 196 197 // Extend posted data with stored data and object nonce. 198 var postData = $.extend( {}, bp.Nouveau.getStorage( 'bp-' + object ), { nonce: BP_Nouveau.nonces[object] }, post_data ); 199 200 if ( undefined !== BP_Nouveau.customizer_settings ) { 201 postData.customized = BP_Nouveau.customizer_settings; 202 } 203 204 this.ajax_request = $.post( BP_Nouveau.ajaxurl, postData, 'json' ); 205 206 return this.ajax_request; 207 }, 208 209 inject: function( selector, content, method ) { 210 if ( ! $( selector ).length || ! content ) { 211 return; 212 } 213 214 /** 215 * How the content should be injected in the selector 216 * 217 * possible methods are 218 * - reset: the selector will be reset with the content 219 * - append: the content will be added after selector's content 220 * - prepend: the content will be added before selector's content 221 */ 222 method = method || 'reset'; 223 224 if ( 'append' === method ) { 225 $( selector ).append( content ); 226 } else if ( 'prepend' === method ) { 227 $( selector ).prepend( content ); 228 } else { 229 $( selector ).html( content ); 230 } 231 232 if ( 'undefined' !== typeof bp_mentions || 'undefined' !== typeof bp.mentions ) { 233 $( '.bp-suggestions' ).bp_mentions( bp.mentions.users ); 234 } 235 }, 236 237 /** 238 * [objectRequest description] 239 * @param {[type]} data [description] 240 * @return {[type]} [description] 241 */ 242 objectRequest: function( data ) { 243 var postdata = {}, self = this; 244 245 data = $.extend( { 246 object : '', 247 scope : null, 248 filter : null, 249 target : '#buddypress [data-bp-list]', 250 search_terms : '', 251 page : 1, 252 extras : null, 253 caller : null, 254 template : null, 255 method : 'reset' 256 }, data ); 257 258 // Do not request if we don't have the object or the target to inject results into. 259 if ( ! data.object || ! data.target ) { 260 return; 261 } 262 263 // Prepare the search terms for the request. 264 if ( data.search_terms ) { 265 data.search_terms = data.search_terms.replace( /</g, '<' ).replace( />/g, '>' ); 266 } 267 268 // Set session's data. 269 if ( null !== data.scope ) { 270 this.setStorage( 'bp-' + data.object, 'scope', data.scope ); 271 } 272 273 if ( null !== data.filter ) { 274 this.setStorage( 'bp-' + data.object, 'filter', data.filter ); 275 } 276 277 if ( null !== data.extras ) { 278 this.setStorage( 'bp-' + data.object, 'extras', data.extras ); 279 } 280 281 /* Set the correct selected nav and filter */ 282 $( this.objectNavParent + ' [data-bp-object]' ).each( function() { 283 $( this ).removeClass( 'selected loading' ); 284 } ); 285 286 $( this.objectNavParent + ' [data-bp-scope="' + data.scope + '"], #object-nav li.current' ).addClass( 'selected loading' ); 287 $( '#buddypress [data-bp-filter="' + data.object + '"] option[value="' + data.filter + '"]' ).prop( 'selected', true ); 288 289 if ( 'friends' === data.object || 'friend_requests' === data.object || 'group_members' === data.object ) { 290 data.template = data.object; 291 data.object = 'members'; 292 } else if ( 'group_requests' === data.object ) { 293 data.object = 'groups'; 294 data.template = 'group_requests'; 295 } else if ( 'notifications' === data.object ) { 296 data.object = 'members'; 297 data.template = 'member_notifications'; 298 } 299 300 postdata = $.extend( { 301 action: data.object + '_filter' 302 }, data ); 303 304 return this.ajax( postdata, data.object ).done( function( response ) { 305 if ( false === response.success ) { 306 return; 307 } 308 309 var selectedObjectNavParent = $( self.objectNavParent + ' [data-bp-scope="' + data.scope + '"]' ); 310 311 selectedObjectNavParent.removeClass( 'loading' ); 312 313 if ( response.data && response.data.totalItems && response.data.navLabel ) { 314 selectedObjectNavParent.find( 'a' ).first().html( 315 response.data.navLabel + ' ' 316 ).append( $( '<span></span>' ).addClass( 'count' ).html( response.data.totalItems ) ); 317 } 318 319 if ( 'reset' !== data.method ) { 320 self.inject( data.target, response.data.contents, data.method ); 321 322 $( data.target ).trigger( 'bp_ajax_' + data.method, $.extend( data, { response: response.data } ) ); 323 } else { 324 /* animate to top if called from bottom pagination */ 325 if ( data.caller === 'pag-bottom' && $( '#subnav' ).length ) { 326 var top = $('#subnav').parent(); 327 $( 'html,body' ).animate( { scrollTop: top.offset().top }, 'slow', function() { 328 $( data.target ).fadeOut( 100, function() { 329 self.inject( this, response.data.contents, data.method ); 330 $( this ).fadeIn( 100, 'swing', function(){ 331 // Inform other scripts the list of objects has been refreshed. 332 $( data.target ).trigger( 'bp_ajax_request', $.extend( data, { response: response.data } ) ); 333 } ); 334 } ); 335 } ); 336 337 } else { 338 $( data.target ).fadeOut( 100, function() { 339 self.inject( this, response.data.contents, data.method ); 340 $( this ).fadeIn( 100, 'swing', function(){ 341 // Inform other scripts the list of objects has been refreshed. 342 $( data.target ).trigger( 'bp_ajax_request', $.extend( data, { response: response.data } ) ); 343 } ); 344 } ); 345 } 346 } 347 } ); 348 }, 349 350 /** 351 * [initObjects description] 352 * @return {[type]} [description] 353 */ 354 initObjects: function() { 355 var self = this, objectData = {}, queryData = {}, scope = 'all', search_terms = '', extras = null, filter = null; 356 357 $.each( this.objects, function( o, object ) { 358 objectData = self.getStorage( 'bp-' + object ); 359 360 if ( undefined !== objectData.scope ) { 361 scope = objectData.scope; 362 } 363 364 // Notifications always need to start with Newest ones. 365 if ( undefined !== objectData.extras && 'notifications' !== object ) { 366 extras = objectData.extras; 367 } 368 369 if ( $( '#buddypress [data-bp-filter="' + object + '"]' ).length ) { 370 if ( '-1' !== $( '#buddypress [data-bp-filter="' + object + '"]' ).val() && '0' !== $( '#buddypress [data-bp-filter="' + object + '"]' ).val() ) { 371 filter = $( '#buddypress [data-bp-filter="' + object + '"]' ).val(); 372 } else if ( undefined !== objectData.filter ) { 373 filter = objectData.filter, 374 $( '#buddypress [data-bp-filter="' + object + '"] option[value="' + filter + '"]' ).prop( 'selected', true ); 375 } 376 } 377 378 if ( $( this.objectNavParent + ' [data-bp-object="' + object + '"]' ).length ) { 379 $( this.objectNavParent + ' [data-bp-object="' + object + '"]' ).each( function() { 380 $( this ).removeClass( 'selected' ); 381 } ); 382 383 $( this.objectNavParent + ' [data-bp-scope="' + object + '"], #object-nav li.current' ).addClass( 'selected' ); 384 } 385 386 // Check the querystring to eventually include the search terms. 387 if ( null !== self.querystring ) { 388 if ( undefined !== self.querystring[ object + '_search'] ) { 389 search_terms = self.querystring[ object + '_search']; 390 } else if ( undefined !== self.querystring.s ) { 391 search_terms = self.querystring.s; 392 } 393 394 if ( search_terms ) { 395 search_terms = self.urlDecode( search_terms ); 396 $( '#buddypress [data-bp-search="' + object + '"] input[type=search]' ).val( search_terms ); 397 } 398 } 399 400 if ( $( '#buddypress [data-bp-list="' + object + '"]' ).length ) { 401 queryData = { 402 object : object, 403 scope : scope, 404 filter : filter, 405 search_terms : search_terms, 406 extras : extras 407 }; 408 409 // Populate the object list. 410 self.objectRequest( queryData ); 411 } 412 } ); 413 }, 414 415 /** 416 * [setHeartBeat description] 417 */ 418 setHeartBeat: function() { 419 if ( typeof BP_Nouveau.pulse === 'undefined' || ! this.heartbeat ) { 420 return; 421 } 422 423 this.heartbeat.interval( Number( BP_Nouveau.pulse ) ); 424 425 // Extend "send" with BuddyPress namespace. 426 $.fn.extend( { 427 'heartbeat-send': function() { 428 return this.bind( 'heartbeat-send.buddypress' ); 429 } 430 } ); 431 432 // Extend "tick" with BuddyPress namespace. 433 $.fn.extend( { 434 'heartbeat-tick': function() { 435 return this.bind( 'heartbeat-tick.buddypress' ); 436 } 437 } ); 438 }, 439 440 /** Event Listeners ***********************************************************/ 441 442 /** 443 * [addListeners description] 444 */ 445 addListeners: function() { 446 // Disabled inputs. 447 $( '[data-bp-disable-input]' ).on( 'change', this.toggleDisabledInput ); 448 449 // HeartBeat Send and Receive. 450 $( document ).on( 'heartbeat-send.buddypress', this.heartbeatSend ); 451 $( document ).on( 'heartbeat-tick.buddypress', this.heartbeatTick ); 452 453 // Refreshing. 454 $( this.objectNavParent + ' .bp-navs' ).on( 'click', 'a', this, this.scopeQuery ); 455 456 // Filtering. 457 $( '#buddypress [data-bp-filter]' ).on( 'change', this, this.filterQuery ); 458 459 // Searching. 460 $( '#buddypress [data-bp-search]' ).on( 'submit', 'form', this, this.searchQuery ); 461 $( '#buddypress [data-bp-search] form' ).on( 'search', 'input[type=search]', this.resetSearch ); 462 463 // Buttons. 464 $( '#buddypress [data-bp-list], #buddypress #item-header' ).on( 'click', '[data-bp-btn-action]', this, this.buttonAction ); 465 466 // Close notice. 467 $( '#buddypress [data-bp-close]' ).on( 'click', this, this.closeNotice ); 468 469 // Pagination. 470 $( '#buddypress [data-bp-list]' ).on( 'click', '[data-bp-pagination] a', this, this.paginateAction ); 471 472 // Password updates. 473 if ( BP_Nouveau.bpPasswordVerify && BP_Nouveau.bpPasswordVerify.requiredPassStrength ) { 474 $( '#pass1' ).on( 'input pwupdate', this.checkPassStrength ); 475 } 476 }, 477 478 /** Event Callbacks ***********************************************************/ 479 480 /** 481 * Toggle the availability of Delete My account button. 482 * 483 * @param {Object} event The change event. 484 */ 485 toggleDisabledInput: function( event ) { 486 var target = $( event.currentTarget ), disabledControl = '#' + target.data( 'bp-disable-input' ), 487 isChecked = target.prop( 'checked' ); 488 489 target.removeClass( 'enabled disabled' ); 490 491 if ( isChecked ) { 492 target.addClass( 'enabled' ); 493 $( disabledControl ).prop( 'disabled', false ); 494 } else { 495 $( disabledControl ).prop( 'disabled', true ); 496 target.addClass( 'disabled' ); 497 } 498 }, 499 500 /** 501 * [heartbeatSend description] 502 * @param {[type]} event [description] 503 * @param {[type]} data [description] 504 * @return {[type]} [description] 505 */ 506 heartbeatSend: function( event, data ) { 507 // Add an heartbeat send event to possibly any BuddyPress pages. 508 $( '#buddypress' ).trigger( 'bp_heartbeat_send', data ); 509 }, 510 511 /** 512 * [heartbeatTick description] 513 * @param {[type]} event [description] 514 * @param {[type]} data [description] 515 * @return {[type]} [description] 516 */ 517 heartbeatTick: function( event, data ) { 518 // Add an heartbeat send event to possibly any BuddyPress pages. 519 $( '#buddypress' ).trigger( 'bp_heartbeat_tick', data ); 520 }, 521 522 /** 523 * [queryScope description] 524 * @param {[type]} event [description] 525 * @return {[type]} [description] 526 */ 527 scopeQuery: function( event ) { 528 var self = event.data, target = $( event.currentTarget ).parent(), 529 scope = 'all', object, filter = null, search_terms = ''; 530 531 if ( target.hasClass( 'no-ajax' ) || $( event.currentTarget ).hasClass( 'no-ajax' ) || ! target.attr( 'data-bp-scope' ) ) { 532 return event; 533 } 534 535 scope = target.data( 'bp-scope' ); 536 object = target.data( 'bp-object' ); 537 538 if ( ! scope || ! object ) { 539 return event; 540 } 541 542 // Stop event propagation. 543 event.preventDefault(); 544 545 filter = $( '#buddypress' ).find( '[data-bp-filter="' + object + '"]' ).first().val(); 546 547 if ( $( '#buddypress [data-bp-search="' + object + '"] input[type=search]' ).length ) { 548 search_terms = $( '#buddypress [data-bp-search="' + object + '"] input[type=search]' ).val(); 549 } 550 551 // Remove the New count on dynamic tabs. 552 if ( target.hasClass( 'dynamic' ) ) { 553 target.find( 'a span' ).html(''); 554 } 555 556 self.objectRequest( { 557 object : object, 558 scope : scope, 559 filter : filter, 560 search_terms : search_terms, 561 page : 1 562 } ); 563 }, 564 565 /** 566 * [filterQuery description] 567 * @param {[type]} event [description] 568 * @return {[type]} [description] 569 */ 570 filterQuery: function( event ) { 571 var self = event.data, object = $( event.target ).data( 'bp-filter' ), 572 scope = 'all', filter = $( event.target ).val(), 573 search_terms = '', template = null; 574 575 if ( ! object ) { 576 return event; 577 } 578 579 if ( $( self.objectNavParent + ' [data-bp-object].selected' ).length ) { 580 scope = $( self.objectNavParent + ' [data-bp-object].selected' ).data( 'bp-scope' ); 581 } 582 583 if ( $( '#buddypress [data-bp-search="' + object + '"] input[type=search]' ).length ) { 584 search_terms = $( '#buddypress [data-bp-search="' + object + '"] input[type=search]' ).val(); 585 } 586 587 self.objectRequest( { 588 object : object, 589 scope : scope, 590 filter : filter, 591 search_terms : search_terms, 592 page : 1, 593 template : template 594 } ); 595 }, 596 597 /** 598 * [searchQuery description] 599 * @param {[type]} event [description] 600 * @return {[type]} [description] 601 */ 602 searchQuery: function( event ) { 603 var self = event.data, object, scope = 'all', filter = null, template = null, search_terms = ''; 604 605 if ( $( event.delegateTarget ).hasClass( 'no-ajax' ) || undefined === $( event.delegateTarget ).data( 'bp-search' ) ) { 606 return event; 607 } 608 609 // Stop event propagation. 610 event.preventDefault(); 611 612 object = $( event.delegateTarget ).data( 'bp-search' ); 613 filter = $( '#buddypress' ).find( '[data-bp-filter="' + object + '"]' ).first().val(); 614 search_terms = $( event.delegateTarget ).find( 'input[type=search]' ).first().val(); 615 616 if ( $( self.objectNavParent + ' [data-bp-object]' ).length ) { 617 scope = $( self.objectNavParent + ' [data-bp-object="' + object + '"].selected' ).data( 'bp-scope' ); 618 } 619 620 self.objectRequest( { 621 object : object, 622 scope : scope, 623 filter : filter, 624 search_terms : search_terms, 625 page : 1, 626 template : template 627 } ); 628 }, 629 630 /** 631 * [showSearchSubmit description] 632 * @param {[type]} event [description] 633 * @return {[type]} [description] 634 */ 635 showSearchSubmit: function( event ) { 636 $( event.delegateTarget ).find( '[type=submit]' ).addClass( 'bp-show' ); 637 if( $('[type=submit]').hasClass( 'bp-hide' ) ) { 638 $( '[type=submit]' ).removeClass( 'bp-hide' ); 639 } 640 }, 641 642 /** 643 * [resetSearch description] 644 * @param {[type]} event [description] 645 * @return {[type]} [description] 646 */ 647 resetSearch: function( event ) { 648 if ( ! $( event.target ).val() ) { 649 $( event.delegateTarget ).submit(); 650 } else { 651 $( event.delegateTarget ).find( '[type=submit]' ).show(); 652 } 653 }, 654 655 /** 656 * [buttonAction description] 657 * @param {[type]} event [description] 658 * @return {[type]} [description] 659 */ 660 buttonAction: function( event ) { 661 var self = event.data, target = $( event.currentTarget ), action = target.data( 'bp-btn-action' ), nonceUrl = target.data( 'bp-nonce' ), 662 item = target.closest( '[data-bp-item-id]' ), item_id = item.data( 'bp-item-id' ), item_inner = target.closest('.list-wrap'), 663 object = item.data( 'bp-item-component' ), nonce = ''; 664 665 // Simply let the event fire if we don't have needed values. 666 if ( ! action || ! item_id || ! object ) { 667 return event; 668 } 669 670 // Stop event propagation. 671 event.preventDefault(); 672 673 if ( ( undefined !== BP_Nouveau[ action + '_confirm'] && false === window.confirm( BP_Nouveau[ action + '_confirm'] ) ) || target.hasClass( 'pending' ) ) { 674 return false; 675 } 676 677 // If the nonceUrl is not set, use the `href` attribute. 678 if ( ! nonceUrl ) { 679 nonceUrl = target.prop( 'href' ); 680 } 681 682 // Set the nonce. 683 nonce = self.getLinkParams( nonceUrl, '_wpnonce' ); 684 685 // Unfortunately unlike groups 686 // Friends actions does not match the wpnonce 687 var friends_actions_map = { 688 is_friend : 'remove_friend', 689 not_friends : 'add_friend', 690 pending : 'withdraw_friendship', 691 accept_friendship : 'accept_friendship', 692 reject_friendship : 'reject_friendship' 693 }; 694 695 if ( 'members' === object && undefined !== friends_actions_map[ action ] ) { 696 action = friends_actions_map[ action ]; 697 object = 'friends'; 698 } 699 700 // Add a pending class to prevent queries while we're processing the action. 701 target.addClass( 'pending loading' ); 702 703 self.ajax( { 704 action : object + '_' + action, 705 item_id : item_id, 706 _wpnonce : nonce 707 }, object ).done( function( response ) { 708 if ( false === response.success ) { 709 item_inner.prepend( response.data.feedback ); 710 target.removeClass( 'pending loading' ); 711 item.find( '.bp-feedback' ).fadeOut( 6000 ); 712 } else { 713 // Specific cases for groups. 714 if ( 'groups' === object ) { 715 716 // Group's header button. 717 if ( undefined !== response.data.is_group && response.data.is_group ) { 718 return window.location.reload(); 719 } 720 } 721 722 // User's groups invitations screen & User's friend screens. 723 if ( undefined !== response.data.is_user && response.data.is_user ) { 724 target.parent().html( response.data.feedback ); 725 item.fadeOut( 1500 ); 726 return; 727 } 728 729 // Update count. 730 if ( $( self.objectNavParent + ' [data-bp-scope="personal"]' ).length ) { 731 var personal_count = Number( $( self.objectNavParent + ' [data-bp-scope="personal"] span' ).html() ) || 0; 732 733 if ( -1 !== $.inArray( action, ['leave_group', 'remove_friend'] ) ) { 734 personal_count -= 1; 735 } else if ( -1 !== $.inArray( action, ['join_group'] ) ) { 736 personal_count += 1; 737 } 738 739 if ( personal_count < 0 ) { 740 personal_count = 0; 741 } 742 743 $( self.objectNavParent + ' [data-bp-scope="personal"] span' ).html( personal_count ); 744 } 745 746 target.parent().replaceWith( response.data.contents ); 747 } 748 } ); 749 }, 750 751 /** 752 * [closeNotice description] 753 * @param {[type]} event [description] 754 * @return {[type]} [description] 755 */ 756 closeNotice: function( event ) { 757 var closeBtn = $( event.currentTarget ); 758 759 event.preventDefault(); 760 761 // Make sure cookies are removed. 762 if ( 'clear' === closeBtn.data( 'bp-close' ) ) { 763 if ( undefined !== $.cookie( 'bp-message' ) ) { 764 $.removeCookie( 'bp-message' ); 765 } 766 767 if ( undefined !== $.cookie( 'bp-message-type' ) ) { 768 $.removeCookie( 'bp-message-type' ); 769 } 770 } 771 772 // @todo other cases... 773 // Dismissing site-wide notices. 774 if ( closeBtn.closest( '.bp-feedback' ).hasClass( 'bp-sitewide-notice' ) ) { 775 bp.Nouveau.ajax( { 776 action : 'messages_dismiss_sitewide_notice' 777 }, 'messages' ); 778 } 779 780 // Remove the notice. 781 closeBtn.closest( '.bp-feedback' ).remove(); 782 }, 783 784 paginateAction: function( event ) { 785 var self = event.data, navLink = $( event.currentTarget ), pagArg, 786 scope = null, object, objectData, filter = null, search_terms = null, extras = null; 787 788 pagArg = navLink.closest( '[data-bp-pagination]' ).data( 'bp-pagination' ) || null; 789 790 if ( null === pagArg ) { 791 return event; 792 } 793 794 event.preventDefault(); 795 796 object = $( event.delegateTarget ).data( 'bp-list' ) || null; 797 798 // Set the scope & filter. 799 if ( null !== object ) { 800 objectData = self.getStorage( 'bp-' + object ); 801 802 if ( undefined !== objectData.scope ) { 803 scope = objectData.scope; 804 } 805 806 if ( undefined !== objectData.filter ) { 807 filter = objectData.filter; 808 } 809 810 if ( undefined !== objectData.extras ) { 811 extras = objectData.extras; 812 } 813 } 814 815 // Set the search terms. 816 if ( $( '#buddypress [data-bp-search="' + object + '"] input[type=search]' ).length ) { 817 search_terms = $( '#buddypress [data-bp-search="' + object + '"] input[type=search]' ).val(); 818 } 819 820 var queryData = { 821 object : object, 822 scope : scope, 823 filter : filter, 824 search_terms : search_terms, 825 extras : extras, 826 page : self.getLinkParams( navLink.prop( 'href' ), pagArg ) || 1 827 }; 828 829 // Request the page. 830 self.objectRequest( queryData ); 831 }, 832 833 checkPassStrength: function( event ) { 834 var bpPasswordVerify = BP_Nouveau.bpPasswordVerify, strength, 835 requiredStrength = parseInt( bpPasswordVerify.requiredPassStrength, 10 ), 836 pass1 = $( event.currentTarget ).val(), pass2 = $( '#pass2' ).val(), 837 currentForm = $( event.currentTarget ).closest( 'form' ); 838 839 840 // wp.passwordStrength.userInputBlacklist() has been deprecated in WP 5.5.0. 841 if ( 'function' === typeof wp.passwordStrength.userInputDisallowedList ) { 842 strength = wp.passwordStrength.meter( pass1, wp.passwordStrength.userInputDisallowedList(), pass2 ); 843 } else { 844 strength = wp.passwordStrength.meter( pass1, wp.passwordStrength.userInputBlacklist(), pass2 ); 845 } 846 847 if ( requiredStrength && 4 >= requiredStrength ) { 848 var passwordWarningContainer = $( currentForm ).find( '#password-warning' ); 849 850 if ( strength < requiredStrength ) { 851 if ( ! $( passwordWarningContainer ).length ) { 852 $( event.currentTarget ).before( 853 $( '<p></p>' ).prop( 'id', 'password-warning' ) 854 .addClass( 'description' ) 855 ); 856 } 857 858 $( passwordWarningContainer ).html( bpPasswordVerify.tooWeakPasswordWarning ); 859 } else if ( $( passwordWarningContainer ).length ) { 860 $( passwordWarningContainer ).remove(); 861 } 862 863 if ( ! $( currentForm ).find( '#password-strength-score' ).length ) { 864 $( currentForm ).prepend( 865 $('<input></input>').prop( { 866 id: 'password-strength-score', 867 type: 'hidden', 868 'name': '_password_strength_score' 869 } ) 870 ); 871 } 872 873 $( '#password-strength-score' ).val( strength ); 874 875 if ( requiredStrength > strength ) { 876 $( '.pw-weak' ).remove(); 877 } 878 } 879 } 880 }; 881 882 // Launch BP Nouveau. 883 bp.Nouveau.start(); 884 885 } )( window.bp, jQuery );
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Nov 21 01:00:57 2024 | Cross-referenced by PHPXref 0.7.1 |