The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
grafana/public/app/features/alerting/EditNotificationChannelPage...

135 lines
4.7 KiB

import React, { PureComponent } from 'react';
import { MapDispatchToProps, MapStateToProps } from 'react-redux';
import { config } from '@grafana/runtime';
import { Form, Spinner } from '@grafana/ui';
import { Page } from 'app/core/components/Page/Page';
import { connectWithCleanUp } from 'app/core/components/connectWithCleanUp';
import { GrafanaRouteComponentProps } from 'app/core/navigation/types';
import { NotificationChannelType, NotificationChannelDTO, StoreState } from 'app/types';
import { NotificationChannelForm } from './components/NotificationChannelForm';
import { loadNotificationChannel, testNotificationChannel, updateNotificationChannel } from './state/actions';
import { initialChannelState, resetSecureField } from './state/reducers';
import { mapChannelsToSelectableValue, transformSubmitData, transformTestData } from './utils/notificationChannels';
interface OwnProps extends GrafanaRouteComponentProps<{ id: string }> {}
interface ConnectedProps {
notificationChannel: any;
notificationChannelTypes: NotificationChannelType[];
}
interface DispatchProps {
loadNotificationChannel: typeof loadNotificationChannel;
testNotificationChannel: typeof testNotificationChannel;
updateNotificationChannel: typeof updateNotificationChannel;
resetSecureField: typeof resetSecureField;
}
type Props = OwnProps & ConnectedProps & DispatchProps;
export class EditNotificationChannelPage extends PureComponent<Props> {
componentDidMount() {
this.props.loadNotificationChannel(parseInt(this.props.match.params.id, 10));
}
onSubmit = (formData: NotificationChannelDTO) => {
const { notificationChannel } = this.props;
this.props.updateNotificationChannel({
/*
Some settings which lives in a collapsed section will not be registered since
the section will not be rendered if a user doesn't expand it. Therefore we need to
merge the initialData with any changes from the form.
*/
...transformSubmitData({
...notificationChannel,
...formData,
settings: { ...notificationChannel.settings, ...formData.settings },
}),
id: notificationChannel.id,
});
};
onTestChannel = (formData: NotificationChannelDTO) => {
const { notificationChannel } = this.props;
/*
Same as submit
*/
this.props.testNotificationChannel(
transformTestData({
...notificationChannel,
...formData,
settings: { ...notificationChannel.settings, ...formData.settings },
})
);
};
render() {
const { notificationChannel, notificationChannelTypes } = this.props;
return (
<Page navId="channels">
<Page.Contents>
<h2 className="page-sub-heading">Edit notification channel</h2>
{notificationChannel && notificationChannel.id > 0 ? (
<Form
maxWidth={600}
onSubmit={this.onSubmit}
defaultValues={{
...notificationChannel,
type: notificationChannelTypes.find((n) => n.value === notificationChannel.type),
}}
>
{({ control, errors, getValues, register, watch }) => {
const selectedChannel = notificationChannelTypes.find((c) => c.value === getValues().type.value);
return (
<NotificationChannelForm
selectableChannels={mapChannelsToSelectableValue(notificationChannelTypes, true)}
selectedChannel={selectedChannel}
imageRendererAvailable={config.rendererAvailable}
onTestChannel={this.onTestChannel}
register={register}
watch={watch}
errors={errors}
getValues={getValues}
control={control}
resetSecureField={this.props.resetSecureField}
secureFields={notificationChannel.secureFields}
/>
);
}}
</Form>
) : (
<div>
Loading notification channel
<Spinner />
</div>
)}
</Page.Contents>
</Page>
);
}
}
const mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = (state) => {
return {
notificationChannel: state.notificationChannel.notificationChannel,
notificationChannelTypes: state.notificationChannel.notificationChannelTypes,
};
};
const mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = {
loadNotificationChannel,
testNotificationChannel,
updateNotificationChannel,
resetSecureField,
};
export default connectWithCleanUp(
mapStateToProps,
mapDispatchToProps,
(state) => (state.notificationChannel = initialChannelState)
)(EditNotificationChannelPage);