saleor-dashboard/src/plugins/views/PluginsDetails.tsx

176 lines
5.9 KiB
TypeScript
Raw Normal View History

2019-11-08 10:25:17 +00:00
import DialogContentText from "@material-ui/core/DialogContentText";
import React from "react";
import { FormattedMessage, useIntl } from "react-intl";
import ActionDialog from "@saleor/components/ActionDialog";
2019-08-26 17:08:32 +00:00
import { WindowTitle } from "@saleor/components/WindowTitle";
import useNavigator from "@saleor/hooks/useNavigator";
2019-08-29 11:01:06 +00:00
import useNotifier from "@saleor/hooks/useNotifier";
2019-11-08 10:25:17 +00:00
import { commonMessages } from "@saleor/intl";
2019-11-07 15:54:05 +00:00
import { ConfigurationItemInput } from "@saleor/types/globalTypes";
2019-12-06 14:58:28 +00:00
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers";
2019-12-06 17:11:46 +00:00
import { maybe } from "../../misc";
2019-08-27 12:36:19 +00:00
import PluginsDetailsPage from "../components/PluginsDetailsPage";
2019-11-08 10:25:17 +00:00
import PluginSecretFieldDialog from "../components/PluginSecretFieldDialog";
2019-08-28 14:53:57 +00:00
import { TypedPluginUpdate } from "../mutations";
2019-08-26 17:08:32 +00:00
import { TypedPluginsDetailsQuery } from "../queries";
2019-11-07 15:54:05 +00:00
import { Plugin_plugin_configuration } from "../types/Plugin";
2019-11-08 10:25:17 +00:00
import { PluginUpdate } from "../types/PluginUpdate";
2019-11-07 15:54:05 +00:00
import {
2019-12-17 17:13:56 +00:00
pluginListUrl,
2019-12-06 14:58:28 +00:00
pluginUrl,
2019-12-17 17:13:56 +00:00
PluginUrlQueryParams,
2019-11-07 15:54:05 +00:00
PluginUrlDialog
} from "../urls";
import { isSecretField } from "../utils";
2019-08-26 17:08:32 +00:00
export interface PluginsDetailsProps {
id: string;
2019-12-17 17:13:56 +00:00
params: PluginUrlQueryParams;
2019-08-26 17:08:32 +00:00
}
2019-11-07 15:54:05 +00:00
export function getConfigurationInput(
config: Plugin_plugin_configuration[] | null,
input: ConfigurationItemInput[] | null
): ConfigurationItemInput[] | null {
if (config === null || input === null) {
return null;
}
return input
.filter(field => !isSecretField(config, field.name))
.map(field => ({
name: field.name,
value: field.value.toString()
}));
}
export const PluginsDetails: React.FC<PluginsDetailsProps> = ({
id,
params
}) => {
2019-08-26 17:08:32 +00:00
const navigate = useNavigator();
2019-08-29 11:01:06 +00:00
const notify = useNotifier();
2019-08-30 13:10:07 +00:00
const intl = useIntl();
2019-08-26 17:08:32 +00:00
2019-12-06 14:58:28 +00:00
const [openModal, closeModal] = createDialogActionHandlers<
PluginUrlDialog,
PluginUrlQueryParams
>(navigate, params => pluginUrl(id, params), params);
2019-11-07 15:54:05 +00:00
2019-11-08 10:25:17 +00:00
const handleUpdate = (data: PluginUpdate) => {
if (data.pluginUpdate.errors.length === 0) {
notify({
text: intl.formatMessage(commonMessages.savedChanges)
});
closeModal();
}
};
2019-08-26 17:08:32 +00:00
return (
2019-11-08 10:25:17 +00:00
<TypedPluginsDetailsQuery variables={{ id }}>
{pluginDetails => (
<TypedPluginUpdate onCompleted={handleUpdate}>
{(pluginUpdate, pluginUpdateOpts) => {
2019-08-29 11:01:06 +00:00
const formErrors = maybe(
() => pluginUpdateOpts.data.pluginUpdate.errors,
[]
);
2019-11-08 10:25:17 +00:00
const handleFieldUpdate = (value: string) =>
pluginUpdate({
variables: {
id,
input: {
configuration: [
{
2019-12-06 14:58:28 +00:00
name: params.id,
2019-11-08 10:25:17 +00:00
value
}
]
}
}
2019-08-29 11:01:06 +00:00
});
2019-08-26 17:08:32 +00:00
return (
<>
<WindowTitle
2019-11-07 15:54:05 +00:00
title={maybe(() => pluginDetails.data.plugin.name)}
2019-08-26 17:08:32 +00:00
/>
<PluginsDetailsPage
2019-11-07 15:54:05 +00:00
disabled={pluginDetails.loading}
2019-08-29 11:01:06 +00:00
errors={formErrors}
2019-11-08 10:25:17 +00:00
saveButtonBarState={
2019-12-06 17:17:44 +00:00
!params.action ? pluginUpdateOpts.status : "default"
2019-11-08 10:25:17 +00:00
}
2019-11-07 15:54:05 +00:00
plugin={maybe(() => pluginDetails.data.plugin)}
2019-12-17 17:13:56 +00:00
onBack={() => navigate(pluginListUrl())}
2019-12-06 14:58:28 +00:00
onClear={id =>
openModal("clear", {
id
})
}
onEdit={id =>
openModal("edit", {
id
})
}
2019-11-07 15:54:05 +00:00
onSubmit={formData =>
2019-08-28 14:53:57 +00:00
pluginUpdate({
2019-08-26 17:08:32 +00:00
variables: {
id,
input: {
active: formData.active,
2019-11-07 15:54:05 +00:00
configuration: getConfigurationInput(
pluginDetails.data.plugin.configuration,
formData.configuration
)
2019-08-26 17:08:32 +00:00
}
}
2019-11-07 15:54:05 +00:00
})
}
2019-08-26 17:08:32 +00:00
/>
2019-11-08 10:25:17 +00:00
{maybe(() => pluginDetails.data.plugin.configuration) && (
<>
<ActionDialog
confirmButtonState={
2019-12-06 17:17:44 +00:00
!!params.action ? pluginUpdateOpts.status : "default"
2019-11-08 10:25:17 +00:00
}
onClose={closeModal}
2019-12-06 14:58:28 +00:00
open={params.action === "clear" && !!params.id}
2019-11-08 10:25:17 +00:00
title={intl.formatMessage({
defaultMessage: "Authorization Field Delete",
description: "header"
})}
onConfirm={() => handleFieldUpdate(null)}
>
<DialogContentText>
<FormattedMessage defaultMessage="The plugin may stop working after this field is cleared. Are you sure you want to proceed?" />
</DialogContentText>
</ActionDialog>
<PluginSecretFieldDialog
confirmButtonState={
2019-12-06 17:17:44 +00:00
!!params.action ? pluginUpdateOpts.status : "default"
2019-11-08 10:25:17 +00:00
}
field={maybe(() =>
pluginDetails.data.plugin.configuration.find(
2019-12-06 14:58:28 +00:00
field => field.name === params.id
2019-11-08 10:25:17 +00:00
)
)}
onClose={closeModal}
onConfirm={formData => handleFieldUpdate(formData.value)}
2019-12-06 14:58:28 +00:00
open={params.action === "edit" && !!params.id}
2019-11-08 10:25:17 +00:00
/>
</>
)}
2019-08-26 17:08:32 +00:00
</>
);
}}
2019-11-08 10:25:17 +00:00
</TypedPluginUpdate>
2019-08-26 17:08:32 +00:00
)}
2019-11-08 10:25:17 +00:00
</TypedPluginsDetailsQuery>
2019-08-26 17:08:32 +00:00
);
};
PluginsDetails.displayName = "PluginsDetails";
export default PluginsDetails;