mirror of
https://github.com/OneUptime/oneuptime.git
synced 2026-04-06 00:32:12 +02:00
Merge branch 'master' of https://gitlab.com/fyipe-project/app into log-container-ui-updates
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -253,6 +253,7 @@ class DeleteAccount extends Component {
|
||||
onClick={() =>
|
||||
this.props.logoutUser()
|
||||
}
|
||||
id="close"
|
||||
>
|
||||
<span>Close</span>
|
||||
</button>
|
||||
|
||||
@@ -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 => {
|
||||
|
||||
@@ -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
|
||||
: ''}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
5
status-page/package-lock.json
generated
5
status-page/package-lock.json
generated
@@ -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"
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ h6 {
|
||||
}
|
||||
|
||||
p, blockquote, ul, ol, dl, li, table, pre {
|
||||
margin: 15px 0;
|
||||
margin: 5px 0 0 0;
|
||||
}
|
||||
|
||||
hr {
|
||||
|
||||
@@ -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 *******/
|
||||
|
||||
@@ -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'}>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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={{
|
||||
|
||||
@@ -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={{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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`);
|
||||
|
||||
Reference in New Issue
Block a user