From e0e48bf9220d2a67eec77a8c3bf0ebf87ade9e93 Mon Sep 17 00:00:00 2001 From: Keith Grant Date: Tue, 8 Sep 2020 12:49:59 -0700 Subject: [PATCH] add custom messages to Notification Detail --- .../{ObjectDetail.jsx => CodeDetail.jsx} | 15 +- .../src/components/DetailList/index.js | 2 +- .../NotificationTemplate.jsx | 1 + .../NotificationTemplateDetail.jsx | 182 +++++++++++++++++- .../shared/NotificationTemplateForm.jsx | 37 +--- .../shared/hasCustomMessages.js | 40 ++++ 6 files changed, 228 insertions(+), 49 deletions(-) rename awx/ui_next/src/components/DetailList/{ObjectDetail.jsx => CodeDetail.jsx} (77%) create mode 100644 awx/ui_next/src/screens/NotificationTemplate/shared/hasCustomMessages.js diff --git a/awx/ui_next/src/components/DetailList/ObjectDetail.jsx b/awx/ui_next/src/components/DetailList/CodeDetail.jsx similarity index 77% rename from awx/ui_next/src/components/DetailList/ObjectDetail.jsx rename to awx/ui_next/src/components/DetailList/CodeDetail.jsx index bf008866a8..9b9a2f0568 100644 --- a/awx/ui_next/src/components/DetailList/ObjectDetail.jsx +++ b/awx/ui_next/src/components/DetailList/CodeDetail.jsx @@ -1,11 +1,11 @@ import 'styled-components/macro'; import React from 'react'; -import { shape, node, number } from 'prop-types'; +import { shape, node, number, oneOf } from 'prop-types'; import { TextListItemVariants } from '@patternfly/react-core'; import { DetailName, DetailValue } from './Detail'; import CodeMirrorInput from '../CodeMirrorInput'; -function ObjectDetail({ value, label, rows, fullHeight }) { +function CodeDetail({ value, label, mode, rows, fullHeight }) { return ( <> ); } -ObjectDetail.propTypes = { +CodeDetail.propTypes = { value: shape.isRequired, label: node.isRequired, rows: number, + mode: oneOf(['json', 'yaml', 'jinja2']).isRequired, }; -ObjectDetail.defaultProps = { +CodeDetail.defaultProps = { rows: null, }; -export default ObjectDetail; +export default CodeDetail; diff --git a/awx/ui_next/src/components/DetailList/index.js b/awx/ui_next/src/components/DetailList/index.js index 332cfa2f6b..d5e2ccd8a4 100644 --- a/awx/ui_next/src/components/DetailList/index.js +++ b/awx/ui_next/src/components/DetailList/index.js @@ -5,7 +5,7 @@ export { default as UserDateDetail } from './UserDateDetail'; export { default as DetailBadge } from './DetailBadge'; export { default as ArrayDetail } from './ArrayDetail'; /* - NOTE: ObjectDetail cannot be imported here, as it causes circular + NOTE: CodeDetail cannot be imported here, as it causes circular dependencies in testing environment. Import it directly from DetailList/ObjectDetail */ diff --git a/awx/ui_next/src/screens/NotificationTemplate/NotificationTemplate.jsx b/awx/ui_next/src/screens/NotificationTemplate/NotificationTemplate.jsx index 005dd0e40b..cd9f60f968 100644 --- a/awx/ui_next/src/screens/NotificationTemplate/NotificationTemplate.jsx +++ b/awx/ui_next/src/screens/NotificationTemplate/NotificationTemplate.jsx @@ -106,6 +106,7 @@ function NotificationTemplate({ setBreadcrumb, i18n }) { diff --git a/awx/ui_next/src/screens/NotificationTemplate/NotificationTemplateDetail/NotificationTemplateDetail.jsx b/awx/ui_next/src/screens/NotificationTemplate/NotificationTemplateDetail/NotificationTemplateDetail.jsx index 6b19621c54..4d178fa7db 100644 --- a/awx/ui_next/src/screens/NotificationTemplate/NotificationTemplateDetail/NotificationTemplateDetail.jsx +++ b/awx/ui_next/src/screens/NotificationTemplate/NotificationTemplateDetail/NotificationTemplateDetail.jsx @@ -11,19 +11,21 @@ import { DetailList, DeletedDetail, } from '../../../components/DetailList'; -import ObjectDetail from '../../../components/DetailList/ObjectDetail'; +import CodeDetail from '../../../components/DetailList/CodeDetail'; import DeleteButton from '../../../components/DeleteButton'; import ErrorDetail from '../../../components/ErrorDetail'; import { NotificationTemplatesAPI } from '../../../api'; import useRequest, { useDismissableError } from '../../../util/useRequest'; +import hasCustomMessages from '../shared/hasCustomMessages'; import { NOTIFICATION_TYPES } from '../constants'; -function NotificationTemplateDetail({ i18n, template }) { +function NotificationTemplateDetail({ i18n, template, defaultMessages }) { const history = useHistory(); const { notification_configuration: configuration, summary_fields, + messages, } = template; const { request: deleteTemplate, isLoading, error: deleteError } = useRequest( @@ -34,6 +36,7 @@ function NotificationTemplateDetail({ i18n, template }) { ); const { error, dismissError } = useDismissableError(deleteError); + const typeMessageDefaults = defaultMessages[template.notification_type]; return ( @@ -275,7 +278,7 @@ function NotificationTemplateDetail({ i18n, template }) { dataCy="nt-detail-twilio-source-phone" /> @@ -312,14 +315,23 @@ function NotificationTemplateDetail({ i18n, template }) { value={configuration.http_method} dataCy="nt-detail-webhook-http-method" /> - )} + {hasCustomMessages(messages, typeMessageDefaults) && ( + + )} {summary_fields.user_capabilities && @@ -359,4 +371,164 @@ function NotificationTemplateDetail({ i18n, template }) { ); } +function CustomMessageDetails({ messages, defaults, type, i18n }) { + const showMessages = type !== 'webhook'; + const showBodies = ['email', 'pagerduty', 'webhook'].includes(type); + + return ( + <> + {showMessages && ( + + )} + {showBodies && ( + + )} + {showMessages && ( + + )} + {showBodies && ( + + )} + {showMessages && ( + + )} + {showBodies && ( + + )} + {showMessages && ( + + )} + {showBodies && ( + + )} + {showMessages && ( + + )} + {showBodies && ( + + )} + {showMessages && ( + + )} + {showBodies && ( + + )} + {showMessages && ( + + )} + {showBodies && ( + + )} + + ); +} + export default withI18n()(NotificationTemplateDetail); diff --git a/awx/ui_next/src/screens/NotificationTemplate/shared/NotificationTemplateForm.jsx b/awx/ui_next/src/screens/NotificationTemplate/shared/NotificationTemplateForm.jsx index 50477fabeb..d3fcda1521 100644 --- a/awx/ui_next/src/screens/NotificationTemplate/shared/NotificationTemplateForm.jsx +++ b/awx/ui_next/src/screens/NotificationTemplate/shared/NotificationTemplateForm.jsx @@ -13,6 +13,7 @@ import { required } from '../../../util/validators'; import { FormColumnLayout } from '../../../components/FormLayout'; import TypeInputsSubForm from './TypeInputsSubForm'; import CustomMessagesSubForm from './CustomMessagesSubForm'; +import hasCustomMessages from './hasCustomMessages'; import typeFieldNames, { initialConfigValues } from './typeFieldNames'; function NotificationTemplateFormFields({ i18n, defaultMessages }) { @@ -210,42 +211,6 @@ NotificationTemplateForm.defaultProps = { export default withI18n()(NotificationTemplateForm); -function hasCustomMessages(messages, defaults) { - return ( - isCustomized(messages.started, defaults.started) || - isCustomized(messages.success, defaults.success) || - isCustomized(messages.error, defaults.error) || - isCustomized( - messages.workflow_approval.approved, - defaults.workflow_approval.approved - ) || - isCustomized( - messages.workflow_approval.denied, - defaults.workflow_approval.denied - ) || - isCustomized( - messages.workflow_approval.running, - defaults.workflow_approval.running - ) || - isCustomized( - messages.workflow_approval.timed_out, - defaults.workflow_approval.timed_out - ) - ); -} -function isCustomized(message, defaultMessage) { - if (!message) { - return false; - } - if (message.message && message.message !== defaultMessage.message) { - return true; - } - if (message.body && message.body !== defaultMessage.body) { - return true; - } - return false; -} - function normalizeFields(values, defaultMessages) { return normalizeTypeFields(normalizeMessageFields(values, defaultMessages)); } diff --git a/awx/ui_next/src/screens/NotificationTemplate/shared/hasCustomMessages.js b/awx/ui_next/src/screens/NotificationTemplate/shared/hasCustomMessages.js new file mode 100644 index 0000000000..460bcfba0c --- /dev/null +++ b/awx/ui_next/src/screens/NotificationTemplate/shared/hasCustomMessages.js @@ -0,0 +1,40 @@ +export default function hasCustomMessages(messages, defaults) { + if (!messages) { + return false; + } + + return ( + isCustomized(messages.started, defaults.started) || + isCustomized(messages.success, defaults.success) || + isCustomized(messages.error, defaults.error) || + isCustomized( + messages.workflow_approval.approved, + defaults.workflow_approval.approved + ) || + isCustomized( + messages.workflow_approval.denied, + defaults.workflow_approval.denied + ) || + isCustomized( + messages.workflow_approval.running, + defaults.workflow_approval.running + ) || + isCustomized( + messages.workflow_approval.timed_out, + defaults.workflow_approval.timed_out + ) + ); +} + +function isCustomized(message, defaultMessage) { + if (!message) { + return false; + } + if (message.message && message.message !== defaultMessage.message) { + return true; + } + if (message.body && message.body !== defaultMessage.body) { + return true; + } + return false; +}