LdapPage.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import React, { PureComponent } from 'react';
  2. import { hot } from 'react-hot-loader';
  3. import { connect } from 'react-redux';
  4. import { NavModel } from '@grafana/data';
  5. import { FormField, Alert } from '@grafana/ui';
  6. import { getNavModel } from 'app/core/selectors/navModel';
  7. import config from 'app/core/config';
  8. import Page from 'app/core/components/Page/Page';
  9. import { LdapConnectionStatus } from './LdapConnectionStatus';
  10. import { LdapSyncInfo } from './LdapSyncInfo';
  11. import { LdapUserInfo } from './LdapUserInfo';
  12. import { AppNotificationSeverity, LdapError, LdapUser, StoreState, SyncInfo, LdapConnectionInfo } from 'app/types';
  13. import {
  14. loadLdapState,
  15. loadLdapSyncStatus,
  16. loadUserMapping,
  17. clearUserError,
  18. clearUserMappingInfo,
  19. } from '../state/actions';
  20. interface Props {
  21. navModel: NavModel;
  22. ldapConnectionInfo: LdapConnectionInfo;
  23. ldapUser: LdapUser;
  24. ldapSyncInfo: SyncInfo;
  25. ldapError: LdapError;
  26. userError?: LdapError;
  27. loadLdapState: typeof loadLdapState;
  28. loadLdapSyncStatus: typeof loadLdapSyncStatus;
  29. loadUserMapping: typeof loadUserMapping;
  30. clearUserError: typeof clearUserError;
  31. clearUserMappingInfo: typeof clearUserMappingInfo;
  32. }
  33. interface State {
  34. isLoading: boolean;
  35. }
  36. export class LdapPage extends PureComponent<Props, State> {
  37. state = {
  38. isLoading: true,
  39. };
  40. async componentDidMount() {
  41. await this.props.clearUserMappingInfo();
  42. await this.fetchLDAPStatus();
  43. this.setState({ isLoading: false });
  44. }
  45. async fetchLDAPStatus() {
  46. const { loadLdapState, loadLdapSyncStatus } = this.props;
  47. return Promise.all([loadLdapState(), loadLdapSyncStatus()]);
  48. }
  49. async fetchUserMapping(username: string) {
  50. const { loadUserMapping } = this.props;
  51. return await loadUserMapping(username);
  52. }
  53. search = (event: any) => {
  54. event.preventDefault();
  55. const username = event.target.elements['username'].value;
  56. if (username) {
  57. this.fetchUserMapping(username);
  58. }
  59. };
  60. onClearUserError = () => {
  61. this.props.clearUserError();
  62. };
  63. render() {
  64. const { ldapUser, userError, ldapError, ldapSyncInfo, ldapConnectionInfo, navModel } = this.props;
  65. const { isLoading } = this.state;
  66. return (
  67. <Page navModel={navModel}>
  68. <Page.Contents isLoading={isLoading}>
  69. <>
  70. {ldapError && ldapError.title && (
  71. <div className="gf-form-group">
  72. <Alert title={ldapError.title} severity={AppNotificationSeverity.Error} children={ldapError.body} />
  73. </div>
  74. )}
  75. <LdapConnectionStatus ldapConnectionInfo={ldapConnectionInfo} />
  76. {config.buildInfo.isEnterprise && ldapSyncInfo && <LdapSyncInfo ldapSyncInfo={ldapSyncInfo} />}
  77. <h3 className="page-heading">Test user mapping</h3>
  78. <div className="gf-form-group">
  79. <form onSubmit={this.search} className="gf-form-inline">
  80. <FormField label="Username" labelWidth={8} inputWidth={30} type="text" id="username" name="username" />
  81. <button type="submit" className="btn btn-primary">
  82. Run
  83. </button>
  84. </form>
  85. </div>
  86. {userError && userError.title && (
  87. <div className="gf-form-group">
  88. <Alert
  89. title={userError.title}
  90. severity={AppNotificationSeverity.Error}
  91. children={userError.body}
  92. onRemove={this.onClearUserError}
  93. />
  94. </div>
  95. )}
  96. {ldapUser && <LdapUserInfo ldapUser={ldapUser} showAttributeMapping={true} />}
  97. </>
  98. </Page.Contents>
  99. </Page>
  100. );
  101. }
  102. }
  103. const mapStateToProps = (state: StoreState) => ({
  104. navModel: getNavModel(state.navIndex, 'ldap'),
  105. ldapConnectionInfo: state.ldap.connectionInfo,
  106. ldapUser: state.ldap.user,
  107. ldapSyncInfo: state.ldap.syncInfo,
  108. userError: state.ldap.userError,
  109. ldapError: state.ldap.ldapError,
  110. });
  111. const mapDispatchToProps = {
  112. loadLdapState,
  113. loadLdapSyncStatus,
  114. loadUserMapping,
  115. clearUserError,
  116. clearUserMappingInfo,
  117. };
  118. export default hot(module)(
  119. connect(
  120. mapStateToProps,
  121. mapDispatchToProps
  122. )(LdapPage)
  123. );