UsersActionBar.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import React, { PureComponent } from 'react';
  2. import { connect } from 'react-redux';
  3. import { setUsersSearchQuery } from './state/actions';
  4. import { getInviteesCount, getUsersSearchQuery } from './state/selectors';
  5. export interface Props {
  6. searchQuery: string;
  7. setUsersSearchQuery: typeof setUsersSearchQuery;
  8. showInvites: () => void;
  9. pendingInvitesCount: number;
  10. canInvite: boolean;
  11. externalUserMngLinkUrl: string;
  12. externalUserMngLinkName: string;
  13. }
  14. export class UsersActionBar extends PureComponent<Props> {
  15. render() {
  16. const {
  17. canInvite,
  18. externalUserMngLinkName,
  19. externalUserMngLinkUrl,
  20. searchQuery,
  21. pendingInvitesCount,
  22. setUsersSearchQuery,
  23. showInvites,
  24. } = this.props;
  25. return (
  26. <div className="page-action-bar">
  27. <div className="gf-form gf-form--grow">
  28. <label className="gf-form--has-input-icon">
  29. <input
  30. type="text"
  31. className="gf-form-input width-20"
  32. value={searchQuery}
  33. onChange={event => setUsersSearchQuery(event.target.value)}
  34. placeholder="Filter by name or type"
  35. />
  36. <i className="gf-form-input-icon fa fa-search" />
  37. </label>
  38. <div className="page-action-bar__spacer" />
  39. {pendingInvitesCount > 0 && (
  40. <button className="btn btn-inverse" onClick={showInvites}>
  41. Pending Invites ({pendingInvitesCount})
  42. </button>
  43. )}
  44. {canInvite && (
  45. <a className="btn btn-success" href="org/users/invite">
  46. <i className="fa fa-plus" />
  47. <span>Invite</span>
  48. </a>
  49. )}
  50. {externalUserMngLinkUrl && (
  51. <a className="btn btn-success" href={externalUserMngLinkUrl} target="_blank">
  52. <i className="fa fa-external-link-square" />
  53. {externalUserMngLinkName}
  54. </a>
  55. )}
  56. </div>
  57. </div>
  58. );
  59. }
  60. }
  61. function mapStateToProps(state) {
  62. return {
  63. searchQuery: getUsersSearchQuery(state.users),
  64. pendingInvitesCount: getInviteesCount(state.users),
  65. externalUserMngLinkName: state.users.externalUserMngLinkName,
  66. externalUserMngLinkUrl: state.users.externalUserMngLinkUrl,
  67. canInvite: state.users.canInvite,
  68. };
  69. }
  70. const mapDispatchToProps = {
  71. setUsersSearchQuery,
  72. };
  73. export default connect(mapStateToProps, mapDispatchToProps)(UsersActionBar);