import { useCallback, useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; import { connect, ConnectedProps } from 'react-redux'; import { NavModelItem } from '@grafana/data'; import { featureEnabled } from '@grafana/runtime'; import { Alert, Button, Field, Input, Stack } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; import { contextSrv } from 'app/core/core'; import { Trans } from 'app/core/internationalization'; import { GrafanaRouteComponentProps } from 'app/core/navigation/types'; import { AppNotificationSeverity, LdapError, LdapUser, StoreState, SyncInfo, LdapConnectionInfo, AccessControlAction, } from 'app/types'; import { loadLdapState, loadLdapSyncStatus, loadUserMapping, clearUserError, clearUserMappingInfo, } from '../state/actions'; import { LdapConnectionStatus } from './LdapConnectionStatus'; import { LdapSyncInfo } from './LdapSyncInfo'; import { LdapUserInfo } from './LdapUserInfo'; interface OwnProps extends GrafanaRouteComponentProps<{}, { username?: string }> { ldapConnectionInfo: LdapConnectionInfo; ldapUser?: LdapUser; ldapSyncInfo?: SyncInfo; ldapError?: LdapError; userError?: LdapError; } interface FormModel { username: string; } const pageNav: NavModelItem = { text: 'LDAP', subTitle: `Verify your LDAP and user mapping configuration.`, icon: 'book', id: 'LDAP', }; export const LdapPage = ({ clearUserMappingInfo, queryParams, loadLdapState, loadLdapSyncStatus, loadUserMapping, clearUserError, ldapUser, userError, ldapError, ldapSyncInfo, ldapConnectionInfo, }: Props) => { const [isLoading, setIsLoading] = useState(true); const { register, handleSubmit } = useForm(); const fetchUserMapping = useCallback( async (username: string) => { return loadUserMapping(username); }, [loadUserMapping] ); useEffect(() => { const fetchLDAPStatus = async () => { return Promise.all([loadLdapState(), loadLdapSyncStatus()]); }; async function init() { await clearUserMappingInfo(); await fetchLDAPStatus(); if (queryParams.username) { await fetchUserMapping(queryParams.username); } setIsLoading(false); } init(); }, [clearUserMappingInfo, fetchUserMapping, loadLdapState, loadLdapSyncStatus, queryParams]); const search = ({ username }: FormModel) => { if (username) { fetchUserMapping(username); } }; const onClearUserError = () => { clearUserError(); }; const canReadLDAPUser = contextSrv.hasPermission(AccessControlAction.LDAPUsersRead); return ( {ldapError && ldapError.title && ( {ldapError.body} )} {featureEnabled('ldapsync') && ldapSyncInfo && } {canReadLDAPUser && (

Test user mapping

Run } />
{userError && userError.title && ( {userError.body} )} {ldapUser && }
)}
); }; const mapStateToProps = (state: StoreState) => ({ ldapConnectionInfo: state.ldap.connectionInfo, ldapUser: state.ldap.user, ldapSyncInfo: state.ldap.syncInfo, userError: state.ldap.userError, ldapError: state.ldap.ldapError, }); const mapDispatchToProps = { loadLdapState, loadLdapSyncStatus, loadUserMapping, clearUserError, clearUserMappingInfo, }; const connector = connect(mapStateToProps, mapDispatchToProps); type Props = OwnProps & ConnectedProps; export default connector(LdapPage);