From 42cae3f4ab3e8ec29ad11b49b5c3c9e1725d6a97 Mon Sep 17 00:00:00 2001 From: Jared Scheib Date: Thu, 30 Nov 2017 19:53:14 -0800 Subject: [PATCH 1/2] Disable 'Remove' button for self in Chronograf UsersTable Add propTypes definition for 'users' in Chronograf AdminTabs Add 'disabled' prop to DeleteConfirmButtons --- .../admin/components/chronograf/AdminTabs.js | 26 ++++++++++++++++--- .../admin/components/chronograf/UsersTable.js | 4 ++- .../components/chronograf/UsersTableRow.js | 3 +++ .../admin/containers/AdminChronografPage.js | 19 +++++++++----- .../shared/components/DeleteConfirmButtons.js | 10 ++++--- 5 files changed, 48 insertions(+), 14 deletions(-) diff --git a/ui/src/admin/components/chronograf/AdminTabs.js b/ui/src/admin/components/chronograf/AdminTabs.js index c0f506684..3bbf51484 100644 --- a/ui/src/admin/components/chronograf/AdminTabs.js +++ b/ui/src/admin/components/chronograf/AdminTabs.js @@ -22,6 +22,7 @@ const AdminTabs = ({ onUpdateUserRole, onUpdateUserSuperAdmin, onDeleteUser, + meID, }) => { const tabs = [ { @@ -40,6 +41,7 @@ const AdminTabs = ({ onUpdateUserRole={onUpdateUserRole} onUpdateUserSuperAdmin={onUpdateUserSuperAdmin} onDeleteUser={onDeleteUser} + meID={meID} /> ), }, @@ -65,16 +67,34 @@ const AdminTabs = ({ ) } -const {arrayOf, func, shape, string} = PropTypes +const {arrayOf, bool, func, shape, string} = PropTypes AdminTabs.propTypes = { meRole: string.isRequired, + meID: string.isRequired, // UsersTable - users: arrayOf(shape()), + users: arrayOf( + shape({ + id: string, + links: shape({ + self: string.isRequired, + }), + name: string.isRequired, + provider: string.isRequired, + roles: arrayOf( + shape({ + name: string.isRequired, + organization: string.isRequired, + }) + ), + scheme: string.isRequired, + superAdmin: bool, + }) + ).isRequired, organization: shape({ name: string.isRequired, id: string.isRequired, - }), + }).isRequired, onCreateUser: func.isRequired, onUpdateUserRole: func.isRequired, onUpdateUserSuperAdmin: func.isRequired, diff --git a/ui/src/admin/components/chronograf/UsersTable.js b/ui/src/admin/components/chronograf/UsersTable.js index b5aaa45ef..587248393 100644 --- a/ui/src/admin/components/chronograf/UsersTable.js +++ b/ui/src/admin/components/chronograf/UsersTable.js @@ -40,7 +40,7 @@ class UsersTable extends Component { } render() { - const {organization, users, onCreateUser} = this.props + const {organization, users, onCreateUser, meID} = this.props const {isCreatingUser} = this.state const { @@ -94,6 +94,7 @@ class UsersTable extends Component { onChangeUserRole={this.handleChangeUserRole} onChangeSuperAdmin={this.handleChangeSuperAdmin} onDelete={this.handleDeleteUser} + meID={meID} /> ) : @@ -130,5 +131,6 @@ UsersTable.propTypes = { onUpdateUserRole: func.isRequired, onUpdateUserSuperAdmin: func.isRequired, onDeleteUser: func.isRequired, + meID: string.isRequired, } export default UsersTable diff --git a/ui/src/admin/components/chronograf/UsersTableRow.js b/ui/src/admin/components/chronograf/UsersTableRow.js index fe63309f0..bf3ca87aa 100644 --- a/ui/src/admin/components/chronograf/UsersTableRow.js +++ b/ui/src/admin/components/chronograf/UsersTableRow.js @@ -15,6 +15,7 @@ const UsersTableRow = ({ onChangeUserRole, onChangeSuperAdmin, onDelete, + meID, }) => { const {colRole, colSuperAdmin, colProvider, colScheme} = USERS_TABLE @@ -65,6 +66,7 @@ const UsersTableRow = ({ onDelete={onDelete} item={user} buttonSize="btn-xs" + disabled={user.id === meID} /> ) @@ -81,6 +83,7 @@ UsersTableRow.propTypes = { onChangeUserRole: func.isRequired, onChangeSuperAdmin: func.isRequired, onDelete: func.isRequired, + meID: string.isRequired, } export default UsersTableRow diff --git a/ui/src/admin/containers/AdminChronografPage.js b/ui/src/admin/containers/AdminChronografPage.js index b3f376e8c..f4c08dfab 100644 --- a/ui/src/admin/containers/AdminChronografPage.js +++ b/ui/src/admin/containers/AdminChronografPage.js @@ -11,10 +11,10 @@ import FancyScrollbar from 'shared/components/FancyScrollbar' class AdminChronografPage extends Component { // TODO: revisit this, possibly don't call setState if both are deep equal componentWillReceiveProps(nextProps) { - const {currentOrganization} = nextProps + const {meCurrentOrganization} = nextProps const hasChangedCurrentOrganization = - currentOrganization.id !== this.props.currentOrganization.id + meCurrentOrganization.id !== this.props.meCurrentOrganization.id if (hasChangedCurrentOrganization) { this.loadUsers() @@ -64,7 +64,7 @@ class AdminChronografPage extends Component { } render() { - const {users, currentOrganization, meRole} = this.props + const {users, meCurrentOrganization, meRole, meID} = this.props return (
@@ -81,9 +81,10 @@ class AdminChronografPage extends Component {
({ links, users, - currentOrganization, + meCurrentOrganization, meRole, + meID, }) const mapDispatchToProps = dispatch => ({ diff --git a/ui/src/shared/components/DeleteConfirmButtons.js b/ui/src/shared/components/DeleteConfirmButtons.js index 4a7aec583..b67048395 100644 --- a/ui/src/shared/components/DeleteConfirmButtons.js +++ b/ui/src/shared/components/DeleteConfirmButtons.js @@ -4,10 +4,11 @@ import classnames from 'classnames' import OnClickOutside from 'shared/components/OnClickOutside' import ConfirmButtons from 'shared/components/ConfirmButtons' -const DeleteButton = ({onClickDelete, buttonSize, text}) => +const DeleteButton = ({onClickDelete, buttonSize, text, disabled}) =>