client/app/pages/destinations/EditDestination.jsx (104 lines of code) (raw):
import { get, find } from "lodash";
import React from "react";
import PropTypes from "prop-types";
import Modal from "antd/lib/modal";
import routeWithUserSession from "@/components/ApplicationArea/routeWithUserSession";
import navigateTo from "@/components/ApplicationArea/navigateTo";
import LoadingState from "@/components/items-list/components/LoadingState";
import DynamicForm from "@/components/dynamic-form/DynamicForm";
import helper from "@/components/dynamic-form/dynamicFormHelper";
import wrapSettingsTab from "@/components/SettingsWrapper";
import Destination, { IMG_ROOT } from "@/services/destination";
import notification from "@/services/notification";
import routes from "@/services/routes";
class EditDestination extends React.Component {
static propTypes = {
destinationId: PropTypes.string.isRequired,
onError: PropTypes.func,
};
static defaultProps = {
onError: () => {},
};
state = {
destination: null,
type: null,
loading: true,
};
componentDidMount() {
Destination.get({ id: this.props.destinationId })
.then(destination => {
const { type } = destination;
this.setState({ destination });
Destination.types().then(types => this.setState({ type: find(types, { type }), loading: false }));
})
.catch(error => this.props.onError(error));
}
saveDestination = (values, successCallback, errorCallback) => {
const { destination } = this.state;
helper.updateTargetWithValues(destination, values);
Destination.save(destination)
.then(() => successCallback("Saved."))
.catch(error => {
const message = get(error, "response.data.message", "Failed saving.");
errorCallback(message);
});
};
deleteDestination = callback => {
const { destination } = this.state;
const doDelete = () => {
Destination.delete(destination)
.then(() => {
notification.success("Alert destination deleted successfully.");
navigateTo("destinations");
})
.catch(() => {
callback();
});
};
Modal.confirm({
title: "Delete Alert Destination",
content: "Are you sure you want to delete this alert destination?",
okText: "Delete",
okType: "danger",
onOk: doDelete,
onCancel: callback,
maskClosable: true,
autoFocusButton: null,
});
};
renderForm() {
const { destination, type } = this.state;
const fields = helper.getFields(type, destination);
const formProps = {
fields,
type,
actions: [{ name: "Delete", type: "danger", callback: this.deleteDestination }],
onSubmit: this.saveDestination,
defaultShowExtraFields: helper.hasFilledExtraField(type, destination),
feedbackIcons: true,
};
return (
<div className="row" data-test="Destination">
<div className="text-center m-b-10">
<img className="p-5" src={`${IMG_ROOT}/${type.type}.png`} alt={type.name} width="64" />
<h3 className="m-0">{type.name}</h3>
</div>
<div className="col-md-4 col-md-offset-4 m-b-10">
<DynamicForm {...formProps} />
</div>
</div>
);
}
render() {
return this.state.loading ? <LoadingState className="" /> : this.renderForm();
}
}
const EditDestinationPage = wrapSettingsTab("AlertDestinations.Edit", null, EditDestination);
routes.register(
"AlertDestinations.Edit",
routeWithUserSession({
path: "/destinations/:destinationId",
title: "Alert Destinations",
render: pageProps => <EditDestinationPage {...pageProps} />,
})
);