Changeset 13003
- Timestamp:
- 07/14/2021 05:45:37 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 14 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/.jshintignore
r13002 r13003 10 10 src/**/js/block-*.js 11 11 src/**/js/friends.js 12 src/**/js/dynamic-members.js 12 13 src/**/js/dynamic-widget-block.js -
trunk/Gruntfile.js
r13002 r13003 25 25 '!**/js/block-*.js', 26 26 '!**/js/friends.js', 27 '!**/js/dynamic-members.js', 27 28 '!**/js/dynamic-widget-block.js' 28 29 ], … … 44 45 '!bp-core/css/blocks/login-form.css', 45 46 '!bp-activity/css/blocks/latest-activities.css', 46 '!bp-friends/css/blocks/friends.css' 47 '!bp-friends/css/blocks/friends.css', 48 '!bp-members/css/blocks/dynamic-members.css' 47 49 ], 48 50 -
trunk/src/bp-members/bp-members-blocks.php
r12996 r13003 332 332 return apply_filters( 'bp_members_render_members_block_output', $output, $block_args, $members ); 333 333 } 334 335 /** 336 * Adds specific script data for the BP Members blocks. 337 * 338 * Only used for the BP Dynamic Members block. 339 * 340 * @since 9.0.0 341 */ 342 function bp_members_blocks_add_script_data() { 343 $dynamic_members_blocks = array_filter( buddypress()->members->block_globals['bp/dynamic-members']->items ); 344 345 if ( ! $dynamic_members_blocks ) { 346 return; 347 } 348 349 // Include the common JS template. 350 echo bp_get_dynamic_template_part( 'assets/widgets/dynamic-members.php' ); 351 352 // List the block specific props. 353 wp_add_inline_script( 354 'bp-dynamic-members-script', 355 sprintf( 'var bpDynamicMembersBlocks = %s;', wp_json_encode( array_values( $dynamic_members_blocks ) ) ), 356 'before' 357 ); 358 } 359 360 /** 361 * Callback function to render the Dynamic Members Block. 362 * 363 * @since 9.0.0 364 * 365 * @param array $attributes The block attributes. 366 * @return string HTML output. 367 */ 368 function bp_members_render_dynamic_members_block( $attributes = array() ) { 369 $block_args = wp_parse_args( 370 $attributes, 371 array( 372 'title' => __( 'Members', 'buddypress' ), 373 'maxMembers' => 5, 374 'memberDefault' => 'active', 375 'linkTitle' => false, 376 ) 377 ); 378 379 $classnames = 'widget_bp_core_members_widget buddypress widget'; 380 $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classnames ) ); 381 382 $max_members = (int) $block_args['maxMembers']; 383 $no_members = __( 'No members found.', 'buddypress' ); 384 385 /** This filter is documented in buddypress/src/bp-members/classes/class-bp-core-members-widget.php */ 386 $separator = apply_filters( 'bp_members_widget_separator', '|' ); 387 388 // Make sure the widget ID is unique. 389 $widget_id = uniqid( 'members-list-' ); 390 $members_directory_link = bp_get_members_directory_permalink(); 391 392 // Set the Block's title. 393 if ( true === $block_args['linkTitle'] ) { 394 $widget_content = sprintf( 395 '<h2 class="widget-title"><a href="%1$s">%2$s</a></h2>', 396 esc_url( $members_directory_link ), 397 esc_html( $block_args['title'] ) 398 ); 399 } else { 400 $widget_content = sprintf( '<h2 class="widget-title">%s</h2>', esc_html( $block_args['title'] ) ); 401 } 402 403 $item_options = array( 404 'newest' => array( 405 'class' => '', 406 'label' => __( 'Newest', 'buddypress' ), 407 ), 408 'active' => array( 409 'class' => '', 410 'label' => __( 'Active', 'buddypress' ), 411 ), 412 ); 413 414 if ( bp_is_active( 'friends' ) ) { 415 $item_options['popular'] = array( 416 'class' => '', 417 'label' => __( 'Popular', 'buddypress' ), 418 ); 419 } 420 421 $item_options_output = array(); 422 $separator_output = sprintf( ' <span class="bp-separator" role="separator">%s</span> ', esc_html( $separator ) ); 423 424 foreach ( $item_options as $item_type => $item_attr ) { 425 if ( $block_args['memberDefault'] === $item_type ) { 426 $item_attr['class'] = ' class="selected"'; 427 } 428 429 $item_options_output[] = sprintf( 430 '<a href="%1$s" data-bp-sort="%2$s"%3$s>%4$s</a>', 431 esc_url( $members_directory_link ), 432 esc_attr( $item_type ), 433 $item_attr['class'], 434 esc_html( $item_attr['label'] ) 435 ); 436 } 437 438 $preview = ''; 439 $default_args = array( 440 'type' => $block_args['memberDefault'], 441 'per_page' => $max_members, 442 'populate_extras' => true, 443 ); 444 445 // Previewing the Block inside the editor. 446 if ( defined( 'REST_REQUEST' ) && REST_REQUEST ) { 447 $bp_query = bp_core_get_users( $default_args ); 448 $preview = sprintf( '<div class="widget-error">%s</div>', $no_members ); 449 450 if ( is_array( $bp_query['users'] ) && 0 < count( $bp_query['users'] ) ) { 451 $preview = ''; 452 foreach ( $bp_query['users'] as $user ) { 453 if ( 'newest' === $block_args['memberDefault'] ) { 454 /* translators: %s is time elapsed since the registration date happened */ 455 $extra = sprintf( _x( 'Registered %s', 'The timestamp when the user registered', 'buddypress' ), bp_core_time_since( $user->user_registered ) ); 456 } elseif ( 'popular' === $block_args['memberDefault'] && isset( $item_options['popular'] ) && isset( $user->total_friend_count ) ) { 457 /* translators: %s: total friend count */ 458 $extra = sprintf( _n( '%s friend', '%s friends', $user->total_friend_count, 'buddypress' ), number_format_i18n( $user->total_friend_count ) ); 459 } else { 460 /* translators: %s: a human time diff. */ 461 $extra = sprintf( __( 'Active %s', 'buddypress' ), bp_core_time_since( $user->last_activity ) ); 462 } 463 464 $preview .= bp_get_dynamic_template_part( 465 'assets/widgets/dynamic-members.php', 466 'php', 467 array( 468 'data.link' => bp_core_get_user_domain( $user->ID, $user->user_nicename, $user->user_login ), 469 'data.name' => $user->display_name, 470 'data.avatar_urls.thumb' => bp_core_fetch_avatar( 471 array( 472 'item_id' => $user->ID, 473 'html' => false, 474 ) 475 ), 476 'data.avatar_alt' => esc_html( 477 sprintf( 478 /* translators: %s: member name */ 479 __( 'Profile picture of %s', 'buddypress' ), 480 $user->display_name 481 ) 482 ), 483 'data.id' => $user->ID, 484 'data.extra' => $extra, 485 ) 486 ); 487 } 488 } 489 } else { 490 // Get corresponding members. 491 $path = sprintf( 492 '/%1$s/%2$s/%3$s', 493 bp_rest_namespace(), 494 bp_rest_version(), 495 buddypress()->members->id 496 ); 497 498 $default_path = add_query_arg( 499 $default_args, 500 $path 501 ); 502 503 $preloaded_members = array(); 504 if ( bp_is_running_wp( '5.0.0' ) ) { 505 $preloaded_members = rest_preload_api_request( '', $default_path ); 506 } 507 508 buddypress()->members->block_globals['bp/dynamic-members']->items[ $widget_id ] = (object) array( 509 'selector' => $widget_id, 510 'query_args' => $default_args, 511 'preloaded' => reset( $preloaded_members ), 512 ); 513 514 // Only enqueue common/specific scripts and data once per page load. 515 if ( ! has_action( 'wp_footer', 'bp_members_blocks_add_script_data', 1 ) ) { 516 wp_set_script_translations( 'bp-dynamic-members-script', 'buddypress' ); 517 wp_enqueue_script( 'bp-dynamic-members-script' ); 518 wp_localize_script( 519 'bp-dynamic-members-script', 520 'bpDynamicMembersSettings', 521 array( 522 'path' => ltrim( $path, '/' ), 523 'root' => esc_url_raw( get_rest_url() ), 524 'nonce' => wp_create_nonce( 'wp_rest' ), 525 ) 526 ); 527 528 add_action( 'wp_footer', 'bp_members_blocks_add_script_data', 1 ); 529 } 530 } 531 532 $widget_content .= sprintf( 533 '<div class="item-options"> 534 %1$s 535 </div> 536 <ul id="%2$s" class="item-list" aria-live="polite" aria-relevant="all" aria-atomic="true"> 537 %3$s 538 </ul>', 539 implode( $separator_output, $item_options_output ), 540 esc_attr( $widget_id ), 541 $preview 542 ); 543 544 // Adds a container to make sure the block is styled even when used into the Columns parent block. 545 $widget_content = sprintf( '<div class="bp-dynamic-block-container">%s</div>', "\n" . $widget_content . "\n" ); 546 547 // Only add a block wrapper if not loaded into a Widgets sidebar. 548 if ( ! did_action( 'dynamic_sidebar_before' ) ) { 549 return sprintf( 550 '<div %1$s>%2$s</div>', 551 $wrapper_attributes, 552 $widget_content 553 ); 554 } 555 556 return $widget_content; 557 } -
trunk/src/bp-members/classes/class-bp-members-component.php
r12996 r13003 59 59 // Always include these files. 60 60 $includes = array( 61 'cssjs', 61 62 'filters', 62 63 'template', … … 197 198 ), 198 199 'notification_callback' => 'members_format_notifications', 200 'block_globals' => array( 201 'bp/dynamic-members' => array( 202 'widget_classnames' => array( 'widget_bp_core_members_widget', 'buddypress' ), 203 ) 204 ), 199 205 ); 200 206 … … 822 828 'render_callback' => 'bp_members_render_members_block', 823 829 ), 830 'bp/dynamic-members' => array( 831 'name' => 'bp/dynamic-members', 832 'editor_script' => 'bp-dynamic-members-block', 833 'editor_script_url' => plugins_url( 'js/blocks/dynamic-members.js', dirname( __FILE__ ) ), 834 'editor_script_deps' => array( 835 'wp-blocks', 836 'wp-element', 837 'wp-components', 838 'wp-i18n', 839 'wp-block-editor', 840 'bp-block-data', 841 'bp-block-components', 842 ), 843 'style' => 'bp-dynamic-members-block', 844 'style_url' => plugins_url( 'css/blocks/dynamic-members.css', dirname( __FILE__ ) ), 845 'attributes' => array( 846 'title' => array( 847 'type' => 'string', 848 'default' => __( 'Members', 'buddypress' ), 849 ), 850 'maxMembers' => array( 851 'type' => 'number', 852 'default' => 5, 853 ), 854 'memberDefault' => array( 855 'type' => 'string', 856 'default' => 'active', 857 ), 858 'linkTitle' => array( 859 'type' => 'boolean', 860 'default' => false, 861 ), 862 ), 863 'render_callback' => 'bp_members_render_dynamic_members_block', 864 ), 824 865 ) 825 866 );
Note: See TracChangeset
for help on using the changeset viewer.