[ Index ] |
PHP Cross Reference of BuddyPress |
[Summary view] [Print] [Text view]
1 /* global wp, BP_Nouveau, _, Backbone */ 2 /* @since 3.0.0 */ 3 /* @version 8.0.0 */ 4 window.wp = window.wp || {}; 5 window.bp = window.bp || {}; 6 7 ( function( bp, $ ) { 8 9 // Bail if not set 10 if ( typeof BP_Nouveau === 'undefined' ) { 11 return; 12 } 13 14 _.extend( bp, _.pick( wp, 'Backbone', 'ajax', 'template' ) ); 15 16 bp.Models = bp.Models || {}; 17 bp.Collections = bp.Collections || {}; 18 bp.Views = bp.Views || {}; 19 20 bp.Nouveau = bp.Nouveau || {}; 21 22 /** 23 * [Nouveau description] 24 * @type {Object} 25 */ 26 bp.Nouveau.GroupInvites = { 27 /** 28 * [start description] 29 * @return {[type]} [description] 30 */ 31 start: function() { 32 this.scope = null; 33 this.views = new Backbone.Collection(); 34 this.navItems = new Backbone.Collection(); 35 this.users = new bp.Collections.Users(); 36 this.invites = this.users.clone(); 37 38 // Add views 39 this.setupNav(); 40 this.setupLoops(); 41 this.displayFeedback( BP_Nouveau.group_invites.loading, 'loading' ); 42 43 // Add an invite when a user is selected 44 this.users.on( 'change:selected', this.addInvite, this ); 45 46 // Add an invite when a user is selected 47 this.invites.on( 'change:selected', this.manageInvite, this ); 48 49 // And display the Invites nav 50 this.invites.on( 'add', this.invitesNav, this ); 51 this.invites.on( 'reset', this.hideInviteNav, this ); 52 }, 53 54 setupNav: function() { 55 var activeView; 56 57 // Init the nav 58 this.nav = new bp.Views.invitesNav( { collection: this.navItems } ); 59 60 // loop through available nav items to build it 61 _.each( BP_Nouveau.group_invites.nav, function( item, index ) { 62 if ( ! _.isObject( item ) ) { 63 return; 64 } 65 66 // Reset active View 67 activeView = 0; 68 69 if ( 0 === index ) { 70 this.scope = item.id; 71 activeView = 1; 72 } 73 74 this.navItems.add( { 75 id : item.id, 76 name : item.caption, 77 href : item.href || '#members-list', 78 active : activeView, 79 hide : _.isUndefined( item.hide ) ? 0 : item.hide 80 } ); 81 }, this ); 82 83 // Inject the nav into the DOM 84 this.nav.inject( '.bp-invites-nav' ); 85 86 // Listen to the confirm event 87 this.nav.on( 'bp-invites:confirm', this.loadConfirmView, this ); 88 this.nav.on( 'bp-invites:loops', this.setupLoops, this ); 89 }, 90 91 setupLoops: function( scope ) { 92 var users; 93 94 scope = scope || this.scope; 95 96 // Reset Views 97 this.clearViews(); 98 99 // Only display the loading message if scope has changed 100 if ( scope !== this.scope ) { 101 // Loading 102 this.displayFeedback( BP_Nouveau.group_invites.loading, 'loading' ); 103 } 104 105 // Set global scope to requested one 106 this.scope = scope; 107 108 // Create the loop view 109 users = new bp.Views.inviteUsers( { collection: this.users, scope: scope } ); 110 111 this.views.add( { id: 'users', view: users } ); 112 113 users.inject( '.bp-invites-content' ); 114 115 this.displayFilters( this.users ); 116 }, 117 118 displayFilters: function( collection ) { 119 var filters_view; 120 121 // Create the model 122 this.filters = new Backbone.Model( { 123 page : 1, 124 total_page : 0, 125 search_terms : '', 126 scope : this.scope 127 } ); 128 129 // Use it in the filters view. 130 filters_view = new bp.Views.inviteFilters( { model: this.filters, users: collection } ); 131 132 this.views.add( { id: 'filters', view: filters_view } ); 133 134 filters_view.inject( '.bp-invites-filters' ); 135 }, 136 137 removeFeedback: function() { 138 var feedback; 139 140 if ( ! _.isUndefined( this.views.get( 'feedback' ) ) ) { 141 feedback = this.views.get( 'feedback' ); 142 feedback.get( 'view' ).remove(); 143 this.views.remove( { id: 'feedback', view: feedback } ); 144 } 145 }, 146 147 displayFeedback: function( message, type ) { 148 var feedback; 149 150 // Make sure to remove the feedbacks 151 this.removeFeedback(); 152 153 if ( ! message ) { 154 return; 155 } 156 157 feedback = new bp.Views.Feedback( { 158 value : message, 159 type : type || 'info' 160 } ); 161 162 this.views.add( { id: 'feedback', view: feedback } ); 163 164 feedback.inject( '.bp-invites-feedback' ); 165 }, 166 167 addInvite: function( user ) { 168 if ( true === user.get( 'selected' ) ) { 169 this.invites.add( user ); 170 } else { 171 var invite = this.invites.get( user.get( 'id' ) ); 172 173 if ( true === invite.get( 'selected' ) ) { 174 this.invites.remove( invite ); 175 } 176 } 177 }, 178 179 manageInvite: function( invite ) { 180 var user = this.users.get( invite.get( 'id' ) ); 181 182 // Update the user 183 if ( user ) { 184 user.set( 'selected', false ); 185 } 186 187 // remove the invite 188 this.invites.remove( invite ); 189 190 // No more invites, reset the collection 191 if ( ! this.invites.length ) { 192 this.invites.reset(); 193 } 194 }, 195 196 invitesNav: function() { 197 this.navItems.get( 'invites' ).set( { active: 0, hide: 0 } ); 198 }, 199 200 hideInviteNav: function() { 201 this.navItems.get( 'invites' ).set( { active: 0, hide: 1 } ); 202 }, 203 204 clearViews: function() { 205 // Clear views 206 if ( ! _.isUndefined( this.views.models ) ) { 207 _.each( this.views.models, function( model ) { 208 model.get( 'view' ).remove(); 209 }, this ); 210 211 this.views.reset(); 212 } 213 }, 214 215 loadConfirmView: function() { 216 this.clearViews(); 217 218 this.displayFeedback( BP_Nouveau.group_invites.invites_form, 'help' ); 219 220 // Activate the loop view 221 var invites = new bp.Views.invitesEditor( { collection: this.invites } ); 222 223 this.views.add( { id: 'invites', view: invites } ); 224 225 invites.inject( '.bp-invites-content' ); 226 } 227 }; 228 229 // Item (group or blog or any other) 230 bp.Models.User = Backbone.Model.extend( { 231 defaults : { 232 id : 0, 233 avatar : '', 234 name : '', 235 selected : false 236 } 237 } ); 238 239 /** Collections ***********************************************************/ 240 241 // Items (groups or blogs or any others) 242 bp.Collections.Users = Backbone.Collection.extend( { 243 model: bp.Models.User, 244 245 initialize : function() { 246 this.options = { page: 1, total_page: 0, group_id: BP_Nouveau.group_invites.group_id }; 247 }, 248 249 sync: function( method, model, options ) { 250 options = options || {}; 251 options.context = this; 252 options.data = options.data || {}; 253 254 // Add generic nonce 255 options.data.nonce = BP_Nouveau.nonces.groups; 256 257 if ( this.options.group_id ) { 258 options.data.group_id = this.options.group_id; 259 } 260 261 if ( 'read' === method ) { 262 options.data = _.extend( options.data, { 263 action: 'groups_get_group_potential_invites' 264 } ); 265 266 return bp.ajax.send( options ); 267 } 268 269 if ( 'create' === method ) { 270 options.data = _.extend( options.data, { 271 action : 'groups_send_group_invites', 272 _wpnonce : BP_Nouveau.group_invites.nonces.send_invites 273 } ); 274 275 if ( model ) { 276 options.data.users = model; 277 } 278 279 return bp.ajax.send( options ); 280 } 281 282 if ( 'delete' === method ) { 283 options.data = _.extend( options.data, { 284 action : 'groups_delete_group_invite', 285 _wpnonce : BP_Nouveau.group_invites.nonces.uninvite 286 } ); 287 288 if ( model ) { 289 options.data.user = model; 290 } 291 292 return bp.ajax.send( options ); 293 } 294 }, 295 296 parse: function( resp ) { 297 298 if ( ! _.isArray( resp.users ) ) { 299 resp.users = [resp.users]; 300 } 301 302 _.each( resp.users, function( value, index ) { 303 if ( _.isNull( value ) ) { 304 return; 305 } 306 307 resp.users[index].id = value.id; 308 resp.users[index].avatar = value.avatar; 309 resp.users[index].name = value.name; 310 } ); 311 312 if ( ! _.isUndefined( resp.meta ) ) { 313 this.options.page = resp.meta.page; 314 this.options.total_page = resp.meta.total_page; 315 } 316 317 return resp.users; 318 } 319 320 } ); 321 322 // Extend wp.Backbone.View with .prepare() and .inject() 323 bp.Nouveau.GroupInvites.View = bp.Backbone.View.extend( { 324 inject: function( selector ) { 325 this.render(); 326 $(selector).html( this.el ); 327 this.views.ready(); 328 }, 329 330 prepare: function() { 331 if ( ! _.isUndefined( this.model ) && _.isFunction( this.model.toJSON ) ) { 332 return this.model.toJSON(); 333 } else { 334 return {}; 335 } 336 } 337 } ); 338 339 // Feedback view 340 bp.Views.Feedback = bp.Nouveau.GroupInvites.View.extend( { 341 tagName : 'div', 342 className : 'bp-invites-feedback', 343 template : bp.template( 'bp-group-invites-feedback' ), 344 345 initialize: function() { 346 this.model = new Backbone.Model( { 347 type: this.options.type || 'info', 348 message: this.options.value 349 } ); 350 } 351 } ); 352 353 bp.Views.invitesNav = bp.Nouveau.GroupInvites.View.extend( { 354 tagName: 'ul', 355 className: 'subnav', 356 357 events: { 358 'click .bp-invites-nav-item' : 'toggleView' 359 }, 360 361 initialize: function() { 362 this.collection.on( 'add', this.outputNav, this ); 363 this.collection.on( 'change:hide', this.showHideNavItem, this ); 364 365 window.onbeforeunload = _.bind( this.confirmQuit, this ); 366 }, 367 368 outputNav: function( nav ) { 369 /** 370 * The delete nav is not added if no avatar 371 * is set for the object 372 */ 373 if ( 1 === nav.get( 'hide' ) ) { 374 return; 375 } 376 377 this.views.add( new bp.Views.invitesNavItem( { model: nav } ) ); 378 }, 379 380 showHideNavItem: function( item ) { 381 var isRendered = null; 382 383 /** 384 * Loop in views to show/hide the nav item 385 * BuddyPress is only using this for the delete nav 386 */ 387 _.each( this.views._views[''], function( view ) { 388 if ( 1 === view.model.get( 'hide' ) ) { 389 view.remove(); 390 } 391 392 // Check to see if the nav is not already rendered 393 if ( item.get( 'id' ) === view.model.get( 'id' ) ) { 394 isRendered = true; 395 } 396 } ); 397 398 // Add the Delete nav if not rendered 399 if ( ! _.isBoolean( isRendered ) ) { 400 item.set( 'invites_count', bp.Nouveau.GroupInvites.invites.length ); 401 this.outputNav( item ); 402 } 403 }, 404 405 toggleView: function( event ) { 406 var target = $( event.target ); 407 event.preventDefault(); 408 409 if ( ! target.data( 'nav' ) && 'SPAN' === event.target.tagName ) { 410 target = $( event.target ).parent(); 411 } 412 413 var current_nav_id = target.data( 'nav' ); 414 415 _.each( this.collection.models, function( nav ) { 416 if ( nav.id === current_nav_id ) { 417 nav.set( 'active', 1 ); 418 419 // Specific to the invites view 420 if ( 'invites' === nav.id ) { 421 this.trigger( 'bp-invites:confirm' ); 422 } else { 423 this.trigger( 'bp-invites:loops', nav.id ); 424 } 425 426 } else if ( 1 !== nav.get( 'hide' ) ) { 427 nav.set( 'active', 0 ); 428 } 429 }, this ); 430 }, 431 432 confirmQuit: function() { 433 if ( bp.Nouveau.GroupInvites.invites && bp.Nouveau.GroupInvites.invites.length ) { 434 $( '[data-nav="invites"]' ).focus(); 435 436 return false; 437 } 438 } 439 } ); 440 441 bp.Views.invitesNavItem = bp.Nouveau.GroupInvites.View.extend( { 442 tagName : 'li', 443 template : bp.template( 'bp-invites-nav' ), 444 445 initialize: function() { 446 if ( 1 === this.model.get( 'active' ) ) { 447 this.el.className += ' current'; 448 } 449 450 if ( 'invites' === this.model.get( 'id' ) ) { 451 this.el.className += ' dynamic'; 452 } 453 454 if ( 'invited' === this.model.get( 'id' ) ) { 455 this.el.className += ' pending'; 456 } 457 458 this.model.on( 'change:active', this.toggleClass, this ); 459 this.on( 'ready', this.updateCount, this ); 460 461 bp.Nouveau.GroupInvites.invites.on( 'add', this.updateCount, this ); 462 bp.Nouveau.GroupInvites.invites.on( 'remove', this.updateCount, this ); 463 }, 464 465 updateCount: function( user, invite ) { 466 if ( 'invites' !== this.model.get( 'id' ) ) { 467 return; 468 } 469 470 var span_count = _.isUndefined( invite ) ? this.model.get( 'invites_count' ) : invite.models.length; 471 472 if ( $( this.el ).find( 'span' ).length ) { 473 $( this.el ).find( 'span' ).html( span_count ); 474 } else { 475 $( this.el ).find( 'a' ).append( $( '<span class="count"></span>' ).html( span_count ) ); 476 } 477 }, 478 479 toggleClass: function( model ) { 480 if ( 0 === model.get( 'active' ) ) { 481 $( this.el ).removeClass( 'current' ); 482 } else { 483 $( this.el ).addClass( 'current' ); 484 } 485 } 486 } ); 487 488 bp.Views.Pagination = bp.Nouveau.GroupInvites.View.extend( { 489 tagName : 'div', 490 className : 'last', 491 template : bp.template( 'bp-invites-paginate' ) 492 } ); 493 494 bp.Views.inviteFilters = bp.Nouveau.GroupInvites.View.extend( { 495 tagName: 'div', 496 template: bp.template( 'bp-invites-filters' ), 497 498 events : { 499 'search #group_invites_search' : 'resetSearchTerms', 500 'submit #group_invites_search_form' : 'setSearchTerms', 501 'click #bp-invites-next-page' : 'nextPage', 502 'click #bp-invites-prev-page' : 'prevPage' 503 }, 504 505 initialize: function() { 506 this.model.on( 'change', this.filterUsers, this ); 507 this.options.users.on( 'sync', this.addPaginatation, this ); 508 }, 509 510 addPaginatation: function( collection ) { 511 _.each( this.views._views[''], function( view ) { 512 view.remove(); 513 } ); 514 515 if ( 1 === collection.options.total_page ) { 516 return; 517 } 518 519 this.views.add( new bp.Views.Pagination( { model: new Backbone.Model( collection.options ) } ) ); 520 }, 521 522 filterUsers: function() { 523 bp.Nouveau.GroupInvites.displayFeedback( BP_Nouveau.group_invites.loading, 'loading' ); 524 525 this.options.users.reset(); 526 527 this.options.users.fetch( { 528 data : _.pick( this.model.attributes, ['scope', 'search_terms', 'page'] ), 529 success : this.usersFiltered, 530 error : this.usersFilterError 531 } ); 532 }, 533 534 usersFiltered: function() { 535 bp.Nouveau.GroupInvites.removeFeedback(); 536 }, 537 538 usersFilterError: function( collection, response ) { 539 var type = 'error'; 540 541 if ( response.type ) { 542 type = response.type; 543 } 544 545 bp.Nouveau.GroupInvites.displayFeedback( response.feedback, type ); 546 }, 547 548 resetSearchTerms: function( event ) { 549 event.preventDefault(); 550 551 if ( ! $( event.target ).val() ) { 552 $( event.target ).closest( 'form' ).submit(); 553 } else { 554 $( event.target ).closest( 'form' ).find( '[type=submit]' ).addClass('bp-show'); 555 } 556 }, 557 558 setSearchTerms: function( event ) { 559 event.preventDefault(); 560 561 this.model.set( { 562 search_terms : $( event.target ).find( 'input[type=search]' ).val() || '', 563 page : 1 564 } ); 565 }, 566 567 nextPage: function( event ) { 568 event.preventDefault(); 569 570 this.model.set( 'page', this.model.get( 'page' ) + 1 ); 571 }, 572 573 prevPage: function( event ) { 574 event.preventDefault(); 575 576 this.model.set( 'page', this.model.get( 'page' ) - 1 ); 577 } 578 } ); 579 580 bp.Views.inviteUsers = bp.Nouveau.GroupInvites.View.extend( { 581 tagName : 'ul', 582 className : 'item-list bp-list', 583 id : 'members-list', 584 585 initialize: function() { 586 // Load users for the active view 587 this.requestUsers(); 588 589 this.collection.on( 'reset', this.cleanContent, this ); 590 this.collection.on( 'add', this.addUser, this ); 591 }, 592 593 requestUsers: function() { 594 this.collection.reset(); 595 596 this.collection.fetch( { 597 data : _.pick( this.options, 'scope' ), 598 success : this.usersFetched, 599 error : this.usersFetchError 600 } ); 601 }, 602 603 usersFetched: function( collection, response ) { 604 bp.Nouveau.GroupInvites.displayFeedback( response.feedback, 'help' ); 605 }, 606 607 usersFetchError: function( collection, response ) { 608 var type = response.type || 'help'; 609 610 bp.Nouveau.GroupInvites.displayFeedback( response.feedback, type ); 611 }, 612 613 cleanContent: function() { 614 _.each( this.views._views[''], function( view ) { 615 view.remove(); 616 } ); 617 }, 618 619 addUser: function( user ) { 620 this.views.add( new bp.Views.inviteUser( { model: user } ) ); 621 } 622 } ); 623 624 bp.Views.inviteUser = bp.Nouveau.GroupInvites.View.extend( { 625 tagName : 'li', 626 template : bp.template( 'bp-invites-users' ), 627 628 events: { 629 'click .group-add-remove-invite-button' : 'toggleUser', 630 'click .group-remove-invite-button' : 'removeInvite' 631 }, 632 633 initialize: function() { 634 var invite = bp.Nouveau.GroupInvites.invites.get( this.model.get( 'id' ) ); 635 636 if ( invite ) { 637 this.model.set( 'selected', true, { silent: true } ); 638 } 639 }, 640 641 render: function() { 642 if ( this.model.get( 'selected' ) ) { 643 this.el.className = 'selected'; 644 } else { 645 this.el.className = ''; 646 } 647 648 bp.Nouveau.GroupInvites.View.prototype.render.apply( this, arguments ); 649 }, 650 651 toggleUser: function( event ) { 652 event.preventDefault(); 653 654 var selected = this.model.get( 'selected' ); 655 656 if ( false === selected ) { 657 this.model.set( 'selected', true ); 658 } else { 659 this.model.set( 'selected', false ); 660 661 if ( ! bp.Nouveau.GroupInvites.invites.length ) { 662 bp.Nouveau.GroupInvites.invites.reset(); 663 } 664 } 665 666 // Rerender to update buttons. 667 this.render(); 668 }, 669 670 removeInvite: function( event ) { 671 event.preventDefault(); 672 673 var collection = this.model.collection; 674 675 if ( ! collection.length ) { 676 return; 677 } 678 679 collection.sync( 'delete', this.model.get( 'id' ), { 680 success : _.bind( this.inviteRemoved, this ), 681 error : _.bind( this.uninviteError, this ) 682 } ); 683 }, 684 685 inviteRemoved: function( response ) { 686 var collection = this.model.collection; 687 688 if ( ! collection.length ) { 689 return; 690 } 691 692 collection.remove( this.model ); 693 this.remove(); 694 695 bp.Nouveau.GroupInvites.removeFeedback(); 696 697 if ( false === response.has_invites ) { 698 bp.Nouveau.GroupInvites.displayFeedback( response.feedback, 'success' ); 699 700 // Hide the invited nav 701 bp.Nouveau.GroupInvites.navItems.get( 'invited' ).set( { active: 0, hide: 1 } ); 702 } 703 }, 704 705 uninviteError: function( response ) { 706 bp.Nouveau.GroupInvites.displayFeedback( response.feedback, 'error' ); 707 } 708 } ); 709 710 bp.Views.invitesEditor = bp.Nouveau.GroupInvites.View.extend( { 711 tagName : 'div', 712 id : 'send-invites-editor', 713 714 events: { 715 'click #bp-invites-send' : 'sendInvites', 716 'click #bp-invites-reset' : 'clearForm' 717 }, 718 719 initialize: function() { 720 this.views.add( new bp.Views.selectedUsers( { collection: this.collection } ) ); 721 this.views.add( new bp.Views.invitesForm() ); 722 723 this.collection.on( 'reset', this.cleanViews, this ); 724 }, 725 726 sendInvites: function( event ) { 727 event.preventDefault(); 728 729 $( this.el ).addClass( 'bp-hide' ); 730 731 bp.Nouveau.GroupInvites.displayFeedback( BP_Nouveau.group_invites.invites_sending, 'info' ); 732 733 this.collection.sync( 'create', _.pluck( this.collection.models, 'id' ), { 734 success : _.bind( this.invitesSent, this ), 735 error : _.bind( this.invitesError, this ), 736 data : { 737 message: $( this.el ).find( 'textarea' ).val() 738 } 739 } ); 740 }, 741 742 invitesSent: function( response ) { 743 this.collection.reset(); 744 745 bp.Nouveau.GroupInvites.displayFeedback( response.feedback, 'success' ); 746 747 // Display the pending invites 748 if ( 1 === bp.Nouveau.GroupInvites.navItems.get( 'invited' ).get( 'hide' ) && ! BP_Nouveau.group_invites.is_group_create ) { 749 bp.Nouveau.GroupInvites.navItems.get( 'invited' ).set( { active: 0, hide: 0 } ); 750 } 751 }, 752 753 invitesError: function( response ) { 754 var type = response.type || 'help'; 755 756 $( this.el ).removeClass( 'bp-hide' ); 757 758 bp.Nouveau.GroupInvites.displayFeedback( response.feedback, type ); 759 760 if ( ! _.isUndefined( response.users ) ) { 761 // Display the pending invites 762 if ( 1 === bp.Nouveau.GroupInvites.navItems.get( 'invited' ).get( 'hide' ) && response.users.length < this.collection.length ) { 763 bp.Nouveau.GroupInvites.navItems.get( 'invited' ).set( { active: 0, hide: 0 } ); 764 } 765 766 _.each( this.collection.models, function( invite ) { 767 // If not an error, remove from the selection 768 if ( -1 === _.indexOf( response.users, invite.get( 'id' ) ) ) { 769 invite.set( 'selected', false ); 770 } 771 }, this ); 772 } 773 }, 774 775 clearForm: function( event ) { 776 event.preventDefault(); 777 778 this.collection.reset(); 779 }, 780 781 cleanViews: function() { 782 _.each( this.views._views[''], function( view ) { 783 view.remove(); 784 } ); 785 786 bp.Nouveau.GroupInvites.displayFeedback( BP_Nouveau.group_invites.invites_form_reset, 'success' ); 787 } 788 } ); 789 790 bp.Views.invitesForm = bp.Nouveau.GroupInvites.View.extend( { 791 tagName : 'div', 792 id : 'bp-send-invites-form', 793 template : bp.template( 'bp-invites-form' ) 794 } ); 795 796 bp.Views.selectedUsers = bp.Nouveau.GroupInvites.View.extend( { 797 tagName : 'ul', 798 799 initialize: function() { 800 this.cleanContent(); 801 802 _.each( this.collection.models, function( invite ) { 803 this.views.add( new bp.Views.selectedUser( { model: invite } ) ); 804 }, this ); 805 }, 806 807 cleanContent: function() { 808 _.each( this.views._views[''], function( view ) { 809 view.remove(); 810 } ); 811 } 812 } ); 813 814 bp.Views.selectedUser = bp.Nouveau.GroupInvites.View.extend( { 815 tagName : 'li', 816 template : bp.template( 'bp-invites-selection' ), 817 818 events: { 819 click : 'removeSelection' 820 }, 821 822 initialize: function() { 823 this.model.on( 'change:selected', this.removeView, this ); 824 825 // Build the BP Tooltip. 826 if ( ! this.model.get( 'uninviteTooltip' ) ) { 827 this.model.set( 'uninviteTooltip', 828 BP_Nouveau.group_invites.removeUserInvite.replace( '%s', this.model.get( 'name' ) ), 829 { silent: true } 830 ); 831 } 832 833 this.el.id = 'uninvite-user-' + this.model.get( 'id' ); 834 }, 835 836 removeSelection: function( event ) { 837 event.preventDefault(); 838 839 this.model.set( 'selected', false ); 840 }, 841 842 removeView: function( model ) { 843 if ( false !== model.get( 'selected' ) ) { 844 return; 845 } 846 847 this.remove(); 848 } 849 } ); 850 851 // Launch BP Nouveau Groups 852 bp.Nouveau.GroupInvites.start(); 853 854 } )( window.bp, jQuery );
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Dec 5 01:00:58 2024 | Cross-referenced by PHPXref 0.7.1 |