This commit is contained in:
Simon Larsen
2022-10-19 19:28:08 +01:00
parent d84de1ca40
commit 5a1f052000
97 changed files with 2042 additions and 1307 deletions

4
.gitignore vendored
View File

@@ -58,4 +58,6 @@ settings.json
GoSDK/tester/
.gitconfig
.gitconfig
secret.env

View File

@@ -1,2 +1,2 @@
NODE_ENV=development
IS_SAAS_SERVICE=false
IS_SAAS_SERVICE=false

View File

@@ -1,4 +1,8 @@
export default (columnName: string, totalItems: number, errorMessage: string) => {
export default (
columnName: string,
totalItems: number,
errorMessage: string
) => {
return (ctr: Function) => {
ctr.prototype.totalItemsByColumnnName = columnName;
ctr.prototype.totalItemsNumber = totalItems;

View File

@@ -80,7 +80,6 @@ enum Permission {
CanEditStatusPageHeaderLink = 'CanEditStatusPageHeaderLink',
CanReadStatusPageHeaderLink = 'CanReadStatusPageHeaderLink',
// Probe Permissions (Owner Permission)
CanCreateStatusPageFooterLink = 'CanCreateStatusPageFooterLink',
CanDeleteStatusPageFooterLink = 'CanDeleteStatusPageFooterLink',
@@ -111,11 +110,6 @@ enum Permission {
CanReadProjectLabel = 'CanReadProjectLabel',
CanDeleteProjectLabel = 'CanDeleteProjectLabel',
CanAddLabelsToProjectResources = 'CanAddLabelsToProjectResources',
// Scheduled Maintenance
@@ -131,7 +125,6 @@ enum Permission {
CanReadScheduledMaintenanceStateTimeline = 'CanReadScheduledMaintenanceStateTimeline',
CanDeleteScheduledMaintenanceStateTimeline = 'CanDeleteScheduledMaintenanceStateTimeline',
// Resource Permissions (Team Permission)
CanCreateScheduledMaintenanceInternalNote = 'CanCreateScheduledMaintenanceInternalNote',
CanEditScheduledMaintenanceInternalNote = 'CanEditScheduledMaintenanceInternalNote',
@@ -143,14 +136,11 @@ enum Permission {
CanDeleteScheduledMaintenancePublicNote = 'CanDeleteScheduledMaintenancePublicNote',
CanReadScheduledMaintenancePublicNote = 'CanReadScheduledMaintenancePublicNote',
// Probe Permissions (Owner Permission)
CanCreateProjectScheduledMaintenance = 'CanCreateProjectScheduledMaintenance',
CanDeleteProjectScheduledMaintenance = 'CanDeleteProjectScheduledMaintenance',
CanEditProjectScheduledMaintenance = 'CanEditProjectScheduledMaintenance',
CanReadProjectScheduledMaintenance = 'CanReadProjectScheduledMaintenance',
// Probe Permissions (Owner Permission)
CanCreateProjectScheduledMaintenance = 'CanCreateProjectScheduledMaintenance',
CanDeleteProjectScheduledMaintenance = 'CanDeleteProjectScheduledMaintenance',
CanEditProjectScheduledMaintenance = 'CanEditProjectScheduledMaintenance',
CanReadProjectScheduledMaintenance = 'CanReadProjectScheduledMaintenance',
// Incident Status Permissions (Owner + Admin Permission by default)
CanCreateIncidentState = 'CanCreateIncidentState',
@@ -700,7 +690,6 @@ export class PermissionHelper {
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateStatusPageHeaderLink,
title: 'Can Create Header Link',
@@ -734,7 +723,6 @@ export class PermissionHelper {
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateStatusPageFooterLink,
title: 'Can Create Footer Link',
@@ -768,8 +756,6 @@ export class PermissionHelper {
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateStatusPageResource,
title: 'Can Create Status Page Resource',
@@ -1281,25 +1267,7 @@ export class PermissionHelper {
isAccessControlPermission: false,
},
// Scheduled Maintenance Permissions.
// Scheduled Maintenance Permissions.
{
permission: Permission.CanCreateScheduledMaintenanceState,
@@ -1334,7 +1302,6 @@ export class PermissionHelper {
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateProjectScheduledMaintenance,
title: 'Can Create Scheduled Maintenance',
@@ -1369,7 +1336,8 @@ export class PermissionHelper {
},
{
permission: Permission.CanCreateScheduledMaintenanceStateTimeline,
permission:
Permission.CanCreateScheduledMaintenanceStateTimeline,
title: 'Can Create Scheduled Maintenance State Timeline',
description:
'A user assigned this permission can create Scheduled Maintenance state history of an Scheduled Maintenance in this project.',
@@ -1377,7 +1345,8 @@ export class PermissionHelper {
isAccessControlPermission: false,
},
{
permission: Permission.CanDeleteScheduledMaintenanceStateTimeline,
permission:
Permission.CanDeleteScheduledMaintenanceStateTimeline,
title: 'Can Delete Scheduled Maintenance State Timeline',
description:
'A user assigned this permission can delete Scheduled Maintenance state history of an Scheduled Maintenance in this project.',
@@ -1401,9 +1370,9 @@ export class PermissionHelper {
isAccessControlPermission: false,
},
{
permission: Permission.CanCreateScheduledMaintenanceInternalNote,
permission:
Permission.CanCreateScheduledMaintenanceInternalNote,
title: 'Can Create Scheduled Maintenance Internal Note',
description:
'A user assigned this permission can create Scheduled Maintenance Internal Note this project.',
@@ -1411,7 +1380,8 @@ export class PermissionHelper {
isAccessControlPermission: false,
},
{
permission: Permission.CanDeleteScheduledMaintenanceInternalNote,
permission:
Permission.CanDeleteScheduledMaintenanceInternalNote,
title: 'Can Delete Scheduled Maintenance Internal Note',
description:
'A user assigned this permission can delete Scheduled Maintenance Internal Note of this project.',

View File

@@ -6,7 +6,11 @@ import StatusPageService, {
} from '../Services/StatusPageService';
import Populate from '../Types/Database/Populate';
import Select from '../Types/Database/Select';
import { ExpressRequest, ExpressResponse, NextFunction } from '../Utils/Express';
import {
ExpressRequest,
ExpressResponse,
NextFunction,
} from '../Utils/Express';
import BaseAPI from './BaseAPI';
import Response from '../Utils/Response';
import NotAuthorizedException from 'Common/Types/Exception/NotAuthorizedException';
@@ -19,12 +23,15 @@ import StatusPageHeaderLinkService from '../Services/StatusPageHeaderLinkService
import StatusPageHeaderLink from 'Model/Models/StatusPageHeaderLink';
import StatusPageDomain from 'Model/Models/StatusPageDomain';
import StatusPageDomainService from '../Services/StatusPageDomainService';
import { JSONObject } from 'Common/Types/JSON';
export default class StatusPageAPI extends BaseAPI<StatusPage, StatusPageServiceType> {
export default class StatusPageAPI extends BaseAPI<
StatusPage,
StatusPageServiceType
> {
public constructor() {
super(StatusPage, StatusPageService);
this.router.post(
`/${new this.entityType().getCrudApiPath()?.toString()}/domain`,
UserMiddleware.getUserMiddleware,
@@ -34,49 +41,62 @@ export default class StatusPageAPI extends BaseAPI<StatusPage, StatusPageService
next: NextFunction
) => {
try {
if (req.body["domain"]) {
throw new BadDataException("domain is required in request body");
if (req.body['domain']) {
throw new BadDataException(
'domain is required in request body'
);
}
const domain: string = req.body["domain"] as string;
const domain: string = req.body['domain'] as string;
const statusPageDomain: StatusPageDomain | null = await StatusPageDomainService.findOneBy({
query: {
fullDomain: domain,
domain: {
isVerified: true
} as any
},
select: {
statusPageId: true
},
props: {
isRoot: true,
}
});
const statusPageDomain: StatusPageDomain | null =
await StatusPageDomainService.findOneBy({
query: {
fullDomain: domain,
domain: {
isVerified: true,
} as any,
},
select: {
statusPageId: true,
},
props: {
isRoot: true,
},
});
if (!statusPageDomain) {
throw new BadDataException("No status page found with this domain");
}
const objectId: ObjectID = statusPageDomain.statusPageId!
if (!await this.service.hasReadAccess(objectId, this.getDatabaseCommonInteractionProps(req))) {
throw new NotAuthorizedException("You are not authorize to access this status page");
throw new BadDataException(
'No status page found with this domain'
);
}
return Response.sendJsonObjectResponse(req, res, {statusPageId: objectId.toString()});
const objectId: ObjectID = statusPageDomain.statusPageId!;
if (
!(await this.service.hasReadAccess(
objectId,
this.getDatabaseCommonInteractionProps(req)
))
) {
throw new NotAuthorizedException(
'You are not authorize to access this status page'
);
}
return Response.sendJsonObjectResponse(req, res, {
statusPageId: objectId.toString(),
});
} catch (err) {
next(err);
}
}
);
this.router.post(
`/${new this.entityType().getCrudApiPath()?.toString()}/master-page/:id`,
`/${new this.entityType()
.getCrudApiPath()
?.toString()}/master-page/:id`,
UserMiddleware.getUserMiddleware,
async (
req: ExpressRequest,
@@ -84,109 +104,125 @@ export default class StatusPageAPI extends BaseAPI<StatusPage, StatusPageService
next: NextFunction
) => {
try {
const objectId: ObjectID = new ObjectID(req.params['id'] as string);
const objectId: ObjectID = new ObjectID(
req.params['id'] as string
);
if (!await this.service.hasReadAccess(objectId, this.getDatabaseCommonInteractionProps(req))) {
throw new NotAuthorizedException("You are not authorize to access this status page");
if (
!(await this.service.hasReadAccess(
objectId,
this.getDatabaseCommonInteractionProps(req)
))
) {
throw new NotAuthorizedException(
'You are not authorize to access this status page'
);
}
let select: Select<StatusPage> = {
_id: true,
const select: Select<StatusPage> = {
_id: true,
slug: true,
coverImageFileId: true,
logoFileId: true,
showAnouncementsPage: true,
showFooter: true,
showHeader: true,
showIncidentsPage: true,
showNavbar: true,
showOverviewPage: true,
showRssPage: true,
showScheduledMaintenancePage: true,
pageTextColor: true,
coverImageFileId: true,
logoFileId: true,
showAnouncementsPage: true,
showFooter: true,
showHeader: true,
showIncidentsPage: true,
showNavbar: true,
showOverviewPage: true,
showRssPage: true,
showScheduledMaintenancePage: true,
pageTextColor: true,
footerTextColor: true,
headerTextColor: true,
navBarTextColor: true,
pageTitle: true,
pageDescription: true,
pageBackgroundColor: true,
navBarTextColor: true,
pageTitle: true,
pageDescription: true,
pageBackgroundColor: true,
bannerBackgroundColor: true,
footerBackgroundColor: true,
headerBackgroundColor: true,
navBarBackgroundColor: true,
copyrightText: true,
customCSS: true,
customJavaScript: true,
headerHTML: true,
footerHTML: true,
enableSubscribers: true
footerBackgroundColor: true,
headerBackgroundColor: true,
navBarBackgroundColor: true,
copyrightText: true,
customCSS: true,
customJavaScript: true,
headerHTML: true,
footerHTML: true,
enableSubscribers: true,
};
let populate: Populate<StatusPage> = {};
const item: StatusPage | null = await this.service.findOneById({
id: objectId,
select,
populate,
props: this.getDatabaseCommonInteractionProps(req),
});
const populate: Populate<StatusPage> = {};
const item: StatusPage | null =
await this.service.findOneById({
id: objectId,
select,
populate,
props: this.getDatabaseCommonInteractionProps(req),
});
if (!item) {
throw new BadDataException("Status Page not found");
throw new BadDataException('Status Page not found');
}
const footerLinks: Array<StatusPageFooterLink> =
await StatusPageFooterLinkService.findBy({
query: {
statusPageId: objectId,
},
select: {
_id: true,
link: true,
title: true,
},
populate: {},
limit: LIMIT_PER_PROJECT,
skip: 0,
props: {
isRoot: true,
},
});
const footerLinks = await StatusPageFooterLinkService.findBy({
query: {
statusPageId: objectId,
},
select: {
_id: true,
link: true,
title: true
},
populate: {},
limit: LIMIT_PER_PROJECT,
skip: 0,
props: {
isRoot: true
}
});
const headerLinks: Array<StatusPageHeaderLink> =
await StatusPageHeaderLinkService.findBy({
query: {
statusPageId: objectId,
},
select: {
_id: true,
link: true,
title: true,
},
limit: LIMIT_PER_PROJECT,
skip: 0,
props: {
isRoot: true,
},
});
const headerLinks = await StatusPageHeaderLinkService.findBy({
query: {
statusPageId: objectId,
},
select: {
_id: true,
link: true,
title: true
},
limit: LIMIT_PER_PROJECT,
skip: 0,
props: {
isRoot: true
}
});
const response = {
const response: JSONObject = {
statusPage: BaseModel.toJSON(item, StatusPage),
footerLinks: BaseModel.toJSONArray(footerLinks, StatusPageFooterLink),
headerLinks: BaseModel.toJSONArray(headerLinks, StatusPageHeaderLink),
}
return Response.sendJsonObjectResponse(req, res, response);
footerLinks: BaseModel.toJSONArray(
footerLinks,
StatusPageFooterLink
),
headerLinks: BaseModel.toJSONArray(
headerLinks,
StatusPageHeaderLink
),
};
return Response.sendJsonObjectResponse(req, res, response);
} catch (err) {
next(err);
}
}
);
this.router.post(
`/${new this.entityType().getCrudApiPath()?.toString()}/overview/:id`,
`/${new this.entityType()
.getCrudApiPath()
?.toString()}/overview/:id`,
UserMiddleware.getUserMiddleware,
async (
req: ExpressRequest,
@@ -194,108 +230,28 @@ export default class StatusPageAPI extends BaseAPI<StatusPage, StatusPageService
next: NextFunction
) => {
try {
const objectId: ObjectID = new ObjectID(req.params['id'] as string);
const objectId: ObjectID = new ObjectID(
req.params['id'] as string
);
if (!await this.service.hasReadAccess(objectId, this.getDatabaseCommonInteractionProps(req))) {
throw new NotAuthorizedException("You are not authorize to access this status page");
if (
!(await this.service.hasReadAccess(
objectId,
this.getDatabaseCommonInteractionProps(req)
))
) {
throw new NotAuthorizedException(
'You are not authorize to access this status page'
);
}
let select: Select<StatusPage> = {
_id: true,
slug: true,
coverImageFileId: true,
logoFileId: true,
showAnouncementsPage: true,
showFooter: true,
showHeader: true,
showIncidentsPage: true,
showNavbar: true,
showOverviewPage: true,
showRssPage: true,
showScheduledMaintenancePage: true,
pageTextColor: true,
footerTextColor: true,
headerTextColor: true,
navBarTextColor: true,
pageTitle: true,
pageDescription: true,
pageBackgroundColor: true,
bannerBackgroundColor: true,
footerBackgroundColor: true,
headerBackgroundColor: true,
navBarBackgroundColor: true,
copyrightText: true,
customCSS: true,
customJavaScript: true,
headerHTML: true,
footerHTML: true,
enableSubscribers: true
};
const response: JSONObject = {};
let populate: Populate<StatusPage> = {};
const item: StatusPage | null = await this.service.findOneById({
id: objectId,
select,
populate,
props: this.getDatabaseCommonInteractionProps(req),
});
if (!item) {
throw new BadDataException("Status Page not found");
}
const footerLinks = await StatusPageFooterLinkService.findBy({
query: {
statusPageId: objectId,
},
select: {
_id: true,
link: true,
title: true
},
populate: {},
limit: LIMIT_PER_PROJECT,
skip: 0,
props: {
isRoot: true
}
});
const headerLinks = await StatusPageHeaderLinkService.findBy({
query: {
statusPageId: objectId,
},
select: {
_id: true,
link: true,
title: true
},
limit: LIMIT_PER_PROJECT,
skip: 0,
props: {
isRoot: true
}
});
const response = {
statusPage: BaseModel.toJSON(item, StatusPage),
footerLinks: BaseModel.toJSONArray(footerLinks, StatusPageFooterLink),
headerLinks: BaseModel.toJSONArray(headerLinks, StatusPageHeaderLink),
}
return Response.sendJsonObjectResponse(req, res, response);
} catch (err) {
next(err);
}
}
);
}
}

View File

@@ -476,9 +476,9 @@ class DatabaseService<TBaseModel extends BaseModel> {
throw new BadDataException('Data is not valid');
}
// check total items by.
// check total items by.
await this.checkTotalItemsBy(_createdBy)
await this.checkTotalItemsBy(_createdBy);
// Encrypt data
data = this.encrypt(data);
@@ -519,27 +519,36 @@ class DatabaseService<TBaseModel extends BaseModel> {
}
}
private async checkTotalItemsBy(
createdBy: CreateBy<TBaseModel>
): Promise<void> {
const totalItemsColumnName: string | null =
this.model.getTotalItemsByColumnName();
const totalItemsNumber: number | null =
this.model.getTotalItemsNumber();
const errorMessage: string | null =
this.model.getTotalItemsByErrorMessage();
private async checkTotalItemsBy(createdBy: CreateBy<TBaseModel>): Promise<void> {
const totalItemsColumnName = this.model.getTotalItemsByColumnName();
const totalItemsNumber = this.model.getTotalItemsNumber();
const errorMessage = this.model.getTotalItemsByErrorMessage();
if (totalItemsColumnName && totalItemsNumber && errorMessage && createdBy.data.getColumnValue(totalItemsColumnName)) {
const count = await this.countBy({
if (
totalItemsColumnName &&
totalItemsNumber &&
errorMessage &&
createdBy.data.getColumnValue(totalItemsColumnName)
) {
const count: PositiveNumber = await this.countBy({
query: {
[totalItemsColumnName]: createdBy.data.getColumnValue(totalItemsColumnName)
[totalItemsColumnName]:
createdBy.data.getColumnValue(totalItemsColumnName),
} as FindWhere<TBaseModel>,
skip: 0,
limit: LIMIT_MAX,
props: {
isRoot: true
}
isRoot: true,
},
});
if (count.positiveNumber > totalItemsNumber - 1) {
if (count.positiveNumber > totalItemsNumber - 1) {
throw new BadDataException(errorMessage);
}
}

View File

@@ -81,9 +81,11 @@ export class Service extends DatabaseService<Model> {
return Promise.resolve({ createBy: data, carryForward: null });
}
private async addDefaultScheduledMaintenanceState(createdItem: Model): Promise<Model> {
let createdScheduledMaintenanceState: ScheduledMaintenanceState = new ScheduledMaintenanceState();
private async addDefaultScheduledMaintenanceState(
createdItem: Model
): Promise<Model> {
let createdScheduledMaintenanceState: ScheduledMaintenanceState =
new ScheduledMaintenanceState();
createdScheduledMaintenanceState.name = 'Scheduled';
createdScheduledMaintenanceState.description =
'When an event is scheduled, it belongs to this state';
@@ -92,14 +94,16 @@ export class Service extends DatabaseService<Model> {
createdScheduledMaintenanceState.projectId = createdItem.id!;
createdScheduledMaintenanceState.order = 1;
createdScheduledMaintenanceState = await ScheduledMaintenanceStateService.create({
data: createdScheduledMaintenanceState,
props: {
isRoot: true,
},
});
createdScheduledMaintenanceState =
await ScheduledMaintenanceStateService.create({
data: createdScheduledMaintenanceState,
props: {
isRoot: true,
},
});
let ongoingScheduledMaintenanceState: ScheduledMaintenanceState = new ScheduledMaintenanceState();
let ongoingScheduledMaintenanceState: ScheduledMaintenanceState =
new ScheduledMaintenanceState();
ongoingScheduledMaintenanceState.name = 'Ongoing';
ongoingScheduledMaintenanceState.description =
'When an event is ongoing, it belongs to this state.';
@@ -108,14 +112,16 @@ export class Service extends DatabaseService<Model> {
ongoingScheduledMaintenanceState.projectId = createdItem.id!;
ongoingScheduledMaintenanceState.order = 2;
ongoingScheduledMaintenanceState = await ScheduledMaintenanceStateService.create({
data: ongoingScheduledMaintenanceState,
props: {
isRoot: true,
},
});
ongoingScheduledMaintenanceState =
await ScheduledMaintenanceStateService.create({
data: ongoingScheduledMaintenanceState,
props: {
isRoot: true,
},
});
let completedScheduledMaintenanceState: ScheduledMaintenanceState = new ScheduledMaintenanceState();
let completedScheduledMaintenanceState: ScheduledMaintenanceState =
new ScheduledMaintenanceState();
completedScheduledMaintenanceState.name = 'Completed';
completedScheduledMaintenanceState.description =
'When an event is completed, it belongs to this state.';
@@ -124,18 +130,17 @@ export class Service extends DatabaseService<Model> {
completedScheduledMaintenanceState.projectId = createdItem.id!;
completedScheduledMaintenanceState.order = 3;
completedScheduledMaintenanceState = await ScheduledMaintenanceStateService.create({
data: completedScheduledMaintenanceState,
props: {
isRoot: true,
},
});
completedScheduledMaintenanceState =
await ScheduledMaintenanceStateService.create({
data: completedScheduledMaintenanceState,
props: {
isRoot: true,
},
});
return createdItem;
}
protected override async onCreateSuccess(
_onCreate: OnCreate<Model>,
createdItem: Model
@@ -143,7 +148,9 @@ export class Service extends DatabaseService<Model> {
createdItem = await this.addDefaultProjectTeams(createdItem);
createdItem = await this.addDefaultMonitorStatus(createdItem);
createdItem = await this.addDefaultIncidentState(createdItem);
createdItem = await this.addDefaultScheduledMaintenanceState(createdItem);
createdItem = await this.addDefaultScheduledMaintenanceState(
createdItem
);
createdItem = await this.addDefaultIncidentSeverity(createdItem);
return createdItem;

View File

@@ -44,7 +44,8 @@ export class Service extends DatabaseService<Model> {
);
}
createBy.data.currentScheduledMaintenanceStateId = scheduledMaintenanceState.id;
createBy.data.currentScheduledMaintenanceStateId =
scheduledMaintenanceState.id;
return { createBy, carryForward: null };
}
@@ -80,24 +81,25 @@ export class Service extends DatabaseService<Model> {
scheduledMaintenanceStateId: ObjectID,
props: DatabaseCommonInteractionProps
): Promise<void> {
await this.updateBy({
data: {
currentScheduledMaintenanceStateId: scheduledMaintenanceStateId.id
currentScheduledMaintenanceStateId:
scheduledMaintenanceStateId.id,
},
query: {
_id: scheduledMaintenanceId.toString()!
_id: scheduledMaintenanceId.toString()!,
},
props: {
isRoot: true
}
isRoot: true,
},
});
const statusTimeline: ScheduledMaintenanceStateTimeline =
new ScheduledMaintenanceStateTimeline();
statusTimeline.scheduledMaintenanceId = scheduledMaintenanceId;
statusTimeline.scheduledMaintenanceStateId = scheduledMaintenanceStateId;
statusTimeline.scheduledMaintenanceStateId =
scheduledMaintenanceStateId;
statusTimeline.projectId = projectId;
await ScheduledMaintenanceStateTimelineService.create({

View File

@@ -30,7 +30,8 @@ export class Service extends DatabaseService<ScheduledMaintenanceStateTimeline>
_id: createdItem.scheduledMaintenanceId?.toString(),
},
data: {
currentScheduledMaintenanceStateId: createdItem.scheduledMaintenanceStateId,
currentScheduledMaintenanceStateId:
createdItem.scheduledMaintenanceStateId,
},
props: onCreate.createBy.props,
});
@@ -86,7 +87,8 @@ export class Service extends DatabaseService<ScheduledMaintenanceStateTimeline>
): Promise<OnDelete<ScheduledMaintenanceStateTimeline>> {
if (onDelete.carryForward) {
// this is scheduledMaintenanceId.
const scheduledMaintenanceId: ObjectID = onDelete.carryForward as ObjectID;
const scheduledMaintenanceId: ObjectID =
onDelete.carryForward as ObjectID;
// get last status of this monitor.
const scheduledMaintenanceStateTimeline: ScheduledMaintenanceStateTimeline | null =

View File

@@ -1,6 +1,10 @@
import PostgresDatabase from '../Infrastructure/PostgresDatabase';
import Model from 'Model/Models/StatusPageFooterLink';
import DatabaseService, { OnCreate, OnDelete, OnUpdate } from './DatabaseService';
import DatabaseService, {
OnCreate,
OnDelete,
OnUpdate,
} from './DatabaseService';
import CreateBy from '../Types/Database/CreateBy';
import BadDataException from 'Common/Types/Exception/BadDataException';
import Query from '../Types/Database/Query';
@@ -21,9 +25,7 @@ export class Service extends DatabaseService<Model> {
createBy: CreateBy<Model>
): Promise<OnCreate<Model>> {
if (!createBy.data.statusPageId) {
throw new BadDataException(
'statusPageId is required'
);
throw new BadDataException('statusPageId is required');
}
if (!createBy.data.order) {
@@ -31,7 +33,6 @@ export class Service extends DatabaseService<Model> {
statusPageId: createBy.data.statusPageId,
};
const count: PositiveNumber = await this.countBy({
query: query,
props: {

View File

@@ -1,6 +1,10 @@
import PostgresDatabase from '../Infrastructure/PostgresDatabase';
import Model from 'Model/Models/StatusPageHeaderLink';
import DatabaseService, { OnCreate, OnDelete, OnUpdate } from './DatabaseService';
import DatabaseService, {
OnCreate,
OnDelete,
OnUpdate,
} from './DatabaseService';
import CreateBy from '../Types/Database/CreateBy';
import BadDataException from 'Common/Types/Exception/BadDataException';
import Query from '../Types/Database/Query';
@@ -17,14 +21,11 @@ export class Service extends DatabaseService<Model> {
super(Model, postgresDatabase);
}
protected override async onBeforeCreate(
createBy: CreateBy<Model>
): Promise<OnCreate<Model>> {
if (!createBy.data.statusPageId) {
throw new BadDataException(
'statusPageId is required'
);
throw new BadDataException('statusPageId is required');
}
if (!createBy.data.order) {
@@ -32,7 +33,6 @@ export class Service extends DatabaseService<Model> {
statusPageId: createBy.data.statusPageId,
};
const count: PositiveNumber = await this.countBy({
query: query,
props: {

View File

@@ -1,18 +1,20 @@
import PostgresDatabase from '../Infrastructure/PostgresDatabase';
import Model from 'Model/Models/StatusPage';
import DatabaseService from './DatabaseService';
import DatabaseCommonInteractionProps from 'Common/Types/Database/DatabaseCommonInteractionProps';
import ObjectID from 'Common/Types/ObjectID';
import PositiveNumber from 'Common/Types/PositiveNumber';
import StatusPage from 'Model/Models/StatusPage';
export class Service extends DatabaseService<Model> {
export class Service extends DatabaseService<StatusPage> {
public constructor(postgresDatabase?: PostgresDatabase) {
super(Model, postgresDatabase);
super(StatusPage, postgresDatabase);
}
public async hasReadAccess(statusPageId: ObjectID, props: DatabaseCommonInteractionProps): Promise<boolean> {
const count = await this.countBy({
public async hasReadAccess(
statusPageId: ObjectID,
props: DatabaseCommonInteractionProps
): Promise<boolean> {
const count: PositiveNumber = await this.countBy({
query: {
_id: statusPageId.toString(),
isPublicStatusPage: true,
@@ -20,25 +22,26 @@ export class Service extends DatabaseService<Model> {
skip: 0,
limit: 1,
props: {
isRoot: true
}
})
isRoot: true,
},
});
if (count.positiveNumber > 0) {
return true;
}
// if it does not have public access, check if this user has access.
// if it does not have public access, check if this user has access.
const items = await this.findBy({
const items: Array<StatusPage> = await this.findBy({
query: {
_id: statusPageId.toString(),
},
select: {
_id: true,
},
skip: 0, limit: 1, props: props
skip: 0,
limit: 1,
props: props,
});
if (items.length > 0) {
@@ -46,7 +49,6 @@ export class Service extends DatabaseService<Model> {
}
return false;
}
}
export default new Service();

View File

@@ -26,9 +26,14 @@ const Detail: Function = (props: ComponentProps): ReactElement => {
return <MarkdownViewer text={text} />;
};
const getColorField: Function = (color: Color): ReactElement => {
return <Input disabled={true} leftCircleColor={color} value={color.toString()} />
const getColorField: Function = (color: Color): ReactElement => {
return (
<Input
disabled={true}
leftCircleColor={color}
value={color.toString()}
/>
);
};
const getField: Function = (field: Field, index: number): ReactElement => {
@@ -116,10 +121,11 @@ const Detail: Function = (props: ComponentProps): ReactElement => {
);
}
if (data && (
(field.fieldType === FieldType.HTML) ||
field.fieldType === FieldType.CSS ||
field.fieldType === FieldType.JavaScript)
if (
data &&
(field.fieldType === FieldType.HTML ||
field.fieldType === FieldType.CSS ||
field.fieldType === FieldType.JavaScript)
) {
let codeType: CodeType = CodeType.HTML;
@@ -153,10 +159,10 @@ const Detail: Function = (props: ComponentProps): ReactElement => {
style={
props.showDetailsInNumberOfColumns
? {
width:
100 / props.showDetailsInNumberOfColumns +
'%',
}
width:
100 / props.showDetailsInNumberOfColumns +
'%',
}
: {}
}
>
@@ -198,10 +204,11 @@ const Detail: Function = (props: ComponentProps): ReactElement => {
return (
<div
className={`${props.showDetailsInNumberOfColumns
className={`${
props.showDetailsInNumberOfColumns
? `justify-space-between`
: ``
}`}
}`}
>
{props.fields &&
props.fields.length > 0 &&

View File

@@ -34,7 +34,9 @@ const Footer: FunctionComponent<ComponentProps> = (
<UILink
className="ms-1 underline-on-hover"
to={link.to}
openInNewTab={link.openInNewTab}
openInNewTab={
link.openInNewTab
}
>
{link.title}
</UILink>

View File

@@ -123,7 +123,7 @@ const BasicForm: Function = <T extends Object>(
if (props.showAsColumns && props.showAsColumns > 2) {
throw new BadDataException(
'showAsCOlumns should be <= 2. It is currently ' +
props.showAsColumns
props.showAsColumns
);
}
@@ -182,7 +182,7 @@ const BasicForm: Function = <T extends Object>(
placeholder={field.placeholder || ''}
initialValue={
initialValues &&
(initialValues as any)[fieldName]
(initialValues as any)[fieldName]
? (initialValues as any)[fieldName]
: ''
}
@@ -194,53 +194,53 @@ const BasicForm: Function = <T extends Object>(
{(field.fieldType === FormFieldSchemaType.Dropdown ||
field.fieldType ===
FormFieldSchemaType.MultiSelectDropdown) && (
<Field name={fieldName}>
{({ form }: any) => {
return (
<Dropdown
tabIndex={index}
onChange={async (
value:
| DropdownValue
| Array<DropdownValue>
| null
) => {
setCurrentValue({
...currentValue,
[fieldName]: value,
});
field.onChange &&
field.onChange(value, form);
await form.setFieldValue(
fieldName,
value,
true
);
}}
onBlur={async () => {
await form.setFieldTouched(
fieldName,
true
);
}}
isMultiSelect={
field.fieldType ===
FormFieldSchemaType.MultiSelectDropdown
}
options={field.dropdownOptions || []}
placeholder={field.placeholder || ''}
initialValue={
initialValues &&
(initialValues as any)[fieldName]
? (initialValues as any)[fieldName]
: ''
}
/>
);
}}
</Field>
)}
FormFieldSchemaType.MultiSelectDropdown) && (
<Field name={fieldName}>
{({ form }: any) => {
return (
<Dropdown
tabIndex={index}
onChange={async (
value:
| DropdownValue
| Array<DropdownValue>
| null
) => {
setCurrentValue({
...currentValue,
[fieldName]: value,
});
field.onChange &&
field.onChange(value, form);
await form.setFieldValue(
fieldName,
value,
true
);
}}
onBlur={async () => {
await form.setFieldTouched(
fieldName,
true
);
}}
isMultiSelect={
field.fieldType ===
FormFieldSchemaType.MultiSelectDropdown
}
options={field.dropdownOptions || []}
placeholder={field.placeholder || ''}
initialValue={
initialValues &&
(initialValues as any)[fieldName]
? (initialValues as any)[fieldName]
: ''
}
/>
);
}}
</Field>
)}
{field.fieldType === FormFieldSchemaType.LongText && (
<Field name={fieldName}>
@@ -270,10 +270,10 @@ const BasicForm: Function = <T extends Object>(
}}
initialValue={
initialValues &&
(initialValues as any)[fieldName]
(initialValues as any)[fieldName]
? (initialValues as any)[
fieldName
]
fieldName
]
: ''
}
placeholder={field.placeholder || ''}
@@ -312,10 +312,10 @@ const BasicForm: Function = <T extends Object>(
}}
initialValue={
initialValues &&
(initialValues as any)[fieldName]
(initialValues as any)[fieldName]
? (initialValues as any)[
fieldName
]
fieldName
]
: ''
}
placeholder={field.placeholder || ''}
@@ -329,143 +329,143 @@ const BasicForm: Function = <T extends Object>(
{(field.fieldType === FormFieldSchemaType.HTML ||
field.fieldType === FormFieldSchemaType.CSS ||
field.fieldType === FormFieldSchemaType.JavaScript) && (
<Field name={fieldName}>
{({ form }: any) => {
let codeType: CodeType = CodeType.HTML;
<Field name={fieldName}>
{({ form }: any) => {
let codeType: CodeType = CodeType.HTML;
if (field.fieldType === FormFieldSchemaType.CSS) {
codeType = CodeType.CSS;
}
if (field.fieldType === FormFieldSchemaType.CSS) {
codeType = CodeType.CSS;
}
if (
field.fieldType ===
FormFieldSchemaType.JavaScript
) {
codeType = CodeType.JavaScript;
}
if (
field.fieldType ===
FormFieldSchemaType.JavaScript
) {
codeType = CodeType.JavaScript;
}
return (
<>
<CodeEditor
tabIndex={index}
onChange={async (value: string) => {
setCurrentValue({
...currentValue,
[fieldName]: value,
});
field.onChange &&
field.onChange(value, form);
await form.setFieldValue(
fieldName,
value,
true
);
}}
className="form-control"
onBlur={async () => {
await form.setFieldTouched(
fieldName,
true
);
}}
type={codeType}
initialValue={
initialValues &&
(initialValues as any)[fieldName]
? (initialValues as any)[
fieldName
]
: ''
}
placeholder={field.placeholder || ''}
/>
</>
);
}}
</Field>
)}
return (
<>
<CodeEditor
tabIndex={index}
onChange={async (value: string) => {
setCurrentValue({
...currentValue,
[fieldName]: value,
});
field.onChange &&
field.onChange(value, form);
await form.setFieldValue(
fieldName,
value,
true
);
}}
className="form-control"
onBlur={async () => {
await form.setFieldTouched(
fieldName,
true
);
}}
type={codeType}
initialValue={
initialValues &&
(initialValues as any)[fieldName]
? (initialValues as any)[
fieldName
]
: ''
}
placeholder={field.placeholder || ''}
/>
</>
);
}}
</Field>
)}
{(field.fieldType === FormFieldSchemaType.File ||
field.fieldType === FormFieldSchemaType.ImageFile) && (
<Field name={fieldName}>
{({ form }: any) => {
return (
<>
<FilePicker
tabIndex={index}
onChange={async (
files: Array<FileModel>
) => {
let fileResult:
| FileModel
| Array<FileModel>
| null = files.map(
(i: FileModel) => {
const strippedModel: FileModel =
new FileModel();
strippedModel._id = i._id!;
return strippedModel;
}
);
if (
field.fieldType ===
FormFieldSchemaType.File &&
Array.isArray(fileResult)
) {
if (fileResult.length > 0) {
fileResult =
fileResult[0] as FileModel;
} else {
fileResult = null;
}
<Field name={fieldName}>
{({ form }: any) => {
return (
<>
<FilePicker
tabIndex={index}
onChange={async (
files: Array<FileModel>
) => {
let fileResult:
| FileModel
| Array<FileModel>
| null = files.map(
(i: FileModel) => {
const strippedModel: FileModel =
new FileModel();
strippedModel._id = i._id!;
return strippedModel;
}
setCurrentValue({
...currentValue,
fieldName: fileResult,
});
field.onChange &&
field.onChange(
fileResult,
form
);
await form.setFieldValue(
fieldName,
fileResult,
true
);
}}
onBlur={async () => {
await form.setFieldTouched(
fieldName,
true
);
}}
mimeTypes={
);
if (
field.fieldType ===
FormFieldSchemaType.ImageFile
? [
MimeType.png,
MimeType.jpeg,
MimeType.jpg,
]
: []
FormFieldSchemaType.File &&
Array.isArray(fileResult)
) {
if (fileResult.length > 0) {
fileResult =
fileResult[0] as FileModel;
} else {
fileResult = null;
}
}
initialValue={
initialValues &&
(initialValues as any)[fieldName]
? (initialValues as any)[
fieldName
]
: []
}
placeholder={field.placeholder || ''}
/>
</>
);
}}
</Field>
)}
setCurrentValue({
...currentValue,
fieldName: fileResult,
});
field.onChange &&
field.onChange(
fileResult,
form
);
await form.setFieldValue(
fieldName,
fileResult,
true
);
}}
onBlur={async () => {
await form.setFieldTouched(
fieldName,
true
);
}}
mimeTypes={
field.fieldType ===
FormFieldSchemaType.ImageFile
? [
MimeType.png,
MimeType.jpeg,
MimeType.jpg,
]
: []
}
initialValue={
initialValues &&
(initialValues as any)[fieldName]
? (initialValues as any)[
fieldName
]
: []
}
placeholder={field.placeholder || ''}
/>
</>
);
}}
</Field>
)}
{field.fieldType === FormFieldSchemaType.Checkbox && (
<Field name={fieldName}>
@@ -494,10 +494,16 @@ const BasicForm: Function = <T extends Object>(
}}
initialValue={
initialValues &&
((initialValues as any)[fieldName] && ((initialValues as any)[fieldName] === true || (initialValues as any)[fieldName] === false))
? (initialValues as any)[
(initialValues as any)[fieldName] &&
((initialValues as any)[
fieldName
]
] === true ||
(initialValues as any)[
fieldName
] === false)
? (initialValues as any)[
fieldName
]
: field.defaultValue || false
}
/>
@@ -523,47 +529,47 @@ const BasicForm: Function = <T extends Object>(
field.fieldType === FormFieldSchemaType.Phone ||
field.fieldType === FormFieldSchemaType.Domain ||
field.fieldType === FormFieldSchemaType.PositveNumber) && (
<Field
tabIndex={index + 1}
name={fieldName}
disabled={isDisabled || field.disabled}
>
{({ form }: FieldProps) => {
return (
<Input
tabIndex={index}
dataTestId={fieldType}
className="form-control"
type={fieldType as InputType}
onChange={(value: string) => {
setCurrentValue({
...currentValue,
[fieldName]: value,
});
form.setFieldValue(
fieldName,
value,
true
);
}}
onEnterPress={() => {
form.submitForm();
}}
onBlur={() => {
form.setFieldTouched(fieldName, true);
}}
initialValue={
initialValues &&
(initialValues as any)[fieldName]
? (initialValues as any)[fieldName]
: field.defaultValue || ''
}
placeholder={field.placeholder || ''}
/>
);
}}
</Field>
)}
<Field
tabIndex={index + 1}
name={fieldName}
disabled={isDisabled || field.disabled}
>
{({ form }: FieldProps) => {
return (
<Input
tabIndex={index}
dataTestId={fieldType}
className="form-control"
type={fieldType as InputType}
onChange={(value: string) => {
setCurrentValue({
...currentValue,
[fieldName]: value,
});
form.setFieldValue(
fieldName,
value,
true
);
}}
onEnterPress={async () => {
await form.submitForm();
}}
onBlur={() => {
form.setFieldTouched(fieldName, true);
}}
initialValue={
initialValues &&
(initialValues as any)[fieldName]
? (initialValues as any)[fieldName]
: field.defaultValue || ''
}
placeholder={field.placeholder || ''}
/>
);
}}
</Field>
)}
<ErrorMessage
className="mt-1 text-danger"
@@ -586,15 +592,17 @@ const BasicForm: Function = <T extends Object>(
if (field.validation) {
if (field.validation.minLength) {
if (content.trim().length < field.validation?.minLength) {
return `${field.title || name} cannot be less than ${field.validation.minLength
} characters.`;
return `${field.title || name} cannot be less than ${
field.validation.minLength
} characters.`;
}
}
if (field.validation.maxLength) {
if (content.trim().length > field.validation?.maxLength) {
return `${field.title || name} cannot be more than ${field.validation.maxLength
} characters.`;
return `${field.title || name} cannot be more than ${
field.validation.maxLength
} characters.`;
}
}
@@ -636,15 +644,17 @@ const BasicForm: Function = <T extends Object>(
if (field.validation.maxValue) {
if (content > field.validation?.maxValue) {
return `${field.title || name} should not be more than ${field.validation?.maxValue
}.`;
return `${field.title || name} should not be more than ${
field.validation?.maxValue
}.`;
}
}
if (field.validation.minValue) {
if (content < field.validation?.minValue) {
return `${field.title || name} should not be less than ${field.validation?.minValue
}.`;
return `${field.title || name} should not be less than ${
field.validation?.minValue
}.`;
}
}
}
@@ -766,79 +776,79 @@ const BasicForm: Function = <T extends Object>(
values: FormValues<T>
) => void | object | Promise<FormikErrors<FormValues<T>>>) &
Function = (values: FormValues<T>): FormikErrors<FormValues<T>> => {
const errors: JSONObject = {};
const entries: JSONObject = { ...values } as JSONObject;
const errors: JSONObject = {};
const entries: JSONObject = { ...values } as JSONObject;
for (const field of props.fields) {
const name: string = field.overideFieldKey
? field.overideFieldKey
: (Object.keys(field.field)[0] as string);
for (const field of props.fields) {
const name: string = field.overideFieldKey
? field.overideFieldKey
: (Object.keys(field.field)[0] as string);
if (name in entries) {
const content: string | undefined = entries[name]?.toString();
if (name in entries) {
const content: string | undefined = entries[name]?.toString();
// Check Required fields.
const resultRequired: string | null = validateRequired(
content,
field
);
if (resultRequired) {
errors[name] = resultRequired;
}
// Check for valid email data.
const resultValidateData: string | null = validateData(
content,
field
);
if (resultValidateData) {
errors[name] = resultValidateData;
}
const resultMatch: string | null = validateMatchField(
content,
field,
entries
);
if (resultMatch) {
errors[name] = resultMatch;
}
// check for length of content
const result: string | null = validateLength(content, field);
if (result) {
errors[name] = result;
}
// check for date
const resultDate: string | null = validateDate(content, field);
if (resultDate) {
errors[name] = resultDate;
}
// check for length of content
const resultMaxMinValue: string | null =
validateMaxValueAndMinValue(content, field);
if (resultMaxMinValue) {
errors[name] = resultMaxMinValue;
}
} else if (field.required) {
errors[name] = `${field.title || name} is required.`;
// Check Required fields.
const resultRequired: string | null = validateRequired(
content,
field
);
if (resultRequired) {
errors[name] = resultRequired;
}
// Check for valid email data.
const resultValidateData: string | null = validateData(
content,
field
);
if (resultValidateData) {
errors[name] = resultValidateData;
}
const resultMatch: string | null = validateMatchField(
content,
field,
entries
);
if (resultMatch) {
errors[name] = resultMatch;
}
// check for length of content
const result: string | null = validateLength(content, field);
if (result) {
errors[name] = result;
}
// check for date
const resultDate: string | null = validateDate(content, field);
if (resultDate) {
errors[name] = resultDate;
}
// check for length of content
const resultMaxMinValue: string | null =
validateMaxValueAndMinValue(content, field);
if (resultMaxMinValue) {
errors[name] = resultMaxMinValue;
}
} else if (field.required) {
errors[name] = `${field.title || name} is required.`;
}
}
let customValidateResult: JSONObject = {};
let customValidateResult: JSONObject = {};
if (props.onValidate) {
customValidateResult = props.onValidate(values);
}
if (props.onValidate) {
customValidateResult = props.onValidate(values);
}
return { ...errors, ...customValidateResult } as FormikErrors<
FormValues<T>
>;
};
return { ...errors, ...customValidateResult } as FormikErrors<
FormValues<T>
>;
};
const formRef: any = useRef<any>(null);
@@ -925,7 +935,7 @@ const BasicForm: Function = <T extends Object>(
if (
(values as any)[fieldName] &&
typeof (values as any)[fieldName] ===
Typeof.String
Typeof.String
) {
(values as any)[fieldName] =
new HashedString(
@@ -956,19 +966,21 @@ const BasicForm: Function = <T extends Object>(
<div className={`col-lg-12 flex`}>
<div
className={`col-lg-${12 / (props.showAsColumns || 1)
} ${(props.showAsColumns || 1) > 1
className={`col-lg-${
12 / (props.showAsColumns || 1)
} ${
(props.showAsColumns || 1) > 1
? 'pr-10'
: ''
}`}
}`}
>
{props.fields &&
props.fields.map(
(field: DataField<T>, i: number) => {
if (
i %
(props.showAsColumns ||
1) ===
(props.showAsColumns ||
1) ===
0
) {
return getFormField(
@@ -985,11 +997,13 @@ const BasicForm: Function = <T extends Object>(
</div>
{(props.showAsColumns || 1) > 1 && (
<div
className={`col-lg-${12 / (props.showAsColumns || 1)
} ${(props.showAsColumns || 1) > 1
className={`col-lg-${
12 / (props.showAsColumns || 1)
} ${
(props.showAsColumns || 1) > 1
? 'pl-10'
: ''
}`}
}`}
>
{props.fields &&
props.fields.map(
@@ -999,8 +1013,8 @@ const BasicForm: Function = <T extends Object>(
) => {
if (
i %
(props.showAsColumns ||
1) !==
(props.showAsColumns ||
1) !==
0
) {
return getFormField(

View File

@@ -33,7 +33,7 @@ const ColorPicker: FunctionComponent<ComponentProps> = (
const handleChange: Function = (color: string): void => {
setColor(color);
if (!color) {
return props.onChange(null);
return props.onChange(null);
}
props.onChange(new Color(color));
};

View File

@@ -136,7 +136,7 @@ export enum IconProp {
ExternalLink,
Link,
Layers,
Clock
Clock,
}
export interface ComponentProps {
@@ -172,175 +172,175 @@ const Icon: FunctionComponent<ComponentProps> = ({
<Home
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.More && (
<Grid
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Activity && (
<Activity
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Alert && (
<AlertOctagon
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Call && (
<PhoneCall
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Settings && (
<Settings
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Notification && (
<Bell
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.CheckCircle && (
<CheckCircle
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Search && (
<Search
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Help && (
<HelpCircle
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any as any}
color={color ? color.toString() : (undefined as any as any)}
/>
)}
{icon === IconProp.Logout && (
<Power
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Billing && (
<CreditCard
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.User && (
<User
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.ChevronDown && (
<ChevronDown
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.ChevronLeft && (
<ChevronLeft
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.ChevronRight && (
<ChevronRight
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.ChevronUp && (
<ChevronUp
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Email && (
<Mail
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Slack && (
<Slack
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Time && (
<Clock
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Terminal && (
<Terminal
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Error && (
<AlertTriangle
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Code && (
<Code
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Report && (
<PieChart
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Team && (
<Users
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -348,7 +348,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<Lock
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -356,7 +356,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<Key
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -364,7 +364,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<Folder
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -372,7 +372,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<Share2
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -380,105 +380,105 @@ const Icon: FunctionComponent<ComponentProps> = ({
<MessageSquare
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Info && (
<Info
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Success && (
<Check
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Trash && (
<Trash
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Close && (
<X
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Add && (
<Plus
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Label && (
<Tag
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Refresh && (
<RefreshCcw
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Filter && (
<Filter
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Edit && (
<Edit2
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Hide && (
<EyeOff
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Check && (
<Check
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.True && (
<Check
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.False && (
<X
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.List && (
<List
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -486,7 +486,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<User
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -494,7 +494,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<Circle
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -502,7 +502,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<BarChart2
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -510,7 +510,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<Globe
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -518,7 +518,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<Image
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -526,7 +526,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<Type
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -534,7 +534,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<MoreVertical
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -542,7 +542,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<Link2
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -550,7 +550,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<Link2
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -558,7 +558,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<Send
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -566,7 +566,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<Disc
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -574,7 +574,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<FileText
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -582,7 +582,7 @@ const Icon: FunctionComponent<ComponentProps> = ({
<ExternalLink
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
@@ -590,24 +590,23 @@ const Icon: FunctionComponent<ComponentProps> = ({
<Rss
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Layers && (
<Layers
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
{icon === IconProp.Clock && (
<Clock
size={size}
strokeWidth={thick ? thick : ''}
color={color ? color.toString(): undefined as any}
color={color ? color.toString() : (undefined as any)}
/>
)}
</div>
);
};

View File

@@ -49,7 +49,7 @@ const Input: FunctionComponent<ComponentProps> = (
if (props.leftCircleColor) {
setColor(props.leftCircleColor.toString());
}
}, [props.leftCircleColor])
}, [props.leftCircleColor]);
useEffect(() => {
if (props.type === 'date' || props.type === 'datetime-local') {
@@ -110,7 +110,7 @@ const Input: FunctionComponent<ComponentProps> = (
borderRadius: '300px',
boxShadow: 'rgb(149 157 165 / 20%) 0px 8px 24px',
marginRight: '7px',
borderStyle: "solid"
borderStyle: 'solid',
}}
></div>
)}
@@ -140,11 +140,15 @@ const Input: FunctionComponent<ComponentProps> = (
}
}}
tabIndex={props.tabIndex}
onKeyDown={props.onEnterPress ? (event: any) => {
if (event.key === 'Enter') {
props.onEnterPress && props.onEnterPress();
}
} : undefined}
onKeyDown={
props.onEnterPress
? (event: any) => {
if (event.key === 'Enter') {
props.onEnterPress && props.onEnterPress();
}
}
: undefined
}
readOnly={props.readOnly || props.disabled || false}
type={props.type || 'text'}
placeholder={props.placeholder}
@@ -159,13 +163,19 @@ const Input: FunctionComponent<ComponentProps> = (
}
}}
/>
{color && !props.disabled && (<Icon icon={IconProp.Close} color={Grey} onClick={() => {
setValue('');
setColor('#000000')
if (props.onChange) {
props.onChange('');
}
}} />)}
{color && !props.disabled && (
<Icon
icon={IconProp.Close}
color={Grey}
onClick={() => {
setValue('');
setColor('#000000');
if (props.onChange) {
props.onChange('');
}
}}
/>
)}
</div>
);
};

View File

@@ -36,7 +36,9 @@ const MasterPage: FunctionComponent<ComponentProps> = (
<div id="layout-wrapper">
{props.header && props.header}
{props.navBar && props.navBar}
<div className="main-content" style={props.mainContentStyle}>{props.children}</div>
<div className="main-content" style={props.mainContentStyle}>
{props.children}
</div>
{props.footer && props.footer}
</div>
</React.Fragment>

View File

@@ -21,7 +21,7 @@ export interface ComponentProps<TBaseModel extends BaseModel> {
cardProps: CardProps;
modelDetailProps: ModeDetailProps<TBaseModel>;
isEditable?: undefined | boolean;
editButtonText?: undefined | string;
editButtonText?: undefined | string;
formFields?: undefined | Fields<TBaseModel>;
}

View File

@@ -12,13 +12,19 @@ const Navbar: FunctionComponent<ComponentProps> = (
): ReactElement => {
return (
<React.Fragment>
<div className="topnav active" style={{
zIndex: 1000,
...props.navBarStyle
}}>
<div className="container-fluid active" style={{
maxWidth: props.maxWidth
}}>
<div
className="topnav active"
style={{
zIndex: 1000,
...props.navBarStyle,
}}
>
<div
className="container-fluid active"
style={{
maxWidth: props.maxWidth,
}}
>
<nav
className="navbar navbar-light navbar-expand-lg topnav-menu active"
id="navigation"

View File

@@ -35,7 +35,11 @@ const SideMenuItem: FunctionComponent<ComponentProps> = (
<Icon
icon={props.icon}
thick={ThickProp.LessThick}
color={Navigation.isOnThisPage(props.link.to) ? Black : null}
color={
Navigation.isOnThisPage(props.link.to)
? Black
: null
}
/>
</>
) : (

View File

@@ -44,7 +44,6 @@ import IncidentInternalNote from './Pages/Incidents/View/InternalNote';
import IncidentPublicNote from './Pages/Incidents/View/PublicNote';
import UnresolvedIncidents from './Pages/Incidents/Unresolved';
import ScheduledMaintenanceEvents from './Pages/ScheduledMaintenanceEvents/ScheduledMaintenanceEvents';
import ScheduledMaintenanceEventView from './Pages/ScheduledMaintenanceEvents/View/Index';
import ScheduledMaintenanceEventViewDelete from './Pages/ScheduledMaintenanceEvents/View/Delete';
@@ -156,7 +155,7 @@ const App: FunctionComponent = () => {
} catch (err) {
setError(
(err as HTTPErrorResponse).message ||
'Server Error. Please try again'
'Server Error. Please try again'
);
}
@@ -241,7 +240,11 @@ const App: FunctionComponent = () => {
]?.toString()}
element={
<NotOperationalMonitors
pageRoute={RouteMap[PageMap.HOME_NOT_OPERATIONAL_MONITORS] as Route}
pageRoute={
RouteMap[
PageMap.HOME_NOT_OPERATIONAL_MONITORS
] as Route
}
currentProject={selectedProject}
/>
}
@@ -253,7 +256,12 @@ const App: FunctionComponent = () => {
]?.toString()}
element={
<OngoingScheduledEvents
pageRoute={RouteMap[PageMap.HOME_ONGOING_SCHEDULED_MAINTENANCE_EVENTS] as Route}
pageRoute={
RouteMap[
PageMap
.HOME_ONGOING_SCHEDULED_MAINTENANCE_EVENTS
] as Route
}
currentProject={selectedProject}
/>
}
@@ -276,7 +284,7 @@ const App: FunctionComponent = () => {
<MonitorInoperational
pageRoute={
RouteMap[
PageMap.MONITORS_INOPERATIONAL
PageMap.MONITORS_INOPERATIONAL
] as Route
}
currentProject={selectedProject}
@@ -314,7 +322,7 @@ const App: FunctionComponent = () => {
<MonitorViewStatusTimeline
pageRoute={
RouteMap[
PageMap.MONITOR_VIEW_STATUS_TIMELINE
PageMap.MONITOR_VIEW_STATUS_TIMELINE
] as Route
}
currentProject={selectedProject}
@@ -328,7 +336,7 @@ const App: FunctionComponent = () => {
<MonitorIncidents
pageRoute={
RouteMap[
PageMap.MONITOR_VIEW_INCIDENTS
PageMap.MONITOR_VIEW_INCIDENTS
] as Route
}
currentProject={selectedProject}
@@ -378,7 +386,7 @@ const App: FunctionComponent = () => {
<StatusPagesViewDelete
pageRoute={
RouteMap[
PageMap.STATUS_PAGE_VIEW_DELETE
PageMap.STATUS_PAGE_VIEW_DELETE
] as Route
}
currentProject={selectedProject}
@@ -394,7 +402,7 @@ const App: FunctionComponent = () => {
<StatusPagesViewBranding
pageRoute={
RouteMap[
PageMap.STATUS_PAGE_VIEW_BRANDING
PageMap.STATUS_PAGE_VIEW_BRANDING
] as Route
}
currentProject={selectedProject}
@@ -410,7 +418,7 @@ const App: FunctionComponent = () => {
<StatusPagesViewCustomHtmlCss
pageRoute={
RouteMap[
PageMap.STATUS_PAGE_VIEW_CUSTOM_HTML_CSS
PageMap.STATUS_PAGE_VIEW_CUSTOM_HTML_CSS
] as Route
}
currentProject={selectedProject}
@@ -426,7 +434,7 @@ const App: FunctionComponent = () => {
<StatusPagesViewAdvancedOptions
pageRoute={
RouteMap[
PageMap.STATUS_PAGE_VIEW_ADVANCED_OPTIONS
PageMap.STATUS_PAGE_VIEW_ADVANCED_OPTIONS
] as Route
}
currentProject={selectedProject}
@@ -442,7 +450,7 @@ const App: FunctionComponent = () => {
<StatusPagesViewEmailSubscribers
pageRoute={
RouteMap[
PageMap.STATUS_PAGE_VIEW_EMAIL_SUBSCRIBERS
PageMap.STATUS_PAGE_VIEW_EMAIL_SUBSCRIBERS
] as Route
}
currentProject={selectedProject}
@@ -458,7 +466,7 @@ const App: FunctionComponent = () => {
<StatusPagesViewSMSSubscribers
pageRoute={
RouteMap[
PageMap.STATUS_PAGE_VIEW_SMS_SUBSCRIBERS
PageMap.STATUS_PAGE_VIEW_SMS_SUBSCRIBERS
] as Route
}
currentProject={selectedProject}
@@ -474,7 +482,7 @@ const App: FunctionComponent = () => {
<StatusPagesViewHeaderStyle
pageRoute={
RouteMap[
PageMap.STATUS_PAGE_VIEW_HEADER_STYLE
PageMap.STATUS_PAGE_VIEW_HEADER_STYLE
] as Route
}
currentProject={selectedProject}
@@ -490,7 +498,7 @@ const App: FunctionComponent = () => {
<StatusPagesViewFooterStyle
pageRoute={
RouteMap[
PageMap.STATUS_PAGE_VIEW_FOOTER_STYLE
PageMap.STATUS_PAGE_VIEW_FOOTER_STYLE
] as Route
}
currentProject={selectedProject}
@@ -498,7 +506,6 @@ const App: FunctionComponent = () => {
}
/>
<PageRoute
path={RouteMap[
PageMap.STATUS_PAGE_VIEW_NAVBAR_STYLE
@@ -507,7 +514,7 @@ const App: FunctionComponent = () => {
<StatusPagesViewNavBarStyle
pageRoute={
RouteMap[
PageMap.STATUS_PAGE_VIEW_NAVBAR_STYLE
PageMap.STATUS_PAGE_VIEW_NAVBAR_STYLE
] as Route
}
currentProject={selectedProject}
@@ -523,7 +530,7 @@ const App: FunctionComponent = () => {
<StatusPagesViewWebhookSubscribers
pageRoute={
RouteMap[
PageMap.STATUS_PAGE_VIEW_WEBHOOK_SUBSCRIBERS
PageMap.STATUS_PAGE_VIEW_WEBHOOK_SUBSCRIBERS
] as Route
}
currentProject={selectedProject}
@@ -539,7 +546,7 @@ const App: FunctionComponent = () => {
<StatusPagesViewEmbedded
pageRoute={
RouteMap[
PageMap.STATUS_PAGE_VIEW_EMBEDDED
PageMap.STATUS_PAGE_VIEW_EMBEDDED
] as Route
}
currentProject={selectedProject}
@@ -555,7 +562,7 @@ const App: FunctionComponent = () => {
<StatusPagesViewResources
pageRoute={
RouteMap[
PageMap.STATUS_PAGE_VIEW_RESOURCES
PageMap.STATUS_PAGE_VIEW_RESOURCES
] as Route
}
currentProject={selectedProject}
@@ -571,7 +578,7 @@ const App: FunctionComponent = () => {
<StatusPagesViewDomains
pageRoute={
RouteMap[
PageMap.STATUS_PAGE_VIEW_DOMAINS
PageMap.STATUS_PAGE_VIEW_DOMAINS
] as Route
}
currentProject={selectedProject}
@@ -585,7 +592,7 @@ const App: FunctionComponent = () => {
<StatusPagesViewGroups
pageRoute={
RouteMap[
PageMap.STATUS_PAGE_VIEW_GROUPS
PageMap.STATUS_PAGE_VIEW_GROUPS
] as Route
}
currentProject={selectedProject}
@@ -601,7 +608,7 @@ const App: FunctionComponent = () => {
<StatusPagesViewAnnouncement
pageRoute={
RouteMap[
PageMap.STATUS_PAGE_VIEW_ANNOUNCEMENTS
PageMap.STATUS_PAGE_VIEW_ANNOUNCEMENTS
] as Route
}
currentProject={selectedProject}
@@ -663,7 +670,7 @@ const App: FunctionComponent = () => {
<IncidentViewStateTimeline
pageRoute={
RouteMap[
PageMap.INCIDENT_VIEW_STATE_TIMELINE
PageMap.INCIDENT_VIEW_STATE_TIMELINE
] as Route
}
currentProject={selectedProject}
@@ -677,7 +684,7 @@ const App: FunctionComponent = () => {
<IncidentInternalNote
pageRoute={
RouteMap[
PageMap.INCIDENT_INTERNAL_NOTE
PageMap.INCIDENT_INTERNAL_NOTE
] as Route
}
currentProject={selectedProject}
@@ -697,33 +704,18 @@ const App: FunctionComponent = () => {
}
/>
{/* Scheduled Events */}
<PageRoute
path={RouteMap[PageMap.SCHEDULED_MAINTENANCE_EVENTS]?.toString()}
path={RouteMap[
PageMap.SCHEDULED_MAINTENANCE_EVENTS
]?.toString()}
element={
<ScheduledMaintenanceEvents
pageRoute={RouteMap[PageMap.SCHEDULED_MAINTENANCE_EVENTS] as Route}
currentProject={selectedProject}
/>
}
/>
<PageRoute
path={RouteMap[PageMap.ONGOING_SCHEDULED_MAINTENANCE_EVENTS]?.toString()}
element={
<OngoingScheduledMaintenanceEvents
pageRoute={
RouteMap[PageMap.ONGOING_SCHEDULED_MAINTENANCE_EVENTS] as Route
RouteMap[
PageMap.SCHEDULED_MAINTENANCE_EVENTS
] as Route
}
currentProject={selectedProject}
/>
@@ -731,21 +723,47 @@ const App: FunctionComponent = () => {
/>
<PageRoute
path={RouteMap[PageMap.SCHEDULED_MAINTENANCE_VIEW]?.toString()}
path={RouteMap[
PageMap.ONGOING_SCHEDULED_MAINTENANCE_EVENTS
]?.toString()}
element={
<ScheduledMaintenanceEventView
pageRoute={RouteMap[PageMap.SCHEDULED_MAINTENANCE_VIEW] as Route}
<OngoingScheduledMaintenanceEvents
pageRoute={
RouteMap[
PageMap.ONGOING_SCHEDULED_MAINTENANCE_EVENTS
] as Route
}
currentProject={selectedProject}
/>
}
/>
<PageRoute
path={RouteMap[PageMap.SCHEDULED_MAINTENANCE_VIEW_DELETE]?.toString()}
path={RouteMap[
PageMap.SCHEDULED_MAINTENANCE_VIEW
]?.toString()}
element={
<ScheduledMaintenanceEventView
pageRoute={
RouteMap[
PageMap.SCHEDULED_MAINTENANCE_VIEW
] as Route
}
currentProject={selectedProject}
/>
}
/>
<PageRoute
path={RouteMap[
PageMap.SCHEDULED_MAINTENANCE_VIEW_DELETE
]?.toString()}
element={
<ScheduledMaintenanceEventViewDelete
pageRoute={
RouteMap[PageMap.SCHEDULED_MAINTENANCE_VIEW_DELETE] as Route
RouteMap[
PageMap.SCHEDULED_MAINTENANCE_VIEW_DELETE
] as Route
}
currentProject={selectedProject}
/>
@@ -760,7 +778,8 @@ const App: FunctionComponent = () => {
<ScheduledMaintenanceEventViewStateTimeline
pageRoute={
RouteMap[
PageMap.SCHEDULED_MAINTENANCE_VIEW_STATE_TIMELINE
PageMap
.SCHEDULED_MAINTENANCE_VIEW_STATE_TIMELINE
] as Route
}
currentProject={selectedProject}
@@ -769,12 +788,14 @@ const App: FunctionComponent = () => {
/>
<PageRoute
path={RouteMap[PageMap.SCHEDULED_MAINTENANCE_INTERNAL_NOTE]?.toString()}
path={RouteMap[
PageMap.SCHEDULED_MAINTENANCE_INTERNAL_NOTE
]?.toString()}
element={
<ScheduledMaintenanceEventInternalNote
pageRoute={
RouteMap[
PageMap.SCHEDULED_MAINTENANCE_INTERNAL_NOTE
PageMap.SCHEDULED_MAINTENANCE_INTERNAL_NOTE
] as Route
}
currentProject={selectedProject}
@@ -783,19 +804,21 @@ const App: FunctionComponent = () => {
/>
<PageRoute
path={RouteMap[PageMap.SCHEDULED_MAINTENANCE_PUBLIC_NOTE]?.toString()}
path={RouteMap[
PageMap.SCHEDULED_MAINTENANCE_PUBLIC_NOTE
]?.toString()}
element={
<ScheduledMaintenanceEventPublicNote
pageRoute={
RouteMap[PageMap.SCHEDULED_MAINTENANCE_PUBLIC_NOTE] as Route
RouteMap[
PageMap.SCHEDULED_MAINTENANCE_PUBLIC_NOTE
] as Route
}
currentProject={selectedProject}
/>
}
/>
{/* Logs */}
<PageRoute
@@ -846,7 +869,7 @@ const App: FunctionComponent = () => {
<SettingsMonitors
pageRoute={
RouteMap[
PageMap.SETTINGS_MONITORS_STATUS
PageMap.SETTINGS_MONITORS_STATUS
] as Route
}
currentProject={selectedProject}
@@ -862,7 +885,7 @@ const App: FunctionComponent = () => {
<SettingsIncidents
pageRoute={
RouteMap[
PageMap.SETTINGS_INCIDENTS_STATE
PageMap.SETTINGS_INCIDENTS_STATE
] as Route
}
currentProject={selectedProject}
@@ -878,7 +901,7 @@ const App: FunctionComponent = () => {
<SettingsScheduledMaintenanceState
pageRoute={
RouteMap[
PageMap.SETTINGS_SCHEDULED_MAINTENANCE_STATE
PageMap.SETTINGS_SCHEDULED_MAINTENANCE_STATE
] as Route
}
currentProject={selectedProject}
@@ -894,7 +917,7 @@ const App: FunctionComponent = () => {
<SettingsIncidentSeverity
pageRoute={
RouteMap[
PageMap.SETTINGS_INCIDENTS_SEVERITY
PageMap.SETTINGS_INCIDENTS_SEVERITY
] as Route
}
currentProject={selectedProject}

View File

@@ -17,7 +17,9 @@ const Logo: FunctionComponent<ComponentProps> = (
onClick={() => {
props.onClick && props.onClick();
}}
imageUrl={Route.fromString(`/dashboard/public/${OneUptimeLogo}`)}
imageUrl={Route.fromString(
`/dashboard/public/${OneUptimeLogo}`
)}
/>
</div>
);

View File

@@ -64,8 +64,6 @@ const DashboardNavbar: FunctionComponent<ComponentProps> = (
icon={IconProp.Clock}
></NavBarItem>
<NavBarItem
title="Status Pages"
icon={IconProp.CheckCircle}

View File

@@ -34,9 +34,8 @@ const ChangeScheduledMaintenanceState: FunctionComponent<ComponentProps> = (
props: ComponentProps
): ReactElement => {
const [isLoading, setIsLaoding] = useState<boolean>(false);
const [scheduledMaintenanceTimeline, setScheduledMaintenanceTimeline] = useState<
ScheduledMaintenanceStateTimeline | undefined
>(undefined);
const [scheduledMaintenanceTimeline, setScheduledMaintenanceTimeline] =
useState<ScheduledMaintenanceStateTimeline | undefined>(undefined);
useEffect(() => {
for (const event of props.scheduledMaintenanceTimeline) {
@@ -68,7 +67,9 @@ const ChangeScheduledMaintenanceState: FunctionComponent<ComponentProps> = (
) {
return (
<div>
<UserElement user={scheduledMaintenanceTimeline.createdByUser} />
<UserElement
user={scheduledMaintenanceTimeline.createdByUser}
/>
{OneUptimeDate.getDateAsLocalFormattedString(
scheduledMaintenanceTimeline.createdAt
)}
@@ -143,14 +144,18 @@ const ChangeScheduledMaintenanceState: FunctionComponent<ComponentProps> = (
}
if (!stateId) {
throw new BadDataException('Scheduled Maintenance State not found.');
throw new BadDataException(
'Scheduled Maintenance State not found.'
);
}
const scheduledMaintenanceStateTimeline: ScheduledMaintenanceStateTimeline =
new ScheduledMaintenanceStateTimeline();
scheduledMaintenanceStateTimeline.projectId = projectId;
scheduledMaintenanceStateTimeline.scheduledMaintenanceId = props.scheduledMaintenanceId;
scheduledMaintenanceStateTimeline.scheduledMaintenanceStateId = stateId;
scheduledMaintenanceStateTimeline.scheduledMaintenanceId =
props.scheduledMaintenanceId;
scheduledMaintenanceStateTimeline.scheduledMaintenanceStateId =
stateId;
await ModelAPI.create(
scheduledMaintenanceStateTimeline,

View File

@@ -47,7 +47,9 @@ const ScheduledMaintenancesTable: FunctionComponent<ComponentProps> = (
props.description ||
'Here is a list of scheduled maintenance events for this project.',
}}
noItemsMessage={props.noItemsMessage || 'No scheduled Maintenance Event found.'}
noItemsMessage={
props.noItemsMessage || 'No scheduled Maintenance Event found.'
}
formFields={[
{
field: {
@@ -95,7 +97,8 @@ const ScheduledMaintenancesTable: FunctionComponent<ComponentProps> = (
monitors: true,
},
title: 'Monitors affected (Optional)',
description: 'Select monitors affected by this scheduled maintenance.',
description:
'Select monitors affected by this scheduled maintenance.',
fieldType: FormFieldSchemaType.MultiSelectDropdown,
dropdownModal: {
type: Monitor,
@@ -216,7 +219,7 @@ const ScheduledMaintenancesTable: FunctionComponent<ComponentProps> = (
return <></>;
},
},
{
field: {
monitors: {
@@ -273,7 +276,8 @@ const ScheduledMaintenancesTable: FunctionComponent<ComponentProps> = (
<StatusPagesElement
statusPages={
StatusPage.fromJSON(
(item['statusPages'] as JSONArray) || [],
(item['statusPages'] as JSONArray) ||
[],
StatusPage
) as Array<StatusPage>
}

View File

@@ -25,13 +25,17 @@ const ScheduledMaintenancesPage: FunctionComponent<PageComponentProps> = (
},
{
title: 'Ongoing Scheduled Maintenance',
to: RouteMap[PageMap.HOME_ONGOING_SCHEDULED_MAINTENANCE_EVENTS] as Route,
to: RouteMap[
PageMap.HOME_ONGOING_SCHEDULED_MAINTENANCE_EVENTS
] as Route,
},
]}
>
<ScheduledMaintenanceTable
currentProject={props.currentProject || undefined}
viewPageRoute={RouteMap[PageMap.SCHEDULED_MAINTENANCE_EVENTS] as Route}
viewPageRoute={
RouteMap[PageMap.SCHEDULED_MAINTENANCE_EVENTS] as Route
}
query={{
projectId: props.currentProject?._id,
currentScheduledMaintenanceState: {

View File

@@ -39,10 +39,8 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
},
}}
/>
</SideMenuSection>
<SideMenuSection title="Monitors">
<SideMenuItem<Monitor>
link={{
title: 'Inoperational Monitors',
@@ -64,13 +62,13 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
/>
</SideMenuSection>
<SideMenuSection title="Scheduled Maintenance">
<SideMenuItem<Monitor>
link={{
title: 'Ongoing Events',
to: RouteUtil.populateRouteParams(
RouteMap[
PageMap.HOME_ONGOING_SCHEDULED_MAINTENANCE_EVENTS
PageMap
.HOME_ONGOING_SCHEDULED_MAINTENANCE_EVENTS
] as Route
),
}}

View File

@@ -25,13 +25,17 @@ const ScheduledMaintenancesPage: FunctionComponent<PageComponentProps> = (
},
{
title: 'Ongoing Scheduled Maintenance',
to: RouteMap[PageMap.ONGOING_SCHEDULED_MAINTENANCE_EVENTS] as Route,
to: RouteMap[
PageMap.ONGOING_SCHEDULED_MAINTENANCE_EVENTS
] as Route,
},
]}
>
<ScheduledMaintenanceTable
currentProject={props.currentProject || undefined}
viewPageRoute={RouteMap[PageMap.SCHEDULED_MAINTENANCE_EVENTS] as Route}
viewPageRoute={
RouteMap[PageMap.SCHEDULED_MAINTENANCE_EVENTS] as Route
}
query={{
projectId: props.currentProject?._id,
currentScheduledMaintenanceState: {

View File

@@ -25,7 +25,9 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
link={{
title: 'All Events',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.SCHEDULED_MAINTENANCE_EVENTS] as Route
RouteMap[
PageMap.SCHEDULED_MAINTENANCE_EVENTS
] as Route
),
}}
icon={IconProp.List}
@@ -35,7 +37,9 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
link={{
title: 'Ongoing Events',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.ONGOING_SCHEDULED_MAINTENANCE_EVENTS] as Route
RouteMap[
PageMap.ONGOING_SCHEDULED_MAINTENANCE_EVENTS
] as Route
),
}}
icon={IconProp.Clock}

View File

@@ -45,7 +45,9 @@ const IncidentDelete: FunctionComponent<PageComponentProps> = (
{
title: 'Delete Scheduled Maintenance',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.SCHEDULED_MAINTENANCE_VIEW_DELETE] as Route,
RouteMap[
PageMap.SCHEDULED_MAINTENANCE_VIEW_DELETE
] as Route,
modelId
),
},
@@ -56,7 +58,9 @@ const IncidentDelete: FunctionComponent<PageComponentProps> = (
modelType={ScheduledMaintenance}
modelId={modelId}
onDeleteSuccess={() => {
Navigation.navigate(RouteMap[PageMap.SCHEDULED_MAINTENANCE_EVENTS] as Route);
Navigation.navigate(
RouteMap[PageMap.SCHEDULED_MAINTENANCE_EVENTS] as Route
);
}}
/>
</Page>

View File

@@ -119,7 +119,8 @@ const ScheduledMaintenanceView: FunctionComponent<PageComponentProps> = (
monitors: true,
},
title: 'Monitors affected (Optional)',
description: 'Select monitors affected by this scheduled maintenance.',
description:
'Select monitors affected by this scheduled maintenance.',
fieldType: FormFieldSchemaType.MultiSelectDropdown,
dropdownModal: {
type: Monitor,
@@ -134,7 +135,8 @@ const ScheduledMaintenanceView: FunctionComponent<PageComponentProps> = (
statusPages: true,
},
title: 'Show event on these status pages (Optional)',
description: 'Select status pages to show this event on',
description:
'Select status pages to show this event on',
fieldType: FormFieldSchemaType.MultiSelectDropdown,
dropdownModal: {
type: StatusPage,
@@ -188,7 +190,7 @@ const ScheduledMaintenanceView: FunctionComponent<PageComponentProps> = (
name: true,
isResolvedState: true,
isOngoingState: true,
isScheduledState: true
isScheduledState: true,
},
}
);

View File

@@ -28,7 +28,7 @@ const ScheduledMaintenanceDelete: FunctionComponent<PageComponentProps> = (
return (
<Page
title={'Scheduled Maintenance Event'}
title={'Scheduled Maintenance Event'}
breadcrumbLinks={[
{
title: 'Project',
@@ -54,7 +54,9 @@ const ScheduledMaintenanceDelete: FunctionComponent<PageComponentProps> = (
{
title: 'Private Notes',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.SCHEDULED_MAINTENANCE_INTERNAL_NOTE] as Route,
RouteMap[
PageMap.SCHEDULED_MAINTENANCE_INTERNAL_NOTE
] as Route,
modelId
),
},
@@ -85,7 +87,8 @@ const ScheduledMaintenanceDelete: FunctionComponent<PageComponentProps> = (
cardProps={{
icon: IconProp.Lock,
title: 'Private Notes',
description: 'Here are private notes for this scheduled maintenance.',
description:
'Here are private notes for this scheduled maintenance.',
}}
noItemsMessage={
'No private notes created for this scheduled maintenance so far.'

View File

@@ -28,7 +28,7 @@ const PublicNote: FunctionComponent<PageComponentProps> = (
return (
<Page
title={'Scheduled Maintenance Event'}
title={'Scheduled Maintenance Event'}
breadcrumbLinks={[
{
title: 'Project',
@@ -54,7 +54,9 @@ const PublicNote: FunctionComponent<PageComponentProps> = (
{
title: 'Public Notes',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.SCHEDULED_MAINTENANCE_PUBLIC_NOTE] as Route,
RouteMap[
PageMap.SCHEDULED_MAINTENANCE_PUBLIC_NOTE
] as Route,
modelId
),
},

View File

@@ -22,7 +22,9 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
link={{
title: 'Overview',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.SCHEDULED_MAINTENANCE_VIEW] as Route,
RouteMap[
PageMap.SCHEDULED_MAINTENANCE_VIEW
] as Route,
props.modelId
),
}}
@@ -33,7 +35,8 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
title: 'State Timeline',
to: RouteUtil.populateRouteParams(
RouteMap[
PageMap.SCHEDULED_MAINTENANCE_VIEW_STATE_TIMELINE
PageMap
.SCHEDULED_MAINTENANCE_VIEW_STATE_TIMELINE
] as Route,
props.modelId
),
@@ -47,7 +50,9 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
link={{
title: 'Private Notes',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.SCHEDULED_MAINTENANCE_INTERNAL_NOTE] as Route,
RouteMap[
PageMap.SCHEDULED_MAINTENANCE_INTERNAL_NOTE
] as Route,
props.modelId
),
}}
@@ -57,7 +62,9 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
link={{
title: 'Public Notes',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.SCHEDULED_MAINTENANCE_PUBLIC_NOTE] as Route,
RouteMap[
PageMap.SCHEDULED_MAINTENANCE_PUBLIC_NOTE
] as Route,
props.modelId
),
}}
@@ -70,7 +77,9 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
link={{
title: 'Delete Scheduled Maintenance',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.SCHEDULED_MAINTENANCE_VIEW_DELETE] as Route,
RouteMap[
PageMap.SCHEDULED_MAINTENANCE_VIEW_DELETE
] as Route,
props.modelId
),
}}

View File

@@ -53,7 +53,9 @@ const ScheduledMaintenanceDelete: FunctionComponent<PageComponentProps> = (
{
title: 'Status Timeline',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.SCHEDULED_MAINTENANCE_VIEW_STATE_TIMELINE] as Route,
RouteMap[
PageMap.SCHEDULED_MAINTENANCE_VIEW_STATE_TIMELINE
] as Route,
modelId
),
},
@@ -129,14 +131,18 @@ const ScheduledMaintenanceDelete: FunctionComponent<PageComponentProps> = (
return (
<Pill
color={
(item['scheduledMaintenanceState'] as JSONObject)[
'color'
] as Color
(
item[
'scheduledMaintenanceState'
] as JSONObject
)['color'] as Color
}
text={
(item['scheduledMaintenanceState'] as JSONObject)[
'name'
] as string
(
item[
'scheduledMaintenanceState'
] as JSONObject
)['name'] as string
}
/>
);

View File

@@ -35,7 +35,9 @@ const ScheduledMaintenancesPage: FunctionComponent<PageComponentProps> = (
},
{
title: 'Scheduled Maintenance State',
to: RouteMap[PageMap.SETTINGS_SCHEDULED_MAINTENANCE_STATE] as Route,
to: RouteMap[
PageMap.SETTINGS_SCHEDULED_MAINTENANCE_STATE
] as Route,
},
]}
sideMenu={<DashboardSideMenu />}

View File

@@ -98,7 +98,9 @@ const DashboardSideMenu: FunctionComponent = (): ReactElement => {
link={{
title: 'Event State',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.SETTINGS_SCHEDULED_MAINTENANCE_STATE] as Route
RouteMap[
PageMap.SETTINGS_SCHEDULED_MAINTENANCE_STATE
] as Route
),
}}
icon={IconProp.Clock}

View File

@@ -120,7 +120,6 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
isEditable={true}
editButtonText={'Edit Favicon'}
formFields={[
{
field: {
faviconFile: true,
@@ -152,17 +151,16 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
}}
/>
<CardModelDetail<StatusPage>
cardProps={{
title: 'Page Colors',
description: 'Page background color and text colors for your status page',
description:
'Page background color and text colors for your status page',
icon: IconProp.Layers,
}}
editButtonText={'Edit Colors'}
isEditable={true}
formFields={[
{
field: {
pageBackgroundColor: true,
@@ -189,7 +187,7 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
fields: [
{
field: {
pageBackgroundColor: true
pageBackgroundColor: true,
},
fieldType: FieldType.Color,
title: 'Page Background Color',
@@ -197,7 +195,7 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
},
{
field: {
pageTextColor: true
pageTextColor: true,
},
fieldType: FieldType.Color,
title: 'Page Text Color',
@@ -207,13 +205,6 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
modelId: modelId,
}}
/>
</Page>
);
};

View File

@@ -53,7 +53,9 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
{
title: 'Footer',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.STATUS_PAGE_VIEW_FOOTER_STYLE] as Route,
RouteMap[
PageMap.STATUS_PAGE_VIEW_FOOTER_STYLE
] as Route,
modelId
),
},
@@ -79,7 +81,7 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
fieldType: FormFieldSchemaType.Text,
required: false,
placeholder: 'Acme, Inc.',
}
},
]}
modelDetailProps={{
showDetailsInNumberOfColumns: 1,
@@ -93,13 +95,12 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
fieldType: FieldType.Text,
title: 'Copyright Info',
placeholder: 'No copyright info entered so far.',
}
},
],
modelId: modelId,
}}
/>
<ModelTable<StatusPageFooterLink>
modelType={StatusPageFooterLink}
id="status-page-Footer-link"
@@ -127,12 +128,9 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
cardProps={{
icon: IconProp.Link,
title: 'Footer Links',
description:
'Footer Links for your status page',
description: 'Footer Links for your status page',
}}
noItemsMessage={
'No status footer link for this status page.'
}
noItemsMessage={'No status footer link for this status page.'}
formFields={[
{
field: {
@@ -176,17 +174,16 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
]}
/>
<CardModelDetail<StatusPage>
cardProps={{
title: 'Footer Colors',
description: 'Footer background color and text colors for your status page',
description:
'Footer background color and text colors for your status page',
icon: IconProp.Layers,
}}
editButtonText={'Edit Colors'}
isEditable={true}
formFields={[
{
field: {
footerBackgroundColor: true,
@@ -213,7 +210,7 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
fields: [
{
field: {
footerBackgroundColor: true
footerBackgroundColor: true,
},
fieldType: FieldType.Color,
title: 'Footer Background Color',
@@ -221,7 +218,7 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
},
{
field: {
footerTextColor: true
footerTextColor: true,
},
fieldType: FieldType.Color,
title: 'Footer Text Color',
@@ -235,13 +232,13 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
<CardModelDetail<StatusPage>
cardProps={{
title: 'Advanced Footer Settings',
description: 'Advanced settings for your status page footer',
description:
'Advanced settings for your status page footer',
icon: IconProp.Settings,
}}
editButtonText={'Edit Settings'}
isEditable={true}
formFields={[
{
field: {
showFooter: true,
@@ -249,7 +246,7 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
title: 'Show Footer on Status Page',
fieldType: FormFieldSchemaType.Checkbox,
required: false,
}
},
]}
modelDetailProps={{
showDetailsInNumberOfColumns: 1,
@@ -258,16 +255,15 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
fields: [
{
field: {
showFooter: true
showFooter: true,
},
fieldType: FieldType.Boolean,
title: 'Show Footer on Status Page',
}
},
],
modelId: modelId,
}}
/>
</Page>
);
};

View File

@@ -53,7 +53,9 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
{
title: 'Header',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.STATUS_PAGE_VIEW_HEADER_STYLE] as Route,
RouteMap[
PageMap.STATUS_PAGE_VIEW_HEADER_STYLE
] as Route,
modelId
),
},
@@ -62,9 +64,6 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
>
<StatusPagePreviewLink modelId={modelId} />
<CardModelDetail<StatusPage>
cardProps={{
title: 'Logo, Cover and Favicon',
@@ -91,7 +90,7 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
fieldType: FormFieldSchemaType.ImageFile,
required: false,
placeholder: 'Please cover logo here.',
}
},
]}
modelDetailProps={{
showDetailsInNumberOfColumns: 1,
@@ -119,13 +118,12 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
fieldType: FieldType.ImageFile,
title: 'Cover Image',
placeholder: 'No cover uploaded.',
}
},
],
modelId: modelId,
}}
/>
<ModelTable<StatusPageHeaderLink>
modelType={StatusPageHeaderLink}
id="status-page-header-link"
@@ -153,12 +151,9 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
cardProps={{
icon: IconProp.Link,
title: 'Header Links',
description:
'Header Links for your status page',
description: 'Header Links for your status page',
}}
noItemsMessage={
'No status header link for this status page.'
}
noItemsMessage={'No status header link for this status page.'}
formFields={[
{
field: {
@@ -202,18 +197,16 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
]}
/>
<CardModelDetail<StatusPage>
cardProps={{
title: 'Header Colors',
description: 'Header background color and text colors for your status page',
description:
'Header background color and text colors for your status page',
icon: IconProp.Layers,
}}
editButtonText={'Edit Colors'}
isEditable={true}
formFields={[
{
field: {
headerBackgroundColor: true,
@@ -240,7 +233,7 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
fields: [
{
field: {
headerBackgroundColor: true
headerBackgroundColor: true,
},
fieldType: FieldType.Color,
title: 'Header Background Color',
@@ -248,7 +241,7 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
},
{
field: {
headerTextColor: true
headerTextColor: true,
},
fieldType: FieldType.Color,
title: 'Header Text Color',
@@ -262,13 +255,13 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
<CardModelDetail<StatusPage>
cardProps={{
title: 'Cover Image Colors',
description: 'Banner background color color for your status page',
description:
'Banner background color color for your status page',
icon: IconProp.Layers,
}}
editButtonText={'Edit Colors'}
isEditable={true}
formFields={[
{
field: {
bannerBackgroundColor: true,
@@ -277,7 +270,7 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
fieldType: FormFieldSchemaType.Color,
required: false,
placeholder: '#ffffff',
}
},
]}
modelDetailProps={{
showDetailsInNumberOfColumns: 1,
@@ -286,12 +279,12 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
fields: [
{
field: {
bannerBackgroundColor: true
bannerBackgroundColor: true,
},
fieldType: FieldType.Color,
title: 'Cover Image Background Color',
placeholder: '#ffffff',
}
},
],
modelId: modelId,
}}
@@ -300,13 +293,13 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
<CardModelDetail<StatusPage>
cardProps={{
title: 'Advanced Header Settings',
description: 'Advanced settings for your status page header',
description:
'Advanced settings for your status page header',
icon: IconProp.Settings,
}}
editButtonText={'Edit Settings'}
isEditable={true}
formFields={[
{
field: {
showHeader: true,
@@ -314,7 +307,7 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
title: 'Show Header on Status Page',
fieldType: FormFieldSchemaType.Checkbox,
required: false,
}
},
]}
modelDetailProps={{
showDetailsInNumberOfColumns: 1,
@@ -323,17 +316,15 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
fields: [
{
field: {
showHeader: true
showHeader: true,
},
fieldType: FieldType.Boolean,
title: 'Show Header on Status Page',
}
},
],
modelId: modelId,
}}
/>
</Page>
);
};

View File

@@ -49,7 +49,9 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
{
title: 'Navbar',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.STATUS_PAGE_VIEW_NAVBAR_STYLE] as Route,
RouteMap[
PageMap.STATUS_PAGE_VIEW_NAVBAR_STYLE
] as Route,
modelId
),
},
@@ -57,19 +59,17 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
sideMenu={<SideMenu modelId={modelId} />}
>
<StatusPagePreviewLink modelId={modelId} />
<CardModelDetail<StatusPage>
cardProps={{
title: 'Navigation Menu Colors',
description: 'Navigation Menu background color and text colors for your status page',
description:
'Navigation Menu background color and text colors for your status page',
icon: IconProp.Layers,
}}
editButtonText={'Edit Colors'}
isEditable={true}
formFields={[
{
field: {
navBarBackgroundColor: true,
@@ -96,7 +96,7 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
fields: [
{
field: {
navBarBackgroundColor: true
navBarBackgroundColor: true,
},
fieldType: FieldType.Color,
title: 'Navigation Menu Background Color',
@@ -104,7 +104,7 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
},
{
field: {
navBarTextColor: true
navBarTextColor: true,
},
fieldType: FieldType.Color,
title: 'Header Text Color',
@@ -115,8 +115,6 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
}}
/>
<CardModelDetail<StatusPage>
cardProps={{
title: 'Page Settings',
@@ -126,7 +124,6 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
editButtonText={'Edit Page Settings'}
isEditable={true}
formFields={[
{
field: {
showOverviewPage: true,
@@ -175,7 +172,6 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
fieldType: FormFieldSchemaType.Checkbox,
required: false,
},
]}
modelDetailProps={{
showDetailsInNumberOfColumns: 1,
@@ -184,47 +180,46 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
fields: [
{
field: {
showOverviewPage: true
showOverviewPage: true,
},
fieldType: FieldType.Boolean,
title: 'Show Overview Page',
},
{
field: {
showIncidentsPage: true
showIncidentsPage: true,
},
fieldType: FieldType.Boolean,
title: 'Show Incidents Page',
},
{
field: {
showScheduledMaintenancePage: true
showScheduledMaintenancePage: true,
},
fieldType: FieldType.Boolean,
title: 'Show Scheduled Maintenance Page',
},
{
field: {
showAnouncementsPage: true
showAnouncementsPage: true,
},
fieldType: FieldType.Boolean,
title: 'Show Announcements Page',
},
{
field: {
enableSubscribers: true
enableSubscribers: true,
},
fieldType: FieldType.Boolean,
title: 'Enable Subscribers',
},
{
field: {
showRssPage: true
showRssPage: true,
},
fieldType: FieldType.Boolean,
title: 'Enable RSS',
},
],
modelId: modelId,
}}
@@ -233,13 +228,13 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
<CardModelDetail<StatusPage>
cardProps={{
title: 'Advanced Navigation Menu Settings',
description: 'Advanced settings for your status page navigation menu.',
description:
'Advanced settings for your status page navigation menu.',
icon: IconProp.Settings,
}}
editButtonText={'Edit Settings'}
isEditable={true}
formFields={[
{
field: {
showNavbar: true,
@@ -247,7 +242,7 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
title: 'Show Navigation Menu on Status Page',
fieldType: FormFieldSchemaType.Checkbox,
required: false,
}
},
]}
modelDetailProps={{
showDetailsInNumberOfColumns: 1,
@@ -256,16 +251,15 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
fields: [
{
field: {
showNavbar: true
showNavbar: true,
},
fieldType: FieldType.Boolean,
title: 'Show Navigation Menu on Status Page',
}
},
],
modelId: modelId,
}}
/>
</Page>
);
};

View File

@@ -178,7 +178,8 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
title: 'Tooltip (Optional)',
fieldType: FormFieldSchemaType.LongText,
required: false,
description: 'This will show up as tooltip beside the resource on your status page.',
description:
'This will show up as tooltip beside the resource on your status page.',
placeholder: 'Tooltip',
},
{
@@ -189,7 +190,8 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
fieldType: FormFieldSchemaType.Checkbox,
required: false,
defaultValue: true,
description: 'Current Resource Status will be shown beside this resource on your status page.',
description:
'Current Resource Status will be shown beside this resource on your status page.',
},
{
field: {
@@ -198,8 +200,9 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
title: 'Show Status History Chart',
fieldType: FormFieldSchemaType.Checkbox,
required: false,
description: 'Show resource status history for the past 90 days. ',
defaultValue: true
description:
'Show resource status history for the past 90 days. ',
defaultValue: true,
},
]}
showRefreshButton={true}

View File

@@ -34,7 +34,7 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
title: 'Annoucements',
to: RouteUtil.populateRouteParams(
RouteMap[
PageMap.STATUS_PAGE_VIEW_ANNOUNCEMENTS
PageMap.STATUS_PAGE_VIEW_ANNOUNCEMENTS
] as Route,
props.modelId
),
@@ -49,7 +49,7 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
title: 'Monitors',
to: RouteUtil.populateRouteParams(
RouteMap[
PageMap.STATUS_PAGE_VIEW_RESOURCES
PageMap.STATUS_PAGE_VIEW_RESOURCES
] as Route,
props.modelId
),
@@ -74,7 +74,7 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
title: 'Email Subscribers',
to: RouteUtil.populateRouteParams(
RouteMap[
PageMap.STATUS_PAGE_VIEW_EMAIL_SUBSCRIBERS
PageMap.STATUS_PAGE_VIEW_EMAIL_SUBSCRIBERS
] as Route,
props.modelId
),
@@ -86,7 +86,7 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
title: 'SMS Subscribers',
to: RouteUtil.populateRouteParams(
RouteMap[
PageMap.STATUS_PAGE_VIEW_SMS_SUBSCRIBERS
PageMap.STATUS_PAGE_VIEW_SMS_SUBSCRIBERS
] as Route,
props.modelId
),
@@ -99,7 +99,7 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
title: 'Webhook Subscribers',
to: RouteUtil.populateRouteParams(
RouteMap[
PageMap.STATUS_PAGE_VIEW_WEBHOOK_SUBSCRIBERS
PageMap.STATUS_PAGE_VIEW_WEBHOOK_SUBSCRIBERS
] as Route,
props.modelId
),
@@ -112,7 +112,7 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
title: 'Subscriber Settings',
to: RouteUtil.populateRouteParams(
RouteMap[
PageMap.STATUS_PAGE_VIEW_SUBSCRIBER_SETTINGS
PageMap.STATUS_PAGE_VIEW_SUBSCRIBER_SETTINGS
] as Route,
props.modelId
),
@@ -127,7 +127,7 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
title: 'Essential Branding',
to: RouteUtil.populateRouteParams(
RouteMap[
PageMap.STATUS_PAGE_VIEW_BRANDING
PageMap.STATUS_PAGE_VIEW_BRANDING
] as Route,
props.modelId
),
@@ -140,7 +140,7 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
title: 'Embedded Status Page',
to: RouteUtil.populateRouteParams(
RouteMap[
PageMap.STATUS_PAGE_VIEW_EMBEDDED
PageMap.STATUS_PAGE_VIEW_EMBEDDED
] as Route,
props.modelId
),
@@ -153,7 +153,7 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
title: 'HTML, CSS & JavaScript',
to: RouteUtil.populateRouteParams(
RouteMap[
PageMap.STATUS_PAGE_VIEW_CUSTOM_HTML_CSS
PageMap.STATUS_PAGE_VIEW_CUSTOM_HTML_CSS
] as Route,
props.modelId
),
@@ -176,7 +176,9 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
link={{
title: 'Header',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.STATUS_PAGE_VIEW_HEADER_STYLE] as Route,
RouteMap[
PageMap.STATUS_PAGE_VIEW_HEADER_STYLE
] as Route,
props.modelId
),
}}
@@ -187,7 +189,9 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
link={{
title: 'Footer',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.STATUS_PAGE_VIEW_FOOTER_STYLE] as Route,
RouteMap[
PageMap.STATUS_PAGE_VIEW_FOOTER_STYLE
] as Route,
props.modelId
),
}}
@@ -198,13 +202,14 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
link={{
title: 'Navigation Menu',
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.STATUS_PAGE_VIEW_NAVBAR_STYLE] as Route,
RouteMap[
PageMap.STATUS_PAGE_VIEW_NAVBAR_STYLE
] as Route,
props.modelId
),
}}
icon={IconProp.Layers}
/>
</SideMenuSection>
<SideMenuSection title="Advanced">
@@ -213,7 +218,7 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
title: 'Advanced Settings',
to: RouteUtil.populateRouteParams(
RouteMap[
PageMap.STATUS_PAGE_VIEW_ADVANCED_OPTIONS
PageMap.STATUS_PAGE_VIEW_ADVANCED_OPTIONS
] as Route,
props.modelId
),

View File

@@ -74,7 +74,6 @@ enum PageMap {
SETTINGS_INCIDENTS_STATE = 'SETTINGS_INCIDENTS_STATE',
SETTINGS_INCIDENTS_SEVERITY = 'SETTINGS_INCIDENTS_SEVERITY',
// monitors
SETTINGS_MONITORS_STATUS = 'SETTINGS_MONITORS_STATUS',

View File

@@ -41,8 +41,6 @@ const RouteMap: Dictionary<Route> = {
`/dashboard/${RouteParams.ProjectID}/incidents/${RouteParams.ModelID}/state-timeline`
),
[PageMap.INCIDENT_VIEW_DELETE]: new Route(
`/dashboard/${RouteParams.ProjectID}/incidents/${RouteParams.ModelID}/delete`
),
@@ -55,8 +53,6 @@ const RouteMap: Dictionary<Route> = {
`/dashboard/${RouteParams.ProjectID}/incidents/${RouteParams.ModelID}/public-notes`
),
[PageMap.SCHEDULED_MAINTENANCE_EVENTS]: new Route(
`/dashboard/${RouteParams.ProjectID}/scheduled-maintenance-events`
),
@@ -73,8 +69,6 @@ const RouteMap: Dictionary<Route> = {
`/dashboard/${RouteParams.ProjectID}/scheduled-maintenance-events/${RouteParams.ModelID}/state-timeline`
),
[PageMap.SCHEDULED_MAINTENANCE_VIEW_DELETE]: new Route(
`/dashboard/${RouteParams.ProjectID}/scheduled-maintenance-events/${RouteParams.ModelID}/delete`
),
@@ -87,7 +81,6 @@ const RouteMap: Dictionary<Route> = {
`/dashboard/${RouteParams.ProjectID}/scheduled-maintenance-events/${RouteParams.ModelID}/public-notes`
),
[PageMap.STATUS_PAGES]: new Route(
`/dashboard/${RouteParams.ProjectID}/status-pages`
),

View File

@@ -26,26 +26,21 @@ import StatusPageSubscriberService, {
Service as StatusPageSubscriberServiceType,
} from 'CommonServer/Services/StatusPageSubscriberService';
import StatusPageFooterLink from 'Model/Models/StatusPageFooterLink';
import StatusPageFooterLinkService, {
Service as StatusPageFooterLinkServiceType,
} from 'CommonServer/Services/StatusPageFooterLinkService';
import StatusPageHeaderLink from 'Model/Models/StatusPageHeaderLink';
import StatusPageHeaderLinkService, {
Service as StatusPageHeaderLinkServiceType,
} from 'CommonServer/Services/StatusPageHeaderLinkService';
import StatusPageAnnouncement from 'Model/Models/StatusPageAnnouncement';
import StatusPageAnnouncementService, {
Service as StatusPageAnnouncementServiceType,
} from 'CommonServer/Services/StatusPageAnnouncementService';
import EmailVerificationToken from 'Model/Models/EmailVerificationToken';
import EmailVerificationTokenService, {
Service as EmailVerificationTokenServiceType,
@@ -136,7 +131,6 @@ import ScheduledMaintenancePublicNoteService, {
Service as ScheduledMaintenancePublicNoteServiceType,
} from 'CommonServer/Services/ScheduledMaintenancePublicNoteService';
import IncidentState from 'Model/Models/IncidentState';
import IncidentStateService, {
Service as IncidentStateServiceType,
@@ -162,7 +156,6 @@ import IncidentPublicNoteService, {
Service as IncidentPublicNoteServiceType,
} from 'CommonServer/Services/IncidentPublicNoteService';
import Domain from 'Model/Models/Domain';
import DomainService, {
Service as DomainServiceType,
@@ -240,10 +233,10 @@ app.use(
);
app.use(
new BaseAPI<ScheduledMaintenanceState, ScheduledMaintenanceStateServiceType>(
new BaseAPI<
ScheduledMaintenanceState,
ScheduledMaintenanceStateService
).getRouter()
ScheduledMaintenanceStateServiceType
>(ScheduledMaintenanceState, ScheduledMaintenanceStateService).getRouter()
);
app.use(
@@ -279,7 +272,10 @@ app.use(
);
app.use(
new BaseAPI<ScheduledMaintenanceStateTimeline, ScheduledMaintenanceStateTimelineServiceType>(
new BaseAPI<
ScheduledMaintenanceStateTimeline,
ScheduledMaintenanceStateTimelineServiceType
>(
ScheduledMaintenanceStateTimeline,
ScheduledMaintenanceStateTimelineService
).getRouter()
@@ -316,17 +312,20 @@ app.use(
).getRouter()
);
app.use(
new BaseAPI<StatusPageHeaderLink, StatusPageHeaderLinkServiceType>(StatusPageHeaderLink, StatusPageHeaderLinkService).getRouter()
new BaseAPI<StatusPageHeaderLink, StatusPageHeaderLinkServiceType>(
StatusPageHeaderLink,
StatusPageHeaderLinkService
).getRouter()
);
app.use(
new BaseAPI<StatusPageFooterLink, StatusPageFooterLinkServiceType>(StatusPageFooterLink, StatusPageFooterLinkService).getRouter()
new BaseAPI<StatusPageFooterLink, StatusPageFooterLinkServiceType>(
StatusPageFooterLink,
StatusPageFooterLinkService
).getRouter()
);
app.use(
new BaseAPI<ApiKey, ApiKeyServiceType>(ApiKey, ApiKeyService).getRouter()
);
@@ -337,8 +336,6 @@ app.use(
).getRouter()
);
app.use(
new BaseAPI<IncidentSeverity, IncidentSeverityServiceType>(
IncidentSeverity,
@@ -384,20 +381,25 @@ app.use(
);
app.use(
new BaseAPI<ScheduledMaintenancePublicNote, ScheduledMaintenancePublicNoteServiceType>(
new BaseAPI<
ScheduledMaintenancePublicNote,
ScheduledMaintenancePublicNoteServiceType
>(
ScheduledMaintenancePublicNote,
ScheduledMaintenancePublicNoteService
).getRouter()
);
app.use(
new BaseAPI<ScheduledMaintenanceInternalNote, ScheduledMaintenanceInternalNoteServiceType>(
new BaseAPI<
ScheduledMaintenanceInternalNote,
ScheduledMaintenanceInternalNoteServiceType
>(
ScheduledMaintenanceInternalNote,
ScheduledMaintenanceInternalNoteService
).getRouter()
);
app.use(
new BaseAPI<IncidentPublicNote, IncidentPublicNoteServiceType>(
IncidentPublicNote,

View File

@@ -64,7 +64,11 @@ export default class ApiKey extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -120,7 +120,11 @@ export default class APIKeyPermission extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -62,7 +62,11 @@ export default class Domain extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -77,7 +77,11 @@ export default class Incident extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -66,7 +66,11 @@ export default class IncidentInternalNote extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -66,7 +66,11 @@ export default class IncidentPublicNote extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -62,7 +62,11 @@ export default class IncidentSeverity extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -62,7 +62,11 @@ export default class IncidentState extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -79,7 +79,11 @@ export default class IncidentStateTimeline extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -25,7 +25,6 @@ import StatusPageSubscriber from './StatusPageSubscriber';
import StatusPageFooterLink from './StatusPageFooterLink';
import StatusPageHeaderLink from './StatusPageHeaderLink';
// On Call Duty
import OnCallDuty from './OnCallDuty';
@@ -42,7 +41,6 @@ import IncidentPublicNote from './IncidentPublicNote';
import IncidentInternalNote from './IncidentInternalNote';
import IncidentSeverity from './IncidentSeverity';
// ScheduledMaintenances
import ScheduledMaintenance from './ScheduledMaintenance';
import ScheduledMaintenanceState from './ScheduledMaintenanceState';

View File

@@ -62,7 +62,11 @@ export default class Label extends AccessControlModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -68,7 +68,11 @@ export default class MonitorStatus extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -63,7 +63,11 @@ export default class MonitorStatusTimeline extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -77,7 +77,11 @@ export default class OnCallDuty extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -172,7 +172,11 @@ export default class Probe extends BaseModel {
read: [Permission.Public],
update: [],
})
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: true,

View File

@@ -71,7 +71,11 @@ export default class ProjectSmtpConfig extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -35,21 +35,42 @@ import StatusPage from './StatusPage';
@MultiTenentQueryAllowed(true)
@TenantColumn('projectId')
@TableAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
delete: [Permission.ProjectOwner, Permission.CanDeleteProjectScheduledMaintenance],
update: [Permission.ProjectOwner, Permission.CanEditProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
delete: [
Permission.ProjectOwner,
Permission.CanDeleteProjectScheduledMaintenance,
],
update: [
Permission.ProjectOwner,
Permission.CanEditProjectScheduledMaintenance,
],
})
@CrudApiEndpoint(new Route('/scheduled-maintenance'))
@SlugifyColumn('name', 'slug')
@Entity({
name: 'ScheduledMaintenance',
})
@SingularPluralName('Scheduled Maintenance Event', 'Scheduled Maintenance Events')
@SingularPluralName(
'Scheduled Maintenance Event',
'Scheduled Maintenance Events'
)
export default class ScheduledMaintenance extends BaseModel {
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
update: [],
})
@TableColumn({
@@ -72,12 +93,22 @@ export default class ScheduledMaintenance extends BaseModel {
public project?: Project = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
@@ -86,9 +117,18 @@ export default class ScheduledMaintenance extends BaseModel {
public projectId?: ObjectID = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
update: [Permission.ProjectOwner, Permission.CanEditProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
update: [
Permission.ProjectOwner,
Permission.CanEditProjectScheduledMaintenance,
],
})
@Index()
@TableColumn({
@@ -104,9 +144,18 @@ export default class ScheduledMaintenance extends BaseModel {
public title?: string = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
update: [Permission.ProjectOwner, Permission.CanEditProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
update: [
Permission.ProjectOwner,
Permission.CanEditProjectScheduledMaintenance,
],
})
@TableColumn({ required: false, type: TableColumnType.LongText })
@Column({
@@ -118,8 +167,14 @@ export default class ScheduledMaintenance extends BaseModel {
@Index()
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
update: [],
})
@TableColumn({ required: true, unique: true, type: TableColumnType.Slug })
@@ -132,8 +187,14 @@ export default class ScheduledMaintenance extends BaseModel {
public slug?: string = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
update: [],
})
@TableColumn({
@@ -156,8 +217,14 @@ export default class ScheduledMaintenance extends BaseModel {
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
update: [],
})
@TableColumn({ type: TableColumnType.ObjectID })
@@ -206,9 +273,18 @@ export default class ScheduledMaintenance extends BaseModel {
public deletedByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
update: [Permission.ProjectOwner, Permission.CanEditProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
update: [
Permission.ProjectOwner,
Permission.CanEditProjectScheduledMaintenance,
],
})
@TableColumn({
required: false,
@@ -234,11 +310,19 @@ export default class ScheduledMaintenance extends BaseModel {
})
public monitors?: Array<Monitor> = undefined; // monitors affected by this scheduledMaintenance.
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
update: [Permission.ProjectOwner, Permission.CanEditProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
update: [
Permission.ProjectOwner,
Permission.CanEditProjectScheduledMaintenance,
],
})
@TableColumn({
required: false,
@@ -262,13 +346,21 @@ export default class ScheduledMaintenance extends BaseModel {
referencedColumnName: '_id',
},
})
public statusPages?: Array<StatusPage> = undefined; // visible on which status page?
public statusPages?: Array<StatusPage> = undefined; // visible on which status page?
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
update: [Permission.ProjectOwner, Permission.CanEditProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
update: [
Permission.ProjectOwner,
Permission.CanEditProjectScheduledMaintenance,
],
})
@TableColumn({
required: false,
@@ -295,9 +387,18 @@ export default class ScheduledMaintenance extends BaseModel {
public labels?: Array<Label> = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
update: [Permission.ProjectOwner, Permission.CanEditProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
update: [
Permission.ProjectOwner,
Permission.CanEditProjectScheduledMaintenance,
],
})
@TableColumn({
manyToOneRelationColumn: 'currentScheduledMaintenanceStateId',
@@ -318,9 +419,18 @@ export default class ScheduledMaintenance extends BaseModel {
public currentScheduledMaintenanceState?: ScheduledMaintenanceState = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
update: [Permission.ProjectOwner, Permission.CanEditProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
update: [
Permission.ProjectOwner,
Permission.CanEditProjectScheduledMaintenance,
],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true })
@@ -332,8 +442,14 @@ export default class ScheduledMaintenance extends BaseModel {
public currentScheduledMaintenanceStateId?: ObjectID = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
update: [],
})
@TableColumn({
@@ -355,9 +471,18 @@ export default class ScheduledMaintenance extends BaseModel {
public changeMonitorStatusTo?: MonitorStatus = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
update: [Permission.ProjectOwner, Permission.CanEditProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
update: [
Permission.ProjectOwner,
Permission.CanEditProjectScheduledMaintenance,
],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: false })
@@ -374,9 +499,18 @@ export default class ScheduledMaintenance extends BaseModel {
required: true,
})
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
update: [Permission.ProjectOwner, Permission.CanEditProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
update: [
Permission.ProjectOwner,
Permission.CanEditProjectScheduledMaintenance,
],
})
@Column({
nullable: false,
@@ -390,9 +524,18 @@ export default class ScheduledMaintenance extends BaseModel {
required: true,
})
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateProjectScheduledMaintenance],
read: [Permission.ProjectOwner, Permission.CanReadProjectScheduledMaintenance],
update: [Permission.ProjectOwner, Permission.CanEditProjectScheduledMaintenance],
create: [
Permission.ProjectOwner,
Permission.CanCreateProjectScheduledMaintenance,
],
read: [
Permission.ProjectOwner,
Permission.CanReadProjectScheduledMaintenance,
],
update: [
Permission.ProjectOwner,
Permission.CanEditProjectScheduledMaintenance,
],
})
@Column({
nullable: false,

View File

@@ -19,10 +19,22 @@ import CanAccessIfCanReadOn from 'Common/Types/Database/CanAccessIfCanReadOn';
@CanAccessIfCanReadOn('scheduledMaintenance')
@TenantColumn('projectId')
@TableAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateScheduledMaintenanceInternalNote],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceInternalNote],
delete: [Permission.ProjectOwner, Permission.CanDeleteScheduledMaintenanceInternalNote],
update: [Permission.ProjectOwner, Permission.CanEditScheduledMaintenanceInternalNote],
create: [
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceInternalNote,
],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceInternalNote,
],
delete: [
Permission.ProjectOwner,
Permission.CanDeleteScheduledMaintenanceInternalNote,
],
update: [
Permission.ProjectOwner,
Permission.CanEditScheduledMaintenanceInternalNote,
],
})
@CrudApiEndpoint(new Route('/scheduled-maintenance-internal-note'))
@Entity({
@@ -35,7 +47,10 @@ export default class ScheduledMaintenanceInternalNote extends BaseModel {
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceInternalNote,
],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceInternalNote],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceInternalNote,
],
update: [],
})
@TableColumn({
@@ -62,11 +77,18 @@ export default class ScheduledMaintenanceInternalNote extends BaseModel {
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceInternalNote,
],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceInternalNote],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceInternalNote,
],
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
@@ -79,7 +101,10 @@ export default class ScheduledMaintenanceInternalNote extends BaseModel {
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceInternalNote,
],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceInternalNote],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceInternalNote,
],
update: [],
})
@TableColumn({
@@ -106,7 +131,10 @@ export default class ScheduledMaintenanceInternalNote extends BaseModel {
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceInternalNote,
],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceInternalNote],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceInternalNote,
],
update: [],
})
@Index()
@@ -123,7 +151,10 @@ export default class ScheduledMaintenanceInternalNote extends BaseModel {
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceInternalNote,
],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceInternalNote],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceInternalNote,
],
update: [],
})
@TableColumn({
@@ -150,7 +181,10 @@ export default class ScheduledMaintenanceInternalNote extends BaseModel {
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceInternalNote,
],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceInternalNote],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceInternalNote,
],
update: [],
})
@TableColumn({ type: TableColumnType.ObjectID })
@@ -203,7 +237,10 @@ export default class ScheduledMaintenanceInternalNote extends BaseModel {
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceInternalNote,
],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceInternalNote],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceInternalNote,
],
update: [
Permission.ProjectOwner,
Permission.CanEditScheduledMaintenanceInternalNote,

View File

@@ -19,10 +19,22 @@ import CanAccessIfCanReadOn from 'Common/Types/Database/CanAccessIfCanReadOn';
@CanAccessIfCanReadOn('scheduledMaintenance')
@TenantColumn('projectId')
@TableAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateScheduledMaintenancePublicNote],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenancePublicNote],
delete: [Permission.ProjectOwner, Permission.CanDeleteScheduledMaintenancePublicNote],
update: [Permission.ProjectOwner, Permission.CanEditScheduledMaintenancePublicNote],
create: [
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenancePublicNote,
],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenancePublicNote,
],
delete: [
Permission.ProjectOwner,
Permission.CanDeleteScheduledMaintenancePublicNote,
],
update: [
Permission.ProjectOwner,
Permission.CanEditScheduledMaintenancePublicNote,
],
})
@CrudApiEndpoint(new Route('/scheduled-maintenance-public-note'))
@Entity({
@@ -35,7 +47,10 @@ export default class ScheduledMaintenancePublicNote extends BaseModel {
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenancePublicNote,
],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenancePublicNote],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenancePublicNote,
],
update: [],
})
@TableColumn({
@@ -62,11 +77,18 @@ export default class ScheduledMaintenancePublicNote extends BaseModel {
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenancePublicNote,
],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenancePublicNote],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenancePublicNote,
],
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
@@ -79,7 +101,10 @@ export default class ScheduledMaintenancePublicNote extends BaseModel {
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenancePublicNote,
],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenancePublicNote],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenancePublicNote,
],
update: [],
})
@TableColumn({
@@ -106,7 +131,10 @@ export default class ScheduledMaintenancePublicNote extends BaseModel {
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenancePublicNote,
],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenancePublicNote],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenancePublicNote,
],
update: [],
})
@Index()
@@ -123,7 +151,10 @@ export default class ScheduledMaintenancePublicNote extends BaseModel {
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenancePublicNote,
],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenancePublicNote],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenancePublicNote,
],
update: [],
})
@TableColumn({
@@ -150,7 +181,10 @@ export default class ScheduledMaintenancePublicNote extends BaseModel {
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenancePublicNote,
],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenancePublicNote],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenancePublicNote,
],
update: [],
})
@TableColumn({ type: TableColumnType.ObjectID })
@@ -203,8 +237,14 @@ export default class ScheduledMaintenancePublicNote extends BaseModel {
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenancePublicNote,
],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenancePublicNote],
update: [Permission.ProjectOwner, Permission.CanEditScheduledMaintenancePublicNote],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenancePublicNote,
],
update: [
Permission.ProjectOwner,
Permission.CanEditScheduledMaintenancePublicNote,
],
})
@TableColumn({ type: TableColumnType.Markdown })
@Column({

View File

@@ -20,10 +20,22 @@ import SingularPluralName from 'Common/Types/Database/SingularPluralName';
@TenantColumn('projectId')
@TableAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateScheduledMaintenanceState],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceState],
delete: [Permission.ProjectOwner, Permission.CanDeleteScheduledMaintenanceState],
update: [Permission.ProjectOwner, Permission.CanEditScheduledMaintenanceState],
create: [
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceState,
],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceState,
],
delete: [
Permission.ProjectOwner,
Permission.CanDeleteScheduledMaintenanceState,
],
update: [
Permission.ProjectOwner,
Permission.CanEditScheduledMaintenanceState,
],
})
@CrudApiEndpoint(new Route('/scheduled-maintenance-state'))
@SlugifyColumn('name', 'slug')
@@ -33,8 +45,14 @@ import SingularPluralName from 'Common/Types/Database/SingularPluralName';
})
export default class ScheduledMaintenanceState extends BaseModel {
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateScheduledMaintenanceState],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceState],
create: [
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceState,
],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceState,
],
update: [],
})
@TableColumn({
@@ -57,12 +75,22 @@ export default class ScheduledMaintenanceState extends BaseModel {
public project?: Project = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateScheduledMaintenanceState],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceState],
create: [
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceState,
],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceState,
],
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
@@ -71,9 +99,18 @@ export default class ScheduledMaintenanceState extends BaseModel {
public projectId?: ObjectID = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateScheduledMaintenanceState],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceState],
update: [Permission.ProjectOwner, Permission.CanEditScheduledMaintenanceState],
create: [
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceState,
],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceState,
],
update: [
Permission.ProjectOwner,
Permission.CanEditScheduledMaintenanceState,
],
})
@TableColumn({
required: true,
@@ -90,7 +127,10 @@ export default class ScheduledMaintenanceState extends BaseModel {
@ColumnAccessControl({
create: [],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceState],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceState,
],
update: [],
})
@TableColumn({ required: true, unique: true, type: TableColumnType.Slug })
@@ -102,9 +142,18 @@ export default class ScheduledMaintenanceState extends BaseModel {
public slug?: string = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateScheduledMaintenanceState],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceState],
update: [Permission.ProjectOwner, Permission.CanEditScheduledMaintenanceState],
create: [
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceState,
],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceState,
],
update: [
Permission.ProjectOwner,
Permission.CanEditScheduledMaintenanceState,
],
})
@TableColumn({ required: false, type: TableColumnType.LongText })
@Column({
@@ -115,8 +164,14 @@ export default class ScheduledMaintenanceState extends BaseModel {
public description?: string = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateScheduledMaintenanceState],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceState],
create: [
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceState,
],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceState,
],
update: [],
})
@TableColumn({
@@ -139,8 +194,14 @@ export default class ScheduledMaintenanceState extends BaseModel {
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateScheduledMaintenanceState],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceState],
create: [
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceState,
],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceState,
],
update: [],
})
@TableColumn({ type: TableColumnType.ObjectID })
@@ -153,7 +214,10 @@ export default class ScheduledMaintenanceState extends BaseModel {
@ColumnAccessControl({
create: [],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceState],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceState,
],
update: [],
})
@TableColumn({
@@ -177,7 +241,10 @@ export default class ScheduledMaintenanceState extends BaseModel {
@ColumnAccessControl({
create: [],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceState],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceState,
],
update: [],
})
@TableColumn({ type: TableColumnType.ObjectID })
@@ -189,9 +256,18 @@ export default class ScheduledMaintenanceState extends BaseModel {
public deletedByUserId?: ObjectID = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateScheduledMaintenanceState],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceState],
update: [Permission.ProjectOwner, Permission.CanEditScheduledMaintenanceState],
create: [
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceState,
],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceState,
],
update: [
Permission.ProjectOwner,
Permission.CanEditScheduledMaintenanceState,
],
})
@TableColumn({
title: 'Color',
@@ -210,9 +286,18 @@ export default class ScheduledMaintenanceState extends BaseModel {
public color?: Color = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateScheduledMaintenanceState],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceState],
update: [Permission.ProjectOwner, Permission.CanEditScheduledMaintenanceState],
create: [
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceState,
],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceState,
],
update: [
Permission.ProjectOwner,
Permission.CanEditScheduledMaintenanceState,
],
})
@TableColumn({
isDefaultValueColumn: false,
@@ -226,9 +311,18 @@ export default class ScheduledMaintenanceState extends BaseModel {
public isScheduledState?: boolean = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateScheduledMaintenanceState],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceState],
update: [Permission.ProjectOwner, Permission.CanEditScheduledMaintenanceState],
create: [
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceState,
],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceState,
],
update: [
Permission.ProjectOwner,
Permission.CanEditScheduledMaintenanceState,
],
})
@TableColumn({
isDefaultValueColumn: false,
@@ -242,9 +336,18 @@ export default class ScheduledMaintenanceState extends BaseModel {
public isOngoingState?: boolean = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateScheduledMaintenanceState],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceState],
update: [Permission.ProjectOwner, Permission.CanEditScheduledMaintenanceState],
create: [
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceState,
],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceState,
],
update: [
Permission.ProjectOwner,
Permission.CanEditScheduledMaintenanceState,
],
})
@TableColumn({
isDefaultValueColumn: false,
@@ -259,9 +362,18 @@ export default class ScheduledMaintenanceState extends BaseModel {
@UniqueColumnBy('projectId')
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateScheduledMaintenanceState],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceState],
update: [Permission.ProjectOwner, Permission.CanEditScheduledMaintenanceState],
create: [
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceState,
],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceState,
],
update: [
Permission.ProjectOwner,
Permission.CanEditScheduledMaintenanceState,
],
})
@TableColumn({
isDefaultValueColumn: false,

View File

@@ -24,18 +24,27 @@ import CanAccessIfCanReadOn from 'Common/Types/Database/CanAccessIfCanReadOn';
Permission.ProjectOwner,
Permission.CanCreateScheduledMaintenanceStateTimeline,
],
read: [Permission.ProjectOwner, Permission.CanReadScheduledMaintenanceStateTimeline],
read: [
Permission.ProjectOwner,
Permission.CanReadScheduledMaintenanceStateTimeline,
],
delete: [
Permission.ProjectOwner,
Permission.CanDeleteScheduledMaintenanceStateTimeline,
],
update: [Permission.ProjectOwner, Permission.CanEditScheduledMaintenanceStateTimeline],
update: [
Permission.ProjectOwner,
Permission.CanEditScheduledMaintenanceStateTimeline,
],
})
@CrudApiEndpoint(new Route('/scheduled-maintenance-state-timeline'))
@Entity({
name: 'ScheduledMaintenanceStateTimeline',
})
@SingularPluralName('ScheduledMaintenance State Tiemline', 'ScheduledMaintenance State Timelines')
@SingularPluralName(
'ScheduledMaintenance State Tiemline',
'ScheduledMaintenance State Timelines'
)
export default class ScheduledMaintenanceStateTimeline extends BaseModel {
@ColumnAccessControl({
create: [
@@ -79,7 +88,11 @@ export default class ScheduledMaintenanceStateTimeline extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -79,7 +79,11 @@ export default class StatusPage extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
@@ -519,11 +523,10 @@ export default class StatusPage extends BaseModel {
@Column({
type: ColumnType.Color,
nullable: true,
transformer: Color.getDatabaseTransformer()
transformer: Color.getDatabaseTransformer(),
})
public bannerBackgroundColor?: Color = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
@@ -536,11 +539,10 @@ export default class StatusPage extends BaseModel {
@Column({
type: ColumnType.Color,
nullable: true,
transformer: Color.getDatabaseTransformer()
transformer: Color.getDatabaseTransformer(),
})
public headerBackgroundColor?: Color = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
@@ -553,11 +555,10 @@ export default class StatusPage extends BaseModel {
@Column({
type: ColumnType.Color,
nullable: true,
transformer: Color.getDatabaseTransformer()
transformer: Color.getDatabaseTransformer(),
})
public headerTextColor?: Color = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
@@ -570,7 +571,7 @@ export default class StatusPage extends BaseModel {
@Column({
type: ColumnType.Color,
nullable: true,
transformer: Color.getDatabaseTransformer()
transformer: Color.getDatabaseTransformer(),
})
public footerBackgroundColor?: Color = undefined;
@@ -586,7 +587,7 @@ export default class StatusPage extends BaseModel {
@Column({
type: ColumnType.Color,
nullable: true,
transformer: Color.getDatabaseTransformer()
transformer: Color.getDatabaseTransformer(),
})
public footerTextColor?: Color = undefined;
@@ -602,7 +603,7 @@ export default class StatusPage extends BaseModel {
@Column({
type: ColumnType.Color,
nullable: true,
transformer: Color.getDatabaseTransformer()
transformer: Color.getDatabaseTransformer(),
})
public pageBackgroundColor?: Color = undefined;
@@ -618,11 +619,10 @@ export default class StatusPage extends BaseModel {
@Column({
type: ColumnType.Color,
nullable: true,
transformer: Color.getDatabaseTransformer()
transformer: Color.getDatabaseTransformer(),
})
public pageTextColor?: Color = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
@@ -635,7 +635,7 @@ export default class StatusPage extends BaseModel {
@Column({
type: ColumnType.Color,
nullable: true,
transformer: Color.getDatabaseTransformer()
transformer: Color.getDatabaseTransformer(),
})
public navBarTextColor?: Color = undefined;
@@ -651,7 +651,7 @@ export default class StatusPage extends BaseModel {
@Column({
type: ColumnType.Color,
nullable: true,
transformer: Color.getDatabaseTransformer()
transformer: Color.getDatabaseTransformer(),
})
public navBarBackgroundColor?: Color = undefined;
@@ -667,7 +667,7 @@ export default class StatusPage extends BaseModel {
@Column({
type: ColumnType.Color,
nullable: true,
transformer: Color.getDatabaseTransformer()
transformer: Color.getDatabaseTransformer(),
})
public pageDescriptionText?: Color = undefined;
@@ -701,7 +701,6 @@ export default class StatusPage extends BaseModel {
})
public showFooter?: boolean = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
@@ -710,14 +709,16 @@ export default class StatusPage extends BaseModel {
read: [Permission.ProjectOwner, Permission.CanReadProjectStatusPage],
update: [Permission.ProjectOwner, Permission.CanEditProjectStatusPage],
})
@TableColumn({ isDefaultValueColumn: false, type: TableColumnType.ShortText })
@TableColumn({
isDefaultValueColumn: false,
type: TableColumnType.ShortText,
})
@Column({
type: ColumnType.ShortText,
nullable: true
nullable: true,
})
public copyrightText?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
@@ -733,7 +734,6 @@ export default class StatusPage extends BaseModel {
})
public showNavbar?: boolean = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
@@ -749,7 +749,6 @@ export default class StatusPage extends BaseModel {
})
public showOverviewPage?: boolean = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
@@ -780,7 +779,6 @@ export default class StatusPage extends BaseModel {
})
public showRssPage?: boolean = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
@@ -796,7 +794,6 @@ export default class StatusPage extends BaseModel {
})
public showAnouncementsPage?: boolean = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
@@ -811,5 +808,4 @@ export default class StatusPage extends BaseModel {
default: true,
})
public showScheduledMaintenancePage?: boolean = undefined;
}

View File

@@ -89,7 +89,11 @@ export default class StatusPageAnnouncement extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -63,7 +63,11 @@ export default class StatusPageDomain extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -32,10 +32,17 @@ import TotalItemsBy from 'Common/Types/Database/TotalItemsBy';
@Entity({
name: 'StatusPageFooterLink',
})
@TotalItemsBy("statusPageId", 3, "This status page cannot have more than 3 footer links")
@TotalItemsBy(
'statusPageId',
3,
'This status page cannot have more than 3 footer links'
)
export default class StatusPageFooterLink extends BaseModel {
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageFooterLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageFooterLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageFooterLink],
update: [],
})
@@ -59,12 +66,19 @@ export default class StatusPageFooterLink extends BaseModel {
public project?: Project = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageFooterLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageFooterLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageFooterLink],
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
@@ -72,9 +86,11 @@ export default class StatusPageFooterLink extends BaseModel {
})
public projectId?: ObjectID = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageFooterLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageFooterLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageFooterLink],
update: [],
})
@@ -98,7 +114,10 @@ export default class StatusPageFooterLink extends BaseModel {
public statusPage?: StatusPage = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageFooterLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageFooterLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageFooterLink],
update: [],
})
@@ -112,9 +131,15 @@ export default class StatusPageFooterLink extends BaseModel {
public statusPageId?: ObjectID = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageFooterLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageFooterLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageFooterLink],
update: [Permission.ProjectOwner, Permission.CanEditStatusPageFooterLink],
update: [
Permission.ProjectOwner,
Permission.CanEditStatusPageFooterLink,
],
})
@TableColumn({ required: true, type: TableColumnType.ShortText })
@Column({
@@ -125,21 +150,30 @@ export default class StatusPageFooterLink extends BaseModel {
public title?: string = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageFooterLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageFooterLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageFooterLink],
update: [Permission.ProjectOwner, Permission.CanEditStatusPageFooterLink],
update: [
Permission.ProjectOwner,
Permission.CanEditStatusPageFooterLink,
],
})
@TableColumn({ required: true, type: TableColumnType.ShortURL })
@Column({
nullable: false,
type: ColumnType.ShortURL,
length: ColumnLength.ShortURL,
transformer: URL.getDatabaseTransformer()
transformer: URL.getDatabaseTransformer(),
})
public link?: URL = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageFooterLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageFooterLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageFooterLink],
update: [],
})
@@ -163,7 +197,10 @@ export default class StatusPageFooterLink extends BaseModel {
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageFooterLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageFooterLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageFooterLink],
update: [],
})
@@ -200,9 +237,15 @@ export default class StatusPageFooterLink extends BaseModel {
public deletedByUser?: User = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageFooterLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageFooterLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageFooterLink],
update: [Permission.ProjectOwner, Permission.CanEditStatusPageFooterLink],
update: [
Permission.ProjectOwner,
Permission.CanEditStatusPageFooterLink,
],
})
@TableColumn({ isDefaultValueColumn: false, type: TableColumnType.Number })
@Column({

View File

@@ -64,7 +64,11 @@ export default class StatusPageGroup extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -32,10 +32,17 @@ import URL from 'Common/Types/API/URL';
@Entity({
name: 'StatusPageHeaderLink',
})
@TotalItemsBy("statusPageId", 3, "This status page cannot have more than 3 header links")
@TotalItemsBy(
'statusPageId',
3,
'This status page cannot have more than 3 header links'
)
export default class StatusPageHeaderLink extends BaseModel {
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageHeaderLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageHeaderLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageHeaderLink],
update: [],
})
@@ -59,12 +66,19 @@ export default class StatusPageHeaderLink extends BaseModel {
public project?: Project = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageHeaderLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageHeaderLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageHeaderLink],
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
@@ -72,9 +86,11 @@ export default class StatusPageHeaderLink extends BaseModel {
})
public projectId?: ObjectID = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageHeaderLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageHeaderLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageHeaderLink],
update: [],
})
@@ -98,7 +114,10 @@ export default class StatusPageHeaderLink extends BaseModel {
public statusPage?: StatusPage = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageHeaderLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageHeaderLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageHeaderLink],
update: [],
})
@@ -112,9 +131,15 @@ export default class StatusPageHeaderLink extends BaseModel {
public statusPageId?: ObjectID = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageHeaderLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageHeaderLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageHeaderLink],
update: [Permission.ProjectOwner, Permission.CanEditStatusPageHeaderLink],
update: [
Permission.ProjectOwner,
Permission.CanEditStatusPageHeaderLink,
],
})
@TableColumn({ required: true, type: TableColumnType.ShortText })
@Column({
@@ -125,21 +150,30 @@ export default class StatusPageHeaderLink extends BaseModel {
public title?: string = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageHeaderLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageHeaderLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageHeaderLink],
update: [Permission.ProjectOwner, Permission.CanEditStatusPageHeaderLink],
update: [
Permission.ProjectOwner,
Permission.CanEditStatusPageHeaderLink,
],
})
@TableColumn({ required: true, type: TableColumnType.ShortURL })
@Column({
nullable: false,
type: ColumnType.ShortURL,
length: ColumnLength.ShortURL,
transformer: URL.getDatabaseTransformer()
transformer: URL.getDatabaseTransformer(),
})
public link?: URL = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageHeaderLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageHeaderLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageHeaderLink],
update: [],
})
@@ -163,7 +197,10 @@ export default class StatusPageHeaderLink extends BaseModel {
public createdByUser?: User = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageHeaderLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageHeaderLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageHeaderLink],
update: [],
})
@@ -199,11 +236,16 @@ export default class StatusPageHeaderLink extends BaseModel {
@JoinColumn({ name: 'deletedByUserId' })
public deletedByUser?: User = undefined;
@ColumnAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageHeaderLink],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageHeaderLink,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageHeaderLink],
update: [Permission.ProjectOwner, Permission.CanEditStatusPageHeaderLink],
update: [
Permission.ProjectOwner,
Permission.CanEditStatusPageHeaderLink,
],
})
@TableColumn({ isDefaultValueColumn: false, type: TableColumnType.Number })
@Column({

View File

@@ -71,7 +71,11 @@ export default class StatusPageResource extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,
@@ -259,7 +263,6 @@ export default class StatusPageResource extends BaseModel {
})
public displayTooltip?: string = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,
@@ -275,7 +278,6 @@ export default class StatusPageResource extends BaseModel {
})
public showCurrentStatus?: boolean = undefined;
@ColumnAccessControl({
create: [
Permission.ProjectOwner,

View File

@@ -72,7 +72,11 @@ export default class StatusPageSubscriber extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -65,7 +65,11 @@ export default class Team extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -152,7 +152,11 @@ export default class TeamMember extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -117,7 +117,11 @@ export default class TeamPermission extends BaseModel {
update: [],
})
@Index()
@TableColumn({ type: TableColumnType.ObjectID, required: true, canReadOnPopulate: true})
@TableColumn({
type: TableColumnType.ObjectID,
required: true,
canReadOnPopulate: true,
})
@Column({
type: ColumnType.ObjectID,
nullable: false,

View File

@@ -1,6 +1,12 @@
import React, { FunctionComponent } from 'react';
import Route from 'Common/Types/API/Route';
import { Routes, Route as PageRoute, useNavigate, useLocation, useParams } from 'react-router-dom';
import {
Routes,
Route as PageRoute,
useNavigate,
useLocation,
useParams,
} from 'react-router-dom';
import MasterPage from './Components/MasterPage/MasterPage';
import PageNotFound from './Pages/NotFound/PageNotFound';
@@ -20,7 +26,6 @@ import 'CommonUI/src/Styles/theme.scss';
import Navigation from 'CommonUI/src/Utils/Navigation';
const App: FunctionComponent = () => {
Navigation.setNavigateHook(useNavigate());
Navigation.setLocation(useLocation());
Navigation.setParams(useParams());
@@ -28,7 +33,6 @@ const App: FunctionComponent = () => {
return (
<MasterPage>
<Routes>
{/* Live */}
<PageRoute
@@ -44,7 +48,11 @@ const App: FunctionComponent = () => {
path={RouteMap[PageMap.SCHEDULED_EVENT_DETAIL]?.toString()}
element={
<ScheduledEventDetail
pageRoute={RouteMap[PageMap.SCHEDULED_EVENT_DETAIL] as Route}
pageRoute={
RouteMap[
PageMap.SCHEDULED_EVENT_DETAIL
] as Route
}
/>
}
/>
@@ -53,7 +61,9 @@ const App: FunctionComponent = () => {
path={RouteMap[PageMap.SCHEDULED_EVENT_LIST]?.toString()}
element={
<ScheduledEventList
pageRoute={RouteMap[PageMap.SCHEDULED_EVENT_LIST] as Route}
pageRoute={
RouteMap[PageMap.SCHEDULED_EVENT_LIST] as Route
}
/>
}
/>
@@ -62,7 +72,9 @@ const App: FunctionComponent = () => {
path={RouteMap[PageMap.INCIDENT_DETAIL]?.toString()}
element={
<IncidentDetail
pageRoute={RouteMap[PageMap.INCIDENT_DETAIL] as Route}
pageRoute={
RouteMap[PageMap.INCIDENT_DETAIL] as Route
}
/>
}
/>
@@ -80,17 +92,20 @@ const App: FunctionComponent = () => {
path={RouteMap[PageMap.ANNOUNCEMENT_DETAIL]?.toString()}
element={
<AnnouncementDetail
pageRoute={RouteMap[PageMap.ANNOUNCEMENT_DETAIL] as Route}
pageRoute={
RouteMap[PageMap.ANNOUNCEMENT_DETAIL] as Route
}
/>
}
/>
<PageRoute
path={RouteMap[PageMap.ANNOUNCEMENT_LIST]?.toString()}
element={
<AnnouncementList
pageRoute={RouteMap[PageMap.ANNOUNCEMENT_LIST] as Route}
pageRoute={
RouteMap[PageMap.ANNOUNCEMENT_LIST] as Route
}
/>
}
/>
@@ -104,15 +119,15 @@ const App: FunctionComponent = () => {
}
/>
{/* Preview */}
<PageRoute
path={RouteMap[PageMap.PREVIEW_OVERVIEW]?.toString()}
element={
<Overview
pageRoute={RouteMap[PageMap.PREVIEW_OVERVIEW] as Route}
pageRoute={
RouteMap[PageMap.PREVIEW_OVERVIEW] as Route
}
/>
}
/>
@@ -121,25 +136,39 @@ const App: FunctionComponent = () => {
path={RouteMap[PageMap.PREVIEW_SUBSCRIBE]?.toString()}
element={
<Subscribe
pageRoute={RouteMap[PageMap.PREVIEW_SUBSCRIBE] as Route}
pageRoute={
RouteMap[PageMap.PREVIEW_SUBSCRIBE] as Route
}
/>
}
/>
<PageRoute
path={RouteMap[PageMap.PREVIEW_SCHEDULED_EVENT_DETAIL]?.toString()}
path={RouteMap[
PageMap.PREVIEW_SCHEDULED_EVENT_DETAIL
]?.toString()}
element={
<ScheduledEventDetail
pageRoute={RouteMap[PageMap.PREVIEW_SCHEDULED_EVENT_DETAIL] as Route}
pageRoute={
RouteMap[
PageMap.PREVIEW_SCHEDULED_EVENT_DETAIL
] as Route
}
/>
}
/>
<PageRoute
path={RouteMap[PageMap.PREVIEW_SCHEDULED_EVENT_LIST]?.toString()}
path={RouteMap[
PageMap.PREVIEW_SCHEDULED_EVENT_LIST
]?.toString()}
element={
<ScheduledEventList
pageRoute={RouteMap[PageMap.PREVIEW_SCHEDULED_EVENT_LIST] as Route}
pageRoute={
RouteMap[
PageMap.PREVIEW_SCHEDULED_EVENT_LIST
] as Route
}
/>
}
/>
@@ -148,7 +177,11 @@ const App: FunctionComponent = () => {
path={RouteMap[PageMap.PREVIEW_INCIDENT_DETAIL]?.toString()}
element={
<IncidentDetail
pageRoute={RouteMap[PageMap.PREVIEW_INCIDENT_DETAIL] as Route}
pageRoute={
RouteMap[
PageMap.PREVIEW_INCIDENT_DETAIL
] as Route
}
/>
}
/>
@@ -157,33 +190,43 @@ const App: FunctionComponent = () => {
path={RouteMap[PageMap.PREVIEW_INCIDENT_LIST]?.toString()}
element={
<IncidentList
pageRoute={RouteMap[PageMap.PREVIEW_INCIDENT_LIST] as Route}
pageRoute={
RouteMap[PageMap.PREVIEW_INCIDENT_LIST] as Route
}
/>
}
/>
<PageRoute
path={RouteMap[PageMap.PREVIEW_ANNOUNCEMENT_DETAIL]?.toString()}
path={RouteMap[
PageMap.PREVIEW_ANNOUNCEMENT_DETAIL
]?.toString()}
element={
<AnnouncementDetail
pageRoute={RouteMap[PageMap.PREVIEW_ANNOUNCEMENT_DETAIL] as Route}
pageRoute={
RouteMap[
PageMap.PREVIEW_ANNOUNCEMENT_DETAIL
] as Route
}
/>
}
/>
<PageRoute
path={RouteMap[PageMap.PREVIEW_ANNOUNCEMENT_LIST]?.toString()}
path={RouteMap[
PageMap.PREVIEW_ANNOUNCEMENT_LIST
]?.toString()}
element={
<AnnouncementList
pageRoute={RouteMap[PageMap.PREVIEW_ANNOUNCEMENT_LIST] as Route}
pageRoute={
RouteMap[
PageMap.PREVIEW_ANNOUNCEMENT_LIST
] as Route
}
/>
}
/>
{/* 👇️ only match this when no other routes match */}
<PageRoute

View File

@@ -16,10 +16,12 @@ const Banner: FunctionComponent<ComponentProps> = (
onClick={() => {
props.onClick && props.onClick();
}}
imageUrl={Route.fromString(`/status-page/public/${PlaceholderBanner}`)}
imageUrl={Route.fromString(
`/status-page/public/${PlaceholderBanner}`
)}
/>
</div>
);
};
export default Banner;
export default Banner;

View File

@@ -18,7 +18,7 @@ const StatusPageFooter: FunctionComponent = () => {
{
title: 'Powered by OneUptime',
to: URL.fromString('https://oneuptime.com'),
openInNewTab: true
openInNewTab: true,
},
]}
/>

View File

@@ -3,27 +3,31 @@ import Banner from '../Banner/Banner';
import Logo from '../Logo/Logo';
const StatusPageHeader: FunctionComponent = (): ReactElement => {
return (<header id="page-topbar" style={{
maxWidth: "880px",
paddingLeft: "5px",
margin: "auto",
zIndex: 0,
position: "unset"
}}>
<Banner />
<div className="navbar-header" style={{
padding: "0px",
margin: "5px",
}}>
<div className="d-flex"><Logo onClick={() => {
}} /></div>
</div>
</header>)
return (
<header
id="page-topbar"
style={{
maxWidth: '880px',
paddingLeft: '5px',
margin: 'auto',
zIndex: 0,
position: 'unset',
}}
>
<Banner />
<div
className="navbar-header"
style={{
padding: '0px',
margin: '5px',
}}
>
<div className="d-flex">
<Logo onClick={() => {}} />
</div>
</div>
</header>
);
};
export default StatusPageHeader;

View File

@@ -17,7 +17,9 @@ const Logo: FunctionComponent<ComponentProps> = (
onClick={() => {
props.onClick && props.onClick();
}}
imageUrl={Route.fromString(`/status-page/public/${OneUptimeLogo}`)}
imageUrl={Route.fromString(
`/status-page/public/${OneUptimeLogo}`
)}
/>
</div>
);

View File

@@ -21,11 +21,11 @@ const DashboardMasterPage: FunctionComponent<ComponentProps> = (
isLoading={props.isLoading || false}
error={props.error || ''}
mainContentStyle={{
display: "flex",
alignItems: "center",
margin: "auto",
maxWidth: "880px",
marginLeft: "auto !important"
display: 'flex',
alignItems: 'center',
margin: 'auto',
maxWidth: '880px',
marginLeft: 'auto !important',
}}
>
{props.children}

View File

@@ -14,7 +14,6 @@ export interface ComponentProps {
const DashboardNavbar: FunctionComponent<ComponentProps> = (
props: ComponentProps
): ReactElement => {
if (!props.show) {
return <></>;
}
@@ -22,8 +21,8 @@ const DashboardNavbar: FunctionComponent<ComponentProps> = (
return (
<NavBar
navBarStyle={{
marginTop: "0px",
position: "unset"
marginTop: '0px',
position: 'unset',
}}
rightContent={
<>
@@ -31,14 +30,18 @@ const DashboardNavbar: FunctionComponent<ComponentProps> = (
title="Subscribe"
icon={IconProp.Email}
route={RouteUtil.populateRouteParams(
props.isPreview ? RouteMap[PageMap.PREVIEW_SUBSCRIBE] as Route : RouteMap[PageMap.SUBSCRIBE] as Route
props.isPreview
? (RouteMap[PageMap.PREVIEW_SUBSCRIBE] as Route)
: (RouteMap[PageMap.SUBSCRIBE] as Route)
)}
></NavBarItem>
<NavBarItem
title="RSS"
icon={IconProp.RSS}
route={RouteUtil.populateRouteParams(
props.isPreview ? RouteMap[PageMap.PREVIEW_RSS] as Route : RouteMap[PageMap.RSS] as Route
props.isPreview
? (RouteMap[PageMap.PREVIEW_RSS] as Route)
: (RouteMap[PageMap.RSS] as Route)
)}
></NavBarItem>
</>
@@ -48,31 +51,40 @@ const DashboardNavbar: FunctionComponent<ComponentProps> = (
<NavBarItem
title="Overview"
route={RouteUtil.populateRouteParams(
props.isPreview ? RouteMap[PageMap.PREVIEW_OVERVIEW] as Route : RouteMap[PageMap.OVERVIEW] as Route
props.isPreview
? (RouteMap[PageMap.PREVIEW_OVERVIEW] as Route)
: (RouteMap[PageMap.OVERVIEW] as Route)
)}
></NavBarItem>
<NavBarItem
title="Incidents"
route={RouteUtil.populateRouteParams(
props.isPreview ? RouteMap[PageMap.PREVIEW_INCIDENT_LIST] as Route : RouteMap[PageMap.INCIDENT_LIST] as Route
props.isPreview
? (RouteMap[PageMap.PREVIEW_INCIDENT_LIST] as Route)
: (RouteMap[PageMap.INCIDENT_LIST] as Route)
)}
></NavBarItem>
<NavBarItem
title="Announcements"
route={RouteUtil.populateRouteParams(
props.isPreview ? RouteMap[PageMap.PREVIEW_ANNOUNCEMENT_LIST] as Route : RouteMap[PageMap.ANNOUNCEMENT_LIST] as Route
props.isPreview
? (RouteMap[PageMap.PREVIEW_ANNOUNCEMENT_LIST] as Route)
: (RouteMap[PageMap.ANNOUNCEMENT_LIST] as Route)
)}
></NavBarItem>
<NavBarItem
title="Scheduled Maintenance"
route={RouteUtil.populateRouteParams(
props.isPreview ? RouteMap[PageMap.PREVIEW_SCHEDULED_EVENT_LIST] as Route : RouteMap[PageMap.SCHEDULED_EVENT_LIST] as Route
props.isPreview
? (RouteMap[
PageMap.PREVIEW_SCHEDULED_EVENT_LIST
] as Route)
: (RouteMap[PageMap.SCHEDULED_EVENT_LIST] as Route)
)}
></NavBarItem>
</NavBar>
);
};

View File

@@ -9,15 +9,21 @@ const Page: FunctionComponent<ComponentProps> = (
props: ComponentProps
): ReactElement => {
return (
<div className="page-content" style={{
marginLeft: "0px",
paddingLeft: "5px",
marginTop: "0px"
}}>
<div className="container-fluid" style={{
margin: "0px",
padding: "0px"
}}>
<div
className="page-content"
style={{
marginLeft: '0px',
paddingLeft: '5px',
marginTop: '0px',
}}
>
<div
className="container-fluid"
style={{
margin: '0px',
padding: '0px',
}}
>
<div className="row">
<div className="col-12">
<div className="page-title-box d-sm-flex align-items-center justify-content-between">

View File

@@ -19,7 +19,7 @@ enum PageMap {
PREVIEW_SCHEDULED_EVENT_LIST = 'PREVIEW_SCHEDULED_EVENT_LIST',
PREVIEW_SCHEDULED_EVENT_DETAIL = 'PREVIEW_SCHEDULED_EVENT_DETAIL',
PREVIEW_RSS = 'RSS',
PREVIEW_SUBSCRIBE = 'PREVIEW_SUBSCRIBE'
PREVIEW_SUBSCRIBE = 'PREVIEW_SUBSCRIBE',
}
export default PageMap;

View File

@@ -15,15 +15,33 @@ const RouteMap: Dictionary<Route> = {
[PageMap.RSS]: new Route(`/rss`),
[PageMap.SUBSCRIBE]: new Route(`/subscribe`),
[PageMap.PREVIEW_OVERVIEW]: new Route(`/status-page/${RouteParams.StatusPageId}`),
[PageMap.PREVIEW_INCIDENT_LIST]: new Route(`/status-page/${RouteParams.StatusPageId}/incidents`),
[PageMap.PREVIEW_INCIDENT_DETAIL]: new Route(`/status-page/${RouteParams.StatusPageId}/incidents/:id`),
[PageMap.PREVIEW_ANNOUNCEMENT_DETAIL]: new Route(`/status-page/${RouteParams.StatusPageId}/announcements/:id`),
[PageMap.PREVIEW_ANNOUNCEMENT_LIST]: new Route(`/status-page/${RouteParams.StatusPageId}/announcements`),
[PageMap.PREVIEW_SCHEDULED_EVENT_LIST]: new Route(`/status-page/${RouteParams.StatusPageId}/scheduled-events`),
[PageMap.PREVIEW_SCHEDULED_EVENT_DETAIL]: new Route(`/status-page/${RouteParams.StatusPageId}/scheduled-events/:id`),
[PageMap.PREVIEW_RSS]: new Route(`/status-page/${RouteParams.StatusPageId}/rss`),
[PageMap.PREVIEW_SUBSCRIBE]: new Route(`/status-page/${RouteParams.StatusPageId}/subscribe`),
[PageMap.PREVIEW_OVERVIEW]: new Route(
`/status-page/${RouteParams.StatusPageId}`
),
[PageMap.PREVIEW_INCIDENT_LIST]: new Route(
`/status-page/${RouteParams.StatusPageId}/incidents`
),
[PageMap.PREVIEW_INCIDENT_DETAIL]: new Route(
`/status-page/${RouteParams.StatusPageId}/incidents/:id`
),
[PageMap.PREVIEW_ANNOUNCEMENT_DETAIL]: new Route(
`/status-page/${RouteParams.StatusPageId}/announcements/:id`
),
[PageMap.PREVIEW_ANNOUNCEMENT_LIST]: new Route(
`/status-page/${RouteParams.StatusPageId}/announcements`
),
[PageMap.PREVIEW_SCHEDULED_EVENT_LIST]: new Route(
`/status-page/${RouteParams.StatusPageId}/scheduled-events`
),
[PageMap.PREVIEW_SCHEDULED_EVENT_DETAIL]: new Route(
`/status-page/${RouteParams.StatusPageId}/scheduled-events/:id`
),
[PageMap.PREVIEW_RSS]: new Route(
`/status-page/${RouteParams.StatusPageId}/rss`
),
[PageMap.PREVIEW_SUBSCRIBE]: new Route(
`/status-page/${RouteParams.StatusPageId}/subscribe`
),
[PageMap.NOT_FOUND]: new Route(`status-page/not-found`),
};

View File

@@ -3,8 +3,7 @@ import Redis from 'CommonServer/Infrastructure/Redis';
import logger from 'CommonServer/Utils/Logger';
import App from 'CommonServer/Utils/StartServer';
// Worker import.
// Worker import.
import './Jobs/ScheduledMaintenance/ChangeStateToOngoing';
const APP_NAME: string = 'workers';
@@ -26,4 +25,4 @@ const init: Function = async (): Promise<void> => {
}
};
init();
init();

View File

@@ -1,7 +1,7 @@
import logger from 'CommonServer/Utils/Logger';
import cron from 'node-cron';
import { EVERY_MINUTE } from '../../Utils/CronTime';
import ScheduledMaintenanceService from 'CommonServer/Services/ScheduledMaintenanceService'
import ScheduledMaintenanceService from 'CommonServer/Services/ScheduledMaintenanceService';
import QueryHelper from 'CommonServer/Types/Database/QueryHelper';
import OneUptimeDate from 'Common/Types/Date';
import LIMIT_MAX from 'Common/Types/Database/LimitMax';
@@ -11,31 +11,33 @@ import ScheduledMaintenanceStateService from 'CommonServer/Services/ScheduledMai
cron.schedule(EVERY_MINUTE, async () => {
try {
// get all scheduled events of all the projects.
const events: Array<ScheduledMaintenance> = await ScheduledMaintenanceService.findBy({
query: {
currentScheduledMaintenanceState: {
isScheduledState: true,
} as any,
startsAt: QueryHelper.lessThan(OneUptimeDate.getCurrentDate())
},
props: {
isRoot: true
},
limit: LIMIT_MAX,
skip: 0,
select: {
_id: true,
projectId: true,
changeMonitorStatusToId: true
},
populate: {
monitors: {
_id: true
}
}
});
// get all scheduled events of all the projects.
const events: Array<ScheduledMaintenance> =
await ScheduledMaintenanceService.findBy({
query: {
currentScheduledMaintenanceState: {
isScheduledState: true,
} as any,
startsAt: QueryHelper.lessThan(
OneUptimeDate.getCurrentDate()
),
},
props: {
isRoot: true,
},
limit: LIMIT_MAX,
skip: 0,
select: {
_id: true,
projectId: true,
changeMonitorStatusToId: true,
},
populate: {
monitors: {
_id: true,
},
},
});
// change their state to Ongoing.
@@ -58,16 +60,22 @@ cron.schedule(EVERY_MINUTE, async () => {
continue;
}
await ScheduledMaintenanceService.changeScheduledMaintenanceState(event.projectId!, event.id!, scheduledMaintenanceState.id, {
isRoot: true
})
await ScheduledMaintenanceService.changeScheduledMaintenanceState(
event.projectId!,
event.id!,
scheduledMaintenanceState.id,
{
isRoot: true,
}
);
// change attached monitor states.
await ScheduledMaintenanceService.changeAttachedMonitorStates(event, { isRoot: true })
await ScheduledMaintenanceService.changeAttachedMonitorStates(
event,
{ isRoot: true }
);
}
} catch (err) {
logger.error(err);
}
});
});

View File

@@ -1 +1 @@
export const EVERY_MINUTE: string = '* * * * *';
export const EVERY_MINUTE: string = '* * * * *';

View File

@@ -24,7 +24,9 @@ services:
- 8443:8443
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./SAML/.env
volumes:
- ./saml/users.php:/var/www/simplesamlphp/config/authsources.php
@@ -45,7 +47,9 @@ services:
dockerfile: ./DashboardAPI/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./DashboardAPI/.env
environment: *common-variables
depends_on:
@@ -60,7 +64,9 @@ services:
dockerfile: ./Workers/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Workers/.env
environment: *common-variables
depends_on:
@@ -75,7 +81,9 @@ services:
dockerfile: ./File/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./File/.env
environment: *common-variables
depends_on:
@@ -90,7 +98,9 @@ services:
dockerfile: ./Identity/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Identity/.env
environment: *common-variables
depends_on:
@@ -106,7 +116,9 @@ services:
dockerfile: ./Alert/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Alert/.env
environment: *common-variables
depends_on:
@@ -121,7 +133,9 @@ services:
dockerfile: ./Integration/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Integration/.env
environment: *common-variables
depends_on:
@@ -136,6 +150,7 @@ services:
dockerfile: ./Accounts/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonUI/.env
- ./Accounts/.env
environment: *common-variables
@@ -150,6 +165,7 @@ services:
dockerfile: ./Dashboard/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonUI/.env
- ./Dashboard/.env
environment: *common-variables
@@ -165,6 +181,7 @@ services:
dockerfile: ./StatusPage/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonUI/.env
- ./Dashboard/.env
environment: *common-variables
@@ -177,6 +194,7 @@ services:
- '1444:1444'
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonUI/.env
- ./Home/.env
environment: *common-variables
@@ -192,6 +210,7 @@ services:
dockerfile: ./AdminDashboard/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonUI/.env
- ./AdminDashboard/.env
environment: *common-variables
@@ -204,6 +223,7 @@ services:
- '3010:3010'
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonUI/.env
- ./HttpTestServer/.env
environment: *common-variables
@@ -216,7 +236,9 @@ services:
- '3004:3004'
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Licensing/.env
environment: *common-variables
build:
@@ -231,7 +253,9 @@ services:
dockerfile: ./Realtime/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Realtime/.env
environment: *common-variables
@@ -243,7 +267,9 @@ services:
dockerfile: ./HelmChart/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./HelmChart/.env
environment: *common-variables
@@ -255,7 +281,9 @@ services:
dockerfile: ./ProbeAPI/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./ProbeAPI/.env
environment: *common-variables
@@ -266,7 +294,9 @@ services:
dockerfile: ./Probe/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Probe/.env
environment:
<<: *common-variables
@@ -281,7 +311,9 @@ services:
dockerfile: ./Probe/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Probe/.env
environment:
<<: *common-variables
@@ -298,6 +330,7 @@ services:
dockerfile: ./ApiDocs/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonUI/.env
- ./ApiDocs/.env
environment: *common-variables
@@ -321,7 +354,9 @@ services:
dockerfile: ./Mail/Dockerfile
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Mail/.env
environment: *common-variables
depends_on:

View File

@@ -41,7 +41,9 @@ services:
dockerfile: ./Mail/Dockerfile.dev
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Mail/.env
environment: *common-variables
depends_on:
@@ -68,7 +70,9 @@ services:
- 8443:8443
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./SAML/.env
volumes:
- ./SAML/users.php:/var/www/simplesamlphp/config/authsources.php
@@ -92,6 +96,7 @@ services:
dockerfile: ./Accounts/Dockerfile.dev
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonUI/.env
- ./Accounts/.env
environment: *common-variables
@@ -120,6 +125,7 @@ services:
dockerfile: ./Dashboard/Dockerfile.dev
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonUI/.env
- ./Accounts/.env
environment: *common-variables
@@ -148,6 +154,7 @@ services:
dockerfile: ./StatusPage/Dockerfile.dev
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonUI/.env
- ./StatusPage/.env
environment: *common-variables
@@ -176,7 +183,9 @@ services:
dockerfile: ./DashboardAPI/Dockerfile.dev
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./DashboardAPI/.env
environment: *common-variables
depends_on:
@@ -213,7 +222,9 @@ services:
dockerfile: ./Workers/Dockerfile.dev
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Workers/.env
environment: *common-variables
depends_on:
@@ -250,7 +261,9 @@ services:
dockerfile: ./Identity/Dockerfile.dev
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Identity/.env
environment: *common-variables
depends_on:
@@ -286,7 +299,9 @@ services:
dockerfile: ./File/Dockerfile.dev
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./File/.env
environment: *common-variables
depends_on:
@@ -314,7 +329,9 @@ services:
- '9235:9229' # Debugging port.
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Home/.env
environment: *common-variables
build:

View File

@@ -41,7 +41,9 @@ services:
image: oneuptime/dashboard-api:latest
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./DashboardAPI/.env
environment: *common-variables
depends_on:
@@ -54,7 +56,9 @@ services:
image: oneuptime/identity:latest
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Identity/.env
environment: *common-variables
depends_on:
@@ -68,7 +72,9 @@ services:
image: oneuptime/alert:latest
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Alert/.env
environment: *common-variables
depends_on:
@@ -81,7 +87,9 @@ services:
image: oneuptime/integration:latest
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Integration/.env
environment: *common-variables
depends_on:
@@ -94,6 +102,7 @@ services:
image: oneuptime/accounts:latest
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonUI/.env
- ./Accounts/.env
environment: *common-variables
@@ -106,6 +115,7 @@ services:
image: oneuptime/dashboard:latest
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonUI/.env
- ./Dashboard/.env
environment: *common-variables
@@ -117,6 +127,7 @@ services:
- '1444:1444'
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonUI/.env
- ./Home/.env
environment: *common-variables
@@ -128,6 +139,7 @@ services:
image: oneuptime/status-page:latest
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonUI/.env
- ./StatusPage/.env
environment: *common-variables
@@ -142,6 +154,7 @@ services:
image: oneuptime/admin-dashboard:latest
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonUI/.env
- ./AdminDashboard/.env
environment: *common-variables
@@ -154,7 +167,9 @@ services:
- '3010:3010'
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./HttpTestServer/.env
environment: *common-variables
image: oneuptime/http-test-server:latest
@@ -164,7 +179,9 @@ services:
- '3004:3004'
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Licensing/.env
environment: *common-variables
image: oneuptime/licensing:latest
@@ -176,7 +193,9 @@ services:
image: oneuptime/realtime:latest
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Realtime/.env
environment: *common-variables
@@ -187,7 +206,9 @@ services:
image: oneuptime/helmchart:latest
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./HelmChart/.env
environment: *common-variables
@@ -198,7 +219,9 @@ services:
image: oneuptime/probe-api:latest
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./ProbeAPI/.env
environment: *common-variables
@@ -206,7 +229,9 @@ services:
image: oneuptime/probe:latest
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Probe/.env
environment:
<<: *common-variables
@@ -219,7 +244,9 @@ services:
image: oneuptime/probe:latest
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Probe/.env
environment:
<<: *common-variables
@@ -234,6 +261,7 @@ services:
image: oneuptime/api-docs:latest
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonUI/.env
- ./ApiDocs/.env
environment: *common-variables
@@ -253,7 +281,9 @@ services:
image: oneuptime/mail:latest
env_file:
- ./Common/.env
- ./Common/secret.env
- ./CommonServer/.env
- ./CommonServer/secret.env
- ./Mail/.env
environment: *common-variables
depends_on:

View File

@@ -36,7 +36,7 @@
"uninstall": "docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)",
"delete-all-local-branches": "git branch | grep -v 'master' | xargs git branch -D",
"lint": "ejslint home/views/*.ejs && eslint '**/*.ts*' -c .eslintrc.json --ignore-path .eslintignore ",
"fix-lint": " node --max_old_space_size=8192 ./node_modules/.bin/eslint '**/*.ts*' -c .eslintrc.json --ignore-path .eslintignore --fix ",
"fix-lint": " node --max_old_space_size=18192 ./node_modules/.bin/eslint '**/*.ts*' -c .eslintrc.json --ignore-path .eslintignore --fix ",
"fix": "npm run fix-lint",
"build": "docker-compose --env-file ./docker-enterprise.env build",
"build-ci": "docker-compose --env-file ./docker-enterprise.env -f docker-compose.ci.yml build $npm_config_services",