@uptime.link/statuspage 1.0.74 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_bundle/bundle.js +5019 -519
- package/dist_bundle/bundle.js.map +4 -4
- package/dist_ts_web/00_commitinfo_data.js +2 -2
- package/dist_ts_web/elements/index.d.ts +3 -0
- package/dist_ts_web/elements/index.js +6 -1
- package/dist_ts_web/elements/internal/uplinternal-miniheading.d.ts +1 -0
- package/dist_ts_web/elements/internal/uplinternal-miniheading.js +78 -28
- package/dist_ts_web/elements/upl-statuspage-assetsselector.d.ts +14 -0
- package/dist_ts_web/elements/upl-statuspage-assetsselector.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-assetsselector.demo.js +575 -0
- package/dist_ts_web/elements/upl-statuspage-assetsselector.js +679 -43
- package/dist_ts_web/elements/upl-statuspage-footer.d.ts +46 -2
- package/dist_ts_web/elements/upl-statuspage-footer.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-footer.demo.js +679 -0
- package/dist_ts_web/elements/upl-statuspage-footer.js +846 -61
- package/dist_ts_web/elements/upl-statuspage-header.d.ts +5 -1
- package/dist_ts_web/elements/upl-statuspage-header.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-header.demo.js +220 -0
- package/dist_ts_web/elements/upl-statuspage-header.js +373 -86
- package/dist_ts_web/elements/upl-statuspage-incidents.d.ts +22 -4
- package/dist_ts_web/elements/upl-statuspage-incidents.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-incidents.demo.js +1147 -0
- package/dist_ts_web/elements/upl-statuspage-incidents.js +937 -74
- package/dist_ts_web/elements/upl-statuspage-pagetitle.d.ts +15 -0
- package/dist_ts_web/elements/upl-statuspage-pagetitle.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-pagetitle.demo.js +25 -0
- package/dist_ts_web/elements/upl-statuspage-pagetitle.js +148 -0
- package/dist_ts_web/elements/upl-statuspage-statsgrid.d.ts +23 -0
- package/dist_ts_web/elements/upl-statuspage-statsgrid.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-statsgrid.demo.js +295 -0
- package/dist_ts_web/elements/upl-statuspage-statsgrid.js +549 -0
- package/dist_ts_web/elements/upl-statuspage-statusbar.d.ts +4 -0
- package/dist_ts_web/elements/upl-statuspage-statusbar.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-statusbar.demo.js +365 -0
- package/dist_ts_web/elements/upl-statuspage-statusbar.js +408 -44
- package/dist_ts_web/elements/upl-statuspage-statusdetails.d.ts +14 -0
- package/dist_ts_web/elements/upl-statuspage-statusdetails.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-statusdetails.demo.js +706 -0
- package/dist_ts_web/elements/upl-statuspage-statusdetails.js +397 -62
- package/dist_ts_web/elements/upl-statuspage-statusmonth.d.ts +17 -0
- package/dist_ts_web/elements/upl-statuspage-statusmonth.demo.d.ts +1 -0
- package/dist_ts_web/elements/upl-statuspage-statusmonth.demo.js +798 -0
- package/dist_ts_web/elements/upl-statuspage-statusmonth.js +662 -103
- package/dist_ts_web/interfaces/index.d.ts +84 -0
- package/dist_ts_web/interfaces/index.js +4 -0
- package/dist_ts_web/pages/index.d.ts +4 -1
- package/dist_ts_web/pages/index.js +5 -2
- package/dist_ts_web/pages/statuspage-allgreen.d.ts +1 -0
- package/dist_ts_web/pages/statuspage-allgreen.js +386 -0
- package/dist_ts_web/pages/statuspage-demo.d.ts +1 -0
- package/dist_ts_web/pages/statuspage-demo.js +616 -0
- package/dist_ts_web/pages/statuspage-maintenance.d.ts +1 -0
- package/dist_ts_web/pages/statuspage-maintenance.js +544 -0
- package/dist_ts_web/pages/statuspage-outage.d.ts +1 -0
- package/dist_ts_web/pages/statuspage-outage.js +543 -0
- package/dist_ts_web/styles/shared.styles.d.ts +102 -0
- package/dist_ts_web/styles/shared.styles.js +494 -0
- package/dist_watch/bundle.js +52265 -32033
- package/dist_watch/bundle.js.map +4 -4
- package/dist_watch/index.html +1 -0
- package/npmextra.json +9 -3
- package/package.json +19 -19
- package/readme.hints.md +292 -0
- package/readme.md +326 -149
- package/readme.plan.md +261 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements/index.ts +6 -0
- package/ts_web/elements/internal/uplinternal-miniheading.ts +24 -17
- package/ts_web/elements/upl-statuspage-assetsselector.demo.ts +607 -0
- package/ts_web/elements/upl-statuspage-assetsselector.ts +600 -18
- package/ts_web/elements/upl-statuspage-footer.demo.ts +744 -0
- package/ts_web/elements/upl-statuspage-footer.ts +662 -30
- package/ts_web/elements/upl-statuspage-header.demo.ts +241 -0
- package/ts_web/elements/upl-statuspage-header.ts +289 -52
- package/ts_web/elements/upl-statuspage-incidents.demo.ts +1216 -0
- package/ts_web/elements/upl-statuspage-incidents.ts +840 -26
- package/ts_web/elements/upl-statuspage-pagetitle.demo.ts +25 -0
- package/ts_web/elements/upl-statuspage-pagetitle.ts +89 -0
- package/ts_web/elements/upl-statuspage-statsgrid.demo.ts +315 -0
- package/ts_web/elements/upl-statuspage-statsgrid.ts +478 -0
- package/ts_web/elements/upl-statuspage-statusbar.demo.ts +393 -0
- package/ts_web/elements/upl-statuspage-statusbar.ts +332 -20
- package/ts_web/elements/upl-statuspage-statusdetails.demo.ts +754 -0
- package/ts_web/elements/upl-statuspage-statusdetails.ts +321 -37
- package/ts_web/elements/upl-statuspage-statusmonth.demo.ts +876 -0
- package/ts_web/elements/upl-statuspage-statusmonth.ts +584 -79
- package/ts_web/interfaces/index.ts +95 -0
- package/ts_web/pages/index.ts +4 -1
- package/ts_web/pages/statuspage-allgreen.ts +412 -0
- package/ts_web/pages/statuspage-demo.ts +653 -0
- package/ts_web/pages/statuspage-maintenance.ts +570 -0
- package/ts_web/pages/statuspage-outage.ts +568 -0
- package/ts_web/styles/shared.styles.ts +531 -0
- package/dist_ts_web/pages/page1.d.ts +0 -1
- package/dist_ts_web/pages/page1.js +0 -11
- package/ts_web/pages/page1.ts +0 -11
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
export interface IServiceStatus {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
displayName: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
currentStatus: 'operational' | 'degraded' | 'partial_outage' | 'major_outage' | 'maintenance';
|
|
7
|
+
lastChecked: number; // timestamp
|
|
8
|
+
uptime30d: number; // percentage
|
|
9
|
+
uptime90d: number; // percentage
|
|
10
|
+
responseTime: number; // milliseconds
|
|
11
|
+
category?: string;
|
|
12
|
+
dependencies?: string[];
|
|
13
|
+
selected?: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface IStatusHistoryPoint {
|
|
17
|
+
timestamp: number;
|
|
18
|
+
status: 'operational' | 'degraded' | 'partial_outage' | 'major_outage' | 'maintenance';
|
|
19
|
+
responseTime?: number;
|
|
20
|
+
errorRate?: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface IIncidentUpdate {
|
|
24
|
+
id: string;
|
|
25
|
+
timestamp: number;
|
|
26
|
+
status: 'investigating' | 'identified' | 'monitoring' | 'resolved' | 'postmortem';
|
|
27
|
+
message: string;
|
|
28
|
+
author?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface IIncidentDetails {
|
|
32
|
+
id: string;
|
|
33
|
+
title: string;
|
|
34
|
+
status: 'investigating' | 'identified' | 'monitoring' | 'resolved' | 'postmortem';
|
|
35
|
+
severity: 'critical' | 'major' | 'minor' | 'maintenance';
|
|
36
|
+
affectedServices: string[];
|
|
37
|
+
startTime: number;
|
|
38
|
+
endTime?: number;
|
|
39
|
+
updates: IIncidentUpdate[];
|
|
40
|
+
impact: string;
|
|
41
|
+
rootCause?: string;
|
|
42
|
+
resolution?: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface IUptimeDay {
|
|
46
|
+
date: string; // YYYY-MM-DD
|
|
47
|
+
uptime: number; // percentage
|
|
48
|
+
incidents: number;
|
|
49
|
+
totalDowntime: number; // minutes
|
|
50
|
+
status: 'operational' | 'degraded' | 'partial_outage' | 'major_outage';
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface IMonthlyUptime {
|
|
54
|
+
month: string; // YYYY-MM
|
|
55
|
+
days: IUptimeDay[];
|
|
56
|
+
overallUptime: number; // percentage
|
|
57
|
+
totalIncidents: number;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface IOverallStatus {
|
|
61
|
+
status: 'operational' | 'degraded' | 'partial_outage' | 'major_outage' | 'maintenance';
|
|
62
|
+
message: string;
|
|
63
|
+
lastUpdated: number;
|
|
64
|
+
affectedServices: number;
|
|
65
|
+
totalServices: number;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface IStatusPageConfig {
|
|
69
|
+
apiEndpoint?: string;
|
|
70
|
+
refreshInterval?: number; // milliseconds
|
|
71
|
+
timeZone?: string;
|
|
72
|
+
dateFormat?: string;
|
|
73
|
+
enableWebSocket?: boolean;
|
|
74
|
+
enableNotifications?: boolean;
|
|
75
|
+
theme?: 'light' | 'dark' | 'auto';
|
|
76
|
+
language?: string;
|
|
77
|
+
showHistoricalDays?: number;
|
|
78
|
+
whitelabel?: boolean;
|
|
79
|
+
companyName?: string;
|
|
80
|
+
companyLogo?: string;
|
|
81
|
+
supportEmail?: string;
|
|
82
|
+
statusPageUrl?: string;
|
|
83
|
+
legalUrl?: string;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export interface ISubscription {
|
|
87
|
+
email?: string;
|
|
88
|
+
phone?: string;
|
|
89
|
+
webhook?: string;
|
|
90
|
+
services: string[];
|
|
91
|
+
severityFilter: ('critical' | 'major' | 'minor' | 'maintenance')[];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Re-export the incident interface from @uptime.link/interfaces if needed
|
|
95
|
+
// Note: The IIncident interface is imported in the incidents component directly from plugins
|
package/ts_web/pages/index.ts
CHANGED
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
import { html, cssManager } from "@design.estate/dees-element";
|
|
2
|
+
import type { IServiceStatus, IOverallStatus, IIncidentDetails, IStatusHistoryPoint, IMonthlyUptime } from '../interfaces/index.js';
|
|
3
|
+
|
|
4
|
+
export const statuspageAllgreen = () => html`
|
|
5
|
+
<style>
|
|
6
|
+
.demo-page-wrapper {
|
|
7
|
+
min-height: 100vh;
|
|
8
|
+
background: ${cssManager.bdTheme('#fafafa', '#0a0a0a')};
|
|
9
|
+
}
|
|
10
|
+
.demo-page-wrapper > dees-demowrapper {
|
|
11
|
+
display: flex;
|
|
12
|
+
flex-direction: column;
|
|
13
|
+
gap: 24px;
|
|
14
|
+
}
|
|
15
|
+
</style>
|
|
16
|
+
|
|
17
|
+
<div class="demo-page-wrapper">
|
|
18
|
+
|
|
19
|
+
<dees-demowrapper
|
|
20
|
+
.runAfterRender=${async (wrapperElement: any) => {
|
|
21
|
+
const header = wrapperElement.querySelector('upl-statuspage-header') as any;
|
|
22
|
+
const statusBar = wrapperElement.querySelector('upl-statuspage-statusbar') as any;
|
|
23
|
+
const statsGrid = wrapperElement.querySelector('upl-statuspage-statsgrid') as any;
|
|
24
|
+
const assetsSelector = wrapperElement.querySelector('upl-statuspage-assetsselector') as any;
|
|
25
|
+
const statusDetails = wrapperElement.querySelector('upl-statuspage-statusdetails') as any;
|
|
26
|
+
const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth') as any;
|
|
27
|
+
const incidents = wrapperElement.querySelector('upl-statuspage-incidents') as any;
|
|
28
|
+
const footer = wrapperElement.querySelector('upl-statuspage-footer') as any;
|
|
29
|
+
|
|
30
|
+
// Configure Header
|
|
31
|
+
header.pageTitle = 'TechVault';
|
|
32
|
+
header.showReportButton = true;
|
|
33
|
+
header.showSubscribeButton = true;
|
|
34
|
+
header.logoUrl = 'https://via.placeholder.com/150x50/4CAF50/ffffff?text=TV';
|
|
35
|
+
|
|
36
|
+
// Configure Overall Status - All Green
|
|
37
|
+
statusBar.overallStatus = {
|
|
38
|
+
status: 'operational',
|
|
39
|
+
message: 'All Systems Operational',
|
|
40
|
+
lastUpdated: Date.now(),
|
|
41
|
+
affectedServices: 0,
|
|
42
|
+
totalServices: 12
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// Configure Services - All Operational
|
|
46
|
+
const services: IServiceStatus[] = [
|
|
47
|
+
{
|
|
48
|
+
id: 'web-app',
|
|
49
|
+
name: 'web-app',
|
|
50
|
+
displayName: 'Web Application',
|
|
51
|
+
description: 'Main customer-facing application',
|
|
52
|
+
currentStatus: 'operational',
|
|
53
|
+
lastChecked: Date.now(),
|
|
54
|
+
uptime30d: 99.99,
|
|
55
|
+
uptime90d: 99.98,
|
|
56
|
+
responseTime: 32,
|
|
57
|
+
category: 'Frontend',
|
|
58
|
+
selected: true
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: 'mobile-app',
|
|
62
|
+
name: 'mobile-app',
|
|
63
|
+
displayName: 'Mobile Applications',
|
|
64
|
+
description: 'iOS and Android apps',
|
|
65
|
+
currentStatus: 'operational',
|
|
66
|
+
lastChecked: Date.now(),
|
|
67
|
+
uptime30d: 100,
|
|
68
|
+
uptime90d: 99.99,
|
|
69
|
+
responseTime: 45,
|
|
70
|
+
category: 'Frontend',
|
|
71
|
+
selected: true
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: 'api',
|
|
75
|
+
name: 'api',
|
|
76
|
+
displayName: 'API Services',
|
|
77
|
+
description: 'RESTful and GraphQL APIs',
|
|
78
|
+
currentStatus: 'operational',
|
|
79
|
+
lastChecked: Date.now(),
|
|
80
|
+
uptime30d: 99.97,
|
|
81
|
+
uptime90d: 99.96,
|
|
82
|
+
responseTime: 28,
|
|
83
|
+
category: 'Backend',
|
|
84
|
+
selected: true
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
id: 'auth',
|
|
88
|
+
name: 'auth',
|
|
89
|
+
displayName: 'Authentication',
|
|
90
|
+
description: 'OAuth and SSO services',
|
|
91
|
+
currentStatus: 'operational',
|
|
92
|
+
lastChecked: Date.now(),
|
|
93
|
+
uptime30d: 100,
|
|
94
|
+
uptime90d: 99.99,
|
|
95
|
+
responseTime: 22,
|
|
96
|
+
category: 'Backend',
|
|
97
|
+
selected: true
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
id: 'database',
|
|
101
|
+
name: 'database',
|
|
102
|
+
displayName: 'Database Cluster',
|
|
103
|
+
description: 'Primary data storage',
|
|
104
|
+
currentStatus: 'operational',
|
|
105
|
+
lastChecked: Date.now(),
|
|
106
|
+
uptime30d: 100,
|
|
107
|
+
uptime90d: 99.99,
|
|
108
|
+
responseTime: 15,
|
|
109
|
+
category: 'Infrastructure',
|
|
110
|
+
selected: true
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
id: 'cache',
|
|
114
|
+
name: 'cache',
|
|
115
|
+
displayName: 'Cache Layer',
|
|
116
|
+
description: 'Redis cache clusters',
|
|
117
|
+
currentStatus: 'operational',
|
|
118
|
+
lastChecked: Date.now(),
|
|
119
|
+
uptime30d: 100,
|
|
120
|
+
uptime90d: 100,
|
|
121
|
+
responseTime: 3,
|
|
122
|
+
category: 'Infrastructure',
|
|
123
|
+
selected: false
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
id: 'search',
|
|
127
|
+
name: 'search',
|
|
128
|
+
displayName: 'Search Service',
|
|
129
|
+
description: 'Elasticsearch clusters',
|
|
130
|
+
currentStatus: 'operational',
|
|
131
|
+
lastChecked: Date.now(),
|
|
132
|
+
uptime30d: 99.98,
|
|
133
|
+
uptime90d: 99.97,
|
|
134
|
+
responseTime: 42,
|
|
135
|
+
category: 'Infrastructure',
|
|
136
|
+
selected: true
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
id: 'cdn',
|
|
140
|
+
name: 'cdn',
|
|
141
|
+
displayName: 'CDN',
|
|
142
|
+
description: 'Global content delivery',
|
|
143
|
+
currentStatus: 'operational',
|
|
144
|
+
lastChecked: Date.now(),
|
|
145
|
+
uptime30d: 100,
|
|
146
|
+
uptime90d: 100,
|
|
147
|
+
responseTime: 8,
|
|
148
|
+
category: 'Network',
|
|
149
|
+
selected: true
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
id: 'email',
|
|
153
|
+
name: 'email',
|
|
154
|
+
displayName: 'Email Service',
|
|
155
|
+
description: 'Transactional emails',
|
|
156
|
+
currentStatus: 'operational',
|
|
157
|
+
lastChecked: Date.now(),
|
|
158
|
+
uptime30d: 99.95,
|
|
159
|
+
uptime90d: 99.94,
|
|
160
|
+
responseTime: 125,
|
|
161
|
+
category: 'Communication',
|
|
162
|
+
selected: false
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
id: 'sms',
|
|
166
|
+
name: 'sms',
|
|
167
|
+
displayName: 'SMS Service',
|
|
168
|
+
description: 'SMS notifications',
|
|
169
|
+
currentStatus: 'operational',
|
|
170
|
+
lastChecked: Date.now(),
|
|
171
|
+
uptime30d: 99.92,
|
|
172
|
+
uptime90d: 99.90,
|
|
173
|
+
responseTime: 180,
|
|
174
|
+
category: 'Communication',
|
|
175
|
+
selected: false
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
id: 'payments',
|
|
179
|
+
name: 'payments',
|
|
180
|
+
displayName: 'Payment Processing',
|
|
181
|
+
description: 'Payment gateway integration',
|
|
182
|
+
currentStatus: 'operational',
|
|
183
|
+
lastChecked: Date.now(),
|
|
184
|
+
uptime30d: 100,
|
|
185
|
+
uptime90d: 99.99,
|
|
186
|
+
responseTime: 95,
|
|
187
|
+
category: 'Services',
|
|
188
|
+
selected: true
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
id: 'analytics',
|
|
192
|
+
name: 'analytics',
|
|
193
|
+
displayName: 'Analytics Engine',
|
|
194
|
+
description: 'Real-time analytics',
|
|
195
|
+
currentStatus: 'operational',
|
|
196
|
+
lastChecked: Date.now(),
|
|
197
|
+
uptime30d: 99.96,
|
|
198
|
+
uptime90d: 99.95,
|
|
199
|
+
responseTime: 55,
|
|
200
|
+
category: 'Services',
|
|
201
|
+
selected: true
|
|
202
|
+
}
|
|
203
|
+
];
|
|
204
|
+
|
|
205
|
+
assetsSelector.services = services;
|
|
206
|
+
|
|
207
|
+
// Configure Stats Grid - All green metrics
|
|
208
|
+
statsGrid.currentStatus = 'operational';
|
|
209
|
+
statsGrid.uptime = 99.98;
|
|
210
|
+
statsGrid.avgResponseTime = Math.round(services.reduce((sum, s) => sum + (s.responseTime || 0), 0) / services.length);
|
|
211
|
+
statsGrid.totalIncidents = 0;
|
|
212
|
+
statsGrid.affectedServices = 0;
|
|
213
|
+
statsGrid.totalServices = services.length;
|
|
214
|
+
statsGrid.timePeriod = '30 days';
|
|
215
|
+
|
|
216
|
+
// Configure Status Details - All operational for 48 hours
|
|
217
|
+
const generateStatusDetails = (): IStatusHistoryPoint[] => {
|
|
218
|
+
const details: IStatusHistoryPoint[] = [];
|
|
219
|
+
const now = new Date();
|
|
220
|
+
|
|
221
|
+
for (let i = 47; i >= 0; i--) {
|
|
222
|
+
const date = new Date(now);
|
|
223
|
+
date.setMinutes(0, 0, 0);
|
|
224
|
+
date.setHours(date.getHours() - i);
|
|
225
|
+
|
|
226
|
+
details.push({
|
|
227
|
+
timestamp: date.getTime(),
|
|
228
|
+
status: 'operational',
|
|
229
|
+
responseTime: 20 + Math.random() * 10 // Very consistent response times
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return details;
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
statusDetails.dataPoints = generateStatusDetails();
|
|
237
|
+
statusDetails.serviceId = 'api';
|
|
238
|
+
statusDetails.serviceName = 'API Services';
|
|
239
|
+
|
|
240
|
+
// Configure Monthly Status - Near perfect uptime
|
|
241
|
+
const generateMonthlyData = (): IMonthlyUptime[] => {
|
|
242
|
+
const months: IMonthlyUptime[] = [];
|
|
243
|
+
const now = new Date();
|
|
244
|
+
|
|
245
|
+
for (let m = 4; m >= 0; m--) {
|
|
246
|
+
const monthDate = new Date(now.getFullYear(), now.getMonth() - m, 1);
|
|
247
|
+
const daysInMonth = new Date(monthDate.getFullYear(), monthDate.getMonth() + 1, 0).getDate();
|
|
248
|
+
const monthKey = monthDate.toISOString().slice(0, 7);
|
|
249
|
+
|
|
250
|
+
const days = [];
|
|
251
|
+
let totalUptime = 0;
|
|
252
|
+
let incidents = 0;
|
|
253
|
+
|
|
254
|
+
for (let d = 1; d <= daysInMonth; d++) {
|
|
255
|
+
const dayDate = new Date(monthDate.getFullYear(), monthDate.getMonth(), d);
|
|
256
|
+
const isFuture = dayDate > now;
|
|
257
|
+
|
|
258
|
+
if (isFuture) continue;
|
|
259
|
+
|
|
260
|
+
// Almost all days are perfect
|
|
261
|
+
let status: 'operational' | 'degraded' | 'partial_outage' | 'major_outage' = 'operational';
|
|
262
|
+
let uptime = 100;
|
|
263
|
+
let dayIncidents = 0;
|
|
264
|
+
|
|
265
|
+
// Very rare minor issues
|
|
266
|
+
if (Math.random() > 0.98) {
|
|
267
|
+
status = 'degraded';
|
|
268
|
+
uptime = 99.5 + Math.random() * 0.5;
|
|
269
|
+
dayIncidents = 1;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
days.push({
|
|
273
|
+
date: dayDate.toISOString().slice(0, 10),
|
|
274
|
+
status,
|
|
275
|
+
uptime,
|
|
276
|
+
incidents: dayIncidents,
|
|
277
|
+
totalDowntime: Math.round((100 - uptime) * 14.4)
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
totalUptime += uptime;
|
|
281
|
+
incidents += dayIncidents;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
months.push({
|
|
285
|
+
month: monthKey,
|
|
286
|
+
days,
|
|
287
|
+
overallUptime: totalUptime / days.length,
|
|
288
|
+
totalIncidents: incidents
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
return months;
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
statusMonth.monthlyData = generateMonthlyData();
|
|
296
|
+
statusMonth.serviceId = 'all-services';
|
|
297
|
+
statusMonth.serviceName = 'All Services';
|
|
298
|
+
|
|
299
|
+
// Configure Incidents - None current, few past
|
|
300
|
+
const currentIncidents: IIncidentDetails[] = [];
|
|
301
|
+
|
|
302
|
+
const pastIncidents: IIncidentDetails[] = [
|
|
303
|
+
{
|
|
304
|
+
id: 'inc-2024-001',
|
|
305
|
+
title: 'Brief API Response Time Increase',
|
|
306
|
+
impact: 'API responses were slightly slower than usual',
|
|
307
|
+
severity: 'minor',
|
|
308
|
+
status: 'resolved',
|
|
309
|
+
startTime: Date.now() - 45 * 24 * 60 * 60 * 1000,
|
|
310
|
+
endTime: Date.now() - 45 * 24 * 60 * 60 * 1000 + 15 * 60 * 1000,
|
|
311
|
+
affectedServices: ['API Services'],
|
|
312
|
+
rootCause: 'Temporary increase in traffic due to a viral marketing campaign.',
|
|
313
|
+
resolution: 'Auto-scaling handled the load increase. No manual intervention required.',
|
|
314
|
+
updates: [
|
|
315
|
+
{
|
|
316
|
+
id: 'update-1',
|
|
317
|
+
timestamp: Date.now() - 45 * 24 * 60 * 60 * 1000,
|
|
318
|
+
status: 'investigating',
|
|
319
|
+
message: 'Monitoring increased API response times.',
|
|
320
|
+
author: 'Automated Monitoring'
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
id: 'update-2',
|
|
324
|
+
timestamp: Date.now() - 45 * 24 * 60 * 60 * 1000 + 5 * 60 * 1000,
|
|
325
|
+
status: 'identified',
|
|
326
|
+
message: 'Traffic spike identified. Auto-scaling in progress.',
|
|
327
|
+
author: 'DevOps Team'
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
id: 'update-3',
|
|
331
|
+
timestamp: Date.now() - 45 * 24 * 60 * 60 * 1000 + 15 * 60 * 1000,
|
|
332
|
+
status: 'resolved',
|
|
333
|
+
message: 'Response times back to normal. Incident resolved.',
|
|
334
|
+
author: 'Automated Monitoring'
|
|
335
|
+
}
|
|
336
|
+
]
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
id: 'inc-2023-089',
|
|
340
|
+
title: 'Scheduled Database Maintenance',
|
|
341
|
+
impact: 'Database was in read-only mode for 30 minutes',
|
|
342
|
+
severity: 'minor',
|
|
343
|
+
status: 'resolved',
|
|
344
|
+
startTime: Date.now() - 90 * 24 * 60 * 60 * 1000,
|
|
345
|
+
endTime: Date.now() - 90 * 24 * 60 * 60 * 1000 + 30 * 60 * 1000,
|
|
346
|
+
affectedServices: ['Database Cluster'],
|
|
347
|
+
rootCause: 'Scheduled maintenance for security patches.',
|
|
348
|
+
resolution: 'Maintenance completed successfully as planned.',
|
|
349
|
+
updates: [
|
|
350
|
+
{
|
|
351
|
+
id: 'update-4',
|
|
352
|
+
timestamp: Date.now() - 97 * 24 * 60 * 60 * 1000,
|
|
353
|
+
status: 'investigating',
|
|
354
|
+
message: 'Scheduled maintenance announced.',
|
|
355
|
+
author: 'Database Team'
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
id: 'update-5',
|
|
359
|
+
timestamp: Date.now() - 90 * 24 * 60 * 60 * 1000,
|
|
360
|
+
status: 'monitoring',
|
|
361
|
+
message: 'Maintenance started. Database in read-only mode.',
|
|
362
|
+
author: 'Database Team'
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
id: 'update-6',
|
|
366
|
+
timestamp: Date.now() - 90 * 24 * 60 * 60 * 1000 + 30 * 60 * 1000,
|
|
367
|
+
status: 'resolved',
|
|
368
|
+
message: 'Maintenance completed. All systems operational.',
|
|
369
|
+
author: 'Database Team'
|
|
370
|
+
}
|
|
371
|
+
]
|
|
372
|
+
}
|
|
373
|
+
];
|
|
374
|
+
|
|
375
|
+
incidents.currentIncidents = currentIncidents;
|
|
376
|
+
incidents.pastIncidents = pastIncidents;
|
|
377
|
+
|
|
378
|
+
// Configure Footer
|
|
379
|
+
footer.companyName = 'TechVault Services';
|
|
380
|
+
footer.legalUrl = 'https://techvault.example.com/legal';
|
|
381
|
+
footer.supportEmail = 'support@techvault.example.com';
|
|
382
|
+
footer.statusPageUrl = 'https://status.techvault.example.com';
|
|
383
|
+
footer.lastUpdated = Date.now();
|
|
384
|
+
footer.currentYear = new Date().getFullYear();
|
|
385
|
+
footer.socialLinks = [
|
|
386
|
+
{ platform: 'twitter', url: 'https://twitter.com/techvault' },
|
|
387
|
+
{ platform: 'github', url: 'https://github.com/techvault' },
|
|
388
|
+
{ platform: 'linkedin', url: 'https://linkedin.com/company/techvault' },
|
|
389
|
+
{ platform: 'youtube', url: 'https://youtube.com/techvault' }
|
|
390
|
+
];
|
|
391
|
+
footer.rssFeedUrl = 'https://status.techvault.example.com/rss';
|
|
392
|
+
footer.apiStatusUrl = 'https://api.techvault.example.com/v1/status';
|
|
393
|
+
footer.enableSubscribe = true;
|
|
394
|
+
footer.subscriberCount = 5421;
|
|
395
|
+
footer.additionalLinks = [
|
|
396
|
+
{ label: 'API Documentation', url: 'https://docs.techvault.example.com' },
|
|
397
|
+
{ label: 'System Architecture', url: 'https://techvault.example.com/architecture' },
|
|
398
|
+
{ label: 'Security', url: 'https://techvault.example.com/security' }
|
|
399
|
+
];
|
|
400
|
+
}}
|
|
401
|
+
>
|
|
402
|
+
<upl-statuspage-header></upl-statuspage-header>
|
|
403
|
+
<upl-statuspage-statusbar></upl-statuspage-statusbar>
|
|
404
|
+
<upl-statuspage-statsgrid></upl-statuspage-statsgrid>
|
|
405
|
+
<upl-statuspage-assetsselector></upl-statuspage-assetsselector>
|
|
406
|
+
<upl-statuspage-statusdetails></upl-statuspage-statusdetails>
|
|
407
|
+
<upl-statuspage-statusmonth></upl-statuspage-statusmonth>
|
|
408
|
+
<upl-statuspage-incidents></upl-statuspage-incidents>
|
|
409
|
+
<upl-statuspage-footer></upl-statuspage-footer>
|
|
410
|
+
</dees-demowrapper>
|
|
411
|
+
</div>
|
|
412
|
+
`;
|