/** * WordPress dependencies. */ const { blockEditor: { InspectorControls, BlockControls, }, components: { Placeholder, PanelBody, SelectControl, ToggleControl, Button, Dashicon, Tooltip, ToolbarGroup, RangeControl, }, element: { createElement, Fragment, useState, }, i18n: { __, sprintf, _n, }, apiFetch, url: { addQueryArgs, }, } = wp; /** * BuddyPress dependencies. */ const { blockComponents: { AutoCompleter, }, blockData: { isActive, } } = bp; /** * Internal dependencies. */ import { AVATAR_SIZES, EXTRA_INFO, GROUP_STATI } from './constants'; /** * External dependencies. */ const { reject, remove, sortBy, } = lodash; const getSlugValue = ( item ) => { if ( item && item.status && GROUP_STATI[ item.status ] ) { return GROUP_STATI[ item.status ]; } return null; } const editGroupsBlock = ( { attributes, setAttributes, isSelected } ) => { const isAvatarEnabled = isActive( 'groups', 'avatar' ); const { itemIDs, avatarSize, displayGroupName, extraInfo, layoutPreference, columns, } = attributes; const hasGroups = 0 !== itemIDs.length; const [ groups, setGroups ] = useState( [] ); const layoutControls = [ { icon: 'text', title: __( 'List view', 'buddypress' ), onClick: () => setAttributes( { layoutPreference: 'list' } ), isActive: layoutPreference === 'list', }, { icon: 'screenoptions', title: __( 'Grid view', 'buddypress' ), onClick: () => setAttributes( { layoutPreference: 'grid' } ), isActive: layoutPreference === 'grid', }, ]; let groupsList; let containerClasses = 'bp-block-groups avatar-' + avatarSize; let extraInfoOptions = EXTRA_INFO; if ( layoutPreference === 'grid' ) { containerClasses += ' is-grid columns-' + columns; extraInfoOptions = EXTRA_INFO.filter( ( extra ) => { return 'description' !== extra.value; } ); } const onSelectedGroup = ( { itemID } ) => { if ( itemID && -1 === itemIDs.indexOf( itemID ) ) { setAttributes( { itemIDs: [...itemIDs, parseInt( itemID, 10 ) ] } ); } }; const onRemoveGroup = ( ( itemID ) => { if ( itemID && -1 !== itemIDs.indexOf( itemID ) ) { setGroups( reject( groups, ['id', itemID ] ) ); setAttributes( { itemIDs: remove( itemIDs, ( value ) => { return value !== itemID } ) } ); } } ); if ( hasGroups && itemIDs.length !== groups.length ) { apiFetch( { path: addQueryArgs( `/buddypress/v1/groups`, { populate_extras: true, include: itemIDs } ), } ).then( items => { setGroups( sortBy( items, [ ( item ) => { return itemIDs.indexOf( item.id ); } ] ) ); } ) } if ( groups.length ) { groupsList = groups.map( ( group ) => { let hasDescription = false; let groupItemClasses = 'group-content'; if ( layoutPreference === 'list' && 'description' === extraInfo && group.description && group.description.rendered ) { hasDescription = true; groupItemClasses = 'group-content has-description'; } return (
{ isSelected && ( ) } { isAvatarEnabled && 'none' !== avatarSize && (
{
) }
{ displayGroupName && ( { group.name } ) } { hasDescription && (
) } { 'active' === extraInfo && group.last_activity && group.last_activity_diff && ( ) } { 'popular' === extraInfo && group.total_member_count && (
{ sprintf( /* translators: 1: number of group memberss. */ _n( '%1$d member', '%1$d members', group.total_member_count, 'buddypress' ), group.total_member_count ) }
) }
); } ); } return ( { setAttributes( { displayGroupName: ! displayGroupName } ); } } help={ displayGroupName ? __( 'Include the group\'s name.', 'buddypress' ) : __( 'Toggle to include group\'s name.', 'buddypress' ) } /> { isAvatarEnabled && ( { setAttributes( { avatarSize: option } ); } } /> ) } { setAttributes( { extraInfo: option } ); } } /> { layoutPreference === 'grid' && ( setAttributes( { columns: value } ) } min={ 2 } max={ 4 } required /> ) } { hasGroups && (
{ groupsList }
) } { ( isSelected || 0 === itemIDs.length ) && ( ) }
); }; export default editGroupsBlock;