diff --git a/Tools/Start-CippDevEmulators.ps1 b/Tools/Start-CippDevEmulators.ps1 index b4f6ca696ffe..bde7511caac1 100644 --- a/Tools/Start-CippDevEmulators.ps1 +++ b/Tools/Start-CippDevEmulators.ps1 @@ -1,4 +1,12 @@ -Write-Host "Starting CIPP Dev Emulators" +Write-Host 'Starting CIPP Dev Emulators' +Get-Process node -ErrorAction SilentlyContinue | Stop-Process -ErrorAction SilentlyContinue $Path = (Get-Item $PSScriptRoot).Parent.Parent.FullName -wt --title CIPP`; new-tab --title 'Azurite' -d $Path pwsh -c azurite`; new-tab --title 'FunctionApp' -d $Path\CIPP-API pwsh -c func start`; new-tab --title 'CIPP Frontend' -d $Path\CIPP pwsh -c npm run start`; new-tab --title 'SWA' -d $Path\CIPP pwsh -c npm run start-swa + +$Process = Read-Host -Prompt 'Start Process Function (y/N)?' + +if ($Process -eq 'y') { + wt --title CIPP`; new-tab --title 'Azurite' -d $Path pwsh -c azurite`; new-tab --title 'FunctionApp' -d $Path\CIPP-API pwsh -c func start`; new-tab --title 'CIPP Frontend' -d $Path\CIPP pwsh -c npm run start`; new-tab --title 'SWA' -d $Path\CIPP pwsh -c npm run start-swa`; new-tab --title 'CIPP-API-Processor' -d $Path\CIPP-API-Processor pwsh -c func start --port 7072 +} else { + wt --title CIPP`; new-tab --title 'Azurite' -d $Path pwsh -c azurite`; new-tab --title 'FunctionApp' -d $Path\CIPP-API pwsh -c func start`; new-tab --title 'CIPP Frontend' -d $Path\CIPP pwsh -c npm run start`; new-tab --title 'SWA' -d $Path\CIPP pwsh -c npm run start-swa +} diff --git a/package.json b/package.json index 41b4ceedb492..b74d149fe82e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cipp", - "version": "6.2.2", + "version": "6.3.0", "description": "The CyberDrain Improved Partner Portal is a portal to help manage administration for Microsoft Partners.", "homepage": "https://cipp.app/", "bugs": { diff --git a/public/version_latest.txt b/public/version_latest.txt index ca06394388d6..798e38995c4d 100644 --- a/public/version_latest.txt +++ b/public/version_latest.txt @@ -1 +1 @@ -6.2.2 +6.3.0 diff --git a/src/components/contentcards/CippButtonCard.jsx b/src/components/contentcards/CippButtonCard.jsx index 8e74d5470693..a34acbd66142 100644 --- a/src/components/contentcards/CippButtonCard.jsx +++ b/src/components/contentcards/CippButtonCard.jsx @@ -8,7 +8,7 @@ export default function CippButtonCard({ titleType = 'normal', CardButton, children, - isFetching, + isFetching = false, className = 'h-100', }) { return ( @@ -22,7 +22,7 @@ export default function CippButtonCard({ {isFetching && } {children} - {CardButton} + {CardButton && {CardButton}} ) } @@ -30,8 +30,8 @@ export default function CippButtonCard({ CippButtonCard.propTypes = { title: PropTypes.string.isRequired, titleType: PropTypes.string, - CardButton: PropTypes.element.isRequired, + CardButton: PropTypes.element, children: PropTypes.element.isRequired, - isFetching: PropTypes.bool.isRequired, + isFetching: PropTypes.bool, className: PropTypes.string, } diff --git a/src/components/forms/RFFComponents.jsx b/src/components/forms/RFFComponents.jsx index 14163a033d62..30e096a71aa8 100644 --- a/src/components/forms/RFFComponents.jsx +++ b/src/components/forms/RFFComponents.jsx @@ -516,6 +516,7 @@ export const RFFSelectSearch = ({ retainInput = true, isLoading = false, allowCreate = false, + onCreateOption, refreshFunction, ...props }) => { @@ -589,7 +590,7 @@ export const RFFSelectSearch = ({ )} {allowCreate ? ( - + ) : ( - {dropMessage} - - - + <> + {returnCard ? ( + +
+ + + {dropMessage} + +
+
+ ) : ( +
+ + + {dropMessage} + +
+ )} + ) } @@ -73,6 +92,7 @@ CippDropzone.propTypes = { dropMessage: PropTypes.string, accept: PropTypes.object, maxFiles: PropTypes.number, + returnCard: PropTypes.bool, } export default CippDropzone diff --git a/src/data/alerts.json b/src/data/alerts.json index 835216740c4d..13f18265caf4 100644 --- a/src/data/alerts.json +++ b/src/data/alerts.json @@ -99,5 +99,11 @@ "name": "DeviceCompliance", "label": "Alert on device compliance issues", "recommendedRunInterval": "4h" + }, + { + "name": "HuntressRogueApps", + "label": "Alert on Huntress Rogue Apps detected", + "recommendedRunInterval": "4h", + "description": "Huntress has provided a repository of known rogue apps that are commonly used in BEC, data exfiltration and other Microsoft 365 attacks. This alert will notify you if any of these apps are detected in the selected tenant(s). For more information, see https://huntresslabs.github.io/rogueapps/." } ] diff --git a/src/scss/_custom.scss b/src/scss/_custom.scss index 60d5abcc0cdd..b118641b872e 100644 --- a/src/scss/_custom.scss +++ b/src/scss/_custom.scss @@ -501,6 +501,7 @@ h3.underline:after { .react-select__menu { background-color: var(--cipp-search-bg); border: 1px solid var(--cipp-search-border-color); + z-index: 1000; } .react-select__option { @@ -655,6 +656,11 @@ h3.underline:after { white-space: nowrap; overflow: hidden; } +.celltip-content { + display: inline-block; + white-space: normal; + overflow: ellipsis; +} .select-width { min-width: 100%; diff --git a/src/scss/_themes.scss b/src/scss/_themes.scss index f05c2be45f9b..4f94d5b0892c 100644 --- a/src/scss/_themes.scss +++ b/src/scss/_themes.scss @@ -434,6 +434,7 @@ --cui-dropdown-link-color: var(--cyberdrain-light); --cui-dropdown-link-hover-bg: var(--cyberdrain-accent-blue); --cui-dropdown-link-hover-color: var(--cyberdrain-light); + --cui-dropdown-zindex: 990; --cui-footer-bg: #242424; --cui-footer-color: var(--cyberdrain-light); --cui-footer-border-color: #121212; diff --git a/src/views/cipp/Extensions.jsx b/src/views/cipp/Extensions.jsx index 5923599a6f66..84841ec3ec18 100644 --- a/src/views/cipp/Extensions.jsx +++ b/src/views/cipp/Extensions.jsx @@ -22,6 +22,7 @@ import CippButtonCard from 'src/components/contentcards/CippButtonCard.jsx' import { RFFCFormInput, RFFCFormSwitch } from 'src/components/forms/RFFComponents.jsx' import { Form } from 'react-final-form' import ExtensionMappings from 'src/views/cipp/ExtensionMappings.jsx' +import ReactHtmlParser from 'react-html-parser' export default function CIPPExtensions() { const [listBackend, listBackendResult] = useLazyGenericGetRequestQuery() @@ -121,6 +122,12 @@ export default function CIPPExtensions() { clients. )} + {integration?.callToAction && ( + + + {ReactHtmlParser(integration.callToAction)} + + )} - {notificationListResult.isUninitialized && listNotification()} - {notificationListResult.isFetching || - (generateAlertResult.isFetching && ( - - ))} - {!notificationListResult.isFetching && notificationListResult.error && ( - Error loading data - )} - {notificationListResult.isSuccess && ( -
true} - initialValues={{ - ...notificationListResult.data, - logsToInclude: notificationListResult.data?.logsToInclude?.map((m) => ({ - label: m, - value: m, - })), - Severity: notificationListResult.data?.Severity?.map((s) => ({ - label: s, - value: s, - })), - }} - onSubmit={onSubmit} - render={({ handleSubmit, submitting, values }) => { - return ( - - {notificationConfigResult.isFetching && ( - - Loading - - )} - {notificationConfigResult.isSuccess && !notificationConfigResult.isFetching && ( - - {notificationConfigResult.data?.Results} - - )} - {notificationConfigResult.isError && !notificationConfigResult.isFetching && ( - - Could not connect to API: {notificationConfigResult.error.message} - - )} - - - - - - - - - - - - - - - - - - - + <> + {notificationListResult.isUninitialized && listNotification()} + {notificationListResult.isFetching || + (generateAlertResult.isFetching && ( + + ))} + {!notificationListResult.isFetching && notificationListResult.error && ( + Error loading data + )} + {notificationListResult.isSuccess && ( + true} + initialValues={{ + ...notificationListResult.data, + logsToInclude: notificationListResult.data?.logsToInclude?.map((m) => ({ + label: m, + value: m, + })), + Severity: notificationListResult.data?.Severity?.map((s) => ({ + label: s, + value: s, + })), + }} + onSubmit={onSubmit} + render={({ handleSubmit, submitting, values }) => { + return ( + + {notificationConfigResult.isFetching && ( + + Loading + + )} + {notificationConfigResult.isSuccess && !notificationConfigResult.isFetching && ( + + {notificationConfigResult.data?.Results} + + )} + {notificationConfigResult.isError && !notificationConfigResult.isFetching && ( + + Could not connect to API: {notificationConfigResult.error.message} + + )} - + + + + + + + + + + + + + + + + + + + + + - - - ) - }} - /> - )} - - Use the button below to save the changes, or generate a test alert. The test alert will be - processed in a batch with other alerts - + + ) + }} + /> + )} + + Use the button below to save the changes, or generate a test alert. The test alert will + be processed in a batch with other alerts + + ) diff --git a/src/views/cipp/app-settings/SettingsPartner.jsx b/src/views/cipp/app-settings/SettingsPartner.jsx index b569b9c33c24..823844ac56b5 100644 --- a/src/views/cipp/app-settings/SettingsPartner.jsx +++ b/src/views/cipp/app-settings/SettingsPartner.jsx @@ -24,6 +24,7 @@ import React, { useEffect } from 'react' import { CippCallout } from 'src/components/layout/index.js' import { CippCodeBlock } from 'src/components/utilities' import { CellDate } from 'src/components/tables' +import Skeleton from 'react-loading-skeleton' /** * Sets the notification settings. @@ -148,17 +149,21 @@ export function SettingsPartner() { render={({ handleSubmit }) => ( <> - ({ - name: event, - value: event, - }))} - multi={true} - refreshFunction={() => webhookEvents.refetch()} - helpText="Select the events you want to receive notifications for." - /> + {webhookEvents.isSuccess ? ( + ({ + name: event, + value: event, + }))} + multi={true} + refreshFunction={() => webhookEvents.refetch()} + helpText="Select the events you want to receive notifications for." + /> + ) : ( + + )} { - submitWebhook({ + execPartnerMode({ path: '/api/ExecPartnerMode', values: values, }).then((res) => {}) @@ -28,9 +34,33 @@ export function SettingsSuperAdmin() { form="submitForm" type="submit" color="primary" - disabled={webhookCreateResult.isFetching} + disabled={execPartnerModeResult.isFetching} > - {webhookCreateResult.isFetching ? ( + {execPartnerModeResult.isFetching ? ( + <> + + + ) : ( + 'Save' + )} + + ) + + const onSubmitOffload = (values) => { + execOffloadFunctions({ + path: '/api/ExecOffloadFunctions', + values: values, + }).then((res) => {}) + } + + const buttonCardOffload = ( + + {execOffloadFunctionsResult.isFetching ? ( <> @@ -42,71 +72,119 @@ export function SettingsSuperAdmin() { return ( <> - - <> - <> - - -

- The configuration settings below should only be modified by a super admin. Super - admins can configure what tenant mode CIPP operates in. See - - our documentation - - for more information on how to configure these modes and what they mean. -

-
-
- - -

Tenant Mode

- ( - <> - {partnerConfig.isFetching && } - - - - - - + + + + <> + <> + + +

+ The configuration settings below should only be modified by a super admin. + Super admins can configure what tenant mode CIPP operates in. See + + our documentation + + for more information on how to configure these modes and what they mean. +

+
+
+ + +

Tenant Mode

+ ( + <> + + + + + + + )} + /> + {execPartnerModeResult.isSuccess && ( + + {execPartnerModeResult?.data?.results} + + )} +
+
+ + +
+
+ + + <> + + +

+ This mode enables offloading some of the more processor intensive functions to a + separate function app. This can be useful in environments where the CIPP server + is under heavy load. +

+
Current Functions
+
    +
  • Audit Logs
  • +
+
+
+ + + ( + <> + + + + + )} + /> + {execOffloadFunctionsResult.isSuccess && ( + + {execOffloadFunctionsResult?.data?.results} + )} - /> - {webhookCreateResult.isSuccess && ( - - {webhookCreateResult?.data?.results} - - )} - - - - -
+
+
+ +
+ + + ) } diff --git a/src/views/cipp/app-settings/SettingsWebhookSubscriptions.jsx b/src/views/cipp/app-settings/SettingsWebhookSubscriptions.jsx index 965e13b57b90..61d74b736f06 100644 --- a/src/views/cipp/app-settings/SettingsWebhookSubscriptions.jsx +++ b/src/views/cipp/app-settings/SettingsWebhookSubscriptions.jsx @@ -49,6 +49,7 @@ export function SettingsWebhookSubscriptions() { path: 'api/ExecWebhookSubscriptions', reportName: `Log Subscriptions`, tableProps: { + keyField: 'RowKey', selectableRows: true, actionsList: [ { diff --git a/src/views/cipp/app-settings/components/SettingsAppPermissions.jsx b/src/views/cipp/app-settings/components/SettingsAppPermissions.jsx new file mode 100644 index 000000000000..d36dffb0b597 --- /dev/null +++ b/src/views/cipp/app-settings/components/SettingsAppPermissions.jsx @@ -0,0 +1,70 @@ +import React, { useRef, useState } from 'react' +import { + CButton, + CCallout, + CCol, + CForm, + CRow, + CAccordion, + CAccordionHeader, + CAccordionBody, + CAccordionItem, +} from '@coreui/react' +import { Field, Form, FormSpy } from 'react-final-form' +import { RFFCFormRadioList, RFFSelectSearch } from 'src/components/forms' +import { useGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { TenantSelectorMultiple, ModalService, CippOffcanvas } from 'src/components/utilities' +import PropTypes from 'prop-types' +import { OnChange } from 'react-final-form-listeners' +import { useListTenantsQuery } from 'src/store/api/tenants' +import { OffcanvasListSection } from 'src/components/utilities/CippListOffcanvas' +import CippButtonCard from 'src/components/contentcards/CippButtonCard' +import CippAppPermissionBuilder from 'src/components/utilities/CippAppPermissionBuilder' + +const SettingsAppPermissions = () => { + const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery() + const handleSubmit = (values) => { + genericPostRequest({ + path: 'api/ExecSAMAppPermissions?Action=Update', + values: values, + }).then(() => { + refetchSam() + }) + } + + const { + data: samAppPermissions = [], + isFetching: samAppPermissionsFetching, + refetch: refetchSam, + } = useGenericGetRequestQuery({ + path: 'api/ExecSAMAppPermissions', + }) + + return ( + + <> +

Manage the permissions for the CIPP-SAM App Registration and CPV.

+

+ This functionality is in + beta and should be treated as such. Removing permissions from the CIPP-SAM App is not + advised. +

+ + + + {postResults.data && ( + + {postResults?.data?.Results} + + )} + +
+ ) +} + +export default SettingsAppPermissions diff --git a/src/views/cipp/app-settings/components/SettingsSAMRoles.jsx b/src/views/cipp/app-settings/components/SettingsSAMRoles.jsx index ebc8310b6abd..fdce15fb39cd 100644 --- a/src/views/cipp/app-settings/components/SettingsSAMRoles.jsx +++ b/src/views/cipp/app-settings/components/SettingsSAMRoles.jsx @@ -14,11 +14,10 @@ import { Field, Form, FormSpy } from 'react-final-form' import { RFFCFormRadioList, RFFSelectSearch } from 'src/components/forms' import { useGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { TenantSelectorMultiple, ModalService, CippOffcanvas } from 'src/components/utilities' +import { TenantSelectorMultiple, ModalService } from 'src/components/utilities' import PropTypes from 'prop-types' import { OnChange } from 'react-final-form-listeners' import { useListTenantsQuery } from 'src/store/api/tenants' -import { OffcanvasListSection } from 'src/components/utilities/CippListOffcanvas' import CippButtonCard from 'src/components/contentcards/CippButtonCard' import GDAPRoles from 'src/data/GDAPRoles' diff --git a/src/views/email-exchange/connectors/ConnectorList.jsx b/src/views/email-exchange/connectors/ConnectorList.jsx index c18d5eeb0004..1f3829abcb1d 100644 --- a/src/views/email-exchange/connectors/ConnectorList.jsx +++ b/src/views/email-exchange/connectors/ConnectorList.jsx @@ -57,7 +57,7 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { modal: true, icon: , modalUrl: `/api/RemoveExConnector?TenantFilter=${tenant.defaultDomainName}&GUID=${row.Guid}&Type=${row.cippconnectortype}`, - modalMessage: 'Are you sure you want to disable this rule?', + modalMessage: 'Are you sure you want to delete this rule?', }, ]} placement="end" diff --git a/src/views/identity/administration/DeployJITAdmin.jsx b/src/views/identity/administration/DeployJITAdmin.jsx index 81d23666fa61..146ab7d6fef1 100644 --- a/src/views/identity/administration/DeployJITAdmin.jsx +++ b/src/views/identity/administration/DeployJITAdmin.jsx @@ -47,10 +47,13 @@ const DeployJITAdmin = () => { const onSubmit = (values) => { const startTime = Math.floor(startDate.getTime() / 1000) const endTime = Math.floor(endDate.getTime() / 1000) + const shippedValues = { TenantFilter: tenantDomain, - UserId: values.UserId?.value, - UserPrincipalName: `${values.username}@${values.domain}`, + UserId: values.UserId?.value.id, + UserPrincipalName: values.username + ? `${values.username}@${values.domain}` + : values.UserId?.value.userPrincipalName, FirstName: values.FirstName, LastName: values.LastName, useraction: values.useraction, @@ -168,7 +171,7 @@ const DeployJITAdmin = () => { ({ - value: user.id, + value: { userPrincipalName: user.userPrincipalName, id: user.id }, name: `${user.displayName} <${user.userPrincipalName}>`, }))} placeholder={!usersIsFetching ? 'Select user' : 'Loading...'} diff --git a/src/views/identity/administration/Users.jsx b/src/views/identity/administration/Users.jsx index 4d236659ad7f..eb0cd4f29f6c 100644 --- a/src/views/identity/administration/Users.jsx +++ b/src/views/identity/administration/Users.jsx @@ -99,10 +99,10 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { }, { label: 'Rerequire MFA registration', - link: entraLink, color: 'info', - target: '_blank', - external: true, + modal: true, + modalUrl: `/api/ExecResetMFA?TenantFilter=${tenant.defaultDomainName}&ID=${row.userPrincipalName}`, + modalMessage: 'Are you sure you want to reset MFA for this user?', }, { label: 'Send MFA Push', @@ -527,8 +527,8 @@ const Users = (row) => { { label: 'Rerequire MFA registration', modal: true, - modalUrl: `/api/ExecResetMFA?TenantFilter=!Tenant&ID=!id`, - modalMessage: 'Are you sure you want to enable MFA for these users?', + modalUrl: `/api/ExecResetMFA?TenantFilter=!Tenant&ID=!userPrincipalName`, + modalMessage: 'Are you sure you want to reset MFA for these users?', }, { label: 'Set Per-User MFA', diff --git a/src/views/teams-share/teams/BusinessVoice.jsx b/src/views/teams-share/teams/BusinessVoice.jsx index 6c132806d8bf..5f2c0d32598a 100644 --- a/src/views/teams-share/teams/BusinessVoice.jsx +++ b/src/views/teams-share/teams/BusinessVoice.jsx @@ -1,68 +1,208 @@ -import React from 'react' +import React, { useState } from 'react' +import { CButton } from '@coreui/react' import { useSelector } from 'react-redux' import { CellBoolean } from 'src/components/tables' import { CippPageList } from 'src/components/layout' - -const Formatter = (cell) => CellBoolean({ cell }) -const columns = [ - { - name: 'Assigned to User', - selector: (row) => row['AssignedTo'], - sortable: true, - exportSelector: 'AssignedTo', - }, - { - name: 'Phone Number', - selector: (row) => row['TelephoneNumber'], - sortable: true, - exportSelector: 'TelephoneNumber', - }, - { - name: 'Number Type', - selector: (row) => row['NumberType'], - sortable: true, - exportSelector: 'NumberType', - }, - { - name: 'Country', - selector: (row) => row['IsoCountryCode'], - sortable: true, - exportSelector: 'IsCountryCode', - }, - { - name: 'Location', - selector: (row) => row['PlaceName'], - sortable: true, - exportSelector: 'PlaceName', - }, - { - name: 'Activation State', - selector: (row) => row['ActivationState'], - formatter: Formatter, - exportSelector: 'ActivationState', - sortable: true, - }, - { - name: 'Operator Connect', - selector: (row) => row['IsOperatorConnect'], - formatter: Formatter, - sortable: true, - exportSelector: 'IsOperatorConnect', - }, - { - name: 'Purchased on', - selector: (row) => row['AcquisitionDate'], - sortable: true, - exportSelector: 'AcquisitionDate', - }, -] +import { TitleButton } from 'src/components/buttons' +import { CippActionsOffcanvas } from 'src/components/utilities' +import { faEllipsisV } from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' const BusinessVoice = () => { const tenant = useSelector((state) => state.app.currentTenant) + const Offcanvas = (row, rowIndex, formatExtraData) => { + const tenant = useSelector((state) => state.app.currentTenant) + const [ocVisible, setOCVisible] = useState(false) + return ( + <> + setOCVisible(true)}> + + + setOCVisible(false)} + /> + + ) + } + const Formatter = (cell) => CellBoolean({ cell }) + const usageFormatter = (cell) => { + if (cell.includes('UserAssignment')) { + return 'User' + } + if (cell.includes('FirstPartyAppAssignment')) { + return 'Voice App' + } + if (cell.includes('ConferenceAssignment')) { + return 'Conference' + } + return cell[0] + } + const columns = [ + { + name: 'Assigned to User', + selector: (row) => row['AssignedTo'], + sortable: true, + exportSelector: 'AssignedTo', + }, + { + name: 'Phone Number', + selector: (row) => row['TelephoneNumber'], + sortable: true, + exportSelector: 'TelephoneNumber', + }, + { + name: 'Assignment Status', + selector: (row) => row['AssignmentStatus'], + sortable: true, + exportSelector: 'AssignmentStatus', + }, + { + name: 'Number Type', + selector: (row) => row['NumberType'], + sortable: true, + exportSelector: 'NumberType', + }, + { + name: 'Licensed Usage', + selector: (row) => usageFormatter(row['AcquiredCapabilities']), + sortable: true, + exportSelector: 'AcquiredCapabilities', + }, + { + name: 'Country', + selector: (row) => row['IsoCountryCode'], + sortable: true, + exportSelector: 'IsCountryCode', + }, + { + name: 'Location', + selector: (row) => row['PlaceName'], + sortable: true, + exportSelector: 'PlaceName', + }, + { + name: 'Activation State', + selector: (row) => row['ActivationState'], + formatter: Formatter, + exportSelector: 'ActivationState', + sortable: true, + }, + { + name: 'Operator Connect', + selector: (row) => row['IsOperatorConnect'], + formatter: Formatter, + sortable: true, + exportSelector: 'IsOperatorConnect', + }, + { + name: 'Purchased on', + selector: (row) => row['AcquisitionDate'], + sortable: true, + exportSelector: 'AcquisitionDate', + }, + { + name: 'Actions', + cell: Offcanvas, + }, + ] + const titleButtons = ( +
+
+ +
+
+ ) return ( { const tenantDomain = useSelector((state) => state.app.currentTenant.defaultDomainName) @@ -112,6 +113,18 @@ const AlertWizard = () => { } } + const getScriptDescription = () => { + const values = currentFormState?.values + if (values) { + const command = values.command?.value + if (command?.description) { + return HtmlParser(command.description) + } else { + return null + } + } + } + const setAuditForm = (e) => { const preset = presetValues.find((p) => p.value === e.value) setAuditFormState(preset.template) @@ -368,6 +381,16 @@ const AlertWizard = () => { render={({ handleSubmit, submitting, values }) => { return ( + {getScriptDescription() && ( + + + + + {getScriptDescription()} + + + + )} { /> + diff --git a/version_latest.txt b/version_latest.txt index ca06394388d6..798e38995c4d 100644 --- a/version_latest.txt +++ b/version_latest.txt @@ -1 +1 @@ -6.2.2 +6.3.0