Merge branch 'master' of https://gitlab.com/fyipe-project/app into log-container-ui-updates

This commit is contained in:
augustinebest
2021-09-07 10:00:07 +01:00
20 changed files with 458 additions and 227 deletions

View File

@@ -304,10 +304,19 @@ module.exports = {
);
const select =
'_id name slug data type monitorSla breachedMonitorSla breachClosedBy componentId projectId incidentCommunicationSla criteria agentlessConfig lastPingTime lastMatchedCriterion method bodyType formData text headers disabled pollTime updateTime customFields siteUrls lighthouseScanStatus';
'_id monitorStatus name slug resourceCategory data type monitorSla breachedMonitorSla breachClosedBy componentId projectId incidentCommunicationSla criteria agentlessConfig lastPingTime lastMatchedCriterion method bodyType formData text headers disabled pollTime updateTime customFields siteUrls lighthouseScanStatus';
const populate = [
{
path: 'monitorSla',
select: 'frequency _id',
},
{ path: 'componentId', select: 'name' },
{ path: 'incidentCommunicationSla', select: '_id' },
{ path: 'resourceCategory', select: 'name' },
];
const query = { _id };
const monitor = await this.findOneBy({ query, select });
const monitor = await this.findOneBy({ query, select, populate });
RealTimeService.monitorEdit(monitor);
return monitor;
},
@@ -411,14 +420,15 @@ module.exports = {
query.deleted = false;
const select =
'_id monitorStatus name slug data type monitorSla breachedMonitorSla breachClosedBy componentId projectId incidentCommunicationSla criteria agentlessConfig lastPingTime lastMatchedCriterion method bodyType formData text headers disabled pollTime updateTime customFields siteUrls lighthouseScanStatus';
'_id monitorStatus name slug resourceCategory data type monitorSla breachedMonitorSla breachClosedBy componentId projectId incidentCommunicationSla criteria agentlessConfig lastPingTime lastMatchedCriterion method bodyType formData text headers disabled pollTime updateTime customFields siteUrls lighthouseScanStatus';
const populate = [
{
path: 'monitorSla',
select: 'frequency _id',
},
{ path: 'componentId', select: 'name slug' },
{ path: 'componentId', select: 'name' },
{ path: 'incidentCommunicationSla', select: '_id' },
{ path: 'resourceCategory', select: 'name' },
];
const monitor = await this.findOneBy({ query, select, populate });
// run in the background
@@ -1630,11 +1640,21 @@ module.exports = {
}
const select =
'_id name slug data type monitorSla breachedMonitorSla breachClosedBy componentId projectId incidentCommunicationSla criteria lastPingTime lastMatchedCriterion method disabled customFields';
'_id monitorStatus name slug resourceCategory data type monitorSla breachedMonitorSla breachClosedBy componentId projectId incidentCommunicationSla criteria agentlessConfig lastPingTime lastMatchedCriterion method bodyType formData text headers disabled pollTime updateTime customFields siteUrls lighthouseScanStatus';
const populate = [
{
path: 'monitorSla',
select: 'frequency _id',
},
{ path: 'componentId', select: 'name' },
{ path: 'incidentCommunicationSla', select: '_id' },
{ path: 'resourceCategory', select: 'name' },
];
const monitorData = await this.findOneBy({
query: { _id: monitor._id },
select,
populate,
});
// run in the background
RealTimeService.monitorEdit(monitorData);

View File

@@ -245,4 +245,8 @@
.bs-Button--security-scan.bs-is-disabled:before,
.bs-Button--security-scan:disabled:before {
background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjUxMnB4IiBoZWlnaHQ9IjUxMnB4IiB2aWV3Qm94PSIwIDAgNDQ2LjI1IDQ0Ni4yNSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDQ2LjI1IDQ0Ni4yNTsiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxnIHRyYW5zZm9ybT0ibWF0cml4KDAuNzQ3MTcyIDAgMCAwLjc0NzE3MiA1Ni40MTIyIDU2LjQxMjIpIj48Zz4KCTxnIGlkPSJzZWFyY2giPgoJCTxwYXRoIGQ9Ik0zMTguNzUsMjgwLjVoLTIwLjRsLTcuNjQ5LTcuNjVjMjUuNS0yOC4wNSw0MC44LTY2LjMsNDAuOC0xMDcuMUMzMzEuNSw3My45NSwyNTcuNTUsMCwxNjUuNzUsMFMwLDczLjk1LDAsMTY1Ljc1ICAgIFM3My45NSwzMzEuNSwxNjUuNzUsMzMxLjVjNDAuOCwwLDc5LjA1LTE1LjMsMTA3LjEtNDAuOGw3LjY1LDcuNjQ5djIwLjRMNDA4LDQ0Ni4yNUw0NDYuMjUsNDA4TDMxOC43NSwyODAuNXogTTE2NS43NSwyODAuNSAgICBDMTAyLDI4MC41LDUxLDIyOS41LDUxLDE2NS43NVMxMDIsNTEsMTY1Ljc1LDUxUzI4MC41LDEwMiwyODAuNSwxNjUuNzVTMjI5LjUsMjgwLjUsMTY1Ljc1LDI4MC41eiIgZGF0YS1vcmlnaW5hbD0iIzAwMDAwMCIgY2xhc3M9ImFjdGl2ZS1wYXRoIiBkYXRhLW9sZF9jb2xvcj0iIzAwMDAwMCIgZmlsbD0iIzg4OThBQSIvPgoJPC9nPgo8L2c+PC9nPiA8L3N2Zz4K");
}
.internal-list p {
margin: 0;
}

View File

@@ -79,9 +79,10 @@ class ResourceTabularList extends Component {
)[0];
if (monitor) {
const incidents = monitor.incidents;
const lastMatchedCriterion = monitor.lastMatchedCriterion
? monitor.lastMatchedCriterion.name.toLowerCase()
: null;
const lastMatchedCriterion =
monitor.lastMatchedCriterion &&
monitor.lastMatchedCriterion.name &&
monitor.lastMatchedCriterion.name.toLowerCase();
status = monitor.monitorStatus
? monitor.monitorStatus
: lastMatchedCriterion

View File

@@ -199,13 +199,32 @@ export class IncidentMessageThread extends Component {
style={{
display:
'block',
whiteSpace:
'pre-wrap',
}}
>
<Markdown>
{
incidentMessage.content
}
</Markdown>
{incidentMessage.content &&
incidentMessage.content
.split(
'\n'
)
.map(
(
elem,
index
) => (
<Markdown
key={`${elem}-${index}`}
options={{
forceBlock: true,
}}
>
{
elem
}
</Markdown>
)
)}
</span>
<ShouldRender
if={
@@ -533,13 +552,32 @@ export class IncidentMessageThread extends Component {
'block',
marginTop:
'10px',
whiteSpace:
'pre-wrap',
}}
>
<Markdown>
{
incidentMessage.content
}
</Markdown>
{incidentMessage.content &&
incidentMessage.content
.split(
'\n'
)
.map(
(
elem,
index
) => (
<Markdown
key={`${elem}-${index}`}
options={{
forceBlock: true,
}}
>
{
elem
}
</Markdown>
)
)}
</span>
</div>
</div>

View File

@@ -39,14 +39,18 @@ class CreateAnnouncement extends Component {
window.removeEventListener('keydown', this.handleKeyBoard);
}
handleKeyBoard = e => {
switch (e.key) {
case 'Escape':
return this.handleCloseModal();
case 'Enter':
return document.getElementById('createAnnouncementBtn').click();
default:
return false;
handleKeyBoard = event => {
if (event.target.localName !== 'textarea' && event.key) {
switch (event.key) {
case 'Escape':
return this.handleCloseModal();
case 'Enter':
return document
.getElementById('createAnnouncementBtn')
.click();
default:
return false;
}
}
};

View File

@@ -253,6 +253,7 @@ class DeleteAccount extends Component {
onClick={() =>
this.props.logoutUser()
}
id="close"
>
<span>Close</span>
</button>

View File

@@ -117,17 +117,23 @@ class NewIncidentMessage extends Component {
}
this.props.closeThisDialog();
};
handleKeyBoard = e => {
handleKeyBoard = event => {
const { closeThisDialog, data } = this.props;
switch (e.key) {
case 'Escape':
return closeThisDialog();
case 'Enter':
return data.edit
? document.getElementById(`${data.type}-editButton`).click()
: document.getElementById(`${data.type}-addButton`).click();
default:
return false;
if (event.target.localName !== 'textarea' && event.key) {
switch (event.key) {
case 'Escape':
return closeThisDialog();
case 'Enter':
return data.edit
? document
.getElementById(`${data.type}-editButton`)
.click()
: document
.getElementById(`${data.type}-addButton`)
.click();
default:
return false;
}
}
};
onTemplateChange = value => {

View File

@@ -334,7 +334,11 @@ export class MonitorDetail extends Component {
: 'Padding-left--20'
}`}
>
<Badge color={'slate5'}>
<Badge
color={'slate5'}
backgroundColor="#fff"
fontColor="#000"
>
{monitor && monitor.resourceCategory
? monitor.resourceCategory.name
: ''}

View File

@@ -277,13 +277,32 @@ export class ScheduledEventNote extends Component {
'block',
marginTop:
'10px',
whiteSpace:
'pre-wrap',
}}
>
<Markdown>
{
note.content
}
</Markdown>
{note.content &&
note.content
.split(
'\n'
)
.map(
(
elem,
index
) => (
<Markdown
key={`${elem}-${index}`}
options={{
forceBlock: true,
}}
>
{
elem
}
</Markdown>
)
)}
</span>
</div>
</div>

View File

@@ -26,7 +26,7 @@ import AlertDisabledWarning from '../components/settings/AlertDisabledWarning';
import CustomTutorial from '../components/tutorial/CustomTutorial';
import { fetchComponents } from '../actions/component';
class DashboardView extends Component {
class ComponentDashboardView extends Component {
componentDidMount() {
this.props.loadPage('Components');
if (IS_SAAS_SERVICE) {
@@ -436,7 +436,7 @@ const mapStateToProps = state => {
};
};
DashboardView.propTypes = {
ComponentDashboardView.propTypes = {
currentProject: PropTypes.oneOfType([
PropTypes.object,
PropTypes.oneOf([null, undefined]),
@@ -471,6 +471,9 @@ DashboardView.propTypes = {
switchToProjectViewerNav: PropTypes.bool,
};
DashboardView.displayName = 'DashboardView';
ComponentDashboardView.displayName = 'ComponentDashboardView';
export default connect(mapStateToProps, mapDispatchToProps)(DashboardView);
export default connect(
mapStateToProps,
mapDispatchToProps
)(ComponentDashboardView);

View File

@@ -40,7 +40,7 @@ const socket = io.connect(REALTIME_URL.replace('/realtime', ''), {
path: '/realtime/socket.io',
transports: ['websocket', 'polling'],
});
class DashboardView extends Component {
class MonitorDashboardView extends Component {
componentDidMount() {
this.props.loadPage('Monitors');
if (SHOULD_LOG_ANALYTICS) {
@@ -595,7 +595,7 @@ const mapStateToProps = (state, ownProps) => {
};
};
DashboardView.propTypes = {
MonitorDashboardView.propTypes = {
currentProject: PropTypes.oneOfType([
PropTypes.object,
PropTypes.oneOf([null, undefined]),
@@ -638,6 +638,9 @@ DashboardView.propTypes = {
switchToProjectViewerNav: PropTypes.bool,
};
DashboardView.displayName = 'DashboardView';
MonitorDashboardView.displayName = 'MonitorDashboardView';
export default connect(mapStateToProps, mapDispatchToProps)(DashboardView);
export default connect(
mapStateToProps,
mapDispatchToProps
)(MonitorDashboardView);

View File

@@ -13318,11 +13318,6 @@
"safer-buffer": "^2.0.2",
"tweetnacl": "~0.14.0"
},
"bin": {
"sshpk-conv": "bin/sshpk-conv",
"sshpk-sign": "bin/sshpk-sign",
"sshpk-verify": "bin/sshpk-verify"
},
"engines": {
"node": ">=0.10.0"
}

View File

@@ -91,7 +91,7 @@ h6 {
}
p, blockquote, ul, ol, dl, li, table, pre {
margin: 15px 0;
margin: 5px 0 0 0;
}
hr {

View File

@@ -70,7 +70,8 @@ ul.plain {
}
a { color: #6772e5; text-decoration: none; }
a:hover { color: #4c4c4c; }
/* a:hover { color: #4c4c4c; } */
a:hover { color: #6772e5 !important; }
/******* Simple Bar Chart *******/

View File

@@ -114,10 +114,18 @@ function AnnouncementBox({ announcement, monitorState, type }) {
{announcement.name}
</div>
</div>
<div className="ann_desc">
{announcement?.description && (
<Markdown>{announcement.description}</Markdown>
)}
<div className="ann_desc" style={{ whiteSpace: 'pre-wrap' }}>
{announcement?.description &&
announcement.description.split('\n').map((elem, index) => (
<Markdown
key={`${elem}-${index}`}
options={{
forceBlock: true,
}}
>
{elem}
</Markdown>
))}
</div>
<ShouldRender if={announcement.monitors.length > 0}>
<div className={'resources_aff'}>

View File

@@ -7,6 +7,7 @@ import { bindActionCreators } from 'redux';
import moment from 'moment';
import ShouldRender from './ShouldRender';
import { handleResources } from '../config';
import Markdown from 'markdown-to-jsx';
class AnnouncementLogs extends Component {
state = {
@@ -85,8 +86,24 @@ class AnnouncementLogs extends Component {
<div
className="incident_desc"
id={`event-description-`}
style={{
whiteSpace: 'pre-wrap',
}}
>
{log.announcementId.description}
{log.announcementId
.description &&
log.announcementId.description
.split('\n')
.map((elem, index) => (
<Markdown
key={`${elem}-${index}`}
options={{
forceBlock: true,
}}
>
{elem}
</Markdown>
))}
</div>
<ShouldRender
if={
@@ -221,13 +238,38 @@ class AnnouncementLogs extends Component {
.name
}
</div>
<div className="ct_desc">
<div
className="ct_desc"
style={{
whiteSpace:
'pre-wrap',
}}
>
<Translate>
{
log
.announcementId
.description
}
{log
.announcementId
.description &&
log.announcementId.description
.split(
'\n'
)
.map(
(
elem,
index
) => (
<Markdown
key={`${elem}-${index}`}
options={{
forceBlock: true,
}}
>
{
elem
}
</Markdown>
)
)}
</Translate>
</div>
<ShouldRender

View File

@@ -1,5 +1,6 @@
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { Link } from 'react-router-dom';
import { Translate } from 'react-auto-translate';
import { bindActionCreators } from 'redux';
import PropTypes from 'prop-types';
@@ -304,6 +305,7 @@ class Incident extends Component {
incident,
incidentNotes,
lastIncidentTimeline,
statusData,
} = this.props;
const error = this.renderError();
@@ -345,13 +347,30 @@ class Incident extends Component {
className="feed-title"
style={{
fontWeight: 'bold',
marginBottom: 10,
fontSize: 30,
textAlign: 'center',
// textTransform: 'unset',
}}
>
{incident.title}
</header>
<p
style={{
textAlign: 'center',
fontWeight: '500',
marginBottom: 10,
color: 'rgba(0, 0, 0, 0.6)',
fontSize: 25,
}}
>
Incident Report for{' '}
<Link
style={{ color: 'rgba(0, 0, 0, 0.6)' }}
to={`/status-page/${statusData.slug}`}
>
{statusData.name}
</Link>
</p>
<span
style={{
color: 'rgba(0, 0, 0, 0.6)',
@@ -444,9 +463,30 @@ class Incident extends Component {
}}
>
{note.content && (
<Markdown>
{note.content}
</Markdown>
<div
style={{
whiteSpace:
'pre-wrap',
}}
>
{note.content
.split('\n')
.map(
(
elem,
index
) => (
<Markdown
key={`${elem}-${index}`}
options={{
forceBlock: true,
}}
>
{elem}
</Markdown>
)
)}
</div>
)}
</span>
<span
@@ -724,15 +764,31 @@ class Incident extends Component {
'block',
textAlign:
'justify',
whiteSpace:
'pre-wrap',
}}
>
{note.content && (
<Markdown>
{
note.content
}
</Markdown>
)}
{note.content
.split(
'\n'
)
.map(
(
elem,
index
) => (
<Markdown
key={`${elem}-${index}`}
options={{
forceBlock: true,
}}
>
{
elem
}
</Markdown>
)
)}
</span>
<span
style={{

View File

@@ -15,6 +15,7 @@ import {
import { ACCOUNTS_URL } from '../config';
import { ListLoader } from './basic/Loader';
import AffectedResources from './basic/AffectedResources';
import { Link } from 'react-router-dom';
class ScheduledEvent extends Component {
componentDidMount() {
@@ -132,35 +133,6 @@ class ScheduledEvent extends Component {
const currentTime = moment();
// eslint-disable-next-line no-console
console.log('** scheduled event **', scheduledEvent);
// eslint-disable-next-line no-console
console.log(
'** isSameOrAfter **',
currentTime.isSameOrAfter(moment(scheduledEvent.startDate))
);
// eslint-disable-next-line no-console
console.log(
'** logic **',
currentTime.isSameOrAfter(moment(scheduledEvent.startDate)) &&
currentTime.isBefore(moment(scheduledEvent.endDate))
);
// eslint-disable-next-line no-console
console.log(
'** isAfter **',
currentTime.isAfter(moment(scheduledEvent.startDate))
);
// eslint-disable-next-line no-console
console.log(
'** isSameOrBefore **',
currentTime.isSameOrBefore(moment(scheduledEvent.startDate))
);
// eslint-disable-next-line no-console
console.log(
'** isBefore **',
currentTime.isBefore(moment(scheduledEvent.startDate))
);
return (
<div
className="page-main-wrapper"
@@ -177,99 +149,47 @@ class ScheduledEvent extends Component {
}}
>
<div style={{ marginBottom: 50 }}>
<div
style={{
display: 'flex',
alignItems: 'center',
}}
>
<header
className="feed-title"
<div>
<div
style={{
fontWeight: 'bold',
marginBottom: 10,
fontSize: 30,
// textTransform: 'unset',
display: 'flex',
alignItems: 'baseline',
justifyContent: 'center',
}}
>
{scheduledEvent.name}
</header>
{!fetchingNotes &&
eventNotes &&
!fetchingEvent &&
scheduledEvent.startDate &&
scheduledEvent.endDate ? (
scheduledEvent.cancelled ? (
<div
style={{
marginLeft: 15,
}}
className="Badge Badge--color--red Box-root Flex-inlineFlex Flex-alignItems--center Padding-horizontal--8 Padding-vertical--2"
>
<span className="Badge-text Text-color--red Text-display--inline Text-fontSize--12 Text-fontWeight--bold Text-lineHeight--16 Text-typeface--upper Text-wrap--noWrap">
<span id="ongoing-event">
<Translate>
Cancelled
</Translate>
<header
className="feed-title"
style={{
fontWeight: 'bold',
textAlign: 'center',
fontSize: 30,
// textTransform: 'unset',
}}
>
{scheduledEvent.name}
</header>
{!fetchingNotes &&
eventNotes &&
!fetchingEvent &&
scheduledEvent.startDate &&
scheduledEvent.endDate ? (
scheduledEvent.cancelled ? (
<div
style={{
marginLeft: 15,
}}
className="Badge Badge--color--red Box-root Flex-inlineFlex Flex-alignItems--center Padding-horizontal--8 Padding-vertical--2"
>
<span className="Badge-text Text-color--red Text-display--inline Text-fontSize--12 Text-fontWeight--bold Text-lineHeight--16 Text-typeface--upper Text-wrap--noWrap">
<span id="ongoing-event">
<Translate>
Cancelled
</Translate>
</span>
</span>
</span>
</div>
) : scheduledEvent.resolved ? (
<div
style={{
marginLeft: 15,
}}
className="Badge Badge--color--green Box-root Flex-inlineFlex Flex-alignItems--center Padding-horizontal--8 Padding-vertical--2"
>
<span className="Badge-text Text-color--green Text-display--inline Text-fontSize--12 Text-fontWeight--bold Text-lineHeight--16 Text-typeface--upper Text-wrap--noWrap">
<span id="ongoing-event">
<Translate>
Completed
</Translate>
</span>
</span>
</div>
) : currentTime.isSameOrAfter(
moment(scheduledEvent.startDate)
) &&
currentTime.isBefore(
moment(scheduledEvent.endDate)
) ? (
<div
style={{
marginLeft: 15,
}}
className="Badge Badge--color--yellow Box-root Flex-inlineFlex Flex-alignItems--center Padding-horizontal--8 Padding-vertical--2"
>
<span className="Badge-text Text-color--yellow Text-display--inline Text-fontSize--12 Text-fontWeight--bold Text-lineHeight--16 Text-typeface--upper Text-wrap--noWrap">
<span id="ongoing-event">
<Translate>
Ongoing
</Translate>
</span>
</span>
</div>
) : currentTime.isBefore(
moment(scheduledEvent.startDate)
) ? (
<div
style={{
marginLeft: 15,
}}
className="Badge Badge--color--blue Box-root Flex-inlineFlex Flex-alignItems--center Padding-horizontal--8 Padding-vertical--2"
>
<span className="Badge-text Text-color--default Text-display--inline Text-fontSize--12 Text-fontWeight--bold Text-lineHeight--16 Text-typeface--upper Text-wrap--noWrap">
<span id="ongoing-event">
<Translate>
Scheduled
</Translate>
</span>
</span>
</div>
) : (
currentTime.isSameOrAfter(
moment(scheduledEvent.endDate)
) && (
</div>
) : scheduledEvent.resolved ? (
<div
style={{
marginLeft: 15,
@@ -279,14 +199,87 @@ class ScheduledEvent extends Component {
<span className="Badge-text Text-color--green Text-display--inline Text-fontSize--12 Text-fontWeight--bold Text-lineHeight--16 Text-typeface--upper Text-wrap--noWrap">
<span id="ongoing-event">
<Translate>
Ended
Completed
</Translate>
</span>
</span>
</div>
) : currentTime.isSameOrAfter(
moment(scheduledEvent.startDate)
) &&
currentTime.isBefore(
moment(scheduledEvent.endDate)
) ? (
<div
style={{
marginLeft: 15,
}}
className="Badge Badge--color--yellow Box-root Flex-inlineFlex Flex-alignItems--center Padding-horizontal--8 Padding-vertical--2"
>
<span className="Badge-text Text-color--yellow Text-display--inline Text-fontSize--12 Text-fontWeight--bold Text-lineHeight--16 Text-typeface--upper Text-wrap--noWrap">
<span id="ongoing-event">
<Translate>
Ongoing
</Translate>
</span>
</span>
</div>
) : currentTime.isBefore(
moment(scheduledEvent.startDate)
) ? (
<div
style={{
marginLeft: 15,
}}
className="Badge Badge--color--blue Box-root Flex-inlineFlex Flex-alignItems--center Padding-horizontal--8 Padding-vertical--2"
>
<span className="Badge-text Text-color--default Text-display--inline Text-fontSize--12 Text-fontWeight--bold Text-lineHeight--16 Text-typeface--upper Text-wrap--noWrap">
<span id="ongoing-event">
<Translate>
Scheduled
</Translate>
</span>
</span>
</div>
) : (
currentTime.isSameOrAfter(
moment(scheduledEvent.endDate)
) && (
<div
style={{
marginLeft: 15,
}}
className="Badge Badge--color--green Box-root Flex-inlineFlex Flex-alignItems--center Padding-horizontal--8 Padding-vertical--2"
>
<span className="Badge-text Text-color--green Text-display--inline Text-fontSize--12 Text-fontWeight--bold Text-lineHeight--16 Text-typeface--upper Text-wrap--noWrap">
<span id="ongoing-event">
<Translate>
Ended
</Translate>
</span>
</span>
</div>
)
)
)
) : null}
) : null}
</div>
<p
style={{
textAlign: 'center',
fontWeight: '500',
marginBottom: 10,
color: 'rgba(0, 0, 0, 0.6)',
fontSize: 25,
}}
>
Scheduled Maintenance Report for{' '}
<Link
style={{ color: 'rgba(0, 0, 0, 0.6)' }}
to={`/status-page/${statusData.slug}`}
>
{statusData.name}
</Link>
</p>
</div>
<span
style={{
@@ -377,13 +370,22 @@ class ScheduledEvent extends Component {
fontSize: 14,
display: 'block',
textAlign: 'justify',
whiteSpace: 'pre-wrap',
}}
>
{note.content && (
<Markdown>
{note.content}
</Markdown>
)}
{note.content &&
note.content
.split('\n')
.map((elem, index) => (
<Markdown
key={`${elem}-${index}`}
options={{
forceBlock: true,
}}
>
{elem}
</Markdown>
))}
</span>
<span
style={{
@@ -731,13 +733,32 @@ class ScheduledEvent extends Component {
'block',
textAlign:
'justify',
whiteSpace:
'pre-wrap',
}}
>
<Markdown>
{
note.content
}
</Markdown>
{note.content &&
note.content
.split(
'\n'
)
.map(
(
elem,
index
) => (
<Markdown
key={`${elem}-${index}`}
options={{
forceBlock: true,
}}
>
{
elem
}
</Markdown>
)
)}
</span>
<span
style={{

View File

@@ -85,15 +85,22 @@ class SingleAnnouncement extends Component {
<span
style={{
color: 'rgba(0, 0, 0, 0.5)',
whiteSpace: 'pre-wrap',
}}
>
{announcement.description && (
<Markdown>
{
announcement.description
}
</Markdown>
)}
{announcement.description &&
announcement.description
.split('\n')
.map((elem, index) => (
<Markdown
key={`${elem}-${index}`}
options={{
forceBlock: true,
}}
>
{elem}
</Markdown>
))}
</span>
</div>
<ShouldRender

View File

@@ -87,7 +87,7 @@ describe('Profile -> Delete Account Component test', () => {
const projectDeletion = await init.pageWaitForSelector(
page,
'#projectDeletion'
'#projectOwnership' // Updated UI
);
expect(projectDeletion).toBeDefined();
@@ -134,7 +134,7 @@ describe('Profile -> Delete Account Component test', () => {
const projectDeletion = await init.pageWaitForSelector(
page,
'#projectDeletion'
'#projectOwnership'
);
expect(projectDeletion).toBeDefined();
@@ -155,10 +155,9 @@ describe('Profile -> Delete Account Component test', () => {
// Change member role -> Owner
await init.pageWaitForSelector(page, '#teamMembers');
await init.pageClick(page, '#teamMembers');
await init.pageWaitForSelector(page, 'button[title="Change Role"]');
await init.pageClick(page, 'button[title="Change Role"]');
await init.pageWaitForSelector(page, `div[title="${role}"]`);
await init.pageClick(page, `div[title="${role}"]`);
const emailSelector = user1.email.split('@')[0];
await init.pageClick(page, `#changeRole_${emailSelector}`);
await init.pageClick(page, `#${role}`);
await init.pageWaitForSelector(page, '#confirmRoleChange');
await init.pageClick(page, '#confirmRoleChange');
await init.pageWaitForSelector(page, '#confirmRoleChange', {
@@ -169,10 +168,8 @@ describe('Profile -> Delete Account Component test', () => {
await init.switchProject(projectName, page);
await init.pageWaitForSelector(page, '#teamMembers');
await init.pageClick(page, '#teamMembers');
await init.pageWaitForSelector(page, 'button[title="Change Role"]');
await init.pageClick(page, 'button[title="Change Role"]');
await init.pageWaitForSelector(page, `div[title="${role}"]`);
await init.pageClick(page, `div[title="${role}"]`);
await init.pageClick(page, `#changeRole_${emailSelector}`);
await init.pageClick(page, `#${role}`);
await init.pageWaitForSelector(page, '#confirmRoleChange');
await init.pageClick(page, '#confirmRoleChange');
await init.pageWaitForSelector(page, '#confirmRoleChange', {
@@ -222,6 +219,7 @@ describe('Profile -> Delete Account Component test', () => {
await init.pageWaitForSelector(page, '#deleteMyAccount');
await init.pageType(page, '#deleteMyAccount', 'delete my account');
await init.pageClick(page, '#btn_confirm_delete');
await init.pageClick(page, '#close');
await page.waitForNavigation();
const url = await page.url();
expect(url).toEqual(`${utils.ACCOUNTS_URL}/accounts/login`);