-
Notifications
You must be signed in to change notification settings - Fork 846
Try sorting users list by email or username #41623
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Try sorting users list by email or username #41623
Conversation
|
Are you an Automattician? Please test your changes on all WordPress.com environments to help mitigate accidental explosions.
Interested in more tips and information?
|
|
Thank you for your PR! When contributing to Jetpack, we have a few suggestions that can help us test and review your patch:
This comment will be updated as you work on your PR and make changes. If you think that some of those checks are not needed for your PR, please explain why you think so. Thanks for cooperation 🤖 The e2e test report can be found here. Please note that it can take a few minutes after the e2e tests checks are complete for the report to be available. Follow this PR Review Process:
Still unsure? Reach out in #jetpack-developers for guidance! Jetpack plugin: The Jetpack plugin has different release cadences depending on the platform:
If you have any questions about the release process, please ask in the #jetpack-releases channel on Slack. |
Code Coverage SummaryCoverage changed in 1 file.
Full summary · PHP report · JS report Add label
I don't care about code coverage for this PR
|
|
Question re the code coverage failure: are there tests for this endpoint anywhere? I couldn't find any in the PHP tests folder. Should I be looking somewhere else? |
There are no tests for that endpoint yet, no. You'd find that file in You could create your own though :) |
If it helps I created a basic test over in https://github.com/Automattic/jetpack/pull/41707/files. The test doesn't actually relate to my PR but I thought I'd add it coz it was missing. Probably easier to move it to this PR? |
If yours isn't close to being ready I guess we could do that! Then I can add maybe add a test for the behaviour in this PR. |
Code Coverage SummaryCoverage changed in 1 file.
Full summary · PHP report · JS report If appropriate, add one of these labels to override the failing coverage check:
Covered by non-unit tests
|
| if ( 'desc' === strtolower( $order ) ) { | ||
| return gmp_neg( strcmp( strtolower( $a->{$orderby} ), strtolower( $b->{$orderby} ) ) ); | ||
| } | ||
| return strcmp( strtolower( $a->{$orderby} ), strtolower( $b->{$orderby} ) ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like this is the only way we can do it.
As a follow up, I also think we need to dedupe the combined array for users that are both Viewers and something else. See: #28317 (comment)
Going forward, it might be an idea to remove the Viewer role when a user changes roles. I'm not sure since the Viewer role is special - an Editor might still want to be a Viewer so they can preview the private site, if that's the way it works 🤷🏻
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pretty sure any role can preview a private site. I've spent a lot of testing time creating wordpress.com accounts for all my alt emails and adding them to several of my private sites 😂
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You're right. I think we should immediately revoke the Viewer status when a Viewer's role changes
Mentioned in pdgR5j-1dB-p2
| return strcmp( strtolower( $a->name ), strtolower( $b->name ) ); | ||
| function ( $a, $b ) use ( $order, $orderby ) { | ||
| if ( 'desc' === strtolower( $order ) ) { | ||
| return gmp_neg( strcmp( strtolower( $a->{$orderby} ), strtolower( $b->{$orderby} ) ) ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Working great, and as expected for me 🎉
Looking at the docs, I think a simple negation would be sufficient here. The gmp_neg() function is for working with the GMP library.
Also, probably paranoid, but it might not hurt to check that the properties are available before using them, e.g,
usort(
$combined_users,
function ( $a, $b ) use ( $order, $orderby ) {
$val_a = isset( $a->{$orderby} ) ? $a->{$orderby} : '';
$val_b = isset( $b->{$orderby} ) ? $b->{$orderby} : '';
$result = strcmp( strtolower( $val_a ), strtolower( $val_b ) );
return ( 'desc' === strtolower( $order ) ) ? -$result : $result;
}
);There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
'desc' === strtolower( $order )
I guess this could be outside the usort too 👍🏻
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah that makes sense!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, probably paranoid, but it might not hurt to check that the properties are available before using them, e.g,
I'm setting default values for both $order and $orderby above, so they will always exist at this point.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm setting default values for both $order and $orderby above, so they will always exist at this point.
Ah, does that include the user properties accessed by $[ a | b ]->{$orderby} 🤔
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah I see what you mean. Those properties should always exist as long as we're using the same user object, but they might conceivably be empty. If that happens though, the value is an empty string anyway so setting it explicitly to empty string won't make a difference.
| } | ||
|
|
||
| $order = strtolower( $args['order'] ) ?? 'asc'; | ||
| $orderby = strtolower( $args['order_by'] ) ?? 'name'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't get this error? Why would the right hand side be unnecessary? $args['order'] could well be an empty string.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Apologies if this comment isn't helpful (it's my first review comment in 3 months so my confidence is quite low 😄). As I understand it, the strtolower() function will always return a string (even an empty string), and the null coalescing operator will only return the right operand if the left is null (an empty string will result in the left operand winning).
In this case, would a ternary work? Something like:
$orderby = ! empty( $args['order_by'] ) ? strtolower( $args['order_by'] ) : 'name';There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good catch. I'm pretty sure, for example, 'asc' will never actually be assigned to $order, because the null coalescing operator will use the empty string from strtolower (assuming $args['order'] exists)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh I see that makes sense! Yes I think in this case we'll have to use a ternary.
06c6816 to
a6dcb95
Compare
jeherve
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm getting a PHP warning when testing this:
Warning: Undefined property: stdClass::$id in /home/wpcom/public_html/wp-content/mu-plugins/jetpack-plugin/sun/json-endpoints/class.wpcom-json-api-list-users-endpoint.php on line 254
Oh weird, are you getting that on your local env or when running the unit tests @jeherve ? |
This was on my WordPress.com sandbox. |
|
I'm closing this one for now as we're not migrating the Users screen anytime soon. Thanks for the reviews folks! |
Proposed changes:
When the output of the users list endpoint includes viewers, make it possible to sort by login or email.
This is needed to display viewers in the
wp-admin/users.phpview, as part of Automattic/wp-calypso#98386.Other information:
Jetpack product discussion
Does this pull request change what data or activity we track or use?
Testing instructions:
/wp-admin/users.phpon a simple site. Make sure classic view is enabled!