Skip to content
Snippets Groups Projects
Unverified Commit 36bf50ef authored by Sameer Al-Sakran's avatar Sameer Al-Sakran Committed by GitHub
Browse files

Merge pull request #7574 from metabase/sort-users-list

Sort the /admin/people list by last_name & first_name
parents c488057b 92e79749
No related branches found
No related tags found
No related merge requests found
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
import React, { Component } from "react"; import React, { Component } from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { Link } from "react-router"; import { Link } from "react-router";
import _ from "underscore";
import { connect } from "react-redux"; import { connect } from "react-redux";
import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
...@@ -30,7 +29,7 @@ export const MODAL_RESET_PASSWORD_EMAIL = "MODAL_RESET_PASSWORD_EMAIL"; ...@@ -30,7 +29,7 @@ export const MODAL_RESET_PASSWORD_EMAIL = "MODAL_RESET_PASSWORD_EMAIL";
export const MODAL_USER_ADDED_WITH_INVITE = "MODAL_USER_ADDED_WITH_INVITE"; export const MODAL_USER_ADDED_WITH_INVITE = "MODAL_USER_ADDED_WITH_INVITE";
export const MODAL_USER_ADDED_WITH_PASSWORD = "MODAL_USER_ADDED_WITH_PASSWORD"; export const MODAL_USER_ADDED_WITH_PASSWORD = "MODAL_USER_ADDED_WITH_PASSWORD";
import { getUsers, getModal, getGroups } from "../selectors"; import { getSortedUsers, getModal, getGroups } from "../selectors";
import { import {
createUser, createUser,
deleteUser, deleteUser,
...@@ -48,7 +47,7 @@ import { ...@@ -48,7 +47,7 @@ import {
const mapStateToProps = (state, props) => { const mapStateToProps = (state, props) => {
return { return {
users: getUsers(state, props), users: getSortedUsers(state, props),
modal: getModal(state, props), modal: getModal(state, props),
user: state.currentUser, user: state.currentUser,
groups: getGroups(state, props), groups: getGroups(state, props),
...@@ -402,8 +401,6 @@ export default class PeopleListingApp extends Component { ...@@ -402,8 +401,6 @@ export default class PeopleListingApp extends Component {
let { modal, users, groups } = this.props; let { modal, users, groups } = this.props;
let { error } = this.state; let { error } = this.state;
users = _.values(users).sort((a, b) => b.date_joined - a.date_joined);
return ( return (
<LoadingAndErrorWrapper loading={!users} error={error}> <LoadingAndErrorWrapper loading={!users} error={error}>
{() => ( {() => (
......
...@@ -23,3 +23,19 @@ export const getUsers = createSelector( ...@@ -23,3 +23,19 @@ export const getUsers = createSelector(
.value(), .value(),
})), })),
); );
// sort the users list by last_name, ignore case or diacritical marks. If last names are the same then compare by first
// name
const compareNames = (a, b) =>
a.localeCompare(b, undefined, { sensitivty: "base" });
export const getSortedUsers = createSelector(
[getUsers],
users =>
users &&
_.values(users).sort(
(a, b) =>
compareNames(a.last_name, b.last_name) ||
compareNames(a.first_name, b.first_name),
),
);
...@@ -23,7 +23,9 @@ ...@@ -23,7 +23,9 @@
"Fetch a list of all active `Users` for the admin People page." "Fetch a list of all active `Users` for the admin People page."
[] []
(db/select [User :id :first_name :last_name :email :is_superuser :google_auth :ldap_auth :last_login] (db/select [User :id :first_name :last_name :email :is_superuser :google_auth :ldap_auth :last_login]
:is_active true)) :is_active true
{:order-by [[:%lower.last_name :asc]
[:%lower.first_name :asc]]}))
(defn- reactivate-user! [existing-user first-name last-name] (defn- reactivate-user! [existing-user first-name last-name]
(when-not (:is_active existing-user) (when-not (:is_active existing-user)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment