Version Description
= 2.9.4 = See: https://codex.buddypress.org/releases/version-2-9-4/
Download this release
Release Info
Developer | DJPaul |
Plugin | BuddyPress |
Version | 3.0.0-beta2 |
Comparing to | |
See all releases |
Code changes from version 3.0.0-beta1 to 3.0.0-beta2
- bp-groups/actions/join.php +3 -3
- bp-groups/bp-groups-filters.php +14 -3
- bp-loader.php +1 -1
- bp-templates/bp-legacy/buddypress-functions.php +4 -3
- bp-templates/bp-nouveau/buddypress/common/nav/directory-nav.php +2 -2
- bp-templates/bp-nouveau/buddypress/groups/create.php +3 -3
- bp-templates/bp-nouveau/buddypress/groups/single/activity.php +9 -11
- bp-templates/bp-nouveau/buddypress/groups/single/parts/admin-subnav.php +1 -1
- bp-templates/bp-nouveau/buddypress/groups/single/parts/item-nav.php +1 -1
- bp-templates/bp-nouveau/buddypress/members/single/notifications.php +1 -1
- bp-templates/bp-nouveau/buddypress/members/single/parts/item-nav.php +1 -1
- bp-templates/bp-nouveau/buddypress/members/single/parts/item-subnav.php +1 -1
- bp-templates/bp-nouveau/common-styles/_bp-mixins.scss +10 -3
- bp-templates/bp-nouveau/common-styles/_bp_buttons.scss +1 -1
- bp-templates/bp-nouveau/common-styles/_bp_navigation.scss +11 -10
- bp-templates/bp-nouveau/css/buddypress-rtl.css +57 -36
- bp-templates/bp-nouveau/css/buddypress-rtl.min.css +1 -1
- bp-templates/bp-nouveau/css/buddypress.css +57 -36
- bp-templates/bp-nouveau/css/buddypress.min.css +1 -1
- bp-templates/bp-nouveau/includes/customizer-controls.php +1 -1
- bp-templates/bp-nouveau/includes/functions.php +1 -1
- bp-templates/bp-nouveau/includes/groups/functions.php +1 -1
- bp-templates/bp-nouveau/includes/groups/template-tags.php +1 -1
- buddypress.pot +33 -33
- class-buddypress.php +5 -1
- cli/.distignore +13 -0
- cli/.editorconfig +25 -0
- cli/.gitignore +6 -0
- cli/.travis.yml +59 -0
- cli/bin/install-package-tests.sh +10 -0
- cli/bin/test.sh +13 -0
- cli/component.php +112 -0
- cli/components/activity-favorite.php +172 -0
- cli/components/activity.php +976 -0
- cli/components/component.php +226 -0
- cli/components/email.php +228 -0
- cli/components/friend.php +314 -0
- cli/components/group-invite.php +340 -0
- cli/components/group-member.php +358 -0
- cli/components/group.php +437 -0
- cli/components/member.php +48 -0
- cli/components/message.php +552 -0
- cli/components/signup.php +371 -0
- cli/components/tool.php +52 -0
- cli/components/xprofile-data.php +200 -0
- cli/components/xprofile-field.php +217 -0
- cli/components/xprofile-group.php +174 -0
- cli/composer.json +39 -0
- cli/features/activity-favorite.feature +39 -0
- cli/features/activity.feature +92 -0
- cli/features/bootstrap/FeatureContext.php +903 -0
- cli/features/bootstrap/Process.php +116 -0
- cli/features/bootstrap/ProcessRun.php +68 -0
- cli/features/bootstrap/support.php +194 -0
- cli/features/bootstrap/utils.php +1194 -0
- cli/features/component.feature +46 -0
- cli/features/email.feature +10 -0
- cli/features/extra/no-mail.php +7 -0
- cli/features/friend.feature +56 -0
- cli/features/group-invite.feature +62 -0
- cli/features/group-member.feature +79 -0
- cli/features/group.feature +87 -0
- cli/features/message.feature +105 -0
- cli/features/signup.feature +83 -0
- cli/features/steps/given-custom.php +30 -0
- cli/features/steps/given.php +213 -0
- cli/features/steps/then.php +217 -0
- cli/features/steps/when.php +54 -0
- cli/features/tool.feature +10 -0
- cli/features/xprofile-data.feature +52 -0
- cli/features/xprofile-field.feature +29 -0
- cli/features/xprofile-group.feature +26 -0
- cli/license.txt +280 -0
- cli/readme.md +69 -0
- cli/utils/behat-tags.php +76 -0
- cli/wp-cli-bp.php +190 -0
- cli/wp-cli.yml +2 -0
bp-groups/actions/join.php
CHANGED
@@ -28,8 +28,8 @@ function groups_action_join_group() {
|
|
28 |
// Skip if banned or already a member.
|
29 |
if ( !groups_is_user_member( bp_loggedin_user_id(), $bp->groups->current_group->id ) && !groups_is_user_banned( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
|
30 |
|
31 |
-
// User wants to join a group that
|
32 |
-
if ( bp_current_user_can( 'groups_join_group', array( 'group_id' => $bp->groups->current_group->id ) ) ) {
|
33 |
if ( !groups_check_user_has_invite( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
|
34 |
bp_core_add_message( __( 'There was an error joining the group.', 'buddypress' ), 'error' );
|
35 |
bp_core_redirect( bp_get_group_permalink( $bp->groups->current_group ) );
|
@@ -54,4 +54,4 @@ function groups_action_join_group() {
|
|
54 |
*/
|
55 |
bp_core_load_template( apply_filters( 'groups_template_group_home', 'groups/single/home' ) );
|
56 |
}
|
57 |
-
add_action( 'bp_actions', 'groups_action_join_group' );
|
28 |
// Skip if banned or already a member.
|
29 |
if ( !groups_is_user_member( bp_loggedin_user_id(), $bp->groups->current_group->id ) && !groups_is_user_banned( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
|
30 |
|
31 |
+
// User wants to join a group that requires an invitation to join.
|
32 |
+
if ( ! bp_current_user_can( 'groups_join_group', array( 'group_id' => $bp->groups->current_group->id ) ) ) {
|
33 |
if ( !groups_check_user_has_invite( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
|
34 |
bp_core_add_message( __( 'There was an error joining the group.', 'buddypress' ), 'error' );
|
35 |
bp_core_redirect( bp_get_group_permalink( $bp->groups->current_group ) );
|
54 |
*/
|
55 |
bp_core_load_template( apply_filters( 'groups_template_group_home', 'groups/single/home' ) );
|
56 |
}
|
57 |
+
add_action( 'bp_actions', 'groups_action_join_group' );
|
bp-groups/bp-groups-filters.php
CHANGED
@@ -216,11 +216,17 @@ function bp_groups_user_can_filter( $retval, $user_id, $capability, $site_id, $a
|
|
216 |
break;
|
217 |
}
|
218 |
|
|
|
|
|
|
|
219 |
// The group must allow joining, and the user should not currently be a member.
|
220 |
$group = groups_get_group( $group_id );
|
221 |
-
if ( 'public' === bp_get_group_status( $group )
|
222 |
&& ! groups_is_user_member( $user_id, $group->id )
|
223 |
-
&& ! groups_is_user_banned( $user_id, $group->id )
|
|
|
|
|
|
|
224 |
) {
|
225 |
$retval = true;
|
226 |
}
|
@@ -232,6 +238,9 @@ function bp_groups_user_can_filter( $retval, $user_id, $capability, $site_id, $a
|
|
232 |
break;
|
233 |
}
|
234 |
|
|
|
|
|
|
|
235 |
/*
|
236 |
* The group must accept membership requests, and the user should not
|
237 |
* currently be a member, have an active request, or be banned.
|
@@ -256,7 +265,6 @@ function bp_groups_user_can_filter( $retval, $user_id, $capability, $site_id, $a
|
|
256 |
* The group must allow invitations, and the user should not
|
257 |
* currently be a member or be banned from the group.
|
258 |
*/
|
259 |
-
$group = groups_get_group( $group_id );
|
260 |
// Users with the 'bp_moderate' cap can always send invitations.
|
261 |
if ( bp_user_can( $user_id, 'bp_moderate' ) ) {
|
262 |
$retval = true;
|
@@ -291,6 +299,9 @@ function bp_groups_user_can_filter( $retval, $user_id, $capability, $site_id, $a
|
|
291 |
break;
|
292 |
}
|
293 |
|
|
|
|
|
|
|
294 |
/*
|
295 |
* The group must allow invitations, and the user should not
|
296 |
* currently be a member or be banned from the group.
|
216 |
break;
|
217 |
}
|
218 |
|
219 |
+
// Set to false to begin with.
|
220 |
+
$retval = false;
|
221 |
+
|
222 |
// The group must allow joining, and the user should not currently be a member.
|
223 |
$group = groups_get_group( $group_id );
|
224 |
+
if ( ( 'public' === bp_get_group_status( $group )
|
225 |
&& ! groups_is_user_member( $user_id, $group->id )
|
226 |
+
&& ! groups_is_user_banned( $user_id, $group->id ) )
|
227 |
+
// Site admins can join any group they are not a member of.
|
228 |
+
|| ( bp_user_can( $user_id, 'bp_moderate' )
|
229 |
+
&& ! groups_is_user_member( $user_id, $group->id ) )
|
230 |
) {
|
231 |
$retval = true;
|
232 |
}
|
238 |
break;
|
239 |
}
|
240 |
|
241 |
+
// Set to false to begin with.
|
242 |
+
$retval = false;
|
243 |
+
|
244 |
/*
|
245 |
* The group must accept membership requests, and the user should not
|
246 |
* currently be a member, have an active request, or be banned.
|
265 |
* The group must allow invitations, and the user should not
|
266 |
* currently be a member or be banned from the group.
|
267 |
*/
|
|
|
268 |
// Users with the 'bp_moderate' cap can always send invitations.
|
269 |
if ( bp_user_can( $user_id, 'bp_moderate' ) ) {
|
270 |
$retval = true;
|
299 |
break;
|
300 |
}
|
301 |
|
302 |
+
// Set to false to begin with.
|
303 |
+
$retval = false;
|
304 |
+
|
305 |
/*
|
306 |
* The group must allow invitations, and the user should not
|
307 |
* currently be a member or be banned from the group.
|
bp-loader.php
CHANGED
@@ -15,7 +15,7 @@
|
|
15 |
* Description: BuddyPress adds community features to WordPress. Member Profiles, Activity Streams, Direct Messaging, Notifications, and more!
|
16 |
* Author: The BuddyPress Community
|
17 |
* Author URI: https://buddypress.org/
|
18 |
-
* Version: 3.0.0-
|
19 |
* Text Domain: buddypress
|
20 |
* Domain Path: /bp-languages/
|
21 |
* License: GPLv2 or later (license.txt)
|
15 |
* Description: BuddyPress adds community features to WordPress. Member Profiles, Activity Streams, Direct Messaging, Notifications, and more!
|
16 |
* Author: The BuddyPress Community
|
17 |
* Author URI: https://buddypress.org/
|
18 |
+
* Version: 3.0.0-beta2
|
19 |
* Text Domain: buddypress
|
20 |
* Domain Path: /bp-languages/
|
21 |
* License: GPLv2 or later (license.txt)
|
bp-templates/bp-legacy/buddypress-functions.php
CHANGED
@@ -1327,13 +1327,14 @@ function bp_legacy_theme_ajax_invite_user() {
|
|
1327 |
if ( ! bp_groups_user_can_send_invites( $_POST['group_id'] ) )
|
1328 |
return;
|
1329 |
|
1330 |
-
if ( ! friends_check_friendship( bp_loggedin_user_id(), $_POST['friend_id'] ) )
|
1331 |
-
return;
|
1332 |
-
|
1333 |
$group_id = (int) $_POST['group_id'];
|
1334 |
$friend_id = (int) $_POST['friend_id'];
|
1335 |
|
1336 |
if ( 'invite' == $_POST['friend_action'] ) {
|
|
|
|
|
|
|
|
|
1337 |
$group = groups_get_group( $group_id );
|
1338 |
|
1339 |
// Users who have previously requested membership do not need
|
1327 |
if ( ! bp_groups_user_can_send_invites( $_POST['group_id'] ) )
|
1328 |
return;
|
1329 |
|
|
|
|
|
|
|
1330 |
$group_id = (int) $_POST['group_id'];
|
1331 |
$friend_id = (int) $_POST['friend_id'];
|
1332 |
|
1333 |
if ( 'invite' == $_POST['friend_action'] ) {
|
1334 |
+
if ( ! friends_check_friendship( bp_loggedin_user_id(), $_POST['friend_id'] ) ) {
|
1335 |
+
return;
|
1336 |
+
}
|
1337 |
+
|
1338 |
$group = groups_get_group( $group_id );
|
1339 |
|
1340 |
// Users who have previously requested membership do not need
|
bp-templates/bp-nouveau/buddypress/common/nav/directory-nav.php
CHANGED
@@ -10,7 +10,7 @@
|
|
10 |
|
11 |
<?php if ( bp_nouveau_has_nav( array( 'object' => 'directory' ) ) ) : ?>
|
12 |
|
13 |
-
<ul
|
14 |
|
15 |
<?php
|
16 |
while ( bp_nouveau_nav_items() ) :
|
@@ -22,7 +22,7 @@
|
|
22 |
<?php bp_nouveau_nav_link_text(); ?>
|
23 |
|
24 |
<?php if ( bp_nouveau_nav_has_count() ) : ?>
|
25 |
-
<span><?php bp_nouveau_nav_count(); ?></span>
|
26 |
<?php endif; ?>
|
27 |
</a>
|
28 |
</li>
|
10 |
|
11 |
<?php if ( bp_nouveau_has_nav( array( 'object' => 'directory' ) ) ) : ?>
|
12 |
|
13 |
+
<ul class="component-navigation <?php bp_nouveau_directory_list_class(); ?>">
|
14 |
|
15 |
<?php
|
16 |
while ( bp_nouveau_nav_items() ) :
|
22 |
<?php bp_nouveau_nav_link_text(); ?>
|
23 |
|
24 |
<?php if ( bp_nouveau_nav_has_count() ) : ?>
|
25 |
+
<span class="count"><?php bp_nouveau_nav_count(); ?></span>
|
26 |
<?php endif; ?>
|
27 |
</a>
|
28 |
</li>
|
bp-templates/bp-nouveau/buddypress/groups/create.php
CHANGED
@@ -18,11 +18,11 @@ bp_nouveau_groups_create_hook( 'before', 'page' ); ?>
|
|
18 |
<div class="item-body" id="group-create-body">
|
19 |
|
20 |
<nav class="<?php bp_nouveau_groups_create_steps_classes(); ?>" id="group-create-tabs" role="navigation" aria-label="<?php esc_attr_e( 'Group creation menu', 'buddypress' ); ?>">
|
21 |
-
<
|
22 |
|
23 |
-
<?php
|
24 |
|
25 |
-
</
|
26 |
</nav>
|
27 |
|
28 |
<?php bp_nouveau_group_creation_screen(); ?>
|
18 |
<div class="item-body" id="group-create-body">
|
19 |
|
20 |
<nav class="<?php bp_nouveau_groups_create_steps_classes(); ?>" id="group-create-tabs" role="navigation" aria-label="<?php esc_attr_e( 'Group creation menu', 'buddypress' ); ?>">
|
21 |
+
<ol class="group-create-buttons button-tabs">
|
22 |
|
23 |
+
<?php bp_group_creation_tabs(); ?>
|
24 |
|
25 |
+
</ol>
|
26 |
</nav>
|
27 |
|
28 |
<?php bp_nouveau_group_creation_screen(); ?>
|
bp-templates/bp-nouveau/buddypress/groups/single/activity.php
CHANGED
@@ -10,28 +10,26 @@
|
|
10 |
<?php bp_nouveau_groups_activity_post_form(); ?>
|
11 |
|
12 |
|
13 |
-
|
14 |
|
15 |
-
|
16 |
-
<li class="feed"><a href="<?php bp_group_activity_feed_link(); ?>" class="bp-tooltip" data-bp-tooltip="<?php esc_attr_e( 'RSS Feed', 'buddypress' ); ?>" class="no-ajax"><span class="bp-screen-reader-text"><?php _e( 'RSS', 'buddypress' ); ?></span></a></li>
|
17 |
|
18 |
-
|
19 |
-
|
|
|
|
|
|
|
20 |
|
21 |
<?php bp_get_template_part( 'common/filters/groups-screens-filters' ); ?>
|
22 |
-
|
23 |
|
24 |
|
25 |
<?php bp_nouveau_group_hook( 'before', 'activity_content' ); ?>
|
26 |
|
27 |
-
<div class="activity single-group">
|
28 |
-
|
29 |
-
<ul id="activity-stream" class="activity-list item-list bp-list" data-bp-list="activity">
|
30 |
|
31 |
<li id="bp-activity-ajax-loader"><?php bp_nouveau_user_feedback( 'group-activity-loading' ); ?></li>
|
32 |
|
33 |
-
</ul>
|
34 |
-
|
35 |
</div><!-- .activity -->
|
36 |
|
37 |
<?php
|
10 |
<?php bp_nouveau_groups_activity_post_form(); ?>
|
11 |
|
12 |
|
13 |
+
<div class="subnav-filters filters clearfix">
|
14 |
|
15 |
+
<ul>
|
|
|
16 |
|
17 |
+
<li class="feed"><a href="<?php bp_group_activity_feed_link(); ?>" class="bp-tooltip no-ajax" data-bp-tooltip="<?php esc_attr_e( 'RSS Feed', 'buddypress' ); ?>"><span class="bp-screen-reader-text"><?php _e( 'RSS', 'buddypress' ); ?></span></a></li>
|
18 |
+
|
19 |
+
<li class="group-act-search"><?php bp_nouveau_search_form(); ?></li>
|
20 |
+
|
21 |
+
</ul>
|
22 |
|
23 |
<?php bp_get_template_part( 'common/filters/groups-screens-filters' ); ?>
|
24 |
+
</div><!-- // .subnav-filters -->
|
25 |
|
26 |
|
27 |
<?php bp_nouveau_group_hook( 'before', 'activity_content' ); ?>
|
28 |
|
29 |
+
<div id="activity-stream" class="activity single-group" data-bp-list="activity">
|
|
|
|
|
30 |
|
31 |
<li id="bp-activity-ajax-loader"><?php bp_nouveau_user_feedback( 'group-activity-loading' ); ?></li>
|
32 |
|
|
|
|
|
33 |
</div><!-- .activity -->
|
34 |
|
35 |
<?php
|
bp-templates/bp-nouveau/buddypress/groups/single/parts/admin-subnav.php
CHANGED
@@ -22,7 +22,7 @@
|
|
22 |
<?php bp_nouveau_nav_link_text(); ?>
|
23 |
|
24 |
<?php if ( bp_nouveau_nav_has_count() ) : ?>
|
25 |
-
<span><?php bp_nouveau_nav_count(); ?></span>
|
26 |
<?php endif; ?>
|
27 |
</a>
|
28 |
</li>
|
22 |
<?php bp_nouveau_nav_link_text(); ?>
|
23 |
|
24 |
<?php if ( bp_nouveau_nav_has_count() ) : ?>
|
25 |
+
<span class="count"><?php bp_nouveau_nav_count(); ?></span>
|
26 |
<?php endif; ?>
|
27 |
</a>
|
28 |
</li>
|
bp-templates/bp-nouveau/buddypress/groups/single/parts/item-nav.php
CHANGED
@@ -22,7 +22,7 @@
|
|
22 |
<?php bp_nouveau_nav_link_text(); ?>
|
23 |
|
24 |
<?php if ( bp_nouveau_nav_has_count() ) : ?>
|
25 |
-
<span><?php bp_nouveau_nav_count(); ?></span>
|
26 |
<?php endif; ?>
|
27 |
</a>
|
28 |
</li>
|
22 |
<?php bp_nouveau_nav_link_text(); ?>
|
23 |
|
24 |
<?php if ( bp_nouveau_nav_has_count() ) : ?>
|
25 |
+
<span class="count"><?php bp_nouveau_nav_count(); ?></span>
|
26 |
<?php endif; ?>
|
27 |
</a>
|
28 |
</li>
|
bp-templates/bp-nouveau/buddypress/members/single/notifications.php
CHANGED
@@ -6,7 +6,7 @@
|
|
6 |
*/
|
7 |
?>
|
8 |
|
9 |
-
<nav class="<?php bp_nouveau_single_item_subnav_classes(); ?>" id="subnav" role="navigation" aria-label="<?php esc_attr_e( '
|
10 |
<ul class="subnav">
|
11 |
|
12 |
<?php bp_get_template_part( 'members/single/parts/item-subnav' ); ?>
|
6 |
*/
|
7 |
?>
|
8 |
|
9 |
+
<nav class="<?php bp_nouveau_single_item_subnav_classes(); ?>" id="subnav" role="navigation" aria-label="<?php esc_attr_e( 'Notifications menu', 'buddypress' ); ?>">
|
10 |
<ul class="subnav">
|
11 |
|
12 |
<?php bp_get_template_part( 'members/single/parts/item-subnav' ); ?>
|
bp-templates/bp-nouveau/buddypress/members/single/parts/item-nav.php
CHANGED
@@ -22,7 +22,7 @@
|
|
22 |
<?php bp_nouveau_nav_link_text(); ?>
|
23 |
|
24 |
<?php if ( bp_nouveau_nav_has_count() ) : ?>
|
25 |
-
<span><?php bp_nouveau_nav_count(); ?></span>
|
26 |
<?php endif; ?>
|
27 |
</a>
|
28 |
</li>
|
22 |
<?php bp_nouveau_nav_link_text(); ?>
|
23 |
|
24 |
<?php if ( bp_nouveau_nav_has_count() ) : ?>
|
25 |
+
<span class="count"><?php bp_nouveau_nav_count(); ?></span>
|
26 |
<?php endif; ?>
|
27 |
</a>
|
28 |
</li>
|
bp-templates/bp-nouveau/buddypress/members/single/parts/item-subnav.php
CHANGED
@@ -18,7 +18,7 @@
|
|
18 |
<?php bp_nouveau_nav_link_text(); ?>
|
19 |
|
20 |
<?php if ( bp_nouveau_nav_has_count() ) : ?>
|
21 |
-
<span><?php bp_nouveau_nav_count(); ?></span>
|
22 |
<?php endif; ?>
|
23 |
</a>
|
24 |
</li>
|
18 |
<?php bp_nouveau_nav_link_text(); ?>
|
19 |
|
20 |
<?php if ( bp_nouveau_nav_has_count() ) : ?>
|
21 |
+
<span class="count"><?php bp_nouveau_nav_count(); ?></span>
|
22 |
<?php endif; ?>
|
23 |
</a>
|
24 |
</li>
|
bp-templates/bp-nouveau/common-styles/_bp-mixins.scss
CHANGED
@@ -338,7 +338,8 @@
|
|
338 |
|
339 |
.tabbed-links {
|
340 |
|
341 |
-
ul
|
|
|
342 |
border-bottom: 1px solid $bp-border-dark;
|
343 |
float: none;
|
344 |
margin: $marg-lrg 0 $marg-sml;
|
@@ -358,12 +359,18 @@
|
|
358 |
list-style: none;
|
359 |
margin: 0 $marg-sml 0 0;
|
360 |
|
361 |
-
a
|
|
|
362 |
background: none;
|
363 |
border: none;
|
364 |
display: block;
|
365 |
padding: 4px 10px;
|
366 |
}
|
|
|
|
|
|
|
|
|
|
|
367 |
}
|
368 |
|
369 |
li.current {
|
@@ -373,7 +380,7 @@
|
|
373 |
border-top-right-radius: 4px;
|
374 |
border-width: 1px;
|
375 |
margin-bottom: -1px;
|
376 |
-
padding: 0 $pad-sml;
|
377 |
|
378 |
a {
|
379 |
color: $black;
|
338 |
|
339 |
.tabbed-links {
|
340 |
|
341 |
+
ul,
|
342 |
+
ol {
|
343 |
border-bottom: 1px solid $bp-border-dark;
|
344 |
float: none;
|
345 |
margin: $marg-lrg 0 $marg-sml;
|
359 |
list-style: none;
|
360 |
margin: 0 $marg-sml 0 0;
|
361 |
|
362 |
+
a,
|
363 |
+
span {
|
364 |
background: none;
|
365 |
border: none;
|
366 |
display: block;
|
367 |
padding: 4px 10px;
|
368 |
}
|
369 |
+
|
370 |
+
a:focus,
|
371 |
+
a:hover {
|
372 |
+
background: none;
|
373 |
+
}
|
374 |
}
|
375 |
|
376 |
li.current {
|
380 |
border-top-right-radius: 4px;
|
381 |
border-width: 1px;
|
382 |
margin-bottom: -1px;
|
383 |
+
padding: 0 $pad-sml 1px;
|
384 |
|
385 |
a {
|
386 |
color: $black;
|
bp-templates/bp-nouveau/common-styles/_bp_buttons.scss
CHANGED
@@ -169,7 +169,7 @@
|
|
169 |
background: none;
|
170 |
border: none;
|
171 |
border-right: 1px solid $bp-border-color;
|
172 |
-
color: $light-text;
|
173 |
display: inline-block;
|
174 |
padding: $pad-xsml $pad-med;
|
175 |
|
169 |
background: none;
|
170 |
border: none;
|
171 |
border-right: 1px solid $bp-border-color;
|
172 |
+
color: $light-text-plus;
|
173 |
display: inline-block;
|
174 |
padding: $pad-xsml $pad-med;
|
175 |
|
bp-templates/bp-nouveau/common-styles/_bp_navigation.scss
CHANGED
@@ -32,7 +32,7 @@
|
|
32 |
text-decoration: none;
|
33 |
}
|
34 |
|
35 |
-
|
36 |
background: $light-grey;
|
37 |
border: 1px solid $bp-border-dark;
|
38 |
border-radius: 50%;
|
@@ -92,7 +92,7 @@
|
|
92 |
|
93 |
a {
|
94 |
|
95 |
-
|
96 |
background-color: $grey;
|
97 |
}
|
98 |
}
|
@@ -117,7 +117,7 @@
|
|
117 |
background: $dark-grey;
|
118 |
color: $off-white;
|
119 |
|
120 |
-
|
121 |
border-color: $off-white;
|
122 |
}
|
123 |
}
|
@@ -154,7 +154,7 @@
|
|
154 |
|
155 |
&.bp-dir-hori-nav {
|
156 |
|
157 |
-
nav {
|
158 |
border-bottom: 1px solid $bp-border-color;
|
159 |
border-top: 1px solid $bp-border-color;
|
160 |
|
@@ -310,7 +310,7 @@
|
|
310 |
|
311 |
a {
|
312 |
|
313 |
-
|
314 |
background-color: $white;
|
315 |
}
|
316 |
}
|
@@ -322,7 +322,7 @@
|
|
322 |
|
323 |
a {
|
324 |
|
325 |
-
|
326 |
background-color: $highlight;
|
327 |
border: 0;
|
328 |
color: $off-white;
|
@@ -334,7 +334,7 @@
|
|
334 |
|
335 |
a:hover {
|
336 |
|
337 |
-
|
338 |
background-color: $highlight;
|
339 |
border: 0;
|
340 |
color: $white;
|
@@ -346,7 +346,7 @@
|
|
346 |
|
347 |
a {
|
348 |
|
349 |
-
|
350 |
display: none;
|
351 |
}
|
352 |
}
|
@@ -359,6 +359,7 @@
|
|
359 |
ul {
|
360 |
|
361 |
li:not(.current) {
|
|
|
362 |
|
363 |
a {
|
364 |
color: $light-text;
|
@@ -436,7 +437,7 @@
|
|
436 |
|
437 |
a {
|
438 |
|
439 |
-
|
440 |
display: inline-block;
|
441 |
float: right;
|
442 |
}
|
@@ -458,7 +459,7 @@
|
|
458 |
|
459 |
a {
|
460 |
|
461 |
-
|
462 |
float: right;
|
463 |
|
464 |
}
|
32 |
text-decoration: none;
|
33 |
}
|
34 |
|
35 |
+
.count {
|
36 |
background: $light-grey;
|
37 |
border: 1px solid $bp-border-dark;
|
38 |
border-radius: 50%;
|
92 |
|
93 |
a {
|
94 |
|
95 |
+
.count {
|
96 |
background-color: $grey;
|
97 |
}
|
98 |
}
|
117 |
background: $dark-grey;
|
118 |
color: $off-white;
|
119 |
|
120 |
+
.count {
|
121 |
border-color: $off-white;
|
122 |
}
|
123 |
}
|
154 |
|
155 |
&.bp-dir-hori-nav {
|
156 |
|
157 |
+
nav:not(".tabbed-links") {
|
158 |
border-bottom: 1px solid $bp-border-color;
|
159 |
border-top: 1px solid $bp-border-color;
|
160 |
|
310 |
|
311 |
a {
|
312 |
|
313 |
+
.count {
|
314 |
background-color: $white;
|
315 |
}
|
316 |
}
|
322 |
|
323 |
a {
|
324 |
|
325 |
+
.count {
|
326 |
background-color: $highlight;
|
327 |
border: 0;
|
328 |
color: $off-white;
|
334 |
|
335 |
a:hover {
|
336 |
|
337 |
+
.count {
|
338 |
background-color: $highlight;
|
339 |
border: 0;
|
340 |
color: $white;
|
346 |
|
347 |
a {
|
348 |
|
349 |
+
.count:empty {
|
350 |
display: none;
|
351 |
}
|
352 |
}
|
359 |
ul {
|
360 |
|
361 |
li:not(.current) {
|
362 |
+
color: $light-text;
|
363 |
|
364 |
a {
|
365 |
color: $light-text;
|
437 |
|
438 |
a {
|
439 |
|
440 |
+
.count {
|
441 |
display: inline-block;
|
442 |
float: right;
|
443 |
}
|
459 |
|
460 |
a {
|
461 |
|
462 |
+
.count {
|
463 |
float: right;
|
464 |
|
465 |
}
|
bp-templates/bp-nouveau/css/buddypress-rtl.css
CHANGED
@@ -302,7 +302,7 @@ body.buddypress article.page > .entry-header .entry-title {
|
|
302 |
text-decoration: none;
|
303 |
}
|
304 |
|
305 |
-
.bp-navs ul li
|
306 |
background: #eaeaea;
|
307 |
border: 1px solid #ccc;
|
308 |
border-radius: 50%;
|
@@ -330,9 +330,9 @@ body.buddypress article.page > .entry-header .entry-title {
|
|
330 |
margin-bottom: 20px;
|
331 |
}
|
332 |
|
333 |
-
.buddypress-wrap .bp-navs li.selected a
|
334 |
-
.buddypress-wrap .bp-navs li.current a
|
335 |
-
.buddypress-wrap .bp-navs li a:hover a
|
336 |
background-color: #ccc;
|
337 |
}
|
338 |
|
@@ -354,12 +354,12 @@ body.buddypress article.page > .entry-header .entry-title {
|
|
354 |
color: #fafafa;
|
355 |
}
|
356 |
|
357 |
-
.buddypress-wrap .bp-navs li.selected a
|
358 |
-
.buddypress-wrap .bp-navs li.selected a:focus
|
359 |
-
.buddypress-wrap .bp-navs li.selected a:hover
|
360 |
-
.buddypress-wrap .bp-navs li.current a
|
361 |
-
.buddypress-wrap .bp-navs li.current a:focus
|
362 |
-
.buddypress-wrap .bp-navs li.current a:hover
|
363 |
border-color: #fafafa;
|
364 |
}
|
365 |
|
@@ -376,7 +376,7 @@ body.buddypress article.page > .entry-header .entry-title {
|
|
376 |
color: #fafafa;
|
377 |
text-decoration: none;
|
378 |
}
|
379 |
-
.buddypress-wrap.bp-dir-hori-nav nav {
|
380 |
border-bottom: 1px solid #eee;
|
381 |
border-top: 1px solid #eee;
|
382 |
-webkit-box-shadow: 0 2px 12px 0 #fafafa;
|
@@ -461,36 +461,41 @@ body.buddypress article.page > .entry-header .entry-title {
|
|
461 |
}
|
462 |
}
|
463 |
|
464 |
-
.buddypress_object_nav .bp-navs li.selected a
|
465 |
-
.buddypress_object_nav .bp-navs li.current a
|
466 |
-
.buddypress-wrap .bp-navs li.selected a
|
467 |
-
.buddypress-wrap .bp-navs li.current a
|
468 |
background-color: #fff;
|
469 |
}
|
470 |
|
471 |
-
.buddypress_object_nav .bp-navs li.dynamic a
|
472 |
-
.buddypress_object_nav .bp-navs li.dynamic.selected a
|
473 |
-
.buddypress_object_nav .bp-navs li.dynamic.current a
|
474 |
-
.buddypress-wrap .bp-navs li.dynamic a
|
475 |
-
.buddypress-wrap .bp-navs li.dynamic.selected a
|
476 |
-
.buddypress-wrap .bp-navs li.dynamic.current a
|
477 |
background-color: #5087e5;
|
478 |
border: 0;
|
479 |
color: #fafafa;
|
480 |
}
|
481 |
|
482 |
-
.buddypress_object_nav .bp-navs li.dynamic a:hover
|
483 |
-
.buddypress-wrap .bp-navs li.dynamic a:hover
|
484 |
background-color: #5087e5;
|
485 |
border: 0;
|
486 |
color: #fff;
|
487 |
}
|
488 |
|
489 |
-
.buddypress_object_nav .bp-navs li a
|
490 |
-
.buddypress-wrap .bp-navs li a
|
491 |
display: none;
|
492 |
}
|
493 |
|
|
|
|
|
|
|
|
|
|
|
494 |
.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a,
|
495 |
.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a {
|
496 |
color: #767676;
|
@@ -532,7 +537,7 @@ body.buddypress article.page > .entry-header .entry-title {
|
|
532 |
}
|
533 |
}
|
534 |
|
535 |
-
.buddypress_object_nav .bp-navs li a
|
536 |
display: inline-block;
|
537 |
float: left;
|
538 |
}
|
@@ -541,45 +546,61 @@ body.buddypress article.page > .entry-header .entry-title {
|
|
541 |
.bp-dir-vert-nav .bp-navs.dir-navs {
|
542 |
background: none;
|
543 |
}
|
544 |
-
.bp-dir-vert-nav .bp-navs.dir-navs a
|
545 |
float: left;
|
546 |
}
|
547 |
}
|
548 |
|
549 |
@media screen and (min-width: 46.8em) {
|
550 |
-
.buddypress-wrap .item-body .tabbed-links ul
|
|
|
551 |
border-bottom: 1px solid #ccc;
|
552 |
float: none;
|
553 |
margin: 20px 0 10px;
|
554 |
}
|
555 |
-
.buddypress-wrap .item-body .tabbed-links ul:before, .buddypress-wrap .item-body .tabbed-links ul:after
|
|
|
|
|
556 |
content: " ";
|
557 |
display: block;
|
558 |
}
|
559 |
-
.buddypress-wrap .item-body .tabbed-links ul:after
|
|
|
560 |
clear: both;
|
561 |
}
|
562 |
-
.buddypress-wrap .item-body .tabbed-links ul li
|
|
|
563 |
float: right;
|
564 |
list-style: none;
|
565 |
margin: 0 0 0 10px;
|
566 |
}
|
567 |
-
.buddypress-wrap .item-body .tabbed-links ul li a
|
|
|
|
|
|
|
568 |
background: none;
|
569 |
border: none;
|
570 |
display: block;
|
571 |
padding: 4px 10px;
|
572 |
}
|
573 |
-
.buddypress-wrap .item-body .tabbed-links ul li
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
574 |
border-color: #ccc #ccc #fff;
|
575 |
border-style: solid;
|
576 |
border-top-right-radius: 4px;
|
577 |
border-top-left-radius: 4px;
|
578 |
border-width: 1px;
|
579 |
margin-bottom: -1px;
|
580 |
-
padding: 0 0.5em;
|
581 |
}
|
582 |
-
.buddypress-wrap .item-body .tabbed-links ul li.current a
|
|
|
583 |
color: #333;
|
584 |
}
|
585 |
.buddypress-wrap .item-body .bp-subnavs.tabbed-links > ul {
|
@@ -3980,7 +4001,7 @@ body.no-js .buddypress #messages-bulk-management #select-all-messages {
|
|
3980 |
background: none;
|
3981 |
border: none;
|
3982 |
border-left: 1px solid #eee;
|
3983 |
-
color: #
|
3984 |
display: inline-block;
|
3985 |
padding: 0.3em 1em;
|
3986 |
}
|
302 |
text-decoration: none;
|
303 |
}
|
304 |
|
305 |
+
.bp-navs ul li .count {
|
306 |
background: #eaeaea;
|
307 |
border: 1px solid #ccc;
|
308 |
border-radius: 50%;
|
330 |
margin-bottom: 20px;
|
331 |
}
|
332 |
|
333 |
+
.buddypress-wrap .bp-navs li.selected a .count,
|
334 |
+
.buddypress-wrap .bp-navs li.current a .count,
|
335 |
+
.buddypress-wrap .bp-navs li a:hover a .count {
|
336 |
background-color: #ccc;
|
337 |
}
|
338 |
|
354 |
color: #fafafa;
|
355 |
}
|
356 |
|
357 |
+
.buddypress-wrap .bp-navs li.selected a .count,
|
358 |
+
.buddypress-wrap .bp-navs li.selected a:focus .count,
|
359 |
+
.buddypress-wrap .bp-navs li.selected a:hover .count,
|
360 |
+
.buddypress-wrap .bp-navs li.current a .count,
|
361 |
+
.buddypress-wrap .bp-navs li.current a:focus .count,
|
362 |
+
.buddypress-wrap .bp-navs li.current a:hover .count {
|
363 |
border-color: #fafafa;
|
364 |
}
|
365 |
|
376 |
color: #fafafa;
|
377 |
text-decoration: none;
|
378 |
}
|
379 |
+
.buddypress-wrap.bp-dir-hori-nav nav:not(".tabbed-links") {
|
380 |
border-bottom: 1px solid #eee;
|
381 |
border-top: 1px solid #eee;
|
382 |
-webkit-box-shadow: 0 2px 12px 0 #fafafa;
|
461 |
}
|
462 |
}
|
463 |
|
464 |
+
.buddypress_object_nav .bp-navs li.selected a .count,
|
465 |
+
.buddypress_object_nav .bp-navs li.current a .count,
|
466 |
+
.buddypress-wrap .bp-navs li.selected a .count,
|
467 |
+
.buddypress-wrap .bp-navs li.current a .count {
|
468 |
background-color: #fff;
|
469 |
}
|
470 |
|
471 |
+
.buddypress_object_nav .bp-navs li.dynamic a .count,
|
472 |
+
.buddypress_object_nav .bp-navs li.dynamic.selected a .count,
|
473 |
+
.buddypress_object_nav .bp-navs li.dynamic.current a .count,
|
474 |
+
.buddypress-wrap .bp-navs li.dynamic a .count,
|
475 |
+
.buddypress-wrap .bp-navs li.dynamic.selected a .count,
|
476 |
+
.buddypress-wrap .bp-navs li.dynamic.current a .count {
|
477 |
background-color: #5087e5;
|
478 |
border: 0;
|
479 |
color: #fafafa;
|
480 |
}
|
481 |
|
482 |
+
.buddypress_object_nav .bp-navs li.dynamic a:hover .count,
|
483 |
+
.buddypress-wrap .bp-navs li.dynamic a:hover .count {
|
484 |
background-color: #5087e5;
|
485 |
border: 0;
|
486 |
color: #fff;
|
487 |
}
|
488 |
|
489 |
+
.buddypress_object_nav .bp-navs li a .count:empty,
|
490 |
+
.buddypress-wrap .bp-navs li a .count:empty {
|
491 |
display: none;
|
492 |
}
|
493 |
|
494 |
+
.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current),
|
495 |
+
.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) {
|
496 |
+
color: #767676;
|
497 |
+
}
|
498 |
+
|
499 |
.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a,
|
500 |
.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a {
|
501 |
color: #767676;
|
537 |
}
|
538 |
}
|
539 |
|
540 |
+
.buddypress_object_nav .bp-navs li a .count {
|
541 |
display: inline-block;
|
542 |
float: left;
|
543 |
}
|
546 |
.bp-dir-vert-nav .bp-navs.dir-navs {
|
547 |
background: none;
|
548 |
}
|
549 |
+
.bp-dir-vert-nav .bp-navs.dir-navs a .count {
|
550 |
float: left;
|
551 |
}
|
552 |
}
|
553 |
|
554 |
@media screen and (min-width: 46.8em) {
|
555 |
+
.buddypress-wrap .item-body .tabbed-links ul,
|
556 |
+
.buddypress-wrap .item-body .tabbed-links ol {
|
557 |
border-bottom: 1px solid #ccc;
|
558 |
float: none;
|
559 |
margin: 20px 0 10px;
|
560 |
}
|
561 |
+
.buddypress-wrap .item-body .tabbed-links ul:before, .buddypress-wrap .item-body .tabbed-links ul:after,
|
562 |
+
.buddypress-wrap .item-body .tabbed-links ol:before,
|
563 |
+
.buddypress-wrap .item-body .tabbed-links ol:after {
|
564 |
content: " ";
|
565 |
display: block;
|
566 |
}
|
567 |
+
.buddypress-wrap .item-body .tabbed-links ul:after,
|
568 |
+
.buddypress-wrap .item-body .tabbed-links ol:after {
|
569 |
clear: both;
|
570 |
}
|
571 |
+
.buddypress-wrap .item-body .tabbed-links ul li,
|
572 |
+
.buddypress-wrap .item-body .tabbed-links ol li {
|
573 |
float: right;
|
574 |
list-style: none;
|
575 |
margin: 0 0 0 10px;
|
576 |
}
|
577 |
+
.buddypress-wrap .item-body .tabbed-links ul li a,
|
578 |
+
.buddypress-wrap .item-body .tabbed-links ul li span,
|
579 |
+
.buddypress-wrap .item-body .tabbed-links ol li a,
|
580 |
+
.buddypress-wrap .item-body .tabbed-links ol li span {
|
581 |
background: none;
|
582 |
border: none;
|
583 |
display: block;
|
584 |
padding: 4px 10px;
|
585 |
}
|
586 |
+
.buddypress-wrap .item-body .tabbed-links ul li a:focus,
|
587 |
+
.buddypress-wrap .item-body .tabbed-links ul li a:hover,
|
588 |
+
.buddypress-wrap .item-body .tabbed-links ol li a:focus,
|
589 |
+
.buddypress-wrap .item-body .tabbed-links ol li a:hover {
|
590 |
+
background: none;
|
591 |
+
}
|
592 |
+
.buddypress-wrap .item-body .tabbed-links ul li.current,
|
593 |
+
.buddypress-wrap .item-body .tabbed-links ol li.current {
|
594 |
border-color: #ccc #ccc #fff;
|
595 |
border-style: solid;
|
596 |
border-top-right-radius: 4px;
|
597 |
border-top-left-radius: 4px;
|
598 |
border-width: 1px;
|
599 |
margin-bottom: -1px;
|
600 |
+
padding: 0 0.5em 1px;
|
601 |
}
|
602 |
+
.buddypress-wrap .item-body .tabbed-links ul li.current a,
|
603 |
+
.buddypress-wrap .item-body .tabbed-links ol li.current a {
|
604 |
color: #333;
|
605 |
}
|
606 |
.buddypress-wrap .item-body .bp-subnavs.tabbed-links > ul {
|
4001 |
background: none;
|
4002 |
border: none;
|
4003 |
border-left: 1px solid #eee;
|
4004 |
+
color: #737373;
|
4005 |
display: inline-block;
|
4006 |
padding: 0.3em 1em;
|
4007 |
}
|
bp-templates/bp-nouveau/css/buddypress-rtl.min.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
body #buddypress * a{box-shadow:none;text-decoration:none}body #buddypress #item-body blockquote,body #buddypress .bp-lists blockquote{margin-right:10px}body #buddypress .bp-list .action{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@media screen and (min-width:46.8em){body.buddypress .entry-content,body.buddypress .entry-header,body.buddypress .site-content .entry-header{max-width:none}body.buddypress .entry-header{float:none;max-width:none}body.buddypress .entry-content{float:none;max-width:none}body.buddypress .site-content{padding-top:2.5em}body.buddypress #page #primary{max-width:none}body.buddypress #page #primary .entry-content,body.buddypress #page #primary .entry-header{float:none;width:auto}}body.buddypress .buddypress-wrap h1,body.buddypress .buddypress-wrap h2,body.buddypress .buddypress-wrap h3,body.buddypress .buddypress-wrap h4,body.buddypress .buddypress-wrap h5,body.buddypress .buddypress-wrap h6{clear:none;margin:1em 0;padding:0}.bp-wrap:after,.bp-wrap:before{content:" ";display:table}.bp-wrap:after{clear:both}.buddypress-wrap.round-avatars .avatar{border-radius:50%}div,dl,input[type=reset],input[type=search],input[type=submit],li,select,textarea{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;border-radius:2px;background-clip:padding-box}body.buddypress article.page>.entry-header{margin-bottom:2em;padding:0}body.buddypress article.page>.entry-header .entry-title{font-size:28px;font-weight:inherit;color:#767676}@media screen and (min-width:46.8em){body.buddypress article.page>.entry-header .entry-title{font-size:34px}}.buddypress-wrap dt.section-title{font-size:18px}@media screen and (min-width:46.8em){.buddypress-wrap dt.section-title{font-size:22px}}.buddypress-wrap .bp-label-text,.buddypress-wrap .message-threads{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-label-text,.buddypress-wrap .message-threads{font-size:16px}}.buddypress-wrap .activity-header{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .activity-header{font-size:16px}}.buddypress-wrap .activity-inner{font-size:15px}@media screen and (min-width:46.8em){.buddypress-wrap .activity-inner{font-size:18px}}.buddypress-wrap #whats-new-post-in{font-size:16px}.buddypress-wrap .acomment-meta,.buddypress-wrap .mini .activity-header{font-size:16px}.buddypress-wrap .dir-component-filters #activity-filter-by{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .dir-component-filters #activity-filter-by{font-size:16px}}.buddypress-wrap .bp-tables-user th{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-tables-user th{font-size:16px}}.buddypress-wrap .bp-tables-user td{font-size:12px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-tables-user td{font-size:14px}}.buddypress-wrap .profile-fields th{font-size:15px}@media screen and (min-width:46.8em){.buddypress-wrap .profile-fields th{font-size:18px}}.buddypress-wrap .profile-fields td{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .profile-fields td{font-size:16px}}.buddypress-wrap #notification-select{font-size:12px}@media screen and (min-width:46.8em){.buddypress-wrap #notification-select{font-size:14px}}.bp-navs{background:0 0;clear:both;overflow:hidden}.bp-navs ul{margin:0;padding:0}.bp-navs ul li{list-style:none;margin:0}.bp-navs ul li.last select{max-width:185px}.bp-navs ul li a,.bp-navs ul li span{border:0;display:block;padding:5px 10px;text-decoration:none}.bp-navs ul li span{background:#eaeaea;border:1px solid #ccc;border-radius:50%;color:#555;display:inline;font-size:12px;margin-right:2px;padding:3px 6px;text-align:center;vertical-align:middle}.bp-navs ul li.current a,.bp-navs ul li.selected a{color:#333;opacity:1}.bp-navs.bp-invites-filters ul li a,.bp-navs.bp-messages-filters ul li a{border:1px solid #ccc;display:inline-block}.main-navs.dir-navs{margin-bottom:20px}.buddypress-wrap .bp-navs li a:hover a span,.buddypress-wrap .bp-navs li.current a span,.buddypress-wrap .bp-navs li.selected a span{background-color:#ccc}.buddypress-wrap .bp-navs li:not(.current) a:focus,.buddypress-wrap .bp-navs li:not(.current) a:hover,.buddypress-wrap .bp-navs li:not(.selected) a:focus,.buddypress-wrap .bp-navs li:not(.selected) a:hover{background:#ccc;color:#333}.buddypress-wrap .bp-navs li.current a,.buddypress-wrap .bp-navs li.current a:focus,.buddypress-wrap .bp-navs li.current a:hover,.buddypress-wrap .bp-navs li.selected a,.buddypress-wrap .bp-navs li.selected a:focus,.buddypress-wrap .bp-navs li.selected a:hover{background:#555;color:#fafafa}.buddypress-wrap .bp-navs li.current a span,.buddypress-wrap .bp-navs li.current a:focus span,.buddypress-wrap .bp-navs li.current a:hover span,.buddypress-wrap .bp-navs li.selected a span,.buddypress-wrap .bp-navs li.selected a:focus span,.buddypress-wrap .bp-navs li.selected a:hover span{border-color:#fafafa}@media screen and (min-width:46.8em){.buddypress-wrap .main-navs:not(.dir-navs) li.current a,.buddypress-wrap .main-navs:not(.dir-navs) li.selected a{background:#fff;color:#333;font-weight:600}.buddypress-wrap .main-navs.vertical li.current a,.buddypress-wrap .main-navs.vertical li.selected a{background:#555;color:#fafafa;text-decoration:none}.buddypress-wrap.bp-dir-hori-nav nav{border-bottom:1px solid #eee;border-top:1px solid #eee;-webkit-box-shadow:0 2px 12px 0 #fafafa;-moz-box-shadow:0 2px 12px 0 #fafafa;box-shadow:0 2px 12px 0 #fafafa}}.buddypress-wrap .bp-subnavs li.current a,.buddypress-wrap .bp-subnavs li.selected a{background:#fff;color:#333;font-weight:600}@media screen and (max-width:46.8em){.buddypress-wrap:not(.bp-single-vert-nav) .bp-navs li{background:#eaeaea}}.buddypress-wrap:not(.bp-single-vert-nav) .main-navs>ul>li>a{padding:.5em calc(.5em + 2px)}.buddypress-wrap:not(.bp-single-vert-nav) .group-subnav#subsubnav,.buddypress-wrap:not(.bp-single-vert-nav) .user-subnav#subsubnav{background:0 0}.buddypress-wrap .bp-subnavs,.buddypress-wrap ul.subnav{width:100%}.buddypress-wrap .bp-subnavs{margin:10px 0;overflow:hidden}.buddypress-wrap .bp-subnavs ul li{margin-top:0}.buddypress-wrap .bp-subnavs ul li.current :focus,.buddypress-wrap .bp-subnavs ul li.current :hover,.buddypress-wrap .bp-subnavs ul li.selected :focus,.buddypress-wrap .bp-subnavs ul li.selected :hover{background:0 0;color:#333}.buddypress-wrap ul.subnav{width:auto}.buddypress-wrap .bp-navs.bp-invites-filters#subsubnav ul li.last,.buddypress-wrap .bp-navs.bp-invites-nav#subnav ul li.last,.buddypress-wrap .bp-navs.bp-messages-filters#subsubnav ul li.last{margin-top:0}@media screen and (max-width:46.8em){.buddypress-wrap .single-screen-navs{border:1px solid #eee}.buddypress-wrap .single-screen-navs li{border-bottom:1px solid #eee}.buddypress-wrap .single-screen-navs li:last-child{border-bottom:none}.buddypress-wrap .bp-subnavs li a{font-size:14px}.buddypress-wrap .bp-subnavs li.current a,.buddypress-wrap .bp-subnavs li.current a:focus,.buddypress-wrap .bp-subnavs li.current a:hover,.buddypress-wrap .bp-subnavs li.selected a,.buddypress-wrap .bp-subnavs li.selected a:focus,.buddypress-wrap .bp-subnavs li.selected a:hover{background:#555;color:#fff}}.buddypress-wrap .bp-navs li.current a span,.buddypress-wrap .bp-navs li.selected a span,.buddypress_object_nav .bp-navs li.current a span,.buddypress_object_nav .bp-navs li.selected a span{background-color:#fff}.buddypress-wrap .bp-navs li.dynamic a span,.buddypress-wrap .bp-navs li.dynamic.current a span,.buddypress-wrap .bp-navs li.dynamic.selected a span,.buddypress_object_nav .bp-navs li.dynamic a span,.buddypress_object_nav .bp-navs li.dynamic.current a span,.buddypress_object_nav .bp-navs li.dynamic.selected a span{background-color:#5087e5;border:0;color:#fafafa}.buddypress-wrap .bp-navs li.dynamic a:hover span,.buddypress_object_nav .bp-navs li.dynamic a:hover span{background-color:#5087e5;border:0;color:#fff}.buddypress-wrap .bp-navs li a span:empty,.buddypress_object_nav .bp-navs li a span:empty{display:none}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a{color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a:focus,.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a:hover,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a:focus,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a:hover{background:0 0;color:#333}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a[disabled]:focus,.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a[disabled]:hover,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a[disabled]:focus,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a[disabled]:hover{color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li.current a,.buddypress_object_nav .bp-navs.group-create-links ul li.current a{text-align:center}@media screen and (min-width:46.8em){.buddypress-wrap .bp-navs li{float:right}.buddypress-wrap .subnav{float:right}.buddypress-wrap ul.subnav{width:auto}.buddypress-wrap #subsubnav .activity-search{float:right}.buddypress-wrap #subsubnav .filter{float:left}}.buddypress_object_nav .bp-navs li a span{display:inline-block;float:left}@media screen and (min-width:46.8em){.bp-dir-vert-nav .bp-navs.dir-navs{background:0 0}.bp-dir-vert-nav .bp-navs.dir-navs a span{float:left}}@media screen and (min-width:46.8em){.buddypress-wrap .item-body .tabbed-links ul{border-bottom:1px solid #ccc;float:none;margin:20px 0 10px}.buddypress-wrap .item-body .tabbed-links ul:after,.buddypress-wrap .item-body .tabbed-links ul:before{content:" ";display:block}.buddypress-wrap .item-body .tabbed-links ul:after{clear:both}.buddypress-wrap .item-body .tabbed-links ul li{float:right;list-style:none;margin:0 0 0 10px}.buddypress-wrap .item-body .tabbed-links ul li a{background:0 0;border:none;display:block;padding:4px 10px}.buddypress-wrap .item-body .tabbed-links ul li.current{border-color:#ccc #ccc #fff;border-style:solid;border-top-right-radius:4px;border-top-left-radius:4px;border-width:1px;margin-bottom:-1px;padding:0 .5em}.buddypress-wrap .item-body .tabbed-links ul li.current a{color:#333}.buddypress-wrap .item-body .bp-subnavs.tabbed-links>ul{margin-top:0}.buddypress-wrap .item-body .bp-navs.tabbed-links{background:0 0;margin-top:2px}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a{border-left:0;font-size:inherit}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.last{float:left;margin:0}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.last a{margin-top:-.5em}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:focus,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:hover,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:focus,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:hover{background:0 0;border:0}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:active,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:active{outline:0}}.buddypress-wrap .dir-component-filters .filter label{display:inline}.buddypress-wrap .subnav-filters:after,.buddypress-wrap .subnav-filters:before{content:" ";display:table}.buddypress-wrap .subnav-filters:after{clear:both}.buddypress-wrap .subnav-filters{background:0 0;list-style:none;margin:15px 0 0;padding:0}.buddypress-wrap .subnav-filters div{margin:0}.buddypress-wrap .subnav-filters>ul{float:right;list-style:none}.buddypress-wrap .subnav-filters.bp-messages-filters ul{width:100%}.buddypress-wrap .subnav-filters.bp-messages-filters .messages-search{margin-bottom:1em}@media screen and (min-width:46.8em){.buddypress-wrap .subnav-filters.bp-messages-filters .messages-search{margin-bottom:0}}.buddypress-wrap .subnav-filters div{float:none}.buddypress-wrap .subnav-filters div input[type=search],.buddypress-wrap .subnav-filters div select{font-size:16px}.buddypress-wrap .subnav-filters div button.nouveau-search-submit{padding:5px .8em 6px}.buddypress-wrap .subnav-filters div button#user_messages_search_submit{padding:7px .8em}.buddypress-wrap .subnav-filters .component-filters{margin-top:10px}.buddypress-wrap .subnav-filters .feed{margin-left:15px}.buddypress-wrap .subnav-filters .last.filter label{display:inline}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:after,.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:before{content:" ";display:table}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:after{clear:both}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap.bp-show{display:inline-block}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap.bp-hide{display:none}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap{border:0}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap:focus,.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap:hover{outline:1px solid #d6d6d6}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions{float:right}.buddypress-wrap .subnav-filters .user-messages-bulk-actions label{display:inline-block;font-weight:300;margin-left:25px;padding:5px 0}.buddypress-wrap .subnav-filters .user-messages-bulk-actions div select{-webkit-appearance:textfield}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-apply{border:0;border-radius:none;font-weight:400;line-height:1.8;margin:0 10px 0 0;padding:3px 5px;text-align:center;text-transform:none;width:auto}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-apply span{vertical-align:middle}@media screen and (min-width:32em){.buddypress-wrap .subnav-filters li{margin-bottom:0}.buddypress-wrap .subnav-filters .bp-search,.buddypress-wrap .subnav-filters .dir-search,.buddypress-wrap .subnav-filters .feed,.buddypress-wrap .subnav-filters .group-act-search,.buddypress-wrap .subnav-filters .group-invites-search,.buddypress-wrap .subnav-filters .subnav-search,.buddypress-wrap .subnav-filters .subnav-search form,.buddypress-wrap .subnav-filters .user-messages-bulk-actions,.buddypress-wrap .subnav-filters .user-messages-search{float:right}.buddypress-wrap .subnav-filters .component-filters,.buddypress-wrap .subnav-filters .last{float:left;margin-top:0;width:auto}.buddypress-wrap .subnav-filters .component-filters select,.buddypress-wrap .subnav-filters .last select{max-width:250px}.buddypress-wrap .subnav-filters .user-messages-search{float:left}}.buddypress-wrap .notifications-options-nav input#notification-bulk-manage{border:0;border-radius:0;line-height:1.6}.buddypress-wrap .bp-pagination{background:0 0;border:0;color:#767676;float:right;font-size:small;margin:0;padding:.5em 0;position:relative;width:100%}.buddypress-wrap .bp-pagination .pag-count{float:right}.buddypress-wrap .bp-pagination .bp-pagination-links{float:left;margin-left:10px}.buddypress-wrap .bp-pagination .bp-pagination-links a,.buddypress-wrap .bp-pagination .bp-pagination-links span{font-size:small;padding:0 5px}.buddypress-wrap .bp-pagination .bp-pagination-links a:focus,.buddypress-wrap .bp-pagination .bp-pagination-links a:hover{opacity:1}.buddypress-wrap .bp-pagination p{margin:0}.bp-list:after,.bp-list:before{content:" ";display:table}.bp-list:after{clear:both}.bp-list{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-top:1px solid #eaeaea;clear:both;list-style:none;margin:20px 0;padding:.5em 0;width:100%}.bp-list li:after,.bp-list li:before{content:" ";display:table}.bp-list li:after{clear:both}.bp-list>li{border-bottom:1px solid #eaeaea}.bp-list li{list-style:none;margin:10px 0;padding:.5em 0;position:relative}.bp-list li .item-avatar{text-align:center}.bp-list li .item-avatar img.avatar{display:inline}.bp-list li .item .group-details,.bp-list li .item .item-avatar,.bp-list li .item .item-meta,.bp-list li .item .list-title{text-align:center}.bp-list li .item .list-title{clear:none;font-size:22px;font-weight:400;line-height:1.1;margin:0 auto}@media screen and (min-width:46.8em){.bp-list li .item .list-title{font-size:26px}}.bp-list li .item-meta,.bp-list li .meta{color:#737373;font-size:12px;margin-top:10px}.bp-list li .last-post{text-align:center}.bp-list li .action{margin:0;text-align:center}.bp-list li .action .generic-button{display:inline-block;font-size:12px;margin:0 0 0 10px}.bp-list li .action div.generic-button{margin:10px 0}@media screen and (min-width:46.8em){.bp-list li .item-avatar{float:right;margin-left:5%}.bp-list li .item{margin:0;overflow:hidden}.bp-list li .item .item-block{float:right;margin-left:2%;width:50%}.bp-list li .item .item-meta,.bp-list li .item .list-title{float:right;text-align:right}.bp-list li .item .group-details,.bp-list li .item .last-post{text-align:right}.bp-list li .group-desc,.bp-list li .last-post,.bp-list li .user-update{clear:none;overflow:hidden;width:auto}.bp-list li .action{clear:right;padding:0;text-align:right}.bp-list li .action li.generic-button{margin-left:0}.bp-list li .action div.generic-button{margin:0 0 10px}.bp-list li .generic-button{display:block;margin:0 0 5px 0}}@media screen and (min-width:32em){#activity-stream{clear:both;padding-top:1em}}.activity-list.bp-list{background:#fafafa;border:1px solid #eee}.activity-list.bp-list .activity-item{background:#fff;border:1px solid #b7b7b7;-webkit-box-shadow:0 0 6px #d2d2d2;-moz-box-shadow:0 0 6px #d2d2d2;box-shadow:0 0 6px #d2d2d2;margin:20px 0}.activity-list.bp-list li:first-child{margin-top:0}.friends-request-list .item-title{text-align:center}@media screen and (min-width:46.8em){.friends-request-list li{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap}.friends-request-list li .item{-webkit-flex:1 1 auto;-moz-flex:1 1 auto;-ms-flex:1 1 auto;-o-flex:1 1 auto;flex:1 1 auto}.friends-request-list li .action{text-align:left}.friends-request-list li .item-title{font-size:22px;text-align:right}}#notifications-user-list{clear:both;padding-top:1em}@media screen and (min-width:46.8em){body:not(.logged-in) .bp-list .item{margin-left:0}}.activity-permalink .item-list,.activity-permalink .item-list li.activity-item{border:0}.activity-update-form{padding:10px 10px 0}.item-body .activity-update-form .activity-form{margin:0;padding:0}.activity-update-form{border:1px solid #ccc;-webkit-box-shadow:inset 0 0 6px #eee;-moz-box-shadow:inset 0 0 6px #eee;box-shadow:inset 0 0 6px #eee;margin:15px 0}.activity-update-form #whats-new-avatar{margin:10px 0;text-align:center}.activity-update-form #whats-new-avatar img{display:inline-block}.activity-update-form #whats-new-content{padding:0 0 20px 0}.activity-update-form #whats-new-textarea textarea{background:#fff;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#333;font-family:inherit;font-size:medium;height:2.2em;line-height:1.4;padding:6px;width:100%}.activity-update-form #whats-new-textarea textarea:focus{-webkit-box-shadow:0 0 6px 0 #d6d6d6;-moz-box-shadow:0 0 6px 0 #d6d6d6;box-shadow:0 0 6px 0 #d6d6d6}.activity-update-form #whats-new-post-in-box{margin:10px 0}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items{list-style:none;margin:10px 0}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items li{margin-bottom:10px}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items #activity-autocomplete{padding:.3em}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center;padding:.2em}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object .avatar{width:30px}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object span{padding-right:10px;vertical-align:middle}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object:focus,.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object:hover{background:#eaeaea;cursor:pointer}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object.selected{border:1px solid #d6d6d6}.activity-update-form #whats-new-submit{margin:15px 0 10px}.activity-update-form #whats-new-submit input{font-size:14px;line-height:inherit;margin-bottom:10px;margin-left:10px;padding:.2em 0;text-align:center;width:100%}@media screen and (min-width:46.8em){.activity-update-form #whats-new-avatar{display:block;float:right;margin:0 0 0 10px}.activity-update-form #whats-new-content,.activity-update-form #whats-new-post-in-box,.activity-update-form #whats-new-submit{margin-right:12%}.activity-update-form #whats-new-submit input{margin-bottom:0;margin-left:10px;width:8em}}.activity-list{padding:.5em}.activity-list .activity-item:after,.activity-list .activity-item:before{content:" ";display:table}.activity-list .activity-item:after{clear:both}.activity-list .activity-item{list-style:none;padding:1em}.activity-list .activity-item.has-comments{padding-bottom:1em}.activity-list .activity-item div.item-avatar{margin:0 auto;text-align:center;width:auto}.activity-list .activity-item div.item-avatar img{max-width:40%}@media screen and (min-width:46.8em){.activity-list .activity-item div.item-avatar{margin:0 0 0 2%;text-align:right;width:15%}.activity-list .activity-item div.item-avatar img{max-width:80%}}.activity-list .activity-item.mini{font-size:13px;position:relative}.activity-list .activity-item.mini .activity-avatar{margin-right:0 auto;text-align:center;width:auto}.activity-list .activity-item.mini .activity-avatar img.FB_profile_pic,.activity-list .activity-item.mini .activity-avatar img.avatar{max-width:15%}@media screen and (min-width:46.8em){.activity-list .activity-item.mini .activity-avatar{margin-right:15px;text-align:right;width:15%}.activity-list .activity-item.mini .activity-avatar img.FB_profile_pic,.activity-list .activity-item.mini .activity-avatar img.avatar{max-width:60%}}.activity-list .activity-item.new_forum_post .activity-inner,.activity-list .activity-item.new_forum_topic .activity-inner{border-right:2px solid #eaeaea;margin-right:10px;padding-right:1em}.activity-list .activity-item.newest_blogs_activity,.activity-list .activity-item.newest_friends_activity,.activity-list .activity-item.newest_groups_activity,.activity-list .activity-item.newest_mentions_activity{background:rgba(31,179,221,.1)}.activity-list .activity-item .activity-inreplyto{color:#767676;font-size:13px}.activity-list .activity-item .activity-inreplyto>p{display:inline;margin:0}.activity-list .activity-item .activity-inreplyto .activity-inner,.activity-list .activity-item .activity-inreplyto blockquote{background:0 0;border:0;display:inline;margin:0;overflow:hidden;padding:0}.activity-list .activity-item .activity-header{margin:0 auto;width:80%}.activity-list .activity-item .activity-header a,.activity-list .activity-item .activity-header img{display:inline}.activity-list .activity-item .activity-header .avatar{display:inline-block;margin:0 5px;vertical-align:bottom}.activity-list .activity-item .activity-header .time-since{font-size:14px;color:#767676;text-decoration:none}.activity-list .activity-item .activity-header .time-since:hover{color:#767676;cursor:pointer;text-decoration:underline}.activity-list .activity-item .activity-content .activity-header,.activity-list .activity-item .activity-content .comment-header{color:#767676;margin-bottom:10px}.activity-list .activity-item .activity-content .activity-inner,.activity-list .activity-item .activity-content blockquote{background:#fafafa;margin:15px 0 10px;overflow:hidden;padding:1em}.activity-list .activity-item .activity-content p{margin:0}.activity-list .activity-item .activity-inner p{word-wrap:break-word}.activity-list .activity-item .activity-read-more{margin-right:1em;white-space:nowrap}.activity-list .activity-item ul.activity-meta{margin:0;padding-right:0}.activity-list .activity-item ul.activity-meta li{border:0;display:inline-block}.activity-list .activity-item .activity-meta.action{border:1px solid transparent;background:#fafafa;padding:2px;position:relative;text-align:right}.activity-list .activity-item .activity-meta.action div.generic-button{margin:0}.activity-list .activity-item .activity-meta.action .button{background:0 0}.activity-list .activity-item .activity-meta.action a{padding:4px 8px}.activity-list .activity-item .activity-meta.action .button:focus,.activity-list .activity-item .activity-meta.action .button:hover{background:0 0}.activity-list .activity-item .activity-meta.action .button:before,.activity-list .activity-item .activity-meta.action .icons:before{font-family:dashicons;font-size:18px;vertical-align:middle}.activity-list .activity-item .activity-meta.action .acomment-reply.button:before{content:"\f101"}.activity-list .activity-item .activity-meta.action .view:before{content:"\f125"}.activity-list .activity-item .activity-meta.action .fav:before{content:"\f154"}.activity-list .activity-item .activity-meta.action .unfav:before{content:"\f155"}.activity-list .activity-item .activity-meta.action .delete-activity:before{content:"\f153"}.activity-list .activity-item .activity-meta.action .delete-activity:hover{color:#800}.activity-list .activity-item .activity-meta.action .button{border:0;box-shadow:none}.activity-list .activity-item .activity-meta.action .button span{background:0 0;color:#555;font-weight:700}@media screen and (min-width:46.8em){.activity-list.bp-list{padding:30px}.activity-list .activity-item .activity-content{margin:0;position:relative}.activity-list .activity-item .activity-content:after{clear:both;content:"";display:table}.activity-list .activity-item .activity-header{margin:0 0 0 15px;width:auto}}.buddypress-wrap .activity-list .load-more,.buddypress-wrap .activity-list .load-newest{background:#fafafa;border:1px solid #eee;font-size:110%;margin:15px 0;padding:0;text-align:center}.buddypress-wrap .activity-list .load-more a,.buddypress-wrap .activity-list .load-newest a{color:#555;display:block;padding:.5em 0}.buddypress-wrap .activity-list .load-more a:focus,.buddypress-wrap .activity-list .load-more a:hover,.buddypress-wrap .activity-list .load-newest a:focus,.buddypress-wrap .activity-list .load-newest a:hover{background:#fff;color:#333}.buddypress-wrap .activity-list .load-more:focus,.buddypress-wrap .activity-list .load-more:hover,.buddypress-wrap .activity-list .load-newest:focus,.buddypress-wrap .activity-list .load-newest:hover{border-color:#e1e1e1;-webkit-box-shadow:0 0 6px 0 #eaeaea;-moz-box-shadow:0 0 6px 0 #eaeaea;box-shadow:0 0 6px 0 #eaeaea}body.activity-permalink .activity-list li{border-width:1px;padding:1em 0 0 0}body.activity-permalink .activity-list li:first-child{padding-top:0}body.activity-permalink .activity-list li.has-comments{padding-bottom:0}body.activity-permalink .activity-list .activity-avatar{width:auto}body.activity-permalink .activity-list .activity-avatar a{display:block}body.activity-permalink .activity-list .activity-avatar img{max-width:100%}body.activity-permalink .activity-list .activity-content{border:0;font-size:100%;line-height:1.5;padding:0}body.activity-permalink .activity-list .activity-content .activity-header{margin:0;padding:.5em 0 0 0;text-align:center;width:100%}body.activity-permalink .activity-list .activity-content .activity-inner,body.activity-permalink .activity-list .activity-content blockquote{margin-right:0;margin-top:10px}body.activity-permalink .activity-list .activity-meta{margin:10px 0 10px}body.activity-permalink .activity-list .activity-comments{margin-bottom:10px}@media screen and (min-width:46.8em){body.activity-permalink .activity-list .activity-avatar{right:-20px;margin-left:0;position:relative;top:-20px}body.activity-permalink .activity-list .activity-content{margin-left:10px}body.activity-permalink .activity-list .activity-content .activity-header p{text-align:right}}.buddypress-wrap .activity-comments{clear:both;margin:0 5%;overflow:hidden;position:relative;width:auto}.buddypress-wrap .activity-comments ul{clear:both;list-style:none;margin:15px 0 0;padding:0}.buddypress-wrap .activity-comments ul li{border-top:1px solid #eee;border-bottom:0;padding:1em 0 0}.buddypress-wrap .activity-comments ul li ul{margin-right:5%}.buddypress-wrap .activity-comments ul li:first-child{border-top:0}.buddypress-wrap .activity-comments ul li:last-child{margin-bottom:0}.buddypress-wrap .activity-comments div.acomment-avatar{width:auto}.buddypress-wrap .activity-comments div.acomment-avatar img{border-width:1px;float:right;height:25px;max-width:none;width:25px}.buddypress-wrap .activity-comments .acomment-content p,.buddypress-wrap .activity-comments .acomment-meta{font-size:14px}.buddypress-wrap .activity-comments .acomment-meta{color:#555;overflow:hidden;padding-right:2%}.buddypress-wrap .activity-comments .acomment-content{border-right:1px solid #ccc;margin:15px 10% 0 0;padding:.5em 1em}.buddypress-wrap .activity-comments .acomment-content p{margin-bottom:.5em}.buddypress-wrap .activity-comments .acomment-options{float:right;margin:10px 20px 10px 0}.buddypress-wrap .activity-comments .acomment-options a{color:#767676;font-size:14px}.buddypress-wrap .activity-comments .acomment-options a:focus,.buddypress-wrap .activity-comments .acomment-options a:hover{color:inherit}.buddypress-wrap .activity-comments .activity-meta.action{background:0 0;margin-top:10px}.buddypress-wrap .activity-comments .activity-meta.action button{font-size:14px;font-weight:400;text-transform:none}.buddypress-wrap .activity-comments .show-all button{font-size:14px;text-decoration:underline;padding-right:.5em}.buddypress-wrap .activity-comments .show-all button span{text-decoration:none}.buddypress-wrap .activity-comments .show-all button:focus span,.buddypress-wrap .activity-comments .show-all button:hover span{color:#5087e5}.buddypress-wrap .mini .activity-comments{clear:both;margin-top:0}body.activity-permalink .activity-comments{background:0 0;width:auto}body.activity-permalink .activity-comments>ul{padding:0 1em 0 .5em}body.activity-permalink .activity-comments ul li>ul{margin-top:10px}form.ac-form{display:none;padding:1em}form.ac-form .ac-reply-avatar{float:right}form.ac-form .ac-reply-avatar img{border:1px solid #eee}form.ac-form .ac-reply-content{color:#767676;padding-right:1em}form.ac-form .ac-reply-content a{text-decoration:none}form.ac-form .ac-reply-content .ac-textarea{margin-bottom:15px;padding:0 .5em;overflow:hidden}form.ac-form .ac-reply-content .ac-textarea textarea{background:0 0;box-shadow:none;color:#555;font-family:inherit;font-size:100%;height:60px;margin:0;outline:0;padding:.5em;width:100%}form.ac-form .ac-reply-content .ac-textarea textarea:focus{-webkit-box-shadow:0 0 6px #d6d6d6;-moz-box-shadow:0 0 6px #d6d6d6;box-shadow:0 0 6px #d6d6d6}form.ac-form .ac-reply-content input{margin-top:10px}.activity-comments li form.ac-form{clear:both;margin-left:15px}.activity-comments form.root{margin-right:0}@media screen and (min-width:46.8em){.buddypress-wrap .blogs-list li .item-block{float:none;width:auto}.buddypress-wrap .blogs-list li .item-meta{clear:right;float:none}}@media screen and (min-width:46.8em){.buddypress-wrap .bp-dir-vert-nav .blogs-list .list-title{width:auto}}.buddypress-wrap .groups-list li .list-title{text-align:center}.buddypress-wrap .groups-list li .group-details{clear:right}.buddypress-wrap .groups-list li .group-desc{border:1px solid #eaeaea;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;border-radius:10px;background-clip:padding-box;font-size:13px;color:#737373;font-style:italic;margin:10px auto 0;padding:1em}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list li .group-desc{font-size:16px}}.buddypress-wrap .groups-list li p{margin:0 0 .5em}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list li .item{margin-left:0}.buddypress-wrap .groups-list li .item-meta,.buddypress-wrap .groups-list li .list-title{text-align:right;width:auto}.buddypress-wrap .groups-list li .item-meta{margin-bottom:20px}.buddypress-wrap .groups-list li .last-activity{clear:right;margin-top:-20px}}.buddypress-wrap .groups-list li.group-no-avatar div.group-desc{margin-right:0}.buddypress-wrap .mygroups .groups-list.grid .wrap{min-height:450px;padding-bottom:0}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list.grid.four .group-desc,.buddypress-wrap .groups-list.grid.three .group-desc{font-size:14px}}@media screen and (min-width:46.8em){.buddypress .bp-vertical-navs .groups-list .item-avatar{margin-left:3%;width:15%}}.buddypress-wrap .members-list li .member-name{margin-bottom:10px}.buddypress-wrap .members-list li .user-update{border:1px solid #eaeaea;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;border-radius:10px;background-clip:padding-box;color:#737373;font-style:italic;font-size:13px;margin:15px auto;padding:1em}@media screen and (min-width:46.8em){.buddypress-wrap .members-list li .user-update{font-size:16px}}.buddypress-wrap .members-list li .user-update .activity-read-more{display:block;font-size:12px;font-style:normal;margin-top:10px;padding-right:2px}@media screen and (min-width:46.8em){.buddypress-wrap .members-list li .last-activity{clear:right;margin-top:-10px}}@media screen and (min-width:46.8em){.buddypress-wrap .members-group-list li .joined{clear:right;float:none}}@media screen and (min-width:32em){body:not(.logged-in) .members-list .user-update{width:96%}}.register-page .register-section{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.register-page .signup-form{margin-top:20px}.register-page .signup-form .default-profile input{margin-bottom:20px}.register-page .signup-form label,.register-page .signup-form legend{margin:10px 0 0}.register-page .signup-form .editfield{margin:15px 0}.register-page .signup-form .editfield fieldset{border:0;padding:0}.register-page .signup-form .editfield fieldset legend{margin:0 0 5px;text-indent:0}.register-page .signup-form .editfield .field-visibility-settings{padding:.5em}.register-page .signup-form .editfield .field-visibility-settings fieldset{margin:0 0 10px}.register-page .signup-form #signup-avatar img{margin:0 0 10px 15px}.register-page .signup-form .password-entry,.register-page .signup-form .password-entry-confirm{border:1px solid #eee}@media screen and (min-width:46.8em){.buddypress-wrap .register-page .layout-wrap{display:flex;flex-flow:row wrap;justify-content:space-around}.buddypress-wrap .register-page .layout-wrap .default-profile{flex:1;padding-left:2em}.buddypress-wrap .register-page .layout-wrap .blog-details{flex:1;padding-right:2em}.buddypress-wrap .register-page .submit{clear:both}}@media screen and (min-width:46.8em){.buddypress-wrap.extended-default-reg .register-page .default-profile{flex:1;padding-left:1em}.buddypress-wrap.extended-default-reg .register-page .extended-profile{flex:2;padding-right:1em}.buddypress-wrap.extended-default-reg .register-page .blog-details{flex:1 100%}}#group-create-body{padding:.5em}#group-create-body .creation-step-name{text-align:center}#group-create-body .avatar-nav-items{margin-top:15px}.single-headers:after,.single-headers:before{content:" ";display:table}.single-headers:after{clear:both}.single-headers{margin-bottom:15px}.single-headers #item-header-avatar a{display:block;text-align:center}.single-headers #item-header-avatar a img{float:none}.single-headers div#item-header-content{float:none}@media screen and (min-width:46.8em){.single-headers #item-header-avatar a{text-align:right}.single-headers #item-header-avatar a img{float:right}}.single-headers .activity,.single-headers .group-status{display:inline}.single-headers .group-status{font-size:18px;color:#333;padding-left:1em}.single-headers .activity{display:inline-block;font-size:12px;padding:0}.single-headers #sitewide-notice p,.single-headers div#message p{background-color:#ffd;border:1px solid #cb2;color:#440;font-weight:400;margin-top:3px;text-decoration:none}.single-headers h2{line-height:1.2;margin:0 0 5px}.single-headers h2 a{color:#767676;text-decoration:none}.single-headers h2 span.highlight{display:inline-block;font-size:60%;font-weight:400;line-height:1.7;vertical-align:middle}.single-headers h2 span.highlight span{background:#a1dcfa;color:#fff;cursor:pointer;font-size:80%;font-weight:700;margin-bottom:2px;padding:1px 4px;position:relative;left:-2px;top:-2px;vertical-align:middle}.single-headers img.avatar{float:right;margin:0 0 19px 15px}.single-headers .item-meta{color:#767676;font-size:14px;margin:15px 0 5px;padding-bottom:.5em}.single-headers ul{margin-bottom:15px}.single-headers ul li{float:left;list-style:none}.single-headers div.generic-button{text-align:center}.single-headers li.generic-button{display:inline-block;text-align:center}@media screen and (min-width:46.8em){.single-headers a.button,.single-headers div.generic-button,.single-headers li.generic-button{float:right}}.single-headers a.button,.single-headers div.generic-button{margin:10px 0 0 10px}.single-headers li.generic-button{margin:2px 10px}.single-headers li.generic-button:first-child{margin-right:0}.single-headers div#message.info{line-height:.8}body.no-js .single-item-header .js-self-profile-button{display:none}#cover-image-container{position:relative}#header-cover-image{background-color:#c5c5c5;background-position:center top;background-repeat:no-repeat;background-size:cover;border:0;display:block;right:0;margin:0;padding:0;position:absolute;top:0;width:100%;z-index:1}#item-header-cover-image{position:relative;z-index:2}#item-header-cover-image #item-header-avatar{padding:0 1em}.groups-header .bp-group-type-list{margin:0}.groups-header .bp-feedback{clear:both}.groups-header .group-item-actions{float:right;margin:0 15px 15px 0;padding-top:0;width:100%}.groups-header .moderators-lists{margin-top:0}.groups-header .moderators-lists .moderators-title{font-size:14px}.groups-header .moderators-lists .user-list{margin:0 0 5px}.groups-header .moderators-lists .user-list ul:after{clear:both;content:"";display:table}.groups-header .moderators-lists .user-list li{display:inline-block;float:none;margin-right:4px;padding:4px}.groups-header .moderators-lists img.avatar{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;float:none;height:30px;margin:0;max-width:100%;width:30px}@media screen and (min-width:46.8em){.groups-header div#item-header-content{float:right;margin-right:10%;text-align:right;padding-top:15px;width:42%}.groups-header .group-item-actions{float:left;margin:0 15px 15px 0;text-align:left;width:20%}.groups-header .groups-meta{clear:both}}.groups-header .desc-wrap{background:#eaeaea;border:1px solid #d6d6d6;margin:0 0 15px;padding:1em;text-align:center}.groups-header .desc-wrap .group-description{background:#fafafa;-webkit-box-shadow:inset 0 0 9px #ccc;-moz-box-shadow:inset 0 0 9px #ccc;box-shadow:inset 0 0 9px #ccc;padding:1em;text-align:right}.bp-user .users-header .user-nicename{margin-bottom:5px}.bp-user .member-header-actions{overflow:hidden}.bp-user .member-header-actions *>*{display:block}.buddypress-wrap .item-body{margin:20px 0}.buddypress-wrap .item-body .screen-heading{font-size:20px;font-weight:400}.buddypress-wrap .item-body .button-tabs{margin:30px 0 15px}.buddypress-wrap.bp-single-vert-nav .bp-list:not(.grid) .item-entry{padding-right:.5em}.single-item.group-members .item-body .filters:not(.no-subnav){border-top:5px solid #eaeaea;padding-top:1em}.single-item.group-members .item-body .filters{margin-top:0}.buddypress-wrap .group-status-type ul{margin:0 20px 20px 0}.groups-manage-members-list{padding:.5em 0}.groups-manage-members-list dd{margin:0;padding:1em 0}.groups-manage-members-list .section-title{background:#eaeaea;padding-right:.3em}.groups-manage-members-list ul{list-style:none;margin-bottom:0}.groups-manage-members-list ul li{border-bottom:1px solid #eee;margin-bottom:10px;padding:.5em .3em .3em}.groups-manage-members-list ul li:last-child,.groups-manage-members-list ul li:only-child{border-bottom:0}.groups-manage-members-list ul li:nth-child(even){background:#fafafa}.groups-manage-members-list ul li.banned-user{background:#fad3d3}.groups-manage-members-list ul .member-name{margin-bottom:0;text-align:center}.groups-manage-members-list ul img{display:block;margin:0 auto;width:20%}@media screen and (min-width:32em){.groups-manage-members-list ul .member-name{text-align:right}.groups-manage-members-list ul img{display:inline;width:50px}}.groups-manage-members-list ul .members-manage-buttons:after,.groups-manage-members-list ul .members-manage-buttons:before{content:" ";display:table}.groups-manage-members-list ul .members-manage-buttons:after{clear:both}.groups-manage-members-list ul .members-manage-buttons{margin:15px 0 5px}.groups-manage-members-list ul .members-manage-buttons a.button{color:#767676;display:block;font-size:13px}@media screen and (min-width:32em){.groups-manage-members-list ul .members-manage-buttons a.button{display:inline-block}}.groups-manage-members-list ul .members-manage-buttons.text-links-list{margin-bottom:0}@media screen and (max-width:32em){.groups-manage-members-list ul .members-manage-buttons.text-links-list a.button{background:#fafafa;border:1px solid #eee;display:block;margin-bottom:10px}}.groups-manage-members-list ul .action:not(.text-links-list) a.button{font-size:12px}@media screen and (min-width:46.8em){.groups-manage-members-list ul li .avatar,.groups-manage-members-list ul li .member-name{float:right}.groups-manage-members-list ul li .avatar{margin-left:15px}.groups-manage-members-list ul li .action{clear:both;float:right}}.buddypress .bp-invites-content ul.item-list{border-top:0}.buddypress .bp-invites-content ul.item-list li{border:1px solid #eaeaea;margin:0 0 1%;padding-right:5px;padding-left:5px;position:relative;width:auto}.buddypress .bp-invites-content ul.item-list li .list-title{text-align:center;width:auto}.buddypress .bp-invites-content ul.item-list li .action{position:absolute;top:10px;left:10px}.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button{border:0}.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button:focus,.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button:hover{color:#1fb3dd}.buddypress .bp-invites-content ul.item-list li.selected{-webkit-box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2);-moz-box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2);box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2)}.buddypress .bp-invites-content .group-inviters li,.buddypress .bp-invites-content .item-list .item-meta span{color:#767676}.buddypress .bp-invites-content li ul.group-inviters{clear:both;margin:0;overflow:hidden}.buddypress .bp-invites-content li ul.group-inviters li{border:0;float:right;font-size:20px;width:inherit}.buddypress .bp-invites-content li .status{font-size:20px;font-style:italic;clear:both;color:#555;margin:10px 0}.buddypress .bp-invites-content #send-invites-editor{overflow:hidden}.buddypress .bp-invites-content #send-invites-editor textarea{width:100%}.buddypress .bp-invites-content #send-invites-editor ul{clear:both;list-style:none;margin:10px 0;overflow:hidden}.buddypress .bp-invites-content #send-invites-editor ul li{float:right;margin:.5%;max-height:50px;max-width:50px}.buddypress .bp-invites-content #send-invites-editor .action{margin-top:10px;padding-top:10px}.buddypress .bp-invites-content #send-invites-editor.bp-hide{display:none}@media screen and (min-width:46.8em){.buddypress .bp-invites-content ul.item-list>li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #eaeaea;float:right;padding-right:.5em;padding-left:.5em;width:49.5%}.buddypress .bp-invites-content ul.item-list>li:nth-child(odd){margin-left:.5%}.buddypress .bp-invites-content ul.item-list>li:nth-child(even){margin-right:.5%}.buddypress .bp-invites-content ul.item-list ul.group-inviters{float:right;width:auto}}.buddypress.groups .activity-update-form{margin-top:0}.buddypress-wrap .profile{margin-top:30px}.buddypress-wrap .public .profile-fields td.label{width:30%}.buddypress-wrap .profile.edit .button-nav{list-style:none;margin:30px 0 10px}.buddypress-wrap .profile.edit .button-nav li{display:inline-block;margin-left:10px}.buddypress-wrap .profile.edit .button-nav li a{font-size:18px}.buddypress-wrap .profile.edit .editfield{background:#fafafa;border:1px solid #eee;margin:15px 0;padding:1em}.buddypress-wrap .profile.edit .editfield fieldset{border:0}.buddypress-wrap .profile.edit .editfield fieldset label{font-weight:400}.buddypress-wrap .profile.edit .editfield fieldset label.xprofile-field-label{display:inline}.buddypress-wrap .profile.edit .editfield{display:flex;flex-direction:column}.buddypress-wrap .profile.edit .editfield .description{margin-top:10px;order:2}.buddypress-wrap .profile.edit .editfield>fieldset{order:1}.buddypress-wrap .profile.edit .editfield .field-visibility-settings,.buddypress-wrap .profile.edit .editfield .field-visibility-settings-toggle{order:3}body.no-js .buddypress-wrap .field-visibility-settings-close,body.no-js .buddypress-wrap .field-visibility-settings-toggle{display:none}body.no-js .buddypress-wrap .field-visibility-settings{display:block}.buddypress-wrap .field-visibility-settings{margin:10px 0}.buddypress-wrap .current-visibility-level{font-style:normal;font-weight:700}.buddypress-wrap .field-visibility-settings,.buddypress-wrap .field-visibility-settings-header{color:#737373}.buddypress-wrap .field-visibility-settings fieldset{margin:5px 0}.buddypress-wrap .standard-form .editfield fieldset{margin:0}.buddypress-wrap .standard-form .field-visibility-settings label{font-weight:400;margin:0}.buddypress-wrap .standard-form .field-visibility-settings .radio{list-style:none;margin-bottom:0}.buddypress-wrap .standard-form .field-visibility-settings .field-visibility-settings-close{font-size:12px}.buddypress-wrap .standard-form .wp-editor-container{border:1px solid #dedede}.buddypress-wrap .standard-form .wp-editor-container textarea{background:#fff;width:100%}.buddypress-wrap .standard-form .description{background:#fafafa;font-size:inherit}.buddypress-wrap .standard-form .field-visibility-settings legend,.buddypress-wrap .standard-form .field-visibility-settings-header{font-style:italic}.buddypress-wrap .standard-form .field-visibility-settings-header{font-size:14px}.buddypress-wrap .standard-form .field-visibility-settings label,.buddypress-wrap .standard-form .field-visibility-settings legend{font-size:14px}.buddypress-wrap .standard-form .field-visibility select{margin:0}.buddypress-wrap .html-active button.switch-html{background:#f5f5f5;border-bottom-color:transparent;border-bottom-right-radius:0;border-bottom-left-radius:0}.buddypress-wrap .tmce-active button.switch-tmce{background:#f5f5f5;border-bottom-color:transparent;border-bottom-right-radius:0;border-bottom-left-radius:0}.buddypress-wrap .profile.public .profile-group-title{border-bottom:1px solid #ccc}body.register .buddypress-wrap .page ul{list-style:none}.buddypress-wrap .profile .bp-avatar-nav{margin-top:20px}.message-action-delete:before,.message-action-star:before,.message-action-unstar:before,.message-action-view:before{font-family:dashicons;font-size:18px}.message-action-star:before{color:#aaa;content:"\f154"}.message-action-unstar:before{color:#fcdd77;content:"\f155"}.message-action-view:before{content:"\f473"}.message-action-delete:before{content:"\f153"}.message-action-delete:hover:before{color:#a00}.preview-content .actions a{text-decoration:none}.bp-messages-content{margin:15px 0}.bp-messages-content .avatar{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.bp-messages-content .thread-participants{list-style:none}.bp-messages-content .thread-participants dd{margin-right:0}.bp-messages-content time{color:#737373;font-size:12px}#message-threads{border-top:1px solid #eaeaea;clear:both;list-style:none;margin:0;max-height:220px;overflow-x:hidden;overflow-y:auto;padding:0;width:100%}#message-threads li{border-bottom:1px solid #eaeaea;display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap;margin:0;overflow:hidden;padding:.5em 0}#message-threads li .thread-cb{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center;-webkit-flex:1 2 5%;-moz-flex:1 2 5%;-ms-flex:1 2 5%;-o-flex:1 2 5%;flex:1 2 5%}#message-threads li .thread-from{-webkit-flex:1 2 20%;-moz-flex:1 2 20%;-ms-flex:1 2 20%;-o-flex:1 2 20%;flex:1 2 20%}#message-threads li .thread-from img.avatar{float:right;margin:0 0 0 10px}#message-threads li .thread-from .user-name{display:inline-block;line-height:1.1}#message-threads li .thread-content{-webkit-flex:1 2 60%;-moz-flex:1 2 60%;-ms-flex:1 2 60%;-o-flex:1 2 60%;flex:1 2 60%}#message-threads li .thread-date{-webkit-flex:1 2 15%;-moz-flex:1 2 15%;-ms-flex:1 2 15%;-o-flex:1 2 15%;flex:1 2 15%}#message-threads li.selected{background-color:#fafafa}#message-threads li.selected .thread-subject .subject{color:#5087e5}#message-threads li .thread-content{cursor:pointer}#message-threads li .thread-content .excerpt{color:#737373;font-size:12px;margin:0}#message-threads li .thread-content .thread-from,#message-threads li .thread-content .thread-subject{font-size:13px}@media screen and (min-width:46.8em){#message-threads li .thread-content .thread-from,#message-threads li .thread-content .thread-subject{font-size:16px}}#message-threads li .thread-content .thread-subject{vertical-align:top}#message-threads li .thread-content .thread-subject .excerpt{font-weight:400}#message-threads li .thread-date{padding-left:5px;text-align:left}.bp-messages-content .actions{float:left;max-width:30%}.bp-messages-content .actions .bp-icons{display:inline-block;margin:0;padding:.3em .5em}.bp-messages-content .actions .bp-icons:before{font-size:26px}.bp-messages-content #thread-preview{border:1px solid #eaeaea;margin-top:20px}.bp-messages-content #thread-preview .preview-message{clear:both}.bp-messages-content #thread-preview .preview-content{margin:.5em}.bp-messages-content #thread-preview .preview-content .preview-message{background:#fafafa;margin:10px 0;padding:1em .3em .3em}.bp-messages-content #bp-message-thread-list{border-top:1px solid #eaeaea;clear:both;list-style:none;padding:1em 0 .3em}.bp-messages-content #bp-message-thread-list li{padding:.5em}.bp-messages-content #bp-message-thread-list li:nth-child(2n) .message-content{background:#fafafa}.bp-messages-content #bp-message-thread-list .message-metadata{border-bottom:1px solid #ccc;-webkit-box-shadow:2px 1px 9px 0 #eee;-moz-box-shadow:2px 1px 9px 0 #eee;box-shadow:2px 1px 9px 0 #eee;overflow:hidden;padding:.2em}.bp-messages-content #bp-message-thread-list .message-metadata .avatar{width:30px}.bp-messages-content #bp-message-thread-list .message-metadata .user-link{display:block;font-size:13px;float:right}@media screen and (min-width:46.8em){.bp-messages-content #bp-message-thread-list .message-metadata .user-link{font-size:16px}}.bp-messages-content #bp-message-thread-list .message-metadata time{color:#737373;font-size:12px;padding:0 .5em}.bp-messages-content #bp-message-thread-list .message-metadata button{padding:0 .3em}.bp-messages-content #bp-message-thread-list .message-metadata button:before{font-size:20px}.bp-messages-content #bp-message-thread-list .message-content{clear:both;margin:1em auto 0;width:90%}.bp-messages-content #bp-message-thread-list img.avatar{float:right;margin:0 0 0 10px}.bp-messages-content #bp-message-thread-list .actions a:before{font-size:18px}.bp-messages-content form.send-reply .avatar-box{padding:.5em 0}.bp-messages-content .preview-pane-header,.bp-messages-content .single-message-thread-header{border-bottom:1px solid #eaeaea}.bp-messages-content .preview-pane-header:after,.bp-messages-content .single-message-thread-header:after{clear:both;content:"";display:table}.bp-messages-content .preview-thread-title,.bp-messages-content .single-thread-title{font-size:16px}.bp-messages-content .preview-thread-title .messages-title,.bp-messages-content .single-thread-title .messages-title{padding-right:2em}.bp-messages-content .thread-participants{float:right;margin:5px 0;width:70%}.bp-messages-content .thread-participants dd,.bp-messages-content .thread-participants ul{margin-bottom:10px}.bp-messages-content .thread-participants ul{list-style:none}.bp-messages-content .thread-participants ul:after{clear:both;content:"";display:table}.bp-messages-content .thread-participants li{float:right;margin-right:5px}.bp-messages-content .thread-participants img{width:30px}.bp-messages-content #bp-message-thread-list li .message-content blockquote,.bp-messages-content #bp-message-thread-list li .message-content ol,.bp-messages-content #bp-message-thread-list li .message-content ul,.bp-messages-content #thread-preview .preview-message blockquote,.bp-messages-content #thread-preview .preview-message ol,.bp-messages-content #thread-preview .preview-message ul{list-style-position:inside;margin-right:0}.bp-messages-content #thread-preview:empty,.bp-messages-content ul#message-threads:empty{display:none}.bp-messages-content #bp-message-thread-header h2:first-child,.bp-messages-content #thread-preview h2:first-child{background-color:#eaeaea;color:#555;font-weight:700;margin:0;padding:.5em}.bp-messages-content #bp-message-thread-list li a.user-link,.bp-messages-content #message-threads .thread-content a{border:0;text-decoration:none}.bp-messages-content .standard-form #subject{margin-bottom:20px}div.bp-navs#subsubnav.bp-messages-filters .user-messages-bulk-actions{margin-left:15px;max-width:42.5%}.buddypress.settings .profile-settings.bp-tables-user select{width:100%}.buddypress-wrap #whats-new-post-in-box select,.buddypress-wrap .filter select{border:1px solid #d6d6d6}.buddypress-wrap input.action[disabled]{cursor:pointer;opacity:.4}.buddypress-wrap #notification-bulk-manage[disabled]{display:none}.buddypress-wrap fieldset legend{font-size:inherit;font-weight:600}.buddypress-wrap input[type=email]:focus,.buddypress-wrap input[type=password]:focus,.buddypress-wrap input[type=tel]:focus,.buddypress-wrap input[type=text]:focus,.buddypress-wrap input[type=url]:focus,.buddypress-wrap textarea:focus{-webkit-box-shadow:0 0 8px #eaeaea;-moz-box-shadow:0 0 8px #eaeaea;box-shadow:0 0 8px #eaeaea}.buddypress-wrap select{height:auto}.buddypress-wrap textarea{resize:vertical}.buddypress-wrap .standard-form .bp-controls-wrap{margin:1em 0}.buddypress-wrap .standard-form .groups-members-search input[type=search],.buddypress-wrap .standard-form .groups-members-search input[type=text],.buddypress-wrap .standard-form [data-bp-search] input[type=search],.buddypress-wrap .standard-form [data-bp-search] input[type=text],.buddypress-wrap .standard-form input[type=color],.buddypress-wrap .standard-form input[type=date],.buddypress-wrap .standard-form input[type=datetime-local],.buddypress-wrap .standard-form input[type=datetime],.buddypress-wrap .standard-form input[type=email],.buddypress-wrap .standard-form input[type=month],.buddypress-wrap .standard-form input[type=number],.buddypress-wrap .standard-form input[type=password],.buddypress-wrap .standard-form input[type=range],.buddypress-wrap .standard-form input[type=search],.buddypress-wrap .standard-form input[type=tel],.buddypress-wrap .standard-form input[type=text],.buddypress-wrap .standard-form input[type=time],.buddypress-wrap .standard-form input[type=url],.buddypress-wrap .standard-form input[type=week],.buddypress-wrap .standard-form select,.buddypress-wrap .standard-form textarea{background:#fafafa;border:1px solid #d6d6d6;border-radius:0;font:inherit;font-size:100%;padding:.5em}.buddypress-wrap .standard-form input[required],.buddypress-wrap .standard-form select[required],.buddypress-wrap .standard-form textarea[required]{box-shadow:none;border-width:2px;outline:0}.buddypress-wrap .standard-form input[required]:invalid,.buddypress-wrap .standard-form select[required]:invalid,.buddypress-wrap .standard-form textarea[required]:invalid{border-color:#b71717}.buddypress-wrap .standard-form input[required]:valid,.buddypress-wrap .standard-form select[required]:valid,.buddypress-wrap .standard-form textarea[required]:valid{border-color:#91cc2c}.buddypress-wrap .standard-form input[required]:focus,.buddypress-wrap .standard-form select[required]:focus,.buddypress-wrap .standard-form textarea[required]:focus{border-color:#d6d6d6;border-width:1px}.buddypress-wrap .standard-form input.invalid[required],.buddypress-wrap .standard-form select.invalid[required],.buddypress-wrap .standard-form textarea.invalid[required]{border-color:#b71717}.buddypress-wrap .standard-form input:not(.button-small),.buddypress-wrap .standard-form textarea{width:100%}.buddypress-wrap .standard-form input[type=checkbox],.buddypress-wrap .standard-form input[type=radio]{margin-left:5px;width:auto}.buddypress-wrap .standard-form select{padding:3px}.buddypress-wrap .standard-form textarea{height:120px}.buddypress-wrap .standard-form textarea#message_content{height:200px}.buddypress-wrap .standard-form input[type=password]{margin-bottom:5px}.buddypress-wrap .standard-form input:focus,.buddypress-wrap .standard-form select:focus,.buddypress-wrap .standard-form textarea:focus{background:#fafafa;color:#555;outline:0}.buddypress-wrap .standard-form label,.buddypress-wrap .standard-form span.label{display:block;font-weight:600;margin:15px 0 5px;width:auto}.buddypress-wrap .standard-form a.clear-value{display:block;margin-top:5px;outline:0}.buddypress-wrap .standard-form .submit{clear:both;padding:15px 0 0}.buddypress-wrap .standard-form p.submit{margin-bottom:0}.buddypress-wrap .standard-form div.submit input{margin-left:15px}.buddypress-wrap .standard-form #invite-list label,.buddypress-wrap .standard-form p label{font-weight:400;margin:auto}.buddypress-wrap .standard-form p.description{color:#737373;margin:5px 0}.buddypress-wrap .standard-form div.checkbox label:nth-child(n+2),.buddypress-wrap .standard-form div.radio div label{color:#737373;font-size:100%;font-weight:400;margin:5px 0 0}.buddypress-wrap .standard-form#send-reply textarea{width:97.5%}.buddypress-wrap .standard-form#sidebar-login-form label{margin-top:5px}.buddypress-wrap .standard-form#sidebar-login-form input[type=password],.buddypress-wrap .standard-form#sidebar-login-form input[type=text]{padding:4px;width:95%}.buddypress-wrap .standard-form.profile-edit input:focus{background:#fff}@media screen and (min-width:46.8em){.buddypress-wrap .standard-form .left-menu{float:right}.buddypress-wrap .standard-form #invite-list ul{list-style:none;margin:1%}.buddypress-wrap .standard-form #invite-list ul li{margin:0 1% 0 0}.buddypress-wrap .standard-form .main-column{margin-right:190px}.buddypress-wrap .standard-form .main-column ul#friend-list{clear:none;float:right}.buddypress-wrap .standard-form .main-column ul#friend-list h4{clear:none}}.buddypress-wrap .standard-form .bp-tables-user label{margin:0}.buddypress-wrap .signup-form label,.buddypress-wrap .signup-form legend{font-weight:400}body.no-js .buddypress #delete_inbox_messages,body.no-js .buddypress #delete_sentbox_messages,body.no-js .buddypress #message-type-select,body.no-js .buddypress #messages-bulk-management #select-all-messages,body.no-js .buddypress #notifications-bulk-management #select-all-notifications,body.no-js .buddypress label[for=message-type-select]{display:none}.buddypress-wrap .wp-editor-wrap .wp-editor-wrap button,.buddypress-wrap .wp-editor-wrap .wp-editor-wrap input[type=button],.buddypress-wrap .wp-editor-wrap .wp-editor-wrap input[type=submit],.buddypress-wrap .wp-editor-wrap a.button,.buddypress-wrap .wp-editor-wrap input[type=reset]{padding:0 8px 1px}.buddypress-wrap .select-wrap{border:1px solid #eee}.buddypress-wrap .select-wrap label{display:inline}.buddypress-wrap .select-wrap select::-ms-expand{display:none}.buddypress-wrap .select-wrap select{-moz-appearance:none;-webkit-appearance:none;-o-appearance:none;appearance:none;border:0;cursor:pointer;margin-left:-25px;padding:6px 10px 6px 25px;position:relative;text-indent:-2px;z-index:1;width:100%}.buddypress-wrap .select-wrap select,.buddypress-wrap .select-wrap select:active,.buddypress-wrap .select-wrap select:focus{background:0 0}.buddypress-wrap .select-wrap span.select-arrow{display:inline-block;position:relative;z-index:0}.buddypress-wrap .select-wrap span.select-arrow:before{color:#ccc;content:"\25BC"}.buddypress-wrap .select-wrap:focus .select-arrow:before,.buddypress-wrap .select-wrap:hover .select-arrow:before{color:#a6a6a6}.buddypress-wrap .bp-search form:focus,.buddypress-wrap .bp-search form:hover,.buddypress-wrap .select-wrap:focus,.buddypress-wrap .select-wrap:hover{border:1px solid #d5d4d4;box-shadow:inset 0 0 3px #eee}@media screen and (min-width:32em){.buddypress-wrap .notifications-options-nav .select-wrap{float:right}}.buddypress-wrap .bp-dir-search-form,.buddypress-wrap .bp-messages-search-form:after,.buddypress-wrap .bp-messages-search-form:before{content:" ";display:table}.buddypress-wrap .bp-dir-search-form,.buddypress-wrap .bp-messages-search-form:after{clear:both}.buddypress-wrap form.bp-dir-search-form,.buddypress-wrap form.bp-invites-search-form,.buddypress-wrap form.bp-messages-search-form{border:1px solid #eee;width:100%}@media screen and (min-width:55em){.buddypress-wrap form.bp-dir-search-form,.buddypress-wrap form.bp-invites-search-form,.buddypress-wrap form.bp-messages-search-form{width:15em}}.buddypress-wrap form.bp-dir-search-form label,.buddypress-wrap form.bp-invites-search-form label,.buddypress-wrap form.bp-messages-search-form label{margin:0}.buddypress-wrap form.bp-dir-search-form button[type=submit],.buddypress-wrap form.bp-dir-search-form input[type=search],.buddypress-wrap form.bp-dir-search-form input[type=text],.buddypress-wrap form.bp-invites-search-form button[type=submit],.buddypress-wrap form.bp-invites-search-form input[type=search],.buddypress-wrap form.bp-invites-search-form input[type=text],.buddypress-wrap form.bp-messages-search-form button[type=submit],.buddypress-wrap form.bp-messages-search-form input[type=search],.buddypress-wrap form.bp-messages-search-form input[type=text]{background:0 0;border:0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;border-radius:0;background-clip:padding-box}.buddypress-wrap form.bp-dir-search-form input[type=search],.buddypress-wrap form.bp-dir-search-form input[type=text],.buddypress-wrap form.bp-invites-search-form input[type=search],.buddypress-wrap form.bp-invites-search-form input[type=text],.buddypress-wrap form.bp-messages-search-form input[type=search],.buddypress-wrap form.bp-messages-search-form input[type=text]{float:right;line-height:1.5;padding:3px 10px;width:80%}.buddypress-wrap form.bp-dir-search-form button[type=submit],.buddypress-wrap form.bp-invites-search-form button[type=submit],.buddypress-wrap form.bp-messages-search-form button[type=submit]{float:left;font-size:inherit;font-weight:400;line-height:1.5;padding:3px .7em;text-align:center;text-transform:none;width:20%}.buddypress-wrap form.bp-dir-search-form button[type=submit] span,.buddypress-wrap form.bp-invites-search-form button[type=submit] span,.buddypress-wrap form.bp-messages-search-form button[type=submit] span{font-family:dashicons;font-size:18px;line-height:1.6}.buddypress-wrap form.bp-dir-search-form button[type=submit].bp-show,.buddypress-wrap form.bp-invites-search-form button[type=submit].bp-show,.buddypress-wrap form.bp-messages-search-form button[type=submit].bp-show{height:auto;right:0;overflow:visible;position:static;top:0}.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-cancel-button,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-cancel-button,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-cancel-button{-webkit-appearance:searchfield-cancel-button}.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-results-decoration,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-results-decoration,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-results-decoration{display:none}.buddypress-wrap ul.filters li form label input{line-height:1.4;padding:.1em .7em}.buddypress-wrap .current-member-type{font-style:italic}.buddypress-wrap .dir-form{clear:both}.budypress.no-js form.bp-dir-search-form button[type=submit]{height:auto;right:0;overflow:visible;position:static;top:0}.bp-user [data-bp-search] form input[type=search],.bp-user [data-bp-search] form input[type=text]{padding:6px 10px 7px}.buddypress-wrap .bp-tables-user,.buddypress-wrap table.forum,.buddypress-wrap table.wp-profile-fields{width:100%}.buddypress-wrap .bp-tables-user thead tr,.buddypress-wrap table.forum thead tr,.buddypress-wrap table.wp-profile-fields thead tr{background:0 0;border-bottom:2px solid #ccc}.buddypress-wrap .bp-tables-user tbody tr,.buddypress-wrap table.forum tbody tr,.buddypress-wrap table.wp-profile-fields tbody tr{background:#fafafa}.buddypress-wrap .bp-tables-user tr td,.buddypress-wrap .bp-tables-user tr th,.buddypress-wrap table.forum tr td,.buddypress-wrap table.forum tr th,.buddypress-wrap table.wp-profile-fields tr td,.buddypress-wrap table.wp-profile-fields tr th{padding:.5em;vertical-align:middle}.buddypress-wrap .bp-tables-user tr td.label,.buddypress-wrap table.forum tr td.label,.buddypress-wrap table.wp-profile-fields tr td.label{border-left:1px solid #eaeaea;font-weight:600;width:25%}.buddypress-wrap .bp-tables-user tr.alt td,.buddypress-wrap table.wp-profile-fields tr.alt td{background:#fafafa}.buddypress-wrap table.profile-fields .data{padding:.5em 1em}.buddypress-wrap table.profile-fields tr:last-child{border-bottom:none}.buddypress-wrap table.notifications td{padding:1em .5em}.buddypress-wrap table.notifications .bulk-select-all,.buddypress-wrap table.notifications .bulk-select-check{width:7%}.buddypress-wrap table.notifications .bulk-select-check{vertical-align:middle}.buddypress-wrap table.notifications .date,.buddypress-wrap table.notifications .notification-description,.buddypress-wrap table.notifications .notification-since,.buddypress-wrap table.notifications .title{width:39%}.buddypress-wrap table.notifications .actions,.buddypress-wrap table.notifications .notification-actions{width:15%}.buddypress-wrap table.notification-settings th.title,.buddypress-wrap table.profile-settings th.title{width:80%}.buddypress-wrap table.notifications .notification-actions a.delete,.buddypress-wrap table.notifications .notification-actions a.mark-read{display:inline-block}.buddypress-wrap table.notification-settings{margin-bottom:15px;text-align:right}.buddypress-wrap #groups-notification-settings{margin-bottom:0}.buddypress-wrap table.notification-settings td:first-child,.buddypress-wrap table.notification-settings th.icon,.buddypress-wrap table.notifications td:first-child,.buddypress-wrap table.notifications th.icon{display:none}.buddypress-wrap table.notification-settings .no,.buddypress-wrap table.notification-settings .yes{text-align:center;width:40px;vertical-align:middle}.buddypress-wrap table#message-threads{clear:both}.buddypress-wrap table#message-threads .thread-info{min-width:40%}.buddypress-wrap table#message-threads .thread-info p{margin:0}.buddypress-wrap table#message-threads .thread-info p.thread-excerpt{color:#737373;font-size:12px;margin-top:3px}.buddypress-wrap table.profile-fields{margin-bottom:20px}.buddypress-wrap table.profile-fields:last-child{margin-bottom:0}.buddypress-wrap table.profile-fields p{margin:0}.buddypress-wrap table.profile-fields p:last-child{margin-top:0}.bp-screen-reader-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.center-vert{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center}.bp-hide{display:none}.bp-show{height:auto;right:0;overflow:visible;position:static;top:0}.buddypress .buddypress-wrap .activity-read-more a,.buddypress .buddypress-wrap .comment-reply-link,.buddypress .buddypress-wrap .generic-button a,.buddypress .buddypress-wrap a.bp-title-button,.buddypress .buddypress-wrap a.button,.buddypress .buddypress-wrap button,.buddypress .buddypress-wrap input[type=button],.buddypress .buddypress-wrap input[type=reset],.buddypress .buddypress-wrap input[type=submit],.buddypress .buddypress-wrap ul.button-nav:not(.button-tabs) li a{background:#fff;border-color:#ccc;border-style:solid;border-width:1px;color:#555;cursor:pointer;font-size:inherit;font-weight:400;outline:0;padding:.3em .5em;text-align:center;text-decoration:none;width:auto}.buddypress .buddypress-wrap .button-small[type=button]{padding:0 8px 1px}.buddypress .buddypress-wrap .activity-read-more a:focus,.buddypress .buddypress-wrap .activity-read-more a:hover,.buddypress .buddypress-wrap .button-nav li a:focus,.buddypress .buddypress-wrap .button-nav li a:hover,.buddypress .buddypress-wrap .button-nav li.current a,.buddypress .buddypress-wrap .comment-reply-link:focus,.buddypress .buddypress-wrap .comment-reply-link:hover,.buddypress .buddypress-wrap .generic-button a:focus,.buddypress .buddypress-wrap .generic-button a:hover,.buddypress .buddypress-wrap a.button:focus,.buddypress .buddypress-wrap a.button:hover,.buddypress .buddypress-wrap button:focus,.buddypress .buddypress-wrap button:hover,.buddypress .buddypress-wrap input[type=button]:focus,.buddypress .buddypress-wrap input[type=button]:hover,.buddypress .buddypress-wrap input[type=reset]:focus,.buddypress .buddypress-wrap input[type=reset]:hover,.buddypress .buddypress-wrap input[type=submit]:focus,.buddypress .buddypress-wrap input[type=submit]:hover{background:#ededed;border-color:#999;color:#333;outline:0;text-decoration:none}.buddypress .buddypress-wrap a.disabled,.buddypress .buddypress-wrap button.disabled,.buddypress .buddypress-wrap button.pending,.buddypress .buddypress-wrap div.pending a,.buddypress .buddypress-wrap input[type=button].disabled,.buddypress .buddypress-wrap input[type=button].pending,.buddypress .buddypress-wrap input[type=reset].disabled,.buddypress .buddypress-wrap input[type=reset].pending,.buddypress .buddypress-wrap input[type=submit].pending,.buddypress .buddypress-wrap input[type=submit][disabled=disabled]{border-color:#eee;color:#767676;cursor:default}.buddypress .buddypress-wrap a.disabled:hover,.buddypress .buddypress-wrap button.disabled:hover,.buddypress .buddypress-wrap button.pending:hover,.buddypress .buddypress-wrap div.pending a:hover,.buddypress .buddypress-wrap input[type=button]:hover.disabled,.buddypress .buddypress-wrap input[type=button]:hover.pending,.buddypress .buddypress-wrap input[type=reset]:hover.disabled,.buddypress .buddypress-wrap input[type=reset]:hover.pending,.buddypress .buddypress-wrap input[type=submit]:hover.disabled,.buddypress .buddypress-wrap input[type=submit]:hover.pending{border-color:#eee;color:#767676}.buddypress .buddypress-wrap button.text-button,.buddypress .buddypress-wrap input.text-button{background:0 0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#767676}.buddypress .buddypress-wrap button.text-button.small,.buddypress .buddypress-wrap input.text-button.small{font-size:13px}.buddypress .buddypress-wrap button.text-button:focus,.buddypress .buddypress-wrap button.text-button:hover,.buddypress .buddypress-wrap input.text-button:focus,.buddypress .buddypress-wrap input.text-button:hover{background:0 0;text-decoration:underline}.buddypress .buddypress-wrap .activity-list a.button{border:none}.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.invite-button:hover{color:#1fb3dd}.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.group-remove-invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li.selected a.group-remove-invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li.selected a.invite-button:hover{color:#a00}.buddypress .buddypress-wrap #item-buttons:empty{display:none}.buddypress .buddypress-wrap input:disabled:focus,.buddypress .buddypress-wrap input:disabled:hover{background:0 0}.buddypress .buddypress-wrap .text-links-list a.button{background:0 0;border:none;border-left:1px solid #eee;color:#767676;display:inline-block;padding:.3em 1em}.buddypress .buddypress-wrap .text-links-list a.button:visited{color:#d6d6d6}.buddypress .buddypress-wrap .text-links-list a.button:focus,.buddypress .buddypress-wrap .text-links-list a.button:hover{color:#5087e5}.buddypress .buddypress-wrap .text-links-list a:first-child{padding-right:0}.buddypress .buddypress-wrap .text-links-list a:last-child{border-left:none}.buddypress .buddypress-wrap .bp-list.grid .action a,.buddypress .buddypress-wrap .bp-list.grid .action button{border:1px solid #ccc;display:block;margin:0}.buddypress .buddypress-wrap .bp-list.grid .action a:focus,.buddypress .buddypress-wrap .bp-list.grid .action a:hover,.buddypress .buddypress-wrap .bp-list.grid .action button:focus,.buddypress .buddypress-wrap .bp-list.grid .action button:hover{background:#ededed}.buddypress #buddypress .create-button{background:0 0;text-align:center}@media screen and (min-width:46.8em){.buddypress #buddypress .create-button{float:left}}.buddypress #buddypress .create-button a{border:1px solid #ccc;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;background-clip:padding-box;-webkit-box-shadow:inset 0 0 6px 0 #eaeaea;-moz-box-shadow:inset 0 0 6px 0 #eaeaea;box-shadow:inset 0 0 6px 0 #eaeaea;margin:.2em 0;width:auto}.buddypress #buddypress .create-button a:focus,.buddypress #buddypress .create-button a:hover{background:0 0;border-color:#ccc;-webkit-box-shadow:inset 0 0 12px 0 #eaeaea;-moz-box-shadow:inset 0 0 12px 0 #eaeaea;box-shadow:inset 0 0 12px 0 #eaeaea}@media screen and (min-width:46.8em){.buddypress #buddypress.bp-dir-vert-nav .create-button{float:none;padding-top:2em}.buddypress #buddypress.bp-dir-vert-nav .create-button a{margin-left:.5em}}.buddypress #buddypress.bp-dir-hori-nav .create-button{float:right}.buddypress #buddypress.bp-dir-hori-nav .create-button a,.buddypress #buddypress.bp-dir-hori-nav .create-button a:hover{background:0 0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;margin:0}.buddypress-wrap button.ac-reply-cancel,.buddypress-wrap button.bp-icons{background:0 0;border:0}.buddypress-wrap button.bp-icons:focus,.buddypress-wrap button.bp-icons:hover{background:0 0}.buddypress-wrap button.ac-reply-cancel:focus,.buddypress-wrap button.ac-reply-cancel:hover{background:0 0;text-decoration:underline}.buddypress-wrap .bp-invites-content li .invite-button span.icons:before,.buddypress-wrap .bp-invites-filters .invite-button span.icons:before,.buddypress-wrap .bp-messages-filters li a.messages-button:before,.buddypress-wrap .feed a:before,.buddypress-wrap .filter label:before{font-family:dashicons;font-size:18px}.buddypress-wrap .bp-invites-content .item-list li .invite-button span.icons:before{font-size:27px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-invites-content .item-list li .invite-button span.icons:before{font-size:32px}}.buddypress-wrap .bp-list a.button.invite-button:focus,.buddypress-wrap .bp-list a.button.invite-button:hover{background:0 0}.buddypress-wrap .filter label:before{content:"\f536"}.buddypress-wrap div.feed a:before,.buddypress-wrap li.feed a:before{content:"\f303"}.buddypress-wrap ul.item-list li .invite-button:not(.group-remove-invite-button) span.icons:before{content:"\f502"}.buddypress-wrap ul.item-list li .group-remove-invite-button span.icons:before,.buddypress-wrap ul.item-list li.selected .invite-button span.icons:before{content:"\f153"}.buddypress-wrap .bp-invites-filters ul li #bp-invites-next-page:before,.buddypress-wrap .bp-messages-filters ul li #bp-messages-next-page:before{content:"\f345"}.buddypress-wrap .bp-invites-filters ul li #bp-invites-prev-page:before,.buddypress-wrap .bp-messages-filters ul li #bp-messages-prev-page:before{content:"\f341"}.buddypress-wrap .warn{color:#b71717}.buddypress-wrap .bp-messages{border:1px solid #ccc;margin:0 0 15px}.buddypress-wrap .bp-messages .sitewide-notices{display:block;margin:5px;padding:.5em}.buddypress-wrap .bp-messages.info{margin-bottom:0}.buddypress-wrap .bp-messages.updated{clear:both;display:block}.buddypress-wrap .bp-messages.bp-user-messages-feedback{border:0}.buddypress-wrap #group-create-body .bp-cover-image-status p.warning{background:#0b80a4;border:0;-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.2);-moz-box-shadow:0 0 3px 0 rgba(0,0,0,.2);box-shadow:0 0 3px 0 rgba(0,0,0,.2);color:#fff}.buddypress-wrap .bp-feedback:not(.custom-homepage-info){display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-align:stretch;-webkit-align-items:stretch;-webkit-box-align:stretch;align-items:stretch}.buddypress-wrap .bp-feedback{background:#fff;color:#807f7f;-webkit-box-shadow:0 1px 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px 1px rgba(0,0,0,.1);color:#737373;margin:10px 0;position:relative}.buddypress-wrap .bp-feedback p{margin:0}.buddypress-wrap .bp-feedback span.bp-icon{color:#fff;display:block;font-family:dashicons;right:0;margin-left:10px;position:relative;padding:0 .5em}.buddypress-wrap .bp-feedback .bp-help-text{font-style:italic}.buddypress-wrap .bp-feedback .text{font-size:14px;margin:0;padding:.5em 0}.buddypress-wrap .bp-feedback.no-icon{padding:.5em}.buddypress-wrap .bp-feedback.small:before{line-height:inherit}.buddypress-wrap a[data-bp-close] span:before,.buddypress-wrap button[data-bp-close] span:before{font-size:32px}.buddypress-wrap a[data-bp-close],.buddypress-wrap button[data-bp-close]{border:0;position:absolute;top:10px;left:10px;width:32px}.buddypress-wrap .bp-feedback.no-icon a[data-bp-close],.buddypress-wrap .bp-feedback.no-icon button[data-bp-close]{top:-6px;left:6px}.buddypress-wrap button[data-bp-close]:hover{background-color:transparent}.buddypress-wrap .bp-feedback p{margin:0}.buddypress-wrap .bp-feedback .bp-icon{font-size:20px;padding:0 2px}.buddypress-wrap .bp-feedback.error .bp-icon,.buddypress-wrap .bp-feedback.help .bp-icon,.buddypress-wrap .bp-feedback.info .bp-icon,.buddypress-wrap .bp-feedback.loading .bp-icon,.buddypress-wrap .bp-feedback.success .bp-icon,.buddypress-wrap .bp-feedback.warning .bp-icon{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center}.buddypress-wrap .bp-feedback.help .bp-icon,.buddypress-wrap .bp-feedback.info .bp-icon{background-color:#0b80a4}.buddypress-wrap .bp-feedback.help .bp-icon:before,.buddypress-wrap .bp-feedback.info .bp-icon:before{content:"\f348"}.buddypress-wrap .bp-feedback.error .bp-icon,.buddypress-wrap .bp-feedback.warning .bp-icon{background-color:#d33}.buddypress-wrap .bp-feedback.error .bp-icon:before,.buddypress-wrap .bp-feedback.warning .bp-icon:before{content:"\f534"}.buddypress-wrap .bp-feedback.loading .bp-icon{background-color:#ffd087}.buddypress-wrap .bp-feedback.loading .bp-icon:before{content:"\f469"}.buddypress-wrap .bp-feedback.success .bp-icon{background-color:#8a2}.buddypress-wrap .bp-feedback.success .bp-icon:before{content:"\f147"}.buddypress-wrap .bp-feedback.help .bp-icon:before{content:"\f468"}.buddypress-wrap #pass-strength-result{background-color:#eee;border-color:#ddd;border-style:solid;border-width:1px;display:none;font-weight:700;margin:10px 0 10px 0;padding:.5em;text-align:center;width:auto}.buddypress-wrap #pass-strength-result.show{display:block}.buddypress-wrap #pass-strength-result.mismatch{background-color:#333;border-color:transparent;color:#fff}.buddypress-wrap #pass-strength-result.bad,.buddypress-wrap #pass-strength-result.error{background-color:#ffb78c;border-color:#ff853c;color:#fff}.buddypress-wrap #pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040;color:#fff}.buddypress-wrap #pass-strength-result.strong{background-color:#66d66e;border-color:#438c48;color:#fff}.buddypress-wrap .standard-form#signup_form div div.error{background:#faa;color:#a00;margin:0 0 10px 0;padding:.5em;width:90%}.buddypress-wrap .accept,.buddypress-wrap .reject{float:right;margin-right:10px}.buddypress-wrap .members-list.grid .bp-ajax-message{background:rgba(255,255,255,.9);border:1px solid #eee;font-size:14px;right:2%;position:absolute;padding:.5em 1em;left:2%;top:30px}.buddypress.widget .item-options{font-size:14px}.buddypress.widget ul.item-list{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:column nowrap;-moz-flex-flow:column nowrap;-ms-flex-flow:column nowrap;-o-flex-flow:column nowrap;flex-flow:column nowrap;list-style:none;margin:10px -2%;overflow:hidden}@media screen and (min-width:32em){.buddypress.widget ul.item-list{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row wrap;-moz-flex-flow:row wrap;-ms-flex-flow:row wrap;-o-flex-flow:row wrap;flex-flow:row wrap}}.buddypress.widget ul.item-list li{border:1px solid #eee;-ms-flex-align:stretch;-webkit-align-items:stretch;-webkit-box-align:stretch;align-items:stretch;-webkit-flex:1 1 46%;-moz-flex:1 1 46%;-ms-flex:1 1 46%;-o-flex:1 1 46%;flex:1 1 46%;margin:2%}@media screen and (min-width:75em){.buddypress.widget ul.item-list li{-webkit-flex:0 1 20%;-moz-flex:0 1 20%;-ms-flex:0 1 20%;-o-flex:0 1 20%;flex:0 1 20%}}.buddypress.widget ul.item-list li .item-avatar{padding:.5em;text-align:center}.buddypress.widget ul.item-list li .item-avatar .avatar{width:60%}.buddypress.widget ul.item-list li .item{padding:0 .5em .5em}.buddypress.widget ul.item-list li .item .item-meta{font-size:12px;overflow-wrap:break-word}.widget-area .buddypress.widget ul.item-list li{-webkit-flex:0 1 46%;-moz-flex:0 1 46%;-ms-flex:0 1 46%;-o-flex:0 1 46%;flex:0 1 46%;margin:2% 2% 10px}@media screen and (min-width:75em){.widget-area .buddypress.widget ul.item-list li .avatar{width:100%}}@media screen and (min-width:75em){.widget-area .buddypress.widget ul.item-list{margin:10px -2%;width:100%}.widget-area .buddypress.widget ul.item-list li{-webkit-flex:0 1 auto;-moz-flex:0 1 auto;-ms-flex:0 1 auto;-o-flex:0 1 auto;flex:0 1 auto;margin:10px 2% 1%;width:46%}}#buddypress-wrap *{transition:opacity .1s ease-in-out .1s}#buddypress-wrap a.button,#buddypress-wrap a.generic-button,#buddypress-wrap button,#buddypress-wrap input[type=reset],#buddypress-wrap input[type=submit]{transition:background .1s ease-in-out .1s,color .1s ease-in-out .1s,border-color .1s ease-in-out .1s}.buddypress-wrap a.loading,.buddypress-wrap input.loading{-moz-animation:loader-pulsate .5s infinite ease-in-out alternate;-webkit-animation:loader-pulsate .5s infinite ease-in-out alternate;animation:loader-pulsate .5s infinite ease-in-out alternate;border-color:#aaa}@-webkit-keyframes loader-pulsate{from{border-color:#aaa;-webkit-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-webkit-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}@-moz-keyframes loader-pulsate{from{border-color:#aaa;-moz-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-moz-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}@keyframes loader-pulsate{from{border-color:#aaa;-moz-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-moz-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}.buddypress-wrap a.loading:hover,.buddypress-wrap input.loading:hover{color:#777}[data-bp-tooltip]{position:relative}[data-bp-tooltip]:after{background-color:#fff;display:none;opacity:0;position:absolute;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden}[data-bp-tooltip]:after{border:1px solid #737373;border-radius:1px;box-shadow:-4px 4px 8px rgba(0,0,0,.2);color:#333;content:attr(data-bp-tooltip);font-family:"Helvetica Neue",helvetica,arial,san-serif;font-size:12px;font-weight:400;letter-spacing:normal;line-height:1.25;max-width:200px;padding:5px 8px;pointer-events:none;text-shadow:none;text-transform:none;-webkit-transition:all 1.5s ease;-ms-transition:all 1.5s ease;transition:all 1.5s ease;white-space:nowrap;word-wrap:break-word;z-index:100000}[data-bp-tooltip]:active:after,[data-bp-tooltip]:focus:after,[data-bp-tooltip]:hover:after{display:block;opacity:1;overflow:visible;visibility:visible}[data-bp-tooltip=""]{display:none;opacity:0;visibility:hidden}.bp-tooltip:after{right:50%;margin-top:7px;top:110%;-webkit-transform:translate(50%,0);-ms-transform:translate(50%,0);transform:translate(50%,0)}.user-list .bp-tooltip:after{right:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}@media screen and (min-width:46.8em){.user-list .bp-tooltip:after{right:auto;left:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}}.activity-meta-action .bp-tooltip:after,.notification-actions .bp-tooltip:after,.participants-list .bp-tooltip:after{right:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.bp-invites-content .bp-tooltip:after{right:auto;left:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}#item-body,.single-screen-navs{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.grid>li,.grid>li .generic-button a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.grid>li{border-bottom:0;padding-bottom:10px;padding-top:0}.grid>li .list-wrap{background:#fafafa;border:1px solid #eee;padding-bottom:15px;position:relative;overflow:hidden;padding-top:14px}.grid>li .list-wrap .list-title{padding:.5em}.grid>li .list-wrap .update{color:#737373;padding:.5em 2em}.grid>li .item-avatar{text-align:center}.grid>li .item-avatar .avatar{border-radius:50%;display:inline-block;width:50%}@media screen and (min-width:24em){.grid.members-list .list-wrap{min-height:340px}.grid.members-list .list-wrap .item-block{margin:0 auto;min-height:7rem}.grid.members-group-list .list-wrap .item-block{margin:0 auto;min-height:7rem}.grid.groups-list .list-wrap{min-height:470px}.grid.groups-list .list-wrap .item-block{min-height:6rem}.grid.groups-list .list-wrap .group-desc{margin:15px auto 0;min-height:5em;overflow:hidden}.grid.groups-list .list-wrap .group-details,.grid.groups-list .list-wrap .item-desc,.grid.groups-list .list-wrap .last-activity{margin-bottom:0}.grid.groups-list .list-wrap .group-details p,.grid.groups-list .list-wrap .item-desc p,.grid.groups-list .list-wrap .last-activity p{margin-bottom:0}.grid.blogs-list .list-wrap{min-height:350px}.grid.blogs-list .list-wrap .item-block{margin:0 auto;min-height:7rem}}@media screen and (min-width:24em){.grid>li.item-entry{float:right;margin:0}.grid.two>li{padding-bottom:20px}}@media screen and (min-width:24em) and (min-width:75em){.grid.two>li .list-wrap{max-width:500px;margin:0 auto}}@media screen and (min-width:24em){.grid.three>li,.grid.two>li{width:50%}.grid.three>li:nth-child(odd),.grid.two>li:nth-child(odd){padding-left:10px}.grid.three>li:nth-child(even),.grid.two>li:nth-child(even){padding-right:10px}.grid.three>li .item,.grid.two>li .item{margin:1rem auto 0;width:80%}.grid.three>li .item .item-title,.grid.two>li .item .item-title{width:auto}}@media screen and (min-width:46.8em){.grid.three>li{padding-top:0;width:33.333333%;width:calc(100% / 3)}.grid.three>li:nth-child(1n+1){padding-right:5px;padding-left:5px}.grid.three>li:nth-child(3n+3){padding-right:5px;padding-left:0}.grid.three>li:nth-child(3n+1){padding-right:0;padding-left:5px}}@media screen and (min-width:46.8em){.grid.four>li{width:25%}.grid.four>li:nth-child(1n+1){padding-right:5px;padding-left:5px}.grid.four>li:nth-child(4n+4){padding-right:5px;padding-left:0}.grid.four>li:nth-child(4n+1){padding-right:0;padding-left:5px}}.buddypress-wrap .grid.bp-list{padding-top:1em}.buddypress-wrap .grid.bp-list>li{border-bottom:none}.buddypress-wrap .grid.bp-list>li .list-wrap{padding-bottom:3em}.buddypress-wrap .grid.bp-list>li .item-avatar{margin:0;text-align:center;width:auto}.buddypress-wrap .grid.bp-list>li .item-avatar img.avatar{display:inline-block;height:auto;width:50%}.buddypress-wrap .grid.bp-list>li .item-meta,.buddypress-wrap .grid.bp-list>li .list-title{float:none;text-align:center}.buddypress-wrap .grid.bp-list>li .list-title{font-size:inherit;line-height:1.1}.buddypress-wrap .grid.bp-list>li .item{font-size:18px;right:0;margin:0 auto;text-align:center;width:96%}@media screen and (min-width:46.8em){.buddypress-wrap .grid.bp-list>li .item{font-size:22px}}.buddypress-wrap .grid.bp-list>li .item .group-desc,.buddypress-wrap .grid.bp-list>li .item .item-block{float:none;width:96%}.buddypress-wrap .grid.bp-list>li .item .item-block{margin-bottom:10px}.buddypress-wrap .grid.bp-list>li .item .last-activity{margin-top:5px}.buddypress-wrap .grid.bp-list>li .item .group-desc{clear:none}.buddypress-wrap .grid.bp-list>li .item .user-update{clear:both;text-align:right}.buddypress-wrap .grid.bp-list>li .item .activity-read-more a{display:inline}.buddypress-wrap .grid.bp-list>li .action{bottom:5px;float:none;height:auto;right:0;margin:0;padding:0 5px;position:absolute;text-align:center;top:auto;width:100%}.buddypress-wrap .grid.bp-list>li .action .generic-button{float:none;margin:5px 0 0;text-align:center;width:100%}.buddypress-wrap .grid.bp-list>li .action .generic-button a,.buddypress-wrap .grid.bp-list>li .action .generic-button button{width:100%}.buddypress-wrap .grid.bp-list>li .avatar,.buddypress-wrap .grid.bp-list>li .item,.buddypress-wrap .grid.bp-list>li .item-avatar{float:none}.buddypress-wrap .blogs-list.grid.two>li .blogs-title{min-height:5em}.buddypress-wrap .grid.four>li .group-desc,.buddypress-wrap .grid.three>li .group-desc{min-height:8em}.buddypress-wrap .blogs-list.grid.four>li,.buddypress-wrap .blogs-list.grid.three>li{min-height:350px}.buddypress-wrap .blogs-list.grid.four>li .last-activity,.buddypress-wrap .blogs-list.grid.three>li .last-activity{margin-bottom:0}.buddypress-wrap .blogs-list.grid.four>li .last-post,.buddypress-wrap .blogs-list.grid.three>li .last-post{margin-top:0}.buddypress:not(.logged-in) .grid.bp-list .list-wrap{padding-bottom:5px}.buddypress:not(.logged-in) .grid.groups-list .list-wrap{min-height:430px}.buddypress:not(.logged-in) .grid.members-list .list-wrap{min-height:300px}.buddypress:not(.logged-in) .grid.blogs-list .list-wrap{min-height:320px}@media screen and (min-width:46.8em){.bp-single-vert-nav .vertical{overflow:visible}.bp-single-vert-nav .vertical ul{border-left:1px solid #d6d6d6;float:right;margin-left:-1px;width:25%}.bp-single-vert-nav .vertical li{float:none}.bp-single-vert-nav .vertical li.selected a{background:#ccc;color:#333}.bp-single-vert-nav .vertical li:focus,.bp-single-vert-nav .vertical li:hover{background:#ccc}.bp-single-vert-nav .vertical li span{background:#d6d6d6;border-radius:10%;float:left;margin-left:2px}.bp-single-vert-nav .vertical li:hover span{border-color:#eaeaea}.bp-single-vert-nav .bp-wrap{margin-bottom:15px}.bp-single-vert-nav .bp-wrap .group-nav-tabs.groups-nav ul li,.bp-single-vert-nav .bp-wrap .user-nav-tabs.users-nav ul li{right:1px;position:relative}.bp-single-vert-nav .item-body:not(#group-create-body){background:#fff;border-right:1px solid #d6d6d6;float:left;margin:0;min-height:400px;padding:0 1em 0 0;width:calc(75% + 1px)}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links){background:#eaeaea;margin:0 -5px 0 0;width:auto}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li{font-size:16px;margin:10px 0}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a{border-left:1px solid #ccc;padding:0 .5em}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a:focus,.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a:hover{background:0 0}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li.current a{background:0 0;color:#333;text-decoration:underline}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li:last-child a{border:none}.bp-dir-vert-nav .dir-navs{float:right;right:1px;position:relative;width:20%}.bp-dir-vert-nav .dir-navs ul li{float:none;overflow:hidden;width:auto}.bp-dir-vert-nav .dir-navs ul li.selected{border:1px solid #eee}.bp-dir-vert-nav .dir-navs ul li.selected a{background:#555;color:#fff}.bp-dir-vert-nav .dir-navs ul li.selected a span{background:#eaeaea;border-color:#ccc;color:#5087e5}.bp-dir-vert-nav .dir-navs ul li a:focus,.bp-dir-vert-nav .dir-navs ul li a:hover{background:#ccc;color:#333}.bp-dir-vert-nav .dir-navs ul li a:focus span,.bp-dir-vert-nav .dir-navs ul li a:hover span{border:1px solid #555}.bp-dir-vert-nav .screen-content{border-right:1px solid #d6d6d6;margin-right:20%;overflow:hidden;padding:0 1em 2em 0}.bp-dir-vert-nav .screen-content .subnav-filters{margin-top:0}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li:not(.selected) a:hover{background:0 0}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected{background:0 0;border:1px solid #d6d6d6;border-left-color:#fff}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected a{background:0 0;color:#333;font-weight:600}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected a span{background:#555;border:1px solid #d6d6d6;color:#fff}}
|
1 |
+
body #buddypress * a{box-shadow:none;text-decoration:none}body #buddypress #item-body blockquote,body #buddypress .bp-lists blockquote{margin-right:10px}body #buddypress .bp-list .action{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@media screen and (min-width:46.8em){body.buddypress .entry-content,body.buddypress .entry-header,body.buddypress .site-content .entry-header{max-width:none}body.buddypress .entry-header{float:none;max-width:none}body.buddypress .entry-content{float:none;max-width:none}body.buddypress .site-content{padding-top:2.5em}body.buddypress #page #primary{max-width:none}body.buddypress #page #primary .entry-content,body.buddypress #page #primary .entry-header{float:none;width:auto}}body.buddypress .buddypress-wrap h1,body.buddypress .buddypress-wrap h2,body.buddypress .buddypress-wrap h3,body.buddypress .buddypress-wrap h4,body.buddypress .buddypress-wrap h5,body.buddypress .buddypress-wrap h6{clear:none;margin:1em 0;padding:0}.bp-wrap:after,.bp-wrap:before{content:" ";display:table}.bp-wrap:after{clear:both}.buddypress-wrap.round-avatars .avatar{border-radius:50%}div,dl,input[type=reset],input[type=search],input[type=submit],li,select,textarea{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;border-radius:2px;background-clip:padding-box}body.buddypress article.page>.entry-header{margin-bottom:2em;padding:0}body.buddypress article.page>.entry-header .entry-title{font-size:28px;font-weight:inherit;color:#767676}@media screen and (min-width:46.8em){body.buddypress article.page>.entry-header .entry-title{font-size:34px}}.buddypress-wrap dt.section-title{font-size:18px}@media screen and (min-width:46.8em){.buddypress-wrap dt.section-title{font-size:22px}}.buddypress-wrap .bp-label-text,.buddypress-wrap .message-threads{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-label-text,.buddypress-wrap .message-threads{font-size:16px}}.buddypress-wrap .activity-header{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .activity-header{font-size:16px}}.buddypress-wrap .activity-inner{font-size:15px}@media screen and (min-width:46.8em){.buddypress-wrap .activity-inner{font-size:18px}}.buddypress-wrap #whats-new-post-in{font-size:16px}.buddypress-wrap .acomment-meta,.buddypress-wrap .mini .activity-header{font-size:16px}.buddypress-wrap .dir-component-filters #activity-filter-by{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .dir-component-filters #activity-filter-by{font-size:16px}}.buddypress-wrap .bp-tables-user th{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-tables-user th{font-size:16px}}.buddypress-wrap .bp-tables-user td{font-size:12px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-tables-user td{font-size:14px}}.buddypress-wrap .profile-fields th{font-size:15px}@media screen and (min-width:46.8em){.buddypress-wrap .profile-fields th{font-size:18px}}.buddypress-wrap .profile-fields td{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .profile-fields td{font-size:16px}}.buddypress-wrap #notification-select{font-size:12px}@media screen and (min-width:46.8em){.buddypress-wrap #notification-select{font-size:14px}}.bp-navs{background:0 0;clear:both;overflow:hidden}.bp-navs ul{margin:0;padding:0}.bp-navs ul li{list-style:none;margin:0}.bp-navs ul li.last select{max-width:185px}.bp-navs ul li a,.bp-navs ul li span{border:0;display:block;padding:5px 10px;text-decoration:none}.bp-navs ul li .count{background:#eaeaea;border:1px solid #ccc;border-radius:50%;color:#555;display:inline;font-size:12px;margin-right:2px;padding:3px 6px;text-align:center;vertical-align:middle}.bp-navs ul li.current a,.bp-navs ul li.selected a{color:#333;opacity:1}.bp-navs.bp-invites-filters ul li a,.bp-navs.bp-messages-filters ul li a{border:1px solid #ccc;display:inline-block}.main-navs.dir-navs{margin-bottom:20px}.buddypress-wrap .bp-navs li a:hover a .count,.buddypress-wrap .bp-navs li.current a .count,.buddypress-wrap .bp-navs li.selected a .count{background-color:#ccc}.buddypress-wrap .bp-navs li:not(.current) a:focus,.buddypress-wrap .bp-navs li:not(.current) a:hover,.buddypress-wrap .bp-navs li:not(.selected) a:focus,.buddypress-wrap .bp-navs li:not(.selected) a:hover{background:#ccc;color:#333}.buddypress-wrap .bp-navs li.current a,.buddypress-wrap .bp-navs li.current a:focus,.buddypress-wrap .bp-navs li.current a:hover,.buddypress-wrap .bp-navs li.selected a,.buddypress-wrap .bp-navs li.selected a:focus,.buddypress-wrap .bp-navs li.selected a:hover{background:#555;color:#fafafa}.buddypress-wrap .bp-navs li.current a .count,.buddypress-wrap .bp-navs li.current a:focus .count,.buddypress-wrap .bp-navs li.current a:hover .count,.buddypress-wrap .bp-navs li.selected a .count,.buddypress-wrap .bp-navs li.selected a:focus .count,.buddypress-wrap .bp-navs li.selected a:hover .count{border-color:#fafafa}@media screen and (min-width:46.8em){.buddypress-wrap .main-navs:not(.dir-navs) li.current a,.buddypress-wrap .main-navs:not(.dir-navs) li.selected a{background:#fff;color:#333;font-weight:600}.buddypress-wrap .main-navs.vertical li.current a,.buddypress-wrap .main-navs.vertical li.selected a{background:#555;color:#fafafa;text-decoration:none}.buddypress-wrap.bp-dir-hori-nav nav:not(".tabbed-links"){border-bottom:1px solid #eee;border-top:1px solid #eee;-webkit-box-shadow:0 2px 12px 0 #fafafa;-moz-box-shadow:0 2px 12px 0 #fafafa;box-shadow:0 2px 12px 0 #fafafa}}.buddypress-wrap .bp-subnavs li.current a,.buddypress-wrap .bp-subnavs li.selected a{background:#fff;color:#333;font-weight:600}@media screen and (max-width:46.8em){.buddypress-wrap:not(.bp-single-vert-nav) .bp-navs li{background:#eaeaea}}.buddypress-wrap:not(.bp-single-vert-nav) .main-navs>ul>li>a{padding:.5em calc(.5em + 2px)}.buddypress-wrap:not(.bp-single-vert-nav) .group-subnav#subsubnav,.buddypress-wrap:not(.bp-single-vert-nav) .user-subnav#subsubnav{background:0 0}.buddypress-wrap .bp-subnavs,.buddypress-wrap ul.subnav{width:100%}.buddypress-wrap .bp-subnavs{margin:10px 0;overflow:hidden}.buddypress-wrap .bp-subnavs ul li{margin-top:0}.buddypress-wrap .bp-subnavs ul li.current :focus,.buddypress-wrap .bp-subnavs ul li.current :hover,.buddypress-wrap .bp-subnavs ul li.selected :focus,.buddypress-wrap .bp-subnavs ul li.selected :hover{background:0 0;color:#333}.buddypress-wrap ul.subnav{width:auto}.buddypress-wrap .bp-navs.bp-invites-filters#subsubnav ul li.last,.buddypress-wrap .bp-navs.bp-invites-nav#subnav ul li.last,.buddypress-wrap .bp-navs.bp-messages-filters#subsubnav ul li.last{margin-top:0}@media screen and (max-width:46.8em){.buddypress-wrap .single-screen-navs{border:1px solid #eee}.buddypress-wrap .single-screen-navs li{border-bottom:1px solid #eee}.buddypress-wrap .single-screen-navs li:last-child{border-bottom:none}.buddypress-wrap .bp-subnavs li a{font-size:14px}.buddypress-wrap .bp-subnavs li.current a,.buddypress-wrap .bp-subnavs li.current a:focus,.buddypress-wrap .bp-subnavs li.current a:hover,.buddypress-wrap .bp-subnavs li.selected a,.buddypress-wrap .bp-subnavs li.selected a:focus,.buddypress-wrap .bp-subnavs li.selected a:hover{background:#555;color:#fff}}.buddypress-wrap .bp-navs li.current a .count,.buddypress-wrap .bp-navs li.selected a .count,.buddypress_object_nav .bp-navs li.current a .count,.buddypress_object_nav .bp-navs li.selected a .count{background-color:#fff}.buddypress-wrap .bp-navs li.dynamic a .count,.buddypress-wrap .bp-navs li.dynamic.current a .count,.buddypress-wrap .bp-navs li.dynamic.selected a .count,.buddypress_object_nav .bp-navs li.dynamic a .count,.buddypress_object_nav .bp-navs li.dynamic.current a .count,.buddypress_object_nav .bp-navs li.dynamic.selected a .count{background-color:#5087e5;border:0;color:#fafafa}.buddypress-wrap .bp-navs li.dynamic a:hover .count,.buddypress_object_nav .bp-navs li.dynamic a:hover .count{background-color:#5087e5;border:0;color:#fff}.buddypress-wrap .bp-navs li a .count:empty,.buddypress_object_nav .bp-navs li a .count:empty{display:none}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current),.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current){color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a{color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a:focus,.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a:hover,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a:focus,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a:hover{background:0 0;color:#333}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a[disabled]:focus,.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a[disabled]:hover,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a[disabled]:focus,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a[disabled]:hover{color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li.current a,.buddypress_object_nav .bp-navs.group-create-links ul li.current a{text-align:center}@media screen and (min-width:46.8em){.buddypress-wrap .bp-navs li{float:right}.buddypress-wrap .subnav{float:right}.buddypress-wrap ul.subnav{width:auto}.buddypress-wrap #subsubnav .activity-search{float:right}.buddypress-wrap #subsubnav .filter{float:left}}.buddypress_object_nav .bp-navs li a .count{display:inline-block;float:left}@media screen and (min-width:46.8em){.bp-dir-vert-nav .bp-navs.dir-navs{background:0 0}.bp-dir-vert-nav .bp-navs.dir-navs a .count{float:left}}@media screen and (min-width:46.8em){.buddypress-wrap .item-body .tabbed-links ol,.buddypress-wrap .item-body .tabbed-links ul{border-bottom:1px solid #ccc;float:none;margin:20px 0 10px}.buddypress-wrap .item-body .tabbed-links ol:after,.buddypress-wrap .item-body .tabbed-links ol:before,.buddypress-wrap .item-body .tabbed-links ul:after,.buddypress-wrap .item-body .tabbed-links ul:before{content:" ";display:block}.buddypress-wrap .item-body .tabbed-links ol:after,.buddypress-wrap .item-body .tabbed-links ul:after{clear:both}.buddypress-wrap .item-body .tabbed-links ol li,.buddypress-wrap .item-body .tabbed-links ul li{float:right;list-style:none;margin:0 0 0 10px}.buddypress-wrap .item-body .tabbed-links ol li a,.buddypress-wrap .item-body .tabbed-links ol li span,.buddypress-wrap .item-body .tabbed-links ul li a,.buddypress-wrap .item-body .tabbed-links ul li span{background:0 0;border:none;display:block;padding:4px 10px}.buddypress-wrap .item-body .tabbed-links ol li a:focus,.buddypress-wrap .item-body .tabbed-links ol li a:hover,.buddypress-wrap .item-body .tabbed-links ul li a:focus,.buddypress-wrap .item-body .tabbed-links ul li a:hover{background:0 0}.buddypress-wrap .item-body .tabbed-links ol li.current,.buddypress-wrap .item-body .tabbed-links ul li.current{border-color:#ccc #ccc #fff;border-style:solid;border-top-right-radius:4px;border-top-left-radius:4px;border-width:1px;margin-bottom:-1px;padding:0 .5em 1px}.buddypress-wrap .item-body .tabbed-links ol li.current a,.buddypress-wrap .item-body .tabbed-links ul li.current a{color:#333}.buddypress-wrap .item-body .bp-subnavs.tabbed-links>ul{margin-top:0}.buddypress-wrap .item-body .bp-navs.tabbed-links{background:0 0;margin-top:2px}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a{border-left:0;font-size:inherit}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.last{float:left;margin:0}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.last a{margin-top:-.5em}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:focus,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:hover,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:focus,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:hover{background:0 0;border:0}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:active,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:active{outline:0}}.buddypress-wrap .dir-component-filters .filter label{display:inline}.buddypress-wrap .subnav-filters:after,.buddypress-wrap .subnav-filters:before{content:" ";display:table}.buddypress-wrap .subnav-filters:after{clear:both}.buddypress-wrap .subnav-filters{background:0 0;list-style:none;margin:15px 0 0;padding:0}.buddypress-wrap .subnav-filters div{margin:0}.buddypress-wrap .subnav-filters>ul{float:right;list-style:none}.buddypress-wrap .subnav-filters.bp-messages-filters ul{width:100%}.buddypress-wrap .subnav-filters.bp-messages-filters .messages-search{margin-bottom:1em}@media screen and (min-width:46.8em){.buddypress-wrap .subnav-filters.bp-messages-filters .messages-search{margin-bottom:0}}.buddypress-wrap .subnav-filters div{float:none}.buddypress-wrap .subnav-filters div input[type=search],.buddypress-wrap .subnav-filters div select{font-size:16px}.buddypress-wrap .subnav-filters div button.nouveau-search-submit{padding:5px .8em 6px}.buddypress-wrap .subnav-filters div button#user_messages_search_submit{padding:7px .8em}.buddypress-wrap .subnav-filters .component-filters{margin-top:10px}.buddypress-wrap .subnav-filters .feed{margin-left:15px}.buddypress-wrap .subnav-filters .last.filter label{display:inline}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:after,.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:before{content:" ";display:table}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:after{clear:both}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap.bp-show{display:inline-block}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap.bp-hide{display:none}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap{border:0}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap:focus,.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap:hover{outline:1px solid #d6d6d6}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions{float:right}.buddypress-wrap .subnav-filters .user-messages-bulk-actions label{display:inline-block;font-weight:300;margin-left:25px;padding:5px 0}.buddypress-wrap .subnav-filters .user-messages-bulk-actions div select{-webkit-appearance:textfield}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-apply{border:0;border-radius:none;font-weight:400;line-height:1.8;margin:0 10px 0 0;padding:3px 5px;text-align:center;text-transform:none;width:auto}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-apply span{vertical-align:middle}@media screen and (min-width:32em){.buddypress-wrap .subnav-filters li{margin-bottom:0}.buddypress-wrap .subnav-filters .bp-search,.buddypress-wrap .subnav-filters .dir-search,.buddypress-wrap .subnav-filters .feed,.buddypress-wrap .subnav-filters .group-act-search,.buddypress-wrap .subnav-filters .group-invites-search,.buddypress-wrap .subnav-filters .subnav-search,.buddypress-wrap .subnav-filters .subnav-search form,.buddypress-wrap .subnav-filters .user-messages-bulk-actions,.buddypress-wrap .subnav-filters .user-messages-search{float:right}.buddypress-wrap .subnav-filters .component-filters,.buddypress-wrap .subnav-filters .last{float:left;margin-top:0;width:auto}.buddypress-wrap .subnav-filters .component-filters select,.buddypress-wrap .subnav-filters .last select{max-width:250px}.buddypress-wrap .subnav-filters .user-messages-search{float:left}}.buddypress-wrap .notifications-options-nav input#notification-bulk-manage{border:0;border-radius:0;line-height:1.6}.buddypress-wrap .bp-pagination{background:0 0;border:0;color:#767676;float:right;font-size:small;margin:0;padding:.5em 0;position:relative;width:100%}.buddypress-wrap .bp-pagination .pag-count{float:right}.buddypress-wrap .bp-pagination .bp-pagination-links{float:left;margin-left:10px}.buddypress-wrap .bp-pagination .bp-pagination-links a,.buddypress-wrap .bp-pagination .bp-pagination-links span{font-size:small;padding:0 5px}.buddypress-wrap .bp-pagination .bp-pagination-links a:focus,.buddypress-wrap .bp-pagination .bp-pagination-links a:hover{opacity:1}.buddypress-wrap .bp-pagination p{margin:0}.bp-list:after,.bp-list:before{content:" ";display:table}.bp-list:after{clear:both}.bp-list{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-top:1px solid #eaeaea;clear:both;list-style:none;margin:20px 0;padding:.5em 0;width:100%}.bp-list li:after,.bp-list li:before{content:" ";display:table}.bp-list li:after{clear:both}.bp-list>li{border-bottom:1px solid #eaeaea}.bp-list li{list-style:none;margin:10px 0;padding:.5em 0;position:relative}.bp-list li .item-avatar{text-align:center}.bp-list li .item-avatar img.avatar{display:inline}.bp-list li .item .group-details,.bp-list li .item .item-avatar,.bp-list li .item .item-meta,.bp-list li .item .list-title{text-align:center}.bp-list li .item .list-title{clear:none;font-size:22px;font-weight:400;line-height:1.1;margin:0 auto}@media screen and (min-width:46.8em){.bp-list li .item .list-title{font-size:26px}}.bp-list li .item-meta,.bp-list li .meta{color:#737373;font-size:12px;margin-top:10px}.bp-list li .last-post{text-align:center}.bp-list li .action{margin:0;text-align:center}.bp-list li .action .generic-button{display:inline-block;font-size:12px;margin:0 0 0 10px}.bp-list li .action div.generic-button{margin:10px 0}@media screen and (min-width:46.8em){.bp-list li .item-avatar{float:right;margin-left:5%}.bp-list li .item{margin:0;overflow:hidden}.bp-list li .item .item-block{float:right;margin-left:2%;width:50%}.bp-list li .item .item-meta,.bp-list li .item .list-title{float:right;text-align:right}.bp-list li .item .group-details,.bp-list li .item .last-post{text-align:right}.bp-list li .group-desc,.bp-list li .last-post,.bp-list li .user-update{clear:none;overflow:hidden;width:auto}.bp-list li .action{clear:right;padding:0;text-align:right}.bp-list li .action li.generic-button{margin-left:0}.bp-list li .action div.generic-button{margin:0 0 10px}.bp-list li .generic-button{display:block;margin:0 0 5px 0}}@media screen and (min-width:32em){#activity-stream{clear:both;padding-top:1em}}.activity-list.bp-list{background:#fafafa;border:1px solid #eee}.activity-list.bp-list .activity-item{background:#fff;border:1px solid #b7b7b7;-webkit-box-shadow:0 0 6px #d2d2d2;-moz-box-shadow:0 0 6px #d2d2d2;box-shadow:0 0 6px #d2d2d2;margin:20px 0}.activity-list.bp-list li:first-child{margin-top:0}.friends-request-list .item-title{text-align:center}@media screen and (min-width:46.8em){.friends-request-list li{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap}.friends-request-list li .item{-webkit-flex:1 1 auto;-moz-flex:1 1 auto;-ms-flex:1 1 auto;-o-flex:1 1 auto;flex:1 1 auto}.friends-request-list li .action{text-align:left}.friends-request-list li .item-title{font-size:22px;text-align:right}}#notifications-user-list{clear:both;padding-top:1em}@media screen and (min-width:46.8em){body:not(.logged-in) .bp-list .item{margin-left:0}}.activity-permalink .item-list,.activity-permalink .item-list li.activity-item{border:0}.activity-update-form{padding:10px 10px 0}.item-body .activity-update-form .activity-form{margin:0;padding:0}.activity-update-form{border:1px solid #ccc;-webkit-box-shadow:inset 0 0 6px #eee;-moz-box-shadow:inset 0 0 6px #eee;box-shadow:inset 0 0 6px #eee;margin:15px 0}.activity-update-form #whats-new-avatar{margin:10px 0;text-align:center}.activity-update-form #whats-new-avatar img{display:inline-block}.activity-update-form #whats-new-content{padding:0 0 20px 0}.activity-update-form #whats-new-textarea textarea{background:#fff;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#333;font-family:inherit;font-size:medium;height:2.2em;line-height:1.4;padding:6px;width:100%}.activity-update-form #whats-new-textarea textarea:focus{-webkit-box-shadow:0 0 6px 0 #d6d6d6;-moz-box-shadow:0 0 6px 0 #d6d6d6;box-shadow:0 0 6px 0 #d6d6d6}.activity-update-form #whats-new-post-in-box{margin:10px 0}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items{list-style:none;margin:10px 0}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items li{margin-bottom:10px}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items #activity-autocomplete{padding:.3em}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center;padding:.2em}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object .avatar{width:30px}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object span{padding-right:10px;vertical-align:middle}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object:focus,.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object:hover{background:#eaeaea;cursor:pointer}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object.selected{border:1px solid #d6d6d6}.activity-update-form #whats-new-submit{margin:15px 0 10px}.activity-update-form #whats-new-submit input{font-size:14px;line-height:inherit;margin-bottom:10px;margin-left:10px;padding:.2em 0;text-align:center;width:100%}@media screen and (min-width:46.8em){.activity-update-form #whats-new-avatar{display:block;float:right;margin:0 0 0 10px}.activity-update-form #whats-new-content,.activity-update-form #whats-new-post-in-box,.activity-update-form #whats-new-submit{margin-right:12%}.activity-update-form #whats-new-submit input{margin-bottom:0;margin-left:10px;width:8em}}.activity-list{padding:.5em}.activity-list .activity-item:after,.activity-list .activity-item:before{content:" ";display:table}.activity-list .activity-item:after{clear:both}.activity-list .activity-item{list-style:none;padding:1em}.activity-list .activity-item.has-comments{padding-bottom:1em}.activity-list .activity-item div.item-avatar{margin:0 auto;text-align:center;width:auto}.activity-list .activity-item div.item-avatar img{max-width:40%}@media screen and (min-width:46.8em){.activity-list .activity-item div.item-avatar{margin:0 0 0 2%;text-align:right;width:15%}.activity-list .activity-item div.item-avatar img{max-width:80%}}.activity-list .activity-item.mini{font-size:13px;position:relative}.activity-list .activity-item.mini .activity-avatar{margin-right:0 auto;text-align:center;width:auto}.activity-list .activity-item.mini .activity-avatar img.FB_profile_pic,.activity-list .activity-item.mini .activity-avatar img.avatar{max-width:15%}@media screen and (min-width:46.8em){.activity-list .activity-item.mini .activity-avatar{margin-right:15px;text-align:right;width:15%}.activity-list .activity-item.mini .activity-avatar img.FB_profile_pic,.activity-list .activity-item.mini .activity-avatar img.avatar{max-width:60%}}.activity-list .activity-item.new_forum_post .activity-inner,.activity-list .activity-item.new_forum_topic .activity-inner{border-right:2px solid #eaeaea;margin-right:10px;padding-right:1em}.activity-list .activity-item.newest_blogs_activity,.activity-list .activity-item.newest_friends_activity,.activity-list .activity-item.newest_groups_activity,.activity-list .activity-item.newest_mentions_activity{background:rgba(31,179,221,.1)}.activity-list .activity-item .activity-inreplyto{color:#767676;font-size:13px}.activity-list .activity-item .activity-inreplyto>p{display:inline;margin:0}.activity-list .activity-item .activity-inreplyto .activity-inner,.activity-list .activity-item .activity-inreplyto blockquote{background:0 0;border:0;display:inline;margin:0;overflow:hidden;padding:0}.activity-list .activity-item .activity-header{margin:0 auto;width:80%}.activity-list .activity-item .activity-header a,.activity-list .activity-item .activity-header img{display:inline}.activity-list .activity-item .activity-header .avatar{display:inline-block;margin:0 5px;vertical-align:bottom}.activity-list .activity-item .activity-header .time-since{font-size:14px;color:#767676;text-decoration:none}.activity-list .activity-item .activity-header .time-since:hover{color:#767676;cursor:pointer;text-decoration:underline}.activity-list .activity-item .activity-content .activity-header,.activity-list .activity-item .activity-content .comment-header{color:#767676;margin-bottom:10px}.activity-list .activity-item .activity-content .activity-inner,.activity-list .activity-item .activity-content blockquote{background:#fafafa;margin:15px 0 10px;overflow:hidden;padding:1em}.activity-list .activity-item .activity-content p{margin:0}.activity-list .activity-item .activity-inner p{word-wrap:break-word}.activity-list .activity-item .activity-read-more{margin-right:1em;white-space:nowrap}.activity-list .activity-item ul.activity-meta{margin:0;padding-right:0}.activity-list .activity-item ul.activity-meta li{border:0;display:inline-block}.activity-list .activity-item .activity-meta.action{border:1px solid transparent;background:#fafafa;padding:2px;position:relative;text-align:right}.activity-list .activity-item .activity-meta.action div.generic-button{margin:0}.activity-list .activity-item .activity-meta.action .button{background:0 0}.activity-list .activity-item .activity-meta.action a{padding:4px 8px}.activity-list .activity-item .activity-meta.action .button:focus,.activity-list .activity-item .activity-meta.action .button:hover{background:0 0}.activity-list .activity-item .activity-meta.action .button:before,.activity-list .activity-item .activity-meta.action .icons:before{font-family:dashicons;font-size:18px;vertical-align:middle}.activity-list .activity-item .activity-meta.action .acomment-reply.button:before{content:"\f101"}.activity-list .activity-item .activity-meta.action .view:before{content:"\f125"}.activity-list .activity-item .activity-meta.action .fav:before{content:"\f154"}.activity-list .activity-item .activity-meta.action .unfav:before{content:"\f155"}.activity-list .activity-item .activity-meta.action .delete-activity:before{content:"\f153"}.activity-list .activity-item .activity-meta.action .delete-activity:hover{color:#800}.activity-list .activity-item .activity-meta.action .button{border:0;box-shadow:none}.activity-list .activity-item .activity-meta.action .button span{background:0 0;color:#555;font-weight:700}@media screen and (min-width:46.8em){.activity-list.bp-list{padding:30px}.activity-list .activity-item .activity-content{margin:0;position:relative}.activity-list .activity-item .activity-content:after{clear:both;content:"";display:table}.activity-list .activity-item .activity-header{margin:0 0 0 15px;width:auto}}.buddypress-wrap .activity-list .load-more,.buddypress-wrap .activity-list .load-newest{background:#fafafa;border:1px solid #eee;font-size:110%;margin:15px 0;padding:0;text-align:center}.buddypress-wrap .activity-list .load-more a,.buddypress-wrap .activity-list .load-newest a{color:#555;display:block;padding:.5em 0}.buddypress-wrap .activity-list .load-more a:focus,.buddypress-wrap .activity-list .load-more a:hover,.buddypress-wrap .activity-list .load-newest a:focus,.buddypress-wrap .activity-list .load-newest a:hover{background:#fff;color:#333}.buddypress-wrap .activity-list .load-more:focus,.buddypress-wrap .activity-list .load-more:hover,.buddypress-wrap .activity-list .load-newest:focus,.buddypress-wrap .activity-list .load-newest:hover{border-color:#e1e1e1;-webkit-box-shadow:0 0 6px 0 #eaeaea;-moz-box-shadow:0 0 6px 0 #eaeaea;box-shadow:0 0 6px 0 #eaeaea}body.activity-permalink .activity-list li{border-width:1px;padding:1em 0 0 0}body.activity-permalink .activity-list li:first-child{padding-top:0}body.activity-permalink .activity-list li.has-comments{padding-bottom:0}body.activity-permalink .activity-list .activity-avatar{width:auto}body.activity-permalink .activity-list .activity-avatar a{display:block}body.activity-permalink .activity-list .activity-avatar img{max-width:100%}body.activity-permalink .activity-list .activity-content{border:0;font-size:100%;line-height:1.5;padding:0}body.activity-permalink .activity-list .activity-content .activity-header{margin:0;padding:.5em 0 0 0;text-align:center;width:100%}body.activity-permalink .activity-list .activity-content .activity-inner,body.activity-permalink .activity-list .activity-content blockquote{margin-right:0;margin-top:10px}body.activity-permalink .activity-list .activity-meta{margin:10px 0 10px}body.activity-permalink .activity-list .activity-comments{margin-bottom:10px}@media screen and (min-width:46.8em){body.activity-permalink .activity-list .activity-avatar{right:-20px;margin-left:0;position:relative;top:-20px}body.activity-permalink .activity-list .activity-content{margin-left:10px}body.activity-permalink .activity-list .activity-content .activity-header p{text-align:right}}.buddypress-wrap .activity-comments{clear:both;margin:0 5%;overflow:hidden;position:relative;width:auto}.buddypress-wrap .activity-comments ul{clear:both;list-style:none;margin:15px 0 0;padding:0}.buddypress-wrap .activity-comments ul li{border-top:1px solid #eee;border-bottom:0;padding:1em 0 0}.buddypress-wrap .activity-comments ul li ul{margin-right:5%}.buddypress-wrap .activity-comments ul li:first-child{border-top:0}.buddypress-wrap .activity-comments ul li:last-child{margin-bottom:0}.buddypress-wrap .activity-comments div.acomment-avatar{width:auto}.buddypress-wrap .activity-comments div.acomment-avatar img{border-width:1px;float:right;height:25px;max-width:none;width:25px}.buddypress-wrap .activity-comments .acomment-content p,.buddypress-wrap .activity-comments .acomment-meta{font-size:14px}.buddypress-wrap .activity-comments .acomment-meta{color:#555;overflow:hidden;padding-right:2%}.buddypress-wrap .activity-comments .acomment-content{border-right:1px solid #ccc;margin:15px 10% 0 0;padding:.5em 1em}.buddypress-wrap .activity-comments .acomment-content p{margin-bottom:.5em}.buddypress-wrap .activity-comments .acomment-options{float:right;margin:10px 20px 10px 0}.buddypress-wrap .activity-comments .acomment-options a{color:#767676;font-size:14px}.buddypress-wrap .activity-comments .acomment-options a:focus,.buddypress-wrap .activity-comments .acomment-options a:hover{color:inherit}.buddypress-wrap .activity-comments .activity-meta.action{background:0 0;margin-top:10px}.buddypress-wrap .activity-comments .activity-meta.action button{font-size:14px;font-weight:400;text-transform:none}.buddypress-wrap .activity-comments .show-all button{font-size:14px;text-decoration:underline;padding-right:.5em}.buddypress-wrap .activity-comments .show-all button span{text-decoration:none}.buddypress-wrap .activity-comments .show-all button:focus span,.buddypress-wrap .activity-comments .show-all button:hover span{color:#5087e5}.buddypress-wrap .mini .activity-comments{clear:both;margin-top:0}body.activity-permalink .activity-comments{background:0 0;width:auto}body.activity-permalink .activity-comments>ul{padding:0 1em 0 .5em}body.activity-permalink .activity-comments ul li>ul{margin-top:10px}form.ac-form{display:none;padding:1em}form.ac-form .ac-reply-avatar{float:right}form.ac-form .ac-reply-avatar img{border:1px solid #eee}form.ac-form .ac-reply-content{color:#767676;padding-right:1em}form.ac-form .ac-reply-content a{text-decoration:none}form.ac-form .ac-reply-content .ac-textarea{margin-bottom:15px;padding:0 .5em;overflow:hidden}form.ac-form .ac-reply-content .ac-textarea textarea{background:0 0;box-shadow:none;color:#555;font-family:inherit;font-size:100%;height:60px;margin:0;outline:0;padding:.5em;width:100%}form.ac-form .ac-reply-content .ac-textarea textarea:focus{-webkit-box-shadow:0 0 6px #d6d6d6;-moz-box-shadow:0 0 6px #d6d6d6;box-shadow:0 0 6px #d6d6d6}form.ac-form .ac-reply-content input{margin-top:10px}.activity-comments li form.ac-form{clear:both;margin-left:15px}.activity-comments form.root{margin-right:0}@media screen and (min-width:46.8em){.buddypress-wrap .blogs-list li .item-block{float:none;width:auto}.buddypress-wrap .blogs-list li .item-meta{clear:right;float:none}}@media screen and (min-width:46.8em){.buddypress-wrap .bp-dir-vert-nav .blogs-list .list-title{width:auto}}.buddypress-wrap .groups-list li .list-title{text-align:center}.buddypress-wrap .groups-list li .group-details{clear:right}.buddypress-wrap .groups-list li .group-desc{border:1px solid #eaeaea;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;border-radius:10px;background-clip:padding-box;font-size:13px;color:#737373;font-style:italic;margin:10px auto 0;padding:1em}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list li .group-desc{font-size:16px}}.buddypress-wrap .groups-list li p{margin:0 0 .5em}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list li .item{margin-left:0}.buddypress-wrap .groups-list li .item-meta,.buddypress-wrap .groups-list li .list-title{text-align:right;width:auto}.buddypress-wrap .groups-list li .item-meta{margin-bottom:20px}.buddypress-wrap .groups-list li .last-activity{clear:right;margin-top:-20px}}.buddypress-wrap .groups-list li.group-no-avatar div.group-desc{margin-right:0}.buddypress-wrap .mygroups .groups-list.grid .wrap{min-height:450px;padding-bottom:0}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list.grid.four .group-desc,.buddypress-wrap .groups-list.grid.three .group-desc{font-size:14px}}@media screen and (min-width:46.8em){.buddypress .bp-vertical-navs .groups-list .item-avatar{margin-left:3%;width:15%}}.buddypress-wrap .members-list li .member-name{margin-bottom:10px}.buddypress-wrap .members-list li .user-update{border:1px solid #eaeaea;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;border-radius:10px;background-clip:padding-box;color:#737373;font-style:italic;font-size:13px;margin:15px auto;padding:1em}@media screen and (min-width:46.8em){.buddypress-wrap .members-list li .user-update{font-size:16px}}.buddypress-wrap .members-list li .user-update .activity-read-more{display:block;font-size:12px;font-style:normal;margin-top:10px;padding-right:2px}@media screen and (min-width:46.8em){.buddypress-wrap .members-list li .last-activity{clear:right;margin-top:-10px}}@media screen and (min-width:46.8em){.buddypress-wrap .members-group-list li .joined{clear:right;float:none}}@media screen and (min-width:32em){body:not(.logged-in) .members-list .user-update{width:96%}}.register-page .register-section{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.register-page .signup-form{margin-top:20px}.register-page .signup-form .default-profile input{margin-bottom:20px}.register-page .signup-form label,.register-page .signup-form legend{margin:10px 0 0}.register-page .signup-form .editfield{margin:15px 0}.register-page .signup-form .editfield fieldset{border:0;padding:0}.register-page .signup-form .editfield fieldset legend{margin:0 0 5px;text-indent:0}.register-page .signup-form .editfield .field-visibility-settings{padding:.5em}.register-page .signup-form .editfield .field-visibility-settings fieldset{margin:0 0 10px}.register-page .signup-form #signup-avatar img{margin:0 0 10px 15px}.register-page .signup-form .password-entry,.register-page .signup-form .password-entry-confirm{border:1px solid #eee}@media screen and (min-width:46.8em){.buddypress-wrap .register-page .layout-wrap{display:flex;flex-flow:row wrap;justify-content:space-around}.buddypress-wrap .register-page .layout-wrap .default-profile{flex:1;padding-left:2em}.buddypress-wrap .register-page .layout-wrap .blog-details{flex:1;padding-right:2em}.buddypress-wrap .register-page .submit{clear:both}}@media screen and (min-width:46.8em){.buddypress-wrap.extended-default-reg .register-page .default-profile{flex:1;padding-left:1em}.buddypress-wrap.extended-default-reg .register-page .extended-profile{flex:2;padding-right:1em}.buddypress-wrap.extended-default-reg .register-page .blog-details{flex:1 100%}}#group-create-body{padding:.5em}#group-create-body .creation-step-name{text-align:center}#group-create-body .avatar-nav-items{margin-top:15px}.single-headers:after,.single-headers:before{content:" ";display:table}.single-headers:after{clear:both}.single-headers{margin-bottom:15px}.single-headers #item-header-avatar a{display:block;text-align:center}.single-headers #item-header-avatar a img{float:none}.single-headers div#item-header-content{float:none}@media screen and (min-width:46.8em){.single-headers #item-header-avatar a{text-align:right}.single-headers #item-header-avatar a img{float:right}}.single-headers .activity,.single-headers .group-status{display:inline}.single-headers .group-status{font-size:18px;color:#333;padding-left:1em}.single-headers .activity{display:inline-block;font-size:12px;padding:0}.single-headers #sitewide-notice p,.single-headers div#message p{background-color:#ffd;border:1px solid #cb2;color:#440;font-weight:400;margin-top:3px;text-decoration:none}.single-headers h2{line-height:1.2;margin:0 0 5px}.single-headers h2 a{color:#767676;text-decoration:none}.single-headers h2 span.highlight{display:inline-block;font-size:60%;font-weight:400;line-height:1.7;vertical-align:middle}.single-headers h2 span.highlight span{background:#a1dcfa;color:#fff;cursor:pointer;font-size:80%;font-weight:700;margin-bottom:2px;padding:1px 4px;position:relative;left:-2px;top:-2px;vertical-align:middle}.single-headers img.avatar{float:right;margin:0 0 19px 15px}.single-headers .item-meta{color:#767676;font-size:14px;margin:15px 0 5px;padding-bottom:.5em}.single-headers ul{margin-bottom:15px}.single-headers ul li{float:left;list-style:none}.single-headers div.generic-button{text-align:center}.single-headers li.generic-button{display:inline-block;text-align:center}@media screen and (min-width:46.8em){.single-headers a.button,.single-headers div.generic-button,.single-headers li.generic-button{float:right}}.single-headers a.button,.single-headers div.generic-button{margin:10px 0 0 10px}.single-headers li.generic-button{margin:2px 10px}.single-headers li.generic-button:first-child{margin-right:0}.single-headers div#message.info{line-height:.8}body.no-js .single-item-header .js-self-profile-button{display:none}#cover-image-container{position:relative}#header-cover-image{background-color:#c5c5c5;background-position:center top;background-repeat:no-repeat;background-size:cover;border:0;display:block;right:0;margin:0;padding:0;position:absolute;top:0;width:100%;z-index:1}#item-header-cover-image{position:relative;z-index:2}#item-header-cover-image #item-header-avatar{padding:0 1em}.groups-header .bp-group-type-list{margin:0}.groups-header .bp-feedback{clear:both}.groups-header .group-item-actions{float:right;margin:0 15px 15px 0;padding-top:0;width:100%}.groups-header .moderators-lists{margin-top:0}.groups-header .moderators-lists .moderators-title{font-size:14px}.groups-header .moderators-lists .user-list{margin:0 0 5px}.groups-header .moderators-lists .user-list ul:after{clear:both;content:"";display:table}.groups-header .moderators-lists .user-list li{display:inline-block;float:none;margin-right:4px;padding:4px}.groups-header .moderators-lists img.avatar{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;float:none;height:30px;margin:0;max-width:100%;width:30px}@media screen and (min-width:46.8em){.groups-header div#item-header-content{float:right;margin-right:10%;text-align:right;padding-top:15px;width:42%}.groups-header .group-item-actions{float:left;margin:0 15px 15px 0;text-align:left;width:20%}.groups-header .groups-meta{clear:both}}.groups-header .desc-wrap{background:#eaeaea;border:1px solid #d6d6d6;margin:0 0 15px;padding:1em;text-align:center}.groups-header .desc-wrap .group-description{background:#fafafa;-webkit-box-shadow:inset 0 0 9px #ccc;-moz-box-shadow:inset 0 0 9px #ccc;box-shadow:inset 0 0 9px #ccc;padding:1em;text-align:right}.bp-user .users-header .user-nicename{margin-bottom:5px}.bp-user .member-header-actions{overflow:hidden}.bp-user .member-header-actions *>*{display:block}.buddypress-wrap .item-body{margin:20px 0}.buddypress-wrap .item-body .screen-heading{font-size:20px;font-weight:400}.buddypress-wrap .item-body .button-tabs{margin:30px 0 15px}.buddypress-wrap.bp-single-vert-nav .bp-list:not(.grid) .item-entry{padding-right:.5em}.single-item.group-members .item-body .filters:not(.no-subnav){border-top:5px solid #eaeaea;padding-top:1em}.single-item.group-members .item-body .filters{margin-top:0}.buddypress-wrap .group-status-type ul{margin:0 20px 20px 0}.groups-manage-members-list{padding:.5em 0}.groups-manage-members-list dd{margin:0;padding:1em 0}.groups-manage-members-list .section-title{background:#eaeaea;padding-right:.3em}.groups-manage-members-list ul{list-style:none;margin-bottom:0}.groups-manage-members-list ul li{border-bottom:1px solid #eee;margin-bottom:10px;padding:.5em .3em .3em}.groups-manage-members-list ul li:last-child,.groups-manage-members-list ul li:only-child{border-bottom:0}.groups-manage-members-list ul li:nth-child(even){background:#fafafa}.groups-manage-members-list ul li.banned-user{background:#fad3d3}.groups-manage-members-list ul .member-name{margin-bottom:0;text-align:center}.groups-manage-members-list ul img{display:block;margin:0 auto;width:20%}@media screen and (min-width:32em){.groups-manage-members-list ul .member-name{text-align:right}.groups-manage-members-list ul img{display:inline;width:50px}}.groups-manage-members-list ul .members-manage-buttons:after,.groups-manage-members-list ul .members-manage-buttons:before{content:" ";display:table}.groups-manage-members-list ul .members-manage-buttons:after{clear:both}.groups-manage-members-list ul .members-manage-buttons{margin:15px 0 5px}.groups-manage-members-list ul .members-manage-buttons a.button{color:#767676;display:block;font-size:13px}@media screen and (min-width:32em){.groups-manage-members-list ul .members-manage-buttons a.button{display:inline-block}}.groups-manage-members-list ul .members-manage-buttons.text-links-list{margin-bottom:0}@media screen and (max-width:32em){.groups-manage-members-list ul .members-manage-buttons.text-links-list a.button{background:#fafafa;border:1px solid #eee;display:block;margin-bottom:10px}}.groups-manage-members-list ul .action:not(.text-links-list) a.button{font-size:12px}@media screen and (min-width:46.8em){.groups-manage-members-list ul li .avatar,.groups-manage-members-list ul li .member-name{float:right}.groups-manage-members-list ul li .avatar{margin-left:15px}.groups-manage-members-list ul li .action{clear:both;float:right}}.buddypress .bp-invites-content ul.item-list{border-top:0}.buddypress .bp-invites-content ul.item-list li{border:1px solid #eaeaea;margin:0 0 1%;padding-right:5px;padding-left:5px;position:relative;width:auto}.buddypress .bp-invites-content ul.item-list li .list-title{text-align:center;width:auto}.buddypress .bp-invites-content ul.item-list li .action{position:absolute;top:10px;left:10px}.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button{border:0}.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button:focus,.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button:hover{color:#1fb3dd}.buddypress .bp-invites-content ul.item-list li.selected{-webkit-box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2);-moz-box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2);box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2)}.buddypress .bp-invites-content .group-inviters li,.buddypress .bp-invites-content .item-list .item-meta span{color:#767676}.buddypress .bp-invites-content li ul.group-inviters{clear:both;margin:0;overflow:hidden}.buddypress .bp-invites-content li ul.group-inviters li{border:0;float:right;font-size:20px;width:inherit}.buddypress .bp-invites-content li .status{font-size:20px;font-style:italic;clear:both;color:#555;margin:10px 0}.buddypress .bp-invites-content #send-invites-editor{overflow:hidden}.buddypress .bp-invites-content #send-invites-editor textarea{width:100%}.buddypress .bp-invites-content #send-invites-editor ul{clear:both;list-style:none;margin:10px 0;overflow:hidden}.buddypress .bp-invites-content #send-invites-editor ul li{float:right;margin:.5%;max-height:50px;max-width:50px}.buddypress .bp-invites-content #send-invites-editor .action{margin-top:10px;padding-top:10px}.buddypress .bp-invites-content #send-invites-editor.bp-hide{display:none}@media screen and (min-width:46.8em){.buddypress .bp-invites-content ul.item-list>li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #eaeaea;float:right;padding-right:.5em;padding-left:.5em;width:49.5%}.buddypress .bp-invites-content ul.item-list>li:nth-child(odd){margin-left:.5%}.buddypress .bp-invites-content ul.item-list>li:nth-child(even){margin-right:.5%}.buddypress .bp-invites-content ul.item-list ul.group-inviters{float:right;width:auto}}.buddypress.groups .activity-update-form{margin-top:0}.buddypress-wrap .profile{margin-top:30px}.buddypress-wrap .public .profile-fields td.label{width:30%}.buddypress-wrap .profile.edit .button-nav{list-style:none;margin:30px 0 10px}.buddypress-wrap .profile.edit .button-nav li{display:inline-block;margin-left:10px}.buddypress-wrap .profile.edit .button-nav li a{font-size:18px}.buddypress-wrap .profile.edit .editfield{background:#fafafa;border:1px solid #eee;margin:15px 0;padding:1em}.buddypress-wrap .profile.edit .editfield fieldset{border:0}.buddypress-wrap .profile.edit .editfield fieldset label{font-weight:400}.buddypress-wrap .profile.edit .editfield fieldset label.xprofile-field-label{display:inline}.buddypress-wrap .profile.edit .editfield{display:flex;flex-direction:column}.buddypress-wrap .profile.edit .editfield .description{margin-top:10px;order:2}.buddypress-wrap .profile.edit .editfield>fieldset{order:1}.buddypress-wrap .profile.edit .editfield .field-visibility-settings,.buddypress-wrap .profile.edit .editfield .field-visibility-settings-toggle{order:3}body.no-js .buddypress-wrap .field-visibility-settings-close,body.no-js .buddypress-wrap .field-visibility-settings-toggle{display:none}body.no-js .buddypress-wrap .field-visibility-settings{display:block}.buddypress-wrap .field-visibility-settings{margin:10px 0}.buddypress-wrap .current-visibility-level{font-style:normal;font-weight:700}.buddypress-wrap .field-visibility-settings,.buddypress-wrap .field-visibility-settings-header{color:#737373}.buddypress-wrap .field-visibility-settings fieldset{margin:5px 0}.buddypress-wrap .standard-form .editfield fieldset{margin:0}.buddypress-wrap .standard-form .field-visibility-settings label{font-weight:400;margin:0}.buddypress-wrap .standard-form .field-visibility-settings .radio{list-style:none;margin-bottom:0}.buddypress-wrap .standard-form .field-visibility-settings .field-visibility-settings-close{font-size:12px}.buddypress-wrap .standard-form .wp-editor-container{border:1px solid #dedede}.buddypress-wrap .standard-form .wp-editor-container textarea{background:#fff;width:100%}.buddypress-wrap .standard-form .description{background:#fafafa;font-size:inherit}.buddypress-wrap .standard-form .field-visibility-settings legend,.buddypress-wrap .standard-form .field-visibility-settings-header{font-style:italic}.buddypress-wrap .standard-form .field-visibility-settings-header{font-size:14px}.buddypress-wrap .standard-form .field-visibility-settings label,.buddypress-wrap .standard-form .field-visibility-settings legend{font-size:14px}.buddypress-wrap .standard-form .field-visibility select{margin:0}.buddypress-wrap .html-active button.switch-html{background:#f5f5f5;border-bottom-color:transparent;border-bottom-right-radius:0;border-bottom-left-radius:0}.buddypress-wrap .tmce-active button.switch-tmce{background:#f5f5f5;border-bottom-color:transparent;border-bottom-right-radius:0;border-bottom-left-radius:0}.buddypress-wrap .profile.public .profile-group-title{border-bottom:1px solid #ccc}body.register .buddypress-wrap .page ul{list-style:none}.buddypress-wrap .profile .bp-avatar-nav{margin-top:20px}.message-action-delete:before,.message-action-star:before,.message-action-unstar:before,.message-action-view:before{font-family:dashicons;font-size:18px}.message-action-star:before{color:#aaa;content:"\f154"}.message-action-unstar:before{color:#fcdd77;content:"\f155"}.message-action-view:before{content:"\f473"}.message-action-delete:before{content:"\f153"}.message-action-delete:hover:before{color:#a00}.preview-content .actions a{text-decoration:none}.bp-messages-content{margin:15px 0}.bp-messages-content .avatar{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.bp-messages-content .thread-participants{list-style:none}.bp-messages-content .thread-participants dd{margin-right:0}.bp-messages-content time{color:#737373;font-size:12px}#message-threads{border-top:1px solid #eaeaea;clear:both;list-style:none;margin:0;max-height:220px;overflow-x:hidden;overflow-y:auto;padding:0;width:100%}#message-threads li{border-bottom:1px solid #eaeaea;display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap;margin:0;overflow:hidden;padding:.5em 0}#message-threads li .thread-cb{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center;-webkit-flex:1 2 5%;-moz-flex:1 2 5%;-ms-flex:1 2 5%;-o-flex:1 2 5%;flex:1 2 5%}#message-threads li .thread-from{-webkit-flex:1 2 20%;-moz-flex:1 2 20%;-ms-flex:1 2 20%;-o-flex:1 2 20%;flex:1 2 20%}#message-threads li .thread-from img.avatar{float:right;margin:0 0 0 10px}#message-threads li .thread-from .user-name{display:inline-block;line-height:1.1}#message-threads li .thread-content{-webkit-flex:1 2 60%;-moz-flex:1 2 60%;-ms-flex:1 2 60%;-o-flex:1 2 60%;flex:1 2 60%}#message-threads li .thread-date{-webkit-flex:1 2 15%;-moz-flex:1 2 15%;-ms-flex:1 2 15%;-o-flex:1 2 15%;flex:1 2 15%}#message-threads li.selected{background-color:#fafafa}#message-threads li.selected .thread-subject .subject{color:#5087e5}#message-threads li .thread-content{cursor:pointer}#message-threads li .thread-content .excerpt{color:#737373;font-size:12px;margin:0}#message-threads li .thread-content .thread-from,#message-threads li .thread-content .thread-subject{font-size:13px}@media screen and (min-width:46.8em){#message-threads li .thread-content .thread-from,#message-threads li .thread-content .thread-subject{font-size:16px}}#message-threads li .thread-content .thread-subject{vertical-align:top}#message-threads li .thread-content .thread-subject .excerpt{font-weight:400}#message-threads li .thread-date{padding-left:5px;text-align:left}.bp-messages-content .actions{float:left;max-width:30%}.bp-messages-content .actions .bp-icons{display:inline-block;margin:0;padding:.3em .5em}.bp-messages-content .actions .bp-icons:before{font-size:26px}.bp-messages-content #thread-preview{border:1px solid #eaeaea;margin-top:20px}.bp-messages-content #thread-preview .preview-message{clear:both}.bp-messages-content #thread-preview .preview-content{margin:.5em}.bp-messages-content #thread-preview .preview-content .preview-message{background:#fafafa;margin:10px 0;padding:1em .3em .3em}.bp-messages-content #bp-message-thread-list{border-top:1px solid #eaeaea;clear:both;list-style:none;padding:1em 0 .3em}.bp-messages-content #bp-message-thread-list li{padding:.5em}.bp-messages-content #bp-message-thread-list li:nth-child(2n) .message-content{background:#fafafa}.bp-messages-content #bp-message-thread-list .message-metadata{border-bottom:1px solid #ccc;-webkit-box-shadow:2px 1px 9px 0 #eee;-moz-box-shadow:2px 1px 9px 0 #eee;box-shadow:2px 1px 9px 0 #eee;overflow:hidden;padding:.2em}.bp-messages-content #bp-message-thread-list .message-metadata .avatar{width:30px}.bp-messages-content #bp-message-thread-list .message-metadata .user-link{display:block;font-size:13px;float:right}@media screen and (min-width:46.8em){.bp-messages-content #bp-message-thread-list .message-metadata .user-link{font-size:16px}}.bp-messages-content #bp-message-thread-list .message-metadata time{color:#737373;font-size:12px;padding:0 .5em}.bp-messages-content #bp-message-thread-list .message-metadata button{padding:0 .3em}.bp-messages-content #bp-message-thread-list .message-metadata button:before{font-size:20px}.bp-messages-content #bp-message-thread-list .message-content{clear:both;margin:1em auto 0;width:90%}.bp-messages-content #bp-message-thread-list img.avatar{float:right;margin:0 0 0 10px}.bp-messages-content #bp-message-thread-list .actions a:before{font-size:18px}.bp-messages-content form.send-reply .avatar-box{padding:.5em 0}.bp-messages-content .preview-pane-header,.bp-messages-content .single-message-thread-header{border-bottom:1px solid #eaeaea}.bp-messages-content .preview-pane-header:after,.bp-messages-content .single-message-thread-header:after{clear:both;content:"";display:table}.bp-messages-content .preview-thread-title,.bp-messages-content .single-thread-title{font-size:16px}.bp-messages-content .preview-thread-title .messages-title,.bp-messages-content .single-thread-title .messages-title{padding-right:2em}.bp-messages-content .thread-participants{float:right;margin:5px 0;width:70%}.bp-messages-content .thread-participants dd,.bp-messages-content .thread-participants ul{margin-bottom:10px}.bp-messages-content .thread-participants ul{list-style:none}.bp-messages-content .thread-participants ul:after{clear:both;content:"";display:table}.bp-messages-content .thread-participants li{float:right;margin-right:5px}.bp-messages-content .thread-participants img{width:30px}.bp-messages-content #bp-message-thread-list li .message-content blockquote,.bp-messages-content #bp-message-thread-list li .message-content ol,.bp-messages-content #bp-message-thread-list li .message-content ul,.bp-messages-content #thread-preview .preview-message blockquote,.bp-messages-content #thread-preview .preview-message ol,.bp-messages-content #thread-preview .preview-message ul{list-style-position:inside;margin-right:0}.bp-messages-content #thread-preview:empty,.bp-messages-content ul#message-threads:empty{display:none}.bp-messages-content #bp-message-thread-header h2:first-child,.bp-messages-content #thread-preview h2:first-child{background-color:#eaeaea;color:#555;font-weight:700;margin:0;padding:.5em}.bp-messages-content #bp-message-thread-list li a.user-link,.bp-messages-content #message-threads .thread-content a{border:0;text-decoration:none}.bp-messages-content .standard-form #subject{margin-bottom:20px}div.bp-navs#subsubnav.bp-messages-filters .user-messages-bulk-actions{margin-left:15px;max-width:42.5%}.buddypress.settings .profile-settings.bp-tables-user select{width:100%}.buddypress-wrap #whats-new-post-in-box select,.buddypress-wrap .filter select{border:1px solid #d6d6d6}.buddypress-wrap input.action[disabled]{cursor:pointer;opacity:.4}.buddypress-wrap #notification-bulk-manage[disabled]{display:none}.buddypress-wrap fieldset legend{font-size:inherit;font-weight:600}.buddypress-wrap input[type=email]:focus,.buddypress-wrap input[type=password]:focus,.buddypress-wrap input[type=tel]:focus,.buddypress-wrap input[type=text]:focus,.buddypress-wrap input[type=url]:focus,.buddypress-wrap textarea:focus{-webkit-box-shadow:0 0 8px #eaeaea;-moz-box-shadow:0 0 8px #eaeaea;box-shadow:0 0 8px #eaeaea}.buddypress-wrap select{height:auto}.buddypress-wrap textarea{resize:vertical}.buddypress-wrap .standard-form .bp-controls-wrap{margin:1em 0}.buddypress-wrap .standard-form .groups-members-search input[type=search],.buddypress-wrap .standard-form .groups-members-search input[type=text],.buddypress-wrap .standard-form [data-bp-search] input[type=search],.buddypress-wrap .standard-form [data-bp-search] input[type=text],.buddypress-wrap .standard-form input[type=color],.buddypress-wrap .standard-form input[type=date],.buddypress-wrap .standard-form input[type=datetime-local],.buddypress-wrap .standard-form input[type=datetime],.buddypress-wrap .standard-form input[type=email],.buddypress-wrap .standard-form input[type=month],.buddypress-wrap .standard-form input[type=number],.buddypress-wrap .standard-form input[type=password],.buddypress-wrap .standard-form input[type=range],.buddypress-wrap .standard-form input[type=search],.buddypress-wrap .standard-form input[type=tel],.buddypress-wrap .standard-form input[type=text],.buddypress-wrap .standard-form input[type=time],.buddypress-wrap .standard-form input[type=url],.buddypress-wrap .standard-form input[type=week],.buddypress-wrap .standard-form select,.buddypress-wrap .standard-form textarea{background:#fafafa;border:1px solid #d6d6d6;border-radius:0;font:inherit;font-size:100%;padding:.5em}.buddypress-wrap .standard-form input[required],.buddypress-wrap .standard-form select[required],.buddypress-wrap .standard-form textarea[required]{box-shadow:none;border-width:2px;outline:0}.buddypress-wrap .standard-form input[required]:invalid,.buddypress-wrap .standard-form select[required]:invalid,.buddypress-wrap .standard-form textarea[required]:invalid{border-color:#b71717}.buddypress-wrap .standard-form input[required]:valid,.buddypress-wrap .standard-form select[required]:valid,.buddypress-wrap .standard-form textarea[required]:valid{border-color:#91cc2c}.buddypress-wrap .standard-form input[required]:focus,.buddypress-wrap .standard-form select[required]:focus,.buddypress-wrap .standard-form textarea[required]:focus{border-color:#d6d6d6;border-width:1px}.buddypress-wrap .standard-form input.invalid[required],.buddypress-wrap .standard-form select.invalid[required],.buddypress-wrap .standard-form textarea.invalid[required]{border-color:#b71717}.buddypress-wrap .standard-form input:not(.button-small),.buddypress-wrap .standard-form textarea{width:100%}.buddypress-wrap .standard-form input[type=checkbox],.buddypress-wrap .standard-form input[type=radio]{margin-left:5px;width:auto}.buddypress-wrap .standard-form select{padding:3px}.buddypress-wrap .standard-form textarea{height:120px}.buddypress-wrap .standard-form textarea#message_content{height:200px}.buddypress-wrap .standard-form input[type=password]{margin-bottom:5px}.buddypress-wrap .standard-form input:focus,.buddypress-wrap .standard-form select:focus,.buddypress-wrap .standard-form textarea:focus{background:#fafafa;color:#555;outline:0}.buddypress-wrap .standard-form label,.buddypress-wrap .standard-form span.label{display:block;font-weight:600;margin:15px 0 5px;width:auto}.buddypress-wrap .standard-form a.clear-value{display:block;margin-top:5px;outline:0}.buddypress-wrap .standard-form .submit{clear:both;padding:15px 0 0}.buddypress-wrap .standard-form p.submit{margin-bottom:0}.buddypress-wrap .standard-form div.submit input{margin-left:15px}.buddypress-wrap .standard-form #invite-list label,.buddypress-wrap .standard-form p label{font-weight:400;margin:auto}.buddypress-wrap .standard-form p.description{color:#737373;margin:5px 0}.buddypress-wrap .standard-form div.checkbox label:nth-child(n+2),.buddypress-wrap .standard-form div.radio div label{color:#737373;font-size:100%;font-weight:400;margin:5px 0 0}.buddypress-wrap .standard-form#send-reply textarea{width:97.5%}.buddypress-wrap .standard-form#sidebar-login-form label{margin-top:5px}.buddypress-wrap .standard-form#sidebar-login-form input[type=password],.buddypress-wrap .standard-form#sidebar-login-form input[type=text]{padding:4px;width:95%}.buddypress-wrap .standard-form.profile-edit input:focus{background:#fff}@media screen and (min-width:46.8em){.buddypress-wrap .standard-form .left-menu{float:right}.buddypress-wrap .standard-form #invite-list ul{list-style:none;margin:1%}.buddypress-wrap .standard-form #invite-list ul li{margin:0 1% 0 0}.buddypress-wrap .standard-form .main-column{margin-right:190px}.buddypress-wrap .standard-form .main-column ul#friend-list{clear:none;float:right}.buddypress-wrap .standard-form .main-column ul#friend-list h4{clear:none}}.buddypress-wrap .standard-form .bp-tables-user label{margin:0}.buddypress-wrap .signup-form label,.buddypress-wrap .signup-form legend{font-weight:400}body.no-js .buddypress #delete_inbox_messages,body.no-js .buddypress #delete_sentbox_messages,body.no-js .buddypress #message-type-select,body.no-js .buddypress #messages-bulk-management #select-all-messages,body.no-js .buddypress #notifications-bulk-management #select-all-notifications,body.no-js .buddypress label[for=message-type-select]{display:none}.buddypress-wrap .wp-editor-wrap .wp-editor-wrap button,.buddypress-wrap .wp-editor-wrap .wp-editor-wrap input[type=button],.buddypress-wrap .wp-editor-wrap .wp-editor-wrap input[type=submit],.buddypress-wrap .wp-editor-wrap a.button,.buddypress-wrap .wp-editor-wrap input[type=reset]{padding:0 8px 1px}.buddypress-wrap .select-wrap{border:1px solid #eee}.buddypress-wrap .select-wrap label{display:inline}.buddypress-wrap .select-wrap select::-ms-expand{display:none}.buddypress-wrap .select-wrap select{-moz-appearance:none;-webkit-appearance:none;-o-appearance:none;appearance:none;border:0;cursor:pointer;margin-left:-25px;padding:6px 10px 6px 25px;position:relative;text-indent:-2px;z-index:1;width:100%}.buddypress-wrap .select-wrap select,.buddypress-wrap .select-wrap select:active,.buddypress-wrap .select-wrap select:focus{background:0 0}.buddypress-wrap .select-wrap span.select-arrow{display:inline-block;position:relative;z-index:0}.buddypress-wrap .select-wrap span.select-arrow:before{color:#ccc;content:"\25BC"}.buddypress-wrap .select-wrap:focus .select-arrow:before,.buddypress-wrap .select-wrap:hover .select-arrow:before{color:#a6a6a6}.buddypress-wrap .bp-search form:focus,.buddypress-wrap .bp-search form:hover,.buddypress-wrap .select-wrap:focus,.buddypress-wrap .select-wrap:hover{border:1px solid #d5d4d4;box-shadow:inset 0 0 3px #eee}@media screen and (min-width:32em){.buddypress-wrap .notifications-options-nav .select-wrap{float:right}}.buddypress-wrap .bp-dir-search-form,.buddypress-wrap .bp-messages-search-form:after,.buddypress-wrap .bp-messages-search-form:before{content:" ";display:table}.buddypress-wrap .bp-dir-search-form,.buddypress-wrap .bp-messages-search-form:after{clear:both}.buddypress-wrap form.bp-dir-search-form,.buddypress-wrap form.bp-invites-search-form,.buddypress-wrap form.bp-messages-search-form{border:1px solid #eee;width:100%}@media screen and (min-width:55em){.buddypress-wrap form.bp-dir-search-form,.buddypress-wrap form.bp-invites-search-form,.buddypress-wrap form.bp-messages-search-form{width:15em}}.buddypress-wrap form.bp-dir-search-form label,.buddypress-wrap form.bp-invites-search-form label,.buddypress-wrap form.bp-messages-search-form label{margin:0}.buddypress-wrap form.bp-dir-search-form button[type=submit],.buddypress-wrap form.bp-dir-search-form input[type=search],.buddypress-wrap form.bp-dir-search-form input[type=text],.buddypress-wrap form.bp-invites-search-form button[type=submit],.buddypress-wrap form.bp-invites-search-form input[type=search],.buddypress-wrap form.bp-invites-search-form input[type=text],.buddypress-wrap form.bp-messages-search-form button[type=submit],.buddypress-wrap form.bp-messages-search-form input[type=search],.buddypress-wrap form.bp-messages-search-form input[type=text]{background:0 0;border:0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;border-radius:0;background-clip:padding-box}.buddypress-wrap form.bp-dir-search-form input[type=search],.buddypress-wrap form.bp-dir-search-form input[type=text],.buddypress-wrap form.bp-invites-search-form input[type=search],.buddypress-wrap form.bp-invites-search-form input[type=text],.buddypress-wrap form.bp-messages-search-form input[type=search],.buddypress-wrap form.bp-messages-search-form input[type=text]{float:right;line-height:1.5;padding:3px 10px;width:80%}.buddypress-wrap form.bp-dir-search-form button[type=submit],.buddypress-wrap form.bp-invites-search-form button[type=submit],.buddypress-wrap form.bp-messages-search-form button[type=submit]{float:left;font-size:inherit;font-weight:400;line-height:1.5;padding:3px .7em;text-align:center;text-transform:none;width:20%}.buddypress-wrap form.bp-dir-search-form button[type=submit] span,.buddypress-wrap form.bp-invites-search-form button[type=submit] span,.buddypress-wrap form.bp-messages-search-form button[type=submit] span{font-family:dashicons;font-size:18px;line-height:1.6}.buddypress-wrap form.bp-dir-search-form button[type=submit].bp-show,.buddypress-wrap form.bp-invites-search-form button[type=submit].bp-show,.buddypress-wrap form.bp-messages-search-form button[type=submit].bp-show{height:auto;right:0;overflow:visible;position:static;top:0}.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-cancel-button,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-cancel-button,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-cancel-button{-webkit-appearance:searchfield-cancel-button}.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-results-decoration,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-results-decoration,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-results-decoration{display:none}.buddypress-wrap ul.filters li form label input{line-height:1.4;padding:.1em .7em}.buddypress-wrap .current-member-type{font-style:italic}.buddypress-wrap .dir-form{clear:both}.budypress.no-js form.bp-dir-search-form button[type=submit]{height:auto;right:0;overflow:visible;position:static;top:0}.bp-user [data-bp-search] form input[type=search],.bp-user [data-bp-search] form input[type=text]{padding:6px 10px 7px}.buddypress-wrap .bp-tables-user,.buddypress-wrap table.forum,.buddypress-wrap table.wp-profile-fields{width:100%}.buddypress-wrap .bp-tables-user thead tr,.buddypress-wrap table.forum thead tr,.buddypress-wrap table.wp-profile-fields thead tr{background:0 0;border-bottom:2px solid #ccc}.buddypress-wrap .bp-tables-user tbody tr,.buddypress-wrap table.forum tbody tr,.buddypress-wrap table.wp-profile-fields tbody tr{background:#fafafa}.buddypress-wrap .bp-tables-user tr td,.buddypress-wrap .bp-tables-user tr th,.buddypress-wrap table.forum tr td,.buddypress-wrap table.forum tr th,.buddypress-wrap table.wp-profile-fields tr td,.buddypress-wrap table.wp-profile-fields tr th{padding:.5em;vertical-align:middle}.buddypress-wrap .bp-tables-user tr td.label,.buddypress-wrap table.forum tr td.label,.buddypress-wrap table.wp-profile-fields tr td.label{border-left:1px solid #eaeaea;font-weight:600;width:25%}.buddypress-wrap .bp-tables-user tr.alt td,.buddypress-wrap table.wp-profile-fields tr.alt td{background:#fafafa}.buddypress-wrap table.profile-fields .data{padding:.5em 1em}.buddypress-wrap table.profile-fields tr:last-child{border-bottom:none}.buddypress-wrap table.notifications td{padding:1em .5em}.buddypress-wrap table.notifications .bulk-select-all,.buddypress-wrap table.notifications .bulk-select-check{width:7%}.buddypress-wrap table.notifications .bulk-select-check{vertical-align:middle}.buddypress-wrap table.notifications .date,.buddypress-wrap table.notifications .notification-description,.buddypress-wrap table.notifications .notification-since,.buddypress-wrap table.notifications .title{width:39%}.buddypress-wrap table.notifications .actions,.buddypress-wrap table.notifications .notification-actions{width:15%}.buddypress-wrap table.notification-settings th.title,.buddypress-wrap table.profile-settings th.title{width:80%}.buddypress-wrap table.notifications .notification-actions a.delete,.buddypress-wrap table.notifications .notification-actions a.mark-read{display:inline-block}.buddypress-wrap table.notification-settings{margin-bottom:15px;text-align:right}.buddypress-wrap #groups-notification-settings{margin-bottom:0}.buddypress-wrap table.notification-settings td:first-child,.buddypress-wrap table.notification-settings th.icon,.buddypress-wrap table.notifications td:first-child,.buddypress-wrap table.notifications th.icon{display:none}.buddypress-wrap table.notification-settings .no,.buddypress-wrap table.notification-settings .yes{text-align:center;width:40px;vertical-align:middle}.buddypress-wrap table#message-threads{clear:both}.buddypress-wrap table#message-threads .thread-info{min-width:40%}.buddypress-wrap table#message-threads .thread-info p{margin:0}.buddypress-wrap table#message-threads .thread-info p.thread-excerpt{color:#737373;font-size:12px;margin-top:3px}.buddypress-wrap table.profile-fields{margin-bottom:20px}.buddypress-wrap table.profile-fields:last-child{margin-bottom:0}.buddypress-wrap table.profile-fields p{margin:0}.buddypress-wrap table.profile-fields p:last-child{margin-top:0}.bp-screen-reader-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.center-vert{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center}.bp-hide{display:none}.bp-show{height:auto;right:0;overflow:visible;position:static;top:0}.buddypress .buddypress-wrap .activity-read-more a,.buddypress .buddypress-wrap .comment-reply-link,.buddypress .buddypress-wrap .generic-button a,.buddypress .buddypress-wrap a.bp-title-button,.buddypress .buddypress-wrap a.button,.buddypress .buddypress-wrap button,.buddypress .buddypress-wrap input[type=button],.buddypress .buddypress-wrap input[type=reset],.buddypress .buddypress-wrap input[type=submit],.buddypress .buddypress-wrap ul.button-nav:not(.button-tabs) li a{background:#fff;border-color:#ccc;border-style:solid;border-width:1px;color:#555;cursor:pointer;font-size:inherit;font-weight:400;outline:0;padding:.3em .5em;text-align:center;text-decoration:none;width:auto}.buddypress .buddypress-wrap .button-small[type=button]{padding:0 8px 1px}.buddypress .buddypress-wrap .activity-read-more a:focus,.buddypress .buddypress-wrap .activity-read-more a:hover,.buddypress .buddypress-wrap .button-nav li a:focus,.buddypress .buddypress-wrap .button-nav li a:hover,.buddypress .buddypress-wrap .button-nav li.current a,.buddypress .buddypress-wrap .comment-reply-link:focus,.buddypress .buddypress-wrap .comment-reply-link:hover,.buddypress .buddypress-wrap .generic-button a:focus,.buddypress .buddypress-wrap .generic-button a:hover,.buddypress .buddypress-wrap a.button:focus,.buddypress .buddypress-wrap a.button:hover,.buddypress .buddypress-wrap button:focus,.buddypress .buddypress-wrap button:hover,.buddypress .buddypress-wrap input[type=button]:focus,.buddypress .buddypress-wrap input[type=button]:hover,.buddypress .buddypress-wrap input[type=reset]:focus,.buddypress .buddypress-wrap input[type=reset]:hover,.buddypress .buddypress-wrap input[type=submit]:focus,.buddypress .buddypress-wrap input[type=submit]:hover{background:#ededed;border-color:#999;color:#333;outline:0;text-decoration:none}.buddypress .buddypress-wrap a.disabled,.buddypress .buddypress-wrap button.disabled,.buddypress .buddypress-wrap button.pending,.buddypress .buddypress-wrap div.pending a,.buddypress .buddypress-wrap input[type=button].disabled,.buddypress .buddypress-wrap input[type=button].pending,.buddypress .buddypress-wrap input[type=reset].disabled,.buddypress .buddypress-wrap input[type=reset].pending,.buddypress .buddypress-wrap input[type=submit].pending,.buddypress .buddypress-wrap input[type=submit][disabled=disabled]{border-color:#eee;color:#767676;cursor:default}.buddypress .buddypress-wrap a.disabled:hover,.buddypress .buddypress-wrap button.disabled:hover,.buddypress .buddypress-wrap button.pending:hover,.buddypress .buddypress-wrap div.pending a:hover,.buddypress .buddypress-wrap input[type=button]:hover.disabled,.buddypress .buddypress-wrap input[type=button]:hover.pending,.buddypress .buddypress-wrap input[type=reset]:hover.disabled,.buddypress .buddypress-wrap input[type=reset]:hover.pending,.buddypress .buddypress-wrap input[type=submit]:hover.disabled,.buddypress .buddypress-wrap input[type=submit]:hover.pending{border-color:#eee;color:#767676}.buddypress .buddypress-wrap button.text-button,.buddypress .buddypress-wrap input.text-button{background:0 0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#767676}.buddypress .buddypress-wrap button.text-button.small,.buddypress .buddypress-wrap input.text-button.small{font-size:13px}.buddypress .buddypress-wrap button.text-button:focus,.buddypress .buddypress-wrap button.text-button:hover,.buddypress .buddypress-wrap input.text-button:focus,.buddypress .buddypress-wrap input.text-button:hover{background:0 0;text-decoration:underline}.buddypress .buddypress-wrap .activity-list a.button{border:none}.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.invite-button:hover{color:#1fb3dd}.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.group-remove-invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li.selected a.group-remove-invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li.selected a.invite-button:hover{color:#a00}.buddypress .buddypress-wrap #item-buttons:empty{display:none}.buddypress .buddypress-wrap input:disabled:focus,.buddypress .buddypress-wrap input:disabled:hover{background:0 0}.buddypress .buddypress-wrap .text-links-list a.button{background:0 0;border:none;border-left:1px solid #eee;color:#737373;display:inline-block;padding:.3em 1em}.buddypress .buddypress-wrap .text-links-list a.button:visited{color:#d6d6d6}.buddypress .buddypress-wrap .text-links-list a.button:focus,.buddypress .buddypress-wrap .text-links-list a.button:hover{color:#5087e5}.buddypress .buddypress-wrap .text-links-list a:first-child{padding-right:0}.buddypress .buddypress-wrap .text-links-list a:last-child{border-left:none}.buddypress .buddypress-wrap .bp-list.grid .action a,.buddypress .buddypress-wrap .bp-list.grid .action button{border:1px solid #ccc;display:block;margin:0}.buddypress .buddypress-wrap .bp-list.grid .action a:focus,.buddypress .buddypress-wrap .bp-list.grid .action a:hover,.buddypress .buddypress-wrap .bp-list.grid .action button:focus,.buddypress .buddypress-wrap .bp-list.grid .action button:hover{background:#ededed}.buddypress #buddypress .create-button{background:0 0;text-align:center}@media screen and (min-width:46.8em){.buddypress #buddypress .create-button{float:left}}.buddypress #buddypress .create-button a{border:1px solid #ccc;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;background-clip:padding-box;-webkit-box-shadow:inset 0 0 6px 0 #eaeaea;-moz-box-shadow:inset 0 0 6px 0 #eaeaea;box-shadow:inset 0 0 6px 0 #eaeaea;margin:.2em 0;width:auto}.buddypress #buddypress .create-button a:focus,.buddypress #buddypress .create-button a:hover{background:0 0;border-color:#ccc;-webkit-box-shadow:inset 0 0 12px 0 #eaeaea;-moz-box-shadow:inset 0 0 12px 0 #eaeaea;box-shadow:inset 0 0 12px 0 #eaeaea}@media screen and (min-width:46.8em){.buddypress #buddypress.bp-dir-vert-nav .create-button{float:none;padding-top:2em}.buddypress #buddypress.bp-dir-vert-nav .create-button a{margin-left:.5em}}.buddypress #buddypress.bp-dir-hori-nav .create-button{float:right}.buddypress #buddypress.bp-dir-hori-nav .create-button a,.buddypress #buddypress.bp-dir-hori-nav .create-button a:hover{background:0 0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;margin:0}.buddypress-wrap button.ac-reply-cancel,.buddypress-wrap button.bp-icons{background:0 0;border:0}.buddypress-wrap button.bp-icons:focus,.buddypress-wrap button.bp-icons:hover{background:0 0}.buddypress-wrap button.ac-reply-cancel:focus,.buddypress-wrap button.ac-reply-cancel:hover{background:0 0;text-decoration:underline}.buddypress-wrap .bp-invites-content li .invite-button span.icons:before,.buddypress-wrap .bp-invites-filters .invite-button span.icons:before,.buddypress-wrap .bp-messages-filters li a.messages-button:before,.buddypress-wrap .feed a:before,.buddypress-wrap .filter label:before{font-family:dashicons;font-size:18px}.buddypress-wrap .bp-invites-content .item-list li .invite-button span.icons:before{font-size:27px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-invites-content .item-list li .invite-button span.icons:before{font-size:32px}}.buddypress-wrap .bp-list a.button.invite-button:focus,.buddypress-wrap .bp-list a.button.invite-button:hover{background:0 0}.buddypress-wrap .filter label:before{content:"\f536"}.buddypress-wrap div.feed a:before,.buddypress-wrap li.feed a:before{content:"\f303"}.buddypress-wrap ul.item-list li .invite-button:not(.group-remove-invite-button) span.icons:before{content:"\f502"}.buddypress-wrap ul.item-list li .group-remove-invite-button span.icons:before,.buddypress-wrap ul.item-list li.selected .invite-button span.icons:before{content:"\f153"}.buddypress-wrap .bp-invites-filters ul li #bp-invites-next-page:before,.buddypress-wrap .bp-messages-filters ul li #bp-messages-next-page:before{content:"\f345"}.buddypress-wrap .bp-invites-filters ul li #bp-invites-prev-page:before,.buddypress-wrap .bp-messages-filters ul li #bp-messages-prev-page:before{content:"\f341"}.buddypress-wrap .warn{color:#b71717}.buddypress-wrap .bp-messages{border:1px solid #ccc;margin:0 0 15px}.buddypress-wrap .bp-messages .sitewide-notices{display:block;margin:5px;padding:.5em}.buddypress-wrap .bp-messages.info{margin-bottom:0}.buddypress-wrap .bp-messages.updated{clear:both;display:block}.buddypress-wrap .bp-messages.bp-user-messages-feedback{border:0}.buddypress-wrap #group-create-body .bp-cover-image-status p.warning{background:#0b80a4;border:0;-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.2);-moz-box-shadow:0 0 3px 0 rgba(0,0,0,.2);box-shadow:0 0 3px 0 rgba(0,0,0,.2);color:#fff}.buddypress-wrap .bp-feedback:not(.custom-homepage-info){display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-align:stretch;-webkit-align-items:stretch;-webkit-box-align:stretch;align-items:stretch}.buddypress-wrap .bp-feedback{background:#fff;color:#807f7f;-webkit-box-shadow:0 1px 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px 1px rgba(0,0,0,.1);color:#737373;margin:10px 0;position:relative}.buddypress-wrap .bp-feedback p{margin:0}.buddypress-wrap .bp-feedback span.bp-icon{color:#fff;display:block;font-family:dashicons;right:0;margin-left:10px;position:relative;padding:0 .5em}.buddypress-wrap .bp-feedback .bp-help-text{font-style:italic}.buddypress-wrap .bp-feedback .text{font-size:14px;margin:0;padding:.5em 0}.buddypress-wrap .bp-feedback.no-icon{padding:.5em}.buddypress-wrap .bp-feedback.small:before{line-height:inherit}.buddypress-wrap a[data-bp-close] span:before,.buddypress-wrap button[data-bp-close] span:before{font-size:32px}.buddypress-wrap a[data-bp-close],.buddypress-wrap button[data-bp-close]{border:0;position:absolute;top:10px;left:10px;width:32px}.buddypress-wrap .bp-feedback.no-icon a[data-bp-close],.buddypress-wrap .bp-feedback.no-icon button[data-bp-close]{top:-6px;left:6px}.buddypress-wrap button[data-bp-close]:hover{background-color:transparent}.buddypress-wrap .bp-feedback p{margin:0}.buddypress-wrap .bp-feedback .bp-icon{font-size:20px;padding:0 2px}.buddypress-wrap .bp-feedback.error .bp-icon,.buddypress-wrap .bp-feedback.help .bp-icon,.buddypress-wrap .bp-feedback.info .bp-icon,.buddypress-wrap .bp-feedback.loading .bp-icon,.buddypress-wrap .bp-feedback.success .bp-icon,.buddypress-wrap .bp-feedback.warning .bp-icon{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center}.buddypress-wrap .bp-feedback.help .bp-icon,.buddypress-wrap .bp-feedback.info .bp-icon{background-color:#0b80a4}.buddypress-wrap .bp-feedback.help .bp-icon:before,.buddypress-wrap .bp-feedback.info .bp-icon:before{content:"\f348"}.buddypress-wrap .bp-feedback.error .bp-icon,.buddypress-wrap .bp-feedback.warning .bp-icon{background-color:#d33}.buddypress-wrap .bp-feedback.error .bp-icon:before,.buddypress-wrap .bp-feedback.warning .bp-icon:before{content:"\f534"}.buddypress-wrap .bp-feedback.loading .bp-icon{background-color:#ffd087}.buddypress-wrap .bp-feedback.loading .bp-icon:before{content:"\f469"}.buddypress-wrap .bp-feedback.success .bp-icon{background-color:#8a2}.buddypress-wrap .bp-feedback.success .bp-icon:before{content:"\f147"}.buddypress-wrap .bp-feedback.help .bp-icon:before{content:"\f468"}.buddypress-wrap #pass-strength-result{background-color:#eee;border-color:#ddd;border-style:solid;border-width:1px;display:none;font-weight:700;margin:10px 0 10px 0;padding:.5em;text-align:center;width:auto}.buddypress-wrap #pass-strength-result.show{display:block}.buddypress-wrap #pass-strength-result.mismatch{background-color:#333;border-color:transparent;color:#fff}.buddypress-wrap #pass-strength-result.bad,.buddypress-wrap #pass-strength-result.error{background-color:#ffb78c;border-color:#ff853c;color:#fff}.buddypress-wrap #pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040;color:#fff}.buddypress-wrap #pass-strength-result.strong{background-color:#66d66e;border-color:#438c48;color:#fff}.buddypress-wrap .standard-form#signup_form div div.error{background:#faa;color:#a00;margin:0 0 10px 0;padding:.5em;width:90%}.buddypress-wrap .accept,.buddypress-wrap .reject{float:right;margin-right:10px}.buddypress-wrap .members-list.grid .bp-ajax-message{background:rgba(255,255,255,.9);border:1px solid #eee;font-size:14px;right:2%;position:absolute;padding:.5em 1em;left:2%;top:30px}.buddypress.widget .item-options{font-size:14px}.buddypress.widget ul.item-list{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:column nowrap;-moz-flex-flow:column nowrap;-ms-flex-flow:column nowrap;-o-flex-flow:column nowrap;flex-flow:column nowrap;list-style:none;margin:10px -2%;overflow:hidden}@media screen and (min-width:32em){.buddypress.widget ul.item-list{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row wrap;-moz-flex-flow:row wrap;-ms-flex-flow:row wrap;-o-flex-flow:row wrap;flex-flow:row wrap}}.buddypress.widget ul.item-list li{border:1px solid #eee;-ms-flex-align:stretch;-webkit-align-items:stretch;-webkit-box-align:stretch;align-items:stretch;-webkit-flex:1 1 46%;-moz-flex:1 1 46%;-ms-flex:1 1 46%;-o-flex:1 1 46%;flex:1 1 46%;margin:2%}@media screen and (min-width:75em){.buddypress.widget ul.item-list li{-webkit-flex:0 1 20%;-moz-flex:0 1 20%;-ms-flex:0 1 20%;-o-flex:0 1 20%;flex:0 1 20%}}.buddypress.widget ul.item-list li .item-avatar{padding:.5em;text-align:center}.buddypress.widget ul.item-list li .item-avatar .avatar{width:60%}.buddypress.widget ul.item-list li .item{padding:0 .5em .5em}.buddypress.widget ul.item-list li .item .item-meta{font-size:12px;overflow-wrap:break-word}.widget-area .buddypress.widget ul.item-list li{-webkit-flex:0 1 46%;-moz-flex:0 1 46%;-ms-flex:0 1 46%;-o-flex:0 1 46%;flex:0 1 46%;margin:2% 2% 10px}@media screen and (min-width:75em){.widget-area .buddypress.widget ul.item-list li .avatar{width:100%}}@media screen and (min-width:75em){.widget-area .buddypress.widget ul.item-list{margin:10px -2%;width:100%}.widget-area .buddypress.widget ul.item-list li{-webkit-flex:0 1 auto;-moz-flex:0 1 auto;-ms-flex:0 1 auto;-o-flex:0 1 auto;flex:0 1 auto;margin:10px 2% 1%;width:46%}}#buddypress-wrap *{transition:opacity .1s ease-in-out .1s}#buddypress-wrap a.button,#buddypress-wrap a.generic-button,#buddypress-wrap button,#buddypress-wrap input[type=reset],#buddypress-wrap input[type=submit]{transition:background .1s ease-in-out .1s,color .1s ease-in-out .1s,border-color .1s ease-in-out .1s}.buddypress-wrap a.loading,.buddypress-wrap input.loading{-moz-animation:loader-pulsate .5s infinite ease-in-out alternate;-webkit-animation:loader-pulsate .5s infinite ease-in-out alternate;animation:loader-pulsate .5s infinite ease-in-out alternate;border-color:#aaa}@-webkit-keyframes loader-pulsate{from{border-color:#aaa;-webkit-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-webkit-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}@-moz-keyframes loader-pulsate{from{border-color:#aaa;-moz-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-moz-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}@keyframes loader-pulsate{from{border-color:#aaa;-moz-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-moz-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}.buddypress-wrap a.loading:hover,.buddypress-wrap input.loading:hover{color:#777}[data-bp-tooltip]{position:relative}[data-bp-tooltip]:after{background-color:#fff;display:none;opacity:0;position:absolute;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden}[data-bp-tooltip]:after{border:1px solid #737373;border-radius:1px;box-shadow:-4px 4px 8px rgba(0,0,0,.2);color:#333;content:attr(data-bp-tooltip);font-family:"Helvetica Neue",helvetica,arial,san-serif;font-size:12px;font-weight:400;letter-spacing:normal;line-height:1.25;max-width:200px;padding:5px 8px;pointer-events:none;text-shadow:none;text-transform:none;-webkit-transition:all 1.5s ease;-ms-transition:all 1.5s ease;transition:all 1.5s ease;white-space:nowrap;word-wrap:break-word;z-index:100000}[data-bp-tooltip]:active:after,[data-bp-tooltip]:focus:after,[data-bp-tooltip]:hover:after{display:block;opacity:1;overflow:visible;visibility:visible}[data-bp-tooltip=""]{display:none;opacity:0;visibility:hidden}.bp-tooltip:after{right:50%;margin-top:7px;top:110%;-webkit-transform:translate(50%,0);-ms-transform:translate(50%,0);transform:translate(50%,0)}.user-list .bp-tooltip:after{right:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}@media screen and (min-width:46.8em){.user-list .bp-tooltip:after{right:auto;left:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}}.activity-meta-action .bp-tooltip:after,.notification-actions .bp-tooltip:after,.participants-list .bp-tooltip:after{right:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.bp-invites-content .bp-tooltip:after{right:auto;left:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}#item-body,.single-screen-navs{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.grid>li,.grid>li .generic-button a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.grid>li{border-bottom:0;padding-bottom:10px;padding-top:0}.grid>li .list-wrap{background:#fafafa;border:1px solid #eee;padding-bottom:15px;position:relative;overflow:hidden;padding-top:14px}.grid>li .list-wrap .list-title{padding:.5em}.grid>li .list-wrap .update{color:#737373;padding:.5em 2em}.grid>li .item-avatar{text-align:center}.grid>li .item-avatar .avatar{border-radius:50%;display:inline-block;width:50%}@media screen and (min-width:24em){.grid.members-list .list-wrap{min-height:340px}.grid.members-list .list-wrap .item-block{margin:0 auto;min-height:7rem}.grid.members-group-list .list-wrap .item-block{margin:0 auto;min-height:7rem}.grid.groups-list .list-wrap{min-height:470px}.grid.groups-list .list-wrap .item-block{min-height:6rem}.grid.groups-list .list-wrap .group-desc{margin:15px auto 0;min-height:5em;overflow:hidden}.grid.groups-list .list-wrap .group-details,.grid.groups-list .list-wrap .item-desc,.grid.groups-list .list-wrap .last-activity{margin-bottom:0}.grid.groups-list .list-wrap .group-details p,.grid.groups-list .list-wrap .item-desc p,.grid.groups-list .list-wrap .last-activity p{margin-bottom:0}.grid.blogs-list .list-wrap{min-height:350px}.grid.blogs-list .list-wrap .item-block{margin:0 auto;min-height:7rem}}@media screen and (min-width:24em){.grid>li.item-entry{float:right;margin:0}.grid.two>li{padding-bottom:20px}}@media screen and (min-width:24em) and (min-width:75em){.grid.two>li .list-wrap{max-width:500px;margin:0 auto}}@media screen and (min-width:24em){.grid.three>li,.grid.two>li{width:50%}.grid.three>li:nth-child(odd),.grid.two>li:nth-child(odd){padding-left:10px}.grid.three>li:nth-child(even),.grid.two>li:nth-child(even){padding-right:10px}.grid.three>li .item,.grid.two>li .item{margin:1rem auto 0;width:80%}.grid.three>li .item .item-title,.grid.two>li .item .item-title{width:auto}}@media screen and (min-width:46.8em){.grid.three>li{padding-top:0;width:33.333333%;width:calc(100% / 3)}.grid.three>li:nth-child(1n+1){padding-right:5px;padding-left:5px}.grid.three>li:nth-child(3n+3){padding-right:5px;padding-left:0}.grid.three>li:nth-child(3n+1){padding-right:0;padding-left:5px}}@media screen and (min-width:46.8em){.grid.four>li{width:25%}.grid.four>li:nth-child(1n+1){padding-right:5px;padding-left:5px}.grid.four>li:nth-child(4n+4){padding-right:5px;padding-left:0}.grid.four>li:nth-child(4n+1){padding-right:0;padding-left:5px}}.buddypress-wrap .grid.bp-list{padding-top:1em}.buddypress-wrap .grid.bp-list>li{border-bottom:none}.buddypress-wrap .grid.bp-list>li .list-wrap{padding-bottom:3em}.buddypress-wrap .grid.bp-list>li .item-avatar{margin:0;text-align:center;width:auto}.buddypress-wrap .grid.bp-list>li .item-avatar img.avatar{display:inline-block;height:auto;width:50%}.buddypress-wrap .grid.bp-list>li .item-meta,.buddypress-wrap .grid.bp-list>li .list-title{float:none;text-align:center}.buddypress-wrap .grid.bp-list>li .list-title{font-size:inherit;line-height:1.1}.buddypress-wrap .grid.bp-list>li .item{font-size:18px;right:0;margin:0 auto;text-align:center;width:96%}@media screen and (min-width:46.8em){.buddypress-wrap .grid.bp-list>li .item{font-size:22px}}.buddypress-wrap .grid.bp-list>li .item .group-desc,.buddypress-wrap .grid.bp-list>li .item .item-block{float:none;width:96%}.buddypress-wrap .grid.bp-list>li .item .item-block{margin-bottom:10px}.buddypress-wrap .grid.bp-list>li .item .last-activity{margin-top:5px}.buddypress-wrap .grid.bp-list>li .item .group-desc{clear:none}.buddypress-wrap .grid.bp-list>li .item .user-update{clear:both;text-align:right}.buddypress-wrap .grid.bp-list>li .item .activity-read-more a{display:inline}.buddypress-wrap .grid.bp-list>li .action{bottom:5px;float:none;height:auto;right:0;margin:0;padding:0 5px;position:absolute;text-align:center;top:auto;width:100%}.buddypress-wrap .grid.bp-list>li .action .generic-button{float:none;margin:5px 0 0;text-align:center;width:100%}.buddypress-wrap .grid.bp-list>li .action .generic-button a,.buddypress-wrap .grid.bp-list>li .action .generic-button button{width:100%}.buddypress-wrap .grid.bp-list>li .avatar,.buddypress-wrap .grid.bp-list>li .item,.buddypress-wrap .grid.bp-list>li .item-avatar{float:none}.buddypress-wrap .blogs-list.grid.two>li .blogs-title{min-height:5em}.buddypress-wrap .grid.four>li .group-desc,.buddypress-wrap .grid.three>li .group-desc{min-height:8em}.buddypress-wrap .blogs-list.grid.four>li,.buddypress-wrap .blogs-list.grid.three>li{min-height:350px}.buddypress-wrap .blogs-list.grid.four>li .last-activity,.buddypress-wrap .blogs-list.grid.three>li .last-activity{margin-bottom:0}.buddypress-wrap .blogs-list.grid.four>li .last-post,.buddypress-wrap .blogs-list.grid.three>li .last-post{margin-top:0}.buddypress:not(.logged-in) .grid.bp-list .list-wrap{padding-bottom:5px}.buddypress:not(.logged-in) .grid.groups-list .list-wrap{min-height:430px}.buddypress:not(.logged-in) .grid.members-list .list-wrap{min-height:300px}.buddypress:not(.logged-in) .grid.blogs-list .list-wrap{min-height:320px}@media screen and (min-width:46.8em){.bp-single-vert-nav .vertical{overflow:visible}.bp-single-vert-nav .vertical ul{border-left:1px solid #d6d6d6;float:right;margin-left:-1px;width:25%}.bp-single-vert-nav .vertical li{float:none}.bp-single-vert-nav .vertical li.selected a{background:#ccc;color:#333}.bp-single-vert-nav .vertical li:focus,.bp-single-vert-nav .vertical li:hover{background:#ccc}.bp-single-vert-nav .vertical li span{background:#d6d6d6;border-radius:10%;float:left;margin-left:2px}.bp-single-vert-nav .vertical li:hover span{border-color:#eaeaea}.bp-single-vert-nav .bp-wrap{margin-bottom:15px}.bp-single-vert-nav .bp-wrap .group-nav-tabs.groups-nav ul li,.bp-single-vert-nav .bp-wrap .user-nav-tabs.users-nav ul li{right:1px;position:relative}.bp-single-vert-nav .item-body:not(#group-create-body){background:#fff;border-right:1px solid #d6d6d6;float:left;margin:0;min-height:400px;padding:0 1em 0 0;width:calc(75% + 1px)}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links){background:#eaeaea;margin:0 -5px 0 0;width:auto}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li{font-size:16px;margin:10px 0}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a{border-left:1px solid #ccc;padding:0 .5em}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a:focus,.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a:hover{background:0 0}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li.current a{background:0 0;color:#333;text-decoration:underline}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li:last-child a{border:none}.bp-dir-vert-nav .dir-navs{float:right;right:1px;position:relative;width:20%}.bp-dir-vert-nav .dir-navs ul li{float:none;overflow:hidden;width:auto}.bp-dir-vert-nav .dir-navs ul li.selected{border:1px solid #eee}.bp-dir-vert-nav .dir-navs ul li.selected a{background:#555;color:#fff}.bp-dir-vert-nav .dir-navs ul li.selected a span{background:#eaeaea;border-color:#ccc;color:#5087e5}.bp-dir-vert-nav .dir-navs ul li a:focus,.bp-dir-vert-nav .dir-navs ul li a:hover{background:#ccc;color:#333}.bp-dir-vert-nav .dir-navs ul li a:focus span,.bp-dir-vert-nav .dir-navs ul li a:hover span{border:1px solid #555}.bp-dir-vert-nav .screen-content{border-right:1px solid #d6d6d6;margin-right:20%;overflow:hidden;padding:0 1em 2em 0}.bp-dir-vert-nav .screen-content .subnav-filters{margin-top:0}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li:not(.selected) a:hover{background:0 0}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected{background:0 0;border:1px solid #d6d6d6;border-left-color:#fff}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected a{background:0 0;color:#333;font-weight:600}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected a span{background:#555;border:1px solid #d6d6d6;color:#fff}}
|
bp-templates/bp-nouveau/css/buddypress.css
CHANGED
@@ -302,7 +302,7 @@ body.buddypress article.page > .entry-header .entry-title {
|
|
302 |
text-decoration: none;
|
303 |
}
|
304 |
|
305 |
-
.bp-navs ul li
|
306 |
background: #eaeaea;
|
307 |
border: 1px solid #ccc;
|
308 |
border-radius: 50%;
|
@@ -330,9 +330,9 @@ body.buddypress article.page > .entry-header .entry-title {
|
|
330 |
margin-bottom: 20px;
|
331 |
}
|
332 |
|
333 |
-
.buddypress-wrap .bp-navs li.selected a
|
334 |
-
.buddypress-wrap .bp-navs li.current a
|
335 |
-
.buddypress-wrap .bp-navs li a:hover a
|
336 |
background-color: #ccc;
|
337 |
}
|
338 |
|
@@ -354,12 +354,12 @@ body.buddypress article.page > .entry-header .entry-title {
|
|
354 |
color: #fafafa;
|
355 |
}
|
356 |
|
357 |
-
.buddypress-wrap .bp-navs li.selected a
|
358 |
-
.buddypress-wrap .bp-navs li.selected a:focus
|
359 |
-
.buddypress-wrap .bp-navs li.selected a:hover
|
360 |
-
.buddypress-wrap .bp-navs li.current a
|
361 |
-
.buddypress-wrap .bp-navs li.current a:focus
|
362 |
-
.buddypress-wrap .bp-navs li.current a:hover
|
363 |
border-color: #fafafa;
|
364 |
}
|
365 |
|
@@ -376,7 +376,7 @@ body.buddypress article.page > .entry-header .entry-title {
|
|
376 |
color: #fafafa;
|
377 |
text-decoration: none;
|
378 |
}
|
379 |
-
.buddypress-wrap.bp-dir-hori-nav nav {
|
380 |
border-bottom: 1px solid #eee;
|
381 |
border-top: 1px solid #eee;
|
382 |
-webkit-box-shadow: 0 2px 12px 0 #fafafa;
|
@@ -461,36 +461,41 @@ body.buddypress article.page > .entry-header .entry-title {
|
|
461 |
}
|
462 |
}
|
463 |
|
464 |
-
.buddypress_object_nav .bp-navs li.selected a
|
465 |
-
.buddypress_object_nav .bp-navs li.current a
|
466 |
-
.buddypress-wrap .bp-navs li.selected a
|
467 |
-
.buddypress-wrap .bp-navs li.current a
|
468 |
background-color: #fff;
|
469 |
}
|
470 |
|
471 |
-
.buddypress_object_nav .bp-navs li.dynamic a
|
472 |
-
.buddypress_object_nav .bp-navs li.dynamic.selected a
|
473 |
-
.buddypress_object_nav .bp-navs li.dynamic.current a
|
474 |
-
.buddypress-wrap .bp-navs li.dynamic a
|
475 |
-
.buddypress-wrap .bp-navs li.dynamic.selected a
|
476 |
-
.buddypress-wrap .bp-navs li.dynamic.current a
|
477 |
background-color: #5087e5;
|
478 |
border: 0;
|
479 |
color: #fafafa;
|
480 |
}
|
481 |
|
482 |
-
.buddypress_object_nav .bp-navs li.dynamic a:hover
|
483 |
-
.buddypress-wrap .bp-navs li.dynamic a:hover
|
484 |
background-color: #5087e5;
|
485 |
border: 0;
|
486 |
color: #fff;
|
487 |
}
|
488 |
|
489 |
-
.buddypress_object_nav .bp-navs li a
|
490 |
-
.buddypress-wrap .bp-navs li a
|
491 |
display: none;
|
492 |
}
|
493 |
|
|
|
|
|
|
|
|
|
|
|
494 |
.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a,
|
495 |
.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a {
|
496 |
color: #767676;
|
@@ -532,7 +537,7 @@ body.buddypress article.page > .entry-header .entry-title {
|
|
532 |
}
|
533 |
}
|
534 |
|
535 |
-
.buddypress_object_nav .bp-navs li a
|
536 |
display: inline-block;
|
537 |
float: right;
|
538 |
}
|
@@ -541,45 +546,61 @@ body.buddypress article.page > .entry-header .entry-title {
|
|
541 |
.bp-dir-vert-nav .bp-navs.dir-navs {
|
542 |
background: none;
|
543 |
}
|
544 |
-
.bp-dir-vert-nav .bp-navs.dir-navs a
|
545 |
float: right;
|
546 |
}
|
547 |
}
|
548 |
|
549 |
@media screen and (min-width: 46.8em) {
|
550 |
-
.buddypress-wrap .item-body .tabbed-links ul
|
|
|
551 |
border-bottom: 1px solid #ccc;
|
552 |
float: none;
|
553 |
margin: 20px 0 10px;
|
554 |
}
|
555 |
-
.buddypress-wrap .item-body .tabbed-links ul:before, .buddypress-wrap .item-body .tabbed-links ul:after
|
|
|
|
|
556 |
content: " ";
|
557 |
display: block;
|
558 |
}
|
559 |
-
.buddypress-wrap .item-body .tabbed-links ul:after
|
|
|
560 |
clear: both;
|
561 |
}
|
562 |
-
.buddypress-wrap .item-body .tabbed-links ul li
|
|
|
563 |
float: left;
|
564 |
list-style: none;
|
565 |
margin: 0 10px 0 0;
|
566 |
}
|
567 |
-
.buddypress-wrap .item-body .tabbed-links ul li a
|
|
|
|
|
|
|
568 |
background: none;
|
569 |
border: none;
|
570 |
display: block;
|
571 |
padding: 4px 10px;
|
572 |
}
|
573 |
-
.buddypress-wrap .item-body .tabbed-links ul li
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
574 |
border-color: #ccc #ccc #fff;
|
575 |
border-style: solid;
|
576 |
border-top-left-radius: 4px;
|
577 |
border-top-right-radius: 4px;
|
578 |
border-width: 1px;
|
579 |
margin-bottom: -1px;
|
580 |
-
padding: 0 0.5em;
|
581 |
}
|
582 |
-
.buddypress-wrap .item-body .tabbed-links ul li.current a
|
|
|
583 |
color: #333;
|
584 |
}
|
585 |
.buddypress-wrap .item-body .bp-subnavs.tabbed-links > ul {
|
@@ -3980,7 +4001,7 @@ body.no-js .buddypress #messages-bulk-management #select-all-messages {
|
|
3980 |
background: none;
|
3981 |
border: none;
|
3982 |
border-right: 1px solid #eee;
|
3983 |
-
color: #
|
3984 |
display: inline-block;
|
3985 |
padding: 0.3em 1em;
|
3986 |
}
|
302 |
text-decoration: none;
|
303 |
}
|
304 |
|
305 |
+
.bp-navs ul li .count {
|
306 |
background: #eaeaea;
|
307 |
border: 1px solid #ccc;
|
308 |
border-radius: 50%;
|
330 |
margin-bottom: 20px;
|
331 |
}
|
332 |
|
333 |
+
.buddypress-wrap .bp-navs li.selected a .count,
|
334 |
+
.buddypress-wrap .bp-navs li.current a .count,
|
335 |
+
.buddypress-wrap .bp-navs li a:hover a .count {
|
336 |
background-color: #ccc;
|
337 |
}
|
338 |
|
354 |
color: #fafafa;
|
355 |
}
|
356 |
|
357 |
+
.buddypress-wrap .bp-navs li.selected a .count,
|
358 |
+
.buddypress-wrap .bp-navs li.selected a:focus .count,
|
359 |
+
.buddypress-wrap .bp-navs li.selected a:hover .count,
|
360 |
+
.buddypress-wrap .bp-navs li.current a .count,
|
361 |
+
.buddypress-wrap .bp-navs li.current a:focus .count,
|
362 |
+
.buddypress-wrap .bp-navs li.current a:hover .count {
|
363 |
border-color: #fafafa;
|
364 |
}
|
365 |
|
376 |
color: #fafafa;
|
377 |
text-decoration: none;
|
378 |
}
|
379 |
+
.buddypress-wrap.bp-dir-hori-nav nav:not(".tabbed-links") {
|
380 |
border-bottom: 1px solid #eee;
|
381 |
border-top: 1px solid #eee;
|
382 |
-webkit-box-shadow: 0 2px 12px 0 #fafafa;
|
461 |
}
|
462 |
}
|
463 |
|
464 |
+
.buddypress_object_nav .bp-navs li.selected a .count,
|
465 |
+
.buddypress_object_nav .bp-navs li.current a .count,
|
466 |
+
.buddypress-wrap .bp-navs li.selected a .count,
|
467 |
+
.buddypress-wrap .bp-navs li.current a .count {
|
468 |
background-color: #fff;
|
469 |
}
|
470 |
|
471 |
+
.buddypress_object_nav .bp-navs li.dynamic a .count,
|
472 |
+
.buddypress_object_nav .bp-navs li.dynamic.selected a .count,
|
473 |
+
.buddypress_object_nav .bp-navs li.dynamic.current a .count,
|
474 |
+
.buddypress-wrap .bp-navs li.dynamic a .count,
|
475 |
+
.buddypress-wrap .bp-navs li.dynamic.selected a .count,
|
476 |
+
.buddypress-wrap .bp-navs li.dynamic.current a .count {
|
477 |
background-color: #5087e5;
|
478 |
border: 0;
|
479 |
color: #fafafa;
|
480 |
}
|
481 |
|
482 |
+
.buddypress_object_nav .bp-navs li.dynamic a:hover .count,
|
483 |
+
.buddypress-wrap .bp-navs li.dynamic a:hover .count {
|
484 |
background-color: #5087e5;
|
485 |
border: 0;
|
486 |
color: #fff;
|
487 |
}
|
488 |
|
489 |
+
.buddypress_object_nav .bp-navs li a .count:empty,
|
490 |
+
.buddypress-wrap .bp-navs li a .count:empty {
|
491 |
display: none;
|
492 |
}
|
493 |
|
494 |
+
.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current),
|
495 |
+
.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) {
|
496 |
+
color: #767676;
|
497 |
+
}
|
498 |
+
|
499 |
.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a,
|
500 |
.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a {
|
501 |
color: #767676;
|
537 |
}
|
538 |
}
|
539 |
|
540 |
+
.buddypress_object_nav .bp-navs li a .count {
|
541 |
display: inline-block;
|
542 |
float: right;
|
543 |
}
|
546 |
.bp-dir-vert-nav .bp-navs.dir-navs {
|
547 |
background: none;
|
548 |
}
|
549 |
+
.bp-dir-vert-nav .bp-navs.dir-navs a .count {
|
550 |
float: right;
|
551 |
}
|
552 |
}
|
553 |
|
554 |
@media screen and (min-width: 46.8em) {
|
555 |
+
.buddypress-wrap .item-body .tabbed-links ul,
|
556 |
+
.buddypress-wrap .item-body .tabbed-links ol {
|
557 |
border-bottom: 1px solid #ccc;
|
558 |
float: none;
|
559 |
margin: 20px 0 10px;
|
560 |
}
|
561 |
+
.buddypress-wrap .item-body .tabbed-links ul:before, .buddypress-wrap .item-body .tabbed-links ul:after,
|
562 |
+
.buddypress-wrap .item-body .tabbed-links ol:before,
|
563 |
+
.buddypress-wrap .item-body .tabbed-links ol:after {
|
564 |
content: " ";
|
565 |
display: block;
|
566 |
}
|
567 |
+
.buddypress-wrap .item-body .tabbed-links ul:after,
|
568 |
+
.buddypress-wrap .item-body .tabbed-links ol:after {
|
569 |
clear: both;
|
570 |
}
|
571 |
+
.buddypress-wrap .item-body .tabbed-links ul li,
|
572 |
+
.buddypress-wrap .item-body .tabbed-links ol li {
|
573 |
float: left;
|
574 |
list-style: none;
|
575 |
margin: 0 10px 0 0;
|
576 |
}
|
577 |
+
.buddypress-wrap .item-body .tabbed-links ul li a,
|
578 |
+
.buddypress-wrap .item-body .tabbed-links ul li span,
|
579 |
+
.buddypress-wrap .item-body .tabbed-links ol li a,
|
580 |
+
.buddypress-wrap .item-body .tabbed-links ol li span {
|
581 |
background: none;
|
582 |
border: none;
|
583 |
display: block;
|
584 |
padding: 4px 10px;
|
585 |
}
|
586 |
+
.buddypress-wrap .item-body .tabbed-links ul li a:focus,
|
587 |
+
.buddypress-wrap .item-body .tabbed-links ul li a:hover,
|
588 |
+
.buddypress-wrap .item-body .tabbed-links ol li a:focus,
|
589 |
+
.buddypress-wrap .item-body .tabbed-links ol li a:hover {
|
590 |
+
background: none;
|
591 |
+
}
|
592 |
+
.buddypress-wrap .item-body .tabbed-links ul li.current,
|
593 |
+
.buddypress-wrap .item-body .tabbed-links ol li.current {
|
594 |
border-color: #ccc #ccc #fff;
|
595 |
border-style: solid;
|
596 |
border-top-left-radius: 4px;
|
597 |
border-top-right-radius: 4px;
|
598 |
border-width: 1px;
|
599 |
margin-bottom: -1px;
|
600 |
+
padding: 0 0.5em 1px;
|
601 |
}
|
602 |
+
.buddypress-wrap .item-body .tabbed-links ul li.current a,
|
603 |
+
.buddypress-wrap .item-body .tabbed-links ol li.current a {
|
604 |
color: #333;
|
605 |
}
|
606 |
.buddypress-wrap .item-body .bp-subnavs.tabbed-links > ul {
|
4001 |
background: none;
|
4002 |
border: none;
|
4003 |
border-right: 1px solid #eee;
|
4004 |
+
color: #737373;
|
4005 |
display: inline-block;
|
4006 |
padding: 0.3em 1em;
|
4007 |
}
|
bp-templates/bp-nouveau/css/buddypress.min.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
body #buddypress * a{box-shadow:none;text-decoration:none}body #buddypress #item-body blockquote,body #buddypress .bp-lists blockquote{margin-left:10px}body #buddypress .bp-list .action{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@media screen and (min-width:46.8em){body.buddypress .entry-content,body.buddypress .entry-header,body.buddypress .site-content .entry-header{max-width:none}body.buddypress .entry-header{float:none;max-width:none}body.buddypress .entry-content{float:none;max-width:none}body.buddypress .site-content{padding-top:2.5em}body.buddypress #page #primary{max-width:none}body.buddypress #page #primary .entry-content,body.buddypress #page #primary .entry-header{float:none;width:auto}}body.buddypress .buddypress-wrap h1,body.buddypress .buddypress-wrap h2,body.buddypress .buddypress-wrap h3,body.buddypress .buddypress-wrap h4,body.buddypress .buddypress-wrap h5,body.buddypress .buddypress-wrap h6{clear:none;margin:1em 0;padding:0}.bp-wrap:after,.bp-wrap:before{content:" ";display:table}.bp-wrap:after{clear:both}.buddypress-wrap.round-avatars .avatar{border-radius:50%}div,dl,input[type=reset],input[type=search],input[type=submit],li,select,textarea{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;border-radius:2px;background-clip:padding-box}body.buddypress article.page>.entry-header{margin-bottom:2em;padding:0}body.buddypress article.page>.entry-header .entry-title{font-size:28px;font-weight:inherit;color:#767676}@media screen and (min-width:46.8em){body.buddypress article.page>.entry-header .entry-title{font-size:34px}}.buddypress-wrap dt.section-title{font-size:18px}@media screen and (min-width:46.8em){.buddypress-wrap dt.section-title{font-size:22px}}.buddypress-wrap .bp-label-text,.buddypress-wrap .message-threads{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-label-text,.buddypress-wrap .message-threads{font-size:16px}}.buddypress-wrap .activity-header{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .activity-header{font-size:16px}}.buddypress-wrap .activity-inner{font-size:15px}@media screen and (min-width:46.8em){.buddypress-wrap .activity-inner{font-size:18px}}.buddypress-wrap #whats-new-post-in{font-size:16px}.buddypress-wrap .acomment-meta,.buddypress-wrap .mini .activity-header{font-size:16px}.buddypress-wrap .dir-component-filters #activity-filter-by{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .dir-component-filters #activity-filter-by{font-size:16px}}.buddypress-wrap .bp-tables-user th{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-tables-user th{font-size:16px}}.buddypress-wrap .bp-tables-user td{font-size:12px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-tables-user td{font-size:14px}}.buddypress-wrap .profile-fields th{font-size:15px}@media screen and (min-width:46.8em){.buddypress-wrap .profile-fields th{font-size:18px}}.buddypress-wrap .profile-fields td{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .profile-fields td{font-size:16px}}.buddypress-wrap #notification-select{font-size:12px}@media screen and (min-width:46.8em){.buddypress-wrap #notification-select{font-size:14px}}.bp-navs{background:0 0;clear:both;overflow:hidden}.bp-navs ul{margin:0;padding:0}.bp-navs ul li{list-style:none;margin:0}.bp-navs ul li.last select{max-width:185px}.bp-navs ul li a,.bp-navs ul li span{border:0;display:block;padding:5px 10px;text-decoration:none}.bp-navs ul li span{background:#eaeaea;border:1px solid #ccc;border-radius:50%;color:#555;display:inline;font-size:12px;margin-left:2px;padding:3px 6px;text-align:center;vertical-align:middle}.bp-navs ul li.current a,.bp-navs ul li.selected a{color:#333;opacity:1}.bp-navs.bp-invites-filters ul li a,.bp-navs.bp-messages-filters ul li a{border:1px solid #ccc;display:inline-block}.main-navs.dir-navs{margin-bottom:20px}.buddypress-wrap .bp-navs li a:hover a span,.buddypress-wrap .bp-navs li.current a span,.buddypress-wrap .bp-navs li.selected a span{background-color:#ccc}.buddypress-wrap .bp-navs li:not(.current) a:focus,.buddypress-wrap .bp-navs li:not(.current) a:hover,.buddypress-wrap .bp-navs li:not(.selected) a:focus,.buddypress-wrap .bp-navs li:not(.selected) a:hover{background:#ccc;color:#333}.buddypress-wrap .bp-navs li.current a,.buddypress-wrap .bp-navs li.current a:focus,.buddypress-wrap .bp-navs li.current a:hover,.buddypress-wrap .bp-navs li.selected a,.buddypress-wrap .bp-navs li.selected a:focus,.buddypress-wrap .bp-navs li.selected a:hover{background:#555;color:#fafafa}.buddypress-wrap .bp-navs li.current a span,.buddypress-wrap .bp-navs li.current a:focus span,.buddypress-wrap .bp-navs li.current a:hover span,.buddypress-wrap .bp-navs li.selected a span,.buddypress-wrap .bp-navs li.selected a:focus span,.buddypress-wrap .bp-navs li.selected a:hover span{border-color:#fafafa}@media screen and (min-width:46.8em){.buddypress-wrap .main-navs:not(.dir-navs) li.current a,.buddypress-wrap .main-navs:not(.dir-navs) li.selected a{background:#fff;color:#333;font-weight:600}.buddypress-wrap .main-navs.vertical li.current a,.buddypress-wrap .main-navs.vertical li.selected a{background:#555;color:#fafafa;text-decoration:none}.buddypress-wrap.bp-dir-hori-nav nav{border-bottom:1px solid #eee;border-top:1px solid #eee;-webkit-box-shadow:0 2px 12px 0 #fafafa;-moz-box-shadow:0 2px 12px 0 #fafafa;box-shadow:0 2px 12px 0 #fafafa}}.buddypress-wrap .bp-subnavs li.current a,.buddypress-wrap .bp-subnavs li.selected a{background:#fff;color:#333;font-weight:600}@media screen and (max-width:46.8em){.buddypress-wrap:not(.bp-single-vert-nav) .bp-navs li{background:#eaeaea}}.buddypress-wrap:not(.bp-single-vert-nav) .main-navs>ul>li>a{padding:.5em calc(.5em + 2px)}.buddypress-wrap:not(.bp-single-vert-nav) .group-subnav#subsubnav,.buddypress-wrap:not(.bp-single-vert-nav) .user-subnav#subsubnav{background:0 0}.buddypress-wrap .bp-subnavs,.buddypress-wrap ul.subnav{width:100%}.buddypress-wrap .bp-subnavs{margin:10px 0;overflow:hidden}.buddypress-wrap .bp-subnavs ul li{margin-top:0}.buddypress-wrap .bp-subnavs ul li.current :focus,.buddypress-wrap .bp-subnavs ul li.current :hover,.buddypress-wrap .bp-subnavs ul li.selected :focus,.buddypress-wrap .bp-subnavs ul li.selected :hover{background:0 0;color:#333}.buddypress-wrap ul.subnav{width:auto}.buddypress-wrap .bp-navs.bp-invites-filters#subsubnav ul li.last,.buddypress-wrap .bp-navs.bp-invites-nav#subnav ul li.last,.buddypress-wrap .bp-navs.bp-messages-filters#subsubnav ul li.last{margin-top:0}@media screen and (max-width:46.8em){.buddypress-wrap .single-screen-navs{border:1px solid #eee}.buddypress-wrap .single-screen-navs li{border-bottom:1px solid #eee}.buddypress-wrap .single-screen-navs li:last-child{border-bottom:none}.buddypress-wrap .bp-subnavs li a{font-size:14px}.buddypress-wrap .bp-subnavs li.current a,.buddypress-wrap .bp-subnavs li.current a:focus,.buddypress-wrap .bp-subnavs li.current a:hover,.buddypress-wrap .bp-subnavs li.selected a,.buddypress-wrap .bp-subnavs li.selected a:focus,.buddypress-wrap .bp-subnavs li.selected a:hover{background:#555;color:#fff}}.buddypress-wrap .bp-navs li.current a span,.buddypress-wrap .bp-navs li.selected a span,.buddypress_object_nav .bp-navs li.current a span,.buddypress_object_nav .bp-navs li.selected a span{background-color:#fff}.buddypress-wrap .bp-navs li.dynamic a span,.buddypress-wrap .bp-navs li.dynamic.current a span,.buddypress-wrap .bp-navs li.dynamic.selected a span,.buddypress_object_nav .bp-navs li.dynamic a span,.buddypress_object_nav .bp-navs li.dynamic.current a span,.buddypress_object_nav .bp-navs li.dynamic.selected a span{background-color:#5087e5;border:0;color:#fafafa}.buddypress-wrap .bp-navs li.dynamic a:hover span,.buddypress_object_nav .bp-navs li.dynamic a:hover span{background-color:#5087e5;border:0;color:#fff}.buddypress-wrap .bp-navs li a span:empty,.buddypress_object_nav .bp-navs li a span:empty{display:none}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a{color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a:focus,.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a:hover,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a:focus,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a:hover{background:0 0;color:#333}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a[disabled]:focus,.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a[disabled]:hover,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a[disabled]:focus,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a[disabled]:hover{color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li.current a,.buddypress_object_nav .bp-navs.group-create-links ul li.current a{text-align:center}@media screen and (min-width:46.8em){.buddypress-wrap .bp-navs li{float:left}.buddypress-wrap .subnav{float:left}.buddypress-wrap ul.subnav{width:auto}.buddypress-wrap #subsubnav .activity-search{float:left}.buddypress-wrap #subsubnav .filter{float:right}}.buddypress_object_nav .bp-navs li a span{display:inline-block;float:right}@media screen and (min-width:46.8em){.bp-dir-vert-nav .bp-navs.dir-navs{background:0 0}.bp-dir-vert-nav .bp-navs.dir-navs a span{float:right}}@media screen and (min-width:46.8em){.buddypress-wrap .item-body .tabbed-links ul{border-bottom:1px solid #ccc;float:none;margin:20px 0 10px}.buddypress-wrap .item-body .tabbed-links ul:after,.buddypress-wrap .item-body .tabbed-links ul:before{content:" ";display:block}.buddypress-wrap .item-body .tabbed-links ul:after{clear:both}.buddypress-wrap .item-body .tabbed-links ul li{float:left;list-style:none;margin:0 10px 0 0}.buddypress-wrap .item-body .tabbed-links ul li a{background:0 0;border:none;display:block;padding:4px 10px}.buddypress-wrap .item-body .tabbed-links ul li.current{border-color:#ccc #ccc #fff;border-style:solid;border-top-left-radius:4px;border-top-right-radius:4px;border-width:1px;margin-bottom:-1px;padding:0 .5em}.buddypress-wrap .item-body .tabbed-links ul li.current a{color:#333}.buddypress-wrap .item-body .bp-subnavs.tabbed-links>ul{margin-top:0}.buddypress-wrap .item-body .bp-navs.tabbed-links{background:0 0;margin-top:2px}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a{border-right:0;font-size:inherit}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.last{float:right;margin:0}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.last a{margin-top:-.5em}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:focus,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:hover,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:focus,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:hover{background:0 0;border:0}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:active,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:active{outline:0}}.buddypress-wrap .dir-component-filters .filter label{display:inline}.buddypress-wrap .subnav-filters:after,.buddypress-wrap .subnav-filters:before{content:" ";display:table}.buddypress-wrap .subnav-filters:after{clear:both}.buddypress-wrap .subnav-filters{background:0 0;list-style:none;margin:15px 0 0;padding:0}.buddypress-wrap .subnav-filters div{margin:0}.buddypress-wrap .subnav-filters>ul{float:left;list-style:none}.buddypress-wrap .subnav-filters.bp-messages-filters ul{width:100%}.buddypress-wrap .subnav-filters.bp-messages-filters .messages-search{margin-bottom:1em}@media screen and (min-width:46.8em){.buddypress-wrap .subnav-filters.bp-messages-filters .messages-search{margin-bottom:0}}.buddypress-wrap .subnav-filters div{float:none}.buddypress-wrap .subnav-filters div input[type=search],.buddypress-wrap .subnav-filters div select{font-size:16px}.buddypress-wrap .subnav-filters div button.nouveau-search-submit{padding:5px .8em 6px}.buddypress-wrap .subnav-filters div button#user_messages_search_submit{padding:7px .8em}.buddypress-wrap .subnav-filters .component-filters{margin-top:10px}.buddypress-wrap .subnav-filters .feed{margin-right:15px}.buddypress-wrap .subnav-filters .last.filter label{display:inline}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:after,.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:before{content:" ";display:table}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:after{clear:both}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap.bp-show{display:inline-block}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap.bp-hide{display:none}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap{border:0}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap:focus,.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap:hover{outline:1px solid #d6d6d6}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions{float:left}.buddypress-wrap .subnav-filters .user-messages-bulk-actions label{display:inline-block;font-weight:300;margin-right:25px;padding:5px 0}.buddypress-wrap .subnav-filters .user-messages-bulk-actions div select{-webkit-appearance:textfield}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-apply{border:0;border-radius:none;font-weight:400;line-height:1.8;margin:0 0 0 10px;padding:3px 5px;text-align:center;text-transform:none;width:auto}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-apply span{vertical-align:middle}@media screen and (min-width:32em){.buddypress-wrap .subnav-filters li{margin-bottom:0}.buddypress-wrap .subnav-filters .bp-search,.buddypress-wrap .subnav-filters .dir-search,.buddypress-wrap .subnav-filters .feed,.buddypress-wrap .subnav-filters .group-act-search,.buddypress-wrap .subnav-filters .group-invites-search,.buddypress-wrap .subnav-filters .subnav-search,.buddypress-wrap .subnav-filters .subnav-search form,.buddypress-wrap .subnav-filters .user-messages-bulk-actions,.buddypress-wrap .subnav-filters .user-messages-search{float:left}.buddypress-wrap .subnav-filters .component-filters,.buddypress-wrap .subnav-filters .last{float:right;margin-top:0;width:auto}.buddypress-wrap .subnav-filters .component-filters select,.buddypress-wrap .subnav-filters .last select{max-width:250px}.buddypress-wrap .subnav-filters .user-messages-search{float:right}}.buddypress-wrap .notifications-options-nav input#notification-bulk-manage{border:0;border-radius:0;line-height:1.6}.buddypress-wrap .bp-pagination{background:0 0;border:0;color:#767676;float:left;font-size:small;margin:0;padding:.5em 0;position:relative;width:100%}.buddypress-wrap .bp-pagination .pag-count{float:left}.buddypress-wrap .bp-pagination .bp-pagination-links{float:right;margin-right:10px}.buddypress-wrap .bp-pagination .bp-pagination-links a,.buddypress-wrap .bp-pagination .bp-pagination-links span{font-size:small;padding:0 5px}.buddypress-wrap .bp-pagination .bp-pagination-links a:focus,.buddypress-wrap .bp-pagination .bp-pagination-links a:hover{opacity:1}.buddypress-wrap .bp-pagination p{margin:0}.bp-list:after,.bp-list:before{content:" ";display:table}.bp-list:after{clear:both}.bp-list{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-top:1px solid #eaeaea;clear:both;list-style:none;margin:20px 0;padding:.5em 0;width:100%}.bp-list li:after,.bp-list li:before{content:" ";display:table}.bp-list li:after{clear:both}.bp-list>li{border-bottom:1px solid #eaeaea}.bp-list li{list-style:none;margin:10px 0;padding:.5em 0;position:relative}.bp-list li .item-avatar{text-align:center}.bp-list li .item-avatar img.avatar{display:inline}.bp-list li .item .group-details,.bp-list li .item .item-avatar,.bp-list li .item .item-meta,.bp-list li .item .list-title{text-align:center}.bp-list li .item .list-title{clear:none;font-size:22px;font-weight:400;line-height:1.1;margin:0 auto}@media screen and (min-width:46.8em){.bp-list li .item .list-title{font-size:26px}}.bp-list li .item-meta,.bp-list li .meta{color:#737373;font-size:12px;margin-top:10px}.bp-list li .last-post{text-align:center}.bp-list li .action{margin:0;text-align:center}.bp-list li .action .generic-button{display:inline-block;font-size:12px;margin:0 10px 0 0}.bp-list li .action div.generic-button{margin:10px 0}@media screen and (min-width:46.8em){.bp-list li .item-avatar{float:left;margin-right:5%}.bp-list li .item{margin:0;overflow:hidden}.bp-list li .item .item-block{float:left;margin-right:2%;width:50%}.bp-list li .item .item-meta,.bp-list li .item .list-title{float:left;text-align:left}.bp-list li .item .group-details,.bp-list li .item .last-post{text-align:left}.bp-list li .group-desc,.bp-list li .last-post,.bp-list li .user-update{clear:none;overflow:hidden;width:auto}.bp-list li .action{clear:left;padding:0;text-align:left}.bp-list li .action li.generic-button{margin-right:0}.bp-list li .action div.generic-button{margin:0 0 10px}.bp-list li .generic-button{display:block;margin:0 0 5px 0}}@media screen and (min-width:32em){#activity-stream{clear:both;padding-top:1em}}.activity-list.bp-list{background:#fafafa;border:1px solid #eee}.activity-list.bp-list .activity-item{background:#fff;border:1px solid #b7b7b7;-webkit-box-shadow:0 0 6px #d2d2d2;-moz-box-shadow:0 0 6px #d2d2d2;box-shadow:0 0 6px #d2d2d2;margin:20px 0}.activity-list.bp-list li:first-child{margin-top:0}.friends-request-list .item-title{text-align:center}@media screen and (min-width:46.8em){.friends-request-list li{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap}.friends-request-list li .item{-webkit-flex:1 1 auto;-moz-flex:1 1 auto;-ms-flex:1 1 auto;-o-flex:1 1 auto;flex:1 1 auto}.friends-request-list li .action{text-align:right}.friends-request-list li .item-title{font-size:22px;text-align:left}}#notifications-user-list{clear:both;padding-top:1em}@media screen and (min-width:46.8em){body:not(.logged-in) .bp-list .item{margin-right:0}}.activity-permalink .item-list,.activity-permalink .item-list li.activity-item{border:0}.activity-update-form{padding:10px 10px 0}.item-body .activity-update-form .activity-form{margin:0;padding:0}.activity-update-form{border:1px solid #ccc;-webkit-box-shadow:inset 0 0 6px #eee;-moz-box-shadow:inset 0 0 6px #eee;box-shadow:inset 0 0 6px #eee;margin:15px 0}.activity-update-form #whats-new-avatar{margin:10px 0;text-align:center}.activity-update-form #whats-new-avatar img{display:inline-block}.activity-update-form #whats-new-content{padding:0 0 20px 0}.activity-update-form #whats-new-textarea textarea{background:#fff;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#333;font-family:inherit;font-size:medium;height:2.2em;line-height:1.4;padding:6px;width:100%}.activity-update-form #whats-new-textarea textarea:focus{-webkit-box-shadow:0 0 6px 0 #d6d6d6;-moz-box-shadow:0 0 6px 0 #d6d6d6;box-shadow:0 0 6px 0 #d6d6d6}.activity-update-form #whats-new-post-in-box{margin:10px 0}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items{list-style:none;margin:10px 0}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items li{margin-bottom:10px}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items #activity-autocomplete{padding:.3em}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center;padding:.2em}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object .avatar{width:30px}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object span{padding-left:10px;vertical-align:middle}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object:focus,.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object:hover{background:#eaeaea;cursor:pointer}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object.selected{border:1px solid #d6d6d6}.activity-update-form #whats-new-submit{margin:15px 0 10px}.activity-update-form #whats-new-submit input{font-size:14px;line-height:inherit;margin-bottom:10px;margin-right:10px;padding:.2em 0;text-align:center;width:100%}@media screen and (min-width:46.8em){.activity-update-form #whats-new-avatar{display:block;float:left;margin:0 10px 0 0}.activity-update-form #whats-new-content,.activity-update-form #whats-new-post-in-box,.activity-update-form #whats-new-submit{margin-left:12%}.activity-update-form #whats-new-submit input{margin-bottom:0;margin-right:10px;width:8em}}.activity-list{padding:.5em}.activity-list .activity-item:after,.activity-list .activity-item:before{content:" ";display:table}.activity-list .activity-item:after{clear:both}.activity-list .activity-item{list-style:none;padding:1em}.activity-list .activity-item.has-comments{padding-bottom:1em}.activity-list .activity-item div.item-avatar{margin:0 auto;text-align:center;width:auto}.activity-list .activity-item div.item-avatar img{max-width:40%}@media screen and (min-width:46.8em){.activity-list .activity-item div.item-avatar{margin:0 2% 0 0;text-align:left;width:15%}.activity-list .activity-item div.item-avatar img{max-width:80%}}.activity-list .activity-item.mini{font-size:13px;position:relative}.activity-list .activity-item.mini .activity-avatar{margin-left:0 auto;text-align:center;width:auto}.activity-list .activity-item.mini .activity-avatar img.FB_profile_pic,.activity-list .activity-item.mini .activity-avatar img.avatar{max-width:15%}@media screen and (min-width:46.8em){.activity-list .activity-item.mini .activity-avatar{margin-left:15px;text-align:left;width:15%}.activity-list .activity-item.mini .activity-avatar img.FB_profile_pic,.activity-list .activity-item.mini .activity-avatar img.avatar{max-width:60%}}.activity-list .activity-item.new_forum_post .activity-inner,.activity-list .activity-item.new_forum_topic .activity-inner{border-left:2px solid #eaeaea;margin-left:10px;padding-left:1em}.activity-list .activity-item.newest_blogs_activity,.activity-list .activity-item.newest_friends_activity,.activity-list .activity-item.newest_groups_activity,.activity-list .activity-item.newest_mentions_activity{background:rgba(31,179,221,.1)}.activity-list .activity-item .activity-inreplyto{color:#767676;font-size:13px}.activity-list .activity-item .activity-inreplyto>p{display:inline;margin:0}.activity-list .activity-item .activity-inreplyto .activity-inner,.activity-list .activity-item .activity-inreplyto blockquote{background:0 0;border:0;display:inline;margin:0;overflow:hidden;padding:0}.activity-list .activity-item .activity-header{margin:0 auto;width:80%}.activity-list .activity-item .activity-header a,.activity-list .activity-item .activity-header img{display:inline}.activity-list .activity-item .activity-header .avatar{display:inline-block;margin:0 5px;vertical-align:bottom}.activity-list .activity-item .activity-header .time-since{font-size:14px;color:#767676;text-decoration:none}.activity-list .activity-item .activity-header .time-since:hover{color:#767676;cursor:pointer;text-decoration:underline}.activity-list .activity-item .activity-content .activity-header,.activity-list .activity-item .activity-content .comment-header{color:#767676;margin-bottom:10px}.activity-list .activity-item .activity-content .activity-inner,.activity-list .activity-item .activity-content blockquote{background:#fafafa;margin:15px 0 10px;overflow:hidden;padding:1em}.activity-list .activity-item .activity-content p{margin:0}.activity-list .activity-item .activity-inner p{word-wrap:break-word}.activity-list .activity-item .activity-read-more{margin-left:1em;white-space:nowrap}.activity-list .activity-item ul.activity-meta{margin:0;padding-left:0}.activity-list .activity-item ul.activity-meta li{border:0;display:inline-block}.activity-list .activity-item .activity-meta.action{border:1px solid transparent;background:#fafafa;padding:2px;position:relative;text-align:left}.activity-list .activity-item .activity-meta.action div.generic-button{margin:0}.activity-list .activity-item .activity-meta.action .button{background:0 0}.activity-list .activity-item .activity-meta.action a{padding:4px 8px}.activity-list .activity-item .activity-meta.action .button:focus,.activity-list .activity-item .activity-meta.action .button:hover{background:0 0}.activity-list .activity-item .activity-meta.action .button:before,.activity-list .activity-item .activity-meta.action .icons:before{font-family:dashicons;font-size:18px;vertical-align:middle}.activity-list .activity-item .activity-meta.action .acomment-reply.button:before{content:"\f101"}.activity-list .activity-item .activity-meta.action .view:before{content:"\f125"}.activity-list .activity-item .activity-meta.action .fav:before{content:"\f154"}.activity-list .activity-item .activity-meta.action .unfav:before{content:"\f155"}.activity-list .activity-item .activity-meta.action .delete-activity:before{content:"\f153"}.activity-list .activity-item .activity-meta.action .delete-activity:hover{color:#800}.activity-list .activity-item .activity-meta.action .button{border:0;box-shadow:none}.activity-list .activity-item .activity-meta.action .button span{background:0 0;color:#555;font-weight:700}@media screen and (min-width:46.8em){.activity-list.bp-list{padding:30px}.activity-list .activity-item .activity-content{margin:0;position:relative}.activity-list .activity-item .activity-content:after{clear:both;content:"";display:table}.activity-list .activity-item .activity-header{margin:0 15px 0 0;width:auto}}.buddypress-wrap .activity-list .load-more,.buddypress-wrap .activity-list .load-newest{background:#fafafa;border:1px solid #eee;font-size:110%;margin:15px 0;padding:0;text-align:center}.buddypress-wrap .activity-list .load-more a,.buddypress-wrap .activity-list .load-newest a{color:#555;display:block;padding:.5em 0}.buddypress-wrap .activity-list .load-more a:focus,.buddypress-wrap .activity-list .load-more a:hover,.buddypress-wrap .activity-list .load-newest a:focus,.buddypress-wrap .activity-list .load-newest a:hover{background:#fff;color:#333}.buddypress-wrap .activity-list .load-more:focus,.buddypress-wrap .activity-list .load-more:hover,.buddypress-wrap .activity-list .load-newest:focus,.buddypress-wrap .activity-list .load-newest:hover{border-color:#e1e1e1;-webkit-box-shadow:0 0 6px 0 #eaeaea;-moz-box-shadow:0 0 6px 0 #eaeaea;box-shadow:0 0 6px 0 #eaeaea}body.activity-permalink .activity-list li{border-width:1px;padding:1em 0 0 0}body.activity-permalink .activity-list li:first-child{padding-top:0}body.activity-permalink .activity-list li.has-comments{padding-bottom:0}body.activity-permalink .activity-list .activity-avatar{width:auto}body.activity-permalink .activity-list .activity-avatar a{display:block}body.activity-permalink .activity-list .activity-avatar img{max-width:100%}body.activity-permalink .activity-list .activity-content{border:0;font-size:100%;line-height:1.5;padding:0}body.activity-permalink .activity-list .activity-content .activity-header{margin:0;padding:.5em 0 0 0;text-align:center;width:100%}body.activity-permalink .activity-list .activity-content .activity-inner,body.activity-permalink .activity-list .activity-content blockquote{margin-left:0;margin-top:10px}body.activity-permalink .activity-list .activity-meta{margin:10px 0 10px}body.activity-permalink .activity-list .activity-comments{margin-bottom:10px}@media screen and (min-width:46.8em){body.activity-permalink .activity-list .activity-avatar{left:-20px;margin-right:0;position:relative;top:-20px}body.activity-permalink .activity-list .activity-content{margin-right:10px}body.activity-permalink .activity-list .activity-content .activity-header p{text-align:left}}.buddypress-wrap .activity-comments{clear:both;margin:0 5%;overflow:hidden;position:relative;width:auto}.buddypress-wrap .activity-comments ul{clear:both;list-style:none;margin:15px 0 0;padding:0}.buddypress-wrap .activity-comments ul li{border-top:1px solid #eee;border-bottom:0;padding:1em 0 0}.buddypress-wrap .activity-comments ul li ul{margin-left:5%}.buddypress-wrap .activity-comments ul li:first-child{border-top:0}.buddypress-wrap .activity-comments ul li:last-child{margin-bottom:0}.buddypress-wrap .activity-comments div.acomment-avatar{width:auto}.buddypress-wrap .activity-comments div.acomment-avatar img{border-width:1px;float:left;height:25px;max-width:none;width:25px}.buddypress-wrap .activity-comments .acomment-content p,.buddypress-wrap .activity-comments .acomment-meta{font-size:14px}.buddypress-wrap .activity-comments .acomment-meta{color:#555;overflow:hidden;padding-left:2%}.buddypress-wrap .activity-comments .acomment-content{border-left:1px solid #ccc;margin:15px 0 0 10%;padding:.5em 1em}.buddypress-wrap .activity-comments .acomment-content p{margin-bottom:.5em}.buddypress-wrap .activity-comments .acomment-options{float:left;margin:10px 0 10px 20px}.buddypress-wrap .activity-comments .acomment-options a{color:#767676;font-size:14px}.buddypress-wrap .activity-comments .acomment-options a:focus,.buddypress-wrap .activity-comments .acomment-options a:hover{color:inherit}.buddypress-wrap .activity-comments .activity-meta.action{background:0 0;margin-top:10px}.buddypress-wrap .activity-comments .activity-meta.action button{font-size:14px;font-weight:400;text-transform:none}.buddypress-wrap .activity-comments .show-all button{font-size:14px;text-decoration:underline;padding-left:.5em}.buddypress-wrap .activity-comments .show-all button span{text-decoration:none}.buddypress-wrap .activity-comments .show-all button:focus span,.buddypress-wrap .activity-comments .show-all button:hover span{color:#5087e5}.buddypress-wrap .mini .activity-comments{clear:both;margin-top:0}body.activity-permalink .activity-comments{background:0 0;width:auto}body.activity-permalink .activity-comments>ul{padding:0 .5em 0 1em}body.activity-permalink .activity-comments ul li>ul{margin-top:10px}form.ac-form{display:none;padding:1em}form.ac-form .ac-reply-avatar{float:left}form.ac-form .ac-reply-avatar img{border:1px solid #eee}form.ac-form .ac-reply-content{color:#767676;padding-left:1em}form.ac-form .ac-reply-content a{text-decoration:none}form.ac-form .ac-reply-content .ac-textarea{margin-bottom:15px;padding:0 .5em;overflow:hidden}form.ac-form .ac-reply-content .ac-textarea textarea{background:0 0;box-shadow:none;color:#555;font-family:inherit;font-size:100%;height:60px;margin:0;outline:0;padding:.5em;width:100%}form.ac-form .ac-reply-content .ac-textarea textarea:focus{-webkit-box-shadow:0 0 6px #d6d6d6;-moz-box-shadow:0 0 6px #d6d6d6;box-shadow:0 0 6px #d6d6d6}form.ac-form .ac-reply-content input{margin-top:10px}.activity-comments li form.ac-form{clear:both;margin-right:15px}.activity-comments form.root{margin-left:0}@media screen and (min-width:46.8em){.buddypress-wrap .blogs-list li .item-block{float:none;width:auto}.buddypress-wrap .blogs-list li .item-meta{clear:left;float:none}}@media screen and (min-width:46.8em){.buddypress-wrap .bp-dir-vert-nav .blogs-list .list-title{width:auto}}.buddypress-wrap .groups-list li .list-title{text-align:center}.buddypress-wrap .groups-list li .group-details{clear:left}.buddypress-wrap .groups-list li .group-desc{border:1px solid #eaeaea;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;border-radius:10px;background-clip:padding-box;font-size:13px;color:#737373;font-style:italic;margin:10px auto 0;padding:1em}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list li .group-desc{font-size:16px}}.buddypress-wrap .groups-list li p{margin:0 0 .5em}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list li .item{margin-right:0}.buddypress-wrap .groups-list li .item-meta,.buddypress-wrap .groups-list li .list-title{text-align:left;width:auto}.buddypress-wrap .groups-list li .item-meta{margin-bottom:20px}.buddypress-wrap .groups-list li .last-activity{clear:left;margin-top:-20px}}.buddypress-wrap .groups-list li.group-no-avatar div.group-desc{margin-left:0}.buddypress-wrap .mygroups .groups-list.grid .wrap{min-height:450px;padding-bottom:0}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list.grid.four .group-desc,.buddypress-wrap .groups-list.grid.three .group-desc{font-size:14px}}@media screen and (min-width:46.8em){.buddypress .bp-vertical-navs .groups-list .item-avatar{margin-right:3%;width:15%}}.buddypress-wrap .members-list li .member-name{margin-bottom:10px}.buddypress-wrap .members-list li .user-update{border:1px solid #eaeaea;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;border-radius:10px;background-clip:padding-box;color:#737373;font-style:italic;font-size:13px;margin:15px auto;padding:1em}@media screen and (min-width:46.8em){.buddypress-wrap .members-list li .user-update{font-size:16px}}.buddypress-wrap .members-list li .user-update .activity-read-more{display:block;font-size:12px;font-style:normal;margin-top:10px;padding-left:2px}@media screen and (min-width:46.8em){.buddypress-wrap .members-list li .last-activity{clear:left;margin-top:-10px}}@media screen and (min-width:46.8em){.buddypress-wrap .members-group-list li .joined{clear:left;float:none}}@media screen and (min-width:32em){body:not(.logged-in) .members-list .user-update{width:96%}}.register-page .register-section{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.register-page .signup-form{margin-top:20px}.register-page .signup-form .default-profile input{margin-bottom:20px}.register-page .signup-form label,.register-page .signup-form legend{margin:10px 0 0}.register-page .signup-form .editfield{margin:15px 0}.register-page .signup-form .editfield fieldset{border:0;padding:0}.register-page .signup-form .editfield fieldset legend{margin:0 0 5px;text-indent:0}.register-page .signup-form .editfield .field-visibility-settings{padding:.5em}.register-page .signup-form .editfield .field-visibility-settings fieldset{margin:0 0 10px}.register-page .signup-form #signup-avatar img{margin:0 15px 10px 0}.register-page .signup-form .password-entry,.register-page .signup-form .password-entry-confirm{border:1px solid #eee}@media screen and (min-width:46.8em){.buddypress-wrap .register-page .layout-wrap{display:flex;flex-flow:row wrap;justify-content:space-around}.buddypress-wrap .register-page .layout-wrap .default-profile{flex:1;padding-right:2em}.buddypress-wrap .register-page .layout-wrap .blog-details{flex:1;padding-left:2em}.buddypress-wrap .register-page .submit{clear:both}}@media screen and (min-width:46.8em){.buddypress-wrap.extended-default-reg .register-page .default-profile{flex:1;padding-right:1em}.buddypress-wrap.extended-default-reg .register-page .extended-profile{flex:2;padding-left:1em}.buddypress-wrap.extended-default-reg .register-page .blog-details{flex:1 100%}}#group-create-body{padding:.5em}#group-create-body .creation-step-name{text-align:center}#group-create-body .avatar-nav-items{margin-top:15px}.single-headers:after,.single-headers:before{content:" ";display:table}.single-headers:after{clear:both}.single-headers{margin-bottom:15px}.single-headers #item-header-avatar a{display:block;text-align:center}.single-headers #item-header-avatar a img{float:none}.single-headers div#item-header-content{float:none}@media screen and (min-width:46.8em){.single-headers #item-header-avatar a{text-align:left}.single-headers #item-header-avatar a img{float:left}}.single-headers .activity,.single-headers .group-status{display:inline}.single-headers .group-status{font-size:18px;color:#333;padding-right:1em}.single-headers .activity{display:inline-block;font-size:12px;padding:0}.single-headers #sitewide-notice p,.single-headers div#message p{background-color:#ffd;border:1px solid #cb2;color:#440;font-weight:400;margin-top:3px;text-decoration:none}.single-headers h2{line-height:1.2;margin:0 0 5px}.single-headers h2 a{color:#767676;text-decoration:none}.single-headers h2 span.highlight{display:inline-block;font-size:60%;font-weight:400;line-height:1.7;vertical-align:middle}.single-headers h2 span.highlight span{background:#a1dcfa;color:#fff;cursor:pointer;font-size:80%;font-weight:700;margin-bottom:2px;padding:1px 4px;position:relative;right:-2px;top:-2px;vertical-align:middle}.single-headers img.avatar{float:left;margin:0 15px 19px 0}.single-headers .item-meta{color:#767676;font-size:14px;margin:15px 0 5px;padding-bottom:.5em}.single-headers ul{margin-bottom:15px}.single-headers ul li{float:right;list-style:none}.single-headers div.generic-button{text-align:center}.single-headers li.generic-button{display:inline-block;text-align:center}@media screen and (min-width:46.8em){.single-headers a.button,.single-headers div.generic-button,.single-headers li.generic-button{float:left}}.single-headers a.button,.single-headers div.generic-button{margin:10px 10px 0 0}.single-headers li.generic-button{margin:2px 10px}.single-headers li.generic-button:first-child{margin-left:0}.single-headers div#message.info{line-height:.8}body.no-js .single-item-header .js-self-profile-button{display:none}#cover-image-container{position:relative}#header-cover-image{background-color:#c5c5c5;background-position:center top;background-repeat:no-repeat;background-size:cover;border:0;display:block;left:0;margin:0;padding:0;position:absolute;top:0;width:100%;z-index:1}#item-header-cover-image{position:relative;z-index:2}#item-header-cover-image #item-header-avatar{padding:0 1em}.groups-header .bp-group-type-list{margin:0}.groups-header .bp-feedback{clear:both}.groups-header .group-item-actions{float:left;margin:0 0 15px 15px;padding-top:0;width:100%}.groups-header .moderators-lists{margin-top:0}.groups-header .moderators-lists .moderators-title{font-size:14px}.groups-header .moderators-lists .user-list{margin:0 0 5px}.groups-header .moderators-lists .user-list ul:after{clear:both;content:"";display:table}.groups-header .moderators-lists .user-list li{display:inline-block;float:none;margin-left:4px;padding:4px}.groups-header .moderators-lists img.avatar{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;float:none;height:30px;margin:0;max-width:100%;width:30px}@media screen and (min-width:46.8em){.groups-header div#item-header-content{float:left;margin-left:10%;text-align:left;padding-top:15px;width:42%}.groups-header .group-item-actions{float:right;margin:0 0 15px 15px;text-align:right;width:20%}.groups-header .groups-meta{clear:both}}.groups-header .desc-wrap{background:#eaeaea;border:1px solid #d6d6d6;margin:0 0 15px;padding:1em;text-align:center}.groups-header .desc-wrap .group-description{background:#fafafa;-webkit-box-shadow:inset 0 0 9px #ccc;-moz-box-shadow:inset 0 0 9px #ccc;box-shadow:inset 0 0 9px #ccc;padding:1em;text-align:left}.bp-user .users-header .user-nicename{margin-bottom:5px}.bp-user .member-header-actions{overflow:hidden}.bp-user .member-header-actions *>*{display:block}.buddypress-wrap .item-body{margin:20px 0}.buddypress-wrap .item-body .screen-heading{font-size:20px;font-weight:400}.buddypress-wrap .item-body .button-tabs{margin:30px 0 15px}.buddypress-wrap.bp-single-vert-nav .bp-list:not(.grid) .item-entry{padding-left:.5em}.single-item.group-members .item-body .filters:not(.no-subnav){border-top:5px solid #eaeaea;padding-top:1em}.single-item.group-members .item-body .filters{margin-top:0}.buddypress-wrap .group-status-type ul{margin:0 0 20px 20px}.groups-manage-members-list{padding:.5em 0}.groups-manage-members-list dd{margin:0;padding:1em 0}.groups-manage-members-list .section-title{background:#eaeaea;padding-left:.3em}.groups-manage-members-list ul{list-style:none;margin-bottom:0}.groups-manage-members-list ul li{border-bottom:1px solid #eee;margin-bottom:10px;padding:.5em .3em .3em}.groups-manage-members-list ul li:last-child,.groups-manage-members-list ul li:only-child{border-bottom:0}.groups-manage-members-list ul li:nth-child(even){background:#fafafa}.groups-manage-members-list ul li.banned-user{background:#fad3d3}.groups-manage-members-list ul .member-name{margin-bottom:0;text-align:center}.groups-manage-members-list ul img{display:block;margin:0 auto;width:20%}@media screen and (min-width:32em){.groups-manage-members-list ul .member-name{text-align:left}.groups-manage-members-list ul img{display:inline;width:50px}}.groups-manage-members-list ul .members-manage-buttons:after,.groups-manage-members-list ul .members-manage-buttons:before{content:" ";display:table}.groups-manage-members-list ul .members-manage-buttons:after{clear:both}.groups-manage-members-list ul .members-manage-buttons{margin:15px 0 5px}.groups-manage-members-list ul .members-manage-buttons a.button{color:#767676;display:block;font-size:13px}@media screen and (min-width:32em){.groups-manage-members-list ul .members-manage-buttons a.button{display:inline-block}}.groups-manage-members-list ul .members-manage-buttons.text-links-list{margin-bottom:0}@media screen and (max-width:32em){.groups-manage-members-list ul .members-manage-buttons.text-links-list a.button{background:#fafafa;border:1px solid #eee;display:block;margin-bottom:10px}}.groups-manage-members-list ul .action:not(.text-links-list) a.button{font-size:12px}@media screen and (min-width:46.8em){.groups-manage-members-list ul li .avatar,.groups-manage-members-list ul li .member-name{float:left}.groups-manage-members-list ul li .avatar{margin-right:15px}.groups-manage-members-list ul li .action{clear:both;float:left}}.buddypress .bp-invites-content ul.item-list{border-top:0}.buddypress .bp-invites-content ul.item-list li{border:1px solid #eaeaea;margin:0 0 1%;padding-left:5px;padding-right:5px;position:relative;width:auto}.buddypress .bp-invites-content ul.item-list li .list-title{text-align:center;width:auto}.buddypress .bp-invites-content ul.item-list li .action{position:absolute;top:10px;right:10px}.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button{border:0}.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button:focus,.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button:hover{color:#1fb3dd}.buddypress .bp-invites-content ul.item-list li.selected{-webkit-box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2);-moz-box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2);box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2)}.buddypress .bp-invites-content .group-inviters li,.buddypress .bp-invites-content .item-list .item-meta span{color:#767676}.buddypress .bp-invites-content li ul.group-inviters{clear:both;margin:0;overflow:hidden}.buddypress .bp-invites-content li ul.group-inviters li{border:0;float:left;font-size:20px;width:inherit}.buddypress .bp-invites-content li .status{font-size:20px;font-style:italic;clear:both;color:#555;margin:10px 0}.buddypress .bp-invites-content #send-invites-editor{overflow:hidden}.buddypress .bp-invites-content #send-invites-editor textarea{width:100%}.buddypress .bp-invites-content #send-invites-editor ul{clear:both;list-style:none;margin:10px 0;overflow:hidden}.buddypress .bp-invites-content #send-invites-editor ul li{float:left;margin:.5%;max-height:50px;max-width:50px}.buddypress .bp-invites-content #send-invites-editor .action{margin-top:10px;padding-top:10px}.buddypress .bp-invites-content #send-invites-editor.bp-hide{display:none}@media screen and (min-width:46.8em){.buddypress .bp-invites-content ul.item-list>li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #eaeaea;float:left;padding-left:.5em;padding-right:.5em;width:49.5%}.buddypress .bp-invites-content ul.item-list>li:nth-child(odd){margin-right:.5%}.buddypress .bp-invites-content ul.item-list>li:nth-child(even){margin-left:.5%}.buddypress .bp-invites-content ul.item-list ul.group-inviters{float:left;width:auto}}.buddypress.groups .activity-update-form{margin-top:0}.buddypress-wrap .profile{margin-top:30px}.buddypress-wrap .public .profile-fields td.label{width:30%}.buddypress-wrap .profile.edit .button-nav{list-style:none;margin:30px 0 10px}.buddypress-wrap .profile.edit .button-nav li{display:inline-block;margin-right:10px}.buddypress-wrap .profile.edit .button-nav li a{font-size:18px}.buddypress-wrap .profile.edit .editfield{background:#fafafa;border:1px solid #eee;margin:15px 0;padding:1em}.buddypress-wrap .profile.edit .editfield fieldset{border:0}.buddypress-wrap .profile.edit .editfield fieldset label{font-weight:400}.buddypress-wrap .profile.edit .editfield fieldset label.xprofile-field-label{display:inline}.buddypress-wrap .profile.edit .editfield{display:flex;flex-direction:column}.buddypress-wrap .profile.edit .editfield .description{margin-top:10px;order:2}.buddypress-wrap .profile.edit .editfield>fieldset{order:1}.buddypress-wrap .profile.edit .editfield .field-visibility-settings,.buddypress-wrap .profile.edit .editfield .field-visibility-settings-toggle{order:3}body.no-js .buddypress-wrap .field-visibility-settings-close,body.no-js .buddypress-wrap .field-visibility-settings-toggle{display:none}body.no-js .buddypress-wrap .field-visibility-settings{display:block}.buddypress-wrap .field-visibility-settings{margin:10px 0}.buddypress-wrap .current-visibility-level{font-style:normal;font-weight:700}.buddypress-wrap .field-visibility-settings,.buddypress-wrap .field-visibility-settings-header{color:#737373}.buddypress-wrap .field-visibility-settings fieldset{margin:5px 0}.buddypress-wrap .standard-form .editfield fieldset{margin:0}.buddypress-wrap .standard-form .field-visibility-settings label{font-weight:400;margin:0}.buddypress-wrap .standard-form .field-visibility-settings .radio{list-style:none;margin-bottom:0}.buddypress-wrap .standard-form .field-visibility-settings .field-visibility-settings-close{font-size:12px}.buddypress-wrap .standard-form .wp-editor-container{border:1px solid #dedede}.buddypress-wrap .standard-form .wp-editor-container textarea{background:#fff;width:100%}.buddypress-wrap .standard-form .description{background:#fafafa;font-size:inherit}.buddypress-wrap .standard-form .field-visibility-settings legend,.buddypress-wrap .standard-form .field-visibility-settings-header{font-style:italic}.buddypress-wrap .standard-form .field-visibility-settings-header{font-size:14px}.buddypress-wrap .standard-form .field-visibility-settings label,.buddypress-wrap .standard-form .field-visibility-settings legend{font-size:14px}.buddypress-wrap .standard-form .field-visibility select{margin:0}.buddypress-wrap .html-active button.switch-html{background:#f5f5f5;border-bottom-color:transparent;border-bottom-left-radius:0;border-bottom-right-radius:0}.buddypress-wrap .tmce-active button.switch-tmce{background:#f5f5f5;border-bottom-color:transparent;border-bottom-left-radius:0;border-bottom-right-radius:0}.buddypress-wrap .profile.public .profile-group-title{border-bottom:1px solid #ccc}body.register .buddypress-wrap .page ul{list-style:none}.buddypress-wrap .profile .bp-avatar-nav{margin-top:20px}.message-action-delete:before,.message-action-star:before,.message-action-unstar:before,.message-action-view:before{font-family:dashicons;font-size:18px}.message-action-star:before{color:#aaa;content:"\f154"}.message-action-unstar:before{color:#fcdd77;content:"\f155"}.message-action-view:before{content:"\f473"}.message-action-delete:before{content:"\f153"}.message-action-delete:hover:before{color:#a00}.preview-content .actions a{text-decoration:none}.bp-messages-content{margin:15px 0}.bp-messages-content .avatar{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.bp-messages-content .thread-participants{list-style:none}.bp-messages-content .thread-participants dd{margin-left:0}.bp-messages-content time{color:#737373;font-size:12px}#message-threads{border-top:1px solid #eaeaea;clear:both;list-style:none;margin:0;max-height:220px;overflow-x:hidden;overflow-y:auto;padding:0;width:100%}#message-threads li{border-bottom:1px solid #eaeaea;display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap;margin:0;overflow:hidden;padding:.5em 0}#message-threads li .thread-cb{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center;-webkit-flex:1 2 5%;-moz-flex:1 2 5%;-ms-flex:1 2 5%;-o-flex:1 2 5%;flex:1 2 5%}#message-threads li .thread-from{-webkit-flex:1 2 20%;-moz-flex:1 2 20%;-ms-flex:1 2 20%;-o-flex:1 2 20%;flex:1 2 20%}#message-threads li .thread-from img.avatar{float:left;margin:0 10px 0 0}#message-threads li .thread-from .user-name{display:inline-block;line-height:1.1}#message-threads li .thread-content{-webkit-flex:1 2 60%;-moz-flex:1 2 60%;-ms-flex:1 2 60%;-o-flex:1 2 60%;flex:1 2 60%}#message-threads li .thread-date{-webkit-flex:1 2 15%;-moz-flex:1 2 15%;-ms-flex:1 2 15%;-o-flex:1 2 15%;flex:1 2 15%}#message-threads li.selected{background-color:#fafafa}#message-threads li.selected .thread-subject .subject{color:#5087e5}#message-threads li .thread-content{cursor:pointer}#message-threads li .thread-content .excerpt{color:#737373;font-size:12px;margin:0}#message-threads li .thread-content .thread-from,#message-threads li .thread-content .thread-subject{font-size:13px}@media screen and (min-width:46.8em){#message-threads li .thread-content .thread-from,#message-threads li .thread-content .thread-subject{font-size:16px}}#message-threads li .thread-content .thread-subject{vertical-align:top}#message-threads li .thread-content .thread-subject .excerpt{font-weight:400}#message-threads li .thread-date{padding-right:5px;text-align:right}.bp-messages-content .actions{float:right;max-width:30%}.bp-messages-content .actions .bp-icons{display:inline-block;margin:0;padding:.3em .5em}.bp-messages-content .actions .bp-icons:before{font-size:26px}.bp-messages-content #thread-preview{border:1px solid #eaeaea;margin-top:20px}.bp-messages-content #thread-preview .preview-message{clear:both}.bp-messages-content #thread-preview .preview-content{margin:.5em}.bp-messages-content #thread-preview .preview-content .preview-message{background:#fafafa;margin:10px 0;padding:1em .3em .3em}.bp-messages-content #bp-message-thread-list{border-top:1px solid #eaeaea;clear:both;list-style:none;padding:1em 0 .3em}.bp-messages-content #bp-message-thread-list li{padding:.5em}.bp-messages-content #bp-message-thread-list li:nth-child(2n) .message-content{background:#fafafa}.bp-messages-content #bp-message-thread-list .message-metadata{border-bottom:1px solid #ccc;-webkit-box-shadow:-2px 1px 9px 0 #eee;-moz-box-shadow:-2px 1px 9px 0 #eee;box-shadow:-2px 1px 9px 0 #eee;overflow:hidden;padding:.2em}.bp-messages-content #bp-message-thread-list .message-metadata .avatar{width:30px}.bp-messages-content #bp-message-thread-list .message-metadata .user-link{display:block;font-size:13px;float:left}@media screen and (min-width:46.8em){.bp-messages-content #bp-message-thread-list .message-metadata .user-link{font-size:16px}}.bp-messages-content #bp-message-thread-list .message-metadata time{color:#737373;font-size:12px;padding:0 .5em}.bp-messages-content #bp-message-thread-list .message-metadata button{padding:0 .3em}.bp-messages-content #bp-message-thread-list .message-metadata button:before{font-size:20px}.bp-messages-content #bp-message-thread-list .message-content{clear:both;margin:1em auto 0;width:90%}.bp-messages-content #bp-message-thread-list img.avatar{float:left;margin:0 10px 0 0}.bp-messages-content #bp-message-thread-list .actions a:before{font-size:18px}.bp-messages-content form.send-reply .avatar-box{padding:.5em 0}.bp-messages-content .preview-pane-header,.bp-messages-content .single-message-thread-header{border-bottom:1px solid #eaeaea}.bp-messages-content .preview-pane-header:after,.bp-messages-content .single-message-thread-header:after{clear:both;content:"";display:table}.bp-messages-content .preview-thread-title,.bp-messages-content .single-thread-title{font-size:16px}.bp-messages-content .preview-thread-title .messages-title,.bp-messages-content .single-thread-title .messages-title{padding-left:2em}.bp-messages-content .thread-participants{float:left;margin:5px 0;width:70%}.bp-messages-content .thread-participants dd,.bp-messages-content .thread-participants ul{margin-bottom:10px}.bp-messages-content .thread-participants ul{list-style:none}.bp-messages-content .thread-participants ul:after{clear:both;content:"";display:table}.bp-messages-content .thread-participants li{float:left;margin-left:5px}.bp-messages-content .thread-participants img{width:30px}.bp-messages-content #bp-message-thread-list li .message-content blockquote,.bp-messages-content #bp-message-thread-list li .message-content ol,.bp-messages-content #bp-message-thread-list li .message-content ul,.bp-messages-content #thread-preview .preview-message blockquote,.bp-messages-content #thread-preview .preview-message ol,.bp-messages-content #thread-preview .preview-message ul{list-style-position:inside;margin-left:0}.bp-messages-content #thread-preview:empty,.bp-messages-content ul#message-threads:empty{display:none}.bp-messages-content #bp-message-thread-header h2:first-child,.bp-messages-content #thread-preview h2:first-child{background-color:#eaeaea;color:#555;font-weight:700;margin:0;padding:.5em}.bp-messages-content #bp-message-thread-list li a.user-link,.bp-messages-content #message-threads .thread-content a{border:0;text-decoration:none}.bp-messages-content .standard-form #subject{margin-bottom:20px}div.bp-navs#subsubnav.bp-messages-filters .user-messages-bulk-actions{margin-right:15px;max-width:42.5%}.buddypress.settings .profile-settings.bp-tables-user select{width:100%}.buddypress-wrap #whats-new-post-in-box select,.buddypress-wrap .filter select{border:1px solid #d6d6d6}.buddypress-wrap input.action[disabled]{cursor:pointer;opacity:.4}.buddypress-wrap #notification-bulk-manage[disabled]{display:none}.buddypress-wrap fieldset legend{font-size:inherit;font-weight:600}.buddypress-wrap input[type=email]:focus,.buddypress-wrap input[type=password]:focus,.buddypress-wrap input[type=tel]:focus,.buddypress-wrap input[type=text]:focus,.buddypress-wrap input[type=url]:focus,.buddypress-wrap textarea:focus{-webkit-box-shadow:0 0 8px #eaeaea;-moz-box-shadow:0 0 8px #eaeaea;box-shadow:0 0 8px #eaeaea}.buddypress-wrap select{height:auto}.buddypress-wrap textarea{resize:vertical}.buddypress-wrap .standard-form .bp-controls-wrap{margin:1em 0}.buddypress-wrap .standard-form .groups-members-search input[type=search],.buddypress-wrap .standard-form .groups-members-search input[type=text],.buddypress-wrap .standard-form [data-bp-search] input[type=search],.buddypress-wrap .standard-form [data-bp-search] input[type=text],.buddypress-wrap .standard-form input[type=color],.buddypress-wrap .standard-form input[type=date],.buddypress-wrap .standard-form input[type=datetime-local],.buddypress-wrap .standard-form input[type=datetime],.buddypress-wrap .standard-form input[type=email],.buddypress-wrap .standard-form input[type=month],.buddypress-wrap .standard-form input[type=number],.buddypress-wrap .standard-form input[type=password],.buddypress-wrap .standard-form input[type=range],.buddypress-wrap .standard-form input[type=search],.buddypress-wrap .standard-form input[type=tel],.buddypress-wrap .standard-form input[type=text],.buddypress-wrap .standard-form input[type=time],.buddypress-wrap .standard-form input[type=url],.buddypress-wrap .standard-form input[type=week],.buddypress-wrap .standard-form select,.buddypress-wrap .standard-form textarea{background:#fafafa;border:1px solid #d6d6d6;border-radius:0;font:inherit;font-size:100%;padding:.5em}.buddypress-wrap .standard-form input[required],.buddypress-wrap .standard-form select[required],.buddypress-wrap .standard-form textarea[required]{box-shadow:none;border-width:2px;outline:0}.buddypress-wrap .standard-form input[required]:invalid,.buddypress-wrap .standard-form select[required]:invalid,.buddypress-wrap .standard-form textarea[required]:invalid{border-color:#b71717}.buddypress-wrap .standard-form input[required]:valid,.buddypress-wrap .standard-form select[required]:valid,.buddypress-wrap .standard-form textarea[required]:valid{border-color:#91cc2c}.buddypress-wrap .standard-form input[required]:focus,.buddypress-wrap .standard-form select[required]:focus,.buddypress-wrap .standard-form textarea[required]:focus{border-color:#d6d6d6;border-width:1px}.buddypress-wrap .standard-form input.invalid[required],.buddypress-wrap .standard-form select.invalid[required],.buddypress-wrap .standard-form textarea.invalid[required]{border-color:#b71717}.buddypress-wrap .standard-form input:not(.button-small),.buddypress-wrap .standard-form textarea{width:100%}.buddypress-wrap .standard-form input[type=checkbox],.buddypress-wrap .standard-form input[type=radio]{margin-right:5px;width:auto}.buddypress-wrap .standard-form select{padding:3px}.buddypress-wrap .standard-form textarea{height:120px}.buddypress-wrap .standard-form textarea#message_content{height:200px}.buddypress-wrap .standard-form input[type=password]{margin-bottom:5px}.buddypress-wrap .standard-form input:focus,.buddypress-wrap .standard-form select:focus,.buddypress-wrap .standard-form textarea:focus{background:#fafafa;color:#555;outline:0}.buddypress-wrap .standard-form label,.buddypress-wrap .standard-form span.label{display:block;font-weight:600;margin:15px 0 5px;width:auto}.buddypress-wrap .standard-form a.clear-value{display:block;margin-top:5px;outline:0}.buddypress-wrap .standard-form .submit{clear:both;padding:15px 0 0}.buddypress-wrap .standard-form p.submit{margin-bottom:0}.buddypress-wrap .standard-form div.submit input{margin-right:15px}.buddypress-wrap .standard-form #invite-list label,.buddypress-wrap .standard-form p label{font-weight:400;margin:auto}.buddypress-wrap .standard-form p.description{color:#737373;margin:5px 0}.buddypress-wrap .standard-form div.checkbox label:nth-child(n+2),.buddypress-wrap .standard-form div.radio div label{color:#737373;font-size:100%;font-weight:400;margin:5px 0 0}.buddypress-wrap .standard-form#send-reply textarea{width:97.5%}.buddypress-wrap .standard-form#sidebar-login-form label{margin-top:5px}.buddypress-wrap .standard-form#sidebar-login-form input[type=password],.buddypress-wrap .standard-form#sidebar-login-form input[type=text]{padding:4px;width:95%}.buddypress-wrap .standard-form.profile-edit input:focus{background:#fff}@media screen and (min-width:46.8em){.buddypress-wrap .standard-form .left-menu{float:left}.buddypress-wrap .standard-form #invite-list ul{list-style:none;margin:1%}.buddypress-wrap .standard-form #invite-list ul li{margin:0 0 0 1%}.buddypress-wrap .standard-form .main-column{margin-left:190px}.buddypress-wrap .standard-form .main-column ul#friend-list{clear:none;float:left}.buddypress-wrap .standard-form .main-column ul#friend-list h4{clear:none}}.buddypress-wrap .standard-form .bp-tables-user label{margin:0}.buddypress-wrap .signup-form label,.buddypress-wrap .signup-form legend{font-weight:400}body.no-js .buddypress #delete_inbox_messages,body.no-js .buddypress #delete_sentbox_messages,body.no-js .buddypress #message-type-select,body.no-js .buddypress #messages-bulk-management #select-all-messages,body.no-js .buddypress #notifications-bulk-management #select-all-notifications,body.no-js .buddypress label[for=message-type-select]{display:none}.buddypress-wrap .wp-editor-wrap .wp-editor-wrap button,.buddypress-wrap .wp-editor-wrap .wp-editor-wrap input[type=button],.buddypress-wrap .wp-editor-wrap .wp-editor-wrap input[type=submit],.buddypress-wrap .wp-editor-wrap a.button,.buddypress-wrap .wp-editor-wrap input[type=reset]{padding:0 8px 1px}.buddypress-wrap .select-wrap{border:1px solid #eee}.buddypress-wrap .select-wrap label{display:inline}.buddypress-wrap .select-wrap select::-ms-expand{display:none}.buddypress-wrap .select-wrap select{-moz-appearance:none;-webkit-appearance:none;-o-appearance:none;appearance:none;border:0;cursor:pointer;margin-right:-25px;padding:6px 25px 6px 10px;position:relative;text-indent:-2px;z-index:1;width:100%}.buddypress-wrap .select-wrap select,.buddypress-wrap .select-wrap select:active,.buddypress-wrap .select-wrap select:focus{background:0 0}.buddypress-wrap .select-wrap span.select-arrow{display:inline-block;position:relative;z-index:0}.buddypress-wrap .select-wrap span.select-arrow:before{color:#ccc;content:"\25BC"}.buddypress-wrap .select-wrap:focus .select-arrow:before,.buddypress-wrap .select-wrap:hover .select-arrow:before{color:#a6a6a6}.buddypress-wrap .bp-search form:focus,.buddypress-wrap .bp-search form:hover,.buddypress-wrap .select-wrap:focus,.buddypress-wrap .select-wrap:hover{border:1px solid #d5d4d4;box-shadow:inset 0 0 3px #eee}@media screen and (min-width:32em){.buddypress-wrap .notifications-options-nav .select-wrap{float:left}}.buddypress-wrap .bp-dir-search-form,.buddypress-wrap .bp-messages-search-form:after,.buddypress-wrap .bp-messages-search-form:before{content:" ";display:table}.buddypress-wrap .bp-dir-search-form,.buddypress-wrap .bp-messages-search-form:after{clear:both}.buddypress-wrap form.bp-dir-search-form,.buddypress-wrap form.bp-invites-search-form,.buddypress-wrap form.bp-messages-search-form{border:1px solid #eee;width:100%}@media screen and (min-width:55em){.buddypress-wrap form.bp-dir-search-form,.buddypress-wrap form.bp-invites-search-form,.buddypress-wrap form.bp-messages-search-form{width:15em}}.buddypress-wrap form.bp-dir-search-form label,.buddypress-wrap form.bp-invites-search-form label,.buddypress-wrap form.bp-messages-search-form label{margin:0}.buddypress-wrap form.bp-dir-search-form button[type=submit],.buddypress-wrap form.bp-dir-search-form input[type=search],.buddypress-wrap form.bp-dir-search-form input[type=text],.buddypress-wrap form.bp-invites-search-form button[type=submit],.buddypress-wrap form.bp-invites-search-form input[type=search],.buddypress-wrap form.bp-invites-search-form input[type=text],.buddypress-wrap form.bp-messages-search-form button[type=submit],.buddypress-wrap form.bp-messages-search-form input[type=search],.buddypress-wrap form.bp-messages-search-form input[type=text]{background:0 0;border:0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;border-radius:0;background-clip:padding-box}.buddypress-wrap form.bp-dir-search-form input[type=search],.buddypress-wrap form.bp-dir-search-form input[type=text],.buddypress-wrap form.bp-invites-search-form input[type=search],.buddypress-wrap form.bp-invites-search-form input[type=text],.buddypress-wrap form.bp-messages-search-form input[type=search],.buddypress-wrap form.bp-messages-search-form input[type=text]{float:left;line-height:1.5;padding:3px 10px;width:80%}.buddypress-wrap form.bp-dir-search-form button[type=submit],.buddypress-wrap form.bp-invites-search-form button[type=submit],.buddypress-wrap form.bp-messages-search-form button[type=submit]{float:right;font-size:inherit;font-weight:400;line-height:1.5;padding:3px .7em;text-align:center;text-transform:none;width:20%}.buddypress-wrap form.bp-dir-search-form button[type=submit] span,.buddypress-wrap form.bp-invites-search-form button[type=submit] span,.buddypress-wrap form.bp-messages-search-form button[type=submit] span{font-family:dashicons;font-size:18px;line-height:1.6}.buddypress-wrap form.bp-dir-search-form button[type=submit].bp-show,.buddypress-wrap form.bp-invites-search-form button[type=submit].bp-show,.buddypress-wrap form.bp-messages-search-form button[type=submit].bp-show{height:auto;left:0;overflow:visible;position:static;top:0}.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-cancel-button,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-cancel-button,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-cancel-button{-webkit-appearance:searchfield-cancel-button}.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-results-decoration,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-results-decoration,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-results-decoration{display:none}.buddypress-wrap ul.filters li form label input{line-height:1.4;padding:.1em .7em}.buddypress-wrap .current-member-type{font-style:italic}.buddypress-wrap .dir-form{clear:both}.budypress.no-js form.bp-dir-search-form button[type=submit]{height:auto;left:0;overflow:visible;position:static;top:0}.bp-user [data-bp-search] form input[type=search],.bp-user [data-bp-search] form input[type=text]{padding:6px 10px 7px}.buddypress-wrap .bp-tables-user,.buddypress-wrap table.forum,.buddypress-wrap table.wp-profile-fields{width:100%}.buddypress-wrap .bp-tables-user thead tr,.buddypress-wrap table.forum thead tr,.buddypress-wrap table.wp-profile-fields thead tr{background:0 0;border-bottom:2px solid #ccc}.buddypress-wrap .bp-tables-user tbody tr,.buddypress-wrap table.forum tbody tr,.buddypress-wrap table.wp-profile-fields tbody tr{background:#fafafa}.buddypress-wrap .bp-tables-user tr td,.buddypress-wrap .bp-tables-user tr th,.buddypress-wrap table.forum tr td,.buddypress-wrap table.forum tr th,.buddypress-wrap table.wp-profile-fields tr td,.buddypress-wrap table.wp-profile-fields tr th{padding:.5em;vertical-align:middle}.buddypress-wrap .bp-tables-user tr td.label,.buddypress-wrap table.forum tr td.label,.buddypress-wrap table.wp-profile-fields tr td.label{border-right:1px solid #eaeaea;font-weight:600;width:25%}.buddypress-wrap .bp-tables-user tr.alt td,.buddypress-wrap table.wp-profile-fields tr.alt td{background:#fafafa}.buddypress-wrap table.profile-fields .data{padding:.5em 1em}.buddypress-wrap table.profile-fields tr:last-child{border-bottom:none}.buddypress-wrap table.notifications td{padding:1em .5em}.buddypress-wrap table.notifications .bulk-select-all,.buddypress-wrap table.notifications .bulk-select-check{width:7%}.buddypress-wrap table.notifications .bulk-select-check{vertical-align:middle}.buddypress-wrap table.notifications .date,.buddypress-wrap table.notifications .notification-description,.buddypress-wrap table.notifications .notification-since,.buddypress-wrap table.notifications .title{width:39%}.buddypress-wrap table.notifications .actions,.buddypress-wrap table.notifications .notification-actions{width:15%}.buddypress-wrap table.notification-settings th.title,.buddypress-wrap table.profile-settings th.title{width:80%}.buddypress-wrap table.notifications .notification-actions a.delete,.buddypress-wrap table.notifications .notification-actions a.mark-read{display:inline-block}.buddypress-wrap table.notification-settings{margin-bottom:15px;text-align:left}.buddypress-wrap #groups-notification-settings{margin-bottom:0}.buddypress-wrap table.notification-settings td:first-child,.buddypress-wrap table.notification-settings th.icon,.buddypress-wrap table.notifications td:first-child,.buddypress-wrap table.notifications th.icon{display:none}.buddypress-wrap table.notification-settings .no,.buddypress-wrap table.notification-settings .yes{text-align:center;width:40px;vertical-align:middle}.buddypress-wrap table#message-threads{clear:both}.buddypress-wrap table#message-threads .thread-info{min-width:40%}.buddypress-wrap table#message-threads .thread-info p{margin:0}.buddypress-wrap table#message-threads .thread-info p.thread-excerpt{color:#737373;font-size:12px;margin-top:3px}.buddypress-wrap table.profile-fields{margin-bottom:20px}.buddypress-wrap table.profile-fields:last-child{margin-bottom:0}.buddypress-wrap table.profile-fields p{margin:0}.buddypress-wrap table.profile-fields p:last-child{margin-top:0}.bp-screen-reader-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.center-vert{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center}.bp-hide{display:none}.bp-show{height:auto;left:0;overflow:visible;position:static;top:0}.buddypress .buddypress-wrap .activity-read-more a,.buddypress .buddypress-wrap .comment-reply-link,.buddypress .buddypress-wrap .generic-button a,.buddypress .buddypress-wrap a.bp-title-button,.buddypress .buddypress-wrap a.button,.buddypress .buddypress-wrap button,.buddypress .buddypress-wrap input[type=button],.buddypress .buddypress-wrap input[type=reset],.buddypress .buddypress-wrap input[type=submit],.buddypress .buddypress-wrap ul.button-nav:not(.button-tabs) li a{background:#fff;border-color:#ccc;border-style:solid;border-width:1px;color:#555;cursor:pointer;font-size:inherit;font-weight:400;outline:0;padding:.3em .5em;text-align:center;text-decoration:none;width:auto}.buddypress .buddypress-wrap .button-small[type=button]{padding:0 8px 1px}.buddypress .buddypress-wrap .activity-read-more a:focus,.buddypress .buddypress-wrap .activity-read-more a:hover,.buddypress .buddypress-wrap .button-nav li a:focus,.buddypress .buddypress-wrap .button-nav li a:hover,.buddypress .buddypress-wrap .button-nav li.current a,.buddypress .buddypress-wrap .comment-reply-link:focus,.buddypress .buddypress-wrap .comment-reply-link:hover,.buddypress .buddypress-wrap .generic-button a:focus,.buddypress .buddypress-wrap .generic-button a:hover,.buddypress .buddypress-wrap a.button:focus,.buddypress .buddypress-wrap a.button:hover,.buddypress .buddypress-wrap button:focus,.buddypress .buddypress-wrap button:hover,.buddypress .buddypress-wrap input[type=button]:focus,.buddypress .buddypress-wrap input[type=button]:hover,.buddypress .buddypress-wrap input[type=reset]:focus,.buddypress .buddypress-wrap input[type=reset]:hover,.buddypress .buddypress-wrap input[type=submit]:focus,.buddypress .buddypress-wrap input[type=submit]:hover{background:#ededed;border-color:#999;color:#333;outline:0;text-decoration:none}.buddypress .buddypress-wrap a.disabled,.buddypress .buddypress-wrap button.disabled,.buddypress .buddypress-wrap button.pending,.buddypress .buddypress-wrap div.pending a,.buddypress .buddypress-wrap input[type=button].disabled,.buddypress .buddypress-wrap input[type=button].pending,.buddypress .buddypress-wrap input[type=reset].disabled,.buddypress .buddypress-wrap input[type=reset].pending,.buddypress .buddypress-wrap input[type=submit].pending,.buddypress .buddypress-wrap input[type=submit][disabled=disabled]{border-color:#eee;color:#767676;cursor:default}.buddypress .buddypress-wrap a.disabled:hover,.buddypress .buddypress-wrap button.disabled:hover,.buddypress .buddypress-wrap button.pending:hover,.buddypress .buddypress-wrap div.pending a:hover,.buddypress .buddypress-wrap input[type=button]:hover.disabled,.buddypress .buddypress-wrap input[type=button]:hover.pending,.buddypress .buddypress-wrap input[type=reset]:hover.disabled,.buddypress .buddypress-wrap input[type=reset]:hover.pending,.buddypress .buddypress-wrap input[type=submit]:hover.disabled,.buddypress .buddypress-wrap input[type=submit]:hover.pending{border-color:#eee;color:#767676}.buddypress .buddypress-wrap button.text-button,.buddypress .buddypress-wrap input.text-button{background:0 0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#767676}.buddypress .buddypress-wrap button.text-button.small,.buddypress .buddypress-wrap input.text-button.small{font-size:13px}.buddypress .buddypress-wrap button.text-button:focus,.buddypress .buddypress-wrap button.text-button:hover,.buddypress .buddypress-wrap input.text-button:focus,.buddypress .buddypress-wrap input.text-button:hover{background:0 0;text-decoration:underline}.buddypress .buddypress-wrap .activity-list a.button{border:none}.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.invite-button:hover{color:#1fb3dd}.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.group-remove-invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li.selected a.group-remove-invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li.selected a.invite-button:hover{color:#a00}.buddypress .buddypress-wrap #item-buttons:empty{display:none}.buddypress .buddypress-wrap input:disabled:focus,.buddypress .buddypress-wrap input:disabled:hover{background:0 0}.buddypress .buddypress-wrap .text-links-list a.button{background:0 0;border:none;border-right:1px solid #eee;color:#767676;display:inline-block;padding:.3em 1em}.buddypress .buddypress-wrap .text-links-list a.button:visited{color:#d6d6d6}.buddypress .buddypress-wrap .text-links-list a.button:focus,.buddypress .buddypress-wrap .text-links-list a.button:hover{color:#5087e5}.buddypress .buddypress-wrap .text-links-list a:first-child{padding-left:0}.buddypress .buddypress-wrap .text-links-list a:last-child{border-right:none}.buddypress .buddypress-wrap .bp-list.grid .action a,.buddypress .buddypress-wrap .bp-list.grid .action button{border:1px solid #ccc;display:block;margin:0}.buddypress .buddypress-wrap .bp-list.grid .action a:focus,.buddypress .buddypress-wrap .bp-list.grid .action a:hover,.buddypress .buddypress-wrap .bp-list.grid .action button:focus,.buddypress .buddypress-wrap .bp-list.grid .action button:hover{background:#ededed}.buddypress #buddypress .create-button{background:0 0;text-align:center}@media screen and (min-width:46.8em){.buddypress #buddypress .create-button{float:right}}.buddypress #buddypress .create-button a{border:1px solid #ccc;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;background-clip:padding-box;-webkit-box-shadow:inset 0 0 6px 0 #eaeaea;-moz-box-shadow:inset 0 0 6px 0 #eaeaea;box-shadow:inset 0 0 6px 0 #eaeaea;margin:.2em 0;width:auto}.buddypress #buddypress .create-button a:focus,.buddypress #buddypress .create-button a:hover{background:0 0;border-color:#ccc;-webkit-box-shadow:inset 0 0 12px 0 #eaeaea;-moz-box-shadow:inset 0 0 12px 0 #eaeaea;box-shadow:inset 0 0 12px 0 #eaeaea}@media screen and (min-width:46.8em){.buddypress #buddypress.bp-dir-vert-nav .create-button{float:none;padding-top:2em}.buddypress #buddypress.bp-dir-vert-nav .create-button a{margin-right:.5em}}.buddypress #buddypress.bp-dir-hori-nav .create-button{float:left}.buddypress #buddypress.bp-dir-hori-nav .create-button a,.buddypress #buddypress.bp-dir-hori-nav .create-button a:hover{background:0 0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;margin:0}.buddypress-wrap button.ac-reply-cancel,.buddypress-wrap button.bp-icons{background:0 0;border:0}.buddypress-wrap button.bp-icons:focus,.buddypress-wrap button.bp-icons:hover{background:0 0}.buddypress-wrap button.ac-reply-cancel:focus,.buddypress-wrap button.ac-reply-cancel:hover{background:0 0;text-decoration:underline}.buddypress-wrap .bp-invites-content li .invite-button span.icons:before,.buddypress-wrap .bp-invites-filters .invite-button span.icons:before,.buddypress-wrap .bp-messages-filters li a.messages-button:before,.buddypress-wrap .feed a:before,.buddypress-wrap .filter label:before{font-family:dashicons;font-size:18px}.buddypress-wrap .bp-invites-content .item-list li .invite-button span.icons:before{font-size:27px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-invites-content .item-list li .invite-button span.icons:before{font-size:32px}}.buddypress-wrap .bp-list a.button.invite-button:focus,.buddypress-wrap .bp-list a.button.invite-button:hover{background:0 0}.buddypress-wrap .filter label:before{content:"\f536"}.buddypress-wrap div.feed a:before,.buddypress-wrap li.feed a:before{content:"\f303"}.buddypress-wrap ul.item-list li .invite-button:not(.group-remove-invite-button) span.icons:before{content:"\f502"}.buddypress-wrap ul.item-list li .group-remove-invite-button span.icons:before,.buddypress-wrap ul.item-list li.selected .invite-button span.icons:before{content:"\f153"}.buddypress-wrap .bp-invites-filters ul li #bp-invites-next-page:before,.buddypress-wrap .bp-messages-filters ul li #bp-messages-next-page:before{content:"\f345"}.buddypress-wrap .bp-invites-filters ul li #bp-invites-prev-page:before,.buddypress-wrap .bp-messages-filters ul li #bp-messages-prev-page:before{content:"\f341"}.buddypress-wrap .warn{color:#b71717}.buddypress-wrap .bp-messages{border:1px solid #ccc;margin:0 0 15px}.buddypress-wrap .bp-messages .sitewide-notices{display:block;margin:5px;padding:.5em}.buddypress-wrap .bp-messages.info{margin-bottom:0}.buddypress-wrap .bp-messages.updated{clear:both;display:block}.buddypress-wrap .bp-messages.bp-user-messages-feedback{border:0}.buddypress-wrap #group-create-body .bp-cover-image-status p.warning{background:#0b80a4;border:0;-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.2);-moz-box-shadow:0 0 3px 0 rgba(0,0,0,.2);box-shadow:0 0 3px 0 rgba(0,0,0,.2);color:#fff}.buddypress-wrap .bp-feedback:not(.custom-homepage-info){display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-align:stretch;-webkit-align-items:stretch;-webkit-box-align:stretch;align-items:stretch}.buddypress-wrap .bp-feedback{background:#fff;color:#807f7f;-webkit-box-shadow:0 1px 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px 1px rgba(0,0,0,.1);color:#737373;margin:10px 0;position:relative}.buddypress-wrap .bp-feedback p{margin:0}.buddypress-wrap .bp-feedback span.bp-icon{color:#fff;display:block;font-family:dashicons;left:0;margin-right:10px;position:relative;padding:0 .5em}.buddypress-wrap .bp-feedback .bp-help-text{font-style:italic}.buddypress-wrap .bp-feedback .text{font-size:14px;margin:0;padding:.5em 0}.buddypress-wrap .bp-feedback.no-icon{padding:.5em}.buddypress-wrap .bp-feedback.small:before{line-height:inherit}.buddypress-wrap a[data-bp-close] span:before,.buddypress-wrap button[data-bp-close] span:before{font-size:32px}.buddypress-wrap a[data-bp-close],.buddypress-wrap button[data-bp-close]{border:0;position:absolute;top:10px;right:10px;width:32px}.buddypress-wrap .bp-feedback.no-icon a[data-bp-close],.buddypress-wrap .bp-feedback.no-icon button[data-bp-close]{top:-6px;right:6px}.buddypress-wrap button[data-bp-close]:hover{background-color:transparent}.buddypress-wrap .bp-feedback p{margin:0}.buddypress-wrap .bp-feedback .bp-icon{font-size:20px;padding:0 2px}.buddypress-wrap .bp-feedback.error .bp-icon,.buddypress-wrap .bp-feedback.help .bp-icon,.buddypress-wrap .bp-feedback.info .bp-icon,.buddypress-wrap .bp-feedback.loading .bp-icon,.buddypress-wrap .bp-feedback.success .bp-icon,.buddypress-wrap .bp-feedback.warning .bp-icon{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center}.buddypress-wrap .bp-feedback.help .bp-icon,.buddypress-wrap .bp-feedback.info .bp-icon{background-color:#0b80a4}.buddypress-wrap .bp-feedback.help .bp-icon:before,.buddypress-wrap .bp-feedback.info .bp-icon:before{content:"\f348"}.buddypress-wrap .bp-feedback.error .bp-icon,.buddypress-wrap .bp-feedback.warning .bp-icon{background-color:#d33}.buddypress-wrap .bp-feedback.error .bp-icon:before,.buddypress-wrap .bp-feedback.warning .bp-icon:before{content:"\f534"}.buddypress-wrap .bp-feedback.loading .bp-icon{background-color:#ffd087}.buddypress-wrap .bp-feedback.loading .bp-icon:before{content:"\f469"}.buddypress-wrap .bp-feedback.success .bp-icon{background-color:#8a2}.buddypress-wrap .bp-feedback.success .bp-icon:before{content:"\f147"}.buddypress-wrap .bp-feedback.help .bp-icon:before{content:"\f468"}.buddypress-wrap #pass-strength-result{background-color:#eee;border-color:#ddd;border-style:solid;border-width:1px;display:none;font-weight:700;margin:10px 0 10px 0;padding:.5em;text-align:center;width:auto}.buddypress-wrap #pass-strength-result.show{display:block}.buddypress-wrap #pass-strength-result.mismatch{background-color:#333;border-color:transparent;color:#fff}.buddypress-wrap #pass-strength-result.bad,.buddypress-wrap #pass-strength-result.error{background-color:#ffb78c;border-color:#ff853c;color:#fff}.buddypress-wrap #pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040;color:#fff}.buddypress-wrap #pass-strength-result.strong{background-color:#66d66e;border-color:#438c48;color:#fff}.buddypress-wrap .standard-form#signup_form div div.error{background:#faa;color:#a00;margin:0 0 10px 0;padding:.5em;width:90%}.buddypress-wrap .accept,.buddypress-wrap .reject{float:left;margin-left:10px}.buddypress-wrap .members-list.grid .bp-ajax-message{background:rgba(255,255,255,.9);border:1px solid #eee;font-size:14px;left:2%;position:absolute;padding:.5em 1em;right:2%;top:30px}.buddypress.widget .item-options{font-size:14px}.buddypress.widget ul.item-list{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:column nowrap;-moz-flex-flow:column nowrap;-ms-flex-flow:column nowrap;-o-flex-flow:column nowrap;flex-flow:column nowrap;list-style:none;margin:10px -2%;overflow:hidden}@media screen and (min-width:32em){.buddypress.widget ul.item-list{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row wrap;-moz-flex-flow:row wrap;-ms-flex-flow:row wrap;-o-flex-flow:row wrap;flex-flow:row wrap}}.buddypress.widget ul.item-list li{border:1px solid #eee;-ms-flex-align:stretch;-webkit-align-items:stretch;-webkit-box-align:stretch;align-items:stretch;-webkit-flex:1 1 46%;-moz-flex:1 1 46%;-ms-flex:1 1 46%;-o-flex:1 1 46%;flex:1 1 46%;margin:2%}@media screen and (min-width:75em){.buddypress.widget ul.item-list li{-webkit-flex:0 1 20%;-moz-flex:0 1 20%;-ms-flex:0 1 20%;-o-flex:0 1 20%;flex:0 1 20%}}.buddypress.widget ul.item-list li .item-avatar{padding:.5em;text-align:center}.buddypress.widget ul.item-list li .item-avatar .avatar{width:60%}.buddypress.widget ul.item-list li .item{padding:0 .5em .5em}.buddypress.widget ul.item-list li .item .item-meta{font-size:12px;overflow-wrap:break-word}.widget-area .buddypress.widget ul.item-list li{-webkit-flex:0 1 46%;-moz-flex:0 1 46%;-ms-flex:0 1 46%;-o-flex:0 1 46%;flex:0 1 46%;margin:2% 2% 10px}@media screen and (min-width:75em){.widget-area .buddypress.widget ul.item-list li .avatar{width:100%}}@media screen and (min-width:75em){.widget-area .buddypress.widget ul.item-list{margin:10px -2%;width:100%}.widget-area .buddypress.widget ul.item-list li{-webkit-flex:0 1 auto;-moz-flex:0 1 auto;-ms-flex:0 1 auto;-o-flex:0 1 auto;flex:0 1 auto;margin:10px 2% 1%;width:46%}}#buddypress-wrap *{transition:opacity .1s ease-in-out .1s}#buddypress-wrap a.button,#buddypress-wrap a.generic-button,#buddypress-wrap button,#buddypress-wrap input[type=reset],#buddypress-wrap input[type=submit]{transition:background .1s ease-in-out .1s,color .1s ease-in-out .1s,border-color .1s ease-in-out .1s}.buddypress-wrap a.loading,.buddypress-wrap input.loading{-moz-animation:loader-pulsate .5s infinite ease-in-out alternate;-webkit-animation:loader-pulsate .5s infinite ease-in-out alternate;animation:loader-pulsate .5s infinite ease-in-out alternate;border-color:#aaa}@-webkit-keyframes loader-pulsate{from{border-color:#aaa;-webkit-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-webkit-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}@-moz-keyframes loader-pulsate{from{border-color:#aaa;-moz-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-moz-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}@keyframes loader-pulsate{from{border-color:#aaa;-moz-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-moz-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}.buddypress-wrap a.loading:hover,.buddypress-wrap input.loading:hover{color:#777}[data-bp-tooltip]{position:relative}[data-bp-tooltip]:after{background-color:#fff;display:none;opacity:0;position:absolute;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden}[data-bp-tooltip]:after{border:1px solid #737373;border-radius:1px;box-shadow:4px 4px 8px rgba(0,0,0,.2);color:#333;content:attr(data-bp-tooltip);font-family:"Helvetica Neue",helvetica,arial,san-serif;font-size:12px;font-weight:400;letter-spacing:normal;line-height:1.25;max-width:200px;padding:5px 8px;pointer-events:none;text-shadow:none;text-transform:none;-webkit-transition:all 1.5s ease;-ms-transition:all 1.5s ease;transition:all 1.5s ease;white-space:nowrap;word-wrap:break-word;z-index:100000}[data-bp-tooltip]:active:after,[data-bp-tooltip]:focus:after,[data-bp-tooltip]:hover:after{display:block;opacity:1;overflow:visible;visibility:visible}[data-bp-tooltip=""]{display:none;opacity:0;visibility:hidden}.bp-tooltip:after{left:50%;margin-top:7px;top:110%;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}.user-list .bp-tooltip:after{left:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}@media screen and (min-width:46.8em){.user-list .bp-tooltip:after{left:auto;right:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}}.activity-meta-action .bp-tooltip:after,.notification-actions .bp-tooltip:after,.participants-list .bp-tooltip:after{left:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.bp-invites-content .bp-tooltip:after{left:auto;right:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}#item-body,.single-screen-navs{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.grid>li,.grid>li .generic-button a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.grid>li{border-bottom:0;padding-bottom:10px;padding-top:0}.grid>li .list-wrap{background:#fafafa;border:1px solid #eee;padding-bottom:15px;position:relative;overflow:hidden;padding-top:14px}.grid>li .list-wrap .list-title{padding:.5em}.grid>li .list-wrap .update{color:#737373;padding:.5em 2em}.grid>li .item-avatar{text-align:center}.grid>li .item-avatar .avatar{border-radius:50%;display:inline-block;width:50%}@media screen and (min-width:24em){.grid.members-list .list-wrap{min-height:340px}.grid.members-list .list-wrap .item-block{margin:0 auto;min-height:7rem}.grid.members-group-list .list-wrap .item-block{margin:0 auto;min-height:7rem}.grid.groups-list .list-wrap{min-height:470px}.grid.groups-list .list-wrap .item-block{min-height:6rem}.grid.groups-list .list-wrap .group-desc{margin:15px auto 0;min-height:5em;overflow:hidden}.grid.groups-list .list-wrap .group-details,.grid.groups-list .list-wrap .item-desc,.grid.groups-list .list-wrap .last-activity{margin-bottom:0}.grid.groups-list .list-wrap .group-details p,.grid.groups-list .list-wrap .item-desc p,.grid.groups-list .list-wrap .last-activity p{margin-bottom:0}.grid.blogs-list .list-wrap{min-height:350px}.grid.blogs-list .list-wrap .item-block{margin:0 auto;min-height:7rem}}@media screen and (min-width:24em){.grid>li.item-entry{float:left;margin:0}.grid.two>li{padding-bottom:20px}}@media screen and (min-width:24em) and (min-width:75em){.grid.two>li .list-wrap{max-width:500px;margin:0 auto}}@media screen and (min-width:24em){.grid.three>li,.grid.two>li{width:50%}.grid.three>li:nth-child(odd),.grid.two>li:nth-child(odd){padding-right:10px}.grid.three>li:nth-child(even),.grid.two>li:nth-child(even){padding-left:10px}.grid.three>li .item,.grid.two>li .item{margin:1rem auto 0;width:80%}.grid.three>li .item .item-title,.grid.two>li .item .item-title{width:auto}}@media screen and (min-width:46.8em){.grid.three>li{padding-top:0;width:33.333333%;width:calc(100% / 3)}.grid.three>li:nth-child(1n+1){padding-left:5px;padding-right:5px}.grid.three>li:nth-child(3n+3){padding-left:5px;padding-right:0}.grid.three>li:nth-child(3n+1){padding-left:0;padding-right:5px}}@media screen and (min-width:46.8em){.grid.four>li{width:25%}.grid.four>li:nth-child(1n+1){padding-left:5px;padding-right:5px}.grid.four>li:nth-child(4n+4){padding-left:5px;padding-right:0}.grid.four>li:nth-child(4n+1){padding-left:0;padding-right:5px}}.buddypress-wrap .grid.bp-list{padding-top:1em}.buddypress-wrap .grid.bp-list>li{border-bottom:none}.buddypress-wrap .grid.bp-list>li .list-wrap{padding-bottom:3em}.buddypress-wrap .grid.bp-list>li .item-avatar{margin:0;text-align:center;width:auto}.buddypress-wrap .grid.bp-list>li .item-avatar img.avatar{display:inline-block;height:auto;width:50%}.buddypress-wrap .grid.bp-list>li .item-meta,.buddypress-wrap .grid.bp-list>li .list-title{float:none;text-align:center}.buddypress-wrap .grid.bp-list>li .list-title{font-size:inherit;line-height:1.1}.buddypress-wrap .grid.bp-list>li .item{font-size:18px;left:0;margin:0 auto;text-align:center;width:96%}@media screen and (min-width:46.8em){.buddypress-wrap .grid.bp-list>li .item{font-size:22px}}.buddypress-wrap .grid.bp-list>li .item .group-desc,.buddypress-wrap .grid.bp-list>li .item .item-block{float:none;width:96%}.buddypress-wrap .grid.bp-list>li .item .item-block{margin-bottom:10px}.buddypress-wrap .grid.bp-list>li .item .last-activity{margin-top:5px}.buddypress-wrap .grid.bp-list>li .item .group-desc{clear:none}.buddypress-wrap .grid.bp-list>li .item .user-update{clear:both;text-align:left}.buddypress-wrap .grid.bp-list>li .item .activity-read-more a{display:inline}.buddypress-wrap .grid.bp-list>li .action{bottom:5px;float:none;height:auto;left:0;margin:0;padding:0 5px;position:absolute;text-align:center;top:auto;width:100%}.buddypress-wrap .grid.bp-list>li .action .generic-button{float:none;margin:5px 0 0;text-align:center;width:100%}.buddypress-wrap .grid.bp-list>li .action .generic-button a,.buddypress-wrap .grid.bp-list>li .action .generic-button button{width:100%}.buddypress-wrap .grid.bp-list>li .avatar,.buddypress-wrap .grid.bp-list>li .item,.buddypress-wrap .grid.bp-list>li .item-avatar{float:none}.buddypress-wrap .blogs-list.grid.two>li .blogs-title{min-height:5em}.buddypress-wrap .grid.four>li .group-desc,.buddypress-wrap .grid.three>li .group-desc{min-height:8em}.buddypress-wrap .blogs-list.grid.four>li,.buddypress-wrap .blogs-list.grid.three>li{min-height:350px}.buddypress-wrap .blogs-list.grid.four>li .last-activity,.buddypress-wrap .blogs-list.grid.three>li .last-activity{margin-bottom:0}.buddypress-wrap .blogs-list.grid.four>li .last-post,.buddypress-wrap .blogs-list.grid.three>li .last-post{margin-top:0}.buddypress:not(.logged-in) .grid.bp-list .list-wrap{padding-bottom:5px}.buddypress:not(.logged-in) .grid.groups-list .list-wrap{min-height:430px}.buddypress:not(.logged-in) .grid.members-list .list-wrap{min-height:300px}.buddypress:not(.logged-in) .grid.blogs-list .list-wrap{min-height:320px}@media screen and (min-width:46.8em){.bp-single-vert-nav .vertical{overflow:visible}.bp-single-vert-nav .vertical ul{border-right:1px solid #d6d6d6;float:left;margin-right:-1px;width:25%}.bp-single-vert-nav .vertical li{float:none}.bp-single-vert-nav .vertical li.selected a{background:#ccc;color:#333}.bp-single-vert-nav .vertical li:focus,.bp-single-vert-nav .vertical li:hover{background:#ccc}.bp-single-vert-nav .vertical li span{background:#d6d6d6;border-radius:10%;float:right;margin-right:2px}.bp-single-vert-nav .vertical li:hover span{border-color:#eaeaea}.bp-single-vert-nav .bp-wrap{margin-bottom:15px}.bp-single-vert-nav .bp-wrap .group-nav-tabs.groups-nav ul li,.bp-single-vert-nav .bp-wrap .user-nav-tabs.users-nav ul li{left:1px;position:relative}.bp-single-vert-nav .item-body:not(#group-create-body){background:#fff;border-left:1px solid #d6d6d6;float:right;margin:0;min-height:400px;padding:0 0 0 1em;width:calc(75% + 1px)}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links){background:#eaeaea;margin:0 0 0 -5px;width:auto}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li{font-size:16px;margin:10px 0}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a{border-right:1px solid #ccc;padding:0 .5em}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a:focus,.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a:hover{background:0 0}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li.current a{background:0 0;color:#333;text-decoration:underline}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li:last-child a{border:none}.bp-dir-vert-nav .dir-navs{float:left;left:1px;position:relative;width:20%}.bp-dir-vert-nav .dir-navs ul li{float:none;overflow:hidden;width:auto}.bp-dir-vert-nav .dir-navs ul li.selected{border:1px solid #eee}.bp-dir-vert-nav .dir-navs ul li.selected a{background:#555;color:#fff}.bp-dir-vert-nav .dir-navs ul li.selected a span{background:#eaeaea;border-color:#ccc;color:#5087e5}.bp-dir-vert-nav .dir-navs ul li a:focus,.bp-dir-vert-nav .dir-navs ul li a:hover{background:#ccc;color:#333}.bp-dir-vert-nav .dir-navs ul li a:focus span,.bp-dir-vert-nav .dir-navs ul li a:hover span{border:1px solid #555}.bp-dir-vert-nav .screen-content{border-left:1px solid #d6d6d6;margin-left:20%;overflow:hidden;padding:0 0 2em 1em}.bp-dir-vert-nav .screen-content .subnav-filters{margin-top:0}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li:not(.selected) a:hover{background:0 0}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected{background:0 0;border:1px solid #d6d6d6;border-right-color:#fff}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected a{background:0 0;color:#333;font-weight:600}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected a span{background:#555;border:1px solid #d6d6d6;color:#fff}}
|
1 |
+
body #buddypress * a{box-shadow:none;text-decoration:none}body #buddypress #item-body blockquote,body #buddypress .bp-lists blockquote{margin-left:10px}body #buddypress .bp-list .action{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@media screen and (min-width:46.8em){body.buddypress .entry-content,body.buddypress .entry-header,body.buddypress .site-content .entry-header{max-width:none}body.buddypress .entry-header{float:none;max-width:none}body.buddypress .entry-content{float:none;max-width:none}body.buddypress .site-content{padding-top:2.5em}body.buddypress #page #primary{max-width:none}body.buddypress #page #primary .entry-content,body.buddypress #page #primary .entry-header{float:none;width:auto}}body.buddypress .buddypress-wrap h1,body.buddypress .buddypress-wrap h2,body.buddypress .buddypress-wrap h3,body.buddypress .buddypress-wrap h4,body.buddypress .buddypress-wrap h5,body.buddypress .buddypress-wrap h6{clear:none;margin:1em 0;padding:0}.bp-wrap:after,.bp-wrap:before{content:" ";display:table}.bp-wrap:after{clear:both}.buddypress-wrap.round-avatars .avatar{border-radius:50%}div,dl,input[type=reset],input[type=search],input[type=submit],li,select,textarea{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;border-radius:2px;background-clip:padding-box}body.buddypress article.page>.entry-header{margin-bottom:2em;padding:0}body.buddypress article.page>.entry-header .entry-title{font-size:28px;font-weight:inherit;color:#767676}@media screen and (min-width:46.8em){body.buddypress article.page>.entry-header .entry-title{font-size:34px}}.buddypress-wrap dt.section-title{font-size:18px}@media screen and (min-width:46.8em){.buddypress-wrap dt.section-title{font-size:22px}}.buddypress-wrap .bp-label-text,.buddypress-wrap .message-threads{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-label-text,.buddypress-wrap .message-threads{font-size:16px}}.buddypress-wrap .activity-header{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .activity-header{font-size:16px}}.buddypress-wrap .activity-inner{font-size:15px}@media screen and (min-width:46.8em){.buddypress-wrap .activity-inner{font-size:18px}}.buddypress-wrap #whats-new-post-in{font-size:16px}.buddypress-wrap .acomment-meta,.buddypress-wrap .mini .activity-header{font-size:16px}.buddypress-wrap .dir-component-filters #activity-filter-by{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .dir-component-filters #activity-filter-by{font-size:16px}}.buddypress-wrap .bp-tables-user th{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-tables-user th{font-size:16px}}.buddypress-wrap .bp-tables-user td{font-size:12px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-tables-user td{font-size:14px}}.buddypress-wrap .profile-fields th{font-size:15px}@media screen and (min-width:46.8em){.buddypress-wrap .profile-fields th{font-size:18px}}.buddypress-wrap .profile-fields td{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .profile-fields td{font-size:16px}}.buddypress-wrap #notification-select{font-size:12px}@media screen and (min-width:46.8em){.buddypress-wrap #notification-select{font-size:14px}}.bp-navs{background:0 0;clear:both;overflow:hidden}.bp-navs ul{margin:0;padding:0}.bp-navs ul li{list-style:none;margin:0}.bp-navs ul li.last select{max-width:185px}.bp-navs ul li a,.bp-navs ul li span{border:0;display:block;padding:5px 10px;text-decoration:none}.bp-navs ul li .count{background:#eaeaea;border:1px solid #ccc;border-radius:50%;color:#555;display:inline;font-size:12px;margin-left:2px;padding:3px 6px;text-align:center;vertical-align:middle}.bp-navs ul li.current a,.bp-navs ul li.selected a{color:#333;opacity:1}.bp-navs.bp-invites-filters ul li a,.bp-navs.bp-messages-filters ul li a{border:1px solid #ccc;display:inline-block}.main-navs.dir-navs{margin-bottom:20px}.buddypress-wrap .bp-navs li a:hover a .count,.buddypress-wrap .bp-navs li.current a .count,.buddypress-wrap .bp-navs li.selected a .count{background-color:#ccc}.buddypress-wrap .bp-navs li:not(.current) a:focus,.buddypress-wrap .bp-navs li:not(.current) a:hover,.buddypress-wrap .bp-navs li:not(.selected) a:focus,.buddypress-wrap .bp-navs li:not(.selected) a:hover{background:#ccc;color:#333}.buddypress-wrap .bp-navs li.current a,.buddypress-wrap .bp-navs li.current a:focus,.buddypress-wrap .bp-navs li.current a:hover,.buddypress-wrap .bp-navs li.selected a,.buddypress-wrap .bp-navs li.selected a:focus,.buddypress-wrap .bp-navs li.selected a:hover{background:#555;color:#fafafa}.buddypress-wrap .bp-navs li.current a .count,.buddypress-wrap .bp-navs li.current a:focus .count,.buddypress-wrap .bp-navs li.current a:hover .count,.buddypress-wrap .bp-navs li.selected a .count,.buddypress-wrap .bp-navs li.selected a:focus .count,.buddypress-wrap .bp-navs li.selected a:hover .count{border-color:#fafafa}@media screen and (min-width:46.8em){.buddypress-wrap .main-navs:not(.dir-navs) li.current a,.buddypress-wrap .main-navs:not(.dir-navs) li.selected a{background:#fff;color:#333;font-weight:600}.buddypress-wrap .main-navs.vertical li.current a,.buddypress-wrap .main-navs.vertical li.selected a{background:#555;color:#fafafa;text-decoration:none}.buddypress-wrap.bp-dir-hori-nav nav:not(".tabbed-links"){border-bottom:1px solid #eee;border-top:1px solid #eee;-webkit-box-shadow:0 2px 12px 0 #fafafa;-moz-box-shadow:0 2px 12px 0 #fafafa;box-shadow:0 2px 12px 0 #fafafa}}.buddypress-wrap .bp-subnavs li.current a,.buddypress-wrap .bp-subnavs li.selected a{background:#fff;color:#333;font-weight:600}@media screen and (max-width:46.8em){.buddypress-wrap:not(.bp-single-vert-nav) .bp-navs li{background:#eaeaea}}.buddypress-wrap:not(.bp-single-vert-nav) .main-navs>ul>li>a{padding:.5em calc(.5em + 2px)}.buddypress-wrap:not(.bp-single-vert-nav) .group-subnav#subsubnav,.buddypress-wrap:not(.bp-single-vert-nav) .user-subnav#subsubnav{background:0 0}.buddypress-wrap .bp-subnavs,.buddypress-wrap ul.subnav{width:100%}.buddypress-wrap .bp-subnavs{margin:10px 0;overflow:hidden}.buddypress-wrap .bp-subnavs ul li{margin-top:0}.buddypress-wrap .bp-subnavs ul li.current :focus,.buddypress-wrap .bp-subnavs ul li.current :hover,.buddypress-wrap .bp-subnavs ul li.selected :focus,.buddypress-wrap .bp-subnavs ul li.selected :hover{background:0 0;color:#333}.buddypress-wrap ul.subnav{width:auto}.buddypress-wrap .bp-navs.bp-invites-filters#subsubnav ul li.last,.buddypress-wrap .bp-navs.bp-invites-nav#subnav ul li.last,.buddypress-wrap .bp-navs.bp-messages-filters#subsubnav ul li.last{margin-top:0}@media screen and (max-width:46.8em){.buddypress-wrap .single-screen-navs{border:1px solid #eee}.buddypress-wrap .single-screen-navs li{border-bottom:1px solid #eee}.buddypress-wrap .single-screen-navs li:last-child{border-bottom:none}.buddypress-wrap .bp-subnavs li a{font-size:14px}.buddypress-wrap .bp-subnavs li.current a,.buddypress-wrap .bp-subnavs li.current a:focus,.buddypress-wrap .bp-subnavs li.current a:hover,.buddypress-wrap .bp-subnavs li.selected a,.buddypress-wrap .bp-subnavs li.selected a:focus,.buddypress-wrap .bp-subnavs li.selected a:hover{background:#555;color:#fff}}.buddypress-wrap .bp-navs li.current a .count,.buddypress-wrap .bp-navs li.selected a .count,.buddypress_object_nav .bp-navs li.current a .count,.buddypress_object_nav .bp-navs li.selected a .count{background-color:#fff}.buddypress-wrap .bp-navs li.dynamic a .count,.buddypress-wrap .bp-navs li.dynamic.current a .count,.buddypress-wrap .bp-navs li.dynamic.selected a .count,.buddypress_object_nav .bp-navs li.dynamic a .count,.buddypress_object_nav .bp-navs li.dynamic.current a .count,.buddypress_object_nav .bp-navs li.dynamic.selected a .count{background-color:#5087e5;border:0;color:#fafafa}.buddypress-wrap .bp-navs li.dynamic a:hover .count,.buddypress_object_nav .bp-navs li.dynamic a:hover .count{background-color:#5087e5;border:0;color:#fff}.buddypress-wrap .bp-navs li a .count:empty,.buddypress_object_nav .bp-navs li a .count:empty{display:none}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current),.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current){color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a{color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a:focus,.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a:hover,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a:focus,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a:hover{background:0 0;color:#333}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a[disabled]:focus,.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a[disabled]:hover,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a[disabled]:focus,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a[disabled]:hover{color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li.current a,.buddypress_object_nav .bp-navs.group-create-links ul li.current a{text-align:center}@media screen and (min-width:46.8em){.buddypress-wrap .bp-navs li{float:left}.buddypress-wrap .subnav{float:left}.buddypress-wrap ul.subnav{width:auto}.buddypress-wrap #subsubnav .activity-search{float:left}.buddypress-wrap #subsubnav .filter{float:right}}.buddypress_object_nav .bp-navs li a .count{display:inline-block;float:right}@media screen and (min-width:46.8em){.bp-dir-vert-nav .bp-navs.dir-navs{background:0 0}.bp-dir-vert-nav .bp-navs.dir-navs a .count{float:right}}@media screen and (min-width:46.8em){.buddypress-wrap .item-body .tabbed-links ol,.buddypress-wrap .item-body .tabbed-links ul{border-bottom:1px solid #ccc;float:none;margin:20px 0 10px}.buddypress-wrap .item-body .tabbed-links ol:after,.buddypress-wrap .item-body .tabbed-links ol:before,.buddypress-wrap .item-body .tabbed-links ul:after,.buddypress-wrap .item-body .tabbed-links ul:before{content:" ";display:block}.buddypress-wrap .item-body .tabbed-links ol:after,.buddypress-wrap .item-body .tabbed-links ul:after{clear:both}.buddypress-wrap .item-body .tabbed-links ol li,.buddypress-wrap .item-body .tabbed-links ul li{float:left;list-style:none;margin:0 10px 0 0}.buddypress-wrap .item-body .tabbed-links ol li a,.buddypress-wrap .item-body .tabbed-links ol li span,.buddypress-wrap .item-body .tabbed-links ul li a,.buddypress-wrap .item-body .tabbed-links ul li span{background:0 0;border:none;display:block;padding:4px 10px}.buddypress-wrap .item-body .tabbed-links ol li a:focus,.buddypress-wrap .item-body .tabbed-links ol li a:hover,.buddypress-wrap .item-body .tabbed-links ul li a:focus,.buddypress-wrap .item-body .tabbed-links ul li a:hover{background:0 0}.buddypress-wrap .item-body .tabbed-links ol li.current,.buddypress-wrap .item-body .tabbed-links ul li.current{border-color:#ccc #ccc #fff;border-style:solid;border-top-left-radius:4px;border-top-right-radius:4px;border-width:1px;margin-bottom:-1px;padding:0 .5em 1px}.buddypress-wrap .item-body .tabbed-links ol li.current a,.buddypress-wrap .item-body .tabbed-links ul li.current a{color:#333}.buddypress-wrap .item-body .bp-subnavs.tabbed-links>ul{margin-top:0}.buddypress-wrap .item-body .bp-navs.tabbed-links{background:0 0;margin-top:2px}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a{border-right:0;font-size:inherit}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.last{float:right;margin:0}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.last a{margin-top:-.5em}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:focus,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:hover,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:focus,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:hover{background:0 0;border:0}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:active,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:active{outline:0}}.buddypress-wrap .dir-component-filters .filter label{display:inline}.buddypress-wrap .subnav-filters:after,.buddypress-wrap .subnav-filters:before{content:" ";display:table}.buddypress-wrap .subnav-filters:after{clear:both}.buddypress-wrap .subnav-filters{background:0 0;list-style:none;margin:15px 0 0;padding:0}.buddypress-wrap .subnav-filters div{margin:0}.buddypress-wrap .subnav-filters>ul{float:left;list-style:none}.buddypress-wrap .subnav-filters.bp-messages-filters ul{width:100%}.buddypress-wrap .subnav-filters.bp-messages-filters .messages-search{margin-bottom:1em}@media screen and (min-width:46.8em){.buddypress-wrap .subnav-filters.bp-messages-filters .messages-search{margin-bottom:0}}.buddypress-wrap .subnav-filters div{float:none}.buddypress-wrap .subnav-filters div input[type=search],.buddypress-wrap .subnav-filters div select{font-size:16px}.buddypress-wrap .subnav-filters div button.nouveau-search-submit{padding:5px .8em 6px}.buddypress-wrap .subnav-filters div button#user_messages_search_submit{padding:7px .8em}.buddypress-wrap .subnav-filters .component-filters{margin-top:10px}.buddypress-wrap .subnav-filters .feed{margin-right:15px}.buddypress-wrap .subnav-filters .last.filter label{display:inline}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:after,.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:before{content:" ";display:table}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:after{clear:both}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap.bp-show{display:inline-block}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap.bp-hide{display:none}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap{border:0}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap:focus,.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap:hover{outline:1px solid #d6d6d6}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions{float:left}.buddypress-wrap .subnav-filters .user-messages-bulk-actions label{display:inline-block;font-weight:300;margin-right:25px;padding:5px 0}.buddypress-wrap .subnav-filters .user-messages-bulk-actions div select{-webkit-appearance:textfield}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-apply{border:0;border-radius:none;font-weight:400;line-height:1.8;margin:0 0 0 10px;padding:3px 5px;text-align:center;text-transform:none;width:auto}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-apply span{vertical-align:middle}@media screen and (min-width:32em){.buddypress-wrap .subnav-filters li{margin-bottom:0}.buddypress-wrap .subnav-filters .bp-search,.buddypress-wrap .subnav-filters .dir-search,.buddypress-wrap .subnav-filters .feed,.buddypress-wrap .subnav-filters .group-act-search,.buddypress-wrap .subnav-filters .group-invites-search,.buddypress-wrap .subnav-filters .subnav-search,.buddypress-wrap .subnav-filters .subnav-search form,.buddypress-wrap .subnav-filters .user-messages-bulk-actions,.buddypress-wrap .subnav-filters .user-messages-search{float:left}.buddypress-wrap .subnav-filters .component-filters,.buddypress-wrap .subnav-filters .last{float:right;margin-top:0;width:auto}.buddypress-wrap .subnav-filters .component-filters select,.buddypress-wrap .subnav-filters .last select{max-width:250px}.buddypress-wrap .subnav-filters .user-messages-search{float:right}}.buddypress-wrap .notifications-options-nav input#notification-bulk-manage{border:0;border-radius:0;line-height:1.6}.buddypress-wrap .bp-pagination{background:0 0;border:0;color:#767676;float:left;font-size:small;margin:0;padding:.5em 0;position:relative;width:100%}.buddypress-wrap .bp-pagination .pag-count{float:left}.buddypress-wrap .bp-pagination .bp-pagination-links{float:right;margin-right:10px}.buddypress-wrap .bp-pagination .bp-pagination-links a,.buddypress-wrap .bp-pagination .bp-pagination-links span{font-size:small;padding:0 5px}.buddypress-wrap .bp-pagination .bp-pagination-links a:focus,.buddypress-wrap .bp-pagination .bp-pagination-links a:hover{opacity:1}.buddypress-wrap .bp-pagination p{margin:0}.bp-list:after,.bp-list:before{content:" ";display:table}.bp-list:after{clear:both}.bp-list{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-top:1px solid #eaeaea;clear:both;list-style:none;margin:20px 0;padding:.5em 0;width:100%}.bp-list li:after,.bp-list li:before{content:" ";display:table}.bp-list li:after{clear:both}.bp-list>li{border-bottom:1px solid #eaeaea}.bp-list li{list-style:none;margin:10px 0;padding:.5em 0;position:relative}.bp-list li .item-avatar{text-align:center}.bp-list li .item-avatar img.avatar{display:inline}.bp-list li .item .group-details,.bp-list li .item .item-avatar,.bp-list li .item .item-meta,.bp-list li .item .list-title{text-align:center}.bp-list li .item .list-title{clear:none;font-size:22px;font-weight:400;line-height:1.1;margin:0 auto}@media screen and (min-width:46.8em){.bp-list li .item .list-title{font-size:26px}}.bp-list li .item-meta,.bp-list li .meta{color:#737373;font-size:12px;margin-top:10px}.bp-list li .last-post{text-align:center}.bp-list li .action{margin:0;text-align:center}.bp-list li .action .generic-button{display:inline-block;font-size:12px;margin:0 10px 0 0}.bp-list li .action div.generic-button{margin:10px 0}@media screen and (min-width:46.8em){.bp-list li .item-avatar{float:left;margin-right:5%}.bp-list li .item{margin:0;overflow:hidden}.bp-list li .item .item-block{float:left;margin-right:2%;width:50%}.bp-list li .item .item-meta,.bp-list li .item .list-title{float:left;text-align:left}.bp-list li .item .group-details,.bp-list li .item .last-post{text-align:left}.bp-list li .group-desc,.bp-list li .last-post,.bp-list li .user-update{clear:none;overflow:hidden;width:auto}.bp-list li .action{clear:left;padding:0;text-align:left}.bp-list li .action li.generic-button{margin-right:0}.bp-list li .action div.generic-button{margin:0 0 10px}.bp-list li .generic-button{display:block;margin:0 0 5px 0}}@media screen and (min-width:32em){#activity-stream{clear:both;padding-top:1em}}.activity-list.bp-list{background:#fafafa;border:1px solid #eee}.activity-list.bp-list .activity-item{background:#fff;border:1px solid #b7b7b7;-webkit-box-shadow:0 0 6px #d2d2d2;-moz-box-shadow:0 0 6px #d2d2d2;box-shadow:0 0 6px #d2d2d2;margin:20px 0}.activity-list.bp-list li:first-child{margin-top:0}.friends-request-list .item-title{text-align:center}@media screen and (min-width:46.8em){.friends-request-list li{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap}.friends-request-list li .item{-webkit-flex:1 1 auto;-moz-flex:1 1 auto;-ms-flex:1 1 auto;-o-flex:1 1 auto;flex:1 1 auto}.friends-request-list li .action{text-align:right}.friends-request-list li .item-title{font-size:22px;text-align:left}}#notifications-user-list{clear:both;padding-top:1em}@media screen and (min-width:46.8em){body:not(.logged-in) .bp-list .item{margin-right:0}}.activity-permalink .item-list,.activity-permalink .item-list li.activity-item{border:0}.activity-update-form{padding:10px 10px 0}.item-body .activity-update-form .activity-form{margin:0;padding:0}.activity-update-form{border:1px solid #ccc;-webkit-box-shadow:inset 0 0 6px #eee;-moz-box-shadow:inset 0 0 6px #eee;box-shadow:inset 0 0 6px #eee;margin:15px 0}.activity-update-form #whats-new-avatar{margin:10px 0;text-align:center}.activity-update-form #whats-new-avatar img{display:inline-block}.activity-update-form #whats-new-content{padding:0 0 20px 0}.activity-update-form #whats-new-textarea textarea{background:#fff;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#333;font-family:inherit;font-size:medium;height:2.2em;line-height:1.4;padding:6px;width:100%}.activity-update-form #whats-new-textarea textarea:focus{-webkit-box-shadow:0 0 6px 0 #d6d6d6;-moz-box-shadow:0 0 6px 0 #d6d6d6;box-shadow:0 0 6px 0 #d6d6d6}.activity-update-form #whats-new-post-in-box{margin:10px 0}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items{list-style:none;margin:10px 0}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items li{margin-bottom:10px}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items #activity-autocomplete{padding:.3em}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center;padding:.2em}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object .avatar{width:30px}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object span{padding-left:10px;vertical-align:middle}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object:focus,.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object:hover{background:#eaeaea;cursor:pointer}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object.selected{border:1px solid #d6d6d6}.activity-update-form #whats-new-submit{margin:15px 0 10px}.activity-update-form #whats-new-submit input{font-size:14px;line-height:inherit;margin-bottom:10px;margin-right:10px;padding:.2em 0;text-align:center;width:100%}@media screen and (min-width:46.8em){.activity-update-form #whats-new-avatar{display:block;float:left;margin:0 10px 0 0}.activity-update-form #whats-new-content,.activity-update-form #whats-new-post-in-box,.activity-update-form #whats-new-submit{margin-left:12%}.activity-update-form #whats-new-submit input{margin-bottom:0;margin-right:10px;width:8em}}.activity-list{padding:.5em}.activity-list .activity-item:after,.activity-list .activity-item:before{content:" ";display:table}.activity-list .activity-item:after{clear:both}.activity-list .activity-item{list-style:none;padding:1em}.activity-list .activity-item.has-comments{padding-bottom:1em}.activity-list .activity-item div.item-avatar{margin:0 auto;text-align:center;width:auto}.activity-list .activity-item div.item-avatar img{max-width:40%}@media screen and (min-width:46.8em){.activity-list .activity-item div.item-avatar{margin:0 2% 0 0;text-align:left;width:15%}.activity-list .activity-item div.item-avatar img{max-width:80%}}.activity-list .activity-item.mini{font-size:13px;position:relative}.activity-list .activity-item.mini .activity-avatar{margin-left:0 auto;text-align:center;width:auto}.activity-list .activity-item.mini .activity-avatar img.FB_profile_pic,.activity-list .activity-item.mini .activity-avatar img.avatar{max-width:15%}@media screen and (min-width:46.8em){.activity-list .activity-item.mini .activity-avatar{margin-left:15px;text-align:left;width:15%}.activity-list .activity-item.mini .activity-avatar img.FB_profile_pic,.activity-list .activity-item.mini .activity-avatar img.avatar{max-width:60%}}.activity-list .activity-item.new_forum_post .activity-inner,.activity-list .activity-item.new_forum_topic .activity-inner{border-left:2px solid #eaeaea;margin-left:10px;padding-left:1em}.activity-list .activity-item.newest_blogs_activity,.activity-list .activity-item.newest_friends_activity,.activity-list .activity-item.newest_groups_activity,.activity-list .activity-item.newest_mentions_activity{background:rgba(31,179,221,.1)}.activity-list .activity-item .activity-inreplyto{color:#767676;font-size:13px}.activity-list .activity-item .activity-inreplyto>p{display:inline;margin:0}.activity-list .activity-item .activity-inreplyto .activity-inner,.activity-list .activity-item .activity-inreplyto blockquote{background:0 0;border:0;display:inline;margin:0;overflow:hidden;padding:0}.activity-list .activity-item .activity-header{margin:0 auto;width:80%}.activity-list .activity-item .activity-header a,.activity-list .activity-item .activity-header img{display:inline}.activity-list .activity-item .activity-header .avatar{display:inline-block;margin:0 5px;vertical-align:bottom}.activity-list .activity-item .activity-header .time-since{font-size:14px;color:#767676;text-decoration:none}.activity-list .activity-item .activity-header .time-since:hover{color:#767676;cursor:pointer;text-decoration:underline}.activity-list .activity-item .activity-content .activity-header,.activity-list .activity-item .activity-content .comment-header{color:#767676;margin-bottom:10px}.activity-list .activity-item .activity-content .activity-inner,.activity-list .activity-item .activity-content blockquote{background:#fafafa;margin:15px 0 10px;overflow:hidden;padding:1em}.activity-list .activity-item .activity-content p{margin:0}.activity-list .activity-item .activity-inner p{word-wrap:break-word}.activity-list .activity-item .activity-read-more{margin-left:1em;white-space:nowrap}.activity-list .activity-item ul.activity-meta{margin:0;padding-left:0}.activity-list .activity-item ul.activity-meta li{border:0;display:inline-block}.activity-list .activity-item .activity-meta.action{border:1px solid transparent;background:#fafafa;padding:2px;position:relative;text-align:left}.activity-list .activity-item .activity-meta.action div.generic-button{margin:0}.activity-list .activity-item .activity-meta.action .button{background:0 0}.activity-list .activity-item .activity-meta.action a{padding:4px 8px}.activity-list .activity-item .activity-meta.action .button:focus,.activity-list .activity-item .activity-meta.action .button:hover{background:0 0}.activity-list .activity-item .activity-meta.action .button:before,.activity-list .activity-item .activity-meta.action .icons:before{font-family:dashicons;font-size:18px;vertical-align:middle}.activity-list .activity-item .activity-meta.action .acomment-reply.button:before{content:"\f101"}.activity-list .activity-item .activity-meta.action .view:before{content:"\f125"}.activity-list .activity-item .activity-meta.action .fav:before{content:"\f154"}.activity-list .activity-item .activity-meta.action .unfav:before{content:"\f155"}.activity-list .activity-item .activity-meta.action .delete-activity:before{content:"\f153"}.activity-list .activity-item .activity-meta.action .delete-activity:hover{color:#800}.activity-list .activity-item .activity-meta.action .button{border:0;box-shadow:none}.activity-list .activity-item .activity-meta.action .button span{background:0 0;color:#555;font-weight:700}@media screen and (min-width:46.8em){.activity-list.bp-list{padding:30px}.activity-list .activity-item .activity-content{margin:0;position:relative}.activity-list .activity-item .activity-content:after{clear:both;content:"";display:table}.activity-list .activity-item .activity-header{margin:0 15px 0 0;width:auto}}.buddypress-wrap .activity-list .load-more,.buddypress-wrap .activity-list .load-newest{background:#fafafa;border:1px solid #eee;font-size:110%;margin:15px 0;padding:0;text-align:center}.buddypress-wrap .activity-list .load-more a,.buddypress-wrap .activity-list .load-newest a{color:#555;display:block;padding:.5em 0}.buddypress-wrap .activity-list .load-more a:focus,.buddypress-wrap .activity-list .load-more a:hover,.buddypress-wrap .activity-list .load-newest a:focus,.buddypress-wrap .activity-list .load-newest a:hover{background:#fff;color:#333}.buddypress-wrap .activity-list .load-more:focus,.buddypress-wrap .activity-list .load-more:hover,.buddypress-wrap .activity-list .load-newest:focus,.buddypress-wrap .activity-list .load-newest:hover{border-color:#e1e1e1;-webkit-box-shadow:0 0 6px 0 #eaeaea;-moz-box-shadow:0 0 6px 0 #eaeaea;box-shadow:0 0 6px 0 #eaeaea}body.activity-permalink .activity-list li{border-width:1px;padding:1em 0 0 0}body.activity-permalink .activity-list li:first-child{padding-top:0}body.activity-permalink .activity-list li.has-comments{padding-bottom:0}body.activity-permalink .activity-list .activity-avatar{width:auto}body.activity-permalink .activity-list .activity-avatar a{display:block}body.activity-permalink .activity-list .activity-avatar img{max-width:100%}body.activity-permalink .activity-list .activity-content{border:0;font-size:100%;line-height:1.5;padding:0}body.activity-permalink .activity-list .activity-content .activity-header{margin:0;padding:.5em 0 0 0;text-align:center;width:100%}body.activity-permalink .activity-list .activity-content .activity-inner,body.activity-permalink .activity-list .activity-content blockquote{margin-left:0;margin-top:10px}body.activity-permalink .activity-list .activity-meta{margin:10px 0 10px}body.activity-permalink .activity-list .activity-comments{margin-bottom:10px}@media screen and (min-width:46.8em){body.activity-permalink .activity-list .activity-avatar{left:-20px;margin-right:0;position:relative;top:-20px}body.activity-permalink .activity-list .activity-content{margin-right:10px}body.activity-permalink .activity-list .activity-content .activity-header p{text-align:left}}.buddypress-wrap .activity-comments{clear:both;margin:0 5%;overflow:hidden;position:relative;width:auto}.buddypress-wrap .activity-comments ul{clear:both;list-style:none;margin:15px 0 0;padding:0}.buddypress-wrap .activity-comments ul li{border-top:1px solid #eee;border-bottom:0;padding:1em 0 0}.buddypress-wrap .activity-comments ul li ul{margin-left:5%}.buddypress-wrap .activity-comments ul li:first-child{border-top:0}.buddypress-wrap .activity-comments ul li:last-child{margin-bottom:0}.buddypress-wrap .activity-comments div.acomment-avatar{width:auto}.buddypress-wrap .activity-comments div.acomment-avatar img{border-width:1px;float:left;height:25px;max-width:none;width:25px}.buddypress-wrap .activity-comments .acomment-content p,.buddypress-wrap .activity-comments .acomment-meta{font-size:14px}.buddypress-wrap .activity-comments .acomment-meta{color:#555;overflow:hidden;padding-left:2%}.buddypress-wrap .activity-comments .acomment-content{border-left:1px solid #ccc;margin:15px 0 0 10%;padding:.5em 1em}.buddypress-wrap .activity-comments .acomment-content p{margin-bottom:.5em}.buddypress-wrap .activity-comments .acomment-options{float:left;margin:10px 0 10px 20px}.buddypress-wrap .activity-comments .acomment-options a{color:#767676;font-size:14px}.buddypress-wrap .activity-comments .acomment-options a:focus,.buddypress-wrap .activity-comments .acomment-options a:hover{color:inherit}.buddypress-wrap .activity-comments .activity-meta.action{background:0 0;margin-top:10px}.buddypress-wrap .activity-comments .activity-meta.action button{font-size:14px;font-weight:400;text-transform:none}.buddypress-wrap .activity-comments .show-all button{font-size:14px;text-decoration:underline;padding-left:.5em}.buddypress-wrap .activity-comments .show-all button span{text-decoration:none}.buddypress-wrap .activity-comments .show-all button:focus span,.buddypress-wrap .activity-comments .show-all button:hover span{color:#5087e5}.buddypress-wrap .mini .activity-comments{clear:both;margin-top:0}body.activity-permalink .activity-comments{background:0 0;width:auto}body.activity-permalink .activity-comments>ul{padding:0 .5em 0 1em}body.activity-permalink .activity-comments ul li>ul{margin-top:10px}form.ac-form{display:none;padding:1em}form.ac-form .ac-reply-avatar{float:left}form.ac-form .ac-reply-avatar img{border:1px solid #eee}form.ac-form .ac-reply-content{color:#767676;padding-left:1em}form.ac-form .ac-reply-content a{text-decoration:none}form.ac-form .ac-reply-content .ac-textarea{margin-bottom:15px;padding:0 .5em;overflow:hidden}form.ac-form .ac-reply-content .ac-textarea textarea{background:0 0;box-shadow:none;color:#555;font-family:inherit;font-size:100%;height:60px;margin:0;outline:0;padding:.5em;width:100%}form.ac-form .ac-reply-content .ac-textarea textarea:focus{-webkit-box-shadow:0 0 6px #d6d6d6;-moz-box-shadow:0 0 6px #d6d6d6;box-shadow:0 0 6px #d6d6d6}form.ac-form .ac-reply-content input{margin-top:10px}.activity-comments li form.ac-form{clear:both;margin-right:15px}.activity-comments form.root{margin-left:0}@media screen and (min-width:46.8em){.buddypress-wrap .blogs-list li .item-block{float:none;width:auto}.buddypress-wrap .blogs-list li .item-meta{clear:left;float:none}}@media screen and (min-width:46.8em){.buddypress-wrap .bp-dir-vert-nav .blogs-list .list-title{width:auto}}.buddypress-wrap .groups-list li .list-title{text-align:center}.buddypress-wrap .groups-list li .group-details{clear:left}.buddypress-wrap .groups-list li .group-desc{border:1px solid #eaeaea;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;border-radius:10px;background-clip:padding-box;font-size:13px;color:#737373;font-style:italic;margin:10px auto 0;padding:1em}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list li .group-desc{font-size:16px}}.buddypress-wrap .groups-list li p{margin:0 0 .5em}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list li .item{margin-right:0}.buddypress-wrap .groups-list li .item-meta,.buddypress-wrap .groups-list li .list-title{text-align:left;width:auto}.buddypress-wrap .groups-list li .item-meta{margin-bottom:20px}.buddypress-wrap .groups-list li .last-activity{clear:left;margin-top:-20px}}.buddypress-wrap .groups-list li.group-no-avatar div.group-desc{margin-left:0}.buddypress-wrap .mygroups .groups-list.grid .wrap{min-height:450px;padding-bottom:0}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list.grid.four .group-desc,.buddypress-wrap .groups-list.grid.three .group-desc{font-size:14px}}@media screen and (min-width:46.8em){.buddypress .bp-vertical-navs .groups-list .item-avatar{margin-right:3%;width:15%}}.buddypress-wrap .members-list li .member-name{margin-bottom:10px}.buddypress-wrap .members-list li .user-update{border:1px solid #eaeaea;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;border-radius:10px;background-clip:padding-box;color:#737373;font-style:italic;font-size:13px;margin:15px auto;padding:1em}@media screen and (min-width:46.8em){.buddypress-wrap .members-list li .user-update{font-size:16px}}.buddypress-wrap .members-list li .user-update .activity-read-more{display:block;font-size:12px;font-style:normal;margin-top:10px;padding-left:2px}@media screen and (min-width:46.8em){.buddypress-wrap .members-list li .last-activity{clear:left;margin-top:-10px}}@media screen and (min-width:46.8em){.buddypress-wrap .members-group-list li .joined{clear:left;float:none}}@media screen and (min-width:32em){body:not(.logged-in) .members-list .user-update{width:96%}}.register-page .register-section{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.register-page .signup-form{margin-top:20px}.register-page .signup-form .default-profile input{margin-bottom:20px}.register-page .signup-form label,.register-page .signup-form legend{margin:10px 0 0}.register-page .signup-form .editfield{margin:15px 0}.register-page .signup-form .editfield fieldset{border:0;padding:0}.register-page .signup-form .editfield fieldset legend{margin:0 0 5px;text-indent:0}.register-page .signup-form .editfield .field-visibility-settings{padding:.5em}.register-page .signup-form .editfield .field-visibility-settings fieldset{margin:0 0 10px}.register-page .signup-form #signup-avatar img{margin:0 15px 10px 0}.register-page .signup-form .password-entry,.register-page .signup-form .password-entry-confirm{border:1px solid #eee}@media screen and (min-width:46.8em){.buddypress-wrap .register-page .layout-wrap{display:flex;flex-flow:row wrap;justify-content:space-around}.buddypress-wrap .register-page .layout-wrap .default-profile{flex:1;padding-right:2em}.buddypress-wrap .register-page .layout-wrap .blog-details{flex:1;padding-left:2em}.buddypress-wrap .register-page .submit{clear:both}}@media screen and (min-width:46.8em){.buddypress-wrap.extended-default-reg .register-page .default-profile{flex:1;padding-right:1em}.buddypress-wrap.extended-default-reg .register-page .extended-profile{flex:2;padding-left:1em}.buddypress-wrap.extended-default-reg .register-page .blog-details{flex:1 100%}}#group-create-body{padding:.5em}#group-create-body .creation-step-name{text-align:center}#group-create-body .avatar-nav-items{margin-top:15px}.single-headers:after,.single-headers:before{content:" ";display:table}.single-headers:after{clear:both}.single-headers{margin-bottom:15px}.single-headers #item-header-avatar a{display:block;text-align:center}.single-headers #item-header-avatar a img{float:none}.single-headers div#item-header-content{float:none}@media screen and (min-width:46.8em){.single-headers #item-header-avatar a{text-align:left}.single-headers #item-header-avatar a img{float:left}}.single-headers .activity,.single-headers .group-status{display:inline}.single-headers .group-status{font-size:18px;color:#333;padding-right:1em}.single-headers .activity{display:inline-block;font-size:12px;padding:0}.single-headers #sitewide-notice p,.single-headers div#message p{background-color:#ffd;border:1px solid #cb2;color:#440;font-weight:400;margin-top:3px;text-decoration:none}.single-headers h2{line-height:1.2;margin:0 0 5px}.single-headers h2 a{color:#767676;text-decoration:none}.single-headers h2 span.highlight{display:inline-block;font-size:60%;font-weight:400;line-height:1.7;vertical-align:middle}.single-headers h2 span.highlight span{background:#a1dcfa;color:#fff;cursor:pointer;font-size:80%;font-weight:700;margin-bottom:2px;padding:1px 4px;position:relative;right:-2px;top:-2px;vertical-align:middle}.single-headers img.avatar{float:left;margin:0 15px 19px 0}.single-headers .item-meta{color:#767676;font-size:14px;margin:15px 0 5px;padding-bottom:.5em}.single-headers ul{margin-bottom:15px}.single-headers ul li{float:right;list-style:none}.single-headers div.generic-button{text-align:center}.single-headers li.generic-button{display:inline-block;text-align:center}@media screen and (min-width:46.8em){.single-headers a.button,.single-headers div.generic-button,.single-headers li.generic-button{float:left}}.single-headers a.button,.single-headers div.generic-button{margin:10px 10px 0 0}.single-headers li.generic-button{margin:2px 10px}.single-headers li.generic-button:first-child{margin-left:0}.single-headers div#message.info{line-height:.8}body.no-js .single-item-header .js-self-profile-button{display:none}#cover-image-container{position:relative}#header-cover-image{background-color:#c5c5c5;background-position:center top;background-repeat:no-repeat;background-size:cover;border:0;display:block;left:0;margin:0;padding:0;position:absolute;top:0;width:100%;z-index:1}#item-header-cover-image{position:relative;z-index:2}#item-header-cover-image #item-header-avatar{padding:0 1em}.groups-header .bp-group-type-list{margin:0}.groups-header .bp-feedback{clear:both}.groups-header .group-item-actions{float:left;margin:0 0 15px 15px;padding-top:0;width:100%}.groups-header .moderators-lists{margin-top:0}.groups-header .moderators-lists .moderators-title{font-size:14px}.groups-header .moderators-lists .user-list{margin:0 0 5px}.groups-header .moderators-lists .user-list ul:after{clear:both;content:"";display:table}.groups-header .moderators-lists .user-list li{display:inline-block;float:none;margin-left:4px;padding:4px}.groups-header .moderators-lists img.avatar{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;float:none;height:30px;margin:0;max-width:100%;width:30px}@media screen and (min-width:46.8em){.groups-header div#item-header-content{float:left;margin-left:10%;text-align:left;padding-top:15px;width:42%}.groups-header .group-item-actions{float:right;margin:0 0 15px 15px;text-align:right;width:20%}.groups-header .groups-meta{clear:both}}.groups-header .desc-wrap{background:#eaeaea;border:1px solid #d6d6d6;margin:0 0 15px;padding:1em;text-align:center}.groups-header .desc-wrap .group-description{background:#fafafa;-webkit-box-shadow:inset 0 0 9px #ccc;-moz-box-shadow:inset 0 0 9px #ccc;box-shadow:inset 0 0 9px #ccc;padding:1em;text-align:left}.bp-user .users-header .user-nicename{margin-bottom:5px}.bp-user .member-header-actions{overflow:hidden}.bp-user .member-header-actions *>*{display:block}.buddypress-wrap .item-body{margin:20px 0}.buddypress-wrap .item-body .screen-heading{font-size:20px;font-weight:400}.buddypress-wrap .item-body .button-tabs{margin:30px 0 15px}.buddypress-wrap.bp-single-vert-nav .bp-list:not(.grid) .item-entry{padding-left:.5em}.single-item.group-members .item-body .filters:not(.no-subnav){border-top:5px solid #eaeaea;padding-top:1em}.single-item.group-members .item-body .filters{margin-top:0}.buddypress-wrap .group-status-type ul{margin:0 0 20px 20px}.groups-manage-members-list{padding:.5em 0}.groups-manage-members-list dd{margin:0;padding:1em 0}.groups-manage-members-list .section-title{background:#eaeaea;padding-left:.3em}.groups-manage-members-list ul{list-style:none;margin-bottom:0}.groups-manage-members-list ul li{border-bottom:1px solid #eee;margin-bottom:10px;padding:.5em .3em .3em}.groups-manage-members-list ul li:last-child,.groups-manage-members-list ul li:only-child{border-bottom:0}.groups-manage-members-list ul li:nth-child(even){background:#fafafa}.groups-manage-members-list ul li.banned-user{background:#fad3d3}.groups-manage-members-list ul .member-name{margin-bottom:0;text-align:center}.groups-manage-members-list ul img{display:block;margin:0 auto;width:20%}@media screen and (min-width:32em){.groups-manage-members-list ul .member-name{text-align:left}.groups-manage-members-list ul img{display:inline;width:50px}}.groups-manage-members-list ul .members-manage-buttons:after,.groups-manage-members-list ul .members-manage-buttons:before{content:" ";display:table}.groups-manage-members-list ul .members-manage-buttons:after{clear:both}.groups-manage-members-list ul .members-manage-buttons{margin:15px 0 5px}.groups-manage-members-list ul .members-manage-buttons a.button{color:#767676;display:block;font-size:13px}@media screen and (min-width:32em){.groups-manage-members-list ul .members-manage-buttons a.button{display:inline-block}}.groups-manage-members-list ul .members-manage-buttons.text-links-list{margin-bottom:0}@media screen and (max-width:32em){.groups-manage-members-list ul .members-manage-buttons.text-links-list a.button{background:#fafafa;border:1px solid #eee;display:block;margin-bottom:10px}}.groups-manage-members-list ul .action:not(.text-links-list) a.button{font-size:12px}@media screen and (min-width:46.8em){.groups-manage-members-list ul li .avatar,.groups-manage-members-list ul li .member-name{float:left}.groups-manage-members-list ul li .avatar{margin-right:15px}.groups-manage-members-list ul li .action{clear:both;float:left}}.buddypress .bp-invites-content ul.item-list{border-top:0}.buddypress .bp-invites-content ul.item-list li{border:1px solid #eaeaea;margin:0 0 1%;padding-left:5px;padding-right:5px;position:relative;width:auto}.buddypress .bp-invites-content ul.item-list li .list-title{text-align:center;width:auto}.buddypress .bp-invites-content ul.item-list li .action{position:absolute;top:10px;right:10px}.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button{border:0}.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button:focus,.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button:hover{color:#1fb3dd}.buddypress .bp-invites-content ul.item-list li.selected{-webkit-box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2);-moz-box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2);box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2)}.buddypress .bp-invites-content .group-inviters li,.buddypress .bp-invites-content .item-list .item-meta span{color:#767676}.buddypress .bp-invites-content li ul.group-inviters{clear:both;margin:0;overflow:hidden}.buddypress .bp-invites-content li ul.group-inviters li{border:0;float:left;font-size:20px;width:inherit}.buddypress .bp-invites-content li .status{font-size:20px;font-style:italic;clear:both;color:#555;margin:10px 0}.buddypress .bp-invites-content #send-invites-editor{overflow:hidden}.buddypress .bp-invites-content #send-invites-editor textarea{width:100%}.buddypress .bp-invites-content #send-invites-editor ul{clear:both;list-style:none;margin:10px 0;overflow:hidden}.buddypress .bp-invites-content #send-invites-editor ul li{float:left;margin:.5%;max-height:50px;max-width:50px}.buddypress .bp-invites-content #send-invites-editor .action{margin-top:10px;padding-top:10px}.buddypress .bp-invites-content #send-invites-editor.bp-hide{display:none}@media screen and (min-width:46.8em){.buddypress .bp-invites-content ul.item-list>li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #eaeaea;float:left;padding-left:.5em;padding-right:.5em;width:49.5%}.buddypress .bp-invites-content ul.item-list>li:nth-child(odd){margin-right:.5%}.buddypress .bp-invites-content ul.item-list>li:nth-child(even){margin-left:.5%}.buddypress .bp-invites-content ul.item-list ul.group-inviters{float:left;width:auto}}.buddypress.groups .activity-update-form{margin-top:0}.buddypress-wrap .profile{margin-top:30px}.buddypress-wrap .public .profile-fields td.label{width:30%}.buddypress-wrap .profile.edit .button-nav{list-style:none;margin:30px 0 10px}.buddypress-wrap .profile.edit .button-nav li{display:inline-block;margin-right:10px}.buddypress-wrap .profile.edit .button-nav li a{font-size:18px}.buddypress-wrap .profile.edit .editfield{background:#fafafa;border:1px solid #eee;margin:15px 0;padding:1em}.buddypress-wrap .profile.edit .editfield fieldset{border:0}.buddypress-wrap .profile.edit .editfield fieldset label{font-weight:400}.buddypress-wrap .profile.edit .editfield fieldset label.xprofile-field-label{display:inline}.buddypress-wrap .profile.edit .editfield{display:flex;flex-direction:column}.buddypress-wrap .profile.edit .editfield .description{margin-top:10px;order:2}.buddypress-wrap .profile.edit .editfield>fieldset{order:1}.buddypress-wrap .profile.edit .editfield .field-visibility-settings,.buddypress-wrap .profile.edit .editfield .field-visibility-settings-toggle{order:3}body.no-js .buddypress-wrap .field-visibility-settings-close,body.no-js .buddypress-wrap .field-visibility-settings-toggle{display:none}body.no-js .buddypress-wrap .field-visibility-settings{display:block}.buddypress-wrap .field-visibility-settings{margin:10px 0}.buddypress-wrap .current-visibility-level{font-style:normal;font-weight:700}.buddypress-wrap .field-visibility-settings,.buddypress-wrap .field-visibility-settings-header{color:#737373}.buddypress-wrap .field-visibility-settings fieldset{margin:5px 0}.buddypress-wrap .standard-form .editfield fieldset{margin:0}.buddypress-wrap .standard-form .field-visibility-settings label{font-weight:400;margin:0}.buddypress-wrap .standard-form .field-visibility-settings .radio{list-style:none;margin-bottom:0}.buddypress-wrap .standard-form .field-visibility-settings .field-visibility-settings-close{font-size:12px}.buddypress-wrap .standard-form .wp-editor-container{border:1px solid #dedede}.buddypress-wrap .standard-form .wp-editor-container textarea{background:#fff;width:100%}.buddypress-wrap .standard-form .description{background:#fafafa;font-size:inherit}.buddypress-wrap .standard-form .field-visibility-settings legend,.buddypress-wrap .standard-form .field-visibility-settings-header{font-style:italic}.buddypress-wrap .standard-form .field-visibility-settings-header{font-size:14px}.buddypress-wrap .standard-form .field-visibility-settings label,.buddypress-wrap .standard-form .field-visibility-settings legend{font-size:14px}.buddypress-wrap .standard-form .field-visibility select{margin:0}.buddypress-wrap .html-active button.switch-html{background:#f5f5f5;border-bottom-color:transparent;border-bottom-left-radius:0;border-bottom-right-radius:0}.buddypress-wrap .tmce-active button.switch-tmce{background:#f5f5f5;border-bottom-color:transparent;border-bottom-left-radius:0;border-bottom-right-radius:0}.buddypress-wrap .profile.public .profile-group-title{border-bottom:1px solid #ccc}body.register .buddypress-wrap .page ul{list-style:none}.buddypress-wrap .profile .bp-avatar-nav{margin-top:20px}.message-action-delete:before,.message-action-star:before,.message-action-unstar:before,.message-action-view:before{font-family:dashicons;font-size:18px}.message-action-star:before{color:#aaa;content:"\f154"}.message-action-unstar:before{color:#fcdd77;content:"\f155"}.message-action-view:before{content:"\f473"}.message-action-delete:before{content:"\f153"}.message-action-delete:hover:before{color:#a00}.preview-content .actions a{text-decoration:none}.bp-messages-content{margin:15px 0}.bp-messages-content .avatar{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.bp-messages-content .thread-participants{list-style:none}.bp-messages-content .thread-participants dd{margin-left:0}.bp-messages-content time{color:#737373;font-size:12px}#message-threads{border-top:1px solid #eaeaea;clear:both;list-style:none;margin:0;max-height:220px;overflow-x:hidden;overflow-y:auto;padding:0;width:100%}#message-threads li{border-bottom:1px solid #eaeaea;display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap;margin:0;overflow:hidden;padding:.5em 0}#message-threads li .thread-cb{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center;-webkit-flex:1 2 5%;-moz-flex:1 2 5%;-ms-flex:1 2 5%;-o-flex:1 2 5%;flex:1 2 5%}#message-threads li .thread-from{-webkit-flex:1 2 20%;-moz-flex:1 2 20%;-ms-flex:1 2 20%;-o-flex:1 2 20%;flex:1 2 20%}#message-threads li .thread-from img.avatar{float:left;margin:0 10px 0 0}#message-threads li .thread-from .user-name{display:inline-block;line-height:1.1}#message-threads li .thread-content{-webkit-flex:1 2 60%;-moz-flex:1 2 60%;-ms-flex:1 2 60%;-o-flex:1 2 60%;flex:1 2 60%}#message-threads li .thread-date{-webkit-flex:1 2 15%;-moz-flex:1 2 15%;-ms-flex:1 2 15%;-o-flex:1 2 15%;flex:1 2 15%}#message-threads li.selected{background-color:#fafafa}#message-threads li.selected .thread-subject .subject{color:#5087e5}#message-threads li .thread-content{cursor:pointer}#message-threads li .thread-content .excerpt{color:#737373;font-size:12px;margin:0}#message-threads li .thread-content .thread-from,#message-threads li .thread-content .thread-subject{font-size:13px}@media screen and (min-width:46.8em){#message-threads li .thread-content .thread-from,#message-threads li .thread-content .thread-subject{font-size:16px}}#message-threads li .thread-content .thread-subject{vertical-align:top}#message-threads li .thread-content .thread-subject .excerpt{font-weight:400}#message-threads li .thread-date{padding-right:5px;text-align:right}.bp-messages-content .actions{float:right;max-width:30%}.bp-messages-content .actions .bp-icons{display:inline-block;margin:0;padding:.3em .5em}.bp-messages-content .actions .bp-icons:before{font-size:26px}.bp-messages-content #thread-preview{border:1px solid #eaeaea;margin-top:20px}.bp-messages-content #thread-preview .preview-message{clear:both}.bp-messages-content #thread-preview .preview-content{margin:.5em}.bp-messages-content #thread-preview .preview-content .preview-message{background:#fafafa;margin:10px 0;padding:1em .3em .3em}.bp-messages-content #bp-message-thread-list{border-top:1px solid #eaeaea;clear:both;list-style:none;padding:1em 0 .3em}.bp-messages-content #bp-message-thread-list li{padding:.5em}.bp-messages-content #bp-message-thread-list li:nth-child(2n) .message-content{background:#fafafa}.bp-messages-content #bp-message-thread-list .message-metadata{border-bottom:1px solid #ccc;-webkit-box-shadow:-2px 1px 9px 0 #eee;-moz-box-shadow:-2px 1px 9px 0 #eee;box-shadow:-2px 1px 9px 0 #eee;overflow:hidden;padding:.2em}.bp-messages-content #bp-message-thread-list .message-metadata .avatar{width:30px}.bp-messages-content #bp-message-thread-list .message-metadata .user-link{display:block;font-size:13px;float:left}@media screen and (min-width:46.8em){.bp-messages-content #bp-message-thread-list .message-metadata .user-link{font-size:16px}}.bp-messages-content #bp-message-thread-list .message-metadata time{color:#737373;font-size:12px;padding:0 .5em}.bp-messages-content #bp-message-thread-list .message-metadata button{padding:0 .3em}.bp-messages-content #bp-message-thread-list .message-metadata button:before{font-size:20px}.bp-messages-content #bp-message-thread-list .message-content{clear:both;margin:1em auto 0;width:90%}.bp-messages-content #bp-message-thread-list img.avatar{float:left;margin:0 10px 0 0}.bp-messages-content #bp-message-thread-list .actions a:before{font-size:18px}.bp-messages-content form.send-reply .avatar-box{padding:.5em 0}.bp-messages-content .preview-pane-header,.bp-messages-content .single-message-thread-header{border-bottom:1px solid #eaeaea}.bp-messages-content .preview-pane-header:after,.bp-messages-content .single-message-thread-header:after{clear:both;content:"";display:table}.bp-messages-content .preview-thread-title,.bp-messages-content .single-thread-title{font-size:16px}.bp-messages-content .preview-thread-title .messages-title,.bp-messages-content .single-thread-title .messages-title{padding-left:2em}.bp-messages-content .thread-participants{float:left;margin:5px 0;width:70%}.bp-messages-content .thread-participants dd,.bp-messages-content .thread-participants ul{margin-bottom:10px}.bp-messages-content .thread-participants ul{list-style:none}.bp-messages-content .thread-participants ul:after{clear:both;content:"";display:table}.bp-messages-content .thread-participants li{float:left;margin-left:5px}.bp-messages-content .thread-participants img{width:30px}.bp-messages-content #bp-message-thread-list li .message-content blockquote,.bp-messages-content #bp-message-thread-list li .message-content ol,.bp-messages-content #bp-message-thread-list li .message-content ul,.bp-messages-content #thread-preview .preview-message blockquote,.bp-messages-content #thread-preview .preview-message ol,.bp-messages-content #thread-preview .preview-message ul{list-style-position:inside;margin-left:0}.bp-messages-content #thread-preview:empty,.bp-messages-content ul#message-threads:empty{display:none}.bp-messages-content #bp-message-thread-header h2:first-child,.bp-messages-content #thread-preview h2:first-child{background-color:#eaeaea;color:#555;font-weight:700;margin:0;padding:.5em}.bp-messages-content #bp-message-thread-list li a.user-link,.bp-messages-content #message-threads .thread-content a{border:0;text-decoration:none}.bp-messages-content .standard-form #subject{margin-bottom:20px}div.bp-navs#subsubnav.bp-messages-filters .user-messages-bulk-actions{margin-right:15px;max-width:42.5%}.buddypress.settings .profile-settings.bp-tables-user select{width:100%}.buddypress-wrap #whats-new-post-in-box select,.buddypress-wrap .filter select{border:1px solid #d6d6d6}.buddypress-wrap input.action[disabled]{cursor:pointer;opacity:.4}.buddypress-wrap #notification-bulk-manage[disabled]{display:none}.buddypress-wrap fieldset legend{font-size:inherit;font-weight:600}.buddypress-wrap input[type=email]:focus,.buddypress-wrap input[type=password]:focus,.buddypress-wrap input[type=tel]:focus,.buddypress-wrap input[type=text]:focus,.buddypress-wrap input[type=url]:focus,.buddypress-wrap textarea:focus{-webkit-box-shadow:0 0 8px #eaeaea;-moz-box-shadow:0 0 8px #eaeaea;box-shadow:0 0 8px #eaeaea}.buddypress-wrap select{height:auto}.buddypress-wrap textarea{resize:vertical}.buddypress-wrap .standard-form .bp-controls-wrap{margin:1em 0}.buddypress-wrap .standard-form .groups-members-search input[type=search],.buddypress-wrap .standard-form .groups-members-search input[type=text],.buddypress-wrap .standard-form [data-bp-search] input[type=search],.buddypress-wrap .standard-form [data-bp-search] input[type=text],.buddypress-wrap .standard-form input[type=color],.buddypress-wrap .standard-form input[type=date],.buddypress-wrap .standard-form input[type=datetime-local],.buddypress-wrap .standard-form input[type=datetime],.buddypress-wrap .standard-form input[type=email],.buddypress-wrap .standard-form input[type=month],.buddypress-wrap .standard-form input[type=number],.buddypress-wrap .standard-form input[type=password],.buddypress-wrap .standard-form input[type=range],.buddypress-wrap .standard-form input[type=search],.buddypress-wrap .standard-form input[type=tel],.buddypress-wrap .standard-form input[type=text],.buddypress-wrap .standard-form input[type=time],.buddypress-wrap .standard-form input[type=url],.buddypress-wrap .standard-form input[type=week],.buddypress-wrap .standard-form select,.buddypress-wrap .standard-form textarea{background:#fafafa;border:1px solid #d6d6d6;border-radius:0;font:inherit;font-size:100%;padding:.5em}.buddypress-wrap .standard-form input[required],.buddypress-wrap .standard-form select[required],.buddypress-wrap .standard-form textarea[required]{box-shadow:none;border-width:2px;outline:0}.buddypress-wrap .standard-form input[required]:invalid,.buddypress-wrap .standard-form select[required]:invalid,.buddypress-wrap .standard-form textarea[required]:invalid{border-color:#b71717}.buddypress-wrap .standard-form input[required]:valid,.buddypress-wrap .standard-form select[required]:valid,.buddypress-wrap .standard-form textarea[required]:valid{border-color:#91cc2c}.buddypress-wrap .standard-form input[required]:focus,.buddypress-wrap .standard-form select[required]:focus,.buddypress-wrap .standard-form textarea[required]:focus{border-color:#d6d6d6;border-width:1px}.buddypress-wrap .standard-form input.invalid[required],.buddypress-wrap .standard-form select.invalid[required],.buddypress-wrap .standard-form textarea.invalid[required]{border-color:#b71717}.buddypress-wrap .standard-form input:not(.button-small),.buddypress-wrap .standard-form textarea{width:100%}.buddypress-wrap .standard-form input[type=checkbox],.buddypress-wrap .standard-form input[type=radio]{margin-right:5px;width:auto}.buddypress-wrap .standard-form select{padding:3px}.buddypress-wrap .standard-form textarea{height:120px}.buddypress-wrap .standard-form textarea#message_content{height:200px}.buddypress-wrap .standard-form input[type=password]{margin-bottom:5px}.buddypress-wrap .standard-form input:focus,.buddypress-wrap .standard-form select:focus,.buddypress-wrap .standard-form textarea:focus{background:#fafafa;color:#555;outline:0}.buddypress-wrap .standard-form label,.buddypress-wrap .standard-form span.label{display:block;font-weight:600;margin:15px 0 5px;width:auto}.buddypress-wrap .standard-form a.clear-value{display:block;margin-top:5px;outline:0}.buddypress-wrap .standard-form .submit{clear:both;padding:15px 0 0}.buddypress-wrap .standard-form p.submit{margin-bottom:0}.buddypress-wrap .standard-form div.submit input{margin-right:15px}.buddypress-wrap .standard-form #invite-list label,.buddypress-wrap .standard-form p label{font-weight:400;margin:auto}.buddypress-wrap .standard-form p.description{color:#737373;margin:5px 0}.buddypress-wrap .standard-form div.checkbox label:nth-child(n+2),.buddypress-wrap .standard-form div.radio div label{color:#737373;font-size:100%;font-weight:400;margin:5px 0 0}.buddypress-wrap .standard-form#send-reply textarea{width:97.5%}.buddypress-wrap .standard-form#sidebar-login-form label{margin-top:5px}.buddypress-wrap .standard-form#sidebar-login-form input[type=password],.buddypress-wrap .standard-form#sidebar-login-form input[type=text]{padding:4px;width:95%}.buddypress-wrap .standard-form.profile-edit input:focus{background:#fff}@media screen and (min-width:46.8em){.buddypress-wrap .standard-form .left-menu{float:left}.buddypress-wrap .standard-form #invite-list ul{list-style:none;margin:1%}.buddypress-wrap .standard-form #invite-list ul li{margin:0 0 0 1%}.buddypress-wrap .standard-form .main-column{margin-left:190px}.buddypress-wrap .standard-form .main-column ul#friend-list{clear:none;float:left}.buddypress-wrap .standard-form .main-column ul#friend-list h4{clear:none}}.buddypress-wrap .standard-form .bp-tables-user label{margin:0}.buddypress-wrap .signup-form label,.buddypress-wrap .signup-form legend{font-weight:400}body.no-js .buddypress #delete_inbox_messages,body.no-js .buddypress #delete_sentbox_messages,body.no-js .buddypress #message-type-select,body.no-js .buddypress #messages-bulk-management #select-all-messages,body.no-js .buddypress #notifications-bulk-management #select-all-notifications,body.no-js .buddypress label[for=message-type-select]{display:none}.buddypress-wrap .wp-editor-wrap .wp-editor-wrap button,.buddypress-wrap .wp-editor-wrap .wp-editor-wrap input[type=button],.buddypress-wrap .wp-editor-wrap .wp-editor-wrap input[type=submit],.buddypress-wrap .wp-editor-wrap a.button,.buddypress-wrap .wp-editor-wrap input[type=reset]{padding:0 8px 1px}.buddypress-wrap .select-wrap{border:1px solid #eee}.buddypress-wrap .select-wrap label{display:inline}.buddypress-wrap .select-wrap select::-ms-expand{display:none}.buddypress-wrap .select-wrap select{-moz-appearance:none;-webkit-appearance:none;-o-appearance:none;appearance:none;border:0;cursor:pointer;margin-right:-25px;padding:6px 25px 6px 10px;position:relative;text-indent:-2px;z-index:1;width:100%}.buddypress-wrap .select-wrap select,.buddypress-wrap .select-wrap select:active,.buddypress-wrap .select-wrap select:focus{background:0 0}.buddypress-wrap .select-wrap span.select-arrow{display:inline-block;position:relative;z-index:0}.buddypress-wrap .select-wrap span.select-arrow:before{color:#ccc;content:"\25BC"}.buddypress-wrap .select-wrap:focus .select-arrow:before,.buddypress-wrap .select-wrap:hover .select-arrow:before{color:#a6a6a6}.buddypress-wrap .bp-search form:focus,.buddypress-wrap .bp-search form:hover,.buddypress-wrap .select-wrap:focus,.buddypress-wrap .select-wrap:hover{border:1px solid #d5d4d4;box-shadow:inset 0 0 3px #eee}@media screen and (min-width:32em){.buddypress-wrap .notifications-options-nav .select-wrap{float:left}}.buddypress-wrap .bp-dir-search-form,.buddypress-wrap .bp-messages-search-form:after,.buddypress-wrap .bp-messages-search-form:before{content:" ";display:table}.buddypress-wrap .bp-dir-search-form,.buddypress-wrap .bp-messages-search-form:after{clear:both}.buddypress-wrap form.bp-dir-search-form,.buddypress-wrap form.bp-invites-search-form,.buddypress-wrap form.bp-messages-search-form{border:1px solid #eee;width:100%}@media screen and (min-width:55em){.buddypress-wrap form.bp-dir-search-form,.buddypress-wrap form.bp-invites-search-form,.buddypress-wrap form.bp-messages-search-form{width:15em}}.buddypress-wrap form.bp-dir-search-form label,.buddypress-wrap form.bp-invites-search-form label,.buddypress-wrap form.bp-messages-search-form label{margin:0}.buddypress-wrap form.bp-dir-search-form button[type=submit],.buddypress-wrap form.bp-dir-search-form input[type=search],.buddypress-wrap form.bp-dir-search-form input[type=text],.buddypress-wrap form.bp-invites-search-form button[type=submit],.buddypress-wrap form.bp-invites-search-form input[type=search],.buddypress-wrap form.bp-invites-search-form input[type=text],.buddypress-wrap form.bp-messages-search-form button[type=submit],.buddypress-wrap form.bp-messages-search-form input[type=search],.buddypress-wrap form.bp-messages-search-form input[type=text]{background:0 0;border:0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;border-radius:0;background-clip:padding-box}.buddypress-wrap form.bp-dir-search-form input[type=search],.buddypress-wrap form.bp-dir-search-form input[type=text],.buddypress-wrap form.bp-invites-search-form input[type=search],.buddypress-wrap form.bp-invites-search-form input[type=text],.buddypress-wrap form.bp-messages-search-form input[type=search],.buddypress-wrap form.bp-messages-search-form input[type=text]{float:left;line-height:1.5;padding:3px 10px;width:80%}.buddypress-wrap form.bp-dir-search-form button[type=submit],.buddypress-wrap form.bp-invites-search-form button[type=submit],.buddypress-wrap form.bp-messages-search-form button[type=submit]{float:right;font-size:inherit;font-weight:400;line-height:1.5;padding:3px .7em;text-align:center;text-transform:none;width:20%}.buddypress-wrap form.bp-dir-search-form button[type=submit] span,.buddypress-wrap form.bp-invites-search-form button[type=submit] span,.buddypress-wrap form.bp-messages-search-form button[type=submit] span{font-family:dashicons;font-size:18px;line-height:1.6}.buddypress-wrap form.bp-dir-search-form button[type=submit].bp-show,.buddypress-wrap form.bp-invites-search-form button[type=submit].bp-show,.buddypress-wrap form.bp-messages-search-form button[type=submit].bp-show{height:auto;left:0;overflow:visible;position:static;top:0}.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-cancel-button,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-cancel-button,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-cancel-button{-webkit-appearance:searchfield-cancel-button}.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-results-decoration,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-results-decoration,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-results-decoration{display:none}.buddypress-wrap ul.filters li form label input{line-height:1.4;padding:.1em .7em}.buddypress-wrap .current-member-type{font-style:italic}.buddypress-wrap .dir-form{clear:both}.budypress.no-js form.bp-dir-search-form button[type=submit]{height:auto;left:0;overflow:visible;position:static;top:0}.bp-user [data-bp-search] form input[type=search],.bp-user [data-bp-search] form input[type=text]{padding:6px 10px 7px}.buddypress-wrap .bp-tables-user,.buddypress-wrap table.forum,.buddypress-wrap table.wp-profile-fields{width:100%}.buddypress-wrap .bp-tables-user thead tr,.buddypress-wrap table.forum thead tr,.buddypress-wrap table.wp-profile-fields thead tr{background:0 0;border-bottom:2px solid #ccc}.buddypress-wrap .bp-tables-user tbody tr,.buddypress-wrap table.forum tbody tr,.buddypress-wrap table.wp-profile-fields tbody tr{background:#fafafa}.buddypress-wrap .bp-tables-user tr td,.buddypress-wrap .bp-tables-user tr th,.buddypress-wrap table.forum tr td,.buddypress-wrap table.forum tr th,.buddypress-wrap table.wp-profile-fields tr td,.buddypress-wrap table.wp-profile-fields tr th{padding:.5em;vertical-align:middle}.buddypress-wrap .bp-tables-user tr td.label,.buddypress-wrap table.forum tr td.label,.buddypress-wrap table.wp-profile-fields tr td.label{border-right:1px solid #eaeaea;font-weight:600;width:25%}.buddypress-wrap .bp-tables-user tr.alt td,.buddypress-wrap table.wp-profile-fields tr.alt td{background:#fafafa}.buddypress-wrap table.profile-fields .data{padding:.5em 1em}.buddypress-wrap table.profile-fields tr:last-child{border-bottom:none}.buddypress-wrap table.notifications td{padding:1em .5em}.buddypress-wrap table.notifications .bulk-select-all,.buddypress-wrap table.notifications .bulk-select-check{width:7%}.buddypress-wrap table.notifications .bulk-select-check{vertical-align:middle}.buddypress-wrap table.notifications .date,.buddypress-wrap table.notifications .notification-description,.buddypress-wrap table.notifications .notification-since,.buddypress-wrap table.notifications .title{width:39%}.buddypress-wrap table.notifications .actions,.buddypress-wrap table.notifications .notification-actions{width:15%}.buddypress-wrap table.notification-settings th.title,.buddypress-wrap table.profile-settings th.title{width:80%}.buddypress-wrap table.notifications .notification-actions a.delete,.buddypress-wrap table.notifications .notification-actions a.mark-read{display:inline-block}.buddypress-wrap table.notification-settings{margin-bottom:15px;text-align:left}.buddypress-wrap #groups-notification-settings{margin-bottom:0}.buddypress-wrap table.notification-settings td:first-child,.buddypress-wrap table.notification-settings th.icon,.buddypress-wrap table.notifications td:first-child,.buddypress-wrap table.notifications th.icon{display:none}.buddypress-wrap table.notification-settings .no,.buddypress-wrap table.notification-settings .yes{text-align:center;width:40px;vertical-align:middle}.buddypress-wrap table#message-threads{clear:both}.buddypress-wrap table#message-threads .thread-info{min-width:40%}.buddypress-wrap table#message-threads .thread-info p{margin:0}.buddypress-wrap table#message-threads .thread-info p.thread-excerpt{color:#737373;font-size:12px;margin-top:3px}.buddypress-wrap table.profile-fields{margin-bottom:20px}.buddypress-wrap table.profile-fields:last-child{margin-bottom:0}.buddypress-wrap table.profile-fields p{margin:0}.buddypress-wrap table.profile-fields p:last-child{margin-top:0}.bp-screen-reader-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.center-vert{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center}.bp-hide{display:none}.bp-show{height:auto;left:0;overflow:visible;position:static;top:0}.buddypress .buddypress-wrap .activity-read-more a,.buddypress .buddypress-wrap .comment-reply-link,.buddypress .buddypress-wrap .generic-button a,.buddypress .buddypress-wrap a.bp-title-button,.buddypress .buddypress-wrap a.button,.buddypress .buddypress-wrap button,.buddypress .buddypress-wrap input[type=button],.buddypress .buddypress-wrap input[type=reset],.buddypress .buddypress-wrap input[type=submit],.buddypress .buddypress-wrap ul.button-nav:not(.button-tabs) li a{background:#fff;border-color:#ccc;border-style:solid;border-width:1px;color:#555;cursor:pointer;font-size:inherit;font-weight:400;outline:0;padding:.3em .5em;text-align:center;text-decoration:none;width:auto}.buddypress .buddypress-wrap .button-small[type=button]{padding:0 8px 1px}.buddypress .buddypress-wrap .activity-read-more a:focus,.buddypress .buddypress-wrap .activity-read-more a:hover,.buddypress .buddypress-wrap .button-nav li a:focus,.buddypress .buddypress-wrap .button-nav li a:hover,.buddypress .buddypress-wrap .button-nav li.current a,.buddypress .buddypress-wrap .comment-reply-link:focus,.buddypress .buddypress-wrap .comment-reply-link:hover,.buddypress .buddypress-wrap .generic-button a:focus,.buddypress .buddypress-wrap .generic-button a:hover,.buddypress .buddypress-wrap a.button:focus,.buddypress .buddypress-wrap a.button:hover,.buddypress .buddypress-wrap button:focus,.buddypress .buddypress-wrap button:hover,.buddypress .buddypress-wrap input[type=button]:focus,.buddypress .buddypress-wrap input[type=button]:hover,.buddypress .buddypress-wrap input[type=reset]:focus,.buddypress .buddypress-wrap input[type=reset]:hover,.buddypress .buddypress-wrap input[type=submit]:focus,.buddypress .buddypress-wrap input[type=submit]:hover{background:#ededed;border-color:#999;color:#333;outline:0;text-decoration:none}.buddypress .buddypress-wrap a.disabled,.buddypress .buddypress-wrap button.disabled,.buddypress .buddypress-wrap button.pending,.buddypress .buddypress-wrap div.pending a,.buddypress .buddypress-wrap input[type=button].disabled,.buddypress .buddypress-wrap input[type=button].pending,.buddypress .buddypress-wrap input[type=reset].disabled,.buddypress .buddypress-wrap input[type=reset].pending,.buddypress .buddypress-wrap input[type=submit].pending,.buddypress .buddypress-wrap input[type=submit][disabled=disabled]{border-color:#eee;color:#767676;cursor:default}.buddypress .buddypress-wrap a.disabled:hover,.buddypress .buddypress-wrap button.disabled:hover,.buddypress .buddypress-wrap button.pending:hover,.buddypress .buddypress-wrap div.pending a:hover,.buddypress .buddypress-wrap input[type=button]:hover.disabled,.buddypress .buddypress-wrap input[type=button]:hover.pending,.buddypress .buddypress-wrap input[type=reset]:hover.disabled,.buddypress .buddypress-wrap input[type=reset]:hover.pending,.buddypress .buddypress-wrap input[type=submit]:hover.disabled,.buddypress .buddypress-wrap input[type=submit]:hover.pending{border-color:#eee;color:#767676}.buddypress .buddypress-wrap button.text-button,.buddypress .buddypress-wrap input.text-button{background:0 0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#767676}.buddypress .buddypress-wrap button.text-button.small,.buddypress .buddypress-wrap input.text-button.small{font-size:13px}.buddypress .buddypress-wrap button.text-button:focus,.buddypress .buddypress-wrap button.text-button:hover,.buddypress .buddypress-wrap input.text-button:focus,.buddypress .buddypress-wrap input.text-button:hover{background:0 0;text-decoration:underline}.buddypress .buddypress-wrap .activity-list a.button{border:none}.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.invite-button:hover{color:#1fb3dd}.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.group-remove-invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li.selected a.group-remove-invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li.selected a.invite-button:hover{color:#a00}.buddypress .buddypress-wrap #item-buttons:empty{display:none}.buddypress .buddypress-wrap input:disabled:focus,.buddypress .buddypress-wrap input:disabled:hover{background:0 0}.buddypress .buddypress-wrap .text-links-list a.button{background:0 0;border:none;border-right:1px solid #eee;color:#737373;display:inline-block;padding:.3em 1em}.buddypress .buddypress-wrap .text-links-list a.button:visited{color:#d6d6d6}.buddypress .buddypress-wrap .text-links-list a.button:focus,.buddypress .buddypress-wrap .text-links-list a.button:hover{color:#5087e5}.buddypress .buddypress-wrap .text-links-list a:first-child{padding-left:0}.buddypress .buddypress-wrap .text-links-list a:last-child{border-right:none}.buddypress .buddypress-wrap .bp-list.grid .action a,.buddypress .buddypress-wrap .bp-list.grid .action button{border:1px solid #ccc;display:block;margin:0}.buddypress .buddypress-wrap .bp-list.grid .action a:focus,.buddypress .buddypress-wrap .bp-list.grid .action a:hover,.buddypress .buddypress-wrap .bp-list.grid .action button:focus,.buddypress .buddypress-wrap .bp-list.grid .action button:hover{background:#ededed}.buddypress #buddypress .create-button{background:0 0;text-align:center}@media screen and (min-width:46.8em){.buddypress #buddypress .create-button{float:right}}.buddypress #buddypress .create-button a{border:1px solid #ccc;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;background-clip:padding-box;-webkit-box-shadow:inset 0 0 6px 0 #eaeaea;-moz-box-shadow:inset 0 0 6px 0 #eaeaea;box-shadow:inset 0 0 6px 0 #eaeaea;margin:.2em 0;width:auto}.buddypress #buddypress .create-button a:focus,.buddypress #buddypress .create-button a:hover{background:0 0;border-color:#ccc;-webkit-box-shadow:inset 0 0 12px 0 #eaeaea;-moz-box-shadow:inset 0 0 12px 0 #eaeaea;box-shadow:inset 0 0 12px 0 #eaeaea}@media screen and (min-width:46.8em){.buddypress #buddypress.bp-dir-vert-nav .create-button{float:none;padding-top:2em}.buddypress #buddypress.bp-dir-vert-nav .create-button a{margin-right:.5em}}.buddypress #buddypress.bp-dir-hori-nav .create-button{float:left}.buddypress #buddypress.bp-dir-hori-nav .create-button a,.buddypress #buddypress.bp-dir-hori-nav .create-button a:hover{background:0 0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;margin:0}.buddypress-wrap button.ac-reply-cancel,.buddypress-wrap button.bp-icons{background:0 0;border:0}.buddypress-wrap button.bp-icons:focus,.buddypress-wrap button.bp-icons:hover{background:0 0}.buddypress-wrap button.ac-reply-cancel:focus,.buddypress-wrap button.ac-reply-cancel:hover{background:0 0;text-decoration:underline}.buddypress-wrap .bp-invites-content li .invite-button span.icons:before,.buddypress-wrap .bp-invites-filters .invite-button span.icons:before,.buddypress-wrap .bp-messages-filters li a.messages-button:before,.buddypress-wrap .feed a:before,.buddypress-wrap .filter label:before{font-family:dashicons;font-size:18px}.buddypress-wrap .bp-invites-content .item-list li .invite-button span.icons:before{font-size:27px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-invites-content .item-list li .invite-button span.icons:before{font-size:32px}}.buddypress-wrap .bp-list a.button.invite-button:focus,.buddypress-wrap .bp-list a.button.invite-button:hover{background:0 0}.buddypress-wrap .filter label:before{content:"\f536"}.buddypress-wrap div.feed a:before,.buddypress-wrap li.feed a:before{content:"\f303"}.buddypress-wrap ul.item-list li .invite-button:not(.group-remove-invite-button) span.icons:before{content:"\f502"}.buddypress-wrap ul.item-list li .group-remove-invite-button span.icons:before,.buddypress-wrap ul.item-list li.selected .invite-button span.icons:before{content:"\f153"}.buddypress-wrap .bp-invites-filters ul li #bp-invites-next-page:before,.buddypress-wrap .bp-messages-filters ul li #bp-messages-next-page:before{content:"\f345"}.buddypress-wrap .bp-invites-filters ul li #bp-invites-prev-page:before,.buddypress-wrap .bp-messages-filters ul li #bp-messages-prev-page:before{content:"\f341"}.buddypress-wrap .warn{color:#b71717}.buddypress-wrap .bp-messages{border:1px solid #ccc;margin:0 0 15px}.buddypress-wrap .bp-messages .sitewide-notices{display:block;margin:5px;padding:.5em}.buddypress-wrap .bp-messages.info{margin-bottom:0}.buddypress-wrap .bp-messages.updated{clear:both;display:block}.buddypress-wrap .bp-messages.bp-user-messages-feedback{border:0}.buddypress-wrap #group-create-body .bp-cover-image-status p.warning{background:#0b80a4;border:0;-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.2);-moz-box-shadow:0 0 3px 0 rgba(0,0,0,.2);box-shadow:0 0 3px 0 rgba(0,0,0,.2);color:#fff}.buddypress-wrap .bp-feedback:not(.custom-homepage-info){display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-align:stretch;-webkit-align-items:stretch;-webkit-box-align:stretch;align-items:stretch}.buddypress-wrap .bp-feedback{background:#fff;color:#807f7f;-webkit-box-shadow:0 1px 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px 1px rgba(0,0,0,.1);color:#737373;margin:10px 0;position:relative}.buddypress-wrap .bp-feedback p{margin:0}.buddypress-wrap .bp-feedback span.bp-icon{color:#fff;display:block;font-family:dashicons;left:0;margin-right:10px;position:relative;padding:0 .5em}.buddypress-wrap .bp-feedback .bp-help-text{font-style:italic}.buddypress-wrap .bp-feedback .text{font-size:14px;margin:0;padding:.5em 0}.buddypress-wrap .bp-feedback.no-icon{padding:.5em}.buddypress-wrap .bp-feedback.small:before{line-height:inherit}.buddypress-wrap a[data-bp-close] span:before,.buddypress-wrap button[data-bp-close] span:before{font-size:32px}.buddypress-wrap a[data-bp-close],.buddypress-wrap button[data-bp-close]{border:0;position:absolute;top:10px;right:10px;width:32px}.buddypress-wrap .bp-feedback.no-icon a[data-bp-close],.buddypress-wrap .bp-feedback.no-icon button[data-bp-close]{top:-6px;right:6px}.buddypress-wrap button[data-bp-close]:hover{background-color:transparent}.buddypress-wrap .bp-feedback p{margin:0}.buddypress-wrap .bp-feedback .bp-icon{font-size:20px;padding:0 2px}.buddypress-wrap .bp-feedback.error .bp-icon,.buddypress-wrap .bp-feedback.help .bp-icon,.buddypress-wrap .bp-feedback.info .bp-icon,.buddypress-wrap .bp-feedback.loading .bp-icon,.buddypress-wrap .bp-feedback.success .bp-icon,.buddypress-wrap .bp-feedback.warning .bp-icon{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center}.buddypress-wrap .bp-feedback.help .bp-icon,.buddypress-wrap .bp-feedback.info .bp-icon{background-color:#0b80a4}.buddypress-wrap .bp-feedback.help .bp-icon:before,.buddypress-wrap .bp-feedback.info .bp-icon:before{content:"\f348"}.buddypress-wrap .bp-feedback.error .bp-icon,.buddypress-wrap .bp-feedback.warning .bp-icon{background-color:#d33}.buddypress-wrap .bp-feedback.error .bp-icon:before,.buddypress-wrap .bp-feedback.warning .bp-icon:before{content:"\f534"}.buddypress-wrap .bp-feedback.loading .bp-icon{background-color:#ffd087}.buddypress-wrap .bp-feedback.loading .bp-icon:before{content:"\f469"}.buddypress-wrap .bp-feedback.success .bp-icon{background-color:#8a2}.buddypress-wrap .bp-feedback.success .bp-icon:before{content:"\f147"}.buddypress-wrap .bp-feedback.help .bp-icon:before{content:"\f468"}.buddypress-wrap #pass-strength-result{background-color:#eee;border-color:#ddd;border-style:solid;border-width:1px;display:none;font-weight:700;margin:10px 0 10px 0;padding:.5em;text-align:center;width:auto}.buddypress-wrap #pass-strength-result.show{display:block}.buddypress-wrap #pass-strength-result.mismatch{background-color:#333;border-color:transparent;color:#fff}.buddypress-wrap #pass-strength-result.bad,.buddypress-wrap #pass-strength-result.error{background-color:#ffb78c;border-color:#ff853c;color:#fff}.buddypress-wrap #pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040;color:#fff}.buddypress-wrap #pass-strength-result.strong{background-color:#66d66e;border-color:#438c48;color:#fff}.buddypress-wrap .standard-form#signup_form div div.error{background:#faa;color:#a00;margin:0 0 10px 0;padding:.5em;width:90%}.buddypress-wrap .accept,.buddypress-wrap .reject{float:left;margin-left:10px}.buddypress-wrap .members-list.grid .bp-ajax-message{background:rgba(255,255,255,.9);border:1px solid #eee;font-size:14px;left:2%;position:absolute;padding:.5em 1em;right:2%;top:30px}.buddypress.widget .item-options{font-size:14px}.buddypress.widget ul.item-list{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:column nowrap;-moz-flex-flow:column nowrap;-ms-flex-flow:column nowrap;-o-flex-flow:column nowrap;flex-flow:column nowrap;list-style:none;margin:10px -2%;overflow:hidden}@media screen and (min-width:32em){.buddypress.widget ul.item-list{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row wrap;-moz-flex-flow:row wrap;-ms-flex-flow:row wrap;-o-flex-flow:row wrap;flex-flow:row wrap}}.buddypress.widget ul.item-list li{border:1px solid #eee;-ms-flex-align:stretch;-webkit-align-items:stretch;-webkit-box-align:stretch;align-items:stretch;-webkit-flex:1 1 46%;-moz-flex:1 1 46%;-ms-flex:1 1 46%;-o-flex:1 1 46%;flex:1 1 46%;margin:2%}@media screen and (min-width:75em){.buddypress.widget ul.item-list li{-webkit-flex:0 1 20%;-moz-flex:0 1 20%;-ms-flex:0 1 20%;-o-flex:0 1 20%;flex:0 1 20%}}.buddypress.widget ul.item-list li .item-avatar{padding:.5em;text-align:center}.buddypress.widget ul.item-list li .item-avatar .avatar{width:60%}.buddypress.widget ul.item-list li .item{padding:0 .5em .5em}.buddypress.widget ul.item-list li .item .item-meta{font-size:12px;overflow-wrap:break-word}.widget-area .buddypress.widget ul.item-list li{-webkit-flex:0 1 46%;-moz-flex:0 1 46%;-ms-flex:0 1 46%;-o-flex:0 1 46%;flex:0 1 46%;margin:2% 2% 10px}@media screen and (min-width:75em){.widget-area .buddypress.widget ul.item-list li .avatar{width:100%}}@media screen and (min-width:75em){.widget-area .buddypress.widget ul.item-list{margin:10px -2%;width:100%}.widget-area .buddypress.widget ul.item-list li{-webkit-flex:0 1 auto;-moz-flex:0 1 auto;-ms-flex:0 1 auto;-o-flex:0 1 auto;flex:0 1 auto;margin:10px 2% 1%;width:46%}}#buddypress-wrap *{transition:opacity .1s ease-in-out .1s}#buddypress-wrap a.button,#buddypress-wrap a.generic-button,#buddypress-wrap button,#buddypress-wrap input[type=reset],#buddypress-wrap input[type=submit]{transition:background .1s ease-in-out .1s,color .1s ease-in-out .1s,border-color .1s ease-in-out .1s}.buddypress-wrap a.loading,.buddypress-wrap input.loading{-moz-animation:loader-pulsate .5s infinite ease-in-out alternate;-webkit-animation:loader-pulsate .5s infinite ease-in-out alternate;animation:loader-pulsate .5s infinite ease-in-out alternate;border-color:#aaa}@-webkit-keyframes loader-pulsate{from{border-color:#aaa;-webkit-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-webkit-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}@-moz-keyframes loader-pulsate{from{border-color:#aaa;-moz-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-moz-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}@keyframes loader-pulsate{from{border-color:#aaa;-moz-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-moz-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}.buddypress-wrap a.loading:hover,.buddypress-wrap input.loading:hover{color:#777}[data-bp-tooltip]{position:relative}[data-bp-tooltip]:after{background-color:#fff;display:none;opacity:0;position:absolute;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden}[data-bp-tooltip]:after{border:1px solid #737373;border-radius:1px;box-shadow:4px 4px 8px rgba(0,0,0,.2);color:#333;content:attr(data-bp-tooltip);font-family:"Helvetica Neue",helvetica,arial,san-serif;font-size:12px;font-weight:400;letter-spacing:normal;line-height:1.25;max-width:200px;padding:5px 8px;pointer-events:none;text-shadow:none;text-transform:none;-webkit-transition:all 1.5s ease;-ms-transition:all 1.5s ease;transition:all 1.5s ease;white-space:nowrap;word-wrap:break-word;z-index:100000}[data-bp-tooltip]:active:after,[data-bp-tooltip]:focus:after,[data-bp-tooltip]:hover:after{display:block;opacity:1;overflow:visible;visibility:visible}[data-bp-tooltip=""]{display:none;opacity:0;visibility:hidden}.bp-tooltip:after{left:50%;margin-top:7px;top:110%;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}.user-list .bp-tooltip:after{left:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}@media screen and (min-width:46.8em){.user-list .bp-tooltip:after{left:auto;right:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}}.activity-meta-action .bp-tooltip:after,.notification-actions .bp-tooltip:after,.participants-list .bp-tooltip:after{left:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.bp-invites-content .bp-tooltip:after{left:auto;right:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}#item-body,.single-screen-navs{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.grid>li,.grid>li .generic-button a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.grid>li{border-bottom:0;padding-bottom:10px;padding-top:0}.grid>li .list-wrap{background:#fafafa;border:1px solid #eee;padding-bottom:15px;position:relative;overflow:hidden;padding-top:14px}.grid>li .list-wrap .list-title{padding:.5em}.grid>li .list-wrap .update{color:#737373;padding:.5em 2em}.grid>li .item-avatar{text-align:center}.grid>li .item-avatar .avatar{border-radius:50%;display:inline-block;width:50%}@media screen and (min-width:24em){.grid.members-list .list-wrap{min-height:340px}.grid.members-list .list-wrap .item-block{margin:0 auto;min-height:7rem}.grid.members-group-list .list-wrap .item-block{margin:0 auto;min-height:7rem}.grid.groups-list .list-wrap{min-height:470px}.grid.groups-list .list-wrap .item-block{min-height:6rem}.grid.groups-list .list-wrap .group-desc{margin:15px auto 0;min-height:5em;overflow:hidden}.grid.groups-list .list-wrap .group-details,.grid.groups-list .list-wrap .item-desc,.grid.groups-list .list-wrap .last-activity{margin-bottom:0}.grid.groups-list .list-wrap .group-details p,.grid.groups-list .list-wrap .item-desc p,.grid.groups-list .list-wrap .last-activity p{margin-bottom:0}.grid.blogs-list .list-wrap{min-height:350px}.grid.blogs-list .list-wrap .item-block{margin:0 auto;min-height:7rem}}@media screen and (min-width:24em){.grid>li.item-entry{float:left;margin:0}.grid.two>li{padding-bottom:20px}}@media screen and (min-width:24em) and (min-width:75em){.grid.two>li .list-wrap{max-width:500px;margin:0 auto}}@media screen and (min-width:24em){.grid.three>li,.grid.two>li{width:50%}.grid.three>li:nth-child(odd),.grid.two>li:nth-child(odd){padding-right:10px}.grid.three>li:nth-child(even),.grid.two>li:nth-child(even){padding-left:10px}.grid.three>li .item,.grid.two>li .item{margin:1rem auto 0;width:80%}.grid.three>li .item .item-title,.grid.two>li .item .item-title{width:auto}}@media screen and (min-width:46.8em){.grid.three>li{padding-top:0;width:33.333333%;width:calc(100% / 3)}.grid.three>li:nth-child(1n+1){padding-left:5px;padding-right:5px}.grid.three>li:nth-child(3n+3){padding-left:5px;padding-right:0}.grid.three>li:nth-child(3n+1){padding-left:0;padding-right:5px}}@media screen and (min-width:46.8em){.grid.four>li{width:25%}.grid.four>li:nth-child(1n+1){padding-left:5px;padding-right:5px}.grid.four>li:nth-child(4n+4){padding-left:5px;padding-right:0}.grid.four>li:nth-child(4n+1){padding-left:0;padding-right:5px}}.buddypress-wrap .grid.bp-list{padding-top:1em}.buddypress-wrap .grid.bp-list>li{border-bottom:none}.buddypress-wrap .grid.bp-list>li .list-wrap{padding-bottom:3em}.buddypress-wrap .grid.bp-list>li .item-avatar{margin:0;text-align:center;width:auto}.buddypress-wrap .grid.bp-list>li .item-avatar img.avatar{display:inline-block;height:auto;width:50%}.buddypress-wrap .grid.bp-list>li .item-meta,.buddypress-wrap .grid.bp-list>li .list-title{float:none;text-align:center}.buddypress-wrap .grid.bp-list>li .list-title{font-size:inherit;line-height:1.1}.buddypress-wrap .grid.bp-list>li .item{font-size:18px;left:0;margin:0 auto;text-align:center;width:96%}@media screen and (min-width:46.8em){.buddypress-wrap .grid.bp-list>li .item{font-size:22px}}.buddypress-wrap .grid.bp-list>li .item .group-desc,.buddypress-wrap .grid.bp-list>li .item .item-block{float:none;width:96%}.buddypress-wrap .grid.bp-list>li .item .item-block{margin-bottom:10px}.buddypress-wrap .grid.bp-list>li .item .last-activity{margin-top:5px}.buddypress-wrap .grid.bp-list>li .item .group-desc{clear:none}.buddypress-wrap .grid.bp-list>li .item .user-update{clear:both;text-align:left}.buddypress-wrap .grid.bp-list>li .item .activity-read-more a{display:inline}.buddypress-wrap .grid.bp-list>li .action{bottom:5px;float:none;height:auto;left:0;margin:0;padding:0 5px;position:absolute;text-align:center;top:auto;width:100%}.buddypress-wrap .grid.bp-list>li .action .generic-button{float:none;margin:5px 0 0;text-align:center;width:100%}.buddypress-wrap .grid.bp-list>li .action .generic-button a,.buddypress-wrap .grid.bp-list>li .action .generic-button button{width:100%}.buddypress-wrap .grid.bp-list>li .avatar,.buddypress-wrap .grid.bp-list>li .item,.buddypress-wrap .grid.bp-list>li .item-avatar{float:none}.buddypress-wrap .blogs-list.grid.two>li .blogs-title{min-height:5em}.buddypress-wrap .grid.four>li .group-desc,.buddypress-wrap .grid.three>li .group-desc{min-height:8em}.buddypress-wrap .blogs-list.grid.four>li,.buddypress-wrap .blogs-list.grid.three>li{min-height:350px}.buddypress-wrap .blogs-list.grid.four>li .last-activity,.buddypress-wrap .blogs-list.grid.three>li .last-activity{margin-bottom:0}.buddypress-wrap .blogs-list.grid.four>li .last-post,.buddypress-wrap .blogs-list.grid.three>li .last-post{margin-top:0}.buddypress:not(.logged-in) .grid.bp-list .list-wrap{padding-bottom:5px}.buddypress:not(.logged-in) .grid.groups-list .list-wrap{min-height:430px}.buddypress:not(.logged-in) .grid.members-list .list-wrap{min-height:300px}.buddypress:not(.logged-in) .grid.blogs-list .list-wrap{min-height:320px}@media screen and (min-width:46.8em){.bp-single-vert-nav .vertical{overflow:visible}.bp-single-vert-nav .vertical ul{border-right:1px solid #d6d6d6;float:left;margin-right:-1px;width:25%}.bp-single-vert-nav .vertical li{float:none}.bp-single-vert-nav .vertical li.selected a{background:#ccc;color:#333}.bp-single-vert-nav .vertical li:focus,.bp-single-vert-nav .vertical li:hover{background:#ccc}.bp-single-vert-nav .vertical li span{background:#d6d6d6;border-radius:10%;float:right;margin-right:2px}.bp-single-vert-nav .vertical li:hover span{border-color:#eaeaea}.bp-single-vert-nav .bp-wrap{margin-bottom:15px}.bp-single-vert-nav .bp-wrap .group-nav-tabs.groups-nav ul li,.bp-single-vert-nav .bp-wrap .user-nav-tabs.users-nav ul li{left:1px;position:relative}.bp-single-vert-nav .item-body:not(#group-create-body){background:#fff;border-left:1px solid #d6d6d6;float:right;margin:0;min-height:400px;padding:0 0 0 1em;width:calc(75% + 1px)}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links){background:#eaeaea;margin:0 0 0 -5px;width:auto}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li{font-size:16px;margin:10px 0}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a{border-right:1px solid #ccc;padding:0 .5em}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a:focus,.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a:hover{background:0 0}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li.current a{background:0 0;color:#333;text-decoration:underline}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li:last-child a{border:none}.bp-dir-vert-nav .dir-navs{float:left;left:1px;position:relative;width:20%}.bp-dir-vert-nav .dir-navs ul li{float:none;overflow:hidden;width:auto}.bp-dir-vert-nav .dir-navs ul li.selected{border:1px solid #eee}.bp-dir-vert-nav .dir-navs ul li.selected a{background:#555;color:#fff}.bp-dir-vert-nav .dir-navs ul li.selected a span{background:#eaeaea;border-color:#ccc;color:#5087e5}.bp-dir-vert-nav .dir-navs ul li a:focus,.bp-dir-vert-nav .dir-navs ul li a:hover{background:#ccc;color:#333}.bp-dir-vert-nav .dir-navs ul li a:focus span,.bp-dir-vert-nav .dir-navs ul li a:hover span{border:1px solid #555}.bp-dir-vert-nav .screen-content{border-left:1px solid #d6d6d6;margin-left:20%;overflow:hidden;padding:0 0 2em 1em}.bp-dir-vert-nav .screen-content .subnav-filters{margin-top:0}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li:not(.selected) a:hover{background:0 0}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected{background:0 0;border:1px solid #d6d6d6;border-right-color:#fff}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected a{background:0 0;color:#333;font-weight:600}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected a span{background:#555;border:1px solid #d6d6d6;color:#fff}}
|
bp-templates/bp-nouveau/includes/customizer-controls.php
CHANGED
@@ -36,7 +36,7 @@ class BP_Nouveau_Nav_Customize_Control extends WP_Customize_Control {
|
|
36 |
|
37 |
// It's a group
|
38 |
if ( 'group' === $this->type ) {
|
39 |
-
$guide = __( 'Customizing the Groups
|
40 |
|
41 |
// Try to fetch any random group:
|
42 |
$random = groups_get_groups(
|
36 |
|
37 |
// It's a group
|
38 |
if ( 'group' === $this->type ) {
|
39 |
+
$guide = __( 'Customizing the Groups navigation order needs you create at least one group first.', 'buddypress' );
|
40 |
|
41 |
// Try to fetch any random group:
|
42 |
$random = groups_get_groups(
|
bp-templates/bp-nouveau/includes/functions.php
CHANGED
@@ -993,7 +993,7 @@ function bp_nouveau_get_user_feedback( $feedback_id = '' ) {
|
|
993 |
),
|
994 |
'member-wp-profile-none' => array(
|
995 |
'type' => 'info',
|
996 |
-
'message' => __( '%s did not save any profile
|
997 |
),
|
998 |
'member-delete-account' => array(
|
999 |
'type' => 'warning',
|
993 |
),
|
994 |
'member-wp-profile-none' => array(
|
995 |
'type' => 'info',
|
996 |
+
'message' => __( '%s did not save any profile information yet.', 'buddypress' ),
|
997 |
),
|
998 |
'member-delete-account' => array(
|
999 |
'type' => 'warning',
|
bp-templates/bp-nouveau/includes/groups/functions.php
CHANGED
@@ -1102,7 +1102,7 @@ function bp_nouveau_groups_notification_filters() {
|
|
1102 |
),
|
1103 |
array(
|
1104 |
'id' => 'member_promoted_to_mod',
|
1105 |
-
'label' => __( 'Group
|
1106 |
'position' => 95,
|
1107 |
),
|
1108 |
array(
|
1102 |
),
|
1103 |
array(
|
1104 |
'id' => 'member_promoted_to_mod',
|
1105 |
+
'label' => __( 'Group Moderator promotions', 'buddypress' ),
|
1106 |
'position' => 95,
|
1107 |
),
|
1108 |
array(
|
bp-templates/bp-nouveau/includes/groups/template-tags.php
CHANGED
@@ -228,7 +228,7 @@ function bp_nouveau_group_creation_tabs() {
|
|
228 |
<?php echo (int) $counter; ?> <?php echo esc_html( $step['name'] ); ?>
|
229 |
</a>
|
230 |
<?php else : ?>
|
231 |
-
|
232 |
<?php endif ?>
|
233 |
</li>
|
234 |
<?php
|
228 |
<?php echo (int) $counter; ?> <?php echo esc_html( $step['name'] ); ?>
|
229 |
</a>
|
230 |
<?php else : ?>
|
231 |
+
<?php echo (int) $counter; ?>. <?php echo esc_html( $step['name'] ); ?>
|
232 |
<?php endif ?>
|
233 |
</li>
|
234 |
<?php
|
buddypress.pot
CHANGED
@@ -2,9 +2,9 @@
|
|
2 |
# This file is distributed under the GPLv2 or later (license.txt).
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
-
"Project-Id-Version: BuddyPress 3.0.0-
|
6 |
"Report-Msgid-Bugs-To: https://buddypress.trac.wordpress.org\n"
|
7 |
-
"POT-Creation-Date: 2018-04-
|
8 |
"MIME-Version: 1.0\n"
|
9 |
"Content-Type: text/plain; charset=utf-8\n"
|
10 |
"Content-Transfer-Encoding: 8bit\n"
|
@@ -3508,7 +3508,7 @@ msgid "You already have a pending friendship request with this user"
|
|
3508 |
msgstr ""
|
3509 |
|
3510 |
#: bp-friends/actions/remove-friend.php:33
|
3511 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
3512 |
msgid "Friendship could not be canceled."
|
3513 |
msgstr ""
|
3514 |
|
@@ -3603,7 +3603,7 @@ msgid "%d friends"
|
|
3603 |
msgstr ""
|
3604 |
|
3605 |
#: bp-friends/bp-friends-template.php:371
|
3606 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
3607 |
msgid "Cancel Friendship Request"
|
3608 |
msgstr ""
|
3609 |
|
@@ -3616,8 +3616,8 @@ msgid "Cancel Friendship"
|
|
3616 |
msgstr ""
|
3617 |
|
3618 |
#: bp-friends/bp-friends-template.php:419
|
3619 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
3620 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
3621 |
msgid "Add Friend"
|
3622 |
msgstr ""
|
3623 |
|
@@ -4339,13 +4339,13 @@ msgid ""
|
|
4339 |
msgstr ""
|
4340 |
|
4341 |
#: bp-groups/bp-groups-template.php:3277
|
4342 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
4343 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
4344 |
msgid "Leave Group"
|
4345 |
msgstr ""
|
4346 |
|
4347 |
#: bp-groups/bp-groups-template.php:3298
|
4348 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
4349 |
msgid "Join Group"
|
4350 |
msgstr ""
|
4351 |
|
@@ -4354,12 +4354,12 @@ msgid "Accept Invitation"
|
|
4354 |
msgstr ""
|
4355 |
|
4356 |
#: bp-groups/bp-groups-template.php:3331
|
4357 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
4358 |
msgid "Request Sent"
|
4359 |
msgstr ""
|
4360 |
|
4361 |
#: bp-groups/bp-groups-template.php:3346
|
4362 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
4363 |
msgid "Request Membership"
|
4364 |
msgstr ""
|
4365 |
|
@@ -6105,14 +6105,14 @@ msgstr ""
|
|
6105 |
#: bp-templates/bp-legacy/buddypress/activity/index.php:155
|
6106 |
#: bp-templates/bp-legacy/buddypress/groups/single/activity.php:12
|
6107 |
#: bp-templates/bp-nouveau/buddypress/common/search-and-filters-bar.php:14
|
6108 |
-
#: bp-templates/bp-nouveau/buddypress/groups/single/activity.php:
|
6109 |
msgid "RSS Feed"
|
6110 |
msgstr ""
|
6111 |
|
6112 |
#: bp-templates/bp-legacy/buddypress/activity/index.php:155
|
6113 |
#: bp-templates/bp-legacy/buddypress/groups/single/activity.php:12
|
6114 |
#: bp-templates/bp-nouveau/buddypress/common/search-and-filters-bar.php:14
|
6115 |
-
#: bp-templates/bp-nouveau/buddypress/groups/single/activity.php:
|
6116 |
msgid "RSS"
|
6117 |
msgstr ""
|
6118 |
|
@@ -6505,7 +6505,7 @@ msgstr ""
|
|
6505 |
|
6506 |
#: bp-templates/bp-legacy/buddypress/groups/create.php:378
|
6507 |
#: bp-templates/bp-legacy/buddypress/groups/single/invites-loop.php:74
|
6508 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
6509 |
msgid "Remove Invite"
|
6510 |
msgstr ""
|
6511 |
|
@@ -7231,7 +7231,7 @@ msgstr ""
|
|
7231 |
msgid "Visibility"
|
7232 |
msgstr ""
|
7233 |
|
7234 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:60 class-buddypress.php:
|
7235 |
msgid "BuddyPress Legacy"
|
7236 |
msgstr ""
|
7237 |
|
@@ -7294,59 +7294,59 @@ msgstr ""
|
|
7294 |
msgid "There was a problem when deleting. Please try again."
|
7295 |
msgstr ""
|
7296 |
|
7297 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
7298 |
msgid ""
|
7299 |
"%s has previously requested to join this group. Sending an invitation will "
|
7300 |
"automatically add the member to the group."
|
7301 |
msgstr ""
|
7302 |
|
7303 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
7304 |
#: bp-templates/bp-nouveau/includes/friends/ajax.php:104
|
7305 |
msgid "No member found by that ID."
|
7306 |
msgstr ""
|
7307 |
|
7308 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
7309 |
msgid " Friendship could not be requested."
|
7310 |
msgstr ""
|
7311 |
|
7312 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
7313 |
#: bp-templates/bp-nouveau/includes/friends/ajax.php:206
|
7314 |
msgid "Friendship request could not be cancelled."
|
7315 |
msgstr ""
|
7316 |
|
7317 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
7318 |
#: bp-templates/bp-nouveau/includes/friends/ajax.php:216
|
7319 |
msgid "Request Pending"
|
7320 |
msgstr ""
|
7321 |
|
7322 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
7323 |
#: bp-templates/bp-nouveau/includes/friends/ajax.php:117
|
7324 |
msgid "There was a problem accepting that request. Please try again."
|
7325 |
msgstr ""
|
7326 |
|
7327 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
7328 |
#: bp-templates/bp-nouveau/includes/friends/ajax.php:141
|
7329 |
msgid "There was a problem rejecting that request. Please try again."
|
7330 |
msgstr ""
|
7331 |
|
7332 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
7333 |
msgid "Error joining group"
|
7334 |
msgstr ""
|
7335 |
|
7336 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
7337 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
7338 |
msgid "Error requesting membership"
|
7339 |
msgstr ""
|
7340 |
|
7341 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
7342 |
msgid "Error leaving group"
|
7343 |
msgstr ""
|
7344 |
|
7345 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
7346 |
msgid "There was a problem closing the notice."
|
7347 |
msgstr ""
|
7348 |
|
7349 |
-
#: bp-templates/bp-legacy/buddypress-functions.php:
|
7350 |
msgid "There was a problem sending that reply. Please try again."
|
7351 |
msgstr ""
|
7352 |
|
@@ -7552,7 +7552,7 @@ msgid "Messages menu"
|
|
7552 |
msgstr ""
|
7553 |
|
7554 |
#: bp-templates/bp-nouveau/buddypress/members/single/notifications.php:9
|
7555 |
-
msgid "
|
7556 |
msgstr ""
|
7557 |
|
7558 |
#: bp-templates/bp-nouveau/buddypress/members/single/parts/item-nav.php:9
|
@@ -7747,7 +7747,7 @@ msgstr ""
|
|
7747 |
|
7748 |
#: bp-templates/bp-nouveau/includes/customizer-controls.php:39
|
7749 |
msgid ""
|
7750 |
-
"Customizing the Groups
|
7751 |
"first."
|
7752 |
msgstr ""
|
7753 |
|
@@ -7994,7 +7994,7 @@ msgid "Loading the members of your community, please wait."
|
|
7994 |
msgstr ""
|
7995 |
|
7996 |
#: bp-templates/bp-nouveau/includes/functions.php:996
|
7997 |
-
msgid "%s did not save any profile
|
7998 |
msgstr ""
|
7999 |
|
8000 |
#: bp-templates/bp-nouveau/includes/functions.php:1000
|
@@ -8256,7 +8256,7 @@ msgid "Group Admin promotions"
|
|
8256 |
msgstr ""
|
8257 |
|
8258 |
#: bp-templates/bp-nouveau/includes/groups/functions.php:1105
|
8259 |
-
msgid "Group
|
8260 |
msgstr ""
|
8261 |
|
8262 |
#: bp-templates/bp-nouveau/includes/groups/functions.php:1110
|
@@ -8821,7 +8821,7 @@ msgstr ""
|
|
8821 |
msgid "Cheatin’ huh?"
|
8822 |
msgstr ""
|
8823 |
|
8824 |
-
#: class-buddypress.php:
|
8825 |
msgid "BuddyPress Nouveau"
|
8826 |
msgstr ""
|
8827 |
|
2 |
# This file is distributed under the GPLv2 or later (license.txt).
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
+
"Project-Id-Version: BuddyPress 3.0.0-beta2\n"
|
6 |
"Report-Msgid-Bugs-To: https://buddypress.trac.wordpress.org\n"
|
7 |
+
"POT-Creation-Date: 2018-04-17 15:57:46+00:00\n"
|
8 |
"MIME-Version: 1.0\n"
|
9 |
"Content-Type: text/plain; charset=utf-8\n"
|
10 |
"Content-Transfer-Encoding: 8bit\n"
|
3508 |
msgstr ""
|
3509 |
|
3510 |
#: bp-friends/actions/remove-friend.php:33
|
3511 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1419
|
3512 |
msgid "Friendship could not be canceled."
|
3513 |
msgstr ""
|
3514 |
|
3603 |
msgstr ""
|
3604 |
|
3605 |
#: bp-friends/bp-friends-template.php:371
|
3606 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1431
|
3607 |
msgid "Cancel Friendship Request"
|
3608 |
msgstr ""
|
3609 |
|
3616 |
msgstr ""
|
3617 |
|
3618 |
#: bp-friends/bp-friends-template.php:419
|
3619 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1421
|
3620 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1439
|
3621 |
msgid "Add Friend"
|
3622 |
msgstr ""
|
3623 |
|
4339 |
msgstr ""
|
4340 |
|
4341 |
#: bp-groups/bp-groups-template.php:3277
|
4342 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1520
|
4343 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1533
|
4344 |
msgid "Leave Group"
|
4345 |
msgstr ""
|
4346 |
|
4347 |
#: bp-groups/bp-groups-template.php:3298
|
4348 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1554
|
4349 |
msgid "Join Group"
|
4350 |
msgstr ""
|
4351 |
|
4354 |
msgstr ""
|
4355 |
|
4356 |
#: bp-groups/bp-groups-template.php:3331
|
4357 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1543
|
4358 |
msgid "Request Sent"
|
4359 |
msgstr ""
|
4360 |
|
4361 |
#: bp-groups/bp-groups-template.php:3346
|
4362 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1556
|
4363 |
msgid "Request Membership"
|
4364 |
msgstr ""
|
4365 |
|
6105 |
#: bp-templates/bp-legacy/buddypress/activity/index.php:155
|
6106 |
#: bp-templates/bp-legacy/buddypress/groups/single/activity.php:12
|
6107 |
#: bp-templates/bp-nouveau/buddypress/common/search-and-filters-bar.php:14
|
6108 |
+
#: bp-templates/bp-nouveau/buddypress/groups/single/activity.php:17
|
6109 |
msgid "RSS Feed"
|
6110 |
msgstr ""
|
6111 |
|
6112 |
#: bp-templates/bp-legacy/buddypress/activity/index.php:155
|
6113 |
#: bp-templates/bp-legacy/buddypress/groups/single/activity.php:12
|
6114 |
#: bp-templates/bp-nouveau/buddypress/common/search-and-filters-bar.php:14
|
6115 |
+
#: bp-templates/bp-nouveau/buddypress/groups/single/activity.php:17
|
6116 |
msgid "RSS"
|
6117 |
msgstr ""
|
6118 |
|
6505 |
|
6506 |
#: bp-templates/bp-legacy/buddypress/groups/create.php:378
|
6507 |
#: bp-templates/bp-legacy/buddypress/groups/single/invites-loop.php:74
|
6508 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1365
|
6509 |
msgid "Remove Invite"
|
6510 |
msgstr ""
|
6511 |
|
7231 |
msgid "Visibility"
|
7232 |
msgstr ""
|
7233 |
|
7234 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:60 class-buddypress.php:724
|
7235 |
msgid "BuddyPress Legacy"
|
7236 |
msgstr ""
|
7237 |
|
7294 |
msgid "There was a problem when deleting. Please try again."
|
7295 |
msgstr ""
|
7296 |
|
7297 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1369
|
7298 |
msgid ""
|
7299 |
"%s has previously requested to join this group. Sending an invitation will "
|
7300 |
"automatically add the member to the group."
|
7301 |
msgstr ""
|
7302 |
|
7303 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1411
|
7304 |
#: bp-templates/bp-nouveau/includes/friends/ajax.php:104
|
7305 |
msgid "No member found by that ID."
|
7306 |
msgstr ""
|
7307 |
|
7308 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1429
|
7309 |
msgid " Friendship could not be requested."
|
7310 |
msgstr ""
|
7311 |
|
7312 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1441
|
7313 |
#: bp-templates/bp-nouveau/includes/friends/ajax.php:206
|
7314 |
msgid "Friendship request could not be cancelled."
|
7315 |
msgstr ""
|
7316 |
|
7317 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1446
|
7318 |
#: bp-templates/bp-nouveau/includes/friends/ajax.php:216
|
7319 |
msgid "Request Pending"
|
7320 |
msgstr ""
|
7321 |
|
7322 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1467
|
7323 |
#: bp-templates/bp-nouveau/includes/friends/ajax.php:117
|
7324 |
msgid "There was a problem accepting that request. Please try again."
|
7325 |
msgstr ""
|
7326 |
|
7327 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1487
|
7328 |
#: bp-templates/bp-nouveau/includes/friends/ajax.php:141
|
7329 |
msgid "There was a problem rejecting that request. Please try again."
|
7330 |
msgstr ""
|
7331 |
|
7332 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1518
|
7333 |
msgid "Error joining group"
|
7334 |
msgstr ""
|
7335 |
|
7336 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1531
|
7337 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1541
|
7338 |
msgid "Error requesting membership"
|
7339 |
msgstr ""
|
7340 |
|
7341 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1552
|
7342 |
msgid "Error leaving group"
|
7343 |
msgstr ""
|
7344 |
|
7345 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1578
|
7346 |
msgid "There was a problem closing the notice."
|
7347 |
msgstr ""
|
7348 |
|
7349 |
+
#: bp-templates/bp-legacy/buddypress-functions.php:1645
|
7350 |
msgid "There was a problem sending that reply. Please try again."
|
7351 |
msgstr ""
|
7352 |
|
7552 |
msgstr ""
|
7553 |
|
7554 |
#: bp-templates/bp-nouveau/buddypress/members/single/notifications.php:9
|
7555 |
+
msgid "Notifications menu"
|
7556 |
msgstr ""
|
7557 |
|
7558 |
#: bp-templates/bp-nouveau/buddypress/members/single/parts/item-nav.php:9
|
7747 |
|
7748 |
#: bp-templates/bp-nouveau/includes/customizer-controls.php:39
|
7749 |
msgid ""
|
7750 |
+
"Customizing the Groups navigation order needs you create at least one group "
|
7751 |
"first."
|
7752 |
msgstr ""
|
7753 |
|
7994 |
msgstr ""
|
7995 |
|
7996 |
#: bp-templates/bp-nouveau/includes/functions.php:996
|
7997 |
+
msgid "%s did not save any profile information yet."
|
7998 |
msgstr ""
|
7999 |
|
8000 |
#: bp-templates/bp-nouveau/includes/functions.php:1000
|
8256 |
msgstr ""
|
8257 |
|
8258 |
#: bp-templates/bp-nouveau/includes/groups/functions.php:1105
|
8259 |
+
msgid "Group Moderator promotions"
|
8260 |
msgstr ""
|
8261 |
|
8262 |
#: bp-templates/bp-nouveau/includes/groups/functions.php:1110
|
8821 |
msgid "Cheatin’ huh?"
|
8822 |
msgstr ""
|
8823 |
|
8824 |
+
#: class-buddypress.php:732
|
8825 |
msgid "BuddyPress Nouveau"
|
8826 |
msgstr ""
|
8827 |
|
class-buddypress.php
CHANGED
@@ -303,7 +303,7 @@ class BuddyPress {
|
|
303 |
|
304 |
/** Versions **********************************************************/
|
305 |
|
306 |
-
$this->version = '3.0.0-
|
307 |
$this->db_version = 11105;
|
308 |
|
309 |
/** Loading ***********************************************************/
|
@@ -491,6 +491,10 @@ class BuddyPress {
|
|
491 |
require( $this->plugin_dir . 'bp-core/deprecated/2.9.php' );
|
492 |
require( $this->plugin_dir . 'bp-core/deprecated/3.0.php' );
|
493 |
}
|
|
|
|
|
|
|
|
|
494 |
}
|
495 |
|
496 |
/**
|
303 |
|
304 |
/** Versions **********************************************************/
|
305 |
|
306 |
+
$this->version = '3.0.0-beta2';
|
307 |
$this->db_version = 11105;
|
308 |
|
309 |
/** Loading ***********************************************************/
|
491 |
require( $this->plugin_dir . 'bp-core/deprecated/2.9.php' );
|
492 |
require( $this->plugin_dir . 'bp-core/deprecated/3.0.php' );
|
493 |
}
|
494 |
+
|
495 |
+
if ( defined( 'WP_CLI' ) && file_exists( $this->plugin_dir . 'cli/wp-cli-bp.php' ) ) {
|
496 |
+
require( $this->plugin_dir . 'cli/wp-cli-bp.php' );
|
497 |
+
}
|
498 |
}
|
499 |
|
500 |
/**
|
cli/.distignore
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
.DS_Store
|
2 |
+
.git
|
3 |
+
.gitignore
|
4 |
+
.gitlab-ci.yml
|
5 |
+
.editorconfig
|
6 |
+
.travis.yml
|
7 |
+
behat.yml
|
8 |
+
circle.yml
|
9 |
+
bin/
|
10 |
+
features/
|
11 |
+
utils/
|
12 |
+
*.zip
|
13 |
+
*.tar.gz
|
cli/.editorconfig
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# This file is for unifying the coding style for different editors and IDEs
|
2 |
+
# editorconfig.org
|
3 |
+
|
4 |
+
# WordPress Coding Standards
|
5 |
+
# https://make.wordpress.org/core/handbook/coding-standards/
|
6 |
+
|
7 |
+
root = true
|
8 |
+
|
9 |
+
[*]
|
10 |
+
charset = utf-8
|
11 |
+
end_of_line = lf
|
12 |
+
insert_final_newline = true
|
13 |
+
trim_trailing_whitespace = true
|
14 |
+
indent_style = tab
|
15 |
+
|
16 |
+
[{.jshintrc,*.json,*.yml,*.feature}]
|
17 |
+
indent_style = space
|
18 |
+
indent_size = 2
|
19 |
+
|
20 |
+
[{*.txt,wp-config-sample.php}]
|
21 |
+
end_of_line = crlf
|
22 |
+
|
23 |
+
[composer.json]
|
24 |
+
indent_style = space
|
25 |
+
indent_size = 4
|
cli/.gitignore
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
.DS_Store
|
2 |
+
wp-cli.local.yml
|
3 |
+
node_modules/
|
4 |
+
vendor/
|
5 |
+
*.zip
|
6 |
+
*.tar.gz
|
cli/.travis.yml
ADDED
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
sudo: false
|
2 |
+
dist: trusty
|
3 |
+
|
4 |
+
language: php
|
5 |
+
|
6 |
+
notifications:
|
7 |
+
email:
|
8 |
+
on_success: never
|
9 |
+
on_failure: change
|
10 |
+
|
11 |
+
branches:
|
12 |
+
only:
|
13 |
+
- master
|
14 |
+
|
15 |
+
cache:
|
16 |
+
directories:
|
17 |
+
- $HOME/.composer/cache
|
18 |
+
|
19 |
+
env:
|
20 |
+
global:
|
21 |
+
- PATH="$TRAVIS_BUILD_DIR/vendor/bin:$PATH"
|
22 |
+
- WP_CLI_BIN_DIR="$TRAVIS_BUILD_DIR/vendor/bin"
|
23 |
+
|
24 |
+
matrix:
|
25 |
+
include:
|
26 |
+
- php: 7.1
|
27 |
+
env: WP_VERSION=latest
|
28 |
+
- php: 7.0
|
29 |
+
env: WP_VERSION=latest
|
30 |
+
- php: 5.6
|
31 |
+
env: WP_VERSION=latest
|
32 |
+
- php: 5.6
|
33 |
+
env: WP_VERSION=4.4
|
34 |
+
- php: 5.6
|
35 |
+
env: WP_VERSION=trunk
|
36 |
+
- php: 5.3
|
37 |
+
dist: precise
|
38 |
+
env: WP_VERSION=latest
|
39 |
+
|
40 |
+
before_install:
|
41 |
+
- |
|
42 |
+
# Remove Xdebug for a huge performance increase:
|
43 |
+
if [ -f ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini ]; then
|
44 |
+
phpenv config-rm xdebug.ini
|
45 |
+
else
|
46 |
+
echo "xdebug.ini does not exist"
|
47 |
+
fi
|
48 |
+
|
49 |
+
install:
|
50 |
+
- composer install
|
51 |
+
- bash bin/install-package-tests.sh
|
52 |
+
- export BP_SRC_DIR=/tmp/bp-src/
|
53 |
+
- svn co --ignore-externals https://buddypress.svn.wordpress.org/trunk/src $BP_SRC_DIR
|
54 |
+
|
55 |
+
before_script:
|
56 |
+
- composer validate
|
57 |
+
|
58 |
+
script:
|
59 |
+
- bash bin/test.sh
|
cli/bin/install-package-tests.sh
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env bash
|
2 |
+
|
3 |
+
set -ex
|
4 |
+
|
5 |
+
install_db() {
|
6 |
+
mysql -e 'CREATE DATABASE IF NOT EXISTS wp_cli_test;' -uroot
|
7 |
+
mysql -e 'GRANT ALL PRIVILEGES ON wp_cli_test.* TO "wp_cli_test"@"localhost" IDENTIFIED BY "password1"' -uroot
|
8 |
+
}
|
9 |
+
|
10 |
+
install_db
|
cli/bin/test.sh
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/bash
|
2 |
+
|
3 |
+
set -ex
|
4 |
+
|
5 |
+
# Run the unit tests, if they exist
|
6 |
+
if [ -f "phpunit.xml" ] || [ -f "phpunit.xml.dist" ]
|
7 |
+
then
|
8 |
+
phpunit
|
9 |
+
fi
|
10 |
+
|
11 |
+
# Run the functional tests
|
12 |
+
BEHAT_TAGS=$(php utils/behat-tags.php)
|
13 |
+
vendor/behat/behat/bin/behat --format progress $BEHAT_TAGS --strict
|
cli/component.php
ADDED
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI\Command;
|
3 |
+
|
4 |
+
use WP_CLI;
|
5 |
+
use WP_CLI\CommandWithDBObject;
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Base component class.
|
9 |
+
*
|
10 |
+
* @since 1.0
|
11 |
+
*/
|
12 |
+
abstract class BuddypressCommand extends CommandWithDBObject {
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Get a random user id.
|
16 |
+
*
|
17 |
+
* @since 1.1
|
18 |
+
*
|
19 |
+
* @return int
|
20 |
+
*/
|
21 |
+
protected function get_random_user_id() {
|
22 |
+
global $wpdb;
|
23 |
+
return $wpdb->get_var( "SELECT ID FROM $wpdb->users ORDER BY RAND() LIMIT 1" );
|
24 |
+
}
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Get a group ID from its identifier (ID or slug).
|
28 |
+
*
|
29 |
+
* @since 1.5.0
|
30 |
+
*
|
31 |
+
* @param int|string $group_id Group ID or slug.
|
32 |
+
* @return int|bool
|
33 |
+
*/
|
34 |
+
protected function get_group_id_from_identifier( $group_id ) {
|
35 |
+
// Group ID or slug.
|
36 |
+
if ( ! is_numeric( $group_id ) ) {
|
37 |
+
$group_id = groups_get_id( $group_id );
|
38 |
+
}
|
39 |
+
|
40 |
+
// Get group object.
|
41 |
+
$group_obj = groups_get_group( array(
|
42 |
+
'group_id' => $group_id,
|
43 |
+
) );
|
44 |
+
|
45 |
+
if ( empty( $group_obj->id ) ) {
|
46 |
+
WP_CLI::error( 'No group found by that slug or ID.' );
|
47 |
+
}
|
48 |
+
|
49 |
+
return intval( $group_obj->id );
|
50 |
+
}
|
51 |
+
|
52 |
+
/**
|
53 |
+
* Verify a user ID by the passed identifier.
|
54 |
+
*
|
55 |
+
* @since 1.2.0
|
56 |
+
*
|
57 |
+
* @param mixed $i User ID, email or login.
|
58 |
+
* @return WP_User|false
|
59 |
+
*/
|
60 |
+
protected function get_user_id_from_identifier( $i ) {
|
61 |
+
if ( is_numeric( $i ) ) {
|
62 |
+
$user = get_user_by( 'id', $i );
|
63 |
+
} elseif ( is_email( $i ) ) {
|
64 |
+
$user = get_user_by( 'email', $i );
|
65 |
+
} else {
|
66 |
+
$user = get_user_by( 'login', $i );
|
67 |
+
}
|
68 |
+
|
69 |
+
if ( ! $user ) {
|
70 |
+
WP_CLI::error( sprintf( 'No user found by that username or ID (%s).', $i ) );
|
71 |
+
}
|
72 |
+
|
73 |
+
return $user;
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Generate random text
|
78 |
+
*
|
79 |
+
* @since 1.1
|
80 |
+
*/
|
81 |
+
protected function generate_random_text() {
|
82 |
+
return 'Here is some random text';
|
83 |
+
}
|
84 |
+
|
85 |
+
/**
|
86 |
+
* Get field ID.
|
87 |
+
*
|
88 |
+
* @since 1.5.0
|
89 |
+
*
|
90 |
+
* @param int $field_id Field ID.
|
91 |
+
* @return int
|
92 |
+
*/
|
93 |
+
protected function get_field_id( $field_id ) {
|
94 |
+
if ( ! is_numeric( $field_id ) ) {
|
95 |
+
return xprofile_get_field_id_from_name( $field_id );
|
96 |
+
}
|
97 |
+
|
98 |
+
return absint( $field_id );
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* String Sanitization.
|
103 |
+
*
|
104 |
+
* @since 1.5.0
|
105 |
+
*
|
106 |
+
* @param string $type String to sanitize.
|
107 |
+
* @return string Sanitized string.
|
108 |
+
*/
|
109 |
+
protected function sanitize_string( $type ) {
|
110 |
+
return strtolower( str_replace( '-', '_', $type ) );
|
111 |
+
}
|
112 |
+
}
|
cli/components/activity-favorite.php
ADDED
@@ -0,0 +1,172 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI\Command;
|
3 |
+
|
4 |
+
use WP_CLI;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Manage BuddyPress activity favorite.
|
8 |
+
*
|
9 |
+
* @since 1.5.0
|
10 |
+
*/
|
11 |
+
class Activity_Favorite extends BuddypressCommand {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Object fields.
|
15 |
+
*
|
16 |
+
* @var array
|
17 |
+
*/
|
18 |
+
protected $obj_fields = array(
|
19 |
+
'id',
|
20 |
+
'user_id',
|
21 |
+
'component',
|
22 |
+
'type',
|
23 |
+
'action',
|
24 |
+
'item_id',
|
25 |
+
'primary_link',
|
26 |
+
'secondary_item_id',
|
27 |
+
'date_recorded',
|
28 |
+
'hide_sitewide',
|
29 |
+
'is_spam',
|
30 |
+
);
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Add an activity item as a favorite for a user.
|
34 |
+
*
|
35 |
+
* ## OPTIONS
|
36 |
+
*
|
37 |
+
* <activity-id>
|
38 |
+
* : ID of the activity to add an item to.
|
39 |
+
*
|
40 |
+
* <user>
|
41 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
42 |
+
*
|
43 |
+
* ## EXAMPLE
|
44 |
+
*
|
45 |
+
* $ wp bp activity favorite add 100 500
|
46 |
+
* Success: Activity item added as a favorite for the user.
|
47 |
+
*
|
48 |
+
* $ wp bp activity favorite create 100 user_test
|
49 |
+
* Success: Activity item added as a favorite for the user.
|
50 |
+
*
|
51 |
+
* @alias add
|
52 |
+
*/
|
53 |
+
public function create( $args, $assoc_args ) {
|
54 |
+
$activity_id = $args[0];
|
55 |
+
$activity = new \BP_Activity_Activity( $activity_id );
|
56 |
+
|
57 |
+
if ( empty( $activity->id ) ) {
|
58 |
+
WP_CLI::error( 'No activity found by that ID.' );
|
59 |
+
}
|
60 |
+
|
61 |
+
$user = $this->get_user_id_from_identifier( $args[1] );
|
62 |
+
|
63 |
+
if ( bp_activity_add_user_favorite( $activity_id, $user->ID ) ) {
|
64 |
+
WP_CLI::success( 'Activity item added as a favorite for the user.' );
|
65 |
+
} else {
|
66 |
+
WP_CLI::error( 'Could not add the activity item.' );
|
67 |
+
}
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Remove an activity item as a favorite for a user.
|
72 |
+
*
|
73 |
+
* ## OPTIONS
|
74 |
+
*
|
75 |
+
* <activity-id>
|
76 |
+
* : ID of the activity to remove a item to.
|
77 |
+
*
|
78 |
+
* <user>
|
79 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
80 |
+
*
|
81 |
+
* [--yes]
|
82 |
+
* : Answer yes to the confirmation message.
|
83 |
+
*
|
84 |
+
* ## EXAMPLES
|
85 |
+
*
|
86 |
+
* $ wp bp activity favorite remove 100 500
|
87 |
+
* Success: Activity item removed as a favorite for the user.
|
88 |
+
*
|
89 |
+
* $ wp bp activity favorite delete 100 user_test --yes
|
90 |
+
* Success: Activity item removed as a favorite for the user.
|
91 |
+
*
|
92 |
+
* @alias delete
|
93 |
+
*/
|
94 |
+
public function remove( $args, $assoc_args ) {
|
95 |
+
$activity_id = $args[0];
|
96 |
+
$activity = new \BP_Activity_Activity( $activity_id );
|
97 |
+
|
98 |
+
if ( empty( $activity->id ) ) {
|
99 |
+
WP_CLI::error( 'No activity found by that ID.' );
|
100 |
+
}
|
101 |
+
|
102 |
+
$user = $this->get_user_id_from_identifier( $args[1] );
|
103 |
+
|
104 |
+
WP_CLI::confirm( 'Are you sure you want to remove this activity item?', $assoc_args );
|
105 |
+
|
106 |
+
if ( bp_activity_remove_user_favorite( $activity_id, $user->ID ) ) {
|
107 |
+
WP_CLI::success( 'Activity item removed as a favorite for the user.' );
|
108 |
+
} else {
|
109 |
+
WP_CLI::error( 'Could not remove the activity item.' );
|
110 |
+
}
|
111 |
+
}
|
112 |
+
|
113 |
+
/**
|
114 |
+
* Get a user's favorite activity items.
|
115 |
+
*
|
116 |
+
* ## OPTIONS
|
117 |
+
*
|
118 |
+
* <user>
|
119 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
120 |
+
*
|
121 |
+
* [--<field>=<value>]
|
122 |
+
* : One or more parameters to pass to \BP_Activity_Activity::get()
|
123 |
+
*
|
124 |
+
* [--format=<format>]
|
125 |
+
* : Render output in a particular format.
|
126 |
+
* ---
|
127 |
+
* default: table
|
128 |
+
* options:
|
129 |
+
* - table
|
130 |
+
* - csv
|
131 |
+
* - ids
|
132 |
+
* - json
|
133 |
+
* - count
|
134 |
+
* - yaml
|
135 |
+
* ---
|
136 |
+
*
|
137 |
+
* [--count=<number>]
|
138 |
+
* : How many activity favorites to list.
|
139 |
+
* ---
|
140 |
+
* default: 50
|
141 |
+
* ---
|
142 |
+
*
|
143 |
+
* ## EXAMPLES
|
144 |
+
*
|
145 |
+
* $ wp bp activity favorite list 315
|
146 |
+
*
|
147 |
+
* @subcommand list
|
148 |
+
* @alias items
|
149 |
+
* @alias user_items
|
150 |
+
*/
|
151 |
+
public function _list( $args, $assoc_args ) {
|
152 |
+
$user = $this->get_user_id_from_identifier( $args[0] );
|
153 |
+
$favorites = bp_activity_get_user_favorites( $user->ID );
|
154 |
+
|
155 |
+
if ( ! $favorites ) {
|
156 |
+
WP_CLI::error( 'No favorite found for this user.' );
|
157 |
+
}
|
158 |
+
|
159 |
+
$activities = bp_activity_get_specific( array(
|
160 |
+
'activity_ids' => $favorites,
|
161 |
+
'per_page' => $assoc_args['count'],
|
162 |
+
) );
|
163 |
+
|
164 |
+
// Sanity check.
|
165 |
+
if ( empty( $activities['activities'] ) ) {
|
166 |
+
WP_CLI::error( 'No favorite found for this user.' );
|
167 |
+
}
|
168 |
+
|
169 |
+
$formatter = $this->get_formatter( $assoc_args );
|
170 |
+
$formatter->display_items( $activities['activities'] );
|
171 |
+
}
|
172 |
+
}
|
cli/components/activity.php
ADDED
@@ -0,0 +1,976 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI\Command;
|
3 |
+
|
4 |
+
use WP_CLI;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Manage BuddyPress Activities.
|
8 |
+
*
|
9 |
+
* @since 1.5.0
|
10 |
+
*/
|
11 |
+
class Activity extends BuddypressCommand {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Object fields.
|
15 |
+
*
|
16 |
+
* @var array
|
17 |
+
*/
|
18 |
+
protected $obj_fields = array(
|
19 |
+
'id',
|
20 |
+
'user_id',
|
21 |
+
'component',
|
22 |
+
'type',
|
23 |
+
'action',
|
24 |
+
'item_id',
|
25 |
+
'primary_link',
|
26 |
+
'secondary_item_id',
|
27 |
+
'date_recorded',
|
28 |
+
'hide_sitewide',
|
29 |
+
'is_spam',
|
30 |
+
);
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Create an activity item.
|
34 |
+
*
|
35 |
+
* ## OPTIONS
|
36 |
+
*
|
37 |
+
* [--component=<component>]
|
38 |
+
* : The component for the activity item (groups, activity, etc). If
|
39 |
+
* none is provided, a component will be randomly selected from the
|
40 |
+
* active components.
|
41 |
+
*
|
42 |
+
* [--type=<type>]
|
43 |
+
* : Activity type (activity_update, group_created, etc). If none is
|
44 |
+
* provided, a type will be randomly chose from those natively
|
45 |
+
* associated with your <component>.
|
46 |
+
*
|
47 |
+
* [--action=<action>]
|
48 |
+
* : Action text (eg "Joe created a new group Foo"). If none is
|
49 |
+
* provided, one will be generated automatically based on other params.
|
50 |
+
*
|
51 |
+
* [--content=<content>]
|
52 |
+
* : Activity content text. If none is provided, default text will be
|
53 |
+
* generated.
|
54 |
+
*
|
55 |
+
* [--primary-link=<primary-link>]
|
56 |
+
* : URL of the item, as used in RSS feeds. If none is provided, a URL
|
57 |
+
* will be generated based on passed parameters.
|
58 |
+
*
|
59 |
+
* [--user-id=<user>]
|
60 |
+
* : ID of the user associated with the new item. If none is provided,
|
61 |
+
* a user will be randomly selected.
|
62 |
+
*
|
63 |
+
* [--item-id=<item-id>]
|
64 |
+
* : ID of the associated item. If none is provided, one will be
|
65 |
+
* generated automatically, if your activity type requires it.
|
66 |
+
*
|
67 |
+
* [--secondary-item-id=<secondary-item-id>]
|
68 |
+
* : ID of the secondary associated item. If none is provided, one will
|
69 |
+
* be generated automatically, if your activity type requires it.
|
70 |
+
*
|
71 |
+
* [--date-recorded=<date-recorded>]
|
72 |
+
* : GMT timestamp, in Y-m-d h:i:s format.
|
73 |
+
* ---
|
74 |
+
* Default: Current time
|
75 |
+
* ---
|
76 |
+
*
|
77 |
+
* [--hide-sitewide=<hide-sitewide>]
|
78 |
+
* : Whether to hide in sitewide streams.
|
79 |
+
* ---
|
80 |
+
* Default: 0
|
81 |
+
* ---
|
82 |
+
*
|
83 |
+
* [--is-spam=<is-spam>]
|
84 |
+
* : Whether the item should be marked as spam.
|
85 |
+
* ---
|
86 |
+
* Default: 0
|
87 |
+
* ---
|
88 |
+
*
|
89 |
+
* [--silent]
|
90 |
+
* : Whether to silent the activity creation.
|
91 |
+
*
|
92 |
+
* [--porcelain]
|
93 |
+
* : Output only the new activity id.
|
94 |
+
*
|
95 |
+
* ## EXAMPLES
|
96 |
+
*
|
97 |
+
* $ wp bp activity create --is-spam=1
|
98 |
+
* Success: Successfully created new activity item (ID #5464)
|
99 |
+
*
|
100 |
+
* $ wp bp activity add --component=groups --user-id=10
|
101 |
+
* Success: Successfully created new activity item (ID #48949)
|
102 |
+
*
|
103 |
+
* @alias add
|
104 |
+
*/
|
105 |
+
public function create( $args, $assoc_args ) {
|
106 |
+
$r = wp_parse_args( $assoc_args, array(
|
107 |
+
'component' => '',
|
108 |
+
'type' => '',
|
109 |
+
'action' => '',
|
110 |
+
'content' => '',
|
111 |
+
'primary-link' => '',
|
112 |
+
'user-id' => '',
|
113 |
+
'item-id' => '',
|
114 |
+
'secondary-item-id' => '',
|
115 |
+
'date-recorded' => bp_core_current_time(),
|
116 |
+
'hide-sitewide' => 0,
|
117 |
+
'is-spam' => 0,
|
118 |
+
) );
|
119 |
+
|
120 |
+
// Fill in any missing information.
|
121 |
+
if ( empty( $r['component'] ) ) {
|
122 |
+
$r['component'] = $this->get_random_component();
|
123 |
+
}
|
124 |
+
|
125 |
+
if ( empty( $r['type'] ) ) {
|
126 |
+
$r['type'] = $this->get_random_type_from_component( $r['component'] );
|
127 |
+
}
|
128 |
+
|
129 |
+
if ( 'groups' === $r['component'] ) {
|
130 |
+
$group_id = $r['component'];
|
131 |
+
|
132 |
+
if ( ! is_numeric( $group_id ) ) {
|
133 |
+
$group_id = groups_get_id( $group_id );
|
134 |
+
}
|
135 |
+
|
136 |
+
// Get group object.
|
137 |
+
$group_obj = groups_get_group( array(
|
138 |
+
'group_id' => $group_id,
|
139 |
+
) );
|
140 |
+
|
141 |
+
$r['item-id'] = intval( $group_obj->id );
|
142 |
+
}
|
143 |
+
|
144 |
+
// If some data is not set, we have to generate it.
|
145 |
+
if ( empty( $r['item-id'] ) || empty( $r['secondary-item-id'] ) ) {
|
146 |
+
$r = $this->generate_item_details( $r );
|
147 |
+
}
|
148 |
+
|
149 |
+
$id = bp_activity_add( array(
|
150 |
+
'action' => $r['action'],
|
151 |
+
'content' => $r['content'],
|
152 |
+
'component' => $r['component'],
|
153 |
+
'type' => $r['type'],
|
154 |
+
'primary_link' => $r['primary-link'],
|
155 |
+
'user_id' => $r['user-id'],
|
156 |
+
'item_id' => $r['item-id'],
|
157 |
+
'secondary_item_id' => $r['secondary-item-id'],
|
158 |
+
'date_recorded' => $r['date-recorded'],
|
159 |
+
'hide_sitewide' => (bool) $r['hide-sitewide'],
|
160 |
+
'is_spam' => (bool) $r['is-spam'],
|
161 |
+
) );
|
162 |
+
|
163 |
+
// Silent it before it errors.
|
164 |
+
if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'silent' ) ) {
|
165 |
+
return;
|
166 |
+
}
|
167 |
+
|
168 |
+
if ( ! is_numeric( $id ) ) {
|
169 |
+
WP_CLI::error( 'Could not create activity item.' );
|
170 |
+
}
|
171 |
+
|
172 |
+
if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
|
173 |
+
WP_CLI::line( $id );
|
174 |
+
} else {
|
175 |
+
WP_CLI::success( sprintf( 'Successfully created new activity item (ID #%d)', $id ) );
|
176 |
+
}
|
177 |
+
}
|
178 |
+
|
179 |
+
/**
|
180 |
+
* Retrieve a list of activities.
|
181 |
+
*
|
182 |
+
* ## OPTIONS
|
183 |
+
*
|
184 |
+
* [--<field>=<value>]
|
185 |
+
* : One or more parameters to pass to \BP_Activity_Activity::get()
|
186 |
+
*
|
187 |
+
* [--user-id=<user>]
|
188 |
+
* : Limit activities to a specific user id. Accepts a numeric ID.
|
189 |
+
*
|
190 |
+
* [--component=<component>]
|
191 |
+
* : Limit activities to a specific or certain components.
|
192 |
+
*
|
193 |
+
* [--type=<type>]
|
194 |
+
* : Type of the activity. Ex.: activity_update, profile_updated.
|
195 |
+
*
|
196 |
+
* [--primary-id=<primary-id>]
|
197 |
+
* : Object ID to filter the activities. Ex.: group_id or forum_id or blog_id, etc.
|
198 |
+
*
|
199 |
+
* [--secondary-id=<secondary-id>]
|
200 |
+
* : Secondary object ID to filter the activities. Ex.: a post_id.
|
201 |
+
*
|
202 |
+
* [--count=<number>]
|
203 |
+
* : How many activities to list.
|
204 |
+
* ---
|
205 |
+
* default: 50
|
206 |
+
* ---
|
207 |
+
*
|
208 |
+
* [--format=<format>]
|
209 |
+
* : Render output in a particular format.
|
210 |
+
* ---
|
211 |
+
* default: table
|
212 |
+
* options:
|
213 |
+
* - table
|
214 |
+
* - csv
|
215 |
+
* - ids
|
216 |
+
* - json
|
217 |
+
* - count
|
218 |
+
* - yaml
|
219 |
+
* ---
|
220 |
+
*
|
221 |
+
* ## AVAILABLE FIELDS
|
222 |
+
*
|
223 |
+
* These fields will be displayed by default for each activity:
|
224 |
+
*
|
225 |
+
* * ID
|
226 |
+
* * user_id
|
227 |
+
* * component
|
228 |
+
* * type
|
229 |
+
* * action
|
230 |
+
* * content
|
231 |
+
* * item_id
|
232 |
+
* * secondary_item_id
|
233 |
+
* * primary_link
|
234 |
+
* * date_recorded
|
235 |
+
* * is_spam
|
236 |
+
* * user_email
|
237 |
+
* * user_nicename
|
238 |
+
* * user_login
|
239 |
+
* * display_name
|
240 |
+
* * user_fullname
|
241 |
+
*
|
242 |
+
* ## EXAMPLES
|
243 |
+
*
|
244 |
+
* $ wp bp activity list --format=ids
|
245 |
+
* $ wp bp activity list --format=count
|
246 |
+
* $ wp bp activity list --per_page=5
|
247 |
+
* $ wp bp activity list --search_terms="Activity Comment"
|
248 |
+
* $ wp bp activity list --user-id=10
|
249 |
+
* $ wp bp activity list --user-id=123 --component=groups
|
250 |
+
*
|
251 |
+
* @subcommand list
|
252 |
+
*/
|
253 |
+
public function _list( $_, $assoc_args ) {
|
254 |
+
$formatter = $this->get_formatter( $assoc_args );
|
255 |
+
|
256 |
+
$r = wp_parse_args( $assoc_args, array(
|
257 |
+
'page' => 1,
|
258 |
+
'count' => 50,
|
259 |
+
'count_total' => false,
|
260 |
+
'show_hidden' => true,
|
261 |
+
'filter' => false,
|
262 |
+
) );
|
263 |
+
|
264 |
+
// Activities to list.
|
265 |
+
$r['per_page'] = $r['count'];
|
266 |
+
|
267 |
+
if ( isset( $assoc_args['user-id'] ) && is_numeric( $assoc_args['user-id'] ) ) {
|
268 |
+
$r['filter']['user_id'] = $assoc_args['user-id'];
|
269 |
+
}
|
270 |
+
|
271 |
+
if ( isset( $assoc_args['component'] ) ) {
|
272 |
+
$r['filter']['object'] = $assoc_args['component'];
|
273 |
+
}
|
274 |
+
|
275 |
+
if ( isset( $assoc_args['type'] ) ) {
|
276 |
+
$r['filter']['action'] = $assoc_args['type'];
|
277 |
+
}
|
278 |
+
|
279 |
+
if ( isset( $assoc_args['primary-id'] ) ) {
|
280 |
+
$r['filter']['primary_id'] = $assoc_args['primary-id'];
|
281 |
+
}
|
282 |
+
|
283 |
+
if ( isset( $assoc_args['secondary-id'] ) ) {
|
284 |
+
$r['filter']['secondary_id'] = $assoc_args['secondary-id'];
|
285 |
+
}
|
286 |
+
|
287 |
+
$r = self::process_csv_arguments_to_arrays( $r );
|
288 |
+
|
289 |
+
// If count or ids, no need for activity objects.
|
290 |
+
if ( in_array( $formatter->format, array( 'ids', 'count' ), true ) ) {
|
291 |
+
$r['fields'] = 'ids';
|
292 |
+
}
|
293 |
+
|
294 |
+
$activities = bp_activity_get( $r );
|
295 |
+
if ( empty( $activities['activities'] ) ) {
|
296 |
+
WP_CLI::error( 'No activities found.' );
|
297 |
+
}
|
298 |
+
|
299 |
+
if ( 'ids' === $formatter->format ) {
|
300 |
+
echo implode( ' ', $activities['activities'] ); // WPCS: XSS ok.
|
301 |
+
} elseif ( 'count' === $formatter->format ) {
|
302 |
+
$formatter->display_items( $activities['total'] );
|
303 |
+
} else {
|
304 |
+
$formatter->display_items( $activities['activities'] );
|
305 |
+
}
|
306 |
+
}
|
307 |
+
|
308 |
+
/**
|
309 |
+
* Generate random activity items.
|
310 |
+
*
|
311 |
+
* ## OPTIONS
|
312 |
+
*
|
313 |
+
* [--count=<number>]
|
314 |
+
* : How many activity items to generate.
|
315 |
+
* ---
|
316 |
+
* default: 100
|
317 |
+
* ---
|
318 |
+
*
|
319 |
+
* [--skip-activity-comments=<skip-activity-comments>]
|
320 |
+
* : Whether to skip activity comments. Recording activity_comment
|
321 |
+
* items requires a resource-intensive tree rebuild.
|
322 |
+
* ---
|
323 |
+
* default: 1
|
324 |
+
* ---
|
325 |
+
*
|
326 |
+
* ## EXAMPLE
|
327 |
+
*
|
328 |
+
* $ wp bp activity generate --count=50
|
329 |
+
*/
|
330 |
+
public function generate( $args, $assoc_args ) {
|
331 |
+
$component = $this->get_random_component();
|
332 |
+
$type = $this->get_random_type_from_component( $component );
|
333 |
+
|
334 |
+
if ( (bool) $assoc_args['skip-activity-comments'] && 'activity_comment' === $type ) {
|
335 |
+
$type = 'activity_update';
|
336 |
+
}
|
337 |
+
|
338 |
+
$notify = WP_CLI\Utils\make_progress_bar( 'Generating activity items', $assoc_args['count'] );
|
339 |
+
|
340 |
+
for ( $i = 0; $i < $assoc_args['count']; $i++ ) {
|
341 |
+
$this->create( array(), array(
|
342 |
+
'component' => $component,
|
343 |
+
'type' => $type,
|
344 |
+
'content' => $this->generate_random_text(),
|
345 |
+
'silent',
|
346 |
+
) );
|
347 |
+
|
348 |
+
$notify->tick();
|
349 |
+
}
|
350 |
+
|
351 |
+
$notify->finish();
|
352 |
+
}
|
353 |
+
|
354 |
+
/**
|
355 |
+
* Fetch specific activity.
|
356 |
+
*
|
357 |
+
* ## OPTIONS
|
358 |
+
*
|
359 |
+
* <activity-id>
|
360 |
+
* : Identifier for the activity.
|
361 |
+
*
|
362 |
+
* [--fields=<fields>]
|
363 |
+
* : Limit the output to specific fields.
|
364 |
+
*
|
365 |
+
* [--format=<format>]
|
366 |
+
* : Render output in a particular format.
|
367 |
+
* ---
|
368 |
+
* default: table
|
369 |
+
* options:
|
370 |
+
* - table
|
371 |
+
* - json
|
372 |
+
* - haml
|
373 |
+
* ---
|
374 |
+
*
|
375 |
+
* ## EXAMPLES
|
376 |
+
*
|
377 |
+
* $ wp bp activity get 500
|
378 |
+
* $ wp bp activity get 56 --format=json
|
379 |
+
*/
|
380 |
+
public function get( $args, $assoc_args ) {
|
381 |
+
$activity_id = $args[0];
|
382 |
+
|
383 |
+
$activity = new \BP_Activity_Activity( $activity_id );
|
384 |
+
|
385 |
+
if ( empty( $activity->id ) ) {
|
386 |
+
WP_CLI::error( 'No activity found by that ID.' );
|
387 |
+
}
|
388 |
+
|
389 |
+
$activity = bp_activity_get_specific( array(
|
390 |
+
'activity_ids' => $activity_id,
|
391 |
+
'spam' => null,
|
392 |
+
'display_comments' => true,
|
393 |
+
) );
|
394 |
+
|
395 |
+
$activity = $activity['activities'][0];
|
396 |
+
|
397 |
+
if ( ! is_object( $activity ) ) {
|
398 |
+
WP_CLI::error( 'Could not find the activity.' );
|
399 |
+
}
|
400 |
+
|
401 |
+
$activity_arr = get_object_vars( $activity );
|
402 |
+
$activity_arr['url'] = bp_activity_get_permalink( $activity_id );
|
403 |
+
|
404 |
+
if ( empty( $assoc_args['fields'] ) ) {
|
405 |
+
$assoc_args['fields'] = array_keys( $activity_arr );
|
406 |
+
}
|
407 |
+
|
408 |
+
$formatter = $this->get_formatter( $assoc_args );
|
409 |
+
$formatter->display_item( $activity_arr );
|
410 |
+
}
|
411 |
+
|
412 |
+
/**
|
413 |
+
* Delete an activity.
|
414 |
+
*
|
415 |
+
* ## OPTIONS
|
416 |
+
*
|
417 |
+
* <activity-id>...
|
418 |
+
* : ID or IDs of activities to delete.
|
419 |
+
*
|
420 |
+
* [--yes]
|
421 |
+
* : Answer yes to the confirmation message.
|
422 |
+
*
|
423 |
+
* ## EXAMPLES
|
424 |
+
*
|
425 |
+
* $ wp bp activity delete 958695
|
426 |
+
* Success: Activity deleted.
|
427 |
+
*
|
428 |
+
* $ wp bp activity delete 500 --yes
|
429 |
+
* Success: Activity deleted.
|
430 |
+
*
|
431 |
+
* @alias remove
|
432 |
+
*/
|
433 |
+
public function delete( $args, $assoc_args ) {
|
434 |
+
$activity_id = $args[0];
|
435 |
+
|
436 |
+
WP_CLI::confirm( 'Are you sure you want to delete this activity?', $assoc_args );
|
437 |
+
|
438 |
+
parent::_delete( array( $activity_id ), $assoc_args, function( $activity_id ) {
|
439 |
+
$activity = new \BP_Activity_Activity( $activity_id );
|
440 |
+
|
441 |
+
if ( empty( $activity->id ) ) {
|
442 |
+
WP_CLI::error( 'No activity found by that ID.' );
|
443 |
+
}
|
444 |
+
|
445 |
+
$retval = bp_activity_delete( array(
|
446 |
+
'id' => $activity_id,
|
447 |
+
) );
|
448 |
+
|
449 |
+
if ( $retval ) {
|
450 |
+
return array( 'success', 'Activity deleted.' );
|
451 |
+
} else {
|
452 |
+
return array( 'error', 'Could not delete the activity.' );
|
453 |
+
}
|
454 |
+
} );
|
455 |
+
}
|
456 |
+
|
457 |
+
/**
|
458 |
+
* Spam an activity.
|
459 |
+
*
|
460 |
+
* ## OPTIONS
|
461 |
+
*
|
462 |
+
* <activity-id>
|
463 |
+
* : Identifier for the activity.
|
464 |
+
*
|
465 |
+
* ## EXAMPLES
|
466 |
+
*
|
467 |
+
* $ wp bp activity spam 500
|
468 |
+
* Success: Activity marked as spam.
|
469 |
+
*
|
470 |
+
* $ wp bp activity unham 165165
|
471 |
+
* Success: Activity marked as spam.
|
472 |
+
*
|
473 |
+
* @alias unham
|
474 |
+
*/
|
475 |
+
public function spam( $args, $assoc_args ) {
|
476 |
+
$activity = new \BP_Activity_Activity( $args[0] );
|
477 |
+
|
478 |
+
if ( empty( $activity->id ) ) {
|
479 |
+
WP_CLI::error( 'No activity found by that ID.' );
|
480 |
+
}
|
481 |
+
|
482 |
+
// Mark as spam.
|
483 |
+
bp_activity_mark_as_spam( $activity );
|
484 |
+
|
485 |
+
if ( $activity->save() ) {
|
486 |
+
WP_CLI::success( 'Activity marked as spam.' );
|
487 |
+
} else {
|
488 |
+
WP_CLI::error( 'Could not mark the activity as spam.' );
|
489 |
+
}
|
490 |
+
}
|
491 |
+
|
492 |
+
/**
|
493 |
+
* Ham an activity.
|
494 |
+
*
|
495 |
+
* ## OPTIONS
|
496 |
+
*
|
497 |
+
* <activity-id>
|
498 |
+
* : Identifier for the activity.
|
499 |
+
*
|
500 |
+
* ## EXAMPLES
|
501 |
+
*
|
502 |
+
* $ wp bp activity ham 500
|
503 |
+
* Success: Activity marked as ham.
|
504 |
+
*
|
505 |
+
* $ wp bp activity unspam 4679
|
506 |
+
* Success: Activity marked as ham.
|
507 |
+
*
|
508 |
+
* @alias unspam
|
509 |
+
*/
|
510 |
+
public function ham( $args, $assoc_args ) {
|
511 |
+
$activity = new \BP_Activity_Activity( $args[0] );
|
512 |
+
|
513 |
+
if ( empty( $activity->id ) ) {
|
514 |
+
WP_CLI::error( 'No activity found by that ID.' );
|
515 |
+
}
|
516 |
+
|
517 |
+
// Mark as ham.
|
518 |
+
bp_activity_mark_as_ham( $activity );
|
519 |
+
|
520 |
+
if ( $activity->save() ) {
|
521 |
+
WP_CLI::success( 'Activity marked as ham.' );
|
522 |
+
} else {
|
523 |
+
WP_CLI::error( 'Could not mark the activity as ham.' );
|
524 |
+
}
|
525 |
+
}
|
526 |
+
|
527 |
+
/**
|
528 |
+
* Post an activity update.
|
529 |
+
*
|
530 |
+
* ## OPTIONS
|
531 |
+
*
|
532 |
+
* --user-id=<user>
|
533 |
+
* : ID of the user. If none is provided, a user will be randomly selected.
|
534 |
+
*
|
535 |
+
* --content=<content>
|
536 |
+
* : Activity content text. If none is provided, default text will be generated.
|
537 |
+
*
|
538 |
+
* [--porcelain]
|
539 |
+
* : Output only the new activity id.
|
540 |
+
*
|
541 |
+
* ## EXAMPLES
|
542 |
+
*
|
543 |
+
* $ wp bp activity post_update --user-id=50 --content="Content to update"
|
544 |
+
* Success: Successfully updated with a new activity item (ID #13165)
|
545 |
+
*
|
546 |
+
* $ wp bp activity post_update --user-id=140
|
547 |
+
* Success: Successfully updated with a new activity item (ID #4548)
|
548 |
+
*
|
549 |
+
* @alias post-update
|
550 |
+
*/
|
551 |
+
public function post_update( $args, $assoc_args ) {
|
552 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
553 |
+
|
554 |
+
// Post the activity update.
|
555 |
+
$id = bp_activity_post_update( array(
|
556 |
+
'content' => $assoc_args['content'],
|
557 |
+
'user_id' => $user->ID,
|
558 |
+
) );
|
559 |
+
|
560 |
+
// Activity ID returned on success update.
|
561 |
+
if ( ! is_numeric( $id ) ) {
|
562 |
+
WP_CLI::error( 'Could not post the activity update.' );
|
563 |
+
}
|
564 |
+
|
565 |
+
if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
|
566 |
+
WP_CLI::line( $id );
|
567 |
+
} else {
|
568 |
+
WP_CLI::success( sprintf( 'Successfully updated with a new activity item (ID #%d)', $id ) );
|
569 |
+
}
|
570 |
+
}
|
571 |
+
|
572 |
+
/**
|
573 |
+
* Add an activity comment.
|
574 |
+
*
|
575 |
+
* ## OPTIONS
|
576 |
+
*
|
577 |
+
* <activity-id>
|
578 |
+
* : ID of the activity to add the comment.
|
579 |
+
*
|
580 |
+
* --user-id=<user>
|
581 |
+
* : ID of the user. If none is provided, a user will be randomly selected.
|
582 |
+
*
|
583 |
+
* --content=<content>
|
584 |
+
* : Activity content text. If none is provided, default text will be generated.
|
585 |
+
*
|
586 |
+
* [--skip-notification]
|
587 |
+
* : Whether to skip notification.
|
588 |
+
*
|
589 |
+
* [--porcelain]
|
590 |
+
* : Output only the new activity comment id.
|
591 |
+
*
|
592 |
+
* ## EXAMPLES
|
593 |
+
*
|
594 |
+
* $ wp bp activity comment 560 --user-id=50 --content="New activity comment"
|
595 |
+
* Success: Successfully added a new activity comment (ID #4645)
|
596 |
+
*
|
597 |
+
* $ wp bp activity comment 459 --user-id=140 --skip-notification=1
|
598 |
+
* Success: Successfully added a new activity comment (ID #494)
|
599 |
+
*/
|
600 |
+
public function comment( $args, $assoc_args ) {
|
601 |
+
$activity = new \BP_Activity_Activity( $args[0] );
|
602 |
+
|
603 |
+
if ( empty( $activity->id ) ) {
|
604 |
+
WP_CLI::error( 'No activity found by that ID.' );
|
605 |
+
}
|
606 |
+
|
607 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
608 |
+
$skip_notification = WP_CLI\Utils\get_flag_value( $assoc_args, 'skip-notification' );
|
609 |
+
|
610 |
+
// Add activity comment.
|
611 |
+
$id = bp_activity_new_comment( array(
|
612 |
+
'content' => $assoc_args['content'],
|
613 |
+
'user_id' => $user->ID,
|
614 |
+
'activity_id' => $activity->id,
|
615 |
+
'skip_notification' => $skip_notification,
|
616 |
+
) );
|
617 |
+
|
618 |
+
// Activity Comment ID returned on success.
|
619 |
+
if ( ! is_numeric( $id ) ) {
|
620 |
+
WP_CLI::error( 'Could not post a new activity comment.' );
|
621 |
+
}
|
622 |
+
|
623 |
+
if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
|
624 |
+
WP_CLI::line( $id );
|
625 |
+
} else {
|
626 |
+
WP_CLI::success( sprintf( 'Successfully added a new activity comment (ID #%d)', $id ) );
|
627 |
+
}
|
628 |
+
}
|
629 |
+
|
630 |
+
/**
|
631 |
+
* Delete an activity comment.
|
632 |
+
*
|
633 |
+
* ## OPTIONS
|
634 |
+
*
|
635 |
+
* <activity-id>
|
636 |
+
* : Identifier for the activity.
|
637 |
+
*
|
638 |
+
* --comment-id=<comment-id>
|
639 |
+
* : ID of the comment to delete.
|
640 |
+
*
|
641 |
+
* [--yes]
|
642 |
+
* : Answer yes to the confirmation message.
|
643 |
+
*
|
644 |
+
* ## EXAMPLES
|
645 |
+
*
|
646 |
+
* $ wp bp activity delete_comment 100 --comment-id=500
|
647 |
+
* Success: Activity comment deleted.
|
648 |
+
*
|
649 |
+
* $ wp bp activity delete_comment 165 --comment-id=35435 --yes
|
650 |
+
* Success: Activity comment deleted.
|
651 |
+
*
|
652 |
+
* @alias remove_comment
|
653 |
+
*/
|
654 |
+
public function delete_comment( $args, $assoc_args ) {
|
655 |
+
$activity_id = $args[0];
|
656 |
+
$activity = new \BP_Activity_Activity( $activity_id );
|
657 |
+
|
658 |
+
if ( empty( $activity->id ) ) {
|
659 |
+
WP_CLI::error( 'No activity found by that ID.' );
|
660 |
+
}
|
661 |
+
|
662 |
+
WP_CLI::confirm( 'Are you sure you want to delete this activity comment?', $assoc_args );
|
663 |
+
|
664 |
+
// Delete Comment. True if deleted.
|
665 |
+
if ( bp_activity_delete_comment( $activity_id, $assoc_args['comment-id'] ) ) {
|
666 |
+
WP_CLI::success( 'Activity comment deleted.' );
|
667 |
+
} else {
|
668 |
+
WP_CLI::error( 'Could not delete the activity comment.' );
|
669 |
+
}
|
670 |
+
}
|
671 |
+
|
672 |
+
/**
|
673 |
+
* Pull up a random active component for use in activity items.
|
674 |
+
*
|
675 |
+
* @since 1.1
|
676 |
+
*
|
677 |
+
* @return string
|
678 |
+
*/
|
679 |
+
protected function get_random_component() {
|
680 |
+
$c = buddypress()->active_components;
|
681 |
+
|
682 |
+
// Core components that accept activity items.
|
683 |
+
$ca = $this->get_components_and_actions();
|
684 |
+
|
685 |
+
return array_rand( array_flip( array_intersect( array_keys( $c ), array_keys( $ca ) ) ) );
|
686 |
+
}
|
687 |
+
|
688 |
+
/**
|
689 |
+
* Get a random type from a component.
|
690 |
+
*
|
691 |
+
* @since 1.1
|
692 |
+
*
|
693 |
+
* @param string $component Component name.
|
694 |
+
* @return string
|
695 |
+
*/
|
696 |
+
protected function get_random_type_from_component( $component ) {
|
697 |
+
$ca = $this->get_components_and_actions();
|
698 |
+
return array_rand( array_flip( $ca[ $component ] ) );
|
699 |
+
}
|
700 |
+
|
701 |
+
/**
|
702 |
+
* Get a list of activity components and actions.
|
703 |
+
*
|
704 |
+
* @since 1.1
|
705 |
+
*
|
706 |
+
* @return array
|
707 |
+
*/
|
708 |
+
protected function get_components_and_actions() {
|
709 |
+
$actions = array_map(
|
710 |
+
function( $component ) {
|
711 |
+
return array_keys( (array) $component );
|
712 |
+
},
|
713 |
+
(array) bp_activity_get_actions()
|
714 |
+
);
|
715 |
+
|
716 |
+
return $actions;
|
717 |
+
}
|
718 |
+
|
719 |
+
/**
|
720 |
+
* Generate item details.
|
721 |
+
*
|
722 |
+
* @since 1.1
|
723 |
+
*/
|
724 |
+
protected function generate_item_details( $r ) {
|
725 |
+
global $wpdb, $bp;
|
726 |
+
|
727 |
+
switch ( $r['type'] ) {
|
728 |
+
case 'activity_update':
|
729 |
+
if ( empty( $r['user-id'] ) ) {
|
730 |
+
$r['user-id'] = $this->get_random_user_id();
|
731 |
+
}
|
732 |
+
|
733 |
+
// Make group updates look more like actual group updates.
|
734 |
+
// i.e. give them links to their groups.
|
735 |
+
if ( 'groups' === $r['component'] ) {
|
736 |
+
|
737 |
+
if ( empty( $r['item-id'] ) ) {
|
738 |
+
WP_CLI::error( 'No group found by that ID.' );
|
739 |
+
}
|
740 |
+
|
741 |
+
// get the group.
|
742 |
+
$group_obj = groups_get_group( array(
|
743 |
+
'group_id' => $r['item-id'],
|
744 |
+
) );
|
745 |
+
|
746 |
+
// make sure such a group exists.
|
747 |
+
if ( empty( $group_obj->id ) ) {
|
748 |
+
WP_CLI::error( 'No group found by that slug or id.' );
|
749 |
+
}
|
750 |
+
|
751 |
+
// stolen from groups_join_group.
|
752 |
+
$r['action'] = sprintf( __( '%1$s posted an update in the group %2$s', 'buddypress'), bp_core_get_userlink( $r['user-id'] ), '<a href="' . bp_get_group_permalink( $group_obj ) . '">' . esc_attr( $group_obj->name ) . '</a>' );
|
753 |
+
} else {
|
754 |
+
// old way, for some other kind of update.
|
755 |
+
$r['action'] = sprintf( __( '%s posted an update', 'buddypress' ), bp_core_get_userlink( $r['user-id'] ) );
|
756 |
+
}
|
757 |
+
if ( empty( $r['content'] ) ) {
|
758 |
+
$r['content'] = $this->generate_random_text();
|
759 |
+
}
|
760 |
+
|
761 |
+
$r['primary-link'] = bp_core_get_userlink( $r['user-id'] );
|
762 |
+
|
763 |
+
break;
|
764 |
+
|
765 |
+
case 'activity_comment':
|
766 |
+
if ( empty( $r['user-id'] ) ) {
|
767 |
+
$r['user-id'] = $this->get_random_user_id();
|
768 |
+
}
|
769 |
+
|
770 |
+
$parent_item = $wpdb->get_row( "SELECT * FROM {$bp->activity->table_name} ORDER BY RAND() LIMIT 1" );
|
771 |
+
|
772 |
+
if ( 'activity_comment' === $parent_item->type ) {
|
773 |
+
$r['item-id'] = $parent_item->id;
|
774 |
+
$r['secondary-item-id'] = $parent_item->secondary_item_id;
|
775 |
+
} else {
|
776 |
+
$r['item-id'] = $parent_item->id;
|
777 |
+
}
|
778 |
+
|
779 |
+
$r['action'] = sprintf( __( '%s posted a new activity comment', 'buddypress' ), bp_core_get_userlink( $r['user-id'] ) );
|
780 |
+
$r['content'] = $this->generate_random_text();
|
781 |
+
$r['primary-link'] = bp_core_get_userlink( $r['user-id'] );
|
782 |
+
|
783 |
+
break;
|
784 |
+
|
785 |
+
case 'new_blog':
|
786 |
+
case 'new_blog_post':
|
787 |
+
case 'new_blog_comment':
|
788 |
+
if ( ! bp_is_active( 'blogs' ) ) {
|
789 |
+
return $r;
|
790 |
+
}
|
791 |
+
|
792 |
+
if ( is_multisite() ) {
|
793 |
+
$r['item-id'] = $wpdb->get_var( "SELECT blog_id FROM {$wpdb->blogs} ORDER BY RAND() LIMIT 1" );
|
794 |
+
} else {
|
795 |
+
$r['item-id'] = 1;
|
796 |
+
}
|
797 |
+
|
798 |
+
// Need blog content for posts/comments.
|
799 |
+
if ( 'new_blog_post' === $r['type'] || 'new_blog_comment' === $r['type'] ) {
|
800 |
+
|
801 |
+
if ( is_multisite() ) {
|
802 |
+
switch_to_blog( $r['item-id'] );
|
803 |
+
}
|
804 |
+
|
805 |
+
$comment_info = $wpdb->get_results( "SELECT comment_id, comment_post_id FROM {$wpdb->comments} ORDER BY RAND() LIMIT 1" );
|
806 |
+
$comment_id = $comment_info[0]->comment_id;
|
807 |
+
$comment = get_comment( $comment_id );
|
808 |
+
|
809 |
+
$post_id = $comment_info[0]->comment_post_id;
|
810 |
+
$post = get_post( $post_id );
|
811 |
+
|
812 |
+
if ( is_multisite() ) {
|
813 |
+
restore_current_blog();
|
814 |
+
}
|
815 |
+
}
|
816 |
+
|
817 |
+
// new_blog.
|
818 |
+
if ( 'new_blog' === $r['type'] ) {
|
819 |
+
if ( '' === $r['user-id'] ) {
|
820 |
+
$r['user-id'] = $this->get_random_user_id();
|
821 |
+
}
|
822 |
+
|
823 |
+
if ( ! $r['action'] ) {
|
824 |
+
$r['action'] = sprintf( __( '%s created the site %s', 'buddypress'), bp_core_get_userlink( $r['user-id'] ), '<a href="' . get_home_url( $r['item-id'] ) . '">' . esc_attr( get_blog_option( $r['item-id'], 'blogname' ) ) . '</a>' );
|
825 |
+
}
|
826 |
+
|
827 |
+
if ( ! $r['primary-link'] ) {
|
828 |
+
$r['primary-link'] = get_home_url( $r['item-id'] );
|
829 |
+
}
|
830 |
+
|
831 |
+
// new_blog_post.
|
832 |
+
} elseif ( 'new_blog_post' === $r['type'] ) {
|
833 |
+
if ( '' === $r['user-id'] ) {
|
834 |
+
$r['user-id'] = $post->post_author;
|
835 |
+
}
|
836 |
+
|
837 |
+
if ( '' === $r['primary-link'] ) {
|
838 |
+
$r['primary-link'] = add_query_arg( 'p', $post->ID, trailingslashit( get_home_url( $r['item-id'] ) ) );
|
839 |
+
}
|
840 |
+
|
841 |
+
if ( '' === $r['action'] ) {
|
842 |
+
$r['action'] = sprintf( __( '%1$s wrote a new post, %2$s', 'buddypress' ), bp_core_get_userlink( (int) $post->post_author ), '<a href="' . $r['primary-link'] . '">' . $post->post_title . '</a>' );
|
843 |
+
}
|
844 |
+
|
845 |
+
if ( '' === $r['content'] ) {
|
846 |
+
$r['content'] = $post->post_content;
|
847 |
+
}
|
848 |
+
|
849 |
+
if ( '' === $r['secondary-item-id'] ) {
|
850 |
+
$r['secondary-item-id'] = $post->ID;
|
851 |
+
}
|
852 |
+
|
853 |
+
// new_blog_comment.
|
854 |
+
} else {
|
855 |
+
// groan - have to fake this.
|
856 |
+
if ( '' === $r['user-id'] ) {
|
857 |
+
$user = get_user_by( 'email', $comment->comment_author_email );
|
858 |
+
$r['user-id'] = ( empty( $user ) )
|
859 |
+
? $this->get_random_user_id()
|
860 |
+
: $user->ID;
|
861 |
+
}
|
862 |
+
|
863 |
+
$post_permalink = get_permalink( $comment->comment_post_ID );
|
864 |
+
$comment_link = get_comment_link( $comment->comment_ID );
|
865 |
+
|
866 |
+
if ( '' === $r['primary-link'] ) {
|
867 |
+
$r['primary-link'] = $comment_link;
|
868 |
+
}
|
869 |
+
|
870 |
+
if ( '' === $r['action'] ) {
|
871 |
+
$r['action'] = sprintf( __( '%1$s commented on the post, %2$s', 'buddypress' ), bp_core_get_userlink( $r['user-id'] ), '<a href="' . $post_permalink . '">' . apply_filters( 'the_title', $post->post_title ) . '</a>' );
|
872 |
+
}
|
873 |
+
|
874 |
+
if ( '' === $r['content'] ) {
|
875 |
+
$r['content'] = $comment->comment_content;
|
876 |
+
}
|
877 |
+
|
878 |
+
if ( '' === $r['secondary-item-id'] ) {
|
879 |
+
$r['secondary-item-id'] = $comment->ID;
|
880 |
+
}
|
881 |
+
}
|
882 |
+
|
883 |
+
$r['content'] = '';
|
884 |
+
|
885 |
+
break;
|
886 |
+
|
887 |
+
case 'friendship_created':
|
888 |
+
if ( empty( $r['user-id'] ) ) {
|
889 |
+
$r['user-id'] = $this->get_random_user_id();
|
890 |
+
}
|
891 |
+
|
892 |
+
if ( empty( $r['item-id'] ) ) {
|
893 |
+
$r['item-id'] = $this->get_random_user_id();
|
894 |
+
}
|
895 |
+
|
896 |
+
$r['action'] = sprintf( __( '%1$s and %2$s are now friends', 'buddypress' ), bp_core_get_userlink( $r['user-id'] ), bp_core_get_userlink( $r['item-id'] ) );
|
897 |
+
|
898 |
+
break;
|
899 |
+
|
900 |
+
case 'created_group':
|
901 |
+
if ( empty( $r['item-id'] ) ) {
|
902 |
+
$r['item-id'] = \BP_Groups_Group::get_random( 1, 1 )['groups'][0]->slug;
|
903 |
+
}
|
904 |
+
|
905 |
+
$group = groups_get_group( array(
|
906 |
+
'group_id' => $r['item-id'],
|
907 |
+
) );
|
908 |
+
|
909 |
+
// @todo what if it's not a group? ugh
|
910 |
+
if ( empty( $r['user-id'] ) ) {
|
911 |
+
$r['user-id'] = $group->creator_id;
|
912 |
+
}
|
913 |
+
|
914 |
+
$group_permalink = bp_get_group_permalink( $group );
|
915 |
+
|
916 |
+
if ( empty( $r['action'] ) ) {
|
917 |
+
$r['action'] = sprintf( __( '%1$s created the group %2$s', 'buddypress'), bp_core_get_userlink( $r['user-id'] ), '<a href="' . $group_permalink . '">' . esc_attr( $group->name ) . '</a>' );
|
918 |
+
}
|
919 |
+
|
920 |
+
if ( empty( $r['primary-link'] ) ) {
|
921 |
+
$r['primary-link'] = $group_permalink;
|
922 |
+
}
|
923 |
+
|
924 |
+
break;
|
925 |
+
|
926 |
+
case 'joined_group':
|
927 |
+
if ( empty( $r['item-id'] ) ) {
|
928 |
+
$r['item-id'] = \BP_Groups_Group::get_random( 1, 1 )['groups'][0]->slug;
|
929 |
+
}
|
930 |
+
|
931 |
+
$group = groups_get_group( array(
|
932 |
+
'group_id' => $r['item-id'],
|
933 |
+
) );
|
934 |
+
|
935 |
+
if ( empty( $r['user-id'] ) ) {
|
936 |
+
$r['user-id'] = $this->get_random_user_id();
|
937 |
+
}
|
938 |
+
|
939 |
+
if ( empty( $r['action'] ) ) {
|
940 |
+
$r['action'] = sprintf( __( '%1$s joined the group %2$s', 'buddypress' ), bp_core_get_userlink( $r['user-id'] ), '<a href="' . bp_get_group_permalink( $group ) . '">' . esc_attr( $group->name ) . '</a>' );
|
941 |
+
}
|
942 |
+
|
943 |
+
if ( empty( $r['primary-link'] ) ) {
|
944 |
+
$r['primary-link'] = bp_get_group_permalink( $group );
|
945 |
+
}
|
946 |
+
|
947 |
+
break;
|
948 |
+
|
949 |
+
case 'new_avatar':
|
950 |
+
case 'new_member':
|
951 |
+
case 'updated_profile':
|
952 |
+
if ( empty( $r['user-id'] ) ) {
|
953 |
+
$r['user-id'] = $this->get_random_user_id();
|
954 |
+
}
|
955 |
+
|
956 |
+
$userlink = bp_core_get_userlink( $r['user-id'] );
|
957 |
+
|
958 |
+
// new_avatar.
|
959 |
+
if ( 'new_avatar' === $r['type'] ) {
|
960 |
+
$r['action'] = sprintf( __( '%s changed their profile picture', 'buddypress' ), $userlink );
|
961 |
+
|
962 |
+
// new_member.
|
963 |
+
} elseif ( 'new_member' === $r['type'] ) {
|
964 |
+
$r['action'] = sprintf( __( '%s became a registered member', 'buddypress' ), $userlink );
|
965 |
+
|
966 |
+
// updated_profile.
|
967 |
+
} else {
|
968 |
+
$r['action'] = sprintf( __( '%s updated their profile', 'buddypress' ), $userlink );
|
969 |
+
}
|
970 |
+
|
971 |
+
break;
|
972 |
+
}
|
973 |
+
|
974 |
+
return $r;
|
975 |
+
}
|
976 |
+
}
|
cli/components/component.php
ADDED
@@ -0,0 +1,226 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI\Command;
|
3 |
+
|
4 |
+
use WP_CLI;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Manage BuddyPress Components.
|
8 |
+
*
|
9 |
+
* @since 1.6.0
|
10 |
+
*/
|
11 |
+
class Components extends BuddypressCommand {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Object fields.
|
15 |
+
*
|
16 |
+
* @var array
|
17 |
+
*/
|
18 |
+
protected $obj_fields = array(
|
19 |
+
'id',
|
20 |
+
'title',
|
21 |
+
'description',
|
22 |
+
);
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Activate a component.
|
26 |
+
*
|
27 |
+
* ## OPTIONS
|
28 |
+
*
|
29 |
+
* <component>
|
30 |
+
* : Name of the component to activate.
|
31 |
+
*
|
32 |
+
* ## EXAMPLE
|
33 |
+
*
|
34 |
+
* $ wp bp component activate groups
|
35 |
+
* Success: The Groups component has been activated.
|
36 |
+
*/
|
37 |
+
public function activate( $args, $assoc_args ) {
|
38 |
+
$component = $args[0];
|
39 |
+
|
40 |
+
if ( bp_is_active( $component ) ) {
|
41 |
+
WP_CLI::error( sprintf( 'The %s component is already active.', ucfirst( $component ) ) );
|
42 |
+
}
|
43 |
+
|
44 |
+
$active_components =& buddypress()->active_components;
|
45 |
+
|
46 |
+
// Set for the rest of the page load.
|
47 |
+
$active_components[ $component ] = 1;
|
48 |
+
|
49 |
+
// Save in the db.
|
50 |
+
bp_update_option( 'bp-active-components', $active_components );
|
51 |
+
|
52 |
+
// Ensure that dbDelta() is defined.
|
53 |
+
if ( ! function_exists( 'dbDelta' ) ) {
|
54 |
+
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
|
55 |
+
}
|
56 |
+
|
57 |
+
// Run the setup, in case tables have to be created.
|
58 |
+
require_once( \BP_PLUGIN_DIR . 'bp-core/admin/bp-core-admin-schema.php' );
|
59 |
+
bp_core_install( $active_components );
|
60 |
+
bp_core_add_page_mappings( $active_components );
|
61 |
+
|
62 |
+
WP_CLI::success( sprintf( 'The %s component has been activated.', ucfirst( $component ) ) );
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Deactivate a component.
|
67 |
+
*
|
68 |
+
* ## OPTIONS
|
69 |
+
*
|
70 |
+
* <component>
|
71 |
+
* : Name of the component to deactivate.
|
72 |
+
*
|
73 |
+
* ## EXAMPLE
|
74 |
+
*
|
75 |
+
* $ wp bp component deactivate groups
|
76 |
+
* Success: The Groups component has been deactivated.
|
77 |
+
*/
|
78 |
+
public function deactivate( $args, $assoc_args ) {
|
79 |
+
$component = $args[0];
|
80 |
+
|
81 |
+
if ( ! bp_is_active( $component ) ) {
|
82 |
+
WP_CLI::error( sprintf( 'The %s component is not active.', ucfirst( $component ) ) );
|
83 |
+
}
|
84 |
+
|
85 |
+
if ( array_key_exists( $component, bp_core_get_components( 'required' ) ) ) {
|
86 |
+
WP_CLI::error( 'You cannot deactivate a required component.' );
|
87 |
+
}
|
88 |
+
|
89 |
+
$active_components =& buddypress()->active_components;
|
90 |
+
|
91 |
+
// Set for the rest of the page load.
|
92 |
+
unset( $active_components[ $component ] );
|
93 |
+
|
94 |
+
// Save in the db.
|
95 |
+
bp_update_option( 'bp-active-components', $active_components );
|
96 |
+
|
97 |
+
WP_CLI::success( sprintf( 'The %s component has been deactivated.', ucfirst( $component ) ) );
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Get a list of components.
|
102 |
+
*
|
103 |
+
* ## OPTIONS
|
104 |
+
*
|
105 |
+
* [--type=<type>]
|
106 |
+
* : Type of the component (all, optional, retired, required).
|
107 |
+
* ---
|
108 |
+
* default: all
|
109 |
+
* ---
|
110 |
+
*
|
111 |
+
* [--status=<status>]
|
112 |
+
* : Status of the component (all, active, inactive).
|
113 |
+
* ---
|
114 |
+
* default: all
|
115 |
+
* ---
|
116 |
+
*
|
117 |
+
* [--fields=<fields>]
|
118 |
+
* : Fields to display (id, title, description).
|
119 |
+
*
|
120 |
+
* [--format=<format>]
|
121 |
+
* : Render output in a particular format.
|
122 |
+
* ---
|
123 |
+
* default: table
|
124 |
+
* options:
|
125 |
+
* - table
|
126 |
+
* - count
|
127 |
+
* - csv
|
128 |
+
* - haml
|
129 |
+
* ---
|
130 |
+
*
|
131 |
+
* ## EXAMPLES
|
132 |
+
*
|
133 |
+
* $ wp bp component list --format=count
|
134 |
+
* 10
|
135 |
+
*
|
136 |
+
* $ wp bp component list --status=inactive --format=count
|
137 |
+
* 4
|
138 |
+
*
|
139 |
+
* @subcommand list
|
140 |
+
*/
|
141 |
+
public function _list( $args, $assoc_args ) {
|
142 |
+
$formatter = $this->get_formatter( $assoc_args );
|
143 |
+
|
144 |
+
// Sanitize type.
|
145 |
+
$type = $assoc_args['type'];
|
146 |
+
if ( empty( $type ) || ! in_array( $type, $this->component_types(), true ) ) {
|
147 |
+
$type = 'all';
|
148 |
+
}
|
149 |
+
|
150 |
+
// Sanitize status.
|
151 |
+
$status = $assoc_args['status'];
|
152 |
+
if ( empty( $status ) || ! in_array( $status, $this->component_status(), true ) ) {
|
153 |
+
$status = 'all';
|
154 |
+
}
|
155 |
+
|
156 |
+
$components = bp_core_get_components( $type );
|
157 |
+
$active_components = apply_filters( 'bp_active_components', bp_get_option( 'bp-active-components' ) );
|
158 |
+
$inactive_components = array_diff( array_keys( $components ), array_keys( $active_components ) );
|
159 |
+
$current_components = array();
|
160 |
+
|
161 |
+
switch ( $status ) {
|
162 |
+
case 'all':
|
163 |
+
foreach ( $components as $name => $labels ) {
|
164 |
+
$current_components[] = array(
|
165 |
+
'id' => $name,
|
166 |
+
'title' => $labels['title'],
|
167 |
+
'description' => $labels['description'],
|
168 |
+
);
|
169 |
+
}
|
170 |
+
break;
|
171 |
+
|
172 |
+
case 'active':
|
173 |
+
foreach ( $active_components as $name => $labels ) {
|
174 |
+
$current_components[] = array(
|
175 |
+
'id' => $name,
|
176 |
+
'title' => '',
|
177 |
+
'description' => '',
|
178 |
+
);
|
179 |
+
}
|
180 |
+
break;
|
181 |
+
|
182 |
+
case 'inactive':
|
183 |
+
foreach ( $inactive_components as $name => $labels ) {
|
184 |
+
$current_components[] = array(
|
185 |
+
'id' => $labels,
|
186 |
+
'title' => '',
|
187 |
+
'description' => '',
|
188 |
+
);
|
189 |
+
}
|
190 |
+
break;
|
191 |
+
}
|
192 |
+
|
193 |
+
// Bail early.
|
194 |
+
if ( empty( $current_components ) ) {
|
195 |
+
WP_CLI::error( 'There is no component available.' );
|
196 |
+
}
|
197 |
+
|
198 |
+
if ( 'count' === $formatter->format ) {
|
199 |
+
$formatter->display_items( $current_components );
|
200 |
+
} else {
|
201 |
+
$formatter->display_items( $current_components );
|
202 |
+
}
|
203 |
+
}
|
204 |
+
|
205 |
+
/**
|
206 |
+
* Component Types.
|
207 |
+
*
|
208 |
+
* @since 1.6.0
|
209 |
+
*
|
210 |
+
* @return array An array of valid component types.
|
211 |
+
*/
|
212 |
+
protected function component_types() {
|
213 |
+
return array( 'all', 'optional', 'retired', 'required' );
|
214 |
+
}
|
215 |
+
|
216 |
+
/**
|
217 |
+
* Component Status.
|
218 |
+
*
|
219 |
+
* @since 1.6.0
|
220 |
+
*
|
221 |
+
* @return array An array of valid component status.
|
222 |
+
*/
|
223 |
+
protected function component_status() {
|
224 |
+
return array( 'all', 'active', 'inactive' );
|
225 |
+
}
|
226 |
+
}
|
cli/components/email.php
ADDED
@@ -0,0 +1,228 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI\Command;
|
3 |
+
|
4 |
+
use WP_CLI;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Manage BuddyPress Email Post Types.
|
8 |
+
*
|
9 |
+
* @since 1.6.0
|
10 |
+
*/
|
11 |
+
class Email extends BuddypressCommand {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Create a new email post connected to an email type.
|
15 |
+
*
|
16 |
+
* ## OPTIONS
|
17 |
+
*
|
18 |
+
* --type=<type>
|
19 |
+
* : Email type for the email (should be unique identifier, sanitized like a post slug).
|
20 |
+
*
|
21 |
+
* --type-description=<type-description>
|
22 |
+
* : Email type description.
|
23 |
+
*
|
24 |
+
* --subject=<subject>
|
25 |
+
* : Email subject line. Email tokens allowed. View https://codex.buddypress.org/emails/email-tokens/ for more info.
|
26 |
+
*
|
27 |
+
* [--content=<content>]
|
28 |
+
* : Email content. Email tokens allowed. View https://codex.buddypress.org/emails/email-tokens/ for more info.
|
29 |
+
*
|
30 |
+
* [--plain-text-content=<plain-text-content>]
|
31 |
+
* : Plain-text email content. Email tokens allowed. View https://codex.buddypress.org/emails/email-tokens/ for more info.
|
32 |
+
*
|
33 |
+
* [<file>]
|
34 |
+
* : Read content from <file>. If this value is present, the
|
35 |
+
* `--content` argument will be ignored.
|
36 |
+
*
|
37 |
+
* Passing `-` as the filename will cause post content to
|
38 |
+
* be read from STDIN.
|
39 |
+
*
|
40 |
+
* [--edit]
|
41 |
+
* : Immediately open system's editor to write or edit email content.
|
42 |
+
*
|
43 |
+
* If content is read from a file, from STDIN, or from the `--content`
|
44 |
+
* argument, that text will be loaded into the editor.
|
45 |
+
*
|
46 |
+
* ## EXAMPLES
|
47 |
+
*
|
48 |
+
* # Create email post
|
49 |
+
* $ wp bp email create --type=new-event --type-description="Send an email when a new event is created" --subject="[{{{site.name}}}] A new event was created" --content="<a href='{{{some.custom-token-url}}}'></a>A new event</a> was created" --plain-text-content="A new event was created"
|
50 |
+
* Success: Email post created for type "new-event".
|
51 |
+
*
|
52 |
+
* # Create email post with content from given file
|
53 |
+
* $ wp bp email create ./email-content.txt --type=new-event --type-description="Send an email when a new event is created" --subject="[{{{site.name}}}] A new event was created" --plain-text-content="A new event was created"
|
54 |
+
* Success: Email post created for type "new-event".
|
55 |
+
*
|
56 |
+
* @alias add
|
57 |
+
*/
|
58 |
+
public function create( $args, $assoc_args ) {
|
59 |
+
$switched = false;
|
60 |
+
|
61 |
+
if ( false === bp_is_root_blog() ) {
|
62 |
+
$switched = true;
|
63 |
+
switch_to_blog( bp_get_root_blog_id() );
|
64 |
+
}
|
65 |
+
|
66 |
+
$term = term_exists( $assoc_args['type'], bp_get_email_tax_type() );
|
67 |
+
|
68 |
+
// Term already exists so don't do anything.
|
69 |
+
if ( 0 !== $term && null !== $term ) {
|
70 |
+
if ( true === $switched ) {
|
71 |
+
restore_current_blog();
|
72 |
+
}
|
73 |
+
|
74 |
+
WP_CLI::error( "Email type '{$assoc_args['type']}' already exists." );
|
75 |
+
}
|
76 |
+
|
77 |
+
if ( ! empty( $args[0] ) ) {
|
78 |
+
$assoc_args['content'] = $this->read_from_file_or_stdin( $args[0] );
|
79 |
+
}
|
80 |
+
|
81 |
+
if ( \WP_CLI\Utils\get_flag_value( $assoc_args, 'edit' ) ) {
|
82 |
+
$input = \WP_CLI\Utils\get_flag_value( $assoc_args, 'content', '' );
|
83 |
+
$output = $this->_edit( $input, 'WP-CLI: New BP Email Content' );
|
84 |
+
|
85 |
+
if ( $output ) {
|
86 |
+
$assoc_args['content'] = $output;
|
87 |
+
} else {
|
88 |
+
$assoc_args['content'] = $input;
|
89 |
+
}
|
90 |
+
}
|
91 |
+
|
92 |
+
$id = $assoc_args['type'];
|
93 |
+
|
94 |
+
$defaults = array(
|
95 |
+
'post_status' => 'publish',
|
96 |
+
'post_type' => bp_get_email_post_type(),
|
97 |
+
);
|
98 |
+
|
99 |
+
$email = array(
|
100 |
+
'post_title' => $assoc_args['subject'],
|
101 |
+
'post_content' => $assoc_args['content'],
|
102 |
+
'post_excerpt' => ! empty( $assoc_args['plain-text-content'] ) ? $assoc_args['plain-text-content'] : '',
|
103 |
+
);
|
104 |
+
|
105 |
+
// Email post content.
|
106 |
+
$post_id = wp_insert_post( bp_parse_args( $email, $defaults, 'install_email_' . $id ), true );
|
107 |
+
|
108 |
+
// Save the situation.
|
109 |
+
if ( ! is_wp_error( $post_id ) ) {
|
110 |
+
$tt_ids = wp_set_object_terms( $post_id, $id, bp_get_email_tax_type() );
|
111 |
+
|
112 |
+
// Situation description.
|
113 |
+
if ( ! is_wp_error( $tt_ids ) && ! empty( $assoc_args['type-description'] ) ) {
|
114 |
+
$term = get_term_by( 'term_taxonomy_id', (int) $tt_ids[0], bp_get_email_tax_type() );
|
115 |
+
wp_update_term( (int) $term->term_id, bp_get_email_tax_type(), array(
|
116 |
+
'description' => $assoc_args['type-description'],
|
117 |
+
) );
|
118 |
+
}
|
119 |
+
|
120 |
+
if ( true === $switched ) {
|
121 |
+
restore_current_blog();
|
122 |
+
}
|
123 |
+
|
124 |
+
WP_CLI::success( "Email post created for type '{$assoc_args['type']}'." );
|
125 |
+
} else {
|
126 |
+
if ( true === $switched ) {
|
127 |
+
restore_current_blog();
|
128 |
+
}
|
129 |
+
|
130 |
+
WP_CLI::error( "There was a problem creating the email post for type '{$assoc_args['type']}' - " . $post_id->get_error_message() );
|
131 |
+
}
|
132 |
+
}
|
133 |
+
|
134 |
+
/**
|
135 |
+
* Get details for a post connected to an email type.
|
136 |
+
*
|
137 |
+
* ## OPTIONS
|
138 |
+
*
|
139 |
+
* <type>
|
140 |
+
* : The email type to fetch the post details for.
|
141 |
+
*
|
142 |
+
* [--field=<field>]
|
143 |
+
* : Instead of returning the whole post, returns the value of a single field.
|
144 |
+
*
|
145 |
+
* [--fields=<fields>]
|
146 |
+
* : Limit the output to specific fields. Defaults to all fields.
|
147 |
+
*
|
148 |
+
* [--format=<format>]
|
149 |
+
* : Render output in a particular format.
|
150 |
+
* ---
|
151 |
+
* default: table
|
152 |
+
* options:
|
153 |
+
* - table
|
154 |
+
* - csv
|
155 |
+
* - json
|
156 |
+
* - yaml
|
157 |
+
* ---
|
158 |
+
*
|
159 |
+
* ## EXAMPLE
|
160 |
+
*
|
161 |
+
* # Output the post ID for the 'activity-at-message' email type
|
162 |
+
* $ wp bp email get-post activity-at-message --fields=ID
|
163 |
+
*
|
164 |
+
* @alias get-post
|
165 |
+
* @alias see
|
166 |
+
*/
|
167 |
+
public function get_post( $args, $assoc_args ) {
|
168 |
+
$email = bp_get_email( $args[0] );
|
169 |
+
|
170 |
+
if ( is_wp_error( $email ) ) {
|
171 |
+
WP_CLI::error( "Email post for type '{$args[0]}' does not exist." );
|
172 |
+
}
|
173 |
+
|
174 |
+
$post_arr = get_object_vars( $email->get_post_object() );
|
175 |
+
unset( $post_arr['filter'] );
|
176 |
+
if ( empty( $assoc_args['fields'] ) ) {
|
177 |
+
$assoc_args['fields'] = array_keys( $post_arr );
|
178 |
+
}
|
179 |
+
|
180 |
+
$formatter = $this->get_formatter( $assoc_args );
|
181 |
+
$formatter->display_item( $email->get_post_object() );
|
182 |
+
}
|
183 |
+
|
184 |
+
/**
|
185 |
+
* Reinstall BuddyPress default emails.
|
186 |
+
*
|
187 |
+
* ## OPTIONS
|
188 |
+
*
|
189 |
+
* [--yes]
|
190 |
+
* : Answer yes to the confirmation message.
|
191 |
+
*
|
192 |
+
* ## EXAMPLE
|
193 |
+
*
|
194 |
+
* $ wp bp email reinstall --yes
|
195 |
+
* Success: Emails have been successfully reinstalled.
|
196 |
+
*/
|
197 |
+
public function reinstall( $args, $assoc_args ) {
|
198 |
+
WP_CLI::confirm( 'Are you sure you want to reinstall BuddyPress emails?', $assoc_args );
|
199 |
+
|
200 |
+
require_once buddypress()->plugin_dir . 'bp-core/admin/bp-core-admin-tools.php';
|
201 |
+
|
202 |
+
$result = bp_admin_reinstall_emails();
|
203 |
+
|
204 |
+
if ( 0 === $result[0] ) {
|
205 |
+
WP_CLI::success( $result[1] );
|
206 |
+
} else {
|
207 |
+
WP_CLI::error( $result[1] );
|
208 |
+
}
|
209 |
+
}
|
210 |
+
|
211 |
+
/**
|
212 |
+
* Helper method to use the '--edit' flag.
|
213 |
+
*
|
214 |
+
* Copied from Post_Command::_edit().
|
215 |
+
*
|
216 |
+
* @param string $content Post content.
|
217 |
+
* @param string $title Post title.
|
218 |
+
* @return mixed
|
219 |
+
*/
|
220 |
+
protected function _edit( $content, $title ) {
|
221 |
+
$content = apply_filters( 'the_editor_content', $content );
|
222 |
+
$output = \WP_CLI\Utils\launch_editor_for_input( $content, $title );
|
223 |
+
|
224 |
+
return ( is_string( $output ) ) ?
|
225 |
+
apply_filters( 'content_save_pre', $output )
|
226 |
+
: $output;
|
227 |
+
}
|
228 |
+
}
|
cli/components/friend.php
ADDED
@@ -0,0 +1,314 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI\Command;
|
3 |
+
|
4 |
+
use WP_CLI;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Manage BuddyPress Friends.
|
8 |
+
*
|
9 |
+
* @since 1.6.0
|
10 |
+
*/
|
11 |
+
class Friend extends BuddypressCommand {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Object fields.
|
15 |
+
*
|
16 |
+
* @var array
|
17 |
+
*/
|
18 |
+
protected $obj_fields = array(
|
19 |
+
'id',
|
20 |
+
'initiator_user_id',
|
21 |
+
'friend_user_id',
|
22 |
+
'is_confirmed',
|
23 |
+
'is_limited',
|
24 |
+
);
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Create a new friendship.
|
28 |
+
*
|
29 |
+
* ## OPTIONS
|
30 |
+
*
|
31 |
+
* <initiator>
|
32 |
+
* : ID of the user who is sending the friendship request. Accepts either a user_login or a numeric ID.
|
33 |
+
*
|
34 |
+
* <friend>
|
35 |
+
* : ID of the user whose friendship is being requested. Accepts either a user_login or a numeric ID.
|
36 |
+
*
|
37 |
+
* [--force-accept]
|
38 |
+
* : Whether to force acceptance.
|
39 |
+
*
|
40 |
+
* [--silent]
|
41 |
+
* : Whether to silent the message creation.
|
42 |
+
*
|
43 |
+
* [--porcelain]
|
44 |
+
* : Return only the friendship id.
|
45 |
+
*
|
46 |
+
* ## EXAMPLES
|
47 |
+
*
|
48 |
+
* $ wp bp friend create user1 another_use
|
49 |
+
* Success: Friendship successfully created.
|
50 |
+
*
|
51 |
+
* $ wp bp friend create user1 another_use --force-accept
|
52 |
+
* Success: Friendship successfully created.
|
53 |
+
*
|
54 |
+
* @alias add
|
55 |
+
*/
|
56 |
+
public function create( $args, $assoc_args ) {
|
57 |
+
// Members.
|
58 |
+
$initiator = $this->get_user_id_from_identifier( $args[0] );
|
59 |
+
$friend = $this->get_user_id_from_identifier( $args[1] );
|
60 |
+
|
61 |
+
// Silent it before it errors.
|
62 |
+
if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'silent' ) ) {
|
63 |
+
return;
|
64 |
+
}
|
65 |
+
|
66 |
+
// Check if users are already friends, and bail if they do.
|
67 |
+
if ( friends_check_friendship( $initiator->ID, $friend->ID ) ) {
|
68 |
+
WP_CLI::error( 'These users are already friends.' );
|
69 |
+
}
|
70 |
+
|
71 |
+
$force = WP_CLI\Utils\get_flag_value( $assoc_args, 'force-accept' );
|
72 |
+
|
73 |
+
if ( ! friends_add_friend( $initiator->ID, $friend->ID, $force ) ) {
|
74 |
+
WP_CLI::error( 'There was a problem while creating the friendship.' );
|
75 |
+
}
|
76 |
+
|
77 |
+
if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
|
78 |
+
WP_CLI::line( \BP_Friends_Friendship::get_friendship_id( $initiator->ID, $friend->ID ) );
|
79 |
+
} else {
|
80 |
+
if ( $force ) {
|
81 |
+
WP_CLI::success( 'Friendship successfully created.' );
|
82 |
+
} else {
|
83 |
+
WP_CLI::success( 'Friendship successfully created but not accepted.' );
|
84 |
+
}
|
85 |
+
}
|
86 |
+
}
|
87 |
+
|
88 |
+
/**
|
89 |
+
* Remove a friendship.
|
90 |
+
*
|
91 |
+
* ## OPTIONS
|
92 |
+
*
|
93 |
+
* <initiator>
|
94 |
+
* : ID of the friendship initiator. Accepts either a user_login or a numeric ID.
|
95 |
+
*
|
96 |
+
* <friend>
|
97 |
+
* : ID of the friend user. Accepts either a user_login or a numeric ID.
|
98 |
+
*
|
99 |
+
* ## EXAMPLE
|
100 |
+
*
|
101 |
+
* $ wp bp friend remove user1 another_user
|
102 |
+
* Success: Friendship successfully removed.
|
103 |
+
*
|
104 |
+
* @alias delete
|
105 |
+
*/
|
106 |
+
public function remove( $args, $assoc_args ) {
|
107 |
+
// Members.
|
108 |
+
$initiator = $this->get_user_id_from_identifier( $args[0] );
|
109 |
+
$friend = $this->get_user_id_from_identifier( $args[1] );
|
110 |
+
|
111 |
+
// Check if users are already friends, if not, bail.
|
112 |
+
if ( ! friends_check_friendship( $initiator->ID, $friend->ID ) ) {
|
113 |
+
WP_CLI::error( 'These users are not friends.' );
|
114 |
+
}
|
115 |
+
|
116 |
+
if ( friends_remove_friend( $initiator->ID, $friend->ID ) ) {
|
117 |
+
WP_CLI::success( 'Friendship successfully removed.' );
|
118 |
+
} else {
|
119 |
+
WP_CLI::error( 'There was a problem while removing the friendship.' );
|
120 |
+
}
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Mark a friendship request as accepted.
|
125 |
+
*
|
126 |
+
* ## OPTIONS
|
127 |
+
*
|
128 |
+
* <friendship>...
|
129 |
+
* : ID(s) of the friendship(s).
|
130 |
+
*
|
131 |
+
* ## EXAMPLES
|
132 |
+
*
|
133 |
+
* $ wp bp friend accept_invitation 2161
|
134 |
+
* Success: Friendship successfully accepted.
|
135 |
+
*
|
136 |
+
* $ wp bp friend accept 2161
|
137 |
+
* Success: Friendship successfully accepted.
|
138 |
+
*
|
139 |
+
* @alias accept_invitation
|
140 |
+
*/
|
141 |
+
public function accept( $args, $assoc_args ) {
|
142 |
+
foreach ( $args as $friendship_id ) {
|
143 |
+
if ( friends_accept_friendship( (int) $friendship_id ) ) {
|
144 |
+
WP_CLI::success( 'Friendship successfully accepted.' );
|
145 |
+
} else {
|
146 |
+
WP_CLI::error( 'There was a problem accepting the friendship.' );
|
147 |
+
}
|
148 |
+
}
|
149 |
+
}
|
150 |
+
|
151 |
+
/**
|
152 |
+
* Mark a friendship request as rejected.
|
153 |
+
*
|
154 |
+
* ## OPTIONS
|
155 |
+
*
|
156 |
+
* <friendship>...
|
157 |
+
* : ID(s) of the friendship(s).
|
158 |
+
*
|
159 |
+
* ## EXAMPLES
|
160 |
+
*
|
161 |
+
* $ wp bp friend reject_invitation 2161
|
162 |
+
* Success: Friendship successfully accepted.
|
163 |
+
*
|
164 |
+
* $ wp bp friend reject 2161 151 2121
|
165 |
+
* Success: Friendship successfully accepted.
|
166 |
+
*
|
167 |
+
* @alias reject_invitation
|
168 |
+
*/
|
169 |
+
public function reject( $args, $assoc_args ) {
|
170 |
+
foreach ( $args as $friendship_id ) {
|
171 |
+
if ( friends_reject_friendship( (int) $friendship_id ) ) {
|
172 |
+
WP_CLI::success( 'Friendship successfully rejected.' );
|
173 |
+
} else {
|
174 |
+
WP_CLI::error( 'There was a problem rejecting the friendship.' );
|
175 |
+
}
|
176 |
+
}
|
177 |
+
}
|
178 |
+
|
179 |
+
/**
|
180 |
+
* Check whether two users are friends.
|
181 |
+
*
|
182 |
+
* ## OPTIONS
|
183 |
+
*
|
184 |
+
* <user>
|
185 |
+
* : ID of the first user. Accepts either a user_login or a numeric ID.
|
186 |
+
*
|
187 |
+
* <friend>
|
188 |
+
* : ID of the other user. Accepts either a user_login or a numeric ID.
|
189 |
+
*
|
190 |
+
* ## EXAMPLES
|
191 |
+
*
|
192 |
+
* $ wp bp friend check 2161 65465
|
193 |
+
* Success: Yes, they are friends.
|
194 |
+
*
|
195 |
+
* $ wp bp friend see 2121 65456
|
196 |
+
* Success: Yes, they are friends.
|
197 |
+
*
|
198 |
+
* @alias see
|
199 |
+
*/
|
200 |
+
public function check( $args, $assoc_args ) {
|
201 |
+
// Members.
|
202 |
+
$user = $this->get_user_id_from_identifier( $args[0] );
|
203 |
+
$friend = $this->get_user_id_from_identifier( $args[1] );
|
204 |
+
|
205 |
+
if ( friends_check_friendship( $user->ID, $friend->ID ) ) {
|
206 |
+
WP_CLI::success( 'Yes, they are friends.' );
|
207 |
+
} else {
|
208 |
+
WP_CLI::error( 'No, they are not friends.' );
|
209 |
+
}
|
210 |
+
}
|
211 |
+
|
212 |
+
/**
|
213 |
+
* Get a list of user's friends.
|
214 |
+
*
|
215 |
+
* ## OPTIONS
|
216 |
+
*
|
217 |
+
* <user>
|
218 |
+
* : ID of the user. Accepts either a user_login or a numeric ID.
|
219 |
+
*
|
220 |
+
* [--fields=<fields>]
|
221 |
+
* : Fields to display.
|
222 |
+
*
|
223 |
+
* [--format=<format>]
|
224 |
+
* : Render output in a particular format.
|
225 |
+
* ---
|
226 |
+
* default: table
|
227 |
+
* options:
|
228 |
+
* - table
|
229 |
+
* - ids
|
230 |
+
* - csv
|
231 |
+
* - count
|
232 |
+
* - haml
|
233 |
+
* ---
|
234 |
+
*
|
235 |
+
* ## EXAMPLES
|
236 |
+
*
|
237 |
+
* $ wp bp friend list 65465 --format=ids
|
238 |
+
* $ wp bp friend list 2422 --format=count
|
239 |
+
*
|
240 |
+
* @subcommand list
|
241 |
+
*/
|
242 |
+
public function _list( $args, $assoc_args ) {
|
243 |
+
$formatter = $this->get_formatter( $assoc_args );
|
244 |
+
$user = $this->get_user_id_from_identifier( $args[0] );
|
245 |
+
$friends = \BP_Friends_Friendship::get_friendships( $user->ID );
|
246 |
+
|
247 |
+
if ( empty( $friends ) ) {
|
248 |
+
WP_CLI::error( 'This member has no friends.' );
|
249 |
+
}
|
250 |
+
|
251 |
+
if ( 'ids' === $formatter->format ) {
|
252 |
+
echo implode( ' ', wp_list_pluck( $friends, 'friend_user_id' ) ); // WPCS: XSS ok.
|
253 |
+
} elseif ( 'count' === $formatter->format ) {
|
254 |
+
$formatter->display_items( $friends );
|
255 |
+
} else {
|
256 |
+
$formatter->display_items( $friends );
|
257 |
+
}
|
258 |
+
}
|
259 |
+
|
260 |
+
/**
|
261 |
+
* Generate random friendships.
|
262 |
+
*
|
263 |
+
* ## OPTIONS
|
264 |
+
*
|
265 |
+
* [--count=<number>]
|
266 |
+
* : How many friendships to generate.
|
267 |
+
* ---
|
268 |
+
* default: 100
|
269 |
+
* ---
|
270 |
+
*
|
271 |
+
* [--initiator=<user>]
|
272 |
+
* : ID of the first user. Accepts either a user_login or a numeric ID.
|
273 |
+
*
|
274 |
+
* [--friend=<user>]
|
275 |
+
* : ID of the second user. Accepts either a user_login or a numeric ID.
|
276 |
+
*
|
277 |
+
* [--force-accept]
|
278 |
+
* : Whether to force acceptance.
|
279 |
+
*
|
280 |
+
* ## EXAMPLES
|
281 |
+
*
|
282 |
+
* $ wp bp friend generate --count=50
|
283 |
+
* $ wp bp friend generate --initiator=121 --count=50
|
284 |
+
*/
|
285 |
+
public function generate( $args, $assoc_args ) {
|
286 |
+
$notify = WP_CLI\Utils\make_progress_bar( 'Generating friendships', $assoc_args['count'] );
|
287 |
+
|
288 |
+
for ( $i = 0; $i < $assoc_args['count']; $i++ ) {
|
289 |
+
|
290 |
+
if ( isset( $assoc_args['initiator'] ) ) {
|
291 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['initiator'] );
|
292 |
+
$member = $user->ID;
|
293 |
+
} else {
|
294 |
+
$member = $this->get_random_user_id();
|
295 |
+
}
|
296 |
+
|
297 |
+
if ( isset( $assoc_args['friend'] ) ) {
|
298 |
+
$user_2 = $this->get_user_id_from_identifier( $assoc_args['friend'] );
|
299 |
+
$friend = $user_2->ID;
|
300 |
+
} else {
|
301 |
+
$friend = $this->get_random_user_id();
|
302 |
+
}
|
303 |
+
|
304 |
+
$this->create( array( $member, $friend ), array(
|
305 |
+
'silent',
|
306 |
+
'force-accept',
|
307 |
+
) );
|
308 |
+
|
309 |
+
$notify->tick();
|
310 |
+
}
|
311 |
+
|
312 |
+
$notify->finish();
|
313 |
+
}
|
314 |
+
}
|
cli/components/group-invite.php
ADDED
@@ -0,0 +1,340 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI\Command;
|
3 |
+
|
4 |
+
use WP_CLI;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Manage BuddyPress group invites.
|
8 |
+
*
|
9 |
+
* @since 1.5.0
|
10 |
+
*/
|
11 |
+
class Group_Invite extends BuddypressCommand {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Group ID Object Key
|
15 |
+
*
|
16 |
+
* @var string
|
17 |
+
*/
|
18 |
+
protected $obj_id_key = 'group_id';
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Group Object Type
|
22 |
+
*
|
23 |
+
* @var string
|
24 |
+
*/
|
25 |
+
protected $obj_type = 'group';
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Invite a member to a group.
|
29 |
+
*
|
30 |
+
* ## OPTIONS
|
31 |
+
*
|
32 |
+
* [--group-id=<group>]
|
33 |
+
* : Identifier for the group. Accepts either a slug or a numeric ID.
|
34 |
+
*
|
35 |
+
* [--user-id=<user>]
|
36 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
37 |
+
*
|
38 |
+
* [--inviter-id=<user>]
|
39 |
+
* : Identifier for the inviter. Accepts either a user_login or a numeric ID.
|
40 |
+
*
|
41 |
+
* [--<field>=<value>]
|
42 |
+
* : One or more parameters to pass. See groups_invite_user()
|
43 |
+
*
|
44 |
+
* [--silent]
|
45 |
+
* : Whether to silent the invite creation.
|
46 |
+
*
|
47 |
+
* ## EXAMPLES
|
48 |
+
*
|
49 |
+
* $ wp bp group invite add --group-id=40 --user-id=10 --inviter-id=1331
|
50 |
+
* Success: Member invited to the group.
|
51 |
+
*
|
52 |
+
* $ wp bp group invite create --group-id=40 --user-id=admin --inviter-id=804
|
53 |
+
* Success: Member invited to the group.
|
54 |
+
*
|
55 |
+
* @alias add
|
56 |
+
*/
|
57 |
+
public function create( $args, $assoc_args ) {
|
58 |
+
$r = wp_parse_args( $assoc_args, array(
|
59 |
+
'user-id' => '',
|
60 |
+
'group-id' => '',
|
61 |
+
'inviter-id' => '',
|
62 |
+
'date-modified' => bp_core_current_time(),
|
63 |
+
'is-confirmed' => 0,
|
64 |
+
) );
|
65 |
+
|
66 |
+
$group_id = $this->get_group_id_from_identifier( $r['group-id'] );
|
67 |
+
$user = $this->get_user_id_from_identifier( $r['user-id'] );
|
68 |
+
$inviter = $this->get_user_id_from_identifier( $r['inviter-id'] );
|
69 |
+
|
70 |
+
$invite = groups_invite_user( array(
|
71 |
+
'user_id' => $user->ID,
|
72 |
+
'group_id' => $group_id,
|
73 |
+
'inviter_id' => $inviter->ID,
|
74 |
+
'date_modified' => $assoc_args['date-modified'],
|
75 |
+
'is_confirmed' => $assoc_args['is-confirmed'],
|
76 |
+
) );
|
77 |
+
|
78 |
+
groups_send_invites( $inviter->ID, $group_id );
|
79 |
+
|
80 |
+
if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'silent' ) ) {
|
81 |
+
return;
|
82 |
+
}
|
83 |
+
|
84 |
+
if ( $invite ) {
|
85 |
+
WP_CLI::success( 'Member invited to the group.' );
|
86 |
+
} else {
|
87 |
+
WP_CLI::error( 'Could not invite the member.' );
|
88 |
+
}
|
89 |
+
}
|
90 |
+
|
91 |
+
/**
|
92 |
+
* Uninvite a user from a group.
|
93 |
+
*
|
94 |
+
* ## OPTIONS
|
95 |
+
*
|
96 |
+
* --group-id=<group>
|
97 |
+
* : Identifier for the group. Accepts either a slug or a numeric ID.
|
98 |
+
*
|
99 |
+
* --user-id=<user>
|
100 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
101 |
+
*
|
102 |
+
* ## EXAMPLES
|
103 |
+
*
|
104 |
+
* $ wp bp group invite remove --group-id=3 --user-id=10
|
105 |
+
* Success: User uninvited from the group.
|
106 |
+
*
|
107 |
+
* $ wp bp group invite remove --group-id=foo --user-id=admin
|
108 |
+
* Success: User uninvited from the group.
|
109 |
+
*
|
110 |
+
* @alias uninvite
|
111 |
+
*/
|
112 |
+
public function remove( $args, $assoc_args ) {
|
113 |
+
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
|
114 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
115 |
+
|
116 |
+
if ( groups_uninvite_user( $user->ID, $group_id ) ) {
|
117 |
+
WP_CLI::success( 'User uninvited from the group.' );
|
118 |
+
} else {
|
119 |
+
WP_CLI::error( 'Could not remove the user.' );
|
120 |
+
}
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Get a list of invitations from a group.
|
125 |
+
*
|
126 |
+
* ## OPTIONS
|
127 |
+
*
|
128 |
+
* --group-id=<group>
|
129 |
+
* : Identifier for the group. Accepts either a slug or a numeric ID.
|
130 |
+
*
|
131 |
+
* --user-id=<user>
|
132 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
133 |
+
*
|
134 |
+
* [--format=<format>]
|
135 |
+
* : Render output in a particular format.
|
136 |
+
* ---
|
137 |
+
* default: table
|
138 |
+
* options:
|
139 |
+
* - table
|
140 |
+
* - ids
|
141 |
+
* - csv
|
142 |
+
* - count
|
143 |
+
* - haml
|
144 |
+
* ---
|
145 |
+
*
|
146 |
+
* ## EXAMPLES
|
147 |
+
*
|
148 |
+
* $ wp bp group invite list --user-id=30 --group-id=56
|
149 |
+
*
|
150 |
+
* @subcommand list
|
151 |
+
*/
|
152 |
+
public function _list( $args, $assoc_args ) {
|
153 |
+
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
|
154 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
155 |
+
$user_id = $user->ID;
|
156 |
+
|
157 |
+
if ( $group_id ) {
|
158 |
+
$invite_query = new \BP_Group_Member_Query( array(
|
159 |
+
'is_confirmed' => false,
|
160 |
+
'group_id' => $group_id,
|
161 |
+
) );
|
162 |
+
|
163 |
+
$invites = $invite_query->results;
|
164 |
+
|
165 |
+
// Manually filter out user ID - this is not supported by the API.
|
166 |
+
if ( $user_id ) {
|
167 |
+
$user_invites = array();
|
168 |
+
|
169 |
+
foreach ( $invites as $invite ) {
|
170 |
+
if ( $user_id === $invite->user_id ) {
|
171 |
+
$user_invites[] = $invite;
|
172 |
+
}
|
173 |
+
}
|
174 |
+
|
175 |
+
$invites = $user_invites;
|
176 |
+
}
|
177 |
+
|
178 |
+
if ( empty( $invites ) ) {
|
179 |
+
WP_CLI::error( 'No invitations found.' );
|
180 |
+
}
|
181 |
+
|
182 |
+
if ( empty( $assoc_args['fields'] ) ) {
|
183 |
+
$fields = array();
|
184 |
+
|
185 |
+
if ( ! $user_id ) {
|
186 |
+
$fields[] = 'user_id';
|
187 |
+
}
|
188 |
+
|
189 |
+
$fields[] = 'inviter_id';
|
190 |
+
$fields[] = 'invite_sent';
|
191 |
+
$fields[] = 'date_modified';
|
192 |
+
|
193 |
+
$assoc_args['fields'] = $fields;
|
194 |
+
}
|
195 |
+
|
196 |
+
$formatter = $this->get_formatter( $assoc_args );
|
197 |
+
$formatter->display_items( $invites );
|
198 |
+
} else {
|
199 |
+
$invite_query = groups_get_invites_for_user( $user_id );
|
200 |
+
$invites = $invite_query['groups'];
|
201 |
+
|
202 |
+
if ( empty( $assoc_args['fields'] ) ) {
|
203 |
+
$fields = array(
|
204 |
+
'id',
|
205 |
+
'name',
|
206 |
+
'slug',
|
207 |
+
);
|
208 |
+
|
209 |
+
$assoc_args['fields'] = $fields;
|
210 |
+
}
|
211 |
+
|
212 |
+
$formatter = $this->get_formatter( $assoc_args );
|
213 |
+
$formatter->display_items( $invites );
|
214 |
+
}
|
215 |
+
}
|
216 |
+
|
217 |
+
/**
|
218 |
+
* Generate random group invitations.
|
219 |
+
*
|
220 |
+
* ## OPTIONS
|
221 |
+
*
|
222 |
+
* [--count=<number>]
|
223 |
+
* : How many groups invitations to generate.
|
224 |
+
* ---
|
225 |
+
* default: 100
|
226 |
+
* ---
|
227 |
+
*
|
228 |
+
* ## EXAMPLE
|
229 |
+
*
|
230 |
+
* $ wp bp group invite generate --count=50
|
231 |
+
*/
|
232 |
+
public function generate( $args, $assoc_args ) {
|
233 |
+
$notify = WP_CLI\Utils\make_progress_bar( 'Generating random group invitations', $assoc_args['count'] );
|
234 |
+
|
235 |
+
for ( $i = 0; $i < $assoc_args['count']; $i++ ) {
|
236 |
+
$this->add( array(), array(
|
237 |
+
'user-id' => $this->get_random_user_id(),
|
238 |
+
'group-id' => \BP_Groups_Group::get_random( 1, 1 )['groups'][0]->slug,
|
239 |
+
'inviter-id' => $this->get_random_user_id(),
|
240 |
+
'silent',
|
241 |
+
) );
|
242 |
+
|
243 |
+
$notify->tick();
|
244 |
+
}
|
245 |
+
|
246 |
+
$notify->finish();
|
247 |
+
}
|
248 |
+
|
249 |
+
/**
|
250 |
+
* Accept a group invitation.
|
251 |
+
*
|
252 |
+
* ## OPTIONS
|
253 |
+
*
|
254 |
+
* --group-id=<group>
|
255 |
+
* : Identifier for the group. Accepts either a slug or a numeric ID.
|
256 |
+
*
|
257 |
+
* --user-id=<user>
|
258 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
259 |
+
*
|
260 |
+
* ## EXAMPLES
|
261 |
+
*
|
262 |
+
* $ wp bp group invite accept --group-id=3 --user-id=10
|
263 |
+
* Success: User is now a "member" of the group.
|
264 |
+
*
|
265 |
+
* $ wp bp group invite accept --group-id=foo --user-id=admin
|
266 |
+
* Success: User is now a "member" of the group.
|
267 |
+
*/
|
268 |
+
public function accept( $args, $assoc_args ) {
|
269 |
+
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
|
270 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
271 |
+
|
272 |
+
if ( groups_accept_invite( $user->ID, $group_id ) ) {
|
273 |
+
WP_CLI::success( 'User is now a "member" of the group.' );
|
274 |
+
} else {
|
275 |
+
WP_CLI::error( 'Could not accept user invitation to the group.' );
|
276 |
+
}
|
277 |
+
}
|
278 |
+
|
279 |
+
/**
|
280 |
+
* Reject a group invitation.
|
281 |
+
*
|
282 |
+
* ## OPTIONS
|
283 |
+
*
|
284 |
+
* --group-id=<group>
|
285 |
+
* : Identifier for the group. Accepts either a slug or a numeric ID.
|
286 |
+
*
|
287 |
+
* --user-id=<user>
|
288 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
289 |
+
*
|
290 |
+
* ## EXAMPLES
|
291 |
+
*
|
292 |
+
* $ wp bp group invite reject --group-id=3 --user-id=10
|
293 |
+
* Success: Member invitation rejected.
|
294 |
+
*
|
295 |
+
* $ wp bp group invite reject --group-id=foo --user-id=admin
|
296 |
+
* Success: Member invitation rejected.
|
297 |
+
*/
|
298 |
+
public function reject( $args, $assoc_args ) {
|
299 |
+
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
|
300 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
301 |
+
|
302 |
+
if ( groups_reject_invite( $user->ID, $group_id ) ) {
|
303 |
+
WP_CLI::success( 'Member invitation rejected.' );
|
304 |
+
} else {
|
305 |
+
WP_CLI::error( 'Could not reject member invitation.' );
|
306 |
+
}
|
307 |
+
}
|
308 |
+
|
309 |
+
/**
|
310 |
+
* Delete a group invitation.
|
311 |
+
*
|
312 |
+
* ## OPTIONS
|
313 |
+
*
|
314 |
+
* --group-id=<group>
|
315 |
+
* : Identifier for the group. Accepts either a slug or a numeric ID.
|
316 |
+
*
|
317 |
+
* --user-id=<user>
|
318 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
319 |
+
*
|
320 |
+
* ## EXAMPLES
|
321 |
+
*
|
322 |
+
* $ wp bp group invite delete --group-id=3 --user-id=10
|
323 |
+
* Success: Member invitation deleted from the group.
|
324 |
+
*
|
325 |
+
* $ wp bp group invite delete --group-id=foo --user-id=admin
|
326 |
+
* Success: Member invitation deleted from the group.
|
327 |
+
*
|
328 |
+
* @alias remove
|
329 |
+
*/
|
330 |
+
public function delete( $args, $assoc_args ) {
|
331 |
+
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
|
332 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
333 |
+
|
334 |
+
if ( groups_delete_invite( $user->ID, $group_id ) ) {
|
335 |
+
WP_CLI::success( 'Member invitation deleted from the group.' );
|
336 |
+
} else {
|
337 |
+
WP_CLI::error( 'Could not delete member invitation from the group.' );
|
338 |
+
}
|
339 |
+
}
|
340 |
+
}
|
cli/components/group-member.php
ADDED
@@ -0,0 +1,358 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI\Command;
|
3 |
+
|
4 |
+
use WP_CLI;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Manage BuddyPress group members.
|
8 |
+
*
|
9 |
+
* @since 1.5.0
|
10 |
+
*/
|
11 |
+
class Group_Member extends BuddypressCommand {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Group ID Object Key
|
15 |
+
*
|
16 |
+
* @var string
|
17 |
+
*/
|
18 |
+
protected $obj_id_key = 'group_id';
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Group Object Type
|
22 |
+
*
|
23 |
+
* @var string
|
24 |
+
*/
|
25 |
+
protected $obj_type = 'group';
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Add a member to a group.
|
29 |
+
*
|
30 |
+
* ## OPTIONS
|
31 |
+
*
|
32 |
+
* ## OPTIONS
|
33 |
+
*
|
34 |
+
* --group-id=<group>
|
35 |
+
* : Identifier for the group. Accepts either a slug or a numeric ID.
|
36 |
+
*
|
37 |
+
* --user-id=<user>
|
38 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
39 |
+
*
|
40 |
+
* [--role=<role>]
|
41 |
+
* : Group member role (member, mod, admin).
|
42 |
+
* ---
|
43 |
+
* Default: member
|
44 |
+
* ---
|
45 |
+
*
|
46 |
+
* [--porcelain]
|
47 |
+
* : Return only the added group member id.
|
48 |
+
*
|
49 |
+
* ## EXAMPLES
|
50 |
+
*
|
51 |
+
* $ wp bp group member add --group-id=3 --user-id=10
|
52 |
+
* Success: Added user #3 to group #3 as member.
|
53 |
+
*
|
54 |
+
* $ wp bp group member create --group-id=bar --user-id=20 --role=mod
|
55 |
+
* Success: Added user #20 to group #45 as mod.
|
56 |
+
*
|
57 |
+
* @alias add
|
58 |
+
*/
|
59 |
+
public function create( $args, $assoc_args ) {
|
60 |
+
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
|
61 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
62 |
+
|
63 |
+
// Sanitize role.
|
64 |
+
$role = $assoc_args['role'];
|
65 |
+
if ( empty( $role ) || ! in_array( $role, $this->group_roles(), true ) ) {
|
66 |
+
$role = 'member';
|
67 |
+
}
|
68 |
+
|
69 |
+
$joined = groups_join_group( $group_id, $user->ID );
|
70 |
+
|
71 |
+
if ( ! $joined ) {
|
72 |
+
WP_CLI::error( 'Could not add user to the group.' );
|
73 |
+
}
|
74 |
+
|
75 |
+
if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
|
76 |
+
WP_CLI::line( $user->ID );
|
77 |
+
} else {
|
78 |
+
if ( 'member' !== $role ) {
|
79 |
+
groups_promote_member( $user->ID, $group_id, $role );
|
80 |
+
}
|
81 |
+
|
82 |
+
$success = sprintf(
|
83 |
+
'Added user #%d to group #%d as %s.',
|
84 |
+
$user->ID,
|
85 |
+
$group_id,
|
86 |
+
$role
|
87 |
+
);
|
88 |
+
WP_CLI::success( $success );
|
89 |
+
}
|
90 |
+
}
|
91 |
+
|
92 |
+
/**
|
93 |
+
* Remove a member from a group.
|
94 |
+
*
|
95 |
+
* ## OPTIONS
|
96 |
+
*
|
97 |
+
* --group-id=<group>
|
98 |
+
* : Identifier for the group. Accepts either a slug or a numeric ID.
|
99 |
+
*
|
100 |
+
* --user-id=<user>
|
101 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
102 |
+
*
|
103 |
+
* ## EXAMPLES
|
104 |
+
*
|
105 |
+
* $ wp bp group member remove --group-id=3 --user-id=10
|
106 |
+
* Success: Member #10 removed from the group #3.
|
107 |
+
*
|
108 |
+
* $ wp bp group member delete --group-id=foo --user-id=admin
|
109 |
+
* Success: Member #545 removed from the group #12.
|
110 |
+
*
|
111 |
+
* @alias delete
|
112 |
+
*/
|
113 |
+
public function remove( $args, $assoc_args ) {
|
114 |
+
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
|
115 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
116 |
+
$member = new \BP_Groups_Member( $user->ID, $group_id );
|
117 |
+
|
118 |
+
// True on success.
|
119 |
+
if ( $member->remove() ) {
|
120 |
+
WP_CLI::success( sprintf( 'Member #%d removed from the group #%d.', $user->ID, $group_id ) );
|
121 |
+
} else {
|
122 |
+
WP_CLI::error( 'Could not remove member from the group.' );
|
123 |
+
}
|
124 |
+
}
|
125 |
+
|
126 |
+
/**
|
127 |
+
* Get a list of group memberships.
|
128 |
+
*
|
129 |
+
* This command can be used to fetch a list of a user's groups (using the --user-id
|
130 |
+
* parameter) or a group's members (using the --group-id flag).
|
131 |
+
*
|
132 |
+
* ## OPTIONS
|
133 |
+
*
|
134 |
+
* <group-id>
|
135 |
+
* : Identifier for the group. Can be a numeric ID or the group slug.
|
136 |
+
*
|
137 |
+
* [--fields=<fields>]
|
138 |
+
* : Limit the output to specific signup fields.
|
139 |
+
*
|
140 |
+
* [--format=<format>]
|
141 |
+
* : Render output in a particular format.
|
142 |
+
* ---
|
143 |
+
* default: table
|
144 |
+
* options:
|
145 |
+
* - table
|
146 |
+
* - csv
|
147 |
+
* - ids
|
148 |
+
* - json
|
149 |
+
* - count
|
150 |
+
* - yaml
|
151 |
+
* ---
|
152 |
+
*
|
153 |
+
* [--<field>=<value>]
|
154 |
+
* : One or more parameters to pass. See groups_get_group_members()
|
155 |
+
*
|
156 |
+
* ## EXAMPLES
|
157 |
+
*
|
158 |
+
* $ wp bp group member list 3
|
159 |
+
* $ wp bp group member list my-group
|
160 |
+
*
|
161 |
+
* @subcommand list
|
162 |
+
*/
|
163 |
+
public function _list( $args, $assoc_args ) {
|
164 |
+
$group_id = $this->get_group_id_from_identifier( $args[0] );
|
165 |
+
|
166 |
+
$roles = array( 'members' );
|
167 |
+
if ( isset( $assoc_args['role'] ) ) {
|
168 |
+
if ( is_string( $assoc_args['role'] ) ) {
|
169 |
+
$roles = explode( ',', $assoc_args['role'] );
|
170 |
+
} else {
|
171 |
+
$roles = $assoc_args['role'];
|
172 |
+
}
|
173 |
+
}
|
174 |
+
|
175 |
+
// Get our members.
|
176 |
+
$members_query = groups_get_group_members( array(
|
177 |
+
'group_id' => $group_id,
|
178 |
+
'exclude_admins_mods' => false,
|
179 |
+
'group_role' => $roles,
|
180 |
+
) );
|
181 |
+
$members = $members_query['members'];
|
182 |
+
|
183 |
+
// Make 'role' human-readable.
|
184 |
+
foreach ( $members as &$member ) {
|
185 |
+
$role = 'member';
|
186 |
+
if ( $member->is_mod ) {
|
187 |
+
$role = 'mod';
|
188 |
+
} elseif ( $member->is_admin ) {
|
189 |
+
$role = 'admin';
|
190 |
+
}
|
191 |
+
|
192 |
+
$member->role = $role;
|
193 |
+
}
|
194 |
+
|
195 |
+
if ( empty( $members ) ) {
|
196 |
+
WP_CLI::error( 'No group members found.' );
|
197 |
+
}
|
198 |
+
|
199 |
+
if ( empty( $assoc_args['fields'] ) ) {
|
200 |
+
$fields = array(
|
201 |
+
'user_id',
|
202 |
+
'user_login',
|
203 |
+
'fullname',
|
204 |
+
'date_modified',
|
205 |
+
'role',
|
206 |
+
);
|
207 |
+
|
208 |
+
$assoc_args['fields'] = $fields;
|
209 |
+
}
|
210 |
+
|
211 |
+
$formatter = $this->get_formatter( $assoc_args );
|
212 |
+
$formatter->display_items( $members );
|
213 |
+
}
|
214 |
+
|
215 |
+
/**
|
216 |
+
* Promote a member to a new status within a group.
|
217 |
+
*
|
218 |
+
* ## OPTIONS
|
219 |
+
*
|
220 |
+
* --group-id=<group>
|
221 |
+
* : Identifier for the group. Accepts either a slug or a numeric ID.
|
222 |
+
*
|
223 |
+
* --user-id=<user>
|
224 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
225 |
+
*
|
226 |
+
* --role=<role>
|
227 |
+
* : Group role to promote the member (mod, admin).
|
228 |
+
*
|
229 |
+
* ## EXAMPLES
|
230 |
+
*
|
231 |
+
* $ wp bp group member promote --group-id=3 --user-id=10 --role=admin
|
232 |
+
* Success: Member promoted to new role successfully.
|
233 |
+
*
|
234 |
+
* $ wp bp group member promote --group-id=foo --user-id=admin --role=mod
|
235 |
+
* Success: Member promoted to new role successfully.
|
236 |
+
*/
|
237 |
+
public function promote( $args, $assoc_args ) {
|
238 |
+
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
|
239 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
240 |
+
$role = $assoc_args['role'];
|
241 |
+
|
242 |
+
if ( ! in_array( $role, $this->group_roles(), true ) ) {
|
243 |
+
WP_CLI::error( 'You need a valid role to promote the member.' );
|
244 |
+
}
|
245 |
+
|
246 |
+
$member = new \BP_Groups_Member( $user->ID, $group_id );
|
247 |
+
|
248 |
+
if ( $member->promote( $role ) ) {
|
249 |
+
WP_CLI::success( 'Member promoted to new role successfully.' );
|
250 |
+
} else {
|
251 |
+
WP_CLI::error( 'Could not promote the member.' );
|
252 |
+
}
|
253 |
+
}
|
254 |
+
|
255 |
+
/**
|
256 |
+
* Demote user to the 'member' status.
|
257 |
+
*
|
258 |
+
* ## OPTIONS
|
259 |
+
*
|
260 |
+
* --group-id=<group>
|
261 |
+
* : Identifier for the group. Accepts either a slug or a numeric ID.
|
262 |
+
*
|
263 |
+
* --user-id=<user>
|
264 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
265 |
+
*
|
266 |
+
* ## EXAMPLES
|
267 |
+
*
|
268 |
+
* $ wp bp group member demote --group-id=3 --user-id=10
|
269 |
+
* Success: User demoted to the "member" status.
|
270 |
+
*
|
271 |
+
* $ wp bp group member demote --group-id=foo --user-id=admin
|
272 |
+
* Success: User demoted to the "member" status.
|
273 |
+
*/
|
274 |
+
public function demote( $args, $assoc_args ) {
|
275 |
+
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
|
276 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
277 |
+
$member = new \BP_Groups_Member( $user->ID, $group_id );
|
278 |
+
|
279 |
+
if ( $member->demote() ) {
|
280 |
+
WP_CLI::success( 'User demoted to the "member" status.' );
|
281 |
+
} else {
|
282 |
+
WP_CLI::error( 'Could not demote the member.' );
|
283 |
+
}
|
284 |
+
}
|
285 |
+
|
286 |
+
/**
|
287 |
+
* Ban a member from a group.
|
288 |
+
*
|
289 |
+
* ## OPTIONS
|
290 |
+
*
|
291 |
+
* --group-id=<group>
|
292 |
+
* : Identifier for the group. Accepts either a slug or a numeric ID.
|
293 |
+
*
|
294 |
+
* --user-id=<user>
|
295 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
296 |
+
*
|
297 |
+
* ## EXAMPLES
|
298 |
+
*
|
299 |
+
* $ wp bp group member ban --group-id=3 --user-id=10
|
300 |
+
* Success: Member banned from the group.
|
301 |
+
*
|
302 |
+
* $ wp bp group member ban --group-id=foo --user-id=admin
|
303 |
+
* Success: Member banned from the group.
|
304 |
+
*/
|
305 |
+
public function ban( $args, $assoc_args ) {
|
306 |
+
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
|
307 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
308 |
+
$member = new \BP_Groups_Member( $user->ID, $group_id );
|
309 |
+
|
310 |
+
if ( $member->ban() ) {
|
311 |
+
WP_CLI::success( 'Member banned from the group.' );
|
312 |
+
} else {
|
313 |
+
WP_CLI::error( 'Could not ban the member.' );
|
314 |
+
}
|
315 |
+
}
|
316 |
+
|
317 |
+
/**
|
318 |
+
* Unban a member from a group.
|
319 |
+
*
|
320 |
+
* ## OPTIONS
|
321 |
+
*
|
322 |
+
* --group-id=<group>
|
323 |
+
* : Identifier for the group. Accepts either a slug or a numeric ID.
|
324 |
+
*
|
325 |
+
* --user-id=<user>
|
326 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
327 |
+
*
|
328 |
+
* ## EXAMPLES
|
329 |
+
*
|
330 |
+
* $ wp bp group member unban --group-id=3 --user-id=10
|
331 |
+
* Success: Member unbanned from the group.
|
332 |
+
*
|
333 |
+
* $ wp bp group member unban --group-id=foo --user-id=admin
|
334 |
+
* Success: Member unbanned from the group.
|
335 |
+
*/
|
336 |
+
public function unban( $args, $assoc_args ) {
|
337 |
+
$group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
|
338 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
339 |
+
$member = new \BP_Groups_Member( $user->ID, $group_id );
|
340 |
+
|
341 |
+
if ( $member->unban() ) {
|
342 |
+
WP_CLI::success( 'Member unbanned from the group.' );
|
343 |
+
} else {
|
344 |
+
WP_CLI::error( 'Could not unban the member.' );
|
345 |
+
}
|
346 |
+
}
|
347 |
+
|
348 |
+
/**
|
349 |
+
* Group Roles.
|
350 |
+
*
|
351 |
+
* @since 1.5.0
|
352 |
+
*
|
353 |
+
* @return array An array of group roles.
|
354 |
+
*/
|
355 |
+
protected function group_roles() {
|
356 |
+
return array( 'member', 'mod', 'admin' );
|
357 |
+
}
|
358 |
+
}
|
cli/components/group.php
ADDED
@@ -0,0 +1,437 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI\Command;
|
3 |
+
|
4 |
+
use WP_CLI;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Manage BuddyPress Groups.
|
8 |
+
*
|
9 |
+
* @since 1.5.0
|
10 |
+
*/
|
11 |
+
class Group extends BuddypressCommand {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Object fields.
|
15 |
+
*
|
16 |
+
* @var array
|
17 |
+
*/
|
18 |
+
protected $obj_fields = array(
|
19 |
+
'id',
|
20 |
+
'name',
|
21 |
+
'slug',
|
22 |
+
'status',
|
23 |
+
'date_created',
|
24 |
+
);
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Group ID Object Key
|
28 |
+
*
|
29 |
+
* @var string
|
30 |
+
*/
|
31 |
+
protected $obj_id_key = 'group_id';
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Group Object Type
|
35 |
+
*
|
36 |
+
* @var string
|
37 |
+
*/
|
38 |
+
protected $obj_type = 'group';
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Create a group.
|
42 |
+
*
|
43 |
+
* ## OPTIONS
|
44 |
+
*
|
45 |
+
* --name=<name>
|
46 |
+
* : Name of the group.
|
47 |
+
*
|
48 |
+
* [--slug=<slug>]
|
49 |
+
* : URL-safe slug for the group. If not provided, one will be generated automatically.
|
50 |
+
*
|
51 |
+
* [--description=<description>]
|
52 |
+
* : Group description.
|
53 |
+
* ---
|
54 |
+
* Default: 'Description for group "[name]"'
|
55 |
+
* ---
|
56 |
+
*
|
57 |
+
* [--creator-id=<creator-id>]
|
58 |
+
* : ID of the group creator.
|
59 |
+
* ---
|
60 |
+
* Default: 1
|
61 |
+
* ---
|
62 |
+
*
|
63 |
+
* [--slug=<slug>]
|
64 |
+
* : URL-safe slug for the group.
|
65 |
+
*
|
66 |
+
* [--status=<status>]
|
67 |
+
* : Group status (public, private, hidden).
|
68 |
+
* ---
|
69 |
+
* Default: public
|
70 |
+
* ---
|
71 |
+
*
|
72 |
+
* [--enable-forum=<enable-forum>]
|
73 |
+
* : Whether to enable legacy bbPress forums.
|
74 |
+
* ---
|
75 |
+
* Default: 0
|
76 |
+
* ---
|
77 |
+
*
|
78 |
+
* [--date-created=<date-created>]
|
79 |
+
* : MySQL-formatted date.
|
80 |
+
* ---
|
81 |
+
* Default: current date.
|
82 |
+
* ---
|
83 |
+
*
|
84 |
+
* [--silent]
|
85 |
+
* : Whether to silent the group creation.
|
86 |
+
*
|
87 |
+
* [--porcelain]
|
88 |
+
* : Return only the new group id.
|
89 |
+
*
|
90 |
+
* ## EXAMPLES
|
91 |
+
*
|
92 |
+
* $ wp bp group create --name="Totally Cool Group"
|
93 |
+
* Success: Group (ID 5465) created: http://example.com/groups/totally-cool-group/
|
94 |
+
*
|
95 |
+
* $ wp bp group create --name="Another Cool Group" --description="Cool Group" --creator-id=54 --status=private
|
96 |
+
* Success: Group (ID 6454)6 created: http://example.com/groups/another-cool-group/
|
97 |
+
*
|
98 |
+
* @alias add
|
99 |
+
*/
|
100 |
+
public function create( $args, $assoc_args ) {
|
101 |
+
$r = wp_parse_args( $assoc_args, array(
|
102 |
+
'name' => '',
|
103 |
+
'slug' => '',
|
104 |
+
'description' => '',
|
105 |
+
'creator-id' => 1,
|
106 |
+
'status' => 'public',
|
107 |
+
'enable-forum' => 0,
|
108 |
+
'date-created' => bp_core_current_time(),
|
109 |
+
) );
|
110 |
+
|
111 |
+
// Auto-generate some stuff.
|
112 |
+
if ( empty( $r['slug'] ) ) {
|
113 |
+
$r['slug'] = groups_check_slug( sanitize_title( $r['name'] ) );
|
114 |
+
}
|
115 |
+
|
116 |
+
if ( empty( $r['description'] ) ) {
|
117 |
+
$r['description'] = sprintf( 'Description for group "%s"', $r['name'] );
|
118 |
+
}
|
119 |
+
|
120 |
+
// Fallback for group status.
|
121 |
+
if ( ! in_array( $r['status'], $this->group_status(), true ) ) {
|
122 |
+
$r['status'] = 'public';
|
123 |
+
}
|
124 |
+
|
125 |
+
$group_id = groups_create_group( array(
|
126 |
+
'name' => $r['name'],
|
127 |
+
'slug' => $r['slug'],
|
128 |
+
'description' => $r['description'],
|
129 |
+
'creator_id' => $r['creator-id'],
|
130 |
+
'status' => $r['status'],
|
131 |
+
'enable_forum' => $r['enable-forum'],
|
132 |
+
'date_created' => $r['date-created'],
|
133 |
+
) );
|
134 |
+
|
135 |
+
// Silent it before it errors.
|
136 |
+
if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'silent' ) ) {
|
137 |
+
return;
|
138 |
+
}
|
139 |
+
|
140 |
+
if ( ! is_numeric( $group_id ) ) {
|
141 |
+
WP_CLI::error( 'Could not create group.' );
|
142 |
+
}
|
143 |
+
|
144 |
+
groups_update_groupmeta( $group_id, 'total_member_count', 1 );
|
145 |
+
|
146 |
+
if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
|
147 |
+
WP_CLI::line( $group_id );
|
148 |
+
} else {
|
149 |
+
$group = groups_get_group( array(
|
150 |
+
'group_id' => $group_id,
|
151 |
+
) );
|
152 |
+
$permalink = bp_get_group_permalink( $group );
|
153 |
+
WP_CLI::success( sprintf( 'Group (ID %d) created: %s', $group_id, $permalink ) );
|
154 |
+
}
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Generate random groups.
|
159 |
+
*
|
160 |
+
* ## OPTIONS
|
161 |
+
*
|
162 |
+
* [--count=<number>]
|
163 |
+
* : How many groups to generate.
|
164 |
+
* ---
|
165 |
+
* default: 100
|
166 |
+
* ---
|
167 |
+
*
|
168 |
+
* [--status=<status>]
|
169 |
+
* : The status of the generated groups. Specify public, private, hidden, or mixed.
|
170 |
+
* ---
|
171 |
+
* default: public
|
172 |
+
* ---
|
173 |
+
*
|
174 |
+
* [--creator-id=<creator-id>]
|
175 |
+
* : ID of the group creator.
|
176 |
+
* ---
|
177 |
+
* default: 1
|
178 |
+
* ---
|
179 |
+
*
|
180 |
+
* [--enable-forum=<enable-forum>]
|
181 |
+
* : Whether to enable legacy bbPress forums.
|
182 |
+
* ---
|
183 |
+
* default: 0
|
184 |
+
* ---
|
185 |
+
*
|
186 |
+
* ## EXAMPLES
|
187 |
+
*
|
188 |
+
* $ wp bp group generate --count=50
|
189 |
+
* $ wp bp group generate --count=5 --status=mixed
|
190 |
+
* $ wp bp group generate --count=10 --status=hidden --creator-id=30
|
191 |
+
*/
|
192 |
+
public function generate( $args, $assoc_args ) {
|
193 |
+
$notify = WP_CLI\Utils\make_progress_bar( 'Generating groups', $assoc_args['count'] );
|
194 |
+
|
195 |
+
for ( $i = 0; $i < $assoc_args['count']; $i++ ) {
|
196 |
+
$this->create( array(), array(
|
197 |
+
'name' => sprintf( 'Group - #%d', $i ),
|
198 |
+
'creator-id' => $assoc_args['creator-id'],
|
199 |
+
'status' => $this->random_group_status( $assoc_args['status'] ),
|
200 |
+
'enable-forum' => $assoc_args['enable-forum'],
|
201 |
+
'silent',
|
202 |
+
) );
|
203 |
+
|
204 |
+
$notify->tick();
|
205 |
+
}
|
206 |
+
|
207 |
+
$notify->finish();
|
208 |
+
}
|
209 |
+
|
210 |
+
/**
|
211 |
+
* Get a group.
|
212 |
+
*
|
213 |
+
* ## OPTIONS
|
214 |
+
*
|
215 |
+
* <group-id>
|
216 |
+
* : Identifier for the group. Can be a numeric ID or the group slug.
|
217 |
+
*
|
218 |
+
* [--fields=<fields>]
|
219 |
+
* : Limit the output to specific fields. Defaults to all fields.
|
220 |
+
*
|
221 |
+
* [--format=<format>]
|
222 |
+
* : Render output in a particular format.
|
223 |
+
* ---
|
224 |
+
* default: table
|
225 |
+
* options:
|
226 |
+
* - table
|
227 |
+
* - json
|
228 |
+
* - haml
|
229 |
+
* ---
|
230 |
+
*
|
231 |
+
* ## EXAMPLES
|
232 |
+
*
|
233 |
+
* $ wp bp group get 500
|
234 |
+
* $ wp bp group get group-slug
|
235 |
+
*
|
236 |
+
* @alias see
|
237 |
+
*/
|
238 |
+
public function get( $args, $assoc_args ) {
|
239 |
+
$group_id = $this->get_group_id_from_identifier( $args[0] );
|
240 |
+
$group = groups_get_group( $group_id );
|
241 |
+
$group_arr = get_object_vars( $group );
|
242 |
+
$group_arr['url'] = bp_get_group_permalink( $group );
|
243 |
+
|
244 |
+
if ( empty( $assoc_args['fields'] ) ) {
|
245 |
+
$assoc_args['fields'] = array_keys( $group_arr );
|
246 |
+
}
|
247 |
+
|
248 |
+
$formatter = $this->get_formatter( $assoc_args );
|
249 |
+
$formatter->display_item( $group_arr );
|
250 |
+
}
|
251 |
+
|
252 |
+
/**
|
253 |
+
* Delete a group.
|
254 |
+
*
|
255 |
+
* ## OPTIONS
|
256 |
+
*
|
257 |
+
* <group-id>...
|
258 |
+
* : Identifier(s) for the group(s). Can be a numeric ID or the group slug.
|
259 |
+
*
|
260 |
+
* [--yes]
|
261 |
+
* : Answer yes to the confirmation message.
|
262 |
+
*
|
263 |
+
* ## EXAMPLES
|
264 |
+
*
|
265 |
+
* $ wp bp group delete 500
|
266 |
+
* Success: Group successfully deleted.
|
267 |
+
*
|
268 |
+
* $ wp bp group delete group-slug --yes
|
269 |
+
* Success: Group successfully deleted.
|
270 |
+
*/
|
271 |
+
public function delete( $args, $assoc_args ) {
|
272 |
+
$group_id = $this->get_group_id_from_identifier( $args[0] );
|
273 |
+
|
274 |
+
WP_CLI::confirm( 'Are you sure you want to delete this group and its metadata?', $assoc_args );
|
275 |
+
|
276 |
+
parent::_delete( array( $group_id ), $assoc_args, function( $group_id ) {
|
277 |
+
if ( groups_delete_group( $group_id ) ) {
|
278 |
+
return array( 'success', 'Group successfully deleted.' );
|
279 |
+
} else {
|
280 |
+
return array( 'error', 'Could not delete the group.' );
|
281 |
+
}
|
282 |
+
} );
|
283 |
+
}
|
284 |
+
|
285 |
+
/**
|
286 |
+
* Update a group.
|
287 |
+
*
|
288 |
+
* ## OPTIONS
|
289 |
+
*
|
290 |
+
* <group-id>...
|
291 |
+
* : Identifier(s) for the group(s). Can be a numeric ID or the group slug.
|
292 |
+
*
|
293 |
+
* [--<field>=<value>]
|
294 |
+
* : One or more fields to update. See groups_create_group()
|
295 |
+
*
|
296 |
+
* ## EXAMPLE
|
297 |
+
*
|
298 |
+
* $ wp bp group update 35 --description="What a cool group!" --name="Group of Cool People"
|
299 |
+
*/
|
300 |
+
public function update( $args, $assoc_args ) {
|
301 |
+
$clean_group_ids = array();
|
302 |
+
|
303 |
+
foreach ( $args as $group_id ) {
|
304 |
+
$clean_group_ids[] = $this->get_group_id_from_identifier( $group_id );
|
305 |
+
}
|
306 |
+
|
307 |
+
parent::_update( $clean_group_ids, $assoc_args, function( $params ) {
|
308 |
+
return groups_create_group( $params );
|
309 |
+
} );
|
310 |
+
}
|
311 |
+
|
312 |
+
/**
|
313 |
+
* Get a list of groups.
|
314 |
+
*
|
315 |
+
* ## OPTIONS
|
316 |
+
*
|
317 |
+
* [--<field>=<value>]
|
318 |
+
* : One or more parameters to pass. See groups_get_groups()
|
319 |
+
*
|
320 |
+
* [--fields=<fields>]
|
321 |
+
* : Fields to display.
|
322 |
+
*
|
323 |
+
* [--user-id=<user>]
|
324 |
+
* : Limit results to groups of which a specific user is a member. Accepts either a user_login or a numeric ID.
|
325 |
+
*
|
326 |
+
* [--orderby=<orderby>]
|
327 |
+
* : Sort order for results.
|
328 |
+
* ---
|
329 |
+
* default: name
|
330 |
+
* options:
|
331 |
+
* - date_created
|
332 |
+
* - last_activity
|
333 |
+
* - total_member_count
|
334 |
+
* - name
|
335 |
+
*
|
336 |
+
* [--order=<order>]
|
337 |
+
* : Whether to sort results ascending or descending.
|
338 |
+
* ---
|
339 |
+
* default: ASC
|
340 |
+
* options:
|
341 |
+
* - ASC
|
342 |
+
* - DESC
|
343 |
+
*
|
344 |
+
* [--format=<format>]
|
345 |
+
* : Render output in a particular format.
|
346 |
+
* ---
|
347 |
+
* default: table
|
348 |
+
* options:
|
349 |
+
* - table
|
350 |
+
* - ids
|
351 |
+
* - csv
|
352 |
+
* - count
|
353 |
+
* - haml
|
354 |
+
* ---
|
355 |
+
*
|
356 |
+
* [--count=<number>]
|
357 |
+
* : How many group items to list.
|
358 |
+
* ---
|
359 |
+
* default: 50
|
360 |
+
* ---
|
361 |
+
|
362 |
+
* ## EXAMPLES
|
363 |
+
*
|
364 |
+
* $ wp bp group list --format=ids
|
365 |
+
* $ wp bp group list --format=count
|
366 |
+
* $ wp bp group list --user-id=123
|
367 |
+
* $ wp bp group list --user-id=user_login --format=ids
|
368 |
+
*
|
369 |
+
* @subcommand list
|
370 |
+
*/
|
371 |
+
public function _list( $args, $assoc_args ) {
|
372 |
+
$formatter = $this->get_formatter( $assoc_args );
|
373 |
+
$query_args = wp_parse_args( $assoc_args, array(
|
374 |
+
'count' => 50,
|
375 |
+
'show_hidden' => true,
|
376 |
+
'orderby' => $assoc_args['orderby'],
|
377 |
+
'order' => $assoc_args['order'],
|
378 |
+
) );
|
379 |
+
|
380 |
+
// Groups to list.
|
381 |
+
$r['per_page'] = $r['count'];
|
382 |
+
|
383 |
+
if ( isset( $assoc_args['user-id'] ) ) {
|
384 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
385 |
+
$query_args['user_id'] = $user->ID;
|
386 |
+
}
|
387 |
+
|
388 |
+
$query_args = self::process_csv_arguments_to_arrays( $query_args );
|
389 |
+
|
390 |
+
// If count or ids, no need for group objects.
|
391 |
+
if ( in_array( $formatter->format, array( 'ids', 'count' ), true ) ) {
|
392 |
+
$query_args['fields'] = 'ids';
|
393 |
+
}
|
394 |
+
|
395 |
+
$groups = groups_get_groups( $query_args );
|
396 |
+
if ( empty( $groups['groups'] ) ) {
|
397 |
+
WP_CLI::error( 'No groups found.' );
|
398 |
+
}
|
399 |
+
|
400 |
+
if ( 'ids' === $formatter->format ) {
|
401 |
+
echo implode( ' ', $groups['groups'] ); // WPCS: XSS ok.
|
402 |
+
} elseif ( 'count' === $formatter->format ) {
|
403 |
+
$formatter->display_items( $groups['total'] );
|
404 |
+
} else {
|
405 |
+
$formatter->display_items( $groups['groups'] );
|
406 |
+
}
|
407 |
+
}
|
408 |
+
|
409 |
+
/**
|
410 |
+
* Group Status
|
411 |
+
*
|
412 |
+
* @since 1.5.0
|
413 |
+
*
|
414 |
+
* @return array An array of gruop status.
|
415 |
+
*/
|
416 |
+
protected function group_status() {
|
417 |
+
return array( 'public', 'private', 'hidden' );
|
418 |
+
}
|
419 |
+
|
420 |
+
/**
|
421 |
+
* Gets a randon group status.
|
422 |
+
*
|
423 |
+
* @since 1.5.0
|
424 |
+
*
|
425 |
+
* @param string $status Group status.
|
426 |
+
* @return string Group Status.
|
427 |
+
*/
|
428 |
+
protected function random_group_status( $status ) {
|
429 |
+
$core_status = $this->group_status();
|
430 |
+
|
431 |
+
if ( 'mixed' === $status ) {
|
432 |
+
$status = $core_status[ array_rand( $core_status ) ];
|
433 |
+
}
|
434 |
+
|
435 |
+
return $status;
|
436 |
+
}
|
437 |
+
}
|
cli/components/member.php
ADDED
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI\Command;
|
3 |
+
|
4 |
+
if ( ! class_exists( 'User_Command' ) ) {
|
5 |
+
require_once( WP_CLI_ROOT . '/php/commands/user.php' );
|
6 |
+
}
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Manage BuddyPress Members
|
10 |
+
*
|
11 |
+
* @since 1.0.0
|
12 |
+
*/
|
13 |
+
class Member extends BuddypressCommand {
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Generate BuddyPress members. See documentation for `wp_user_generate`.
|
17 |
+
*
|
18 |
+
* This is a kludge workaround for setting last activity. Should fix.
|
19 |
+
*
|
20 |
+
* ## OPTIONS
|
21 |
+
*
|
22 |
+
* [--count=<number>]
|
23 |
+
* : How many members to generate.
|
24 |
+
* ---
|
25 |
+
* default: 100
|
26 |
+
* ---
|
27 |
+
*
|
28 |
+
* ## EXAMPLE
|
29 |
+
*
|
30 |
+
* $ wp bp member generate --count=50
|
31 |
+
*/
|
32 |
+
public function generate( $args, $assoc_args ) {
|
33 |
+
add_action( 'user_register', array( __CLASS__, 'update_user_last_activity_random' ) );
|
34 |
+
User_Command::generate( $args, $assoc_args );
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Update the last user activity with a random date.
|
39 |
+
*
|
40 |
+
* @since 1.0
|
41 |
+
*
|
42 |
+
* @param int $user_id User ID.
|
43 |
+
*/
|
44 |
+
public static function update_user_last_activity_random( $user_id ) {
|
45 |
+
$time = date( 'Y-m-d H:i:s', rand( 0, time() ) );
|
46 |
+
bp_update_user_last_activity( $user_id, $time );
|
47 |
+
}
|
48 |
+
}
|
cli/components/message.php
ADDED
@@ -0,0 +1,552 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI\Command;
|
3 |
+
|
4 |
+
use WP_CLI;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Manage BuddyPress Messages.
|
8 |
+
*
|
9 |
+
* @since 1.6.0
|
10 |
+
*/
|
11 |
+
class Message extends BuddypressCommand {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Object fields.
|
15 |
+
*
|
16 |
+
* @var array
|
17 |
+
*/
|
18 |
+
protected $obj_fields = array(
|
19 |
+
'id',
|
20 |
+
'subject',
|
21 |
+
'message',
|
22 |
+
'thread_id',
|
23 |
+
'sender_id',
|
24 |
+
'date_sent',
|
25 |
+
);
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Add a message.
|
29 |
+
*
|
30 |
+
* ## OPTIONS
|
31 |
+
*
|
32 |
+
* --from=<user>
|
33 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
34 |
+
*
|
35 |
+
* [--to=<user>]
|
36 |
+
* : Identifier for the recipient. To is not required when thread id is set.
|
37 |
+
* Accepts either a user_login or a numeric ID.
|
38 |
+
* ---
|
39 |
+
* Default: Empty.
|
40 |
+
* ---
|
41 |
+
*
|
42 |
+
* --subject=<subject>
|
43 |
+
* : Subject of the message.
|
44 |
+
*
|
45 |
+
* --content=<content>
|
46 |
+
* : Content of the message.
|
47 |
+
*
|
48 |
+
* [--thread-id=<thread-id>]
|
49 |
+
* : Thread ID.
|
50 |
+
* ---
|
51 |
+
* Default: false
|
52 |
+
* ---
|
53 |
+
*
|
54 |
+
* [--date-sent=<date-sent>]
|
55 |
+
* : MySQL-formatted date.
|
56 |
+
* ---
|
57 |
+
* Default: current date.
|
58 |
+
* ---
|
59 |
+
*
|
60 |
+
* [--silent]
|
61 |
+
* : Whether to silent the message creation.
|
62 |
+
*
|
63 |
+
* [--porcelain]
|
64 |
+
* : Return the thread id of the message.
|
65 |
+
*
|
66 |
+
* ## EXAMPLES
|
67 |
+
*
|
68 |
+
* $ wp bp message create --from=user1 --to=user2 --subject="Message Title" --content="We are ready"
|
69 |
+
* Success: Message successfully created.
|
70 |
+
*
|
71 |
+
* $ wp bp message create --from=545 --to=313 --subject="Another Message Title" --content="Message OK"
|
72 |
+
* Success: Message successfully created.
|
73 |
+
*
|
74 |
+
* @alias add
|
75 |
+
*/
|
76 |
+
public function create( $args, $assoc_args ) {
|
77 |
+
$r = wp_parse_args( $assoc_args, array(
|
78 |
+
'to' => '',
|
79 |
+
'thread-id' => false,
|
80 |
+
'date-sent' => bp_core_current_time(),
|
81 |
+
) );
|
82 |
+
|
83 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['from'] );
|
84 |
+
|
85 |
+
// To is not required when thread id is set.
|
86 |
+
if ( ! empty( $r['to'] ) ) {
|
87 |
+
$recipient = $this->get_user_id_from_identifier( $r['to'] );
|
88 |
+
}
|
89 |
+
|
90 |
+
// Existing thread recipients will be assumed.
|
91 |
+
$recipient = ( ! empty( $r['thread_id'] ) ) ? array() : array( $recipient->ID );
|
92 |
+
|
93 |
+
$thread_id = messages_new_message( array(
|
94 |
+
'sender_id' => $user->ID,
|
95 |
+
'thread_id' => $r['thread-id'],
|
96 |
+
'recipients' => $recipient,
|
97 |
+
'subject' => $assoc_args['subject'],
|
98 |
+
'content' => $assoc_args['content'],
|
99 |
+
'date_sent' => $r['date-sent'],
|
100 |
+
) );
|
101 |
+
|
102 |
+
// Silent it before it errors.
|
103 |
+
if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'silent' ) ) {
|
104 |
+
return;
|
105 |
+
}
|
106 |
+
|
107 |
+
if ( ! is_numeric( $thread_id ) ) {
|
108 |
+
WP_CLI::error( 'Could not add a message.' );
|
109 |
+
}
|
110 |
+
|
111 |
+
if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
|
112 |
+
WP_CLI::line( $thread_id );
|
113 |
+
} else {
|
114 |
+
WP_CLI::success( 'Message successfully created.' );
|
115 |
+
}
|
116 |
+
}
|
117 |
+
|
118 |
+
/**
|
119 |
+
* Delete thread(s) for a given user.
|
120 |
+
*
|
121 |
+
* ## OPTIONS
|
122 |
+
*
|
123 |
+
* <thread-id>...
|
124 |
+
* : Thread ID(s).
|
125 |
+
*
|
126 |
+
* --user-id=<user>
|
127 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
128 |
+
*
|
129 |
+
* [--yes]
|
130 |
+
* : Answer yes to the confirmation message.
|
131 |
+
*
|
132 |
+
* ## EXAMPLES
|
133 |
+
*
|
134 |
+
* $ wp bp message delete-thread 500 687867 --user-id=40
|
135 |
+
* Success: Thread successfully deleted.
|
136 |
+
*
|
137 |
+
* $ wp bp message delete-thread 564 5465465 456456 --user-id=user_logon --yes
|
138 |
+
* Success: Thread successfully deleted.
|
139 |
+
*
|
140 |
+
* @alias delete-thread
|
141 |
+
* @alias remove-thread
|
142 |
+
*/
|
143 |
+
public function delete_thread( $args, $assoc_args ) {
|
144 |
+
$thread_id = $args[0];
|
145 |
+
|
146 |
+
// Check if we have a valid user.
|
147 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
148 |
+
|
149 |
+
WP_CLI::confirm( 'Are you sure you want to delete this thread(s)?', $assoc_args );
|
150 |
+
|
151 |
+
parent::_delete( array( $thread_id ), $assoc_args, function( $thread_id ) {
|
152 |
+
|
153 |
+
// Check if it is a valid thread before deleting.
|
154 |
+
if ( ! messages_is_valid_thread( $thread_id ) ) {
|
155 |
+
WP_CLI::error( 'This is not a valid thread ID.' );
|
156 |
+
}
|
157 |
+
|
158 |
+
// Actually, delete it.
|
159 |
+
if ( messages_delete_thread( $thread_id, $user->ID ) ) {
|
160 |
+
return array( 'success', 'Thread successfully deleted.' );
|
161 |
+
} else {
|
162 |
+
return array( 'error', 'Could not delete the thread.' );
|
163 |
+
}
|
164 |
+
} );
|
165 |
+
}
|
166 |
+
|
167 |
+
/**
|
168 |
+
* Get a message.
|
169 |
+
*
|
170 |
+
* ## OPTIONS
|
171 |
+
*
|
172 |
+
* <message-id>
|
173 |
+
* : Identifier for the message.
|
174 |
+
*
|
175 |
+
* [--fields=<fields>]
|
176 |
+
* : Limit the output to specific fields.
|
177 |
+
*
|
178 |
+
* [--format=<format>]
|
179 |
+
* : Render output in a particular format.
|
180 |
+
* ---
|
181 |
+
* default: table
|
182 |
+
* options:
|
183 |
+
* - table
|
184 |
+
* - json
|
185 |
+
* - haml
|
186 |
+
* ---
|
187 |
+
*
|
188 |
+
* ## EXAMPLES
|
189 |
+
*
|
190 |
+
* $ wp bp message get 5465
|
191 |
+
* $ wp bp message see 5454
|
192 |
+
*
|
193 |
+
* @alias see
|
194 |
+
*/
|
195 |
+
public function get( $args, $assoc_args ) {
|
196 |
+
$message = new \BP_Messages_Message( $args[0] );
|
197 |
+
$message_arr = get_object_vars( $message );
|
198 |
+
|
199 |
+
if ( empty( $assoc_args['fields'] ) ) {
|
200 |
+
$assoc_args['fields'] = array_keys( $message_arr );
|
201 |
+
}
|
202 |
+
|
203 |
+
$formatter = $this->get_formatter( $assoc_args );
|
204 |
+
$formatter->display_item( $message_arr );
|
205 |
+
}
|
206 |
+
|
207 |
+
/**
|
208 |
+
* Get a list of messages for a specific user.
|
209 |
+
*
|
210 |
+
* ## OPTIONS
|
211 |
+
*
|
212 |
+
* --user-id=<user>
|
213 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
214 |
+
*
|
215 |
+
* [--<field>=<value>]
|
216 |
+
* : One or more parameters to pass. See \BP_Messages_Box_Template()
|
217 |
+
*
|
218 |
+
* [--fields=<fields>]
|
219 |
+
* : Fields to display.
|
220 |
+
*
|
221 |
+
* [--count=<number>]
|
222 |
+
* : How many messages to list.
|
223 |
+
* ---
|
224 |
+
* default: 10
|
225 |
+
* ---
|
226 |
+
*
|
227 |
+
* [--format=<format>]
|
228 |
+
* : Render output in a particular format.
|
229 |
+
* ---
|
230 |
+
* default: table
|
231 |
+
* options:
|
232 |
+
* - table
|
233 |
+
* - ids
|
234 |
+
* - count
|
235 |
+
* - csv
|
236 |
+
* - json
|
237 |
+
* - haml
|
238 |
+
* ---
|
239 |
+
*
|
240 |
+
* ## EXAMPLES
|
241 |
+
*
|
242 |
+
* $ wp bp message list --user-id=544 --format=count
|
243 |
+
* 10
|
244 |
+
*
|
245 |
+
* $ wp bp message list --user-id=user_login --count=3 --format=ids
|
246 |
+
* 5454 45454 4545 465465
|
247 |
+
*
|
248 |
+
* @subcommand list
|
249 |
+
*/
|
250 |
+
public function _list( $_, $assoc_args ) {
|
251 |
+
$formatter = $this->get_formatter( $assoc_args );
|
252 |
+
|
253 |
+
$r = wp_parse_args( $assoc_args, array(
|
254 |
+
'box' => 'sentbox',
|
255 |
+
'type' => 'all',
|
256 |
+
'search' => '',
|
257 |
+
'count' => 10,
|
258 |
+
) );
|
259 |
+
|
260 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
261 |
+
$type = ( ! in_array( $r['type'], $this->message_types(), true ) ) ? 'all' : $r['type'];
|
262 |
+
$box = ( ! in_array( $r['box'], $this->message_boxes(), true ) ) ? 'sentbox' : $r['box'];
|
263 |
+
|
264 |
+
$inbox = new \BP_Messages_Box_Template( array(
|
265 |
+
'user_id' => $user->ID,
|
266 |
+
'box' => $box,
|
267 |
+
'type' => $type,
|
268 |
+
'max' => $r['count'],
|
269 |
+
'search_terms' => $r['search'],
|
270 |
+
) );
|
271 |
+
|
272 |
+
if ( ! $inbox->has_threads() ) {
|
273 |
+
WP_CLI::error( 'No messages found.' );
|
274 |
+
}
|
275 |
+
|
276 |
+
$messages = $inbox->threads[0]->messages;
|
277 |
+
|
278 |
+
if ( 'ids' === $formatter->format ) {
|
279 |
+
echo implode( ' ', wp_list_pluck( $messages, 'id' ) ); // WPCS: XSS ok.
|
280 |
+
} elseif ( 'count' === $formatter->format ) {
|
281 |
+
$formatter->display_items( $messages );
|
282 |
+
} else {
|
283 |
+
$formatter->display_items( $messages );
|
284 |
+
}
|
285 |
+
}
|
286 |
+
|
287 |
+
/**
|
288 |
+
* Generate random messages.
|
289 |
+
*
|
290 |
+
* ## OPTIONS
|
291 |
+
*
|
292 |
+
* [--thread-id=<thread-id>]
|
293 |
+
* : Thread ID to generate messages against.
|
294 |
+
* ---
|
295 |
+
* default: false
|
296 |
+
* ---
|
297 |
+
*
|
298 |
+
* [--count=<number>]
|
299 |
+
* : How many messages to generate.
|
300 |
+
* ---
|
301 |
+
* default: 20
|
302 |
+
* ---
|
303 |
+
*
|
304 |
+
* ## EXAMPLES
|
305 |
+
*
|
306 |
+
* $ wp bp message generate --thread-id=6465 --count=10
|
307 |
+
* $ wp bp message generate --count=100
|
308 |
+
*/
|
309 |
+
public function generate( $args, $assoc_args ) {
|
310 |
+
$notify = WP_CLI\Utils\make_progress_bar( 'Generating messages', $assoc_args['count'] );
|
311 |
+
|
312 |
+
for ( $i = 0; $i < $assoc_args['count']; $i++ ) {
|
313 |
+
$this->create( array(), array(
|
314 |
+
'from' => $this->get_random_user_id(),
|
315 |
+
'to' => $this->get_random_user_id(),
|
316 |
+
'subject' => sprintf( 'Message Subject - #%d', $i ),
|
317 |
+
'thread-id' => $assoc_args['thread-id'],
|
318 |
+
'silent',
|
319 |
+
) );
|
320 |
+
|
321 |
+
$notify->tick();
|
322 |
+
}
|
323 |
+
|
324 |
+
$notify->finish();
|
325 |
+
}
|
326 |
+
|
327 |
+
/**
|
328 |
+
* Star a message.
|
329 |
+
*
|
330 |
+
* ## OPTIONS
|
331 |
+
*
|
332 |
+
* <message-id>
|
333 |
+
* : Message ID to star.
|
334 |
+
*
|
335 |
+
* --user-id=<user>
|
336 |
+
* : User that is starring the message. Accepts either a user_login or a numeric ID.
|
337 |
+
*
|
338 |
+
* ## EXAMPLE
|
339 |
+
*
|
340 |
+
* $ wp bp message star 3543 --user-id=user_login
|
341 |
+
* Success: Message was successfully starred.
|
342 |
+
*/
|
343 |
+
public function star( $args, $assoc_args ) {
|
344 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
345 |
+
$user_id = $user->ID;
|
346 |
+
$msg_id = (int) $args[0];
|
347 |
+
|
348 |
+
if ( bp_messages_is_message_starred( $msg_id, $user_id ) ) {
|
349 |
+
WP_CLI::error( 'The message is already starred.' );
|
350 |
+
}
|
351 |
+
|
352 |
+
$star_args = array(
|
353 |
+
'action' => 'star',
|
354 |
+
'message_id' => $msg_id,
|
355 |
+
'user_id' => $user_id,
|
356 |
+
);
|
357 |
+
|
358 |
+
if ( bp_messages_star_set_action( $star_args ) ) {
|
359 |
+
WP_CLI::success( 'Message was successfully starred.' );
|
360 |
+
} else {
|
361 |
+
WP_CLI::error( 'Message was not starred.' );
|
362 |
+
}
|
363 |
+
}
|
364 |
+
|
365 |
+
/**
|
366 |
+
* Unstar a message.
|
367 |
+
*
|
368 |
+
* ## OPTIONS
|
369 |
+
*
|
370 |
+
* <message-id>
|
371 |
+
* : Message ID to unstar.
|
372 |
+
*
|
373 |
+
* --user-id=<user>
|
374 |
+
* : User that is unstarring the message. Accepts either a user_login or a numeric ID.
|
375 |
+
*
|
376 |
+
* ## EXAMPLE
|
377 |
+
*
|
378 |
+
* $ wp bp message unstar 212 --user-id=another_user_login
|
379 |
+
* Success: Message was successfully unstarred.
|
380 |
+
*/
|
381 |
+
public function unstar( $args, $assoc_args ) {
|
382 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
383 |
+
$user_id = $user->ID;
|
384 |
+
$msg_id = (int) $args[0];
|
385 |
+
|
386 |
+
// Check if the message is starred first.
|
387 |
+
if ( ! bp_messages_is_message_starred( $msg_id, $user_id ) ) {
|
388 |
+
WP_CLI::error( 'You need to star a message first before unstarring it.' );
|
389 |
+
}
|
390 |
+
|
391 |
+
$star_args = array(
|
392 |
+
'action' => 'unstar',
|
393 |
+
'message_id' => $msg_id,
|
394 |
+
'user_id' => $user_id,
|
395 |
+
);
|
396 |
+
|
397 |
+
if ( bp_messages_star_set_action( $star_args ) ) {
|
398 |
+
WP_CLI::success( 'Message was successfully unstarred.' );
|
399 |
+
} else {
|
400 |
+
WP_CLI::error( 'Message was not unstarred.' );
|
401 |
+
}
|
402 |
+
}
|
403 |
+
|
404 |
+
/**
|
405 |
+
* Star a thread.
|
406 |
+
*
|
407 |
+
* ## OPTIONS
|
408 |
+
*
|
409 |
+
* <thread-id>
|
410 |
+
* : Thread ID to star.
|
411 |
+
*
|
412 |
+
* --user-id=<user>
|
413 |
+
* : User that is starring the thread. Accepts either a user_login or a numeric ID.
|
414 |
+
*
|
415 |
+
* ## EXAMPLE
|
416 |
+
*
|
417 |
+
* $ wp bp message star-thread 212 --user-id=another_user_login
|
418 |
+
* Success: Thread was successfully starred.
|
419 |
+
*
|
420 |
+
* @alias star-thread
|
421 |
+
*/
|
422 |
+
public function star_thread( $args, $assoc_args ) {
|
423 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
424 |
+
$thread_id = (int) $args[0];
|
425 |
+
|
426 |
+
// Check if it is a valid thread.
|
427 |
+
if ( ! messages_is_valid_thread( $thread_id ) ) {
|
428 |
+
WP_CLI::error( 'This is not a valid thread ID.' );
|
429 |
+
}
|
430 |
+
|
431 |
+
// Check if the user has access to this thread.
|
432 |
+
$id = messages_check_thread_access( $thread_id, $user->ID );
|
433 |
+
if ( ! is_numeric( $id ) ) {
|
434 |
+
WP_CLI::error( 'User has no access to this thread.' );
|
435 |
+
}
|
436 |
+
|
437 |
+
$star_args = array(
|
438 |
+
'action' => 'star',
|
439 |
+
'thread_id' => $thread_id,
|
440 |
+
'user_id' => $user->ID,
|
441 |
+
'bulk' => true,
|
442 |
+
);
|
443 |
+
|
444 |
+
if ( bp_messages_star_set_action( $star_args ) ) {
|
445 |
+
WP_CLI::success( 'Thread was successfully starred.' );
|
446 |
+
} else {
|
447 |
+
WP_CLI::error( 'Something wrong while trying to star the thread.' );
|
448 |
+
}
|
449 |
+
}
|
450 |
+
|
451 |
+
/**
|
452 |
+
* Unstar a thread.
|
453 |
+
*
|
454 |
+
* ## OPTIONS
|
455 |
+
*
|
456 |
+
* <thread-id>
|
457 |
+
* : Thread ID to unstar.
|
458 |
+
*
|
459 |
+
* --user-id=<user>
|
460 |
+
* : User that is unstarring the thread. Accepts either a user_login or a numeric ID.
|
461 |
+
*
|
462 |
+
* ## EXAMPLE
|
463 |
+
*
|
464 |
+
* $ wp bp message unstar-thread 212 --user-id=another_user_login
|
465 |
+
* Success: Thread was successfully unstarred.
|
466 |
+
*
|
467 |
+
* @alias unstar-thread
|
468 |
+
*/
|
469 |
+
public function unstar_thread( $args, $assoc_args ) {
|
470 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
471 |
+
$thread_id = (int) $args[0];
|
472 |
+
|
473 |
+
// Check if it is a valid thread.
|
474 |
+
if ( ! messages_is_valid_thread( $thread_id ) ) {
|
475 |
+
WP_CLI::error( 'This is not a valid thread ID.' );
|
476 |
+
}
|
477 |
+
|
478 |
+
// Check if the user has access to this thread.
|
479 |
+
$id = messages_check_thread_access( $thread_id, $user->ID );
|
480 |
+
if ( ! is_numeric( $id ) ) {
|
481 |
+
WP_CLI::error( 'User has no access to this thread.' );
|
482 |
+
}
|
483 |
+
|
484 |
+
$star_args = array(
|
485 |
+
'action' => 'unstar',
|
486 |
+
'thread_id' => $thread_id,
|
487 |
+
'user_id' => $user->ID,
|
488 |
+
'bulk' => true,
|
489 |
+
);
|
490 |
+
|
491 |
+
if ( bp_messages_star_set_action( $star_args ) ) {
|
492 |
+
WP_CLI::success( 'Thread was successfully unstarred.' );
|
493 |
+
} else {
|
494 |
+
WP_CLI::error( 'Something wrong while trying to unstar the thread.' );
|
495 |
+
}
|
496 |
+
}
|
497 |
+
|
498 |
+
/**
|
499 |
+
* Send a notice.
|
500 |
+
*
|
501 |
+
* ## OPTIONS
|
502 |
+
*
|
503 |
+
* --subject=<subject>
|
504 |
+
* : Subject of the notice/message.
|
505 |
+
*
|
506 |
+
* --content=<content>
|
507 |
+
* : Content of the notice.
|
508 |
+
*
|
509 |
+
* ## EXAMPLE
|
510 |
+
*
|
511 |
+
* $ wp bp message send-notice --subject="Important notice" --content="We need to improve"
|
512 |
+
* Success: Notice was successfully sent.
|
513 |
+
*
|
514 |
+
* @alias send-notice
|
515 |
+
*/
|
516 |
+
public function send_notice( $args, $assoc_args ) {
|
517 |
+
$notice = new \BP_Messages_Notice();
|
518 |
+
$notice->subject = $assoc_args['subject'];
|
519 |
+
$notice->message = $assoc_args['content'];
|
520 |
+
$notice->date_sent = bp_core_current_time();
|
521 |
+
$notice->is_active = 1;
|
522 |
+
|
523 |
+
// Send it.
|
524 |
+
if ( $notice->save() ) {
|
525 |
+
WP_CLI::success( 'Notice was successfully sent.' );
|
526 |
+
} else {
|
527 |
+
WP_CLI::error( 'Notice was not sent.' );
|
528 |
+
}
|
529 |
+
}
|
530 |
+
|
531 |
+
/**
|
532 |
+
* Message Types.
|
533 |
+
*
|
534 |
+
* @since 1.6.0
|
535 |
+
*
|
536 |
+
* @return array An array of message types.
|
537 |
+
*/
|
538 |
+
protected function message_types() {
|
539 |
+
return array( 'all', 'read', 'unread' );
|
540 |
+
}
|
541 |
+
|
542 |
+
/**
|
543 |
+
* Message Boxes.
|
544 |
+
*
|
545 |
+
* @since 1.6.0
|
546 |
+
*
|
547 |
+
* @return array An array of message boxes.
|
548 |
+
*/
|
549 |
+
protected function message_boxes() {
|
550 |
+
return array( 'notices', 'sentbox', 'inbox' );
|
551 |
+
}
|
552 |
+
}
|
cli/components/signup.php
ADDED
@@ -0,0 +1,371 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI\Command;
|
3 |
+
|
4 |
+
use WP_CLI;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Manage BuddyPress Signups.
|
8 |
+
*
|
9 |
+
* @since 1.5.0
|
10 |
+
*/
|
11 |
+
class Signup extends BuddypressCommand {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Signup object fields.
|
15 |
+
*
|
16 |
+
* @var array
|
17 |
+
*/
|
18 |
+
protected $obj_fields = array(
|
19 |
+
'signup_id',
|
20 |
+
'user_login',
|
21 |
+
'user_name',
|
22 |
+
'meta',
|
23 |
+
'activation_key',
|
24 |
+
'registered',
|
25 |
+
);
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Add a signup.
|
29 |
+
*
|
30 |
+
* ## OPTIONS
|
31 |
+
*
|
32 |
+
* [--user-login=<user-login>]
|
33 |
+
* : User login for the signup.
|
34 |
+
*
|
35 |
+
* [--user-email=<user-email>]
|
36 |
+
* : User email for the signup.
|
37 |
+
*
|
38 |
+
* [--activation-key=<activation-key>]
|
39 |
+
* : Activation key for the signup. If none is provided, a random one will be used.
|
40 |
+
*
|
41 |
+
* [--silent]
|
42 |
+
* : Whether to silent the signup creation.
|
43 |
+
*
|
44 |
+
* [--porcelain]
|
45 |
+
* : Output only the new signup id.
|
46 |
+
*
|
47 |
+
* ## EXAMPLE
|
48 |
+
*
|
49 |
+
* $ wp bp signup create --user-login=test_user --user-email=teste@site.com
|
50 |
+
* Success: Successfully added new user signup (ID #345).
|
51 |
+
*
|
52 |
+
* @alias add
|
53 |
+
*/
|
54 |
+
public function create( $args, $assoc_args ) {
|
55 |
+
$r = wp_parse_args( $assoc_args, array(
|
56 |
+
'user-login' => '',
|
57 |
+
'user-email' => '',
|
58 |
+
'activation-key' => wp_generate_password( 32, false ),
|
59 |
+
) );
|
60 |
+
|
61 |
+
$signup_args = array(
|
62 |
+
'meta' => '',
|
63 |
+
);
|
64 |
+
|
65 |
+
$user_login = $r['user-login'];
|
66 |
+
if ( ! empty( $user_login ) ) {
|
67 |
+
$user_login = preg_replace( '/\s+/', '', sanitize_user( $user_login, true ) );
|
68 |
+
}
|
69 |
+
|
70 |
+
$user_email = $r['user-email'];
|
71 |
+
if ( ! empty( $user_email ) ) {
|
72 |
+
$user_email = sanitize_email( $user_email );
|
73 |
+
}
|
74 |
+
|
75 |
+
$signup_args['user_login'] = $user_login;
|
76 |
+
$signup_args['user_email'] = $user_email;
|
77 |
+
$signup_args['activation_key'] = $r['activation-key'];
|
78 |
+
|
79 |
+
$id = \BP_Signup::add( $signup_args );
|
80 |
+
|
81 |
+
// Silent it before it errors.
|
82 |
+
if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'silent' ) ) {
|
83 |
+
return;
|
84 |
+
}
|
85 |
+
|
86 |
+
if ( ! $id ) {
|
87 |
+
WP_CLI::error( 'Could not add user signup.' );
|
88 |
+
}
|
89 |
+
|
90 |
+
if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
|
91 |
+
WP_CLI::line( $id );
|
92 |
+
} else {
|
93 |
+
WP_CLI::success( sprintf( 'Successfully added new user signup (ID #%d).', $id ) );
|
94 |
+
}
|
95 |
+
}
|
96 |
+
|
97 |
+
/**
|
98 |
+
* Get a signup.
|
99 |
+
*
|
100 |
+
* ## OPTIONS
|
101 |
+
*
|
102 |
+
* <signup-id>
|
103 |
+
* : Identifier for the signup. Can be a signup ID, an email address, or a user_login.
|
104 |
+
*
|
105 |
+
* [--match-field=<match-field>]
|
106 |
+
* : Field to match the signup-id to. Use if there is ambiguity between, eg, signup ID and user_login.
|
107 |
+
* ---
|
108 |
+
* options:
|
109 |
+
* - signup_id
|
110 |
+
* - user_email
|
111 |
+
* - user_login
|
112 |
+
* ---
|
113 |
+
*
|
114 |
+
* [--fields=<fields>]
|
115 |
+
* : Limit the output to specific signup fields.
|
116 |
+
*
|
117 |
+
* [--format=<format>]
|
118 |
+
* : Render output in a particular format.
|
119 |
+
* ---
|
120 |
+
* default: table
|
121 |
+
* options:
|
122 |
+
* - table
|
123 |
+
* - csv
|
124 |
+
* - ids
|
125 |
+
* - json
|
126 |
+
* - count
|
127 |
+
* - yaml
|
128 |
+
* ---
|
129 |
+
*
|
130 |
+
* ## EXAMPLES
|
131 |
+
*
|
132 |
+
* $ wp bp signup get 123
|
133 |
+
* $ wp bp signup get foo@example.com
|
134 |
+
* $ wp bp signup get 123 --match-field=id
|
135 |
+
*/
|
136 |
+
public function get( $args, $assoc_args ) {
|
137 |
+
$id = $args[0];
|
138 |
+
$signup_args = array(
|
139 |
+
'number' => 1,
|
140 |
+
);
|
141 |
+
|
142 |
+
$signup = $this->get_signup_by_identifier( $id, $assoc_args );
|
143 |
+
|
144 |
+
$formatter = $this->get_formatter( $assoc_args );
|
145 |
+
$formatter->display_item( $signup );
|
146 |
+
}
|
147 |
+
|
148 |
+
/**
|
149 |
+
* Delete a signup.
|
150 |
+
*
|
151 |
+
* ## OPTIONS
|
152 |
+
*
|
153 |
+
* <signup-id>...
|
154 |
+
* : ID or IDs of signup.
|
155 |
+
*
|
156 |
+
* [--yes]
|
157 |
+
* : Answer yes to the confirmation message.
|
158 |
+
*
|
159 |
+
* ## EXAMPLES
|
160 |
+
*
|
161 |
+
* $ wp bp signup delete 520
|
162 |
+
* Success: Signup deleted.
|
163 |
+
*
|
164 |
+
* $ wp bp signup delete 55654 54564 --yes
|
165 |
+
* Success: Signup deleted.
|
166 |
+
*/
|
167 |
+
public function delete( $args, $assoc_args ) {
|
168 |
+
$signup_id = $args[0];
|
169 |
+
|
170 |
+
WP_CLI::confirm( 'Are you sure you want to delete this signup?', $assoc_args );
|
171 |
+
|
172 |
+
parent::_delete( array( $signup_id ), $assoc_args, function( $signup_id ) {
|
173 |
+
if ( \BP_Signup::delete( array( $signup_id ) ) ) {
|
174 |
+
return array( 'success', 'Signup deleted.' );
|
175 |
+
} else {
|
176 |
+
return array( 'error', 'Could not delete signup.' );
|
177 |
+
}
|
178 |
+
} );
|
179 |
+
}
|
180 |
+
|
181 |
+
/**
|
182 |
+
* Activate a signup.
|
183 |
+
*
|
184 |
+
* ## OPTIONS
|
185 |
+
*
|
186 |
+
* <signup-id>
|
187 |
+
* : Identifier for the signup. Can be a signup ID, an email address, or a user_login.
|
188 |
+
*
|
189 |
+
* ## EXAMPLE
|
190 |
+
*
|
191 |
+
* $ wp bp signup activate ee48ec319fef3nn4
|
192 |
+
* Success: Signup activated, new user (ID #545).
|
193 |
+
*/
|
194 |
+
public function activate( $args, $assoc_args ) {
|
195 |
+
$signup = $this->get_signup_by_identifier( $args[0], $assoc_args );
|
196 |
+
$user_id = bp_core_activate_signup( $signup->activation_key );
|
197 |
+
|
198 |
+
if ( $user_id ) {
|
199 |
+
WP_CLI::success( sprintf( 'Signup activated, new user (ID #%d).', $user_id ) );
|
200 |
+
} else {
|
201 |
+
WP_CLI::error( 'Signup not activated.' );
|
202 |
+
}
|
203 |
+
}
|
204 |
+
|
205 |
+
/**
|
206 |
+
* Generate random signups.
|
207 |
+
*
|
208 |
+
* ## OPTIONS
|
209 |
+
*
|
210 |
+
* [--count=<number>]
|
211 |
+
* : How many signups to generate.
|
212 |
+
* ---
|
213 |
+
* default: 100
|
214 |
+
* ---
|
215 |
+
*
|
216 |
+
* ## EXAMPLE
|
217 |
+
*
|
218 |
+
* $ wp bp signup generate --count=50
|
219 |
+
*/
|
220 |
+
public function generate( $args, $assoc_args ) {
|
221 |
+
$notify = WP_CLI\Utils\make_progress_bar( 'Generating signups', $assoc_args['count'] );
|
222 |
+
|
223 |
+
// Use the email API to get a valid "from" domain.
|
224 |
+
$email_domain = new \BP_Email( '' );
|
225 |
+
$email_domain = $email_domain->get_from()->get_address();
|
226 |
+
$random_login = wp_generate_password( 12, false ); // Generate random user login.
|
227 |
+
|
228 |
+
for ( $i = 0; $i < $assoc_args['count']; $i++ ) {
|
229 |
+
$this->create( array(), array(
|
230 |
+
'user-login' => $random_login,
|
231 |
+
'user-email' => $random_login . substr( $email_domain, strpos( $email_domain, '@' ) ),
|
232 |
+
'silent',
|
233 |
+
) );
|
234 |
+
|
235 |
+
$notify->tick();
|
236 |
+
}
|
237 |
+
|
238 |
+
$notify->finish();
|
239 |
+
}
|
240 |
+
|
241 |
+
/**
|
242 |
+
* Resend activation e-mail to a newly registered user.
|
243 |
+
*
|
244 |
+
* ## OPTIONS
|
245 |
+
*
|
246 |
+
* <signup-id>
|
247 |
+
* : Identifier for the signup. Can be a signup ID, an email address, or a user_login.
|
248 |
+
*
|
249 |
+
* ## EXAMPLE
|
250 |
+
*
|
251 |
+
* $ wp bp signup resend test@example.com
|
252 |
+
* Success: Email sent successfully.
|
253 |
+
*
|
254 |
+
* @alias send
|
255 |
+
*/
|
256 |
+
public function resend( $args, $assoc_args ) {
|
257 |
+
$signup = $this->get_signup_by_identifier( $args[0], $assoc_args );
|
258 |
+
$send = \BP_Signup::resend( array( $signup->signup_id ) );
|
259 |
+
|
260 |
+
// Add feedback message.
|
261 |
+
if ( empty( $send['errors'] ) ) {
|
262 |
+
WP_CLI::success( 'Email sent successfully.' );
|
263 |
+
} else {
|
264 |
+
WP_CLI::error( 'This account is already activated.' );
|
265 |
+
}
|
266 |
+
}
|
267 |
+
|
268 |
+
/**
|
269 |
+
* Get a list of signups.
|
270 |
+
*
|
271 |
+
* ## OPTIONS
|
272 |
+
*
|
273 |
+
* [--<field>=<value>]
|
274 |
+
* : One or more parameters to pass. See \BP_Signup::get()
|
275 |
+
*
|
276 |
+
* [--<number>=<number>]
|
277 |
+
* : How many signups to list.
|
278 |
+
* ---
|
279 |
+
* default: 20
|
280 |
+
* ---
|
281 |
+
*
|
282 |
+
* [--format=<format>]
|
283 |
+
* : Render output in a particular format.
|
284 |
+
* ---
|
285 |
+
* default: table
|
286 |
+
* options:
|
287 |
+
* - table
|
288 |
+
* - ids
|
289 |
+
* - count
|
290 |
+
* - csv
|
291 |
+
* ---
|
292 |
+
*
|
293 |
+
* ## EXAMPLES
|
294 |
+
*
|
295 |
+
* $ wp bp signup list --format=ids
|
296 |
+
* $ wp bp signup list --number=100 --format=count
|
297 |
+
* $ wp bp signup list --number=5 --activation_key=ee48ec319fef3nn4
|
298 |
+
*
|
299 |
+
* @subcommand list
|
300 |
+
*/
|
301 |
+
public function _list( $_, $assoc_args ) {
|
302 |
+
$formatter = $this->get_formatter( $assoc_args );
|
303 |
+
$assoc_args = wp_parse_args( $assoc_args, array(
|
304 |
+
'number' => 20,
|
305 |
+
'fields' => 'all',
|
306 |
+
) );
|
307 |
+
|
308 |
+
if ( 'ids' === $formatter->format ) {
|
309 |
+
$assoc_args['fields'] = 'ids';
|
310 |
+
}
|
311 |
+
|
312 |
+
$signups = \BP_Signup::get( $assoc_args );
|
313 |
+
|
314 |
+
if ( empty( $signups['signups'] ) ) {
|
315 |
+
WP_CLI::error( 'No signups found.' );
|
316 |
+
}
|
317 |
+
|
318 |
+
if ( 'ids' === $formatter->format ) {
|
319 |
+
echo implode( ' ', $signups['signups'] ); // WPCS: XSS ok.
|
320 |
+
} elseif ( 'count' === $formatter->format ) {
|
321 |
+
WP_CLI::line( $signups['total'] );
|
322 |
+
} else {
|
323 |
+
$formatter->display_items( $signups['signups'] );
|
324 |
+
}
|
325 |
+
}
|
326 |
+
|
327 |
+
/**
|
328 |
+
* Look up a signup by the provided identifier.
|
329 |
+
*
|
330 |
+
* @since 1.5.0
|
331 |
+
*/
|
332 |
+
protected function get_signup_by_identifier( $identifier, $assoc_args ) {
|
333 |
+
if ( isset( $assoc_args['match-field'] ) ) {
|
334 |
+
switch ( $assoc_args['match-field'] ) {
|
335 |
+
case 'signup_id':
|
336 |
+
$signup_args['include'] = array( $identifier );
|
337 |
+
break;
|
338 |
+
|
339 |
+
case 'user_login':
|
340 |
+
$signup_args['user_login'] = $identifier;
|
341 |
+
break;
|
342 |
+
|
343 |
+
case 'user_email':
|
344 |
+
default:
|
345 |
+
$signup_args['usersearch'] = $identifier;
|
346 |
+
break;
|
347 |
+
}
|
348 |
+
} else {
|
349 |
+
if ( is_numeric( $identifier ) ) {
|
350 |
+
$signup_args['include'] = array( intval( $identifier ) );
|
351 |
+
} elseif ( is_email( $identifier ) ) {
|
352 |
+
$signup_args['usersearch'] = $identifier;
|
353 |
+
} else {
|
354 |
+
$signup_args['user_login'] = $identifier;
|
355 |
+
}
|
356 |
+
}
|
357 |
+
|
358 |
+
$signups = \BP_Signup::get( $signup_args );
|
359 |
+
$signup = null;
|
360 |
+
|
361 |
+
if ( ! empty( $signups['signups'] ) ) {
|
362 |
+
$signup = reset( $signups['signups'] );
|
363 |
+
}
|
364 |
+
|
365 |
+
if ( ! $signup ) {
|
366 |
+
WP_CLI::error( 'No signup found by that identifier.' );
|
367 |
+
}
|
368 |
+
|
369 |
+
return $signup;
|
370 |
+
}
|
371 |
+
}
|
cli/components/tool.php
ADDED
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI\Command;
|
3 |
+
|
4 |
+
use WP_CLI;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Manage BuddyPress Tools.
|
8 |
+
*
|
9 |
+
* @since 1.5.0
|
10 |
+
*/
|
11 |
+
class Tool extends BuddypressCommand {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Repair.
|
15 |
+
*
|
16 |
+
* ## OPTIONS
|
17 |
+
*
|
18 |
+
* <type>
|
19 |
+
* : Name of the repair tool.
|
20 |
+
* ---
|
21 |
+
* options:
|
22 |
+
* - friend-count
|
23 |
+
* - group-count
|
24 |
+
* - blog-records
|
25 |
+
* - count-members
|
26 |
+
* - last-activity
|
27 |
+
* ---
|
28 |
+
*
|
29 |
+
* ## EXAMPLES
|
30 |
+
*
|
31 |
+
* $ wp bp tool repair friend-count
|
32 |
+
* $ wp bp tool fix friend-count
|
33 |
+
* Success: Counting the number of friends for each user. Complete!
|
34 |
+
*
|
35 |
+
* @alias fix
|
36 |
+
*/
|
37 |
+
public function repair( $args, $assoc_args ) {
|
38 |
+
$repair = 'bp_admin_repair_' . $this->sanitize_string( $args[0] );
|
39 |
+
|
40 |
+
if ( ! function_exists( $repair ) ) {
|
41 |
+
WP_CLI::error( 'There is no repair tool with that name.' );
|
42 |
+
}
|
43 |
+
|
44 |
+
$result = $repair();
|
45 |
+
|
46 |
+
if ( 0 === $result[0] ) {
|
47 |
+
WP_CLI::success( $result[1] );
|
48 |
+
} else {
|
49 |
+
WP_CLI::error( $result[1] );
|
50 |
+
}
|
51 |
+
}
|
52 |
+
}
|
cli/components/xprofile-data.php
ADDED
@@ -0,0 +1,200 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI\Command;
|
3 |
+
|
4 |
+
use WP_CLI;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Manage XProfile Data.
|
8 |
+
*
|
9 |
+
* @since 1.5.0
|
10 |
+
*/
|
11 |
+
class XProfile_Data extends BuddypressCommand {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* XProfile object fields.
|
15 |
+
*
|
16 |
+
* @var array
|
17 |
+
*/
|
18 |
+
protected $obj_fields = array(
|
19 |
+
'id',
|
20 |
+
'field_id',
|
21 |
+
'user_id',
|
22 |
+
'value',
|
23 |
+
'last_updated',
|
24 |
+
);
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Set profile data for a user.
|
28 |
+
*
|
29 |
+
* ## OPTIONS
|
30 |
+
*
|
31 |
+
* --user-id=<user>
|
32 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
33 |
+
*
|
34 |
+
* --field-id=<field>
|
35 |
+
* : Identifier for the field. Accepts either the name of the field or a numeric ID.
|
36 |
+
*
|
37 |
+
* --value=<value>
|
38 |
+
* : Value to set.
|
39 |
+
*
|
40 |
+
* ## EXAMPLE
|
41 |
+
*
|
42 |
+
* $ wp bp xprofile data set --user-id=45 --field-id=120 --value=teste
|
43 |
+
* Success: Updated XProfile field "Field Name" (ID 120) with value "teste" for user user_login (ID 45).
|
44 |
+
*/
|
45 |
+
public function set( $args, $assoc_args ) {
|
46 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
47 |
+
$field_id = $this->get_field_id( $assoc_args['field-id'] );
|
48 |
+
$field = new \BP_XProfile_Field( $field_id );
|
49 |
+
|
50 |
+
if ( empty( $field->name ) ) {
|
51 |
+
WP_CLI::error( 'XProfile field not found.' );
|
52 |
+
}
|
53 |
+
|
54 |
+
$value = $assoc_args['value'];
|
55 |
+
|
56 |
+
if ( 'checkbox' === $field->type ) {
|
57 |
+
$value = explode( ',', $assoc_args['value'] );
|
58 |
+
}
|
59 |
+
|
60 |
+
$updated = xprofile_set_field_data( $field->id, $user->ID, $value );
|
61 |
+
|
62 |
+
if ( ! $updated ) {
|
63 |
+
WP_CLI::error( 'Could not set profile data.' );
|
64 |
+
}
|
65 |
+
|
66 |
+
$success = sprintf(
|
67 |
+
'Updated XProfile field "%s" (ID %d) with value "%s" for user %s (ID %d).',
|
68 |
+
$field->name,
|
69 |
+
$field->id,
|
70 |
+
$assoc_args['value'],
|
71 |
+
$user->user_nicename,
|
72 |
+
$user->ID
|
73 |
+
);
|
74 |
+
WP_CLI::success( $success );
|
75 |
+
}
|
76 |
+
|
77 |
+
/**
|
78 |
+
* Get profile data for a user.
|
79 |
+
*
|
80 |
+
* ## OPTIONS
|
81 |
+
*
|
82 |
+
* --user-id=<user>
|
83 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
84 |
+
*
|
85 |
+
* [--field-id=<field>]
|
86 |
+
* : Identifier for the field. Accepts either the name of the field or a numeric ID.
|
87 |
+
*
|
88 |
+
* [--format=<format>]
|
89 |
+
* : Render output in a particular format.
|
90 |
+
* ---
|
91 |
+
* default: table
|
92 |
+
* options:
|
93 |
+
* - table
|
94 |
+
* - json
|
95 |
+
* - haml
|
96 |
+
* ---
|
97 |
+
*
|
98 |
+
* [--multi-format=<multi-format>]
|
99 |
+
* : The format for array data.
|
100 |
+
* ---
|
101 |
+
* default: array
|
102 |
+
* options:
|
103 |
+
* - array
|
104 |
+
* - comma
|
105 |
+
* ---
|
106 |
+
*
|
107 |
+
* ## EXAMPLES
|
108 |
+
*
|
109 |
+
* $ wp bp xprofile data get --user-id=45 --field-id=120
|
110 |
+
* $ wp bp xprofile data see --user-id=user_test --field-id=Hometown --multi-format=comma
|
111 |
+
*
|
112 |
+
* @alias see
|
113 |
+
*/
|
114 |
+
public function get( $args, $assoc_args ) {
|
115 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
116 |
+
|
117 |
+
if ( isset( $assoc_args['field-id'] ) ) {
|
118 |
+
$data = xprofile_get_field_data( $assoc_args['field-id'], $user->ID, $assoc_args['multi-format'] );
|
119 |
+
WP_CLI::print_value( $data, $assoc_args );
|
120 |
+
} else {
|
121 |
+
$data = \BP_XProfile_ProfileData::get_all_for_user( $user->ID );
|
122 |
+
$formatted_data = array();
|
123 |
+
|
124 |
+
foreach ( $data as $field_name => $field_data ) {
|
125 |
+
// Omit WP core fields.
|
126 |
+
if ( ! is_array( $field_data ) ) {
|
127 |
+
continue;
|
128 |
+
}
|
129 |
+
|
130 |
+
$_field_data = maybe_unserialize( $field_data['field_data'] );
|
131 |
+
$_field_data = wp_json_encode( $_field_data );
|
132 |
+
|
133 |
+
$formatted_data[] = array(
|
134 |
+
'field_id' => $field_data['field_id'],
|
135 |
+
'field_name' => $field_name,
|
136 |
+
'value' => $_field_data,
|
137 |
+
);
|
138 |
+
}
|
139 |
+
|
140 |
+
$format_args = $assoc_args;
|
141 |
+
$format_args['fields'] = array(
|
142 |
+
'field_id',
|
143 |
+
'field_name',
|
144 |
+
'value',
|
145 |
+
);
|
146 |
+
$formatter = $this->get_formatter( $format_args );
|
147 |
+
$formatter->display_items( $formatted_data );
|
148 |
+
}
|
149 |
+
}
|
150 |
+
|
151 |
+
/**
|
152 |
+
* Delete XProfile data for a user.
|
153 |
+
*
|
154 |
+
* ## OPTIONS
|
155 |
+
*
|
156 |
+
* --user-id=<user>
|
157 |
+
* : Identifier for the user. Accepts either a user_login or a numeric ID.
|
158 |
+
*
|
159 |
+
* [--field-id=<field>]
|
160 |
+
* : Identifier for the field. Accepts either the name of the field or a numeric ID.
|
161 |
+
*
|
162 |
+
* [--delete-all]
|
163 |
+
* : Delete all data for the user.
|
164 |
+
*
|
165 |
+
* [--yes]
|
166 |
+
* : Answer yes to the confirmation message.
|
167 |
+
*
|
168 |
+
* ## EXAMPLES
|
169 |
+
*
|
170 |
+
* $ wp bp xprofile data delete --user-id=45 --field-id=120 --yes
|
171 |
+
* Success: XProfile data removed.
|
172 |
+
*
|
173 |
+
* $ wp bp xprofile data remove --user-id=user_test --delete-all --yes
|
174 |
+
* Success: XProfile data removed.
|
175 |
+
*
|
176 |
+
* @alias remove
|
177 |
+
*/
|
178 |
+
public function delete( $args, $assoc_args ) {
|
179 |
+
$user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
|
180 |
+
|
181 |
+
if ( ! isset( $assoc_args['field-id'] ) && ! isset( $assoc_args['delete-all'] ) ) {
|
182 |
+
WP_CLI::error( 'Either --field-id or --delete-all must be provided.' );
|
183 |
+
}
|
184 |
+
|
185 |
+
if ( isset( $assoc_args['delete-all'] ) ) {
|
186 |
+
WP_CLI::confirm( sprintf( 'Are you sure you want to delete all XProfile data for the user %s (#%d)?', $user->user_login, $user->ID ), $assoc_args );
|
187 |
+
|
188 |
+
xprofile_remove_data( $user->ID );
|
189 |
+
WP_CLI::success( 'XProfile data removed.' );
|
190 |
+
} else {
|
191 |
+
WP_CLI::confirm( 'Are you sure you want to delete that?', $assoc_args );
|
192 |
+
|
193 |
+
if ( xprofile_delete_field_data( $assoc_args['field-id'], $user->ID ) ) {
|
194 |
+
WP_CLI::success( 'XProfile data removed.' );
|
195 |
+
} else {
|
196 |
+
WP_CLI::error( 'Could not delete XProfile data.' );
|
197 |
+
}
|
198 |
+
}
|
199 |
+
}
|
200 |
+
}
|
cli/components/xprofile-field.php
ADDED
@@ -0,0 +1,217 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI\Command;
|
3 |
+
|
4 |
+
use WP_CLI;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Manage XProfile Fields.
|
8 |
+
*
|
9 |
+
* @since 1.5.0
|
10 |
+
*/
|
11 |
+
class XProfile_Field extends BuddypressCommand {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* XProfile object fields.
|
15 |
+
*
|
16 |
+
* @var array
|
17 |
+
*/
|
18 |
+
protected $obj_fields = array(
|
19 |
+
'id',
|
20 |
+
'name',
|
21 |
+
'description',
|
22 |
+
'type',
|
23 |
+
'group_id',
|
24 |
+
'is_required',
|
25 |
+
);
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Get a list of XProfile fields.
|
29 |
+
*
|
30 |
+
* ## OPTIONS
|
31 |
+
*
|
32 |
+
* [--<field>=<value>]
|
33 |
+
* : One or more parameters to pass. See bp_xprofile_get_groups()
|
34 |
+
*
|
35 |
+
* ## EXAMPLE
|
36 |
+
*
|
37 |
+
* $ wp bp xprofile field list
|
38 |
+
*
|
39 |
+
* @subcommand list
|
40 |
+
*/
|
41 |
+
public function _list( $_, $assoc_args ) {
|
42 |
+
$args = array_merge( $assoc_args, array(
|
43 |
+
'fields' => 'id,name',
|
44 |
+
'fetch_fields' => true,
|
45 |
+
) );
|
46 |
+
|
47 |
+
$fields = array();
|
48 |
+
$formatter = $this->get_formatter( $assoc_args );
|
49 |
+
$groups = bp_xprofile_get_groups( $args );
|
50 |
+
|
51 |
+
// Reformat so that field_group_id is a property of fields.
|
52 |
+
foreach ( $groups as $group ) {
|
53 |
+
foreach ( $group->fields as $field ) {
|
54 |
+
$fields[ $field->id ] = $field;
|
55 |
+
}
|
56 |
+
}
|
57 |
+
|
58 |
+
ksort( $fields );
|
59 |
+
|
60 |
+
$formatter->display_items( $fields );
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Create an XProfile field.
|
65 |
+
*
|
66 |
+
* ## OPTIONS
|
67 |
+
*
|
68 |
+
* --type=<type>
|
69 |
+
* : Field type.
|
70 |
+
* ---
|
71 |
+
* default: textbox
|
72 |
+
* ---
|
73 |
+
*
|
74 |
+
* --field-group-id=<field-group-id>
|
75 |
+
* : ID of the field group where the new field will be created.
|
76 |
+
*
|
77 |
+
* --name=<name>
|
78 |
+
* : Name of the new field.
|
79 |
+
*
|
80 |
+
* [--porcelain]
|
81 |
+
* : Output just the new field id.
|
82 |
+
*
|
83 |
+
* ## EXAMPLES
|
84 |
+
*
|
85 |
+
* $ wp bp xprofile field create --type=checkbox --field-group-id=508 --name="Field Name"
|
86 |
+
* Success: Created XProfile field "Field Name" (ID 24564).
|
87 |
+
*
|
88 |
+
* $ wp bp xprofile field add --type=checkbox --field-group-id=165 --name="Another Field"
|
89 |
+
* Success: Created XProfile field "Another Field" (ID 5465).
|
90 |
+
*
|
91 |
+
* @alias add
|
92 |
+
*/
|
93 |
+
public function create( $args, $assoc_args ) {
|
94 |
+
// Check this is a non-empty, valid field type.
|
95 |
+
if ( ! in_array( $assoc_args['type'], (array) buddypress()->profile->field_types, true ) ) {
|
96 |
+
WP_CLI::error( 'Not a valid field type.' );
|
97 |
+
}
|
98 |
+
|
99 |
+
$create_args = array(
|
100 |
+
'type' => $assoc_args['type'],
|
101 |
+
'name' => $assoc_args['name'],
|
102 |
+
'field_group_id' => $assoc_args['field-group-id'],
|
103 |
+
);
|
104 |
+
|
105 |
+
$field_id = xprofile_insert_field( $create_args );
|
106 |
+
if ( ! $field_id ) {
|
107 |
+
WP_CLI::error( 'Could not create XProfile field.' );
|
108 |
+
}
|
109 |
+
|
110 |
+
if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
|
111 |
+
WP_CLI::line( $field_id );
|
112 |
+
} else {
|
113 |
+
$field = new \BP_XProfile_Field( $field_id );
|
114 |
+
$success = sprintf(
|
115 |
+
'Created XProfile field "%s" (ID %d).',
|
116 |
+
$field->name,
|
117 |
+
$field->id
|
118 |
+
);
|
119 |
+
WP_CLI::success( $success );
|
120 |
+
}
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Get an XProfile field.
|
125 |
+
*
|
126 |
+
* ## OPTIONS
|
127 |
+
*
|
128 |
+
* <field-id>
|
129 |
+
* : Identifier for the field. Accepts either the name of the field or a numeric ID.
|
130 |
+
*
|
131 |
+
* [--fields=<fields>]
|
132 |
+
* : Limit the output to specific fields.
|
133 |
+
* ---
|
134 |
+
* Default: All fields.
|
135 |
+
* ---
|
136 |
+
*
|
137 |
+
* [--format=<format>]
|
138 |
+
* : Render output in a particular format.
|
139 |
+
* ---
|
140 |
+
* default: table
|
141 |
+
* options:
|
142 |
+
* - table
|
143 |
+
* - json
|
144 |
+
* - haml
|
145 |
+
* ---
|
146 |
+
*
|
147 |
+
* ## EXAMPLES
|
148 |
+
*
|
149 |
+
* $ wp bp xprofile field get 500
|
150 |
+
* $ wp bp xprofile field see 56 --format=json
|
151 |
+
*
|
152 |
+
* @alias see
|
153 |
+
*/
|
154 |
+
public function get( $args, $assoc_args ) {
|
155 |
+
$field_id = $this->get_field_id( $args[0] );
|
156 |
+
$object = xprofile_get_field( $field_id );
|
157 |
+
|
158 |
+
if ( ! is_object( $object ) && empty( $object->id ) ) {
|
159 |
+
WP_CLI::error( 'No XProfile field found.' );
|
160 |
+
}
|
161 |
+
|
162 |
+
$object_arr = get_object_vars( $object );
|
163 |
+
|
164 |
+
if ( empty( $assoc_args['fields'] ) ) {
|
165 |
+
$assoc_args['fields'] = array_keys( $object_arr );
|
166 |
+
}
|
167 |
+
|
168 |
+
$formatter = $this->get_formatter( $assoc_args );
|
169 |
+
$formatter->display_item( $object_arr );
|
170 |
+
}
|
171 |
+
|
172 |
+
/**
|
173 |
+
* Delete an XProfile field.
|
174 |
+
*
|
175 |
+
* ## OPTIONS
|
176 |
+
*
|
177 |
+
* <field-id>...
|
178 |
+
* : ID or IDs for the field. Accepts either the name of the field or a numeric ID.
|
179 |
+
*
|
180 |
+
* [--delete-data]
|
181 |
+
* : Delete user data for the field as well.
|
182 |
+
* ---
|
183 |
+
* default: false
|
184 |
+
* ---
|
185 |
+
*
|
186 |
+
* [--yes]
|
187 |
+
* : Answer yes to the confirmation message.
|
188 |
+
*
|
189 |
+
* ## EXAMPLES
|
190 |
+
*
|
191 |
+
* $ wp bp xprofile field delete 500 --yes
|
192 |
+
* Success: Deleted XProfile field "Field Name" (ID 500).
|
193 |
+
*
|
194 |
+
* $ wp bp xprofile field remove 458 --delete-data --yes
|
195 |
+
* Success: Deleted XProfile field "Another Field Name" (ID 458).
|
196 |
+
*
|
197 |
+
* @alias remove
|
198 |
+
*/
|
199 |
+
public function delete( $args, $assoc_args ) {
|
200 |
+
$field_id = $this->get_field_id( $args[0] );
|
201 |
+
|
202 |
+
WP_CLI::confirm( 'Are you sure you want to delete this field?', $assoc_args );
|
203 |
+
|
204 |
+
parent::_delete( array( $field_id ), $assoc_args, function( $field_id ) use ( $r ) {
|
205 |
+
$field = new \BP_XProfile_Field( $field_id );
|
206 |
+
$name = $field->name;
|
207 |
+
$id = $field->id;
|
208 |
+
$deleted = $field->delete( $r['delete_data'] );
|
209 |
+
|
210 |
+
if ( $deleted ) {
|
211 |
+
return array( 'success', sprintf( 'Deleted XProfile field "%s" (ID %d).', $name, $id ) );
|
212 |
+
} else {
|
213 |
+
return array( 'error', sprintf( 'Failed deleting XProfile field (ID %d).', $field_id ) );
|
214 |
+
}
|
215 |
+
} );
|
216 |
+
}
|
217 |
+
}
|
cli/components/xprofile-group.php
ADDED
@@ -0,0 +1,174 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI\Command;
|
3 |
+
|
4 |
+
use WP_CLI;
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Manage XProfile Groups.
|
8 |
+
*
|
9 |
+
* @since 1.5.0
|
10 |
+
*/
|
11 |
+
class XProfile_Group extends BuddypressCommand {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* XProfile object fields.
|
15 |
+
*
|
16 |
+
* @var array
|
17 |
+
*/
|
18 |
+
protected $obj_fields = array(
|
19 |
+
'id',
|
20 |
+
'name',
|
21 |
+
'description',
|
22 |
+
'group_order',
|
23 |
+
'can_delete',
|
24 |
+
);
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Object ID key.
|
28 |
+
*
|
29 |
+
* @var int
|
30 |
+
*/
|
31 |
+
protected $obj_id_key = 'id';
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Create an XProfile group.
|
35 |
+
*
|
36 |
+
* ## OPTIONS
|
37 |
+
*
|
38 |
+
* --name=<name>
|
39 |
+
* : The name for this field group.
|
40 |
+
*
|
41 |
+
* [--description=<description>]
|
42 |
+
* : The description for this field group.
|
43 |
+
*
|
44 |
+
* [--can-delete=<can-delete>]
|
45 |
+
* : Whether the group can be deleted.
|
46 |
+
* ---
|
47 |
+
* Default: true.
|
48 |
+
* ---
|
49 |
+
*
|
50 |
+
* [--porcelain]
|
51 |
+
* : Output just the new group id.
|
52 |
+
*
|
53 |
+
* ## EXAMPLES
|
54 |
+
*
|
55 |
+
* $ wp bp xprofile group create --name="Group Name" --description="Xprofile Group Description"
|
56 |
+
* Success: Created XProfile field group "Group Name" (ID 123).
|
57 |
+
*
|
58 |
+
* $ wp bp xprofile group add --name="Another Group" --can-delete=false
|
59 |
+
* Success: Created XProfile field group "Another Group" (ID 21212).
|
60 |
+
*
|
61 |
+
* @alias add
|
62 |
+
*/
|
63 |
+
public function create( $args, $assoc_args ) {
|
64 |
+
$r = wp_parse_args( $assoc_args, array(
|
65 |
+
'name' => '',
|
66 |
+
'description' => '',
|
67 |
+
'can_delete' => true,
|
68 |
+
) );
|
69 |
+
|
70 |
+
$group_id = xprofile_insert_field_group( $r );
|
71 |
+
|
72 |
+
if ( ! $group_id ) {
|
73 |
+
WP_CLI::error( 'Could not create field group.' );
|
74 |
+
}
|
75 |
+
|
76 |
+
if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
|
77 |
+
WP_CLI::line( $group_id );
|
78 |
+
} else {
|
79 |
+
$group = new \BP_XProfile_Group( $group_id );
|
80 |
+
$success = sprintf(
|
81 |
+
'Created XProfile field group "%s" (ID %d).',
|
82 |
+
$group->name,
|
83 |
+
$group->id
|
84 |
+
);
|
85 |
+
WP_CLI::success( $success );
|
86 |
+
}
|
87 |
+
}
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Fetch specific XProfile field group.
|
91 |
+
*
|
92 |
+
* ## OPTIONS
|
93 |
+
*
|
94 |
+
* <field-group-id>
|
95 |
+
* : Identifier for the field group.
|
96 |
+
*
|
97 |
+
* [--fields=<fields>]
|
98 |
+
* : Limit the output to specific fields.
|
99 |
+
* ---
|
100 |
+
* Default: All fields.
|
101 |
+
* ---
|
102 |
+
*
|
103 |
+
* [--format=<format>]
|
104 |
+
* : Render output in a particular format.
|
105 |
+
* ---
|
106 |
+
* default: table
|
107 |
+
* options:
|
108 |
+
* - table
|
109 |
+
* - json
|
110 |
+
* - haml
|
111 |
+
* ---
|
112 |
+
*
|
113 |
+
* ## EXAMPLES
|
114 |
+
*
|
115 |
+
* $ wp bp xprofile group get 500
|
116 |
+
* $ wp bp xprofile group see 56 --format=json
|
117 |
+
*
|
118 |
+
* @alias see
|
119 |
+
*/
|
120 |
+
public function get( $args, $assoc_args ) {
|
121 |
+
$field_group_id = $args[0];
|
122 |
+
|
123 |
+
if ( ! is_numeric( $field_group_id ) ) {
|
124 |
+
WP_CLI::error( 'Please provide a numeric field group ID.' );
|
125 |
+
}
|
126 |
+
|
127 |
+
$object = xprofile_get_field_group( $field_group_id );
|
128 |
+
if ( ! is_object( $object ) && empty( $object->id ) ) {
|
129 |
+
WP_CLI::error( 'No XProfile field group found.' );
|
130 |
+
}
|
131 |
+
|
132 |
+
$object_arr = get_object_vars( $object );
|
133 |
+
if ( empty( $assoc_args['fields'] ) ) {
|
134 |
+
$assoc_args['fields'] = array_keys( $object_arr );
|
135 |
+
}
|
136 |
+
|
137 |
+
$formatter = $this->get_formatter( $assoc_args );
|
138 |
+
$formatter->display_item( $object_arr );
|
139 |
+
}
|
140 |
+
|
141 |
+
/**
|
142 |
+
* Delete a specific XProfile field group.
|
143 |
+
*
|
144 |
+
* ## OPTIONS
|
145 |
+
*
|
146 |
+
* <field-group-id>...
|
147 |
+
* : ID or IDs for the field group.
|
148 |
+
*
|
149 |
+
* [--yes]
|
150 |
+
* : Answer yes to the confirmation message.
|
151 |
+
*
|
152 |
+
* ## EXAMPLE
|
153 |
+
*
|
154 |
+
* $ wp bp xprofile group delete 500 --yes
|
155 |
+
*
|
156 |
+
* @alias remove
|
157 |
+
*/
|
158 |
+
public function delete( $args, $assoc_args ) {
|
159 |
+
$field_group_id = $args[0];
|
160 |
+
WP_CLI::confirm( 'Are you sure you want to delete this field group?', $assoc_args );
|
161 |
+
|
162 |
+
parent::_delete( array( $field_group_id ), $assoc_args, function( $field_group_id ) {
|
163 |
+
if ( ! is_numeric( $field_group_id ) ) {
|
164 |
+
WP_CLI::error( 'This is not a valid field group ID.' );
|
165 |
+
}
|
166 |
+
|
167 |
+
if ( xprofile_delete_field_group( $field_group_id ) ) {
|
168 |
+
return array( 'success', 'Field group deleted.' );
|
169 |
+
} else {
|
170 |
+
return array( 'error', 'Could not delete the field group.' );
|
171 |
+
}
|
172 |
+
} );
|
173 |
+
}
|
174 |
+
}
|
cli/composer.json
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "buddypress/wp-cli-buddypress",
|
3 |
+
"type": "wp-cli-package",
|
4 |
+
"description": "WP-CLI Community Package of BuddyPress commands",
|
5 |
+
"keywords": [ "wp-cli", "buddypress", "community", "wordpress", "bp" ],
|
6 |
+
"homepage": "https://github.com/buddypress/wp-cli-buddypress",
|
7 |
+
"license": "MIT",
|
8 |
+
"authors": [
|
9 |
+
{
|
10 |
+
"name": "The BuddPress Contributors",
|
11 |
+
"homepage": "https://buddypress.org/"
|
12 |
+
}
|
13 |
+
],
|
14 |
+
"support": {
|
15 |
+
"issues": "https://github.com/buddypress/wp-cli-buddypress/issues",
|
16 |
+
"source": "https://github.com/buddypress/wp-cli-buddypress"
|
17 |
+
},
|
18 |
+
"minimum-stability": "dev",
|
19 |
+
"prefer-stable": true,
|
20 |
+
"autoload": {
|
21 |
+
"files": [ "wp-cli-bp.php" ]
|
22 |
+
},
|
23 |
+
"require": {
|
24 |
+
"php": ">=5.3",
|
25 |
+
"wp-cli/wp-cli": ">=0.23.0"
|
26 |
+
},
|
27 |
+
"require-dev": {
|
28 |
+
"behat/behat": "~2.5"
|
29 |
+
},
|
30 |
+
"extra": {
|
31 |
+
"branch-alias": {
|
32 |
+
"dev-master": "1.x-dev"
|
33 |
+
},
|
34 |
+
"bundled": true,
|
35 |
+
"commands": [
|
36 |
+
"bp"
|
37 |
+
]
|
38 |
+
}
|
39 |
+
}
|
cli/features/activity-favorite.feature
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Feature: Manage BuddyPress Activity Favorites
|
2 |
+
|
3 |
+
Scenario: Activity Favorite CRUD Operations
|
4 |
+
Given a BP install
|
5 |
+
|
6 |
+
When I run `wp user create testuser2 testuser2@example.com --porcelain`
|
7 |
+
And save STDOUT as {MEMBER_ID}
|
8 |
+
|
9 |
+
When I run `wp bp activity create --component=groups --user-id={MEMBER_ID} --porcelain`
|
10 |
+
Then STDOUT should be a number
|
11 |
+
And save STDOUT as {ACTIVITY_ID}
|
12 |
+
|
13 |
+
When I run `wp bp activity list --fields=id,user_id,component`
|
14 |
+
Then STDOUT should be a table containing rows:
|
15 |
+
| id | user_id | component |
|
16 |
+
| {ACTIVITY_ID} | {MEMBER_ID} | groups |
|
17 |
+
|
18 |
+
When I run `wp user create testuser3 testuser3@example.com --porcelain`
|
19 |
+
And save STDOUT as {SEC_MEMBER_ID}
|
20 |
+
|
21 |
+
When I run `wp bp activity favorite create {ACTIVITY_ID} {SEC_MEMBER_ID}`
|
22 |
+
Then STDOUT should contain:
|
23 |
+
"""
|
24 |
+
Success: Activity item added as a favorite for the user.
|
25 |
+
"""
|
26 |
+
|
27 |
+
When I run `wp bp activity favorite list {SEC_MEMBER_ID} --fields=id`
|
28 |
+
Then STDOUT should be a table containing rows:
|
29 |
+
| id |
|
30 |
+
| {ACTIVITY_ID} |
|
31 |
+
|
32 |
+
When I run `wp bp activity favorite remove {ACTIVITY_ID} {SEC_MEMBER_ID} --yes`
|
33 |
+
Then STDOUT should contain:
|
34 |
+
"""
|
35 |
+
Success: Activity item removed as a favorite for the user.
|
36 |
+
"""
|
37 |
+
|
38 |
+
When I try `wp bp activity favorite list {SEC_MEMBER_ID} --fields=id`
|
39 |
+
Then the return code should be 1
|
cli/features/activity.feature
ADDED
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Feature: Manage BuddyPress Activities
|
2 |
+
|
3 |
+
Scenario: Activity CRUD Operations
|
4 |
+
Given a BP install
|
5 |
+
|
6 |
+
When I run `wp user create testuser2 testuser2@example.com --first_name=test --last_name=user --role=subscriber --porcelain`
|
7 |
+
Then STDOUT should be a number
|
8 |
+
And save STDOUT as {MEMBER_ID}
|
9 |
+
|
10 |
+
When I run `wp bp activity create --component=groups --user-id={MEMBER_ID} --porcelain`
|
11 |
+
Then STDOUT should be a number
|
12 |
+
And save STDOUT as {ACTIVITY_ID}
|
13 |
+
|
14 |
+
When I run `wp bp activity get {ACTIVITY_ID} --fields=id,user_id,component`
|
15 |
+
Then STDOUT should be a table containing rows:
|
16 |
+
| Field | Value |
|
17 |
+
| id | {ACTIVITY_ID} |
|
18 |
+
| user_id | {MEMBER_ID} |
|
19 |
+
| component | groups |
|
20 |
+
|
21 |
+
When I run `wp bp activity list --fields=id,user_id,component`
|
22 |
+
Then STDOUT should be a table containing rows:
|
23 |
+
| id | user_id | component |
|
24 |
+
| {ACTIVITY_ID} | {MEMBER_ID} | groups |
|
25 |
+
|
26 |
+
When I run `wp bp activity spam {ACTIVITY_ID}`
|
27 |
+
Then STDOUT should contain:
|
28 |
+
"""
|
29 |
+
Success: Activity marked as spam.
|
30 |
+
"""
|
31 |
+
|
32 |
+
When I run `wp bp activity get {ACTIVITY_ID} --fields=id,is_spam`
|
33 |
+
Then STDOUT should be a table containing rows:
|
34 |
+
| Field | Value |
|
35 |
+
| id | {ACTIVITY_ID} |
|
36 |
+
| is_spam | 1 |
|
37 |
+
|
38 |
+
When I run `wp bp activity ham {ACTIVITY_ID}`
|
39 |
+
Then STDOUT should contain:
|
40 |
+
"""
|
41 |
+
Success: Activity marked as ham.
|
42 |
+
"""
|
43 |
+
|
44 |
+
When I run `wp bp activity get {ACTIVITY_ID} --fields=id,is_spam`
|
45 |
+
Then STDOUT should be a table containing rows:
|
46 |
+
| Field | Value |
|
47 |
+
| id | {ACTIVITY_ID} |
|
48 |
+
| is_spam | 0 |
|
49 |
+
|
50 |
+
When I run `wp bp activity delete {ACTIVITY_ID} --yes`
|
51 |
+
Then STDOUT should contain:
|
52 |
+
"""
|
53 |
+
Success: Activity deleted.
|
54 |
+
"""
|
55 |
+
|
56 |
+
When I try `wp bp activity get {ACTIVITY_ID}`
|
57 |
+
Then the return code should be 1
|
58 |
+
|
59 |
+
Scenario: Activity Comment Operations
|
60 |
+
Given a BP install
|
61 |
+
|
62 |
+
When I run `wp user create testuser2 testuser2@example.com --first_name=test --last_name=user --role=subscriber --porcelain`
|
63 |
+
Then STDOUT should be a number
|
64 |
+
And save STDOUT as {MEMBER_ID}
|
65 |
+
|
66 |
+
When I run `wp bp activity post-update --user-id={MEMBER_ID} --content="Random Content" --porcelain`
|
67 |
+
Then STDOUT should be a number
|
68 |
+
And save STDOUT as {ACTIVITY_ID}
|
69 |
+
|
70 |
+
When I run `wp bp activity list --fields=id,user_id,component`
|
71 |
+
Then STDOUT should be a table containing rows:
|
72 |
+
| id | user_id | component |
|
73 |
+
| {ACTIVITY_ID} | {MEMBER_ID} | activity |
|
74 |
+
|
75 |
+
When I run `wp bp activity comment {ACTIVITY_ID} --user-id={MEMBER_ID} --content="Activity Comment" --skip-notification --porcelain`
|
76 |
+
Then STDOUT should be a number
|
77 |
+
And save STDOUT as {COMMENT_ID}
|
78 |
+
|
79 |
+
When I run `wp bp activity get {COMMENT_ID} --fields=id,type`
|
80 |
+
Then STDOUT should be a table containing rows:
|
81 |
+
| Field | Value |
|
82 |
+
| id | {COMMENT_ID} |
|
83 |
+
| type | activity_comment |
|
84 |
+
|
85 |
+
When I run `wp bp activity delete_comment {ACTIVITY_ID} --comment-id={COMMENT_ID} --yes`
|
86 |
+
Then STDOUT should contain:
|
87 |
+
"""
|
88 |
+
Success: Activity comment deleted.
|
89 |
+
"""
|
90 |
+
|
91 |
+
When I try `wp bp activity get {COMMENT_ID} --fields=id,type`
|
92 |
+
Then the return code should be 1
|
cli/features/bootstrap/FeatureContext.php
ADDED
@@ -0,0 +1,903 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
use Behat\Behat\Context\ClosuredContextInterface,
|
4 |
+
Behat\Behat\Context\TranslatedContextInterface,
|
5 |
+
Behat\Behat\Context\BehatContext,
|
6 |
+
Behat\Behat\Event\SuiteEvent;
|
7 |
+
|
8 |
+
use \WP_CLI\Process;
|
9 |
+
use \WP_CLI\Utils;
|
10 |
+
|
11 |
+
// Inside a community package
|
12 |
+
if ( file_exists( __DIR__ . '/utils.php' ) ) {
|
13 |
+
require_once __DIR__ . '/utils.php';
|
14 |
+
require_once __DIR__ . '/Process.php';
|
15 |
+
require_once __DIR__ . '/ProcessRun.php';
|
16 |
+
$project_composer = dirname( dirname( dirname( __FILE__ ) ) ) . '/composer.json';
|
17 |
+
if ( file_exists( $project_composer ) ) {
|
18 |
+
$composer = json_decode( file_get_contents( $project_composer ) );
|
19 |
+
if ( ! empty( $composer->autoload->files ) ) {
|
20 |
+
$contents = 'require:' . PHP_EOL;
|
21 |
+
foreach( $composer->autoload->files as $file ) {
|
22 |
+
$contents .= ' - ' . dirname( dirname( dirname( __FILE__ ) ) ) . '/' . $file . PHP_EOL;
|
23 |
+
}
|
24 |
+
@mkdir( sys_get_temp_dir() . '/wp-cli-package-test/' );
|
25 |
+
$project_config = sys_get_temp_dir() . '/wp-cli-package-test/config.yml';
|
26 |
+
file_put_contents( $project_config, $contents );
|
27 |
+
putenv( 'WP_CLI_CONFIG_PATH=' . $project_config );
|
28 |
+
}
|
29 |
+
}
|
30 |
+
// Inside WP-CLI
|
31 |
+
} else {
|
32 |
+
require_once __DIR__ . '/../../php/utils.php';
|
33 |
+
require_once __DIR__ . '/../../php/WP_CLI/Process.php';
|
34 |
+
require_once __DIR__ . '/../../php/WP_CLI/ProcessRun.php';
|
35 |
+
if ( file_exists( __DIR__ . '/../../vendor/autoload.php' ) ) {
|
36 |
+
require_once __DIR__ . '/../../vendor/autoload.php';
|
37 |
+
} else if ( file_exists( __DIR__ . '/../../../../autoload.php' ) ) {
|
38 |
+
require_once __DIR__ . '/../../../../autoload.php';
|
39 |
+
}
|
40 |
+
}
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Features context.
|
44 |
+
*/
|
45 |
+
class FeatureContext extends BehatContext implements ClosuredContextInterface {
|
46 |
+
|
47 |
+
/**
|
48 |
+
* The current working directory for scenarios that have a "Given a WP install" or "Given an empty directory" step. Variable RUN_DIR. Lives until the end of the scenario.
|
49 |
+
*/
|
50 |
+
private static $run_dir;
|
51 |
+
|
52 |
+
/**
|
53 |
+
* Where WordPress core is downloaded to for caching, and which is copied to RUN_DIR during a "Given a WP install" step. Lives until manually deleted.
|
54 |
+
*/
|
55 |
+
private static $cache_dir;
|
56 |
+
|
57 |
+
/**
|
58 |
+
* The directory that holds the install cache, and which is copied to RUN_DIR during a "Given a WP install" step. Recreated on each suite run.
|
59 |
+
*/
|
60 |
+
private static $install_cache_dir;
|
61 |
+
|
62 |
+
/**
|
63 |
+
* The directory that the WP-CLI cache (WP_CLI_CACHE_DIR, normally "$HOME/.wp-cli/cache") is set to on a "Given an empty cache" step.
|
64 |
+
* Variable SUITE_CACHE_DIR. Lives until the end of the scenario (or until another "Given an empty cache" step within the scenario).
|
65 |
+
*/
|
66 |
+
private static $suite_cache_dir;
|
67 |
+
|
68 |
+
/**
|
69 |
+
* Where the current WP-CLI source repository is copied to for Composer-based tests with a "Given a dependency on current wp-cli" step.
|
70 |
+
* Variable COMPOSER_LOCAL_REPOSITORY. Lives until the end of the suite.
|
71 |
+
*/
|
72 |
+
private static $composer_local_repository;
|
73 |
+
|
74 |
+
/**
|
75 |
+
* The test database settings. All but `dbname` can be set via environment variables. The database is dropped at the start of each scenario and created on a "Given a WP install" step.
|
76 |
+
*/
|
77 |
+
private static $db_settings = array(
|
78 |
+
'dbname' => 'wp_cli_test',
|
79 |
+
'dbuser' => 'wp_cli_test',
|
80 |
+
'dbpass' => 'password1',
|
81 |
+
'dbhost' => '127.0.0.1',
|
82 |
+
);
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Array of background process ids started by the current scenario. Used to terminate them at the end of the scenario.
|
86 |
+
*/
|
87 |
+
private $running_procs = array();
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Array of variables available as {VARIABLE_NAME}. Some are always set: CORE_CONFIG_SETTINGS, SRC_DIR, CACHE_DIR, WP_VERSION-version-latest. Some are step-dependent:
|
91 |
+
* RUN_DIR, SUITE_CACHE_DIR, COMPOSER_LOCAL_REPOSITORY, PHAR_PATH. Scenarios can define their own variables using "Given save" steps. Variables are reset for each scenario.
|
92 |
+
*/
|
93 |
+
public $variables = array();
|
94 |
+
|
95 |
+
/**
|
96 |
+
* The current feature file and scenario line number as '<file>.<line>'. Used in RUN_DIR and SUITE_CACHE_DIR directory names. Set at the start of each scenario.
|
97 |
+
*/
|
98 |
+
private static $temp_dir_infix;
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Settings and variables for WP_CLI_TEST_LOG_RUN_TIMES run time logging.
|
102 |
+
*/
|
103 |
+
private static $log_run_times; // Whether to log run times - WP_CLI_TEST_LOG_RUN_TIMES env var. Set on `@BeforeScenario'.
|
104 |
+
private static $suite_start_time; // When the suite started, set on `@BeforeScenario'.
|
105 |
+
private static $output_to; // Where to output log - stdout|error_log. Set on `@BeforeSuite`.
|
106 |
+
private static $num_top_processes; // Number of processes/methods to output by longest run times. Set on `@BeforeSuite`.
|
107 |
+
private static $num_top_scenarios; // Number of scenarios to output by longest run times. Set on `@BeforeSuite`.
|
108 |
+
|
109 |
+
private static $scenario_run_times = array(); // Scenario run times (top `self::$num_top_scenarios` only).
|
110 |
+
private static $scenario_count = 0; // Scenario count, incremented on `@AfterScenario`.
|
111 |
+
private static $proc_method_run_times = array(); // Array of run time info for proc methods, keyed by method name and arg, each a 2-element array containing run time and run count.
|
112 |
+
|
113 |
+
/**
|
114 |
+
* Get the environment variables required for launched `wp` processes
|
115 |
+
*/
|
116 |
+
private static function get_process_env_variables() {
|
117 |
+
// Ensure we're using the expected `wp` binary
|
118 |
+
$bin_dir = getenv( 'WP_CLI_BIN_DIR' ) ?: realpath( __DIR__ . '/../../bin' );
|
119 |
+
$vendor_dir = realpath( __DIR__ . '/../../vendor/bin' );
|
120 |
+
$env = array(
|
121 |
+
'PATH' => $bin_dir . ':' . $vendor_dir . ':' . getenv( 'PATH' ),
|
122 |
+
'BEHAT_RUN' => 1,
|
123 |
+
'HOME' => sys_get_temp_dir() . '/wp-cli-home',
|
124 |
+
);
|
125 |
+
if ( $config_path = getenv( 'WP_CLI_CONFIG_PATH' ) ) {
|
126 |
+
$env['WP_CLI_CONFIG_PATH'] = $config_path;
|
127 |
+
}
|
128 |
+
if ( $term = getenv( 'TERM' ) ) {
|
129 |
+
$env['TERM'] = $term;
|
130 |
+
}
|
131 |
+
if ( $php_args = getenv( 'WP_CLI_PHP_ARGS' ) ) {
|
132 |
+
$env['WP_CLI_PHP_ARGS'] = $php_args;
|
133 |
+
}
|
134 |
+
if ( $travis_build_dir = getenv( 'TRAVIS_BUILD_DIR' ) ) {
|
135 |
+
$env['TRAVIS_BUILD_DIR'] = $travis_build_dir;
|
136 |
+
}
|
137 |
+
if ( $github_token = getenv( 'GITHUB_TOKEN' ) ) {
|
138 |
+
$env['GITHUB_TOKEN'] = $github_token;
|
139 |
+
}
|
140 |
+
return $env;
|
141 |
+
}
|
142 |
+
|
143 |
+
/**
|
144 |
+
* We cache the results of `wp core download` to improve test performance.
|
145 |
+
* Ideally, we'd cache at the HTTP layer for more reliable tests.
|
146 |
+
*/
|
147 |
+
private static function cache_wp_files() {
|
148 |
+
$wp_version_suffix = ( $wp_version = getenv( 'WP_VERSION' ) ) ? "-$wp_version" : '';
|
149 |
+
self::$cache_dir = sys_get_temp_dir() . '/wp-cli-test-core-download-cache' . $wp_version_suffix;
|
150 |
+
|
151 |
+
if ( is_readable( self::$cache_dir . '/wp-config-sample.php' ) )
|
152 |
+
return;
|
153 |
+
|
154 |
+
$cmd = Utils\esc_cmd( 'wp core download --force --path=%s', self::$cache_dir );
|
155 |
+
if ( $wp_version ) {
|
156 |
+
$cmd .= Utils\esc_cmd( ' --version=%s', $wp_version );
|
157 |
+
}
|
158 |
+
Process::create( $cmd, null, self::get_process_env_variables() )->run_check();
|
159 |
+
}
|
160 |
+
|
161 |
+
/**
|
162 |
+
* @BeforeSuite
|
163 |
+
*/
|
164 |
+
public static function prepare( SuiteEvent $event ) {
|
165 |
+
// Test performance statistics - useful for detecting slow tests.
|
166 |
+
if ( self::$log_run_times = getenv( 'WP_CLI_TEST_LOG_RUN_TIMES' ) ) {
|
167 |
+
self::log_run_times_before_suite( $event );
|
168 |
+
}
|
169 |
+
|
170 |
+
$result = Process::create( 'wp cli info', null, self::get_process_env_variables() )->run_check();
|
171 |
+
echo PHP_EOL;
|
172 |
+
echo $result->stdout;
|
173 |
+
echo PHP_EOL;
|
174 |
+
self::cache_wp_files();
|
175 |
+
$result = Process::create( Utils\esc_cmd( 'wp core version --path=%s', self::$cache_dir ) , null, self::get_process_env_variables() )->run_check();
|
176 |
+
echo 'WordPress ' . $result->stdout;
|
177 |
+
echo PHP_EOL;
|
178 |
+
|
179 |
+
// Remove install cache if any (not setting the static var).
|
180 |
+
$wp_version_suffix = ( $wp_version = getenv( 'WP_VERSION' ) ) ? "-$wp_version" : '';
|
181 |
+
$install_cache_dir = sys_get_temp_dir() . '/wp-cli-test-core-install-cache' . $wp_version_suffix;
|
182 |
+
if ( file_exists( $install_cache_dir ) ) {
|
183 |
+
self::remove_dir( $install_cache_dir );
|
184 |
+
}
|
185 |
+
}
|
186 |
+
|
187 |
+
/**
|
188 |
+
* @AfterSuite
|
189 |
+
*/
|
190 |
+
public static function afterSuite( SuiteEvent $event ) {
|
191 |
+
if ( self::$composer_local_repository ) {
|
192 |
+
self::remove_dir( self::$composer_local_repository );
|
193 |
+
self::$composer_local_repository = null;
|
194 |
+
}
|
195 |
+
|
196 |
+
if ( self::$log_run_times ) {
|
197 |
+
self::log_run_times_after_suite( $event );
|
198 |
+
}
|
199 |
+
}
|
200 |
+
|
201 |
+
/**
|
202 |
+
* @BeforeScenario
|
203 |
+
*/
|
204 |
+
public function beforeScenario( $event ) {
|
205 |
+
if ( self::$log_run_times ) {
|
206 |
+
self::log_run_times_before_scenario( $event );
|
207 |
+
}
|
208 |
+
|
209 |
+
$this->variables['SRC_DIR'] = realpath( __DIR__ . '/../..' );
|
210 |
+
|
211 |
+
// Used in the names of the RUN_DIR and SUITE_CACHE_DIR directories.
|
212 |
+
self::$temp_dir_infix = null;
|
213 |
+
if ( $file = self::get_event_file( $event, $line ) ) {
|
214 |
+
self::$temp_dir_infix = basename( $file ) . '.' . $line;
|
215 |
+
}
|
216 |
+
}
|
217 |
+
|
218 |
+
/**
|
219 |
+
* @AfterScenario
|
220 |
+
*/
|
221 |
+
public function afterScenario( $event ) {
|
222 |
+
|
223 |
+
if ( self::$run_dir ) {
|
224 |
+
// remove altered WP install, unless there's an error
|
225 |
+
if ( $event->getResult() < 4 ) {
|
226 |
+
self::remove_dir( self::$run_dir );
|
227 |
+
}
|
228 |
+
self::$run_dir = null;
|
229 |
+
}
|
230 |
+
|
231 |
+
// Remove WP-CLI package directory if any. Set to `wp package path` by package-command and scaffold-package-command features, and by cli-info.feature.
|
232 |
+
if ( isset( $this->variables['PACKAGE_PATH'] ) ) {
|
233 |
+
self::remove_dir( $this->variables['PACKAGE_PATH'] );
|
234 |
+
}
|
235 |
+
|
236 |
+
// Remove SUITE_CACHE_DIR if any.
|
237 |
+
if ( self::$suite_cache_dir ) {
|
238 |
+
self::remove_dir( self::$suite_cache_dir );
|
239 |
+
self::$suite_cache_dir = null;
|
240 |
+
}
|
241 |
+
|
242 |
+
// Remove any background processes.
|
243 |
+
foreach ( $this->running_procs as $proc ) {
|
244 |
+
$status = proc_get_status( $proc );
|
245 |
+
self::terminate_proc( $status['pid'] );
|
246 |
+
}
|
247 |
+
|
248 |
+
if ( self::$log_run_times ) {
|
249 |
+
self::log_run_times_after_scenario( $event );
|
250 |
+
}
|
251 |
+
}
|
252 |
+
|
253 |
+
/**
|
254 |
+
* Terminate a process and any of its children.
|
255 |
+
*/
|
256 |
+
private static function terminate_proc( $master_pid ) {
|
257 |
+
|
258 |
+
$output = `ps -o ppid,pid,command | grep $master_pid`;
|
259 |
+
|
260 |
+
foreach ( explode( PHP_EOL, $output ) as $line ) {
|
261 |
+
if ( preg_match( '/^\s*(\d+)\s+(\d+)/', $line, $matches ) ) {
|
262 |
+
$parent = $matches[1];
|
263 |
+
$child = $matches[2];
|
264 |
+
|
265 |
+
if ( $parent == $master_pid ) {
|
266 |
+
self::terminate_proc( $child );
|
267 |
+
}
|
268 |
+
}
|
269 |
+
}
|
270 |
+
|
271 |
+
if ( ! posix_kill( (int) $master_pid, 9 ) ) {
|
272 |
+
$errno = posix_get_last_error();
|
273 |
+
// Ignore "No such process" error as that's what we want.
|
274 |
+
if ( 3 /*ESRCH*/ !== $errno ) {
|
275 |
+
throw new RuntimeException( posix_strerror( $errno ) );
|
276 |
+
}
|
277 |
+
}
|
278 |
+
}
|
279 |
+
|
280 |
+
/**
|
281 |
+
* Create a temporary WP_CLI_CACHE_DIR. Exposed as SUITE_CACHE_DIR in "Given an empty cache" step.
|
282 |
+
*/
|
283 |
+
public static function create_cache_dir() {
|
284 |
+
if ( self::$suite_cache_dir ) {
|
285 |
+
self::remove_dir( self::$suite_cache_dir );
|
286 |
+
}
|
287 |
+
self::$suite_cache_dir = sys_get_temp_dir() . '/' . uniqid( 'wp-cli-test-suite-cache-' . self::$temp_dir_infix . '-', TRUE );
|
288 |
+
mkdir( self::$suite_cache_dir );
|
289 |
+
return self::$suite_cache_dir;
|
290 |
+
}
|
291 |
+
|
292 |
+
/**
|
293 |
+
* Initializes context.
|
294 |
+
* Every scenario gets its own context object.
|
295 |
+
*
|
296 |
+
* @param array $parameters context parameters (set them up through behat.yml)
|
297 |
+
*/
|
298 |
+
public function __construct( array $parameters ) {
|
299 |
+
if ( getenv( 'WP_CLI_TEST_DBUSER' ) ) {
|
300 |
+
self::$db_settings['dbuser'] = getenv( 'WP_CLI_TEST_DBUSER' );
|
301 |
+
}
|
302 |
+
|
303 |
+
if ( false !== getenv( 'WP_CLI_TEST_DBPASS' ) ) {
|
304 |
+
self::$db_settings['dbpass'] = getenv( 'WP_CLI_TEST_DBPASS' );
|
305 |
+
}
|
306 |
+
|
307 |
+
if ( getenv( 'WP_CLI_TEST_DBHOST' ) ) {
|
308 |
+
self::$db_settings['dbhost'] = getenv( 'WP_CLI_TEST_DBHOST' );
|
309 |
+
}
|
310 |
+
|
311 |
+
$this->drop_db();
|
312 |
+
$this->set_cache_dir();
|
313 |
+
$this->variables['CORE_CONFIG_SETTINGS'] = Utils\assoc_args_to_str( self::$db_settings );
|
314 |
+
}
|
315 |
+
|
316 |
+
public function getStepDefinitionResources() {
|
317 |
+
return glob( __DIR__ . '/../steps/*.php' );
|
318 |
+
}
|
319 |
+
|
320 |
+
public function getHookDefinitionResources() {
|
321 |
+
return array();
|
322 |
+
}
|
323 |
+
|
324 |
+
/**
|
325 |
+
* Replace {VARIABLE_NAME}. Note that variable names can only contain uppercase letters and underscores (no numbers).
|
326 |
+
*/
|
327 |
+
public function replace_variables( $str ) {
|
328 |
+
$ret = preg_replace_callback( '/\{([A-Z_]+)\}/', array( $this, '_replace_var' ), $str );
|
329 |
+
if ( false !== strpos( $str, '{WP_VERSION-' ) ) {
|
330 |
+
$ret = $this->_replace_wp_versions( $ret );
|
331 |
+
}
|
332 |
+
return $ret;
|
333 |
+
}
|
334 |
+
|
335 |
+
/**
|
336 |
+
* Replace variables callback.
|
337 |
+
*/
|
338 |
+
private function _replace_var( $matches ) {
|
339 |
+
$cmd = $matches[0];
|
340 |
+
|
341 |
+
foreach ( array_slice( $matches, 1 ) as $key ) {
|
342 |
+
$cmd = str_replace( '{' . $key . '}', $this->variables[ $key ], $cmd );
|
343 |
+
}
|
344 |
+
|
345 |
+
return $cmd;
|
346 |
+
}
|
347 |
+
|
348 |
+
/**
|
349 |
+
* Substitute "{WP_VERSION-version-latest}" variables.
|
350 |
+
*/
|
351 |
+
private function _replace_wp_versions( $str ) {
|
352 |
+
static $wp_versions = null;
|
353 |
+
if ( null === $wp_versions ) {
|
354 |
+
$wp_versions = array();
|
355 |
+
|
356 |
+
$response = Requests::get( 'https://api.wordpress.org/core/version-check/1.7/', null, array( 'timeout' => 30 ) );
|
357 |
+
if ( 200 === $response->status_code && ( $body = json_decode( $response->body ) ) && is_object( $body ) && isset( $body->offers ) && is_array( $body->offers ) ) {
|
358 |
+
// Latest version alias.
|
359 |
+
$wp_versions["{WP_VERSION-latest}"] = count( $body->offers ) ? $body->offers[0]->version : '';
|
360 |
+
foreach ( $body->offers as $offer ) {
|
361 |
+
$sub_ver = preg_replace( '/(^[0-9]+\.[0-9]+)\.[0-9]+$/', '$1', $offer->version );
|
362 |
+
$sub_ver_key = "{WP_VERSION-{$sub_ver}-latest}";
|
363 |
+
|
364 |
+
$main_ver = preg_replace( '/(^[0-9]+)\.[0-9]+$/', '$1', $sub_ver );
|
365 |
+
$main_ver_key = "{WP_VERSION-{$main_ver}-latest}";
|
366 |
+
|
367 |
+
if ( ! isset( $wp_versions[ $main_ver_key ] ) ) {
|
368 |
+
$wp_versions[ $main_ver_key ] = $offer->version;
|
369 |
+
}
|
370 |
+
if ( ! isset( $wp_versions[ $sub_ver_key ] ) ) {
|
371 |
+
$wp_versions[ $sub_ver_key ] = $offer->version;
|
372 |
+
}
|
373 |
+
}
|
374 |
+
}
|
375 |
+
}
|
376 |
+
return strtr( $str, $wp_versions );
|
377 |
+
}
|
378 |
+
|
379 |
+
/**
|
380 |
+
* Get the file and line number for the current behat event.
|
381 |
+
*/
|
382 |
+
private static function get_event_file( $event, &$line ) {
|
383 |
+
if ( method_exists( $event, 'getScenario' ) ) {
|
384 |
+
$scenario_feature = $event->getScenario();
|
385 |
+
} elseif ( method_exists( $event, 'getFeature' ) ) {
|
386 |
+
$scenario_feature = $event->getFeature();
|
387 |
+
} elseif ( method_exists( $event, 'getOutline' ) ) {
|
388 |
+
$scenario_feature = $event->getOutline();
|
389 |
+
} else {
|
390 |
+
return null;
|
391 |
+
}
|
392 |
+
$line = $scenario_feature->getLine();
|
393 |
+
return $scenario_feature->getFile();
|
394 |
+
}
|
395 |
+
|
396 |
+
/**
|
397 |
+
* Create the RUN_DIR directory, unless already set for this scenario.
|
398 |
+
*/
|
399 |
+
public function create_run_dir() {
|
400 |
+
if ( !isset( $this->variables['RUN_DIR'] ) ) {
|
401 |
+
self::$run_dir = $this->variables['RUN_DIR'] = sys_get_temp_dir() . '/' . uniqid( 'wp-cli-test-run-' . self::$temp_dir_infix . '-', TRUE );
|
402 |
+
mkdir( $this->variables['RUN_DIR'] );
|
403 |
+
}
|
404 |
+
}
|
405 |
+
|
406 |
+
public function build_phar( $version = 'same' ) {
|
407 |
+
$this->variables['PHAR_PATH'] = $this->variables['RUN_DIR'] . '/' . uniqid( "wp-cli-build-", TRUE ) . '.phar';
|
408 |
+
|
409 |
+
// Test running against a package installed as a WP-CLI dependency
|
410 |
+
// WP-CLI installed as a project dependency
|
411 |
+
$make_phar_path = __DIR__ . '/../../../../../utils/make-phar.php';
|
412 |
+
if ( ! file_exists( $make_phar_path ) ) {
|
413 |
+
// Test running against WP-CLI proper
|
414 |
+
$make_phar_path = __DIR__ . '/../../utils/make-phar.php';
|
415 |
+
if ( ! file_exists( $make_phar_path ) ) {
|
416 |
+
// WP-CLI as a dependency of this project
|
417 |
+
$make_phar_path = __DIR__ . '/../../vendor/wp-cli/wp-cli/utils/make-phar.php';
|
418 |
+
}
|
419 |
+
}
|
420 |
+
|
421 |
+
$this->proc( Utils\esc_cmd(
|
422 |
+
'php -dphar.readonly=0 %1$s %2$s --version=%3$s && chmod +x %2$s',
|
423 |
+
$make_phar_path,
|
424 |
+
$this->variables['PHAR_PATH'],
|
425 |
+
$version
|
426 |
+
) )->run_check();
|
427 |
+
}
|
428 |
+
|
429 |
+
public function download_phar( $version = 'same' ) {
|
430 |
+
if ( 'same' === $version ) {
|
431 |
+
$version = WP_CLI_VERSION;
|
432 |
+
}
|
433 |
+
|
434 |
+
$download_url = sprintf(
|
435 |
+
'https://github.com/wp-cli/wp-cli/releases/download/v%1$s/wp-cli-%1$s.phar',
|
436 |
+
$version
|
437 |
+
);
|
438 |
+
|
439 |
+
$this->variables['PHAR_PATH'] = $this->variables['RUN_DIR'] . '/'
|
440 |
+
. uniqid( 'wp-cli-download-', true )
|
441 |
+
. '.phar';
|
442 |
+
|
443 |
+
Process::create( Utils\esc_cmd(
|
444 |
+
'curl -sSfL %1$s > %2$s && chmod +x %2$s',
|
445 |
+
$download_url,
|
446 |
+
$this->variables['PHAR_PATH']
|
447 |
+
) )->run_check();
|
448 |
+
}
|
449 |
+
|
450 |
+
/**
|
451 |
+
* CACHE_DIR is a cache for downloaded test data such as images. Lives until manually deleted.
|
452 |
+
*/
|
453 |
+
private function set_cache_dir() {
|
454 |
+
$path = sys_get_temp_dir() . '/wp-cli-test-cache';
|
455 |
+
if ( ! file_exists( $path ) ) {
|
456 |
+
mkdir( $path );
|
457 |
+
}
|
458 |
+
$this->variables['CACHE_DIR'] = $path;
|
459 |
+
}
|
460 |
+
|
461 |
+
/**
|
462 |
+
* Run a MySQL command with `$db_settings`.
|
463 |
+
*
|
464 |
+
* @param string $sql_cmd Command to run.
|
465 |
+
* @param array $assoc_args Optional. Associative array of options. Default empty.
|
466 |
+
* @param bool $add_database Optional. Whether to add dbname to the $sql_cmd. Default false.
|
467 |
+
*/
|
468 |
+
private static function run_sql( $sql_cmd, $assoc_args = array(), $add_database = false ) {
|
469 |
+
$default_assoc_args = array(
|
470 |
+
'host' => self::$db_settings['dbhost'],
|
471 |
+
'user' => self::$db_settings['dbuser'],
|
472 |
+
'pass' => self::$db_settings['dbpass'],
|
473 |
+
);
|
474 |
+
if ( $add_database ) {
|
475 |
+
$sql_cmd .= ' ' . escapeshellarg( self::$db_settings['dbname'] );
|
476 |
+
}
|
477 |
+
$start_time = microtime( true );
|
478 |
+
Utils\run_mysql_command( $sql_cmd, array_merge( $assoc_args, $default_assoc_args ) );
|
479 |
+
if ( self::$log_run_times ) {
|
480 |
+
self::log_proc_method_run_time( 'run_sql ' . $sql_cmd, $start_time );
|
481 |
+
}
|
482 |
+
}
|
483 |
+
|
484 |
+
public function create_db() {
|
485 |
+
$dbname = self::$db_settings['dbname'];
|
486 |
+
self::run_sql( 'mysql --no-defaults', array( 'execute' => "CREATE DATABASE IF NOT EXISTS $dbname" ) );
|
487 |
+
}
|
488 |
+
|
489 |
+
public function drop_db() {
|
490 |
+
$dbname = self::$db_settings['dbname'];
|
491 |
+
self::run_sql( 'mysql --no-defaults', array( 'execute' => "DROP DATABASE IF EXISTS $dbname" ) );
|
492 |
+
}
|
493 |
+
|
494 |
+
public function proc( $command, $assoc_args = array(), $path = '' ) {
|
495 |
+
if ( !empty( $assoc_args ) )
|
496 |
+
$command .= Utils\assoc_args_to_str( $assoc_args );
|
497 |
+
|
498 |
+
$env = self::get_process_env_variables();
|
499 |
+
if ( isset( $this->variables['SUITE_CACHE_DIR'] ) ) {
|
500 |
+
$env['WP_CLI_CACHE_DIR'] = $this->variables['SUITE_CACHE_DIR'];
|
501 |
+
}
|
502 |
+
|
503 |
+
if ( isset( $this->variables['RUN_DIR'] ) ) {
|
504 |
+
$cwd = "{$this->variables['RUN_DIR']}/{$path}";
|
505 |
+
} else {
|
506 |
+
$cwd = null;
|
507 |
+
}
|
508 |
+
|
509 |
+
return Process::create( $command, $cwd, $env );
|
510 |
+
}
|
511 |
+
|
512 |
+
/**
|
513 |
+
* Start a background process. Will automatically be closed when the tests finish.
|
514 |
+
*/
|
515 |
+
public function background_proc( $cmd ) {
|
516 |
+
$descriptors = array(
|
517 |
+
0 => STDIN,
|
518 |
+
1 => array( 'pipe', 'w' ),
|
519 |
+
2 => array( 'pipe', 'w' ),
|
520 |
+
);
|
521 |
+
|
522 |
+
$proc = proc_open( $cmd, $descriptors, $pipes, $this->variables['RUN_DIR'], self::get_process_env_variables() );
|
523 |
+
|
524 |
+
sleep(1);
|
525 |
+
|
526 |
+
$status = proc_get_status( $proc );
|
527 |
+
|
528 |
+
if ( !$status['running'] ) {
|
529 |
+
throw new RuntimeException( stream_get_contents( $pipes[2] ) );
|
530 |
+
} else {
|
531 |
+
$this->running_procs[] = $proc;
|
532 |
+
}
|
533 |
+
}
|
534 |
+
|
535 |
+
public function move_files( $src, $dest ) {
|
536 |
+
rename( $this->variables['RUN_DIR'] . "/$src", $this->variables['RUN_DIR'] . "/$dest" );
|
537 |
+
}
|
538 |
+
|
539 |
+
/**
|
540 |
+
* Remove a directory (recursive).
|
541 |
+
*/
|
542 |
+
public static function remove_dir( $dir ) {
|
543 |
+
Process::create( Utils\esc_cmd( 'rm -rf %s', $dir ) )->run_check();
|
544 |
+
}
|
545 |
+
|
546 |
+
/**
|
547 |
+
* Copy a directory (recursive). Destination directory must exist.
|
548 |
+
*/
|
549 |
+
public static function copy_dir( $src_dir, $dest_dir ) {
|
550 |
+
Process::create( Utils\esc_cmd( "cp -r %s/* %s", $src_dir, $dest_dir ) )->run_check();
|
551 |
+
}
|
552 |
+
|
553 |
+
public function add_line_to_wp_config( &$wp_config_code, $line ) {
|
554 |
+
$token = "/* That's all, stop editing!";
|
555 |
+
|
556 |
+
$wp_config_code = str_replace( $token, "$line\n\n$token", $wp_config_code );
|
557 |
+
}
|
558 |
+
|
559 |
+
public function download_wp( $subdir = '' ) {
|
560 |
+
$dest_dir = $this->variables['RUN_DIR'] . "/$subdir";
|
561 |
+
|
562 |
+
if ( $subdir ) {
|
563 |
+
mkdir( $dest_dir );
|
564 |
+
}
|
565 |
+
|
566 |
+
self::copy_dir( self::$cache_dir, $dest_dir );
|
567 |
+
|
568 |
+
// disable emailing
|
569 |
+
mkdir( $dest_dir . '/wp-content/mu-plugins' );
|
570 |
+
copy( __DIR__ . '/../extra/no-mail.php', $dest_dir . '/wp-content/mu-plugins/no-mail.php' );
|
571 |
+
}
|
572 |
+
|
573 |
+
public function create_config( $subdir = '', $extra_php = false ) {
|
574 |
+
$params = self::$db_settings;
|
575 |
+
|
576 |
+
// Replaces all characters that are not alphanumeric or an underscore into an underscore.
|
577 |
+
$params['dbprefix'] = $subdir ? preg_replace( '#[^a-zA-Z\_0-9]#', '_', $subdir ) : 'wp_';
|
578 |
+
|
579 |
+
$params['skip-salts'] = true;
|
580 |
+
|
581 |
+
if( false !== $extra_php ) {
|
582 |
+
$params['extra-php'] = $extra_php;
|
583 |
+
}
|
584 |
+
|
585 |
+
$config_cache_path = '';
|
586 |
+
if ( self::$install_cache_dir ) {
|
587 |
+
$config_cache_path = self::$install_cache_dir . '/config_' . md5( implode( ':', $params ) . ':subdir=' . $subdir );
|
588 |
+
$run_dir = '' !== $subdir ? ( $this->variables['RUN_DIR'] . "/$subdir" ) : $this->variables['RUN_DIR'];
|
589 |
+
}
|
590 |
+
|
591 |
+
if ( $config_cache_path && file_exists( $config_cache_path ) ) {
|
592 |
+
copy( $config_cache_path, $run_dir . '/wp-config.php' );
|
593 |
+
} else {
|
594 |
+
$this->proc( 'wp config create', $params, $subdir )->run_check();
|
595 |
+
if ( $config_cache_path && file_exists( $run_dir . '/wp-config.php' ) ) {
|
596 |
+
copy( $run_dir . '/wp-config.php', $config_cache_path );
|
597 |
+
}
|
598 |
+
}
|
599 |
+
}
|
600 |
+
|
601 |
+
public function install_wp( $subdir = '' ) {
|
602 |
+
$wp_version_suffix = ( $wp_version = getenv( 'WP_VERSION' ) ) ? "-$wp_version" : '';
|
603 |
+
self::$install_cache_dir = sys_get_temp_dir() . '/wp-cli-test-core-install-cache' . $wp_version_suffix;
|
604 |
+
if ( ! file_exists( self::$install_cache_dir ) ) {
|
605 |
+
mkdir( self::$install_cache_dir );
|
606 |
+
}
|
607 |
+
|
608 |
+
$subdir = $this->replace_variables( $subdir );
|
609 |
+
|
610 |
+
$this->create_db();
|
611 |
+
$this->create_run_dir();
|
612 |
+
$this->download_wp( $subdir );
|
613 |
+
$this->create_config( $subdir );
|
614 |
+
|
615 |
+
$install_args = array(
|
616 |
+
'url' => 'http://example.com',
|
617 |
+
'title' => 'WP CLI Site',
|
618 |
+
'admin_user' => 'admin',
|
619 |
+
'admin_email' => 'admin@example.com',
|
620 |
+
'admin_password' => 'password1'
|
621 |
+
);
|
622 |
+
|
623 |
+
$install_cache_path = '';
|
624 |
+
if ( self::$install_cache_dir ) {
|
625 |
+
$install_cache_path = self::$install_cache_dir . '/install_' . md5( implode( ':', $install_args ) . ':subdir=' . $subdir );
|
626 |
+
$run_dir = '' !== $subdir ? ( $this->variables['RUN_DIR'] . "/$subdir" ) : $this->variables['RUN_DIR'];
|
627 |
+
}
|
628 |
+
|
629 |
+
if ( $install_cache_path && file_exists( $install_cache_path ) ) {
|
630 |
+
self::copy_dir( $install_cache_path, $run_dir );
|
631 |
+
self::run_sql( 'mysql --no-defaults', array( 'execute' => "source {$install_cache_path}.sql" ), true /*add_database*/ );
|
632 |
+
} else {
|
633 |
+
$this->proc( 'wp core install', $install_args, $subdir )->run_check();
|
634 |
+
if ( $install_cache_path ) {
|
635 |
+
mkdir( $install_cache_path );
|
636 |
+
self::dir_diff_copy( $run_dir, self::$cache_dir, $install_cache_path );
|
637 |
+
self::run_sql( 'mysqldump --no-defaults', array( 'result-file' => "{$install_cache_path}.sql" ), true /*add_database*/ );
|
638 |
+
}
|
639 |
+
}
|
640 |
+
}
|
641 |
+
|
642 |
+
public function install_wp_with_composer( $vendor_directory = 'vendor' ) {
|
643 |
+
$this->create_run_dir();
|
644 |
+
$this->create_db();
|
645 |
+
|
646 |
+
$yml_path = $this->variables['RUN_DIR'] . "/wp-cli.yml";
|
647 |
+
file_put_contents( $yml_path, 'path: wordpress' );
|
648 |
+
|
649 |
+
$this->composer_command( 'init --name="wp-cli/composer-test" --type="project" --no-interaction' );
|
650 |
+
$this->composer_command( 'config vendor-dir ' . $vendor_directory );
|
651 |
+
$this->composer_command( 'require johnpbloch/wordpress --optimize-autoloader --no-interaction' );
|
652 |
+
|
653 |
+
$config_extra_php = "require_once dirname(__DIR__) . '/" . $vendor_directory . "/autoload.php';";
|
654 |
+
$this->create_config( 'wordpress', $config_extra_php );
|
655 |
+
|
656 |
+
$install_args = array(
|
657 |
+
'url' => 'http://localhost:8080',
|
658 |
+
'title' => 'WP CLI Site with both WordPress and wp-cli as Composer dependencies',
|
659 |
+
'admin_user' => 'admin',
|
660 |
+
'admin_email' => 'admin@example.com',
|
661 |
+
'admin_password' => 'password1'
|
662 |
+
);
|
663 |
+
|
664 |
+
$this->proc( 'wp core install', $install_args )->run_check();
|
665 |
+
}
|
666 |
+
|
667 |
+
public function composer_add_wp_cli_local_repository() {
|
668 |
+
if ( ! self::$composer_local_repository ) {
|
669 |
+
self::$composer_local_repository = sys_get_temp_dir() . '/' . uniqid( "wp-cli-composer-local-", TRUE );
|
670 |
+
mkdir( self::$composer_local_repository );
|
671 |
+
|
672 |
+
$env = self::get_process_env_variables();
|
673 |
+
$src = isset( $env['TRAVIS_BUILD_DIR'] ) ? $env['TRAVIS_BUILD_DIR'] : realpath( __DIR__ . '/../../' );
|
674 |
+
|
675 |
+
self::copy_dir( $src, self::$composer_local_repository . '/' );
|
676 |
+
self::remove_dir( self::$composer_local_repository . '/.git' );
|
677 |
+
self::remove_dir( self::$composer_local_repository . '/vendor' );
|
678 |
+
}
|
679 |
+
$dest = self::$composer_local_repository . '/';
|
680 |
+
$this->composer_command( "config repositories.wp-cli '{\"type\": \"path\", \"url\": \"$dest\", \"options\": {\"symlink\": false}}'" );
|
681 |
+
$this->variables['COMPOSER_LOCAL_REPOSITORY'] = self::$composer_local_repository;
|
682 |
+
}
|
683 |
+
|
684 |
+
public function composer_require_current_wp_cli() {
|
685 |
+
$this->composer_add_wp_cli_local_repository();
|
686 |
+
$this->composer_command( 'require wp-cli/wp-cli:dev-master --optimize-autoloader --no-interaction' );
|
687 |
+
}
|
688 |
+
|
689 |
+
public function get_php_binary() {
|
690 |
+
if ( getenv( 'WP_CLI_PHP_USED' ) )
|
691 |
+
return getenv( 'WP_CLI_PHP_USED' );
|
692 |
+
|
693 |
+
if ( getenv( 'WP_CLI_PHP' ) )
|
694 |
+
return getenv( 'WP_CLI_PHP' );
|
695 |
+
|
696 |
+
if ( defined( 'PHP_BINARY' ) )
|
697 |
+
return PHP_BINARY;
|
698 |
+
|
699 |
+
return 'php';
|
700 |
+
}
|
701 |
+
|
702 |
+
public function start_php_server() {
|
703 |
+
$cmd = Utils\esc_cmd( '%s -S %s -t %s -c %s %s',
|
704 |
+
$this->get_php_binary(),
|
705 |
+
'localhost:8080',
|
706 |
+
$this->variables['RUN_DIR'] . '/wordpress/',
|
707 |
+
get_cfg_var( 'cfg_file_path' ),
|
708 |
+
$this->variables['RUN_DIR'] . '/vendor/wp-cli/server-command/router.php'
|
709 |
+
);
|
710 |
+
$this->background_proc( $cmd );
|
711 |
+
}
|
712 |
+
|
713 |
+
private function composer_command($cmd) {
|
714 |
+
if ( !isset( $this->variables['COMPOSER_PATH'] ) ) {
|
715 |
+
$this->variables['COMPOSER_PATH'] = exec('which composer');
|
716 |
+
}
|
717 |
+
$this->proc( $this->variables['COMPOSER_PATH'] . ' ' . $cmd )->run_check();
|
718 |
+
}
|
719 |
+
|
720 |
+
/**
|
721 |
+
* Initialize run time logging.
|
722 |
+
*/
|
723 |
+
private static function log_run_times_before_suite( $event ) {
|
724 |
+
self::$suite_start_time = microtime( true );
|
725 |
+
|
726 |
+
Process::$log_run_times = true;
|
727 |
+
|
728 |
+
$travis = getenv( 'TRAVIS' );
|
729 |
+
|
730 |
+
// Default output settings.
|
731 |
+
self::$output_to = 'stdout';
|
732 |
+
self::$num_top_processes = $travis ? 10 : 40;
|
733 |
+
self::$num_top_scenarios = $travis ? 10 : 20;
|
734 |
+
|
735 |
+
// Allow setting of above with "WP_CLI_TEST_LOG_RUN_TIMES=<output_to>[,<num_top_processes>][,<num_top_scenarios>]" formatted env var.
|
736 |
+
if ( preg_match( '/^(stdout|error_log)?(,[0-9]+)?(,[0-9]+)?$/i', self::$log_run_times, $matches ) ) {
|
737 |
+
if ( isset( $matches[1] ) ) {
|
738 |
+
self::$output_to = strtolower( $matches[1] );
|
739 |
+
}
|
740 |
+
if ( isset( $matches[2] ) ) {
|
741 |
+
self::$num_top_processes = max( (int) substr( $matches[2], 1 ), 1 );
|
742 |
+
}
|
743 |
+
if ( isset( $matches[3] ) ) {
|
744 |
+
self::$num_top_scenarios = max( (int) substr( $matches[3], 1 ), 1 );
|
745 |
+
}
|
746 |
+
}
|
747 |
+
}
|
748 |
+
|
749 |
+
/**
|
750 |
+
* Record the start time of the scenario into the `$scenario_run_times` array.
|
751 |
+
*/
|
752 |
+
private static function log_run_times_before_scenario( $event ) {
|
753 |
+
if ( $scenario_key = self::get_scenario_key( $event ) ) {
|
754 |
+
self::$scenario_run_times[ $scenario_key ] = -microtime( true );
|
755 |
+
}
|
756 |
+
}
|
757 |
+
|
758 |
+
/**
|
759 |
+
* Save the run time of the scenario into the `$scenario_run_times` array. Only the top `self::$num_top_scenarios` are kept.
|
760 |
+
*/
|
761 |
+
private static function log_run_times_after_scenario( $event ) {
|
762 |
+
if ( $scenario_key = self::get_scenario_key( $event ) ) {
|
763 |
+
self::$scenario_run_times[ $scenario_key ] += microtime( true );
|
764 |
+
self::$scenario_count++;
|
765 |
+
if ( count( self::$scenario_run_times ) > self::$num_top_scenarios ) {
|
766 |
+
arsort( self::$scenario_run_times );
|
767 |
+
array_pop( self::$scenario_run_times );
|
768 |
+
}
|
769 |
+
}
|
770 |
+
}
|
771 |
+
|
772 |
+
/**
|
773 |
+
* Copy files in updated directory that are not in source directory to copy directory. ("Incremental backup".)
|
774 |
+
* Note: does not deal with changed files (ie does not compare file contents for changes), for speed reasons.
|
775 |
+
*
|
776 |
+
* @param string $upd_dir The directory to search looking for files/directories not in `$src_dir`.
|
777 |
+
* @param string $src_dir The directory to be compared to `$upd_dir`.
|
778 |
+
* @param string $cop_dir Where to copy any files/directories in `$upd_dir` but not in `$src_dir` to.
|
779 |
+
*/
|
780 |
+
private static function dir_diff_copy( $upd_dir, $src_dir, $cop_dir ) {
|
781 |
+
if ( false === ( $files = scandir( $upd_dir ) ) ) {
|
782 |
+
$error = error_get_last();
|
783 |
+
throw new \RuntimeException( sprintf( "Failed to open updated directory '%s': %s. " . __FILE__ . ':' . __LINE__, $upd_dir, $error['message'] ) );
|
784 |
+
}
|
785 |
+
foreach ( array_diff( $files, array( '.', '..' ) ) as $file ) {
|
786 |
+
$upd_file = $upd_dir . '/' . $file;
|
787 |
+
$src_file = $src_dir . '/' . $file;
|
788 |
+
$cop_file = $cop_dir . '/' . $file;
|
789 |
+
if ( ! file_exists( $src_file ) ) {
|
790 |
+
if ( is_dir( $upd_file ) ) {
|
791 |
+
if ( ! file_exists( $cop_file ) && ! mkdir( $cop_file, 0777, true /*recursive*/ ) ) {
|
792 |
+
$error = error_get_last();
|
793 |
+
throw new \RuntimeException( sprintf( "Failed to create copy directory '%s': %s. " . __FILE__ . ':' . __LINE__, $cop_file, $error['message'] ) );
|
794 |
+
}
|
795 |
+
self::copy_dir( $upd_file, $cop_file );
|
796 |
+
} else {
|
797 |
+
if ( ! copy( $upd_file, $cop_file ) ) {
|
798 |
+
$error = error_get_last();
|
799 |
+
throw new \RuntimeException( sprintf( "Failed to copy '%s' to '%s': %s. " . __FILE__ . ':' . __LINE__, $upd_file, $cop_file, $error['message'] ) );
|
800 |
+
}
|
801 |
+
}
|
802 |
+
} elseif ( is_dir( $upd_file ) ) {
|
803 |
+
self::dir_diff_copy( $upd_file, $src_file, $cop_file );
|
804 |
+
}
|
805 |
+
}
|
806 |
+
}
|
807 |
+
|
808 |
+
/**
|
809 |
+
* Get the scenario key used for `$scenario_run_times` array.
|
810 |
+
* Format "<grandparent-dir> <feature-file>:<line-number>", eg "core-command core-update.feature:221".
|
811 |
+
*/
|
812 |
+
private static function get_scenario_key( $event ) {
|
813 |
+
$scenario_key = '';
|
814 |
+
if ( $file = self::get_event_file( $event, $line ) ) {
|
815 |
+
$scenario_grandparent = Utils\basename( dirname( dirname( $file ) ) );
|
816 |
+
$scenario_key = $scenario_grandparent . ' ' . Utils\basename( $file ) . ':' . $line;
|
817 |
+
}
|
818 |
+
return $scenario_key;
|
819 |
+
}
|
820 |
+
|
821 |
+
/**
|
822 |
+
* Print out stats on the run times of processes and scenarios.
|
823 |
+
*/
|
824 |
+
private static function log_run_times_after_suite( $event ) {
|
825 |
+
|
826 |
+
$suite = '';
|
827 |
+
if ( self::$scenario_run_times ) {
|
828 |
+
// Grandparent directory is first part of key.
|
829 |
+
$keys = array_keys( self::$scenario_run_times );
|
830 |
+
$suite = substr( $keys[0], 0, strpos( $keys[0], ' ' ) );
|
831 |
+
}
|
832 |
+
|
833 |
+
$run_from = Utils\basename( dirname( dirname( __DIR__ ) ) );
|
834 |
+
|
835 |
+
// Format same as Behat, if have minutes.
|
836 |
+
$fmt = function ( $time ) {
|
837 |
+
$mins = floor( $time / 60 );
|
838 |
+
return round( $time, 3 ) . ( $mins ? ( ' (' . $mins . 'm' . round( $time - ( $mins * 60 ), 3 ) . 's)' ) : '' );
|
839 |
+
};
|
840 |
+
|
841 |
+
$time = microtime( true ) - self::$suite_start_time;
|
842 |
+
|
843 |
+
$log = PHP_EOL . str_repeat( '(', 80 ) . PHP_EOL;
|
844 |
+
|
845 |
+
// Process and proc method run times.
|
846 |
+
$run_times = array_merge( Process::$run_times, self::$proc_method_run_times );
|
847 |
+
|
848 |
+
list( $ptime, $calls ) = array_reduce( $run_times, function ( $carry, $item ) {
|
849 |
+
return array( $carry[0] + $item[0], $carry[1] + $item[1] );
|
850 |
+
}, array( 0, 0 ) );
|
851 |
+
|
852 |
+
$overhead = $time - $ptime;
|
853 |
+
$pct = round( ( $overhead / $time ) * 100 );
|
854 |
+
$unique = count( $run_times );
|
855 |
+
|
856 |
+
$log .= sprintf(
|
857 |
+
PHP_EOL . "Total process run time %s (tests %s, overhead %.3f %d%%), calls %d (%d unique) for '%s' run from '%s'" . PHP_EOL,
|
858 |
+
$fmt( $ptime ), $fmt( $time ), $overhead, $pct, $calls, $unique, $suite, $run_from
|
859 |
+
);
|
860 |
+
|
861 |
+
uasort( $run_times, function ( $a, $b ) {
|
862 |
+
return $a[0] === $b[0] ? 0 : ( $a[0] < $b[0] ? 1 : -1 ); // Reverse sort.
|
863 |
+
} );
|
864 |
+
|
865 |
+
$tops = array_slice( $run_times, 0, self::$num_top_processes, true );
|
866 |
+
|
867 |
+
$log .= PHP_EOL . "Top " . self::$num_top_processes . " process run times for '$suite'";
|
868 |
+
$log .= PHP_EOL . implode( PHP_EOL, array_map( function ( $k, $v, $i ) {
|
869 |
+
return sprintf( ' %3d. %7.3f %3d %s', $i + 1, round( $v[0], 3 ), $v[1], $k );
|
870 |
+
}, array_keys( $tops ), $tops, array_keys( array_keys( $tops ) ) ) ) . PHP_EOL;
|
871 |
+
|
872 |
+
// Scenario run times.
|
873 |
+
arsort( self::$scenario_run_times );
|
874 |
+
|
875 |
+
$tops = array_slice( self::$scenario_run_times, 0, self::$num_top_scenarios, true );
|
876 |
+
|
877 |
+
$log .= PHP_EOL . "Top " . self::$num_top_scenarios . " (of " . self::$scenario_count . ") scenario run times for '$suite'";
|
878 |
+
$log .= PHP_EOL . implode( PHP_EOL, array_map( function ( $k, $v, $i ) {
|
879 |
+
return sprintf( ' %3d. %7.3f %s', $i + 1, round( $v, 3 ), substr( $k, strpos( $k, ' ' ) + 1 ) );
|
880 |
+
}, array_keys( $tops ), $tops, array_keys( array_keys( $tops ) ) ) ) . PHP_EOL;
|
881 |
+
|
882 |
+
$log .= PHP_EOL . str_repeat( ')', 80 );
|
883 |
+
|
884 |
+
if ( 'error_log' === self::$output_to ) {
|
885 |
+
error_log( $log );
|
886 |
+
} else {
|
887 |
+
echo PHP_EOL . $log;
|
888 |
+
}
|
889 |
+
}
|
890 |
+
|
891 |
+
/**
|
892 |
+
* Log the run time of a proc method (one that doesn't use Process but does (use a function that does) a `proc_open()`).
|
893 |
+
*/
|
894 |
+
private static function log_proc_method_run_time( $key, $start_time ) {
|
895 |
+
$run_time = microtime( true ) - $start_time;
|
896 |
+
if ( ! isset( self::$proc_method_run_times[ $key ] ) ) {
|
897 |
+
self::$proc_method_run_times[ $key ] = array( 0, 0 );
|
898 |
+
}
|
899 |
+
self::$proc_method_run_times[ $key ][0] += $run_time;
|
900 |
+
self::$proc_method_run_times[ $key ][1]++;
|
901 |
+
}
|
902 |
+
|
903 |
+
}
|
cli/features/bootstrap/Process.php
ADDED
@@ -0,0 +1,116 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace WP_CLI;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Run a system process, and learn what happened.
|
7 |
+
*/
|
8 |
+
class Process {
|
9 |
+
/**
|
10 |
+
* @var string The full command to execute by the system.
|
11 |
+
*/
|
12 |
+
private $command;
|
13 |
+
|
14 |
+
/**
|
15 |
+
* @var string|null The path of the working directory for the process or NULL if not specified (defaults to current working directory).
|
16 |
+
*/
|
17 |
+
private $cwd;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* @var array Environment variables to set when running the command.
|
21 |
+
*/
|
22 |
+
private $env;
|
23 |
+
|
24 |
+
/**
|
25 |
+
* @var array Descriptor spec for `proc_open()`.
|
26 |
+
*/
|
27 |
+
private static $descriptors = array(
|
28 |
+
0 => STDIN,
|
29 |
+
1 => array( 'pipe', 'w' ),
|
30 |
+
2 => array( 'pipe', 'w' ),
|
31 |
+
);
|
32 |
+
|
33 |
+
/**
|
34 |
+
* @var bool Whether to log run time info or not.
|
35 |
+
*/
|
36 |
+
public static $log_run_times = false;
|
37 |
+
|
38 |
+
/**
|
39 |
+
* @var array Array of process run time info, keyed by process command, each a 2-element array containing run time and run count.
|
40 |
+
*/
|
41 |
+
public static $run_times = array();
|
42 |
+
|
43 |
+
/**
|
44 |
+
* @param string $command Command to execute.
|
45 |
+
* @param string $cwd Directory to execute the command in.
|
46 |
+
* @param array $env Environment variables to set when running the command.
|
47 |
+
*
|
48 |
+
* @return Process
|
49 |
+
*/
|
50 |
+
public static function create( $command, $cwd = null, $env = array() ) {
|
51 |
+
$proc = new self;
|
52 |
+
|
53 |
+
$proc->command = $command;
|
54 |
+
$proc->cwd = $cwd;
|
55 |
+
$proc->env = $env;
|
56 |
+
|
57 |
+
return $proc;
|
58 |
+
}
|
59 |
+
|
60 |
+
private function __construct() {}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* Run the command.
|
64 |
+
*
|
65 |
+
* @return ProcessRun
|
66 |
+
*/
|
67 |
+
public function run() {
|
68 |
+
$start_time = microtime( true );
|
69 |
+
|
70 |
+
$proc = proc_open( $this->command, self::$descriptors, $pipes, $this->cwd, $this->env );
|
71 |
+
|
72 |
+
$stdout = stream_get_contents( $pipes[1] );
|
73 |
+
fclose( $pipes[1] );
|
74 |
+
|
75 |
+
$stderr = stream_get_contents( $pipes[2] );
|
76 |
+
fclose( $pipes[2] );
|
77 |
+
|
78 |
+
$return_code = proc_close( $proc );
|
79 |
+
|
80 |
+
$run_time = microtime( true ) - $start_time;
|
81 |
+
|
82 |
+
if ( self::$log_run_times ) {
|
83 |
+
if ( ! isset( self::$run_times[ $this->command ] ) ) {
|
84 |
+
self::$run_times[ $this->command ] = array( 0, 0 );
|
85 |
+
}
|
86 |
+
self::$run_times[ $this->command ][0] += $run_time;
|
87 |
+
self::$run_times[ $this->command ][1]++;
|
88 |
+
}
|
89 |
+
|
90 |
+
return new ProcessRun( array(
|
91 |
+
'stdout' => $stdout,
|
92 |
+
'stderr' => $stderr,
|
93 |
+
'return_code' => $return_code,
|
94 |
+
'command' => $this->command,
|
95 |
+
'cwd' => $this->cwd,
|
96 |
+
'env' => $this->env,
|
97 |
+
'run_time' => $run_time,
|
98 |
+
) );
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* Run the command, but throw an Exception on error.
|
103 |
+
*
|
104 |
+
* @return ProcessRun
|
105 |
+
*/
|
106 |
+
public function run_check() {
|
107 |
+
$r = $this->run();
|
108 |
+
|
109 |
+
// $r->STDERR is incorrect, but kept incorrect for backwards-compat
|
110 |
+
if ( $r->return_code || !empty( $r->STDERR ) ) {
|
111 |
+
throw new \RuntimeException( $r );
|
112 |
+
}
|
113 |
+
|
114 |
+
return $r;
|
115 |
+
}
|
116 |
+
}
|
cli/features/bootstrap/ProcessRun.php
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace WP_CLI;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Results of an executed command.
|
7 |
+
*/
|
8 |
+
class ProcessRun {
|
9 |
+
/**
|
10 |
+
* @var string The full command executed by the system.
|
11 |
+
*/
|
12 |
+
public $command;
|
13 |
+
|
14 |
+
/**
|
15 |
+
* @var string Captured output from the process' STDOUT.
|
16 |
+
*/
|
17 |
+
public $stdout;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* @var string Captured output from the process' STDERR.
|
21 |
+
*/
|
22 |
+
public $stderr;
|
23 |
+
|
24 |
+
/**
|
25 |
+
* @var string|null The path of the working directory for the process or NULL if not specified (defaults to current working directory).
|
26 |
+
*/
|
27 |
+
public $cwd;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* @var array Environment variables set for this process.
|
31 |
+
*/
|
32 |
+
public $env;
|
33 |
+
|
34 |
+
/**
|
35 |
+
* @var int Exit code of the process.
|
36 |
+
*/
|
37 |
+
public $return_code;
|
38 |
+
|
39 |
+
/**
|
40 |
+
* @var float The run time of the process.
|
41 |
+
*/
|
42 |
+
public $run_time;
|
43 |
+
|
44 |
+
/**
|
45 |
+
* @var array $props Properties of executed command.
|
46 |
+
*/
|
47 |
+
public function __construct( $props ) {
|
48 |
+
foreach ( $props as $key => $value ) {
|
49 |
+
$this->$key = $value;
|
50 |
+
}
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Return properties of executed command as a string.
|
55 |
+
*
|
56 |
+
* @return string
|
57 |
+
*/
|
58 |
+
public function __toString() {
|
59 |
+
$out = "$ $this->command\n";
|
60 |
+
$out .= "$this->stdout\n$this->stderr";
|
61 |
+
$out .= "cwd: $this->cwd\n";
|
62 |
+
$out .= "run time: $this->run_time\n";
|
63 |
+
$out .= "exit status: $this->return_code";
|
64 |
+
|
65 |
+
return $out;
|
66 |
+
}
|
67 |
+
|
68 |
+
}
|
cli/features/bootstrap/support.php
ADDED
@@ -0,0 +1,194 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Utility functions used by Behat steps
|
4 |
+
|
5 |
+
function assertEquals( $expected, $actual ) {
|
6 |
+
if ( $expected != $actual ) {
|
7 |
+
throw new Exception( "Actual value: " . var_export( $actual, true ) );
|
8 |
+
}
|
9 |
+
}
|
10 |
+
|
11 |
+
function assertNotEquals( $expected, $actual ) {
|
12 |
+
if ( $expected == $actual ) {
|
13 |
+
throw new Exception( "Actual value: " . var_export( $actual, true ) );
|
14 |
+
}
|
15 |
+
}
|
16 |
+
|
17 |
+
function assertNumeric( $actual ) {
|
18 |
+
if ( !is_numeric( $actual ) ) {
|
19 |
+
throw new Exception( "Actual value: " . var_export( $actual, true ) );
|
20 |
+
}
|
21 |
+
}
|
22 |
+
|
23 |
+
function assertNotNumeric( $actual ) {
|
24 |
+
if ( is_numeric( $actual ) ) {
|
25 |
+
throw new Exception( "Actual value: " . var_export( $actual, true ) );
|
26 |
+
}
|
27 |
+
}
|
28 |
+
|
29 |
+
function checkString( $output, $expected, $action, $message = false ) {
|
30 |
+
switch ( $action ) {
|
31 |
+
|
32 |
+
case 'be':
|
33 |
+
$r = $expected === rtrim( $output, "\n" );
|
34 |
+
break;
|
35 |
+
|
36 |
+
case 'contain':
|
37 |
+
$r = false !== strpos( $output, $expected );
|
38 |
+
break;
|
39 |
+
|
40 |
+
case 'not contain':
|
41 |
+
$r = false === strpos( $output, $expected );
|
42 |
+
break;
|
43 |
+
|
44 |
+
default:
|
45 |
+
throw new Behat\Behat\Exception\PendingException();
|
46 |
+
}
|
47 |
+
|
48 |
+
if ( !$r ) {
|
49 |
+
if ( false === $message )
|
50 |
+
$message = $output;
|
51 |
+
throw new Exception( $message );
|
52 |
+
}
|
53 |
+
}
|
54 |
+
|
55 |
+
function compareTables( $expected_rows, $actual_rows, $output ) {
|
56 |
+
// the first row is the header and must be present
|
57 |
+
if ( $expected_rows[0] != $actual_rows[0] ) {
|
58 |
+
throw new \Exception( $output );
|
59 |
+
}
|
60 |
+
|
61 |
+
unset( $actual_rows[0] );
|
62 |
+
unset( $expected_rows[0] );
|
63 |
+
|
64 |
+
$missing_rows = array_diff( $expected_rows, $actual_rows );
|
65 |
+
if ( !empty( $missing_rows ) ) {
|
66 |
+
throw new \Exception( $output );
|
67 |
+
}
|
68 |
+
}
|
69 |
+
|
70 |
+
function compareContents( $expected, $actual ) {
|
71 |
+
if ( gettype( $expected ) != gettype( $actual ) ) {
|
72 |
+
return false;
|
73 |
+
}
|
74 |
+
|
75 |
+
if ( is_object( $expected ) ) {
|
76 |
+
foreach ( get_object_vars( $expected ) as $name => $value ) {
|
77 |
+
if ( ! compareContents( $value, $actual->$name ) )
|
78 |
+
return false;
|
79 |
+
}
|
80 |
+
} else if ( is_array( $expected ) ) {
|
81 |
+
foreach ( $expected as $key => $value ) {
|
82 |
+
if ( ! compareContents( $value, $actual[$key] ) )
|
83 |
+
return false;
|
84 |
+
}
|
85 |
+
} else {
|
86 |
+
return $expected === $actual;
|
87 |
+
}
|
88 |
+
|
89 |
+
return true;
|
90 |
+
}
|
91 |
+
|
92 |
+
/**
|
93 |
+
* Compare two strings containing JSON to ensure that @a $actualJson contains at
|
94 |
+
* least what the JSON string @a $expectedJson contains.
|
95 |
+
*
|
96 |
+
* @return whether or not @a $actualJson contains @a $expectedJson
|
97 |
+
* @retval true @a $actualJson contains @a $expectedJson
|
98 |
+
* @retval false @a $actualJson does not contain @a $expectedJson
|
99 |
+
*
|
100 |
+
* @param[in] $actualJson the JSON string to be tested
|
101 |
+
* @param[in] $expectedJson the expected JSON string
|
102 |
+
*
|
103 |
+
* Examples:
|
104 |
+
* expected: {'a':1,'array':[1,3,5]}
|
105 |
+
*
|
106 |
+
* 1 )
|
107 |
+
* actual: {'a':1,'b':2,'c':3,'array':[1,2,3,4,5]}
|
108 |
+
* return: true
|
109 |
+
*
|
110 |
+
* 2 )
|
111 |
+
* actual: {'b':2,'c':3,'array':[1,2,3,4,5]}
|
112 |
+
* return: false
|
113 |
+
* element 'a' is missing from the root object
|
114 |
+
*
|
115 |
+
* 3 )
|
116 |
+
* actual: {'a':0,'b':2,'c':3,'array':[1,2,3,4,5]}
|
117 |
+
* return: false
|
118 |
+
* the value of element 'a' is not 1
|
119 |
+
*
|
120 |
+
* 4 )
|
121 |
+
* actual: {'a':1,'b':2,'c':3,'array':[1,2,4,5]}
|
122 |
+
* return: false
|
123 |
+
* the contents of 'array' does not include 3
|
124 |
+
*/
|
125 |
+
function checkThatJsonStringContainsJsonString( $actualJson, $expectedJson ) {
|
126 |
+
$actualValue = json_decode( $actualJson );
|
127 |
+
$expectedValue = json_decode( $expectedJson );
|
128 |
+
|
129 |
+
if ( !$actualValue ) {
|
130 |
+
return false;
|
131 |
+
}
|
132 |
+
|
133 |
+
return compareContents( $expectedValue, $actualValue );
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* Compare two strings to confirm $actualCSV contains $expectedCSV
|
138 |
+
* Both strings are expected to have headers for their CSVs.
|
139 |
+
* $actualCSV must match all data rows in $expectedCSV
|
140 |
+
*
|
141 |
+
* @param string A CSV string
|
142 |
+
* @param array A nested array of values
|
143 |
+
* @return bool Whether $actualCSV contains $expectedCSV
|
144 |
+
*/
|
145 |
+
function checkThatCsvStringContainsValues( $actualCSV, $expectedCSV ) {
|
146 |
+
$actualCSV = array_map( 'str_getcsv', explode( PHP_EOL, $actualCSV ) );
|
147 |
+
|
148 |
+
if ( empty( $actualCSV ) )
|
149 |
+
return false;
|
150 |
+
|
151 |
+
// Each sample must have headers
|
152 |
+
$actualHeaders = array_values( array_shift( $actualCSV ) );
|
153 |
+
$expectedHeaders = array_values( array_shift( $expectedCSV ) );
|
154 |
+
|
155 |
+
// Each expectedCSV must exist somewhere in actualCSV in the proper column
|
156 |
+
$expectedResult = 0;
|
157 |
+
foreach ( $expectedCSV as $expected_row ) {
|
158 |
+
$expected_row = array_combine( $expectedHeaders, $expected_row );
|
159 |
+
foreach ( $actualCSV as $actual_row ) {
|
160 |
+
|
161 |
+
if ( count( $actualHeaders ) != count( $actual_row ) )
|
162 |
+
continue;
|
163 |
+
|
164 |
+
$actual_row = array_intersect_key( array_combine( $actualHeaders, $actual_row ), $expected_row );
|
165 |
+
if ( $actual_row == $expected_row )
|
166 |
+
$expectedResult++;
|
167 |
+
}
|
168 |
+
}
|
169 |
+
|
170 |
+
return $expectedResult >= count( $expectedCSV );
|
171 |
+
}
|
172 |
+
|
173 |
+
/**
|
174 |
+
* Compare two strings containing YAML to ensure that @a $actualYaml contains at
|
175 |
+
* least what the YAML string @a $expectedYaml contains.
|
176 |
+
*
|
177 |
+
* @return whether or not @a $actualYaml contains @a $expectedJson
|
178 |
+
* @retval true @a $actualYaml contains @a $expectedJson
|
179 |
+
* @retval false @a $actualYaml does not contain @a $expectedJson
|
180 |
+
*
|
181 |
+
* @param[in] $actualYaml the YAML string to be tested
|
182 |
+
* @param[in] $expectedYaml the expected YAML string
|
183 |
+
*/
|
184 |
+
function checkThatYamlStringContainsYamlString( $actualYaml, $expectedYaml ) {
|
185 |
+
$actualValue = Mustangostang\Spyc::YAMLLoad( $actualYaml );
|
186 |
+
$expectedValue = Mustangostang\Spyc::YAMLLoad( $expectedYaml );
|
187 |
+
|
188 |
+
if ( !$actualValue ) {
|
189 |
+
return false;
|
190 |
+
}
|
191 |
+
|
192 |
+
return compareContents( $expectedValue, $actualValue );
|
193 |
+
}
|
194 |
+
|
cli/features/bootstrap/utils.php
ADDED
@@ -0,0 +1,1194 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// Utilities that do NOT depend on WordPress code.
|
4 |
+
|
5 |
+
namespace WP_CLI\Utils;
|
6 |
+
|
7 |
+
use \Composer\Semver\Comparator;
|
8 |
+
use \Composer\Semver\Semver;
|
9 |
+
use \WP_CLI;
|
10 |
+
use \WP_CLI\Dispatcher;
|
11 |
+
use \WP_CLI\Iterators\Transform;
|
12 |
+
|
13 |
+
const PHAR_STREAM_PREFIX = 'phar://';
|
14 |
+
|
15 |
+
function inside_phar() {
|
16 |
+
return 0 === strpos( WP_CLI_ROOT, PHAR_STREAM_PREFIX );
|
17 |
+
}
|
18 |
+
|
19 |
+
// Files that need to be read by external programs have to be extracted from the Phar archive.
|
20 |
+
function extract_from_phar( $path ) {
|
21 |
+
if ( ! inside_phar() ) {
|
22 |
+
return $path;
|
23 |
+
}
|
24 |
+
|
25 |
+
$fname = basename( $path );
|
26 |
+
|
27 |
+
$tmp_path = get_temp_dir() . "wp-cli-$fname";
|
28 |
+
|
29 |
+
copy( $path, $tmp_path );
|
30 |
+
|
31 |
+
register_shutdown_function( function() use ( $tmp_path ) {
|
32 |
+
@unlink( $tmp_path );
|
33 |
+
} );
|
34 |
+
|
35 |
+
return $tmp_path;
|
36 |
+
}
|
37 |
+
|
38 |
+
function load_dependencies() {
|
39 |
+
if ( inside_phar() ) {
|
40 |
+
if ( file_exists( WP_CLI_ROOT . '/vendor/autoload.php' ) ) {
|
41 |
+
require WP_CLI_ROOT . '/vendor/autoload.php';
|
42 |
+
} elseif ( file_exists( dirname( dirname( WP_CLI_ROOT ) ) . '/autoload.php' ) ) {
|
43 |
+
require dirname( dirname( WP_CLI_ROOT ) ) . '/autoload.php';
|
44 |
+
}
|
45 |
+
return;
|
46 |
+
}
|
47 |
+
|
48 |
+
$has_autoload = false;
|
49 |
+
|
50 |
+
foreach ( get_vendor_paths() as $vendor_path ) {
|
51 |
+
if ( file_exists( $vendor_path . '/autoload.php' ) ) {
|
52 |
+
require $vendor_path . '/autoload.php';
|
53 |
+
$has_autoload = true;
|
54 |
+
break;
|
55 |
+
}
|
56 |
+
}
|
57 |
+
|
58 |
+
if ( !$has_autoload ) {
|
59 |
+
fputs( STDERR, "Internal error: Can't find Composer autoloader.\nTry running: composer install\n" );
|
60 |
+
exit(3);
|
61 |
+
}
|
62 |
+
}
|
63 |
+
|
64 |
+
function get_vendor_paths() {
|
65 |
+
$vendor_paths = array(
|
66 |
+
WP_CLI_ROOT . '/../../../vendor', // part of a larger project / installed via Composer (preferred)
|
67 |
+
WP_CLI_ROOT . '/vendor', // top-level project / installed as Git clone
|
68 |
+
);
|
69 |
+
$maybe_composer_json = WP_CLI_ROOT . '/../../../composer.json';
|
70 |
+
if ( file_exists( $maybe_composer_json ) && is_readable( $maybe_composer_json ) ) {
|
71 |
+
$composer = json_decode( file_get_contents( $maybe_composer_json ) );
|
72 |
+
if ( ! empty( $composer->config ) && ! empty( $composer->config->{'vendor-dir'} ) ) {
|
73 |
+
array_unshift( $vendor_paths, WP_CLI_ROOT . '/../../../' . $composer->config->{'vendor-dir'} );
|
74 |
+
}
|
75 |
+
}
|
76 |
+
return $vendor_paths;
|
77 |
+
}
|
78 |
+
|
79 |
+
// Using require() directly inside a class grants access to private methods to the loaded code
|
80 |
+
function load_file( $path ) {
|
81 |
+
require_once $path;
|
82 |
+
}
|
83 |
+
|
84 |
+
function load_command( $name ) {
|
85 |
+
$path = WP_CLI_ROOT . "/php/commands/$name.php";
|
86 |
+
|
87 |
+
if ( is_readable( $path ) ) {
|
88 |
+
include_once $path;
|
89 |
+
}
|
90 |
+
}
|
91 |
+
|
92 |
+
/**
|
93 |
+
* Like array_map(), except it returns a new iterator, instead of a modified array.
|
94 |
+
*
|
95 |
+
* Example:
|
96 |
+
*
|
97 |
+
* $arr = array('Football', 'Socker');
|
98 |
+
*
|
99 |
+
* $it = iterator_map($arr, 'strtolower', function($val) {
|
100 |
+
* return str_replace('foo', 'bar', $val);
|
101 |
+
* });
|
102 |
+
*
|
103 |
+
* foreach ( $it as $val ) {
|
104 |
+
* var_dump($val);
|
105 |
+
* }
|
106 |
+
*
|
107 |
+
* @param array|object Either a plain array or another iterator
|
108 |
+
* @param callback The function to apply to an element
|
109 |
+
* @return object An iterator that applies the given callback(s)
|
110 |
+
*/
|
111 |
+
function iterator_map( $it, $fn ) {
|
112 |
+
if ( is_array( $it ) ) {
|
113 |
+
$it = new \ArrayIterator( $it );
|
114 |
+
}
|
115 |
+
|
116 |
+
if ( !method_exists( $it, 'add_transform' ) ) {
|
117 |
+
$it = new Transform( $it );
|
118 |
+
}
|
119 |
+
|
120 |
+
foreach ( array_slice( func_get_args(), 1 ) as $fn ) {
|
121 |
+
$it->add_transform( $fn );
|
122 |
+
}
|
123 |
+
|
124 |
+
return $it;
|
125 |
+
}
|
126 |
+
|
127 |
+
/**
|
128 |
+
* Search for file by walking up the directory tree until the first file is found or until $stop_check($dir) returns true
|
129 |
+
* @param string|array The files (or file) to search for
|
130 |
+
* @param string|null The directory to start searching from; defaults to CWD
|
131 |
+
* @param callable Function which is passed the current dir each time a directory level is traversed
|
132 |
+
* @return null|string Null if the file was not found
|
133 |
+
*/
|
134 |
+
function find_file_upward( $files, $dir = null, $stop_check = null ) {
|
135 |
+
$files = (array) $files;
|
136 |
+
if ( is_null( $dir ) ) {
|
137 |
+
$dir = getcwd();
|
138 |
+
}
|
139 |
+
while ( @is_readable( $dir ) ) {
|
140 |
+
// Stop walking up when the supplied callable returns true being passed the $dir
|
141 |
+
if ( is_callable( $stop_check ) && call_user_func( $stop_check, $dir ) ) {
|
142 |
+
return null;
|
143 |
+
}
|
144 |
+
|
145 |
+
foreach ( $files as $file ) {
|
146 |
+
$path = $dir . DIRECTORY_SEPARATOR . $file;
|
147 |
+
if ( file_exists( $path ) ) {
|
148 |
+
return $path;
|
149 |
+
}
|
150 |
+
}
|
151 |
+
|
152 |
+
$parent_dir = dirname( $dir );
|
153 |
+
if ( empty($parent_dir) || $parent_dir === $dir ) {
|
154 |
+
break;
|
155 |
+
}
|
156 |
+
$dir = $parent_dir;
|
157 |
+
}
|
158 |
+
return null;
|
159 |
+
}
|
160 |
+
|
161 |
+
function is_path_absolute( $path ) {
|
162 |
+
// Windows
|
163 |
+
if ( isset($path[1]) && ':' === $path[1] )
|
164 |
+
return true;
|
165 |
+
|
166 |
+
return $path[0] === '/';
|
167 |
+
}
|
168 |
+
|
169 |
+
/**
|
170 |
+
* Composes positional arguments into a command string.
|
171 |
+
*
|
172 |
+
* @param array
|
173 |
+
* @return string
|
174 |
+
*/
|
175 |
+
function args_to_str( $args ) {
|
176 |
+
return ' ' . implode( ' ', array_map( 'escapeshellarg', $args ) );
|
177 |
+
}
|
178 |
+
|
179 |
+
/**
|
180 |
+
* Composes associative arguments into a command string.
|
181 |
+
*
|
182 |
+
* @param array
|
183 |
+
* @return string
|
184 |
+
*/
|
185 |
+
function assoc_args_to_str( $assoc_args ) {
|
186 |
+
$str = '';
|
187 |
+
|
188 |
+
foreach ( $assoc_args as $key => $value ) {
|
189 |
+
if ( true === $value ) {
|
190 |
+
$str .= " --$key";
|
191 |
+
} elseif( is_array( $value ) ) {
|
192 |
+
foreach( $value as $_ => $v ) {
|
193 |
+
$str .= assoc_args_to_str( array( $key => $v ) );
|
194 |
+
}
|
195 |
+
} else {
|
196 |
+
$str .= " --$key=" . escapeshellarg( $value );
|
197 |
+
}
|
198 |
+
}
|
199 |
+
|
200 |
+
return $str;
|
201 |
+
}
|
202 |
+
|
203 |
+
/**
|
204 |
+
* Given a template string and an arbitrary number of arguments,
|
205 |
+
* returns the final command, with the parameters escaped.
|
206 |
+
*/
|
207 |
+
function esc_cmd( $cmd ) {
|
208 |
+
if ( func_num_args() < 2 )
|
209 |
+
trigger_error( 'esc_cmd() requires at least two arguments.', E_USER_WARNING );
|
210 |
+
|
211 |
+
$args = func_get_args();
|
212 |
+
|
213 |
+
$cmd = array_shift( $args );
|
214 |
+
|
215 |
+
return vsprintf( $cmd, array_map( 'escapeshellarg', $args ) );
|
216 |
+
}
|
217 |
+
|
218 |
+
function locate_wp_config() {
|
219 |
+
static $path;
|
220 |
+
|
221 |
+
if ( null === $path ) {
|
222 |
+
if ( file_exists( ABSPATH . 'wp-config.php' ) )
|
223 |
+
$path = ABSPATH . 'wp-config.php';
|
224 |
+
elseif ( file_exists( ABSPATH . '../wp-config.php' ) && ! file_exists( ABSPATH . '/../wp-settings.php' ) )
|
225 |
+
$path = ABSPATH . '../wp-config.php';
|
226 |
+
else
|
227 |
+
$path = false;
|
228 |
+
|
229 |
+
if ( $path )
|
230 |
+
$path = realpath( $path );
|
231 |
+
}
|
232 |
+
|
233 |
+
return $path;
|
234 |
+
}
|
235 |
+
|
236 |
+
function wp_version_compare( $since, $operator ) {
|
237 |
+
return version_compare( str_replace( array( '-src' ), '', $GLOBALS['wp_version'] ), $since, $operator );
|
238 |
+
}
|
239 |
+
|
240 |
+
/**
|
241 |
+
* Render a collection of items as an ASCII table, JSON, CSV, YAML, list of ids, or count.
|
242 |
+
*
|
243 |
+
* Given a collection of items with a consistent data structure:
|
244 |
+
*
|
245 |
+
* ```
|
246 |
+
* $items = array(
|
247 |
+
* array(
|
248 |
+
* 'key' => 'foo',
|
249 |
+
* 'value' => 'bar',
|
250 |
+
* )
|
251 |
+
* );
|
252 |
+
* ```
|
253 |
+
*
|
254 |
+
* Render `$items` as an ASCII table:
|
255 |
+
*
|
256 |
+
* ```
|
257 |
+
* WP_CLI\Utils\format_items( 'table', $items, array( 'key', 'value' ) );
|
258 |
+
*
|
259 |
+
* # +-----+-------+
|
260 |
+
* # | key | value |
|
261 |
+
* # +-----+-------+
|
262 |
+
* # | foo | bar |
|
263 |
+
* # +-----+-------+
|
264 |
+
* ```
|
265 |
+
*
|
266 |
+
* Or render `$items` as YAML:
|
267 |
+
*
|
268 |
+
* ```
|
269 |
+
* WP_CLI\Utils\format_items( 'yaml', $items, array( 'key', 'value' ) );
|
270 |
+
*
|
271 |
+
* # ---
|
272 |
+
* # -
|
273 |
+
* # key: foo
|
274 |
+
* # value: bar
|
275 |
+
* ```
|
276 |
+
*
|
277 |
+
* @access public
|
278 |
+
* @category Output
|
279 |
+
*
|
280 |
+
* @param string $format Format to use: 'table', 'json', 'csv', 'yaml', 'ids', 'count'
|
281 |
+
* @param array $items An array of items to output.
|
282 |
+
* @param array|string $fields Named fields for each item of data. Can be array or comma-separated list.
|
283 |
+
* @return null
|
284 |
+
*/
|
285 |
+
function format_items( $format, $items, $fields ) {
|
286 |
+
$assoc_args = compact( 'format', 'fields' );
|
287 |
+
$formatter = new \WP_CLI\Formatter( $assoc_args );
|
288 |
+
$formatter->display_items( $items );
|
289 |
+
}
|
290 |
+
|
291 |
+
/**
|
292 |
+
* Write data as CSV to a given file.
|
293 |
+
*
|
294 |
+
* @access public
|
295 |
+
*
|
296 |
+
* @param resource $fd File descriptor
|
297 |
+
* @param array $rows Array of rows to output
|
298 |
+
* @param array $headers List of CSV columns (optional)
|
299 |
+
*/
|
300 |
+
function write_csv( $fd, $rows, $headers = array() ) {
|
301 |
+
if ( ! empty( $headers ) ) {
|
302 |
+
fputcsv( $fd, $headers );
|
303 |
+
}
|
304 |
+
|
305 |
+
foreach ( $rows as $row ) {
|
306 |
+
if ( ! empty( $headers ) ) {
|
307 |
+
$row = pick_fields( $row, $headers );
|
308 |
+
}
|
309 |
+
|
310 |
+
fputcsv( $fd, array_values( $row ) );
|
311 |
+
}
|
312 |
+
}
|
313 |
+
|
314 |
+
/**
|
315 |
+
* Pick fields from an associative array or object.
|
316 |
+
*
|
317 |
+
* @param array|object Associative array or object to pick fields from
|
318 |
+
* @param array List of fields to pick
|
319 |
+
* @return array
|
320 |
+
*/
|
321 |
+
function pick_fields( $item, $fields ) {
|
322 |
+
$item = (object) $item;
|
323 |
+
|
324 |
+
$values = array();
|
325 |
+
|
326 |
+
foreach ( $fields as $field ) {
|
327 |
+
$values[ $field ] = isset( $item->$field ) ? $item->$field : null;
|
328 |
+
}
|
329 |
+
|
330 |
+
return $values;
|
331 |
+
}
|
332 |
+
|
333 |
+
/**
|
334 |
+
* Launch system's $EDITOR for the user to edit some text.
|
335 |
+
*
|
336 |
+
* @access public
|
337 |
+
* @category Input
|
338 |
+
*
|
339 |
+
* @param string $content Some form of text to edit (e.g. post content)
|
340 |
+
* @return string|bool Edited text, if file is saved from editor; false, if no change to file.
|
341 |
+
*/
|
342 |
+
function launch_editor_for_input( $input, $filename = 'WP-CLI' ) {
|
343 |
+
|
344 |
+
check_proc_available( 'launch_editor_for_input' );
|
345 |
+
|
346 |
+
$tmpdir = get_temp_dir();
|
347 |
+
|
348 |
+
do {
|
349 |
+
$tmpfile = basename( $filename );
|
350 |
+
$tmpfile = preg_replace( '|\.[^.]*$|', '', $tmpfile );
|
351 |
+
$tmpfile .= '-' . substr( md5( rand() ), 0, 6 );
|
352 |
+
$tmpfile = $tmpdir . $tmpfile . '.tmp';
|
353 |
+
$fp = @fopen( $tmpfile, 'x' );
|
354 |
+
if ( ! $fp && is_writable( $tmpdir ) && file_exists( $tmpfile ) ) {
|
355 |
+
$tmpfile = '';
|
356 |
+
continue;
|
357 |
+
}
|
358 |
+
if ( $fp ) {
|
359 |
+
fclose( $fp );
|
360 |
+
}
|
361 |
+
} while( ! $tmpfile );
|
362 |
+
|
363 |
+
if ( ! $tmpfile ) {
|
364 |
+
\WP_CLI::error( 'Error creating temporary file.' );
|
365 |
+
}
|
366 |
+
|
367 |
+
$output = '';
|
368 |
+
file_put_contents( $tmpfile, $input );
|
369 |
+
|
370 |
+
$editor = getenv( 'EDITOR' );
|
371 |
+
if ( !$editor ) {
|
372 |
+
if ( isset( $_SERVER['OS'] ) && false !== strpos( $_SERVER['OS'], 'indows' ) )
|
373 |
+
$editor = 'notepad';
|
374 |
+
else
|
375 |
+
$editor = 'vi';
|
376 |
+
}
|
377 |
+
|
378 |
+
$descriptorspec = array( STDIN, STDOUT, STDERR );
|
379 |
+
$process = proc_open( "$editor " . escapeshellarg( $tmpfile ), $descriptorspec, $pipes );
|
380 |
+
$r = proc_close( $process );
|
381 |
+
if ( $r ) {
|
382 |
+
exit( $r );
|
383 |
+
}
|
384 |
+
|
385 |
+
$output = file_get_contents( $tmpfile );
|
386 |
+
|
387 |
+
unlink( $tmpfile );
|
388 |
+
|
389 |
+
if ( $output === $input )
|
390 |
+
return false;
|
391 |
+
|
392 |
+
return $output;
|
393 |
+
}
|
394 |
+
|
395 |
+
/**
|
396 |
+
* @param string MySQL host string, as defined in wp-config.php
|
397 |
+
* @return array
|
398 |
+
*/
|
399 |
+
function mysql_host_to_cli_args( $raw_host ) {
|
400 |
+
$assoc_args = array();
|
401 |
+
|
402 |
+
$host_parts = explode( ':', $raw_host );
|
403 |
+
if ( count( $host_parts ) == 2 ) {
|
404 |
+
list( $assoc_args['host'], $extra ) = $host_parts;
|
405 |
+
$extra = trim( $extra );
|
406 |
+
if ( is_numeric( $extra ) ) {
|
407 |
+
$assoc_args['port'] = intval( $extra );
|
408 |
+
$assoc_args['protocol'] = 'tcp';
|
409 |
+
} else if ( $extra !== '' ) {
|
410 |
+
$assoc_args['socket'] = $extra;
|
411 |
+
}
|
412 |
+
} else {
|
413 |
+
$assoc_args['host'] = $raw_host;
|
414 |
+
}
|
415 |
+
|
416 |
+
return $assoc_args;
|
417 |
+
}
|
418 |
+
|
419 |
+
function run_mysql_command( $cmd, $assoc_args, $descriptors = null ) {
|
420 |
+
check_proc_available( 'run_mysql_command' );
|
421 |
+
|
422 |
+
if ( !$descriptors )
|
423 |
+
$descriptors = array( STDIN, STDOUT, STDERR );
|
424 |
+
|
425 |
+
if ( isset( $assoc_args['host'] ) ) {
|
426 |
+
$assoc_args = array_merge( $assoc_args, mysql_host_to_cli_args( $assoc_args['host'] ) );
|
427 |
+
}
|
428 |
+
|
429 |
+
$pass = $assoc_args['pass'];
|
430 |
+
unset( $assoc_args['pass'] );
|
431 |
+
|
432 |
+
$old_pass = getenv( 'MYSQL_PWD' );
|
433 |
+
putenv( 'MYSQL_PWD=' . $pass );
|
434 |
+
|
435 |
+
$final_cmd = force_env_on_nix_systems( $cmd ) . assoc_args_to_str( $assoc_args );
|
436 |
+
|
437 |
+
$proc = proc_open( $final_cmd, $descriptors, $pipes );
|
438 |
+
if ( !$proc )
|
439 |
+
exit(1);
|
440 |
+
|
441 |
+
$r = proc_close( $proc );
|
442 |
+
|
443 |
+
putenv( 'MYSQL_PWD=' . $old_pass );
|
444 |
+
|
445 |
+
if ( $r ) exit( $r );
|
446 |
+
}
|
447 |
+
|
448 |
+
/**
|
449 |
+
* Render PHP or other types of files using Mustache templates.
|
450 |
+
*
|
451 |
+
* IMPORTANT: Automatic HTML escaping is disabled!
|
452 |
+
*/
|
453 |
+
function mustache_render( $template_name, $data = array() ) {
|
454 |
+
if ( ! file_exists( $template_name ) )
|
455 |
+
$template_name = WP_CLI_ROOT . "/templates/$template_name";
|
456 |
+
|
457 |
+
$template = file_get_contents( $template_name );
|
458 |
+
|
459 |
+
$m = new \Mustache_Engine( array(
|
460 |
+
'escape' => function ( $val ) { return $val; },
|
461 |
+
) );
|
462 |
+
|
463 |
+
return $m->render( $template, $data );
|
464 |
+
}
|
465 |
+
|
466 |
+
/**
|
467 |
+
* Create a progress bar to display percent completion of a given operation.
|
468 |
+
*
|
469 |
+
* Progress bar is written to STDOUT, and disabled when command is piped. Progress
|
470 |
+
* advances with `$progress->tick()`, and completes with `$progress->finish()`.
|
471 |
+
* Process bar also indicates elapsed time and expected total time.
|
472 |
+
*
|
473 |
+
* ```
|
474 |
+
* # `wp user generate` ticks progress bar each time a new user is created.
|
475 |
+
* #
|
476 |
+
* # $ wp user generate --count=500
|
477 |
+
* # Generating users 22 % [=======> ] 0:05 / 0:23
|
478 |
+
*
|
479 |
+
* $progress = \WP_CLI\Utils\make_progress_bar( 'Generating users', $count );
|
480 |
+
* for ( $i = 0; $i < $count; $i++ ) {
|
481 |
+
* // uses wp_insert_user() to insert the user
|
482 |
+
* $progress->tick();
|
483 |
+
* }
|
484 |
+
* $progress->finish();
|
485 |
+
* ```
|
486 |
+
*
|
487 |
+
* @access public
|
488 |
+
* @category Output
|
489 |
+
*
|
490 |
+
* @param string $message Text to display before the progress bar.
|
491 |
+
* @param integer $count Total number of ticks to be performed.
|
492 |
+
* @return cli\progress\Bar|WP_CLI\NoOp
|
493 |
+
*/
|
494 |
+
function make_progress_bar( $message, $count ) {
|
495 |
+
if ( \cli\Shell::isPiped() )
|
496 |
+
return new \WP_CLI\NoOp;
|
497 |
+
|
498 |
+
return new \cli\progress\Bar( $message, $count );
|
499 |
+
}
|
500 |
+
|
501 |
+
function parse_url( $url ) {
|
502 |
+
$url_parts = \parse_url( $url );
|
503 |
+
|
504 |
+
if ( !isset( $url_parts['scheme'] ) ) {
|
505 |
+
$url_parts = parse_url( 'http://' . $url );
|
506 |
+
}
|
507 |
+
|
508 |
+
return $url_parts;
|
509 |
+
}
|
510 |
+
|
511 |
+
/**
|
512 |
+
* Check if we're running in a Windows environment (cmd.exe).
|
513 |
+
*
|
514 |
+
* @return bool
|
515 |
+
*/
|
516 |
+
function is_windows() {
|
517 |
+
return false !== ( $test_is_windows = getenv( 'WP_CLI_TEST_IS_WINDOWS' ) ) ? (bool) $test_is_windows : strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
|
518 |
+
}
|
519 |
+
|
520 |
+
/**
|
521 |
+
* Replace magic constants in some PHP source code.
|
522 |
+
*
|
523 |
+
* @param string $source The PHP code to manipulate.
|
524 |
+
* @param string $path The path to use instead of the magic constants
|
525 |
+
*/
|
526 |
+
function replace_path_consts( $source, $path ) {
|
527 |
+
$replacements = array(
|
528 |
+
'__FILE__' => "'$path'",
|
529 |
+
'__DIR__' => "'" . dirname( $path ) . "'",
|
530 |
+
);
|
531 |
+
|
532 |
+
$old = array_keys( $replacements );
|
533 |
+
$new = array_values( $replacements );
|
534 |
+
|
535 |
+
return str_replace( $old, $new, $source );
|
536 |
+
}
|
537 |
+
|
538 |
+
/**
|
539 |
+
* Make a HTTP request to a remote URL.
|
540 |
+
*
|
541 |
+
* Wraps the Requests HTTP library to ensure every request includes a cert.
|
542 |
+
*
|
543 |
+
* ```
|
544 |
+
* # `wp core download` verifies the hash for a downloaded WordPress archive
|
545 |
+
*
|
546 |
+
* $md5_response = Utils\http_request( 'GET', $download_url . '.md5' );
|
547 |
+
* if ( 20 != substr( $md5_response->status_code, 0, 2 ) ) {
|
548 |
+
* WP_CLI::error( "Couldn't access md5 hash for release (HTTP code {$response->status_code})" );
|
549 |
+
* }
|
550 |
+
* ```
|
551 |
+
*
|
552 |
+
* @access public
|
553 |
+
*
|
554 |
+
* @param string $method HTTP method (GET, POST, DELETE, etc.)
|
555 |
+
* @param string $url URL to make the HTTP request to.
|
556 |
+
* @param array $headers Add specific headers to the request.
|
557 |
+
* @param array $options
|
558 |
+
* @return object
|
559 |
+
*/
|
560 |
+
function http_request( $method, $url, $data = null, $headers = array(), $options = array() ) {
|
561 |
+
|
562 |
+
$cert_path = '/rmccue/requests/library/Requests/Transport/cacert.pem';
|
563 |
+
if ( inside_phar() ) {
|
564 |
+
// cURL can't read Phar archives
|
565 |
+
$options['verify'] = extract_from_phar(
|
566 |
+
WP_CLI_VENDOR_DIR . $cert_path );
|
567 |
+
} else {
|
568 |
+
foreach( get_vendor_paths() as $vendor_path ) {
|
569 |
+
if ( file_exists( $vendor_path . $cert_path ) ) {
|
570 |
+
$options['verify'] = $vendor_path . $cert_path;
|
571 |
+
break;
|
572 |
+
}
|
573 |
+
}
|
574 |
+
if ( empty( $options['verify'] ) ){
|
575 |
+
WP_CLI::error( "Cannot find SSL certificate." );
|
576 |
+
}
|
577 |
+
}
|
578 |
+
|
579 |
+
try {
|
580 |
+
$request = \Requests::request( $url, $headers, $data, $method, $options );
|
581 |
+
return $request;
|
582 |
+
} catch( \Requests_Exception $ex ) {
|
583 |
+
// CURLE_SSL_CACERT_BADFILE only defined for PHP >= 7.
|
584 |
+
if ( 'curlerror' !== $ex->getType() || ! in_array( curl_errno( $ex->getData() ), array( CURLE_SSL_CONNECT_ERROR, CURLE_SSL_CERTPROBLEM, 77 /*CURLE_SSL_CACERT_BADFILE*/ ), true ) ) {
|
585 |
+
\WP_CLI::error( sprintf( "Failed to get url '%s': %s.", $url, $ex->getMessage() ) );
|
586 |
+
}
|
587 |
+
// Handle SSL certificate issues gracefully
|
588 |
+
\WP_CLI::warning( sprintf( "Re-trying without verify after failing to get verified url '%s' %s.", $url, $ex->getMessage() ) );
|
589 |
+
$options['verify'] = false;
|
590 |
+
try {
|
591 |
+
return \Requests::request( $url, $headers, $data, $method, $options );
|
592 |
+
} catch( \Requests_Exception $ex ) {
|
593 |
+
\WP_CLI::error( sprintf( "Failed to get non-verified url '%s' %s.", $url, $ex->getMessage() ) );
|
594 |
+
}
|
595 |
+
}
|
596 |
+
}
|
597 |
+
|
598 |
+
/**
|
599 |
+
* Increments a version string using the "x.y.z-pre" format
|
600 |
+
*
|
601 |
+
* Can increment the major, minor or patch number by one
|
602 |
+
* If $new_version == "same" the version string is not changed
|
603 |
+
* If $new_version is not a known keyword, it will be used as the new version string directly
|
604 |
+
*
|
605 |
+
* @param string $current_version
|
606 |
+
* @param string $new_version
|
607 |
+
* @return string
|
608 |
+
*/
|
609 |
+
function increment_version( $current_version, $new_version ) {
|
610 |
+
// split version assuming the format is x.y.z-pre
|
611 |
+
$current_version = explode( '-', $current_version, 2 );
|
612 |
+
$current_version[0] = explode( '.', $current_version[0] );
|
613 |
+
|
614 |
+
switch ( $new_version ) {
|
615 |
+
case 'same':
|
616 |
+
// do nothing
|
617 |
+
break;
|
618 |
+
|
619 |
+
case 'patch':
|
620 |
+
$current_version[0][2]++;
|
621 |
+
|
622 |
+
$current_version = array( $current_version[0] ); // drop possible pre-release info
|
623 |
+
break;
|
624 |
+
|
625 |
+
case 'minor':
|
626 |
+
$current_version[0][1]++;
|
627 |
+
$current_version[0][2] = 0;
|
628 |
+
|
629 |
+
$current_version = array( $current_version[0] ); // drop possible pre-release info
|
630 |
+
break;
|
631 |
+
|
632 |
+
case 'major':
|
633 |
+
$current_version[0][0]++;
|
634 |
+
$current_version[0][1] = 0;
|
635 |
+
$current_version[0][2] = 0;
|
636 |
+
|
637 |
+
$current_version = array( $current_version[0] ); // drop possible pre-release info
|
638 |
+
break;
|
639 |
+
|
640 |
+
default: // not a keyword
|
641 |
+
$current_version = array( array( $new_version ) );
|
642 |
+
break;
|
643 |
+
}
|
644 |
+
|
645 |
+
// reconstruct version string
|
646 |
+
$current_version[0] = implode( '.', $current_version[0] );
|
647 |
+
$current_version = implode( '-', $current_version );
|
648 |
+
|
649 |
+
return $current_version;
|
650 |
+
}
|
651 |
+
|
652 |
+
/**
|
653 |
+
* Compare two version strings to get the named semantic version.
|
654 |
+
*
|
655 |
+
* @access public
|
656 |
+
*
|
657 |
+
* @param string $new_version
|
658 |
+
* @param string $original_version
|
659 |
+
* @return string $name 'major', 'minor', 'patch'
|
660 |
+
*/
|
661 |
+
function get_named_sem_ver( $new_version, $original_version ) {
|
662 |
+
|
663 |
+
if ( ! Comparator::greaterThan( $new_version, $original_version ) ) {
|
664 |
+
return '';
|
665 |
+
}
|
666 |
+
|
667 |
+
$parts = explode( '-', $original_version );
|
668 |
+
$bits = explode( '.', $parts[0] );
|
669 |
+
$major = $bits[0];
|
670 |
+
if ( isset( $bits[1] ) ) {
|
671 |
+
$minor = $bits[1];
|
672 |
+
}
|
673 |
+
if ( isset( $bits[2] ) ) {
|
674 |
+
$patch = $bits[2];
|
675 |
+
}
|
676 |
+
|
677 |
+
if ( ! is_null( $minor ) && Semver::satisfies( $new_version, "{$major}.{$minor}.x" ) ) {
|
678 |
+
return 'patch';
|
679 |
+
} else if ( Semver::satisfies( $new_version, "{$major}.x.x" ) ) {
|
680 |
+
return 'minor';
|
681 |
+
} else {
|
682 |
+
return 'major';
|
683 |
+
}
|
684 |
+
}
|
685 |
+
|
686 |
+
/**
|
687 |
+
* Return the flag value or, if it's not set, the $default value.
|
688 |
+
*
|
689 |
+
* Because flags can be negated (e.g. --no-quiet to negate --quiet), this
|
690 |
+
* function provides a safer alternative to using
|
691 |
+
* `isset( $assoc_args['quiet'] )` or similar.
|
692 |
+
*
|
693 |
+
* @access public
|
694 |
+
* @category Input
|
695 |
+
*
|
696 |
+
* @param array $assoc_args Arguments array.
|
697 |
+
* @param string $flag Flag to get the value.
|
698 |
+
* @param mixed $default Default value for the flag. Default: NULL
|
699 |
+
* @return mixed
|
700 |
+
*/
|
701 |
+
function get_flag_value( $assoc_args, $flag, $default = null ) {
|
702 |
+
return isset( $assoc_args[ $flag ] ) ? $assoc_args[ $flag ] : $default;
|
703 |
+
}
|
704 |
+
|
705 |
+
/**
|
706 |
+
* Get the home directory.
|
707 |
+
*
|
708 |
+
* @access public
|
709 |
+
* @category System
|
710 |
+
*
|
711 |
+
* @return string
|
712 |
+
*/
|
713 |
+
function get_home_dir() {
|
714 |
+
$home = getenv( 'HOME' );
|
715 |
+
if ( ! $home ) {
|
716 |
+
// In Windows $HOME may not be defined
|
717 |
+
$home = getenv( 'HOMEDRIVE' ) . getenv( 'HOMEPATH' );
|
718 |
+
}
|
719 |
+
|
720 |
+
return rtrim( $home, '/\\' );
|
721 |
+
}
|
722 |
+
|
723 |
+
/**
|
724 |
+
* Appends a trailing slash.
|
725 |
+
*
|
726 |
+
* @access public
|
727 |
+
* @category System
|
728 |
+
*
|
729 |
+
* @param string $string What to add the trailing slash to.
|
730 |
+
* @return string String with trailing slash added.
|
731 |
+
*/
|
732 |
+
function trailingslashit( $string ) {
|
733 |
+
return rtrim( $string, '/\\' ) . '/';
|
734 |
+
}
|
735 |
+
|
736 |
+
/**
|
737 |
+
* Get the system's temp directory. Warns user if it isn't writable.
|
738 |
+
*
|
739 |
+
* @access public
|
740 |
+
* @category System
|
741 |
+
*
|
742 |
+
* @return string
|
743 |
+
*/
|
744 |
+
function get_temp_dir() {
|
745 |
+
static $temp = '';
|
746 |
+
|
747 |
+
if ( $temp ) {
|
748 |
+
return $temp;
|
749 |
+
}
|
750 |
+
|
751 |
+
// `sys_get_temp_dir()` introduced PHP 5.2.1.
|
752 |
+
if ( $try = sys_get_temp_dir() ) {
|
753 |
+
$temp = trailingslashit( $try );
|
754 |
+
} elseif ( $try = ini_get( 'upload_tmp_dir' ) ) {
|
755 |
+
$temp = trailingslashit( $try );
|
756 |
+
} else {
|
757 |
+
$temp = '/tmp/';
|
758 |
+
}
|
759 |
+
|
760 |
+
if ( ! @is_writable( $temp ) ) {
|
761 |
+
\WP_CLI::warning( "Temp directory isn't writable: {$temp}" );
|
762 |
+
}
|
763 |
+
|
764 |
+
return $temp;
|
765 |
+
}
|
766 |
+
|
767 |
+
/**
|
768 |
+
* Parse a SSH url for its host, port, and path.
|
769 |
+
*
|
770 |
+
* Similar to parse_url(), but adds support for defined SSH aliases.
|
771 |
+
*
|
772 |
+
* ```
|
773 |
+
* host OR host/path/to/wordpress OR host:port/path/to/wordpress
|
774 |
+
* ```
|
775 |
+
*
|
776 |
+
* @access public
|
777 |
+
*
|
778 |
+
* @return mixed
|
779 |
+
*/
|
780 |
+
function parse_ssh_url( $url, $component = -1 ) {
|
781 |
+
preg_match( '#^((docker|docker\-compose|ssh|vagrant):)?(([^@:]+)@)?([^:/~]+)(:([\d]*))?((/|~)(.+))?$#', $url, $matches );
|
782 |
+
$bits = array();
|
783 |
+
foreach( array(
|
784 |
+
2 => 'scheme',
|
785 |
+
4 => 'user',
|
786 |
+
5 => 'host',
|
787 |
+
7 => 'port',
|
788 |
+
8 => 'path',
|
789 |
+
) as $i => $key ) {
|
790 |
+
if ( ! empty( $matches[ $i ] ) ) {
|
791 |
+
$bits[ $key ] = $matches[ $i ];
|
792 |
+
}
|
793 |
+
}
|
794 |
+
switch ( $component ) {
|
795 |
+
case PHP_URL_SCHEME:
|
796 |
+
return isset( $bits['scheme'] ) ? $bits['scheme'] : null;
|
797 |
+
case PHP_URL_USER:
|
798 |
+
return isset( $bits['user'] ) ? $bits['user'] : null;
|
799 |
+
case PHP_URL_HOST:
|
800 |
+
return isset( $bits['host'] ) ? $bits['host'] : null;
|
801 |
+
case PHP_URL_PATH:
|
802 |
+
return isset( $bits['path'] ) ? $bits['path'] : null;
|
803 |
+
case PHP_URL_PORT:
|
804 |
+
return isset( $bits['port'] ) ? $bits['port'] : null;
|
805 |
+
default:
|
806 |
+
return $bits;
|
807 |
+
}
|
808 |
+
}
|
809 |
+
|
810 |
+
/**
|
811 |
+
* Report the results of the same operation against multiple resources.
|
812 |
+
*
|
813 |
+
* @access public
|
814 |
+
* @category Input
|
815 |
+
*
|
816 |
+
* @param string $noun Resource being affected (e.g. plugin)
|
817 |
+
* @param string $verb Type of action happening to the noun (e.g. activate)
|
818 |
+
* @param integer $total Total number of resource being affected.
|
819 |
+
* @param integer $successes Number of successful operations.
|
820 |
+
* @param integer $failures Number of failures.
|
821 |
+
*/
|
822 |
+
function report_batch_operation_results( $noun, $verb, $total, $successes, $failures ) {
|
823 |
+
$plural_noun = $noun . 's';
|
824 |
+
$past_tense_verb = past_tense_verb( $verb );
|
825 |
+
$past_tense_verb_upper = ucfirst( $past_tense_verb );
|
826 |
+
if ( $failures ) {
|
827 |
+
if ( $successes ) {
|
828 |
+
WP_CLI::error( "Only {$past_tense_verb} {$successes} of {$total} {$plural_noun}." );
|
829 |
+
} else {
|
830 |
+
WP_CLI::error( "No {$plural_noun} {$past_tense_verb}." );
|
831 |
+
}
|
832 |
+
} else {
|
833 |
+
if ( $successes ) {
|
834 |
+
WP_CLI::success( "{$past_tense_verb_upper} {$successes} of {$total} {$plural_noun}." );
|
835 |
+
} else {
|
836 |
+
$message = $total > 1 ? ucfirst( $plural_noun ) : ucfirst( $noun );
|
837 |
+
WP_CLI::success( "{$message} already {$past_tense_verb}." );
|
838 |
+
}
|
839 |
+
}
|
840 |
+
}
|
841 |
+
|
842 |
+
/**
|
843 |
+
* Parse a string of command line arguments into an $argv-esqe variable.
|
844 |
+
*
|
845 |
+
* @access public
|
846 |
+
* @category Input
|
847 |
+
*
|
848 |
+
* @param string $arguments
|
849 |
+
* @return array
|
850 |
+
*/
|
851 |
+
function parse_str_to_argv( $arguments ) {
|
852 |
+
preg_match_all ('/(?<=^|\s)([\'"]?)(.+?)(?<!\\\\)\1(?=$|\s)/', $arguments, $matches );
|
853 |
+
$argv = isset( $matches[0] ) ? $matches[0] : array();
|
854 |
+
$argv = array_map( function( $arg ){
|
855 |
+
foreach( array( '"', "'" ) as $char ) {
|
856 |
+
if ( $char === substr( $arg, 0, 1 ) && $char === substr( $arg, -1 ) ) {
|
857 |
+
$arg = substr( $arg, 1, -1 );
|
858 |
+
break;
|
859 |
+
}
|
860 |
+
}
|
861 |
+
return $arg;
|
862 |
+
}, $argv );
|
863 |
+
return $argv;
|
864 |
+
}
|
865 |
+
|
866 |
+
/**
|
867 |
+
* Locale-independent version of basename()
|
868 |
+
*
|
869 |
+
* @access public
|
870 |
+
*
|
871 |
+
* @param string $path
|
872 |
+
* @param string $suffix
|
873 |
+
* @return string
|
874 |
+
*/
|
875 |
+
function basename( $path, $suffix = '' ) {
|
876 |
+
return urldecode( \basename( str_replace( array( '%2F', '%5C' ), '/', urlencode( $path ) ), $suffix ) );
|
877 |
+
}
|
878 |
+
|
879 |
+
/**
|
880 |
+
* Checks whether the output of the current script is a TTY or a pipe / redirect
|
881 |
+
*
|
882 |
+
* Returns true if STDOUT output is being redirected to a pipe or a file; false is
|
883 |
+
* output is being sent directly to the terminal.
|
884 |
+
*
|
885 |
+
* If an env variable SHELL_PIPE exists, returned result depends it's
|
886 |
+
* value. Strings like 1, 0, yes, no, that validate to booleans are accepted.
|
887 |
+
*
|
888 |
+
* To enable ASCII formatting even when shell is piped, use the
|
889 |
+
* ENV variable SHELL_PIPE=0
|
890 |
+
*
|
891 |
+
* @access public
|
892 |
+
*
|
893 |
+
* @return bool
|
894 |
+
*/
|
895 |
+
function isPiped() {
|
896 |
+
$shellPipe = getenv('SHELL_PIPE');
|
897 |
+
|
898 |
+
if ($shellPipe !== false) {
|
899 |
+
return filter_var($shellPipe, FILTER_VALIDATE_BOOLEAN);
|
900 |
+
} else {
|
901 |
+
return (function_exists('posix_isatty') && !posix_isatty(STDOUT));
|
902 |
+
}
|
903 |
+
}
|
904 |
+
|
905 |
+
/**
|
906 |
+
* Expand within paths to their matching paths.
|
907 |
+
*
|
908 |
+
* Has no effect on paths which do not use glob patterns.
|
909 |
+
*
|
910 |
+
* @param string|array $paths Single path as a string, or an array of paths.
|
911 |
+
* @param int $flags Optional. Flags to pass to glob. Defaults to GLOB_BRACE.
|
912 |
+
*
|
913 |
+
* @return array Expanded paths.
|
914 |
+
*/
|
915 |
+
function expand_globs( $paths, $flags = 'default' ) {
|
916 |
+
// Compatibility for systems without GLOB_BRACE.
|
917 |
+
$glob_func = 'glob';
|
918 |
+
if ( 'default' === $flags ) {
|
919 |
+
if ( ! defined( 'GLOB_BRACE' ) || getenv( 'WP_CLI_TEST_EXPAND_GLOBS_NO_GLOB_BRACE' ) ) {
|
920 |
+
$glob_func = 'WP_CLI\Utils\glob_brace';
|
921 |
+
} else {
|
922 |
+
$flags = GLOB_BRACE;
|
923 |
+
}
|
924 |
+
}
|
925 |
+
|
926 |
+
$expanded = array();
|
927 |
+
|
928 |
+
foreach ( (array) $paths as $path ) {
|
929 |
+
$matching = array( $path );
|
930 |
+
|
931 |
+
if ( preg_match( '/[' . preg_quote( '*?[]{}!', '/' ) . ']/', $path ) ) {
|
932 |
+
$matching = $glob_func( $path, $flags ) ?: array();
|
933 |
+
}
|
934 |
+
$expanded = array_merge( $expanded, $matching );
|
935 |
+
}
|
936 |
+
|
937 |
+
return array_values( array_unique( $expanded ) );
|
938 |
+
}
|
939 |
+
|
940 |
+
/**
|
941 |
+
* Simulate a `glob()` with the `GLOB_BRACE` flag set. For systems (eg Alpine Linux) built against a libc library (eg https://www.musl-libc.org/) that lacks it.
|
942 |
+
* Copied and adapted from Zend Framework's `Glob::fallbackGlob()` and Glob::nextBraceSub()`.
|
943 |
+
*
|
944 |
+
* Zend Framework (http://framework.zend.com/)
|
945 |
+
*
|
946 |
+
* @link http://github.com/zendframework/zf2 for the canonical source repository
|
947 |
+
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
|
948 |
+
* @license http://framework.zend.com/license/new-bsd New BSD License
|
949 |
+
*
|
950 |
+
* @param string $pattern Filename pattern.
|
951 |
+
* @param void $dummy_flags Not used.
|
952 |
+
*
|
953 |
+
* @return array Array of paths.
|
954 |
+
*/
|
955 |
+
function glob_brace( $pattern, $dummy_flags = null ) {
|
956 |
+
|
957 |
+
static $next_brace_sub;
|
958 |
+
if ( ! $next_brace_sub ) {
|
959 |
+
// Find the end of the subpattern in a brace expression.
|
960 |
+
$next_brace_sub = function ( $pattern, $current ) {
|
961 |
+
$length = strlen( $pattern );
|
962 |
+
$depth = 0;
|
963 |
+
|
964 |
+
while ( $current < $length ) {
|
965 |
+
if ( '\\' === $pattern[ $current ] ) {
|
966 |
+
if ( ++$current === $length ) {
|
967 |
+
break;
|
968 |
+
}
|
969 |
+
$current++;
|
970 |
+
} else {
|
971 |
+
if ( ( '}' === $pattern[ $current ] && $depth-- === 0 ) || ( ',' === $pattern[ $current ] && 0 === $depth ) ) {
|
972 |
+
break;
|
973 |
+
} elseif ( '{' === $pattern[ $current++ ] ) {
|
974 |
+
$depth++;
|
975 |
+
}
|
976 |
+
}
|
977 |
+
}
|
978 |
+
|
979 |
+
return $current < $length ? $current : null;
|
980 |
+
};
|
981 |
+
}
|
982 |
+
|
983 |
+
$length = strlen( $pattern );
|
984 |
+
|
985 |
+
// Find first opening brace.
|
986 |
+
for ( $begin = 0; $begin < $length; $begin++ ) {
|
987 |
+
if ( '\\' === $pattern[ $begin ] ) {
|
988 |
+
$begin++;
|
989 |
+
} elseif ( '{' === $pattern[ $begin ] ) {
|
990 |
+
break;
|
991 |
+
}
|
992 |
+
}
|
993 |
+
|
994 |
+
// Find comma or matching closing brace.
|
995 |
+
if ( null === ( $next = $next_brace_sub( $pattern, $begin + 1 ) ) ) {
|
996 |
+
return glob( $pattern );
|
997 |
+
}
|
998 |
+
|
999 |
+
$rest = $next;
|
1000 |
+
|
1001 |
+
// Point `$rest` to matching closing brace.
|
1002 |
+
while ( '}' !== $pattern[ $rest ] ) {
|
1003 |
+
if ( null === ( $rest = $next_brace_sub( $pattern, $rest + 1 ) ) ) {
|
1004 |
+
return glob( $pattern );
|
1005 |
+
}
|
1006 |
+
}
|
1007 |
+
|
1008 |
+
$paths = array();
|
1009 |
+
$p = $begin + 1;
|
1010 |
+
|
1011 |
+
// For each comma-separated subpattern.
|
1012 |
+
do {
|
1013 |
+
$subpattern = substr( $pattern, 0, $begin )
|
1014 |
+
. substr( $pattern, $p, $next - $p )
|
1015 |
+
. substr( $pattern, $rest + 1 );
|
1016 |
+
|
1017 |
+
if ( ( $result = glob_brace( $subpattern ) ) ) {
|
1018 |
+
$paths = array_merge( $paths, $result );
|
1019 |
+
}
|
1020 |
+
|
1021 |
+
if ( '}' === $pattern[ $next ] ) {
|
1022 |
+
break;
|
1023 |
+
}
|
1024 |
+
|
1025 |
+
$p = $next + 1;
|
1026 |
+
$next = $next_brace_sub( $pattern, $p );
|
1027 |
+
} while ( null !== $next );
|
1028 |
+
|
1029 |
+
return array_values( array_unique( $paths ) );
|
1030 |
+
}
|
1031 |
+
|
1032 |
+
/**
|
1033 |
+
* Get the closest suggestion for a mis-typed target term amongst a list of
|
1034 |
+
* options.
|
1035 |
+
*
|
1036 |
+
* Uses the Levenshtein algorithm to calculate the relative "distance" between
|
1037 |
+
* terms.
|
1038 |
+
*
|
1039 |
+
* If the "distance" to the closest term is higher than the threshold, an empty
|
1040 |
+
* string is returned.
|
1041 |
+
*
|
1042 |
+
* @param string $target Target term to get a suggestion for.
|
1043 |
+
* @param array $options Array with possible options.
|
1044 |
+
* @param int $threshold Threshold above which to return an empty string.
|
1045 |
+
*
|
1046 |
+
* @return string
|
1047 |
+
*/
|
1048 |
+
function get_suggestion( $target, array $options, $threshold = 2 ) {
|
1049 |
+
if ( empty( $options ) ) {
|
1050 |
+
return '';
|
1051 |
+
}
|
1052 |
+
foreach ( $options as $option ) {
|
1053 |
+
$distance = levenshtein( $option, $target );
|
1054 |
+
$levenshtein[ $option ] = $distance;
|
1055 |
+
}
|
1056 |
+
|
1057 |
+
// Sort known command strings by distance to user entry.
|
1058 |
+
asort( $levenshtein );
|
1059 |
+
|
1060 |
+
// Fetch the closest command string.
|
1061 |
+
reset( $levenshtein );
|
1062 |
+
$suggestion = key( $levenshtein );
|
1063 |
+
|
1064 |
+
// Only return a suggestion if below a given threshold.
|
1065 |
+
return $levenshtein[ $suggestion ] <= $threshold && $suggestion !== $target
|
1066 |
+
? (string) $suggestion
|
1067 |
+
: '';
|
1068 |
+
}
|
1069 |
+
|
1070 |
+
/**
|
1071 |
+
* Get a Phar-safe version of a path.
|
1072 |
+
*
|
1073 |
+
* For paths inside a Phar, this strips the outer filesystem's location to
|
1074 |
+
* reduce the path to what it needs to be within the Phar archive.
|
1075 |
+
*
|
1076 |
+
* Use the __FILE__ or __DIR__ constants as a starting point.
|
1077 |
+
*
|
1078 |
+
* @param string $path An absolute path that might be within a Phar.
|
1079 |
+
*
|
1080 |
+
* @return string A Phar-safe version of the path.
|
1081 |
+
*/
|
1082 |
+
function phar_safe_path( $path ) {
|
1083 |
+
|
1084 |
+
if ( ! inside_phar() ) {
|
1085 |
+
return $path;
|
1086 |
+
}
|
1087 |
+
|
1088 |
+
return str_replace(
|
1089 |
+
PHAR_STREAM_PREFIX . WP_CLI_PHAR_PATH . '/',
|
1090 |
+
PHAR_STREAM_PREFIX,
|
1091 |
+
$path
|
1092 |
+
);
|
1093 |
+
}
|
1094 |
+
|
1095 |
+
/**
|
1096 |
+
* Check whether a given Command object is part of the bundled set of
|
1097 |
+
* commands.
|
1098 |
+
*
|
1099 |
+
* This function accepts both a fully qualified class name as a string as
|
1100 |
+
* well as an object that extends `WP_CLI\Dispatcher\CompositeCommand`.
|
1101 |
+
*
|
1102 |
+
* @param \WP_CLI\Dispatcher\CompositeCommand|string $command
|
1103 |
+
*
|
1104 |
+
* @return bool
|
1105 |
+
*/
|
1106 |
+
function is_bundled_command( $command ) {
|
1107 |
+
static $classes;
|
1108 |
+
|
1109 |
+
if ( null === $classes ) {
|
1110 |
+
$classes = array();
|
1111 |
+
$class_map = WP_CLI_VENDOR_DIR . '/composer/autoload_commands_classmap.php';
|
1112 |
+
if ( file_exists( WP_CLI_VENDOR_DIR . '/composer/') ) {
|
1113 |
+
$classes = include $class_map;
|
1114 |
+
}
|
1115 |
+
}
|
1116 |
+
|
1117 |
+
if ( is_object( $command ) ) {
|
1118 |
+
$command = get_class( $command );
|
1119 |
+
}
|
1120 |
+
|
1121 |
+
return is_string( $command )
|
1122 |
+
? array_key_exists( $command, $classes )
|
1123 |
+
: false;
|
1124 |
+
}
|
1125 |
+
|
1126 |
+
/**
|
1127 |
+
* Maybe prefix command string with "/usr/bin/env".
|
1128 |
+
* Removes (if there) if Windows, adds (if not there) if not.
|
1129 |
+
*
|
1130 |
+
* @param string $command
|
1131 |
+
*
|
1132 |
+
* @return string
|
1133 |
+
*/
|
1134 |
+
function force_env_on_nix_systems( $command ) {
|
1135 |
+
$env_prefix = '/usr/bin/env ';
|
1136 |
+
$env_prefix_len = strlen( $env_prefix );
|
1137 |
+
if ( is_windows() ) {
|
1138 |
+
if ( 0 === strncmp( $command, $env_prefix, $env_prefix_len ) ) {
|
1139 |
+
$command = substr( $command, $env_prefix_len );
|
1140 |
+
}
|
1141 |
+
} else {
|
1142 |
+
if ( 0 !== strncmp( $command, $env_prefix, $env_prefix_len ) ) {
|
1143 |
+
$command = $env_prefix . $command;
|
1144 |
+
}
|
1145 |
+
}
|
1146 |
+
return $command;
|
1147 |
+
}
|
1148 |
+
|
1149 |
+
/**
|
1150 |
+
* Check that `proc_open()` and `proc_close()` haven't been disabled.
|
1151 |
+
*
|
1152 |
+
* @param string $context Optional. If set will appear in error message. Default null.
|
1153 |
+
* @param bool $return Optional. If set will return false rather than error out. Default false.
|
1154 |
+
*
|
1155 |
+
* @return bool
|
1156 |
+
*/
|
1157 |
+
function check_proc_available( $context = null, $return = false ) {
|
1158 |
+
if ( ! function_exists( 'proc_open' ) || ! function_exists( 'proc_close' ) ) {
|
1159 |
+
if ( $return ) {
|
1160 |
+
return false;
|
1161 |
+
}
|
1162 |
+
$msg = 'The PHP functions `proc_open()` and/or `proc_close()` are disabled. Please check your PHP ini directive `disable_functions` or suhosin settings.';
|
1163 |
+
if ( $context ) {
|
1164 |
+
WP_CLI::error( sprintf( "Cannot do '%s': %s", $context, $msg ) );
|
1165 |
+
} else {
|
1166 |
+
WP_CLI::error( $msg );
|
1167 |
+
}
|
1168 |
+
}
|
1169 |
+
return true;
|
1170 |
+
}
|
1171 |
+
|
1172 |
+
/**
|
1173 |
+
* Returns past tense of verb, with limited accuracy. Only regular verbs catered for, apart from "reset".
|
1174 |
+
*
|
1175 |
+
* @param string $verb Verb to return past tense of.
|
1176 |
+
*
|
1177 |
+
* @return string
|
1178 |
+
*/
|
1179 |
+
function past_tense_verb( $verb ) {
|
1180 |
+
static $irregular = array( 'reset' => 'reset' );
|
1181 |
+
if ( isset( $irregular[ $verb ] ) ) {
|
1182 |
+
return $irregular[ $verb ];
|
1183 |
+
}
|
1184 |
+
$last = substr( $verb, -1 );
|
1185 |
+
if ( 'e' === $last ) {
|
1186 |
+
$verb = substr( $verb, 0, -1 );
|
1187 |
+
} elseif ( 'y' === $last && ! preg_match( '/[aeiou]y$/', $verb ) ) {
|
1188 |
+
$verb = substr( $verb, 0, -1 ) . 'i';
|
1189 |
+
} elseif ( preg_match( '/^[^aeiou]*[aeiou][^aeiouhwxy]$/', $verb ) ) {
|
1190 |
+
// Rule of thumb that most (all?) one-voweled regular verbs ending in vowel + consonant (excluding "h", "w", "x", "y") double their final consonant - misses many cases (eg "submit").
|
1191 |
+
$verb .= $last;
|
1192 |
+
}
|
1193 |
+
return $verb . 'ed';
|
1194 |
+
}
|
cli/features/component.feature
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Feature: Manage BuddyPress Components
|
2 |
+
|
3 |
+
Scenario: Component CRUD Operations
|
4 |
+
Given a BP install
|
5 |
+
|
6 |
+
When I run `wp bp component list --format=count`
|
7 |
+
Then STDOUT should be:
|
8 |
+
"""
|
9 |
+
10
|
10 |
+
"""
|
11 |
+
|
12 |
+
When I run `wp bp component list --type=required --format=count`
|
13 |
+
Then STDOUT should be:
|
14 |
+
"""
|
15 |
+
2
|
16 |
+
"""
|
17 |
+
|
18 |
+
When I run `wp bp component list --type=required`
|
19 |
+
Then STDOUT should be a table containing rows:
|
20 |
+
| id | title | description |
|
21 |
+
| core | BuddyPress Core | It‘s what makes <del>time travel</del> BuddyPress possible! |
|
22 |
+
| members | Community Members | Everything in a BuddyPress community revolves around its members. |
|
23 |
+
|
24 |
+
When I run `wp bp component list --fields=id --type=required`
|
25 |
+
Then STDOUT should be a table containing rows:
|
26 |
+
| id |
|
27 |
+
| core |
|
28 |
+
| members |
|
29 |
+
|
30 |
+
When I run `wp bp component deactivate groups`
|
31 |
+
Then STDOUT should contain:
|
32 |
+
"""
|
33 |
+
Success: The Groups component has been deactivated.
|
34 |
+
"""
|
35 |
+
|
36 |
+
When I try `wp bp component deactivate groups`
|
37 |
+
Then the return code should be 1
|
38 |
+
|
39 |
+
When I run `wp bp component activate groups`
|
40 |
+
Then STDOUT should contain:
|
41 |
+
"""
|
42 |
+
Success: The Groups component has been activated.
|
43 |
+
"""
|
44 |
+
|
45 |
+
When I try `wp bp component activate groups`
|
46 |
+
Then the return code should be 1
|
cli/features/email.feature
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Feature: Manage BuddyPress Emails
|
2 |
+
|
3 |
+
Scenario: BuddyPress reinstall emails
|
4 |
+
Given a BP install
|
5 |
+
|
6 |
+
When I run `wp bp email reinstall --yes`
|
7 |
+
Then STDOUT should contain:
|
8 |
+
"""
|
9 |
+
Success: Emails have been successfully reinstalled.
|
10 |
+
"""
|
cli/features/extra/no-mail.php
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
function wp_mail( $to ) {
|
4 |
+
// Log for testing purposes
|
5 |
+
WP_CLI::log( "WP-CLI test suite: Sent email to {$to}." );
|
6 |
+
}
|
7 |
+
|
cli/features/friend.feature
ADDED
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Feature: Manage BuddyPress Friends
|
2 |
+
|
3 |
+
Scenario: Friends CRUD Operations
|
4 |
+
Given a BP install
|
5 |
+
|
6 |
+
When I try `wp user get bogus-user`
|
7 |
+
Then the return code should be 1
|
8 |
+
And STDOUT should be empty
|
9 |
+
|
10 |
+
When I run `wp user create testuser1 testuser1@example.com --porcelain`
|
11 |
+
Then STDOUT should be a number
|
12 |
+
And save STDOUT as {BOB_ID}
|
13 |
+
|
14 |
+
When I run `wp user create testuser2 testuser2@example.com --porcelain`
|
15 |
+
Then STDOUT should be a number
|
16 |
+
And save STDOUT as {SALLY_ID}
|
17 |
+
|
18 |
+
When I run `wp user create testuser3 testuser3@example.com --porcelain`
|
19 |
+
Then STDOUT should be a number
|
20 |
+
And save STDOUT as {JOHN_ID}
|
21 |
+
|
22 |
+
When I run `wp bp friend create {BOB_ID} {SALLY_ID} --force-accept`
|
23 |
+
Then STDOUT should contain:
|
24 |
+
"""
|
25 |
+
Success: Friendship successfully created.
|
26 |
+
"""
|
27 |
+
|
28 |
+
When I run `wp bp friend check {BOB_ID} {SALLY_ID}`
|
29 |
+
Then STDOUT should contain:
|
30 |
+
"""
|
31 |
+
Success: Yes, they are friends.
|
32 |
+
"""
|
33 |
+
|
34 |
+
When I run `wp bp friend create {BOB_ID} {JOHN_ID} --force-accept`
|
35 |
+
Then STDOUT should contain:
|
36 |
+
"""
|
37 |
+
Success: Friendship successfully created.
|
38 |
+
"""
|
39 |
+
|
40 |
+
When I run `wp bp friend list {BOB_ID} --fields=friend_user_id,is_confirmed`
|
41 |
+
Then STDOUT should be a table containing rows:
|
42 |
+
| friend_user_id | is_confirmed |
|
43 |
+
| {SALLY_ID} | 1 |
|
44 |
+
| {JOHN_ID} | 1 |
|
45 |
+
|
46 |
+
When I run `wp bp friend remove {BOB_ID} {SALLY_ID}`
|
47 |
+
Then STDOUT should contain:
|
48 |
+
"""
|
49 |
+
Success: Friendship successfully removed.
|
50 |
+
"""
|
51 |
+
|
52 |
+
When I run `wp bp friend remove {BOB_ID} {JOHN_ID}`
|
53 |
+
Then STDOUT should contain:
|
54 |
+
"""
|
55 |
+
Success: Friendship successfully removed.
|
56 |
+
"""
|
cli/features/group-invite.feature
ADDED
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Feature: Manage BuddyPress Group Invites
|
2 |
+
|
3 |
+
Scenario: Group Invite CRUD Operations
|
4 |
+
Given a BP install
|
5 |
+
|
6 |
+
When I run `wp user create testuser1 testuser1@example.com --porcelain`
|
7 |
+
Then STDOUT should be a number
|
8 |
+
And save STDOUT as {MEMBER_ID}
|
9 |
+
|
10 |
+
When I run `wp user create inviter inviter@example.com --porcelain`
|
11 |
+
Then STDOUT should be a number
|
12 |
+
And save STDOUT as {INVITER_ID}
|
13 |
+
|
14 |
+
When I run `wp bp group create --name="Cool Group" --porcelain`
|
15 |
+
Then STDOUT should be a number
|
16 |
+
And save STDOUT as {GROUP_ID}
|
17 |
+
|
18 |
+
When I run `wp bp group invite create --group-id={GROUP_ID} --user-id={MEMBER_ID} --inviter-id={INVITER_ID}`
|
19 |
+
Then STDOUT should contain:
|
20 |
+
"""
|
21 |
+
Success: Member invited to the group.
|
22 |
+
"""
|
23 |
+
|
24 |
+
When I run `wp bp group invite remove --group-id={GROUP_ID} --user-id={MEMBER_ID}`
|
25 |
+
Then STDOUT should contain:
|
26 |
+
"""
|
27 |
+
Success: User uninvited from the group.
|
28 |
+
"""
|
29 |
+
|
30 |
+
When I run `wp bp group invite accept --group-id={GROUP_ID} --user-id={MEMBER_ID}`
|
31 |
+
Then STDOUT should contain:
|
32 |
+
"""
|
33 |
+
Success: User is now a "member" of the group.
|
34 |
+
"""
|
35 |
+
|
36 |
+
Scenario: Group Invite list
|
37 |
+
Given a BP install
|
38 |
+
|
39 |
+
When I run `wp user create testuser1 testuser1@example.com --porcelain`
|
40 |
+
Then STDOUT should be a number
|
41 |
+
And save STDOUT as {MEMBER_ONE_ID}
|
42 |
+
|
43 |
+
When I run `wp user create testuser2 testuser2@example.com --porcelain`
|
44 |
+
Then STDOUT should be a number
|
45 |
+
And save STDOUT as {MEMBER_TWO_ID}
|
46 |
+
|
47 |
+
When I run `wp bp group create --name="Group 1" --slug=group1 --porcelain`
|
48 |
+
Then STDOUT should be a number
|
49 |
+
And save STDOUT as {GROUP_ONE_ID}
|
50 |
+
|
51 |
+
When I run `wp bp group create --name="Group 2" --slug=group2 --porcelain`
|
52 |
+
Then STDOUT should be a number
|
53 |
+
And save STDOUT as {GROUP_TWO_ID}
|
54 |
+
|
55 |
+
When I run `wp bp group invite create --group-id={GROUP_ONE_ID} --user-id={MEMBER_ONE_ID} --inviter-id={MEMBER_TWO_ID}`
|
56 |
+
Then the return code should be 0
|
57 |
+
|
58 |
+
When I run `wp bp group invite create --group-id={GROUP_TWO_ID} --user-id={MEMBER_TWO_ID} --inviter-id={MEMBER_ONE_ID}`
|
59 |
+
Then the return code should be 0
|
60 |
+
|
61 |
+
When I try `wp bp group invite list`
|
62 |
+
Then the return code should be 1
|
cli/features/group-member.feature
ADDED
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Feature: Manage BuddyPress Group Members
|
2 |
+
|
3 |
+
Scenario: Group Member CRUD Operations
|
4 |
+
Given a BP install
|
5 |
+
|
6 |
+
When I run `wp user create testuser1 testuser1@example.com --porcelain`
|
7 |
+
Then STDOUT should be a number
|
8 |
+
And save STDOUT as {CREATOR_ID}
|
9 |
+
|
10 |
+
When I run `wp user create mod mod@example.com --porcelain`
|
11 |
+
Then STDOUT should be a number
|
12 |
+
And save STDOUT as {MEMBER_ID}
|
13 |
+
|
14 |
+
When I run `wp bp group create --name="Totally Cool Group" --creator-id={CREATOR_ID} --porcelain`
|
15 |
+
Then STDOUT should be a number
|
16 |
+
And save STDOUT as {GROUP_ID}
|
17 |
+
|
18 |
+
When I run `wp bp group member create --group-id={GROUP_ID} --user-id={MEMBER_ID}`
|
19 |
+
Then STDOUT should contain:
|
20 |
+
"""
|
21 |
+
Success: Added user #{MEMBER_ID} to group #{GROUP_ID} as member.
|
22 |
+
"""
|
23 |
+
|
24 |
+
When I run `wp bp group member list {GROUP_ID} --fields=user_id`
|
25 |
+
Then STDOUT should be a table containing rows:
|
26 |
+
| user_id |
|
27 |
+
| {CREATOR_ID} |
|
28 |
+
| {MEMBER_ID} |
|
29 |
+
|
30 |
+
When I run `wp bp group member promote --group-id={GROUP_ID} --user-id={MEMBER_ID} --role=mod`
|
31 |
+
Then STDOUT should contain:
|
32 |
+
"""
|
33 |
+
Success: Member promoted to new role successfully.
|
34 |
+
"""
|
35 |
+
|
36 |
+
When I run `wp bp group member list {GROUP_ID} --fields=user_id --role=mod`
|
37 |
+
Then STDOUT should be a table containing rows:
|
38 |
+
| user_id |
|
39 |
+
| {MEMBER_ID} |
|
40 |
+
|
41 |
+
When I run `wp bp group member demote --group-id={GROUP_ID} --user-id={MEMBER_ID}`
|
42 |
+
Then STDOUT should contain:
|
43 |
+
"""
|
44 |
+
Success: User demoted to the "member" status.
|
45 |
+
"""
|
46 |
+
|
47 |
+
When I try `wp bp group member list {GROUP_ID} --fields=user_id --role=mod`
|
48 |
+
Then the return code should be 1
|
49 |
+
|
50 |
+
When I run `wp bp group member ban --group-id={GROUP_ID} --user-id={MEMBER_ID}`
|
51 |
+
Then STDOUT should contain:
|
52 |
+
"""
|
53 |
+
Success: Member banned from the group.
|
54 |
+
"""
|
55 |
+
|
56 |
+
When I run `wp bp group member list {GROUP_ID} --fields=user_id --role=banned`
|
57 |
+
Then STDOUT should be a table containing rows:
|
58 |
+
| user_id |
|
59 |
+
| {MEMBER_ID} |
|
60 |
+
|
61 |
+
When I run `wp bp group member unban --group-id={GROUP_ID} --user-id={MEMBER_ID}`
|
62 |
+
Then STDOUT should contain:
|
63 |
+
"""
|
64 |
+
Success: Member unbanned from the group.
|
65 |
+
"""
|
66 |
+
|
67 |
+
When I try `wp bp group member list {GROUP_ID} --fields=user_id --role=banned`
|
68 |
+
Then the return code should be 1
|
69 |
+
|
70 |
+
When I run `wp bp group member remove --group-id={GROUP_ID} --user-id={MEMBER_ID}`
|
71 |
+
Then STDOUT should contain:
|
72 |
+
"""
|
73 |
+
Success: Member #{MEMBER_ID} removed from the group #{GROUP_ID}.
|
74 |
+
"""
|
75 |
+
|
76 |
+
When I run `wp bp group member list {GROUP_ID} --fields=user_id --role=member,admin,mod,banned`
|
77 |
+
Then STDOUT should be a table containing rows:
|
78 |
+
| user_id |
|
79 |
+
| {CREATOR_ID} |
|
cli/features/group.feature
ADDED
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Feature: Manage BuddyPress Groups
|
2 |
+
|
3 |
+
Scenario: Group CRUD Operations
|
4 |
+
Given a BP install
|
5 |
+
|
6 |
+
When I run `wp bp group create --name="Totally Cool Group" --slug=totally-cool-group --porcelain`
|
7 |
+
Then STDOUT should be a number
|
8 |
+
And save STDOUT as {GROUP_ID}
|
9 |
+
|
10 |
+
When I run `wp bp group get {GROUP_ID}`
|
11 |
+
Then STDOUT should be a table containing rows:
|
12 |
+
| Field | Value |
|
13 |
+
| id | {GROUP_ID} |
|
14 |
+
| name | Totally Cool Group |
|
15 |
+
|
16 |
+
When I run `wp bp group get totally-cool-group`
|
17 |
+
Then STDOUT should be a table containing rows:
|
18 |
+
| Field | Value |
|
19 |
+
| id | {GROUP_ID} |
|
20 |
+
| name | Totally Cool Group |
|
21 |
+
|
22 |
+
When I try `wp bp group get i-do-not-exist`
|
23 |
+
Then the return code should be 1
|
24 |
+
|
25 |
+
When I run `wp bp group update {GROUP_ID} --description=foo`
|
26 |
+
Then STDOUT should not be empty
|
27 |
+
|
28 |
+
When I run `wp bp group get {GROUP_ID}`
|
29 |
+
Then STDOUT should be a table containing rows:
|
30 |
+
| Field | Value |
|
31 |
+
| id | {GROUP_ID} |
|
32 |
+
| name | Totally Cool Group |
|
33 |
+
| description | foo |
|
34 |
+
| url | http://example.com/groups/totally-cool-group/ |
|
35 |
+
|
36 |
+
When I run `wp bp group delete {GROUP_ID} --yes`
|
37 |
+
Then STDOUT should contain:
|
38 |
+
"""
|
39 |
+
Success: Group successfully deleted.
|
40 |
+
"""
|
41 |
+
|
42 |
+
When I try `wp bp group get {GROUP_ID}`
|
43 |
+
Then the return code should be 1
|
44 |
+
|
45 |
+
Scenario: Group list
|
46 |
+
Given a BP install
|
47 |
+
|
48 |
+
When I run `wp bp group create --name="ZZZ Group 1" --slug=group1 --porcelain`
|
49 |
+
Then STDOUT should be a number
|
50 |
+
And save STDOUT as {GROUP_ONE_ID}
|
51 |
+
|
52 |
+
When I run `wp bp group create --name="AAA Group 2" --slug=group2 --porcelain`
|
53 |
+
Then STDOUT should be a number
|
54 |
+
And save STDOUT as {GROUP_TWO_ID}
|
55 |
+
|
56 |
+
When I run `wp bp group list --fields=id,name,slug`
|
57 |
+
Then STDOUT should be a table containing rows:
|
58 |
+
| id | name | slug |
|
59 |
+
| {GROUP_ONE_ID} | ZZZ Group 1 | group1 |
|
60 |
+
| {GROUP_TWO_ID} | AAA Group 2 | group2 |
|
61 |
+
|
62 |
+
When I run `wp bp group list --fields=id,name,slug --orderby=name`
|
63 |
+
Then STDOUT should be a table containing rows:
|
64 |
+
| id | name | slug |
|
65 |
+
| {GROUP_TWO_ID} | AAA Group 2 | group2 |
|
66 |
+
| {GROUP_ONE_ID} | ZZZ Group 1 | group1 |
|
67 |
+
|
68 |
+
When I run `wp bp group list --fields=id,name,slug --orderby=name --order=DESC`
|
69 |
+
Then STDOUT should be a table containing rows:
|
70 |
+
| id | name | slug |
|
71 |
+
| {GROUP_ONE_ID} | ZZZ Group 1 | group1 |
|
72 |
+
| {GROUP_TWO_ID} | AAA Group 2 | group2 |
|
73 |
+
|
74 |
+
When I run `wp user create testuser1 testuser1@example.com --porcelain`
|
75 |
+
Then STDOUT should be a number
|
76 |
+
And save STDOUT as {MEMBER_ID}
|
77 |
+
|
78 |
+
When I try `wp bp group list --fields=id --user-id={MEMBER_ID}`
|
79 |
+
Then the return code should be 1
|
80 |
+
|
81 |
+
When I run `wp bp group member create --group-id={GROUP_ONE_ID} --user-id={MEMBER_ID}`
|
82 |
+
Then the return code should be 0
|
83 |
+
|
84 |
+
When I run `wp bp group list --fields=id --user-id={MEMBER_ID}`
|
85 |
+
Then STDOUT should be a table containing rows:
|
86 |
+
| id |
|
87 |
+
| {GROUP_ONE_ID} |
|
cli/features/message.feature
ADDED
@@ -0,0 +1,105 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Feature: Manage BuddyPress Messages
|
2 |
+
|
3 |
+
Scenario: Message CRUD Operations
|
4 |
+
Given a BP install
|
5 |
+
|
6 |
+
When I run `wp user create testuser1 testuser1@example.com --porcelain`
|
7 |
+
Then STDOUT should be a number
|
8 |
+
And save STDOUT as {BOB_ID}
|
9 |
+
|
10 |
+
When I run `wp user create testuser2 testuser2@example.com --porcelain`
|
11 |
+
Then STDOUT should be a number
|
12 |
+
And save STDOUT as {SALLY_ID}
|
13 |
+
|
14 |
+
When I run `wp bp message send-notice --subject="Important Notice" --content="Notice Message"`
|
15 |
+
Then STDOUT should contain:
|
16 |
+
"""
|
17 |
+
Success: Notice was successfully sent.
|
18 |
+
"""
|
19 |
+
|
20 |
+
When I run `wp bp message create --from={BOB_ID} --to={SALLY_ID} --subject="Message" --content="Message Content" --porcelain`
|
21 |
+
Then STDOUT should be a number
|
22 |
+
And save STDOUT as {THREAD_ID}
|
23 |
+
|
24 |
+
When I run `wp bp message star-thread {THREAD_ID} --user-id={SALLY_ID}`
|
25 |
+
Then STDOUT should contain:
|
26 |
+
"""
|
27 |
+
Success: Thread was successfully starred.
|
28 |
+
"""
|
29 |
+
|
30 |
+
When I run `wp bp message unstar-thread {THREAD_ID} --user-id={SALLY_ID}`
|
31 |
+
Then STDOUT should contain:
|
32 |
+
"""
|
33 |
+
Success: Thread was successfully unstarred.
|
34 |
+
"""
|
35 |
+
|
36 |
+
When I run `wp bp message delete-thread {THREAD_ID} --user-id={SALLY_ID} --yes`
|
37 |
+
Then STDOUT should contain:
|
38 |
+
"""
|
39 |
+
Success: Thread successfully deleted.
|
40 |
+
"""
|
41 |
+
|
42 |
+
Scenario: Message list
|
43 |
+
Given a BP install
|
44 |
+
|
45 |
+
When I run `wp user create testuser2 testuser2@example.com --porcelain`
|
46 |
+
And save STDOUT as {BOB_ID}
|
47 |
+
|
48 |
+
When I run `wp user create testuser3 testuser3@example.com --porcelain`
|
49 |
+
And save STDOUT as {SALLY_ID}
|
50 |
+
|
51 |
+
When I try `wp bp message list --user-id={BOB_ID} --fields=id`
|
52 |
+
Then the return code should be 1
|
53 |
+
|
54 |
+
When I try `wp bp message list --user-id={SALLY_ID} --fields=id`
|
55 |
+
Then the return code should be 1
|
56 |
+
|
57 |
+
When I run `wp bp message create --from={BOB_ID} --to={SALLY_ID} --subject="Test Thread" --content="Message one" --porcelain`
|
58 |
+
Then STDOUT should be a number
|
59 |
+
And save STDOUT as {THREAD_ID}
|
60 |
+
|
61 |
+
When I run `wp bp message create --from={SALLY_ID} --thread-id={THREAD_ID} --subject="Test Answer" --content="Message two"`
|
62 |
+
Then STDOUT should contain:
|
63 |
+
"""
|
64 |
+
Success: Message successfully created.
|
65 |
+
"""
|
66 |
+
|
67 |
+
When I run `wp bp message create --from={BOB_ID} --thread-id={THREAD_ID} --subject="Another Answer" --content="Message three"`
|
68 |
+
Then STDOUT should contain:
|
69 |
+
"""
|
70 |
+
Success: Message successfully created.
|
71 |
+
"""
|
72 |
+
|
73 |
+
When I run `wp bp message list --user-id={BOB_ID} --fields=sender_id`
|
74 |
+
Then STDOUT should be a table containing rows:
|
75 |
+
| sender_id |
|
76 |
+
| {BOB_ID} |
|
77 |
+
| {SALLY_ID} |
|
78 |
+
|
79 |
+
When I run `wp bp message list --user-id={SALLY_ID} --fields=thread_id,sender_id,subject,message`
|
80 |
+
Then STDOUT should be a table containing rows:
|
81 |
+
| thread_id | sender_id | subject | message |
|
82 |
+
| {THREAD_ID} | {BOB_ID} | Test Thread | Message one |
|
83 |
+
| {THREAD_ID} | {SALLY_ID} | Test Answer | Message two |
|
84 |
+
| {THREAD_ID} | {BOB_ID} | Another Answer | Message three |
|
85 |
+
|
86 |
+
When I run `wp user create testuser4 testuser4@example.com --porcelain`
|
87 |
+
And save STDOUT as {JOHN_ID}
|
88 |
+
|
89 |
+
When I try `wp bp message list --user-id={JOHN_ID} --fields=id`
|
90 |
+
Then the return code should be 1
|
91 |
+
|
92 |
+
When I run `wp bp message create --from={JOHN_ID} --to={SALLY_ID} --subject="Second Thread" --content="Message four" --porcelain`
|
93 |
+
Then STDOUT should be a number
|
94 |
+
And save STDOUT as {ANOTHER_THREAD_ID}
|
95 |
+
|
96 |
+
When I run `wp bp message create --from={SALLY_ID} --thread-id={ANOTHER_THREAD_ID} --subject="Final Message" --content="Final Message"`
|
97 |
+
Then STDOUT should contain:
|
98 |
+
"""
|
99 |
+
Success: Message successfully created.
|
100 |
+
"""
|
101 |
+
|
102 |
+
When I run `wp bp message list --user-id={JOHN_ID} --fields=thread_id,sender_id,subject,message`
|
103 |
+
Then STDOUT should be a table containing rows:
|
104 |
+
| thread_id | sender_id | subject | message |
|
105 |
+
| {ANOTHER_THREAD_ID} | {JOHN_ID} | Second Thread | Message four |
|
cli/features/signup.feature
ADDED
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Feature: Manage BuddyPress Signups
|
2 |
+
|
3 |
+
Scenario: Signup CRUD Operations
|
4 |
+
Given a BP install
|
5 |
+
|
6 |
+
When I run `wp bp signup add --user-login=test_user --user-email=test@example.com --porcelain`
|
7 |
+
Then STDOUT should be a number
|
8 |
+
And save STDOUT as {SIGNUP_ID}
|
9 |
+
|
10 |
+
When I run `wp bp signup list --fields=signup_id,user_login,user_email`
|
11 |
+
Then STDOUT should be a table containing rows:
|
12 |
+
| signup_id | user_login | user_email |
|
13 |
+
| {SIGNUP_ID} | test_user | test@example.com |
|
14 |
+
|
15 |
+
When I run `wp bp signup delete {SIGNUP_ID} --yes`
|
16 |
+
Then STDOUT should contain:
|
17 |
+
"""
|
18 |
+
Success: Signup deleted.
|
19 |
+
"""
|
20 |
+
|
21 |
+
Scenario: Signup fetching by identifier
|
22 |
+
Given a BP install
|
23 |
+
|
24 |
+
When I run `wp bp signup add --user-login=signup1 --user-email=signup1@example.com --porcelain`
|
25 |
+
Then STDOUT should be a number
|
26 |
+
And save STDOUT as {SIGNUP_ONE_ID}
|
27 |
+
|
28 |
+
When I run `wp bp signup get {SIGNUP_ONE_ID} --fields=signup_id,user_login,user_email`
|
29 |
+
Then STDOUT should be a table containing rows:
|
30 |
+
| Field | Value |
|
31 |
+
| signup_id | {SIGNUP_ONE_ID} |
|
32 |
+
| user_login | signup1 |
|
33 |
+
| user_email | signup1@example.com |
|
34 |
+
|
35 |
+
When I run `wp bp signup add --user-login={SIGNUP_ONE_ID} --user-email=signup2@example.com --porcelain`
|
36 |
+
Then STDOUT should be a number
|
37 |
+
And save STDOUT as {SIGNUP_TWO_ID}
|
38 |
+
|
39 |
+
When I run `wp bp signup get {SIGNUP_ONE_ID} --fields=signup_id,user_login,user_email`
|
40 |
+
Then STDOUT should be a table containing rows:
|
41 |
+
| Field | Value |
|
42 |
+
| signup_id | {SIGNUP_ONE_ID} |
|
43 |
+
| user_login | signup1 |
|
44 |
+
| user_email | signup1@example.com |
|
45 |
+
|
46 |
+
When I run `wp bp signup get {SIGNUP_ONE_ID} --fields=signup_id,user_login,user_email --match-field=user_login`
|
47 |
+
Then STDOUT should be a table containing rows:
|
48 |
+
| Field | Value |
|
49 |
+
| signup_id | {SIGNUP_TWO_ID} |
|
50 |
+
| user_login | {SIGNUP_ONE_ID} |
|
51 |
+
| user_email | signup2@example.com |
|
52 |
+
|
53 |
+
Scenario: Signup activation
|
54 |
+
Given a BP install
|
55 |
+
|
56 |
+
When I run `wp bp signup add --user-login=test_user --user-email=test@example.com --porcelain`
|
57 |
+
Then STDOUT should be a number
|
58 |
+
And save STDOUT as {SIGNUP_ID}
|
59 |
+
|
60 |
+
When I run `wp bp signup activate {SIGNUP_ID}`
|
61 |
+
Then STDOUT should contain:
|
62 |
+
"""
|
63 |
+
Signup activated
|
64 |
+
"""
|
65 |
+
|
66 |
+
When I run `wp user get test_user --field=user_email`
|
67 |
+
Then STDOUT should contain:
|
68 |
+
"""
|
69 |
+
test@example.com
|
70 |
+
"""
|
71 |
+
|
72 |
+
Scenario: Signup resending
|
73 |
+
Given a BP install
|
74 |
+
|
75 |
+
When I run `wp bp signup add --user-login=test_user --user-email=test@example.com --porcelain`
|
76 |
+
Then STDOUT should be a number
|
77 |
+
And save STDOUT as {SIGNUP_ID}
|
78 |
+
|
79 |
+
When I run `wp bp signup resend {SIGNUP_ID}`
|
80 |
+
Then STDOUT should contain:
|
81 |
+
"""
|
82 |
+
success
|
83 |
+
"""
|
cli/features/steps/given-custom.php
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
use Behat\Gherkin\Node\PyStringNode,
|
4 |
+
Behat\Gherkin\Node\TableNode,
|
5 |
+
WP_CLI\Process;
|
6 |
+
|
7 |
+
$steps->Given( '/^a BP install$/',
|
8 |
+
function ( $world ) {
|
9 |
+
$world->install_wp();
|
10 |
+
$dest_dir = $world->variables['RUN_DIR'] . '/wp-content/plugins/buddypress/';
|
11 |
+
if ( ! is_dir( $dest_dir ) ) {
|
12 |
+
mkdir( $dest_dir );
|
13 |
+
}
|
14 |
+
|
15 |
+
$bp_src_dir = getenv( 'BP_SRC_DIR' );
|
16 |
+
if ( ! is_dir( $bp_src_dir ) ) {
|
17 |
+
throw new Exception( 'BuddyPress not found in BP_SRC_DIR' );
|
18 |
+
}
|
19 |
+
|
20 |
+
try {
|
21 |
+
$world->copy_dir( $bp_src_dir, $dest_dir );
|
22 |
+
$world->proc( 'wp plugin activate buddypress' )->run_check();
|
23 |
+
|
24 |
+
$components = array( 'friends', 'groups', 'xprofile', 'activity', 'messages' );
|
25 |
+
foreach ( $components as $component ) {
|
26 |
+
$world->proc( "wp bp component activate $component" )->run_check();
|
27 |
+
}
|
28 |
+
} catch ( Exception $e ) {};
|
29 |
+
}
|
30 |
+
);
|
cli/features/steps/given.php
ADDED
@@ -0,0 +1,213 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
use Behat\Gherkin\Node\PyStringNode,
|
4 |
+
Behat\Gherkin\Node\TableNode,
|
5 |
+
WP_CLI\Process;
|
6 |
+
|
7 |
+
$steps->Given( '/^an empty directory$/',
|
8 |
+
function ( $world ) {
|
9 |
+
$world->create_run_dir();
|
10 |
+
}
|
11 |
+
);
|
12 |
+
|
13 |
+
$steps->Given( '/^an? (empty|non-existent) ([^\s]+) directory$/',
|
14 |
+
function ( $world, $empty_or_nonexistent, $dir ) {
|
15 |
+
$dir = $world->replace_variables( $dir );
|
16 |
+
if ( ! WP_CLI\Utils\is_path_absolute( $dir ) ) {
|
17 |
+
$dir = $world->variables['RUN_DIR'] . "/$dir";
|
18 |
+
}
|
19 |
+
if ( 0 !== strpos( $dir, sys_get_temp_dir() ) ) {
|
20 |
+
throw new RuntimeException( sprintf( "Attempted to delete directory '%s' that is not in the temp directory '%s'. " . __FILE__ . ':' . __LINE__, $dir, sys_get_temp_dir() ) );
|
21 |
+
}
|
22 |
+
$world->remove_dir( $dir );
|
23 |
+
if ( 'empty' === $empty_or_nonexistent ) {
|
24 |
+
mkdir( $dir, 0777, true /*recursive*/ );
|
25 |
+
}
|
26 |
+
}
|
27 |
+
);
|
28 |
+
|
29 |
+
$steps->Given( '/^an empty cache/',
|
30 |
+
function ( $world ) {
|
31 |
+
$world->variables['SUITE_CACHE_DIR'] = FeatureContext::create_cache_dir();
|
32 |
+
}
|
33 |
+
);
|
34 |
+
|
35 |
+
$steps->Given( '/^an? ([^\s]+) file:$/',
|
36 |
+
function ( $world, $path, PyStringNode $content ) {
|
37 |
+
$content = (string) $content . "\n";
|
38 |
+
$full_path = $world->variables['RUN_DIR'] . "/$path";
|
39 |
+
$dir = dirname( $full_path );
|
40 |
+
if ( ! file_exists( $dir ) ) {
|
41 |
+
mkdir( $dir, 0777, true /*recursive*/ );
|
42 |
+
}
|
43 |
+
file_put_contents( $full_path, $content );
|
44 |
+
}
|
45 |
+
);
|
46 |
+
|
47 |
+
$steps->Given( '/^"([^"]+)" replaced with "([^"]+)" in the ([^\s]+) file$/', function( $world, $search, $replace, $path ) {
|
48 |
+
$full_path = $world->variables['RUN_DIR'] . "/$path";
|
49 |
+
$contents = file_get_contents( $full_path );
|
50 |
+
$contents = str_replace( $search, $replace, $contents );
|
51 |
+
file_put_contents( $full_path, $contents );
|
52 |
+
});
|
53 |
+
|
54 |
+
$steps->Given( '/^WP files$/',
|
55 |
+
function ( $world ) {
|
56 |
+
$world->download_wp();
|
57 |
+
}
|
58 |
+
);
|
59 |
+
|
60 |
+
$steps->Given( '/^wp-config\.php$/',
|
61 |
+
function ( $world ) {
|
62 |
+
$world->create_config();
|
63 |
+
}
|
64 |
+
);
|
65 |
+
|
66 |
+
$steps->Given( '/^a database$/',
|
67 |
+
function ( $world ) {
|
68 |
+
$world->create_db();
|
69 |
+
}
|
70 |
+
);
|
71 |
+
|
72 |
+
$steps->Given( '/^a WP install$/',
|
73 |
+
function ( $world ) {
|
74 |
+
$world->install_wp();
|
75 |
+
}
|
76 |
+
);
|
77 |
+
|
78 |
+
$steps->Given( "/^a WP install in '([^\s]+)'$/",
|
79 |
+
function ( $world, $subdir ) {
|
80 |
+
$world->install_wp( $subdir );
|
81 |
+
}
|
82 |
+
);
|
83 |
+
|
84 |
+
$steps->Given( '/^a WP install with Composer$/',
|
85 |
+
function ( $world ) {
|
86 |
+
$world->install_wp_with_composer();
|
87 |
+
}
|
88 |
+
);
|
89 |
+
|
90 |
+
$steps->Given( "/^a WP install with Composer and a custom vendor directory '([^\s]+)'$/",
|
91 |
+
function ( $world, $vendor_directory ) {
|
92 |
+
$world->install_wp_with_composer( $vendor_directory );
|
93 |
+
}
|
94 |
+
);
|
95 |
+
|
96 |
+
$steps->Given( '/^a WP multisite (subdirectory|subdomain)?\s?install$/',
|
97 |
+
function ( $world, $type = 'subdirectory' ) {
|
98 |
+
$world->install_wp();
|
99 |
+
$subdomains = ! empty( $type ) && 'subdomain' === $type ? 1 : 0;
|
100 |
+
$world->proc( 'wp core install-network', array( 'title' => 'WP CLI Network', 'subdomains' => $subdomains ) )->run_check();
|
101 |
+
}
|
102 |
+
);
|
103 |
+
|
104 |
+
$steps->Given( '/^these installed and active plugins:$/',
|
105 |
+
function( $world, $stream ) {
|
106 |
+
$plugins = implode( ' ', array_map( 'trim', explode( PHP_EOL, (string)$stream ) ) );
|
107 |
+
$world->proc( "wp plugin install $plugins --activate" )->run_check();
|
108 |
+
}
|
109 |
+
);
|
110 |
+
|
111 |
+
$steps->Given( '/^a custom wp-content directory$/',
|
112 |
+
function ( $world ) {
|
113 |
+
$wp_config_path = $world->variables['RUN_DIR'] . "/wp-config.php";
|
114 |
+
|
115 |
+
$wp_config_code = file_get_contents( $wp_config_path );
|
116 |
+
|
117 |
+
$world->move_files( 'wp-content', 'my-content' );
|
118 |
+
$world->add_line_to_wp_config( $wp_config_code,
|
119 |
+
"define( 'WP_CONTENT_DIR', dirname(__FILE__) . '/my-content' );" );
|
120 |
+
|
121 |
+
$world->move_files( 'my-content/plugins', 'my-plugins' );
|
122 |
+
$world->add_line_to_wp_config( $wp_config_code,
|
123 |
+
"define( 'WP_PLUGIN_DIR', __DIR__ . '/my-plugins' );" );
|
124 |
+
|
125 |
+
file_put_contents( $wp_config_path, $wp_config_code );
|
126 |
+
}
|
127 |
+
);
|
128 |
+
|
129 |
+
$steps->Given( '/^download:$/',
|
130 |
+
function ( $world, TableNode $table ) {
|
131 |
+
foreach ( $table->getHash() as $row ) {
|
132 |
+
$path = $world->replace_variables( $row['path'] );
|
133 |
+
if ( file_exists( $path ) ) {
|
134 |
+
// assume it's the same file and skip re-download
|
135 |
+
continue;
|
136 |
+
}
|
137 |
+
|
138 |
+
Process::create( \WP_CLI\Utils\esc_cmd( 'curl -sSL %s > %s', $row['url'], $path ) )->run_check();
|
139 |
+
}
|
140 |
+
}
|
141 |
+
);
|
142 |
+
|
143 |
+
$steps->Given( '/^save (STDOUT|STDERR) ([\'].+[^\'])?\s?as \{(\w+)\}$/',
|
144 |
+
function ( $world, $stream, $output_filter, $key ) {
|
145 |
+
|
146 |
+
$stream = strtolower( $stream );
|
147 |
+
|
148 |
+
if ( $output_filter ) {
|
149 |
+
$output_filter = '/' . trim( str_replace( '%s', '(.+[^\b])', $output_filter ), "' " ) . '/';
|
150 |
+
if ( false !== preg_match( $output_filter, $world->result->$stream, $matches ) )
|
151 |
+
$output = array_pop( $matches );
|
152 |
+
else
|
153 |
+
$output = '';
|
154 |
+
} else {
|
155 |
+
$output = $world->result->$stream;
|
156 |
+
}
|
157 |
+
$world->variables[ $key ] = trim( $output, "\n" );
|
158 |
+
}
|
159 |
+
);
|
160 |
+
|
161 |
+
$steps->Given( '/^a new Phar with (?:the same version|version "([^"]+)")$/',
|
162 |
+
function ( $world, $version = 'same' ) {
|
163 |
+
$world->build_phar( $version );
|
164 |
+
}
|
165 |
+
);
|
166 |
+
|
167 |
+
$steps->Given( '/^a downloaded Phar with (?:the same version|version "([^"]+)")$/',
|
168 |
+
function ( $world, $version = 'same' ) {
|
169 |
+
$world->download_phar( $version );
|
170 |
+
}
|
171 |
+
);
|
172 |
+
|
173 |
+
$steps->Given( '/^save the (.+) file ([\'].+[^\'])?as \{(\w+)\}$/',
|
174 |
+
function ( $world, $filepath, $output_filter, $key ) {
|
175 |
+
$full_file = file_get_contents( $world->replace_variables( $filepath ) );
|
176 |
+
|
177 |
+
if ( $output_filter ) {
|
178 |
+
$output_filter = '/' . trim( str_replace( '%s', '(.+[^\b])', $output_filter ), "' " ) . '/';
|
179 |
+
if ( false !== preg_match( $output_filter, $full_file, $matches ) )
|
180 |
+
$output = array_pop( $matches );
|
181 |
+
else
|
182 |
+
$output = '';
|
183 |
+
} else {
|
184 |
+
$output = $full_file;
|
185 |
+
}
|
186 |
+
$world->variables[ $key ] = trim( $output, "\n" );
|
187 |
+
}
|
188 |
+
);
|
189 |
+
|
190 |
+
$steps->Given('/^a misconfigured WP_CONTENT_DIR constant directory$/',
|
191 |
+
function($world) {
|
192 |
+
$wp_config_path = $world->variables['RUN_DIR'] . "/wp-config.php";
|
193 |
+
|
194 |
+
$wp_config_code = file_get_contents( $wp_config_path );
|
195 |
+
|
196 |
+
$world->add_line_to_wp_config( $wp_config_code,
|
197 |
+
"define( 'WP_CONTENT_DIR', '' );" );
|
198 |
+
|
199 |
+
file_put_contents( $wp_config_path, $wp_config_code );
|
200 |
+
}
|
201 |
+
);
|
202 |
+
|
203 |
+
$steps->Given( '/^a dependency on current wp-cli$/',
|
204 |
+
function ( $world ) {
|
205 |
+
$world->composer_require_current_wp_cli();
|
206 |
+
}
|
207 |
+
);
|
208 |
+
|
209 |
+
$steps->Given( '/^a PHP built-in web server$/',
|
210 |
+
function ( $world ) {
|
211 |
+
$world->start_php_server();
|
212 |
+
}
|
213 |
+
);
|
cli/features/steps/then.php
ADDED
@@ -0,0 +1,217 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
use Behat\Gherkin\Node\PyStringNode,
|
4 |
+
Behat\Gherkin\Node\TableNode;
|
5 |
+
|
6 |
+
$steps->Then( '/^the return code should be (\d+)$/',
|
7 |
+
function ( $world, $return_code ) {
|
8 |
+
if ( $return_code != $world->result->return_code ) {
|
9 |
+
throw new RuntimeException( $world->result );
|
10 |
+
}
|
11 |
+
}
|
12 |
+
);
|
13 |
+
|
14 |
+
$steps->Then( '/^(STDOUT|STDERR) should (be|contain|not contain):$/',
|
15 |
+
function ( $world, $stream, $action, PyStringNode $expected ) {
|
16 |
+
$stream = strtolower( $stream );
|
17 |
+
|
18 |
+
$expected = $world->replace_variables( (string) $expected );
|
19 |
+
|
20 |
+
checkString( $world->result->$stream, $expected, $action, $world->result );
|
21 |
+
}
|
22 |
+
);
|
23 |
+
|
24 |
+
$steps->Then( '/^(STDOUT|STDERR) should be a number$/',
|
25 |
+
function ( $world, $stream ) {
|
26 |
+
|
27 |
+
$stream = strtolower( $stream );
|
28 |
+
|
29 |
+
assertNumeric( trim( $world->result->$stream, "\n" ) );
|
30 |
+
}
|
31 |
+
);
|
32 |
+
|
33 |
+
$steps->Then( '/^(STDOUT|STDERR) should not be a number$/',
|
34 |
+
function ( $world, $stream ) {
|
35 |
+
|
36 |
+
$stream = strtolower( $stream );
|
37 |
+
|
38 |
+
assertNotNumeric( trim( $world->result->$stream, "\n" ) );
|
39 |
+
}
|
40 |
+
);
|
41 |
+
|
42 |
+
$steps->Then( '/^STDOUT should be a table containing rows:$/',
|
43 |
+
function ( $world, TableNode $expected ) {
|
44 |
+
$output = $world->result->stdout;
|
45 |
+
$actual_rows = explode( "\n", rtrim( $output, "\n" ) );
|
46 |
+
|
47 |
+
$expected_rows = array();
|
48 |
+
foreach ( $expected->getRows() as $row ) {
|
49 |
+
$expected_rows[] = $world->replace_variables( implode( "\t", $row ) );
|
50 |
+
}
|
51 |
+
|
52 |
+
compareTables( $expected_rows, $actual_rows, $output );
|
53 |
+
}
|
54 |
+
);
|
55 |
+
|
56 |
+
$steps->Then( '/^STDOUT should end with a table containing rows:$/',
|
57 |
+
function ( $world, TableNode $expected ) {
|
58 |
+
$output = $world->result->stdout;
|
59 |
+
$actual_rows = explode( "\n", rtrim( $output, "\n" ) );
|
60 |
+
|
61 |
+
$expected_rows = array();
|
62 |
+
foreach ( $expected->getRows() as $row ) {
|
63 |
+
$expected_rows[] = $world->replace_variables( implode( "\t", $row ) );
|
64 |
+
}
|
65 |
+
|
66 |
+
$start = array_search( $expected_rows[0], $actual_rows );
|
67 |
+
|
68 |
+
if ( false === $start )
|
69 |
+
throw new \Exception( $world->result );
|
70 |
+
|
71 |
+
compareTables( $expected_rows, array_slice( $actual_rows, $start ), $output );
|
72 |
+
}
|
73 |
+
);
|
74 |
+
|
75 |
+
$steps->Then( '/^STDOUT should be JSON containing:$/',
|
76 |
+
function ( $world, PyStringNode $expected ) {
|
77 |
+
$output = $world->result->stdout;
|
78 |
+
$expected = $world->replace_variables( (string) $expected );
|
79 |
+
|
80 |
+
if ( !checkThatJsonStringContainsJsonString( $output, $expected ) ) {
|
81 |
+
throw new \Exception( $world->result );
|
82 |
+
}
|
83 |
+
});
|
84 |
+
|
85 |
+
$steps->Then( '/^STDOUT should be a JSON array containing:$/',
|
86 |
+
function ( $world, PyStringNode $expected ) {
|
87 |
+
$output = $world->result->stdout;
|
88 |
+
$expected = $world->replace_variables( (string) $expected );
|
89 |
+
|
90 |
+
$actualValues = json_decode( $output );
|
91 |
+
$expectedValues = json_decode( $expected );
|
92 |
+
|
93 |
+
$missing = array_diff( $expectedValues, $actualValues );
|
94 |
+
if ( !empty( $missing ) ) {
|
95 |
+
throw new \Exception( $world->result );
|
96 |
+
}
|
97 |
+
});
|
98 |
+
|
99 |
+
$steps->Then( '/^STDOUT should be CSV containing:$/',
|
100 |
+
function ( $world, TableNode $expected ) {
|
101 |
+
$output = $world->result->stdout;
|
102 |
+
|
103 |
+
$expected_rows = $expected->getRows();
|
104 |
+
foreach ( $expected as &$row ) {
|
105 |
+
foreach ( $row as &$value ) {
|
106 |
+
$value = $world->replace_variables( $value );
|
107 |
+
}
|
108 |
+
}
|
109 |
+
|
110 |
+
if ( ! checkThatCsvStringContainsValues( $output, $expected_rows ) )
|
111 |
+
throw new \Exception( $world->result );
|
112 |
+
}
|
113 |
+
);
|
114 |
+
|
115 |
+
$steps->Then( '/^STDOUT should be YAML containing:$/',
|
116 |
+
function ( $world, PyStringNode $expected ) {
|
117 |
+
$output = $world->result->stdout;
|
118 |
+
$expected = $world->replace_variables( (string) $expected );
|
119 |
+
|
120 |
+
if ( !checkThatYamlStringContainsYamlString( $output, $expected ) ) {
|
121 |
+
throw new \Exception( $world->result );
|
122 |
+
}
|
123 |
+
});
|
124 |
+
|
125 |
+
$steps->Then( '/^(STDOUT|STDERR) should be empty$/',
|
126 |
+
function ( $world, $stream ) {
|
127 |
+
|
128 |
+
$stream = strtolower( $stream );
|
129 |
+
|
130 |
+
if ( !empty( $world->result->$stream ) ) {
|
131 |
+
throw new \Exception( $world->result );
|
132 |
+
}
|
133 |
+
}
|
134 |
+
);
|
135 |
+
|
136 |
+
$steps->Then( '/^(STDOUT|STDERR) should not be empty$/',
|
137 |
+
function ( $world, $stream ) {
|
138 |
+
|
139 |
+
$stream = strtolower( $stream );
|
140 |
+
|
141 |
+
if ( '' === rtrim( $world->result->$stream, "\n" ) ) {
|
142 |
+
throw new Exception( $world->result );
|
143 |
+
}
|
144 |
+
}
|
145 |
+
);
|
146 |
+
|
147 |
+
$steps->Then( '/^(STDOUT|STDERR) should be a version string (<|<=|>|>=|==|=|!=|<>) ([+\w.{}-]+)$/',
|
148 |
+
function ( $world, $stream, $operator, $goal_ver ) {
|
149 |
+
$goal_ver = $world->replace_variables( $goal_ver );
|
150 |
+
$stream = strtolower( $stream );
|
151 |
+
if ( false === version_compare( trim( $world->result->$stream, "\n" ), $goal_ver, $operator ) ) {
|
152 |
+
throw new Exception( $world->result );
|
153 |
+
}
|
154 |
+
}
|
155 |
+
);
|
156 |
+
|
157 |
+
$steps->Then( '/^the (.+) (file|directory) should (exist|not exist|be:|contain:|not contain:)$/',
|
158 |
+
function ( $world, $path, $type, $action, $expected = null ) {
|
159 |
+
$path = $world->replace_variables( $path );
|
160 |
+
|
161 |
+
// If it's a relative path, make it relative to the current test dir
|
162 |
+
if ( '/' !== $path[0] )
|
163 |
+
$path = $world->variables['RUN_DIR'] . "/$path";
|
164 |
+
|
165 |
+
if ( 'file' == $type ) {
|
166 |
+
$test = 'file_exists';
|
167 |
+
} else if ( 'directory' == $type ) {
|
168 |
+
$test = 'is_dir';
|
169 |
+
}
|
170 |
+
|
171 |
+
switch ( $action ) {
|
172 |
+
case 'exist':
|
173 |
+
if ( ! $test( $path ) ) {
|
174 |
+
throw new Exception( "$path doesn't exist." );
|
175 |
+
}
|
176 |
+
break;
|
177 |
+
case 'not exist':
|
178 |
+
if ( $test( $path ) ) {
|
179 |
+
throw new Exception( "$path exists." );
|
180 |
+
}
|
181 |
+
break;
|
182 |
+
default:
|
183 |
+
if ( ! $test( $path ) ) {
|
184 |
+
throw new Exception( "$path doesn't exist." );
|
185 |
+
}
|
186 |
+
$action = substr( $action, 0, -1 );
|
187 |
+
$expected = $world->replace_variables( (string) $expected );
|
188 |
+
if ( 'file' == $type ) {
|
189 |
+
$contents = file_get_contents( $path );
|
190 |
+
} else if ( 'directory' == $type ) {
|
191 |
+
$files = glob( rtrim( $path, '/' ) . '/*' );
|
192 |
+
foreach( $files as &$file ) {
|
193 |
+
$file = str_replace( $path . '/', '', $file );
|
194 |
+
}
|
195 |
+
$contents = implode( PHP_EOL, $files );
|
196 |
+
}
|
197 |
+
checkString( $contents, $expected, $action );
|
198 |
+
}
|
199 |
+
}
|
200 |
+
);
|
201 |
+
|
202 |
+
$steps->Then( '/^an email should (be sent|not be sent)$/', function( $world, $expected ) {
|
203 |
+
if ( 'be sent' === $expected ) {
|
204 |
+
assertNotEquals( 0, $world->email_sends );
|
205 |
+
} else if ( 'not be sent' === $expected ) {
|
206 |
+
assertEquals( 0, $world->email_sends );
|
207 |
+
} else {
|
208 |
+
throw new Exception( 'Invalid expectation' );
|
209 |
+
}
|
210 |
+
});
|
211 |
+
|
212 |
+
$steps->Then( '/^the HTTP status code should be (\d+)$/',
|
213 |
+
function ( $world, $return_code ) {
|
214 |
+
$response = \Requests::request( 'http://localhost:8080' );
|
215 |
+
assertEquals( $return_code, $response->status_code );
|
216 |
+
}
|
217 |
+
);
|
cli/features/steps/when.php
ADDED
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
use Behat\Gherkin\Node\PyStringNode,
|
4 |
+
Behat\Gherkin\Node\TableNode,
|
5 |
+
WP_CLI\Process;
|
6 |
+
|
7 |
+
function invoke_proc( $proc, $mode ) {
|
8 |
+
$map = array(
|
9 |
+
'run' => 'run_check',
|
10 |
+
'try' => 'run'
|
11 |
+
);
|
12 |
+
$method = $map[ $mode ];
|
13 |
+
|
14 |
+
return $proc->$method();
|
15 |
+
}
|
16 |
+
|
17 |
+
function capture_email_sends( $stdout ) {
|
18 |
+
$stdout = preg_replace( '#WP-CLI test suite: Sent email to.+\n?#', '', $stdout, -1, $email_sends );
|
19 |
+
return array( $stdout, $email_sends );
|
20 |
+
}
|
21 |
+
|
22 |
+
$steps->When( '/^I launch in the background `([^`]+)`$/',
|
23 |
+
function ( $world, $cmd ) {
|
24 |
+
$world->background_proc( $cmd );
|
25 |
+
}
|
26 |
+
);
|
27 |
+
|
28 |
+
$steps->When( '/^I (run|try) `([^`]+)`$/',
|
29 |
+
function ( $world, $mode, $cmd ) {
|
30 |
+
$cmd = $world->replace_variables( $cmd );
|
31 |
+
$world->result = invoke_proc( $world->proc( $cmd ), $mode );
|
32 |
+
list( $world->result->stdout, $world->email_sends ) = capture_email_sends( $world->result->stdout );
|
33 |
+
}
|
34 |
+
);
|
35 |
+
|
36 |
+
$steps->When( "/^I (run|try) `([^`]+)` from '([^\s]+)'$/",
|
37 |
+
function ( $world, $mode, $cmd, $subdir ) {
|
38 |
+
$cmd = $world->replace_variables( $cmd );
|
39 |
+
$world->result = invoke_proc( $world->proc( $cmd, array(), $subdir ), $mode );
|
40 |
+
list( $world->result->stdout, $world->email_sends ) = capture_email_sends( $world->result->stdout );
|
41 |
+
}
|
42 |
+
);
|
43 |
+
|
44 |
+
$steps->When( '/^I (run|try) the previous command again$/',
|
45 |
+
function ( $world, $mode ) {
|
46 |
+
if ( !isset( $world->result ) )
|
47 |
+
throw new \Exception( 'No previous command.' );
|
48 |
+
|
49 |
+
$proc = Process::create( $world->result->command, $world->result->cwd, $world->result->env );
|
50 |
+
$world->result = invoke_proc( $proc, $mode );
|
51 |
+
list( $world->result->stdout, $world->email_sends ) = capture_email_sends( $world->result->stdout );
|
52 |
+
}
|
53 |
+
);
|
54 |
+
|
cli/features/tool.feature
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Feature: Manage BuddyPress Tools
|
2 |
+
|
3 |
+
Scenario: BuddyPress repair
|
4 |
+
Given a BP install
|
5 |
+
|
6 |
+
When I run `wp bp tool repair friend-count`
|
7 |
+
Then STDOUT should contain:
|
8 |
+
"""
|
9 |
+
Complete!
|
10 |
+
"""
|
cli/features/xprofile-data.feature
ADDED
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Feature: Manage BuddyPress XProfile Data
|
2 |
+
|
3 |
+
Scenario: XProfile Data CRUD Operations
|
4 |
+
Given a BP install
|
5 |
+
|
6 |
+
When I run `wp bp xprofile group create --name="Group Name" --description="Group Description" --porcelain`
|
7 |
+
Then STDOUT should be a number
|
8 |
+
And save STDOUT as {GROUP_ID}
|
9 |
+
|
10 |
+
When I run `wp bp xprofile field create --field-group-id={GROUP_ID} --name="Field Name" --porcelain`
|
11 |
+
Then STDOUT should be a number
|
12 |
+
And save STDOUT as {FIELD_ID}
|
13 |
+
|
14 |
+
When I run `wp user create testuser1 testuser1@example.com --porcelain`
|
15 |
+
Then STDOUT should be a number
|
16 |
+
And save STDOUT as {USER_ID}
|
17 |
+
|
18 |
+
When I run `wp bp xprofile data set --field-id={FIELD_ID} --user-id={USER_ID} --value=foo`
|
19 |
+
Then STDOUT should contain:
|
20 |
+
"""
|
21 |
+
Updated
|
22 |
+
"""
|
23 |
+
|
24 |
+
When I run `wp bp xprofile data get --user-id={USER_ID} --field-id={FIELD_ID}`
|
25 |
+
Then STDOUT should be:
|
26 |
+
"""
|
27 |
+
foo
|
28 |
+
"""
|
29 |
+
|
30 |
+
When I run `wp bp xprofile data get --user-id={USER_ID}`
|
31 |
+
Then STDOUT should be a table containing rows:
|
32 |
+
| field_id | field_name | value |
|
33 |
+
| {FIELD_ID} | Field Name | "foo" |
|
34 |
+
|
35 |
+
When I try `wp bp xprofile data delete --user-id={USER_ID} --yes`
|
36 |
+
Then the return code should be 1
|
37 |
+
Then STDERR should contain:
|
38 |
+
"""
|
39 |
+
Either --field-id or --delete-all must be provided
|
40 |
+
"""
|
41 |
+
|
42 |
+
When I run `wp bp xprofile data delete --user-id={USER_ID} --field-id={FIELD_ID} --yes`
|
43 |
+
Then STDOUT should contain:
|
44 |
+
"""
|
45 |
+
XProfile data removed
|
46 |
+
"""
|
47 |
+
|
48 |
+
When I run `wp bp xprofile data get --user-id={USER_ID} --field-id={FIELD_ID}`
|
49 |
+
Then STDOUT should not contain:
|
50 |
+
"""
|
51 |
+
foo
|
52 |
+
"""
|
cli/features/xprofile-field.feature
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Feature: Manage BuddyPress XProfile Fields
|
2 |
+
|
3 |
+
Scenario: XProfile Field CRUD Operations
|
4 |
+
Given a BP install
|
5 |
+
|
6 |
+
When I run `wp bp xprofile group create --name="Group Name" --description="Group Description" --porcelain`
|
7 |
+
Then STDOUT should be a number
|
8 |
+
And save STDOUT as {GROUP_ID}
|
9 |
+
|
10 |
+
When I run `wp bp xprofile field create --type=checkbox --field-group-id={GROUP_ID} --name="Field Name" --porcelain`
|
11 |
+
Then STDOUT should be a number
|
12 |
+
And save STDOUT as {FIELD_ID}
|
13 |
+
|
14 |
+
When I run `wp bp xprofile field get {FIELD_ID}`
|
15 |
+
Then STDOUT should be a table containing rows:
|
16 |
+
| Field | Value |
|
17 |
+
| id | {FIELD_ID} |
|
18 |
+
| group_id | {GROUP_ID} |
|
19 |
+
| name | Field Name |
|
20 |
+
| type | checkbox |
|
21 |
+
|
22 |
+
When I run `wp bp xprofile field delete {FIELD_ID} --yes`
|
23 |
+
Then STDOUT should contain:
|
24 |
+
"""
|
25 |
+
Deleted XProfile field
|
26 |
+
"""
|
27 |
+
|
28 |
+
When I try `wp bp xprofile field delete {FIELD_ID} --yes`
|
29 |
+
Then the return code should be 1
|
cli/features/xprofile-group.feature
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Feature: Manage BuddyPress XProfile Groups
|
2 |
+
|
3 |
+
Scenario: XProfile Group CRUD operations
|
4 |
+
Given a BP install
|
5 |
+
|
6 |
+
When I run `wp bp xprofile group create --name="Group Name" --description="Group Description" --porcelain`
|
7 |
+
Then STDOUT should be a number
|
8 |
+
And save STDOUT as {GROUP_ID}
|
9 |
+
|
10 |
+
When I run `wp bp xprofile group get {GROUP_ID}`
|
11 |
+
Then STDOUT should be a table containing rows:
|
12 |
+
| Field | Value |
|
13 |
+
| id | {GROUP_ID} |
|
14 |
+
| name | Group Name |
|
15 |
+
| description | Group Description |
|
16 |
+
| can_delete | 1 |
|
17 |
+
| group_order | 0 |
|
18 |
+
|
19 |
+
When I run `wp bp xprofile group delete {GROUP_ID} --yes`
|
20 |
+
Then STDOUT should contain:
|
21 |
+
"""
|
22 |
+
Field group deleted.
|
23 |
+
"""
|
24 |
+
|
25 |
+
When I try `wp bp xprofile group get {GROUP_ID}`
|
26 |
+
Then the return code should be 1
|
cli/license.txt
ADDED
@@ -0,0 +1,280 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
GNU GENERAL PUBLIC LICENSE
|
2 |
+
Version 2, June 1991
|
3 |
+
|
4 |
+
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
5 |
+
675 Mass Ave, Cambridge, MA 02139, USA
|
6 |
+
Everyone is permitted to copy and distribute verbatim copies
|
7 |
+
of this license document, but changing it is not allowed.
|
8 |
+
|
9 |
+
Preamble
|
10 |
+
|
11 |
+
The licenses for most software are designed to take away your
|
12 |
+
freedom to share and change it. By contrast, the GNU General Public
|
13 |
+
License is intended to guarantee your freedom to share and change free
|
14 |
+
software--to make sure the software is free for all its users. This
|
15 |
+
General Public License applies to most of the Free Software
|
16 |
+
Foundation's software and to any other program whose authors commit to
|
17 |
+
using it. (Some other Free Software Foundation software is covered by
|
18 |
+
the GNU Library General Public License instead.) You can apply it to
|
19 |
+
your programs, too.
|
20 |
+
|
21 |
+
When we speak of free software, we are referring to freedom, not
|
22 |
+
price. Our General Public Licenses are designed to make sure that you
|
23 |
+
have the freedom to distribute copies of free software (and charge for
|
24 |
+
this service if you wish), that you receive source code or can get it
|
25 |
+
if you want it, that you can change the software or use pieces of it
|
26 |
+
in new free programs; and that you know you can do these things.
|
27 |
+
|
28 |
+
To protect your rights, we need to make restrictions that forbid
|
29 |
+
anyone to deny you these rights or to ask you to surrender the rights.
|
30 |
+
These restrictions translate to certain responsibilities for you if you
|
31 |
+
distribute copies of the software, or if you modify it.
|
32 |
+
|
33 |
+
For example, if you distribute copies of such a program, whether
|
34 |
+
gratis or for a fee, you must give the recipients all the rights that
|
35 |
+
you have. You must make sure that they, too, receive or can get the
|
36 |
+
source code. And you must show them these terms so they know their
|
37 |
+
rights.
|
38 |
+
|
39 |
+
We protect your rights with two steps: (1) copyright the software, and
|
40 |
+
(2) offer you this license which gives you legal permission to copy,
|
41 |
+
distribute and/or modify the software.
|
42 |
+
|
43 |
+
Also, for each author's protection and ours, we want to make certain
|
44 |
+
that everyone understands that there is no warranty for this free
|
45 |
+
software. If the software is modified by someone else and passed on, we
|
46 |
+
want its recipients to know that what they have is not the original, so
|
47 |
+
that any problems introduced by others will not reflect on the original
|
48 |
+
authors' reputations.
|
49 |
+
|
50 |
+
Finally, any free program is threatened constantly by software
|
51 |
+
patents. We wish to avoid the danger that redistributors of a free
|
52 |
+
program will individually obtain patent licenses, in effect making the
|
53 |
+
program proprietary. To prevent this, we have made it clear that any
|
54 |
+
patent must be licensed for everyone's free use or not licensed at all.
|
55 |
+
|
56 |
+
The precise terms and conditions for copying, distribution and
|
57 |
+
modification follow.
|
58 |
+
|
59 |
+
GNU GENERAL PUBLIC LICENSE
|
60 |
+
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
61 |
+
|
62 |
+
0. This License applies to any program or other work which contains
|
63 |
+
a notice placed by the copyright holder saying it may be distributed
|
64 |
+
under the terms of this General Public License. The "Program", below,
|
65 |
+
refers to any such program or work, and a "work based on the Program"
|
66 |
+
means either the Program or any derivative work under copyright law:
|
67 |
+
that is to say, a work containing the Program or a portion of it,
|
68 |
+
either verbatim or with modifications and/or translated into another
|
69 |
+
language. (Hereinafter, translation is included without limitation in
|
70 |
+
the term "modification".) Each licensee is addressed as "you".
|
71 |
+
|
72 |
+
Activities other than copying, distribution and modification are not
|
73 |
+
covered by this License; they are outside its scope. The act of
|
74 |
+
running the Program is not restricted, and the output from the Program
|
75 |
+
is covered only if its contents constitute a work based on the
|
76 |
+
Program (independent of having been made by running the Program).
|
77 |
+
Whether that is true depends on what the Program does.
|
78 |
+
|
79 |
+
1. You may copy and distribute verbatim copies of the Program's
|
80 |
+
source code as you receive it, in any medium, provided that you
|
81 |
+
conspicuously and appropriately publish on each copy an appropriate
|
82 |
+
copyright notice and disclaimer of warranty; keep intact all the
|
83 |
+
notices that refer to this License and to the absence of any warranty;
|
84 |
+
and give any other recipients of the Program a copy of this License
|
85 |
+
along with the Program.
|
86 |
+
|
87 |
+
You may charge a fee for the physical act of transferring a copy, and
|
88 |
+
you may at your option offer warranty protection in exchange for a fee.
|
89 |
+
|
90 |
+
2. You may modify your copy or copies of the Program or any portion
|
91 |
+
of it, thus forming a work based on the Program, and copy and
|
92 |
+
distribute such modifications or work under the terms of Section 1
|
93 |
+
above, provided that you also meet all of these conditions:
|
94 |
+
|
95 |
+
a) You must cause the modified files to carry prominent notices
|
96 |
+
stating that you changed the files and the date of any change.
|
97 |
+
|
98 |
+
b) You must cause any work that you distribute or publish, that in
|
99 |
+
whole or in part contains or is derived from the Program or any
|
100 |
+
part thereof, to be licensed as a whole at no charge to all third
|
101 |
+
parties under the terms of this License.
|
102 |
+
|
103 |
+
c) If the modified program normally reads commands interactively
|
104 |
+
when run, you must cause it, when started running for such
|
105 |
+
interactive use in the most ordinary way, to print or display an
|
106 |
+
announcement including an appropriate copyright notice and a
|
107 |
+
notice that there is no warranty (or else, saying that you provide
|
108 |
+
a warranty) and that users may redistribute the program under
|
109 |
+
these conditions, and telling the user how to view a copy of this
|
110 |
+
License. (Exception: if the Program itself is interactive but
|
111 |
+
does not normally print such an announcement, your work based on
|
112 |
+
the Program is not required to print an announcement.)
|
113 |
+
|
114 |
+
These requirements apply to the modified work as a whole. If
|
115 |
+
identifiable sections of that work are not derived from the Program,
|
116 |
+
and can be reasonably considered independent and separate works in
|
117 |
+
themselves, then this License, and its terms, do not apply to those
|
118 |
+
sections when you distribute them as separate works. But when you
|
119 |
+
distribute the same sections as part of a whole which is a work based
|
120 |
+
on the Program, the distribution of the whole must be on the terms of
|
121 |
+
this License, whose permissions for other licensees extend to the
|
122 |
+
entire whole, and thus to each and every part regardless of who wrote it.
|
123 |
+
Thus, it is not the intent of this section to claim rights or contest
|
124 |
+
your rights to work written entirely by you; rather, the intent is to
|
125 |
+
exercise the right to control the distribution of derivative or
|
126 |
+
collective works based on the Program.
|
127 |
+
|
128 |
+
In addition, mere aggregation of another work not based on the Program
|
129 |
+
with the Program (or with a work based on the Program) on a volume of
|
130 |
+
a storage or distribution medium does not bring the other work under
|
131 |
+
the scope of this License.
|
132 |
+
|
133 |
+
3. You may copy and distribute the Program (or a work based on it,
|
134 |
+
under Section 2) in object code or executable form under the terms of
|
135 |
+
Sections 1 and 2 above provided that you also do one of the following:
|
136 |
+
|
137 |
+
a) Accompany it with the complete corresponding machine-readable
|
138 |
+
source code, which must be distributed under the terms of Sections
|
139 |
+
1 and 2 above on a medium customarily used for software interchange; or,
|
140 |
+
|
141 |
+
b) Accompany it with a written offer, valid for at least three
|
142 |
+
years, to give any third party, for a charge no more than your
|
143 |
+
cost of physically performing source distribution, a complete
|
144 |
+
machine-readable copy of the corresponding source code, to be
|
145 |
+
distributed under the terms of Sections 1 and 2 above on a medium
|
146 |
+
customarily used for software interchange; or,
|
147 |
+
|
148 |
+
c) Accompany it with the information you received as to the offer
|
149 |
+
to distribute corresponding source code. (This alternative is
|
150 |
+
allowed only for noncommercial distribution and only if you
|
151 |
+
received the program in object code or executable form with such
|
152 |
+
an offer, in accord with Subsection b above.)
|
153 |
+
|
154 |
+
The source code for a work means the preferred form of the work for
|
155 |
+
making modifications to it. For an executable work, complete source
|
156 |
+
code means all the source code for all modules it contains, plus any
|
157 |
+
associated interface definition files, plus the scripts used to
|
158 |
+
control compilation and installation of the executable. However, as a
|
159 |
+
special exception, the source code distributed need not include
|
160 |
+
anything that is normally distributed (in either source or binary
|
161 |
+
form) with the major components (compiler, kernel, and so on) of the
|
162 |
+
operating system on which the executable runs, unless that component
|
163 |
+
itself accompanies the executable.
|
164 |
+
|
165 |
+
If distribution of executable or object code is made by offering
|
166 |
+
access to copy from a designated place, then offering equivalent
|
167 |
+
access to copy the source code from the same place counts as
|
168 |
+
distribution of the source code, even though third parties are not
|
169 |
+
compelled to copy the source along with the object code.
|
170 |
+
|
171 |
+
4. You may not copy, modify, sublicense, or distribute the Program
|
172 |
+
except as expressly provided under this License. Any attempt
|
173 |
+
otherwise to copy, modify, sublicense or distribute the Program is
|
174 |
+
void, and will automatically terminate your rights under this License.
|
175 |
+
However, parties who have received copies, or rights, from you under
|
176 |
+
this License will not have their licenses terminated so long as such
|
177 |
+
parties remain in full compliance.
|
178 |
+
|
179 |
+
5. You are not required to accept this License, since you have not
|
180 |
+
signed it. However, nothing else grants you permission to modify or
|
181 |
+
distribute the Program or its derivative works. These actions are
|
182 |
+
prohibited by law if you do not accept this License. Therefore, by
|
183 |
+
modifying or distributing the Program (or any work based on the
|
184 |
+
Program), you indicate your acceptance of this License to do so, and
|
185 |
+
all its terms and conditions for copying, distributing or modifying
|
186 |
+
the Program or works based on it.
|
187 |
+
|
188 |
+
6. Each time you redistribute the Program (or any work based on the
|
189 |
+
Program), the recipient automatically receives a license from the
|
190 |
+
original licensor to copy, distribute or modify the Program subject to
|
191 |
+
these terms and conditions. You may not impose any further
|
192 |
+
restrictions on the recipients' exercise of the rights granted herein.
|
193 |
+
You are not responsible for enforcing compliance by third parties to
|
194 |
+
this License.
|
195 |
+
|
196 |
+
7. If, as a consequence of a court judgment or allegation of patent
|
197 |
+
infringement or for any other reason (not limited to patent issues),
|
198 |
+
conditions are imposed on you (whether by court order, agreement or
|
199 |
+
otherwise) that contradict the conditions of this License, they do not
|
200 |
+
excuse you from the conditions of this License. If you cannot
|
201 |
+
distribute so as to satisfy simultaneously your obligations under this
|
202 |
+
License and any other pertinent obligations, then as a consequence you
|
203 |
+
may not distribute the Program at all. For example, if a patent
|
204 |
+
license would not permit royalty-free redistribution of the Program by
|
205 |
+
all those who receive copies directly or indirectly through you, then
|
206 |
+
the only way you could satisfy both it and this License would be to
|
207 |
+
refrain entirely from distribution of the Program.
|
208 |
+
|
209 |
+
If any portion of this section is held invalid or unenforceable under
|
210 |
+
any particular circumstance, the balance of the section is intended to
|
211 |
+
apply and the section as a whole is intended to apply in other
|
212 |
+
circumstances.
|
213 |
+
|
214 |
+
It is not the purpose of this section to induce you to infringe any
|
215 |
+
patents or other property right claims or to contest validity of any
|
216 |
+
such claims; this section has the sole purpose of protecting the
|
217 |
+
integrity of the free software distribution system, which is
|
218 |
+
implemented by public license practices. Many people have made
|
219 |
+
generous contributions to the wide range of software distributed
|
220 |
+
through that system in reliance on consistent application of that
|
221 |
+
system; it is up to the author/donor to decide if he or she is willing
|
222 |
+
to distribute software through any other system and a licensee cannot
|
223 |
+
impose that choice.
|
224 |
+
|
225 |
+
This section is intended to make thoroughly clear what is believed to
|
226 |
+
be a consequence of the rest of this License.
|
227 |
+
|
228 |
+
8. If the distribution and/or use of the Program is restricted in
|
229 |
+
certain countries either by patents or by copyrighted interfaces, the
|
230 |
+
original copyright holder who places the Program under this License
|
231 |
+
may add an explicit geographical distribution limitation excluding
|
232 |
+
those countries, so that distribution is permitted only in or among
|
233 |
+
countries not thus excluded. In such case, this License incorporates
|
234 |
+
the limitation as if written in the body of this License.
|
235 |
+
|
236 |
+
9. The Free Software Foundation may publish revised and/or new versions
|
237 |
+
of the General Public License from time to time. Such new versions will
|
238 |
+
be similar in spirit to the present version, but may differ in detail to
|
239 |
+
address new problems or concerns.
|
240 |
+
|
241 |
+
Each version is given a distinguishing version number. If the Program
|
242 |
+
specifies a version number of this License which applies to it and "any
|
243 |
+
later version", you have the option of following the terms and conditions
|
244 |
+
either of that version or of any later version published by the Free
|
245 |
+
Software Foundation. If the Program does not specify a version number of
|
246 |
+
this License, you may choose any version ever published by the Free Software
|
247 |
+
Foundation.
|
248 |
+
|
249 |
+
10. If you wish to incorporate parts of the Program into other free
|
250 |
+
programs whose distribution conditions are different, write to the author
|
251 |
+
to ask for permission. For software which is copyrighted by the Free
|
252 |
+
Software Foundation, write to the Free Software Foundation; we sometimes
|
253 |
+
make exceptions for this. Our decision will be guided by the two goals
|
254 |
+
of preserving the free status of all derivatives of our free software and
|
255 |
+
of promoting the sharing and reuse of software generally.
|
256 |
+
|
257 |
+
NO WARRANTY
|
258 |
+
|
259 |
+
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
260 |
+
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
261 |
+
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
262 |
+
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
263 |
+
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
264 |
+
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
265 |
+
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
266 |
+
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
267 |
+
REPAIR OR CORRECTION.
|
268 |
+
|
269 |
+
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
270 |
+
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
271 |
+
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
272 |
+
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
273 |
+
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
274 |
+
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
275 |
+
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
276 |
+
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
277 |
+
POSSIBILITY OF SUCH DAMAGES.
|
278 |
+
|
279 |
+
END OF TERMS AND CONDITIONS
|
280 |
+
|
cli/readme.md
ADDED
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# buddypress/wp-cli-buddypress
|
2 |
+
|
3 |
+
WP-CLI commands for use with BuddyPress.
|
4 |
+
|
5 |
+
[![Build Status](https://travis-ci.org/buddypress/wp-cli-buddypress.svg?branch=master)](https://travis-ci.org/buddypress/wp-cli-buddypress)
|
6 |
+
|
7 |
+
These commands may be in flux, as we work toward a potential merge into BuddyPress. See https://buddypress.trac.wordpress.org/ticket/7604.
|
8 |
+
|
9 |
+
Please use and provide feedback!
|
10 |
+
|
11 |
+
## System Requirements
|
12 |
+
|
13 |
+
* PHP >= 5.3
|
14 |
+
* wp-cli >= 0.23.0
|
15 |
+
* BuddyPress trunk (development version).
|
16 |
+
|
17 |
+
## Setup
|
18 |
+
|
19 |
+
* Install [wp-cli](https://wp-cli.org)
|
20 |
+
* Install wp-cli-buddypress. Manuall installation is recommended, though Composer installation should work too. See https://wp-cli.org/package-index/ for information.
|
21 |
+
* Inside of a WP installation, type `wp bp`. You should see a list of available commands.
|
22 |
+
|
23 |
+
## Changelog
|
24 |
+
|
25 |
+
### 1.6.0
|
26 |
+
|
27 |
+
* `bp email` commands introduced
|
28 |
+
* With PSR-4 support for the classes
|
29 |
+
|
30 |
+
### 1.5.0
|
31 |
+
|
32 |
+
* CRUD commands introduced to the main BuddyPress components
|
33 |
+
* Behat tests added for all commands
|
34 |
+
* Codebase fixed for WPCS
|
35 |
+
|
36 |
+
### 1.4.0
|
37 |
+
|
38 |
+
* New commands: `bp xprofile list_fields`, `bp xprofile delete_field`
|
39 |
+
* Added the ability to pass multiple comma-separated values when updating xprofile fields
|
40 |
+
* Fixed bug in component activation
|
41 |
+
|
42 |
+
### 1.3.1
|
43 |
+
|
44 |
+
* Improved logic for user-id parsing
|
45 |
+
|
46 |
+
### 1.3.0
|
47 |
+
|
48 |
+
* New commands: `bp group get_members`, `bp group update`
|
49 |
+
* Ability to pass 'content' when using `bp activity generate`
|
50 |
+
* When using `bp activity generate` with type=activity_update and component=groups, format the activity action properly
|
51 |
+
|
52 |
+
### 1.2.0
|
53 |
+
|
54 |
+
* Use wp-cli's new fourth-level commands
|
55 |
+
* New commands: xprofile create_group, xprofile create_field, xprofile set_data
|
56 |
+
|
57 |
+
### 1.1.1
|
58 |
+
|
59 |
+
* Ensure that components have their install routine run after activation
|
60 |
+
|
61 |
+
### 1.1
|
62 |
+
|
63 |
+
* New commands: activate, deactivate, activity_create, activity_generate
|
64 |
+
* Improved documentation
|
65 |
+
* Added support for installation via Composer
|
66 |
+
|
67 |
+
### 1.0
|
68 |
+
|
69 |
+
* Initial release
|
cli/utils/behat-tags.php
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Generate a list of tags to skip during the test run.
|
4 |
+
*
|
5 |
+
* Require a minimum version of WordPress:
|
6 |
+
*
|
7 |
+
* @require-wp-4.0
|
8 |
+
* Scenario: Core translation CRUD
|
9 |
+
*
|
10 |
+
* Then use in bash script:
|
11 |
+
*
|
12 |
+
* BEHAT_TAGS=$(php behat-tags.php)
|
13 |
+
* vendor/bin/behat --format progress $BEHAT_TAGS
|
14 |
+
*/
|
15 |
+
|
16 |
+
function version_tags( $prefix, $current, $operator = '<' ) {
|
17 |
+
if ( ! $current )
|
18 |
+
return array();
|
19 |
+
|
20 |
+
exec( "grep '@{$prefix}-[0-9\.]*' -h -o features/*.feature | uniq", $existing_tags );
|
21 |
+
|
22 |
+
$skip_tags = array();
|
23 |
+
|
24 |
+
foreach ( $existing_tags as $tag ) {
|
25 |
+
$compare = str_replace( "@{$prefix}-", '', $tag );
|
26 |
+
if ( version_compare( $current, $compare, $operator ) ) {
|
27 |
+
$skip_tags[] = $tag;
|
28 |
+
}
|
29 |
+
}
|
30 |
+
|
31 |
+
return $skip_tags;
|
32 |
+
}
|
33 |
+
|
34 |
+
$wp_version_reqs = array();
|
35 |
+
// Only apply @require-wp tags when WP_VERSION isn't 'latest' or 'nightly'
|
36 |
+
// 'latest' and 'nightly' are expected to work with all features
|
37 |
+
if ( ! in_array( getenv( 'WP_VERSION' ), array( 'latest', 'nightly', 'trunk' ), true ) ) {
|
38 |
+
$wp_version_reqs = version_tags( 'require-wp', getenv( 'WP_VERSION' ), '<' );
|
39 |
+
}
|
40 |
+
|
41 |
+
$skip_tags = array_merge(
|
42 |
+
$wp_version_reqs,
|
43 |
+
version_tags( 'require-php', PHP_VERSION, '<' ),
|
44 |
+
version_tags( 'less-than-php', PHP_VERSION, '>' )
|
45 |
+
);
|
46 |
+
|
47 |
+
# Skip Github API tests by default because of rate limiting. See https://github.com/wp-cli/wp-cli/issues/1612
|
48 |
+
$skip_tags[] = '@github-api';
|
49 |
+
|
50 |
+
# Skip tests known to be broken.
|
51 |
+
$skip_tags[] = '@broken';
|
52 |
+
|
53 |
+
# Require PHP extension, eg 'imagick'.
|
54 |
+
function extension_tags() {
|
55 |
+
$extension_tags = array();
|
56 |
+
exec( "grep '@require-extension-[A-Za-z_]*' -h -o features/*.feature | uniq", $extension_tags );
|
57 |
+
|
58 |
+
$skip_tags = array();
|
59 |
+
|
60 |
+
$substr_start = strlen( '@require-extension-' );
|
61 |
+
foreach ( $extension_tags as $tag ) {
|
62 |
+
$extension = substr( $tag, $substr_start );
|
63 |
+
if ( ! extension_loaded( $extension ) ) {
|
64 |
+
$skip_tags[] = $tag;
|
65 |
+
}
|
66 |
+
}
|
67 |
+
|
68 |
+
return $skip_tags;
|
69 |
+
}
|
70 |
+
|
71 |
+
$skip_tags = array_merge( $skip_tags, extension_tags() );
|
72 |
+
|
73 |
+
if ( !empty( $skip_tags ) ) {
|
74 |
+
echo '--tags=~' . implode( '&&~', $skip_tags );
|
75 |
+
}
|
76 |
+
|
cli/wp-cli-bp.php
ADDED
@@ -0,0 +1,190 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Buddypress\CLI;
|
3 |
+
|
4 |
+
use WP_CLI;
|
5 |
+
|
6 |
+
// Bail if WP-CLI is not present.
|
7 |
+
if ( ! defined( '\WP_CLI' ) ) {
|
8 |
+
return;
|
9 |
+
}
|
10 |
+
|
11 |
+
WP_CLI::add_hook( 'before_wp_load', function() {
|
12 |
+
require_once( __DIR__ . '/component.php' );
|
13 |
+
require_once( __DIR__ . '/components/signup.php' );
|
14 |
+
require_once( __DIR__ . '/components/activity.php' );
|
15 |
+
require_once( __DIR__ . '/components/activity-favorite.php' );
|
16 |
+
require_once( __DIR__ . '/components/component.php' );
|
17 |
+
require_once( __DIR__ . '/components/group.php' );
|
18 |
+
require_once( __DIR__ . '/components/group-member.php' );
|
19 |
+
require_once( __DIR__ . '/components/group-invite.php' );
|
20 |
+
require_once( __DIR__ . '/components/member.php' );
|
21 |
+
require_once( __DIR__ . '/components/friend.php' );
|
22 |
+
require_once( __DIR__ . '/components/xprofile-group.php' );
|
23 |
+
require_once( __DIR__ . '/components/xprofile-field.php' );
|
24 |
+
require_once( __DIR__ . '/components/xprofile-data.php' );
|
25 |
+
require_once( __DIR__ . '/components/tool.php' );
|
26 |
+
require_once( __DIR__ . '/components/message.php' );
|
27 |
+
require_once( __DIR__ . '/components/email.php' );
|
28 |
+
|
29 |
+
WP_CLI::add_command( 'bp signup', __NAMESPACE__ . '\\Command\\Signup', array(
|
30 |
+
'before_invoke' => function() {
|
31 |
+
if ( ! class_exists( 'Buddypress' ) ) {
|
32 |
+
WP_CLI::error( 'The BuddyPress plugin is not active.' );
|
33 |
+
}
|
34 |
+
},
|
35 |
+
) );
|
36 |
+
|
37 |
+
WP_CLI::add_command( 'bp email', __NAMESPACE__ . '\\Command\\Email', array(
|
38 |
+
'before_invoke' => function() {
|
39 |
+
if ( ! class_exists( 'Buddypress' ) ) {
|
40 |
+
WP_CLI::error( 'The BuddyPress plugin is not active.' );
|
41 |
+
}
|
42 |
+
},
|
43 |
+
) );
|
44 |
+
|
45 |
+
WP_CLI::add_command( 'bp activity', __NAMESPACE__ . '\\Command\\Activity', array(
|
46 |
+
'before_invoke' => function() {
|
47 |
+
if ( ! class_exists( 'Buddypress' ) ) {
|
48 |
+
WP_CLI::error( 'The BuddyPress plugin is not active.' );
|
49 |
+
}
|
50 |
+
|
51 |
+
if ( ! bp_is_active( 'activity' ) ) {
|
52 |
+
WP_CLI::error( 'The Activity component is not active.' );
|
53 |
+
}
|
54 |
+
},
|
55 |
+
) );
|
56 |
+
|
57 |
+
WP_CLI::add_command( 'bp activity favorite', __NAMESPACE__ . '\\Command\\Activity_Favorite', array(
|
58 |
+
'before_invoke' => function() {
|
59 |
+
if ( ! class_exists( 'Buddypress' ) ) {
|
60 |
+
WP_CLI::error( 'The BuddyPress plugin is not active.' );
|
61 |
+
}
|
62 |
+
|
63 |
+
if ( ! bp_is_active( 'activity' ) ) {
|
64 |
+
WP_CLI::error( 'The Activity component is not active.' );
|
65 |
+
}
|
66 |
+
},
|
67 |
+
) );
|
68 |
+
|
69 |
+
WP_CLI::add_command( 'bp component', __NAMESPACE__ . '\\Command\\Components', array(
|
70 |
+
'before_invoke' => function() {
|
71 |
+
if ( ! class_exists( 'Buddypress' ) ) {
|
72 |
+
WP_CLI::error( 'The BuddyPress plugin is not active.' );
|
73 |
+
}
|
74 |
+
},
|
75 |
+
) );
|
76 |
+
|
77 |
+
WP_CLI::add_command( 'bp group', __NAMESPACE__ . '\\Command\\Group', array(
|
78 |
+
'before_invoke' => function() {
|
79 |
+
if ( ! class_exists( 'Buddypress' ) ) {
|
80 |
+
WP_CLI::error( 'The BuddyPress plugin is not active.' );
|
81 |
+
}
|
82 |
+
|
83 |
+
if ( ! bp_is_active( 'groups' ) ) {
|
84 |
+
WP_CLI::error( 'The Groups component is not active.' );
|
85 |
+
}
|
86 |
+
},
|
87 |
+
) );
|
88 |
+
|
89 |
+
WP_CLI::add_command( 'bp group member', __NAMESPACE__ . '\\Command\\Group_Member', array(
|
90 |
+
'before_invoke' => function() {
|
91 |
+
if ( ! class_exists( 'Buddypress' ) ) {
|
92 |
+
WP_CLI::error( 'The BuddyPress plugin is not active.' );
|
93 |
+
}
|
94 |
+
|
95 |
+
if ( ! bp_is_active( 'groups' ) ) {
|
96 |
+
WP_CLI::error( 'The Groups component is not active.' );
|
97 |
+
}
|
98 |
+
},
|
99 |
+
) );
|
100 |
+
|
101 |
+
WP_CLI::add_command( 'bp group invite', __NAMESPACE__ . '\\Command\\Group_Invite', array(
|
102 |
+
'before_invoke' => function() {
|
103 |
+
if ( ! class_exists( 'Buddypress' ) ) {
|
104 |
+
WP_CLI::error( 'The BuddyPress plugin is not active.' );
|
105 |
+
}
|
106 |
+
|
107 |
+
if ( ! bp_is_active( 'groups' ) ) {
|
108 |
+
WP_CLI::error( 'The Groups component is not active.' );
|
109 |
+
}
|
110 |
+
},
|
111 |
+
) );
|
112 |
+
|
113 |
+
WP_CLI::add_command( 'bp member', __NAMESPACE__ . '\\Command\\Member', array(
|
114 |
+
'before_invoke' => function() {
|
115 |
+
if ( ! class_exists( 'Buddypress' ) ) {
|
116 |
+
WP_CLI::error( 'The BuddyPress plugin is not active.' );
|
117 |
+
}
|
118 |
+
},
|
119 |
+
) );
|
120 |
+
|
121 |
+
WP_CLI::add_command( 'bp friend', __NAMESPACE__ . '\\Command\\Friend', array(
|
122 |
+
'before_invoke' => function() {
|
123 |
+
if ( ! class_exists( 'Buddypress' ) ) {
|
124 |
+
WP_CLI::error( 'The BuddyPress plugin is not active.' );
|
125 |
+
}
|
126 |
+
|
127 |
+
if ( ! bp_is_active( 'friends' ) ) {
|
128 |
+
WP_CLI::error( 'The Friends component is not active.' );
|
129 |
+
}
|
130 |
+
},
|
131 |
+
) );
|
132 |
+
|
133 |
+
WP_CLI::add_command( 'bp xprofile group', __NAMESPACE__ . '\\Command\\XProfile_Group', array(
|
134 |
+
'before_invoke' => function() {
|
135 |
+
if ( ! class_exists( 'Buddypress' ) ) {
|
136 |
+
WP_CLI::error( 'The BuddyPress plugin is not active.' );
|
137 |
+
}
|
138 |
+
|
139 |
+
if ( ! bp_is_active( 'xprofile' ) ) {
|
140 |
+
WP_CLI::error( 'The XProfile component is not active.' );
|
141 |
+
}
|
142 |
+
},
|
143 |
+
) );
|
144 |
+
|
145 |
+
WP_CLI::add_command( 'bp xprofile field', __NAMESPACE__ . '\\Command\\XProfile_Field', array(
|
146 |
+
'before_invoke' => function() {
|
147 |
+
if ( ! class_exists( 'Buddypress' ) ) {
|
148 |
+
WP_CLI::error( 'The BuddyPress plugin is not active.' );
|
149 |
+
}
|
150 |
+
|
151 |
+
if ( ! bp_is_active( 'xprofile' ) ) {
|
152 |
+
WP_CLI::error( 'The XProfile component is not active.' );
|
153 |
+
}
|
154 |
+
},
|
155 |
+
) );
|
156 |
+
|
157 |
+
WP_CLI::add_command( 'bp xprofile data', __NAMESPACE__ . '\\Command\\XProfile_Data', array(
|
158 |
+
'before_invoke' => function() {
|
159 |
+
if ( ! class_exists( 'Buddypress' ) ) {
|
160 |
+
WP_CLI::error( 'The BuddyPress plugin is not active.' );
|
161 |
+
}
|
162 |
+
|
163 |
+
if ( ! bp_is_active( 'xprofile' ) ) {
|
164 |
+
WP_CLI::error( 'The XProfile component is not active.' );
|
165 |
+
}
|
166 |
+
},
|
167 |
+
) );
|
168 |
+
|
169 |
+
WP_CLI::add_command( 'bp tool', __NAMESPACE__ . '\\Command\\Tool', array(
|
170 |
+
'before_invoke' => function() {
|
171 |
+
if ( ! class_exists( 'Buddypress' ) ) {
|
172 |
+
WP_CLI::error( 'The BuddyPress plugin is not active.' );
|
173 |
+
}
|
174 |
+
|
175 |
+
require_once( buddypress()->plugin_dir . 'bp-core/admin/bp-core-admin-tools.php' );
|
176 |
+
},
|
177 |
+
) );
|
178 |
+
|
179 |
+
WP_CLI::add_command( 'bp message', __NAMESPACE__ . '\\Command\\Message', array(
|
180 |
+
'before_invoke' => function() {
|
181 |
+
if ( ! class_exists( 'Buddypress' ) ) {
|
182 |
+
WP_CLI::error( 'The BuddyPress plugin is not active.' );
|
183 |
+
}
|
184 |
+
|
185 |
+
if ( ! bp_is_active( 'messages' ) ) {
|
186 |
+
WP_CLI::error( 'The Message component is not active.' );
|
187 |
+
}
|
188 |
+
},
|
189 |
+
) );
|
190 |
+
} );
|
cli/wp-cli.yml
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
1 |
+
require:
|
2 |
+
- wp-cli-bp.php
|