Skip to:
Content

BuddyPress.org

Changeset 13007


Ignore:
Timestamp:
07/14/2021 10:06:43 PM (3 years ago)
Author:
imath
Message:

Merge the BP Blocks plugin's last 2 Members Block

'bp/online-members' and 'bp/active-members' are very similar Widget Blocks. The specific bp_members_render_members_avatars_block() function has been introduced to put in common most of the rendering logic of these two blocks.

  • Adapt Grunt sass tasks.
  • Add the Block JavaScript source files into src/js/bp-blogs/js/blocks.
  • Add the Block Scss source file into src/bp-blogs/sass.
  • Generate the development files to ease testing.

Fixes #8527

Location:
trunk
Files:
14 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Gruntfile.js

    r13006 r13007  
    5151            '!bp-groups/css/blocks/dynamic-groups.css',
    5252            '!bp-messages/css/blocks/sitewide-notices.css',
    53             '!bp-blogs/css/blocks/recent-posts.css'
     53            '!bp-blogs/css/blocks/recent-posts.css',
     54            '!bp-members/css/blocks/active-members.css',
     55            '!bp-members/css/blocks/online-members.css'
    5456        ],
    5557
  • trunk/src/bp-members/bp-members-blocks.php

    r13004 r13007  
    556556    return $widget_content;
    557557}
     558
     559/**
     560 * Common function to render the Recently Active & Online Members Blocks.
     561 *
     562 * @since 9.0.0
     563 *
     564 * @param array $block_args {
     565 *    Optional. An array of Block arguments.
     566 *
     567 *    @type string $title      The title of the Block.
     568 *    @type int    $maxMembers The maximum number of members to show. Defaults to `0`.
     569 *    @type string $noMembers  The string to output when there are no members to show.
     570 *    @type string $classname  The name of the CSS class to use.
     571 *    @type string $type       The type of filter to perform. Possible values are `online`, `active`,
     572 *                             `newest`, `alphabetical`, `random` or `popular`.
     573 * }
     574 * @return string HTML output.
     575 */
     576function bp_members_render_members_avatars_block( $block_args = array() ) {
     577    $args = bp_parse_args(
     578        $block_args,
     579        array(
     580            'title'      => '',
     581            'maxMembers' => 0,
     582            'noMembers'  => '',
     583            'classname'  => '',
     584            'type'       => 'active',
     585        ),
     586        ''
     587    );
     588
     589    $title              = $args['title'];
     590    $max_members        = (int) $args['maxMembers'];
     591    $no_members         = $args['noMembers'];
     592    $classname          = sanitize_key( $args['classname'] );
     593    $wrapper_attributes = get_block_wrapper_attributes(
     594        array(
     595            'class' => sprintf( '%s buddypress widget', $classname ),
     596        )
     597    );
     598    $type               = sanitize_key( $args['type'] );
     599
     600    if ( $title ) {
     601        $widget_content = sprintf( '<h2 class="widget-title">%s</h2>', esc_html( $title ) );
     602    } else {
     603        $widget_content = '';
     604    }
     605
     606    // Query Users.
     607    $query = bp_core_get_users(
     608        array(
     609            'user_id'         => 0,
     610            'type'            => $type,
     611            'per_page'        => $max_members,
     612            'max'             => $max_members,
     613            'populate_extras' => true,
     614            'search_terms'    => false,
     615        )
     616    );
     617
     618    // Build the output for online members.
     619    if ( isset( $query['total'] ) && 1 <= (int) $query['total'] ) {
     620        $members        = $query['users'];
     621        $member_avatars = array();
     622
     623        foreach ( $members as $member ) {
     624            $member_avatars[] = sprintf(
     625                '<div class="item-avatar">
     626                    <a href="%1$s" class="bp-tooltip" data-bp-tooltip="%2$s">
     627                        <img loading="lazy" src="%3$s" class="avatar user-%4$s-avatar avatar-50 photo" width="50" height="50" alt="%5$s">
     628                    </a>
     629                </div>',
     630                esc_url( bp_core_get_user_domain( $member->ID, $member->user_nicename, $member->user_login ) ),
     631                esc_html( $member->display_name ),
     632                bp_core_fetch_avatar(
     633                    array(
     634                        'item_id' => $member->ID,
     635                        'html'    => false,
     636                    )
     637                ),
     638                esc_attr( $member->ID ),
     639                esc_html(
     640                    sprintf(
     641                        /* translators: %s: member name */
     642                        __( 'Profile picture of %s', 'buddypress' ),
     643                        $member->display_name
     644                    )
     645                )
     646            );
     647        }
     648
     649        $widget_content .= sprintf(
     650            '<div class="avatar-block">
     651                %s
     652            </div>',
     653            implode( "\n", $member_avatars )
     654        );
     655    } else {
     656        $widget_content .= sprintf(
     657            '<div class="widget-error">
     658                %s
     659            </div>',
     660            esc_html( $no_members )
     661        );
     662    }
     663
     664    // Only add a block wrapper if not loaded into a Widgets sidebar.
     665    if ( ! did_action( 'dynamic_sidebar_before' ) ) {
     666        return sprintf(
     667            '<div %1$s>%2$s</div>',
     668            $wrapper_attributes,
     669            $widget_content
     670        );
     671    }
     672
     673    return $widget_content;
     674}
     675
     676/**
     677 * Callback function to render the Online Members Block.
     678 *
     679 * @since 9.0.0
     680 *
     681 * @param array $attributes The block attributes.
     682 * @return string           HTML output.
     683 */
     684function bp_members_render_online_members_block( $attributes = array() ) {
     685    $block_args = bp_parse_args(
     686        $attributes,
     687        array(
     688            'title'      => __( 'Who\'s Online', 'buddypress' ),
     689            'maxMembers' => 15,
     690            'noMembers'  => __( 'There are no users currently online', 'buddypress' ),
     691            'classname'  => 'widget_bp_core_whos_online_widget',
     692        ),
     693        'members_widget_settings'
     694    );
     695
     696    $block_args['type'] = 'online';
     697
     698    return bp_members_render_members_avatars_block( $block_args );
     699}
     700
     701/**
     702 * Callback function to render the Recently Active Members Block.
     703 *
     704 * @since 9.0.0
     705 *
     706 * @param array $attributes The block attributes.
     707 * @return string           HTML output.
     708 */
     709function bp_members_render_active_members_block( $attributes = array() ) {
     710    $block_args = bp_parse_args(
     711        $attributes,
     712        array(
     713            'title'      => __( 'Recently Active Members', 'buddypress' ),
     714            'maxMembers' => 15,
     715            'noMembers'  => __( 'There are no recently active members', 'buddypress' ),
     716            'classname'  => 'widget_bp_core_recently_active_widget',
     717        ),
     718        'recently_active_members_widget_settings'
     719    );
     720
     721    $block_args['type'] = 'active';
     722
     723    return bp_members_render_members_avatars_block( $block_args );
     724}
  • trunk/src/bp-members/classes/class-bp-members-component.php

    r13003 r13007  
    201201                'bp/dynamic-members' => array(
    202202                    'widget_classnames' => array( 'widget_bp_core_members_widget', 'buddypress' ),
    203                 )
     203                ),
     204                'bp/online-members' => array(
     205                    'widget_classnames' => array( 'widget_bp_core_whos_online_widget', 'buddypress' ),
     206                ),
     207                'bp/active-members' => array(
     208                    'widget_classnames' => array( 'widget_bp_core_recently_active_widget', 'buddypress' ),
     209                ),
    204210            ),
    205211        );
     
    863869                    'render_callback'    => 'bp_members_render_dynamic_members_block',
    864870                ),
     871                'bp/online-members'  => array(
     872                    'name'               => 'bp/online-members',
     873                    'editor_script'      => 'bp-online-members-block',
     874                    'editor_script_url'  => plugins_url( 'js/blocks/online-members.js', dirname( __FILE__ ) ),
     875                    'editor_script_deps' => array(
     876                        'wp-blocks',
     877                        'wp-element',
     878                        'wp-components',
     879                        'wp-i18n',
     880                        'wp-block-editor',
     881                        'bp-block-components',
     882                    ),
     883                    'editor_style'       => 'bp-online-members-block',
     884                    'editor_style_url'   => plugins_url( 'css/blocks/online-members.css', dirname( __FILE__ ) ),
     885                    'attributes'         => array(
     886                        'title'      => array(
     887                            'type'    => 'string',
     888                            'default' => __( 'Who\'s Online', 'buddypress' ),
     889                        ),
     890                        'maxMembers' => array(
     891                            'type'    => 'number',
     892                            'default' => 15,
     893                        ),
     894                    ),
     895                    'render_callback'    => 'bp_members_render_online_members_block',
     896                ),
     897                'bp/active-members'  => array(
     898                    'name'               => 'bp/active-members',
     899                    'editor_script'      => 'bp-active-members-block',
     900                    'editor_script_url'  => plugins_url( 'js/blocks/active-members.js', dirname( __FILE__ ) ),
     901                    'editor_script_deps' => array(
     902                        'wp-blocks',
     903                        'wp-element',
     904                        'wp-components',
     905                        'wp-i18n',
     906                        'wp-block-editor',
     907                        'bp-block-components',
     908                    ),
     909                    'editor_style'       => 'bp-active-members-block',
     910                    'editor_style_url'   => plugins_url( 'css/blocks/active-members.css', dirname( __FILE__ ) ),
     911                    'attributes'         => array(
     912                        'title'      => array(
     913                            'type'    => 'string',
     914                            'default' => __( 'Recently Active Members', 'buddypress' ),
     915                        ),
     916                        'maxMembers' => array(
     917                            'type'    => 'number',
     918                            'default' => 15,
     919                        ),
     920                    ),
     921                    'render_callback'    => 'bp_members_render_active_members_block',
     922                ),
    865923            )
    866924        );
Note: See TracChangeset for help on using the changeset viewer.