@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,798 @@
|
|
|
1
|
+
import { html } from '@design.estate/dees-element';
|
|
2
|
+
export const demoFunc = () => html `
|
|
3
|
+
<style>
|
|
4
|
+
.demo-container {
|
|
5
|
+
display: flex;
|
|
6
|
+
flex-direction: column;
|
|
7
|
+
gap: 20px;
|
|
8
|
+
}
|
|
9
|
+
.demo-section {
|
|
10
|
+
border: 1px solid #ddd;
|
|
11
|
+
border-radius: 8px;
|
|
12
|
+
padding: 20px;
|
|
13
|
+
background: #f5f5f5;
|
|
14
|
+
}
|
|
15
|
+
.demo-title {
|
|
16
|
+
font-size: 14px;
|
|
17
|
+
font-weight: 600;
|
|
18
|
+
margin-bottom: 16px;
|
|
19
|
+
color: #333;
|
|
20
|
+
}
|
|
21
|
+
.demo-controls {
|
|
22
|
+
display: flex;
|
|
23
|
+
gap: 10px;
|
|
24
|
+
margin-top: 16px;
|
|
25
|
+
flex-wrap: wrap;
|
|
26
|
+
}
|
|
27
|
+
.demo-button {
|
|
28
|
+
padding: 6px 12px;
|
|
29
|
+
border: 1px solid #ddd;
|
|
30
|
+
background: white;
|
|
31
|
+
border-radius: 4px;
|
|
32
|
+
cursor: pointer;
|
|
33
|
+
font-size: 13px;
|
|
34
|
+
}
|
|
35
|
+
.demo-button:hover {
|
|
36
|
+
background: #f0f0f0;
|
|
37
|
+
}
|
|
38
|
+
.demo-button.active {
|
|
39
|
+
background: #2196F3;
|
|
40
|
+
color: white;
|
|
41
|
+
border-color: #2196F3;
|
|
42
|
+
}
|
|
43
|
+
.demo-info {
|
|
44
|
+
margin-top: 12px;
|
|
45
|
+
padding: 12px;
|
|
46
|
+
background: white;
|
|
47
|
+
border-radius: 4px;
|
|
48
|
+
font-size: 13px;
|
|
49
|
+
line-height: 1.6;
|
|
50
|
+
}
|
|
51
|
+
.stats-display {
|
|
52
|
+
display: grid;
|
|
53
|
+
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
|
|
54
|
+
gap: 12px;
|
|
55
|
+
margin-top: 12px;
|
|
56
|
+
}
|
|
57
|
+
.stat-card {
|
|
58
|
+
background: white;
|
|
59
|
+
padding: 12px;
|
|
60
|
+
border-radius: 4px;
|
|
61
|
+
text-align: center;
|
|
62
|
+
}
|
|
63
|
+
.stat-value {
|
|
64
|
+
font-size: 18px;
|
|
65
|
+
font-weight: 600;
|
|
66
|
+
color: #2196F3;
|
|
67
|
+
}
|
|
68
|
+
.stat-label {
|
|
69
|
+
font-size: 11px;
|
|
70
|
+
color: #666;
|
|
71
|
+
margin-top: 4px;
|
|
72
|
+
}
|
|
73
|
+
.month-nav {
|
|
74
|
+
display: flex;
|
|
75
|
+
justify-content: space-between;
|
|
76
|
+
align-items: center;
|
|
77
|
+
margin-top: 12px;
|
|
78
|
+
}
|
|
79
|
+
</style>
|
|
80
|
+
|
|
81
|
+
<div class="demo-container">
|
|
82
|
+
<!-- Different Month Patterns -->
|
|
83
|
+
<div class="demo-section">
|
|
84
|
+
<div class="demo-title">Different Month Patterns</div>
|
|
85
|
+
<dees-demowrapper
|
|
86
|
+
.runAfterRender=${async (wrapperElement) => {
|
|
87
|
+
const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth');
|
|
88
|
+
// Pattern generators
|
|
89
|
+
const generateMonthPattern = (monthCount, pattern) => {
|
|
90
|
+
const months = [];
|
|
91
|
+
const now = new Date();
|
|
92
|
+
for (let monthOffset = monthCount - 1; monthOffset >= 0; monthOffset--) {
|
|
93
|
+
const monthDate = new Date(now.getFullYear(), now.getMonth() - monthOffset, 1);
|
|
94
|
+
const year = monthDate.getFullYear();
|
|
95
|
+
const month = monthDate.getMonth();
|
|
96
|
+
const monthKey = `${year}-${String(month + 1).padStart(2, '0')}`;
|
|
97
|
+
const daysInMonth = new Date(year, month + 1, 0).getDate();
|
|
98
|
+
const days = [];
|
|
99
|
+
let totalIncidents = 0;
|
|
100
|
+
let totalUptimeMinutes = 0;
|
|
101
|
+
for (let day = 1; day <= daysInMonth; day++) {
|
|
102
|
+
let uptime = 100;
|
|
103
|
+
let incidents = 0;
|
|
104
|
+
let downtime = 0;
|
|
105
|
+
let status = 'operational';
|
|
106
|
+
switch (pattern) {
|
|
107
|
+
case 'perfect':
|
|
108
|
+
// Near perfect uptime
|
|
109
|
+
if (Math.random() < 0.02) {
|
|
110
|
+
uptime = 99.9 + Math.random() * 0.099;
|
|
111
|
+
status = 'degraded';
|
|
112
|
+
}
|
|
113
|
+
break;
|
|
114
|
+
case 'problematic':
|
|
115
|
+
// Frequent issues
|
|
116
|
+
const problemRand = Math.random();
|
|
117
|
+
if (problemRand < 0.1) {
|
|
118
|
+
uptime = 70 + Math.random() * 20;
|
|
119
|
+
incidents = 2 + Math.floor(Math.random() * 3);
|
|
120
|
+
status = 'major_outage';
|
|
121
|
+
}
|
|
122
|
+
else if (problemRand < 0.25) {
|
|
123
|
+
uptime = 90 + Math.random() * 8;
|
|
124
|
+
incidents = 1 + Math.floor(Math.random() * 2);
|
|
125
|
+
status = 'partial_outage';
|
|
126
|
+
}
|
|
127
|
+
else if (problemRand < 0.4) {
|
|
128
|
+
uptime = 98 + Math.random() * 1.5;
|
|
129
|
+
incidents = 1;
|
|
130
|
+
status = 'degraded';
|
|
131
|
+
}
|
|
132
|
+
break;
|
|
133
|
+
case 'improving':
|
|
134
|
+
// Getting better over time
|
|
135
|
+
const improvementFactor = (monthCount - monthOffset) / monthCount;
|
|
136
|
+
const improveRand = Math.random();
|
|
137
|
+
if (improveRand < 0.3 * (1 - improvementFactor)) {
|
|
138
|
+
uptime = 85 + Math.random() * 10 + (improvementFactor * 10);
|
|
139
|
+
incidents = Math.max(0, 3 - Math.floor(improvementFactor * 3));
|
|
140
|
+
status = improvementFactor > 0.7 ? 'degraded' : 'partial_outage';
|
|
141
|
+
}
|
|
142
|
+
break;
|
|
143
|
+
case 'degrading':
|
|
144
|
+
// Getting worse over time
|
|
145
|
+
const degradationFactor = monthOffset / monthCount;
|
|
146
|
+
const degradeRand = Math.random();
|
|
147
|
+
if (degradeRand < 0.3 * (1 - degradationFactor)) {
|
|
148
|
+
uptime = 85 + Math.random() * 10 + (degradationFactor * 10);
|
|
149
|
+
incidents = Math.max(0, 3 - Math.floor(degradationFactor * 3));
|
|
150
|
+
status = degradationFactor > 0.7 ? 'degraded' : 'major_outage';
|
|
151
|
+
}
|
|
152
|
+
break;
|
|
153
|
+
case 'seasonal':
|
|
154
|
+
// Worse during certain months (simulating high traffic periods)
|
|
155
|
+
const monthNum = month;
|
|
156
|
+
if (monthNum === 11 || monthNum === 0) { // December, January
|
|
157
|
+
if (Math.random() < 0.3) {
|
|
158
|
+
uptime = 92 + Math.random() * 6;
|
|
159
|
+
incidents = 1 + Math.floor(Math.random() * 2);
|
|
160
|
+
status = 'degraded';
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else if (monthNum === 6 || monthNum === 7) { // July, August
|
|
164
|
+
if (Math.random() < 0.2) {
|
|
165
|
+
uptime = 94 + Math.random() * 5;
|
|
166
|
+
incidents = 1;
|
|
167
|
+
status = 'degraded';
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
downtime = Math.floor((100 - uptime) * 14.4);
|
|
173
|
+
totalIncidents += incidents;
|
|
174
|
+
totalUptimeMinutes += uptime * 14.4;
|
|
175
|
+
days.push({
|
|
176
|
+
date: `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`,
|
|
177
|
+
uptime,
|
|
178
|
+
incidents,
|
|
179
|
+
totalDowntime: downtime,
|
|
180
|
+
status
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
const overallUptime = totalUptimeMinutes / (daysInMonth * 1440) * 100;
|
|
184
|
+
months.push({
|
|
185
|
+
month: monthKey,
|
|
186
|
+
days,
|
|
187
|
+
overallUptime,
|
|
188
|
+
totalIncidents
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
return months;
|
|
192
|
+
};
|
|
193
|
+
// Initial setup
|
|
194
|
+
statusMonth.serviceId = 'production-api';
|
|
195
|
+
statusMonth.serviceName = 'Production API';
|
|
196
|
+
statusMonth.monthlyData = generateMonthPattern(6, 'perfect');
|
|
197
|
+
// Create pattern controls
|
|
198
|
+
const controls = document.createElement('div');
|
|
199
|
+
controls.className = 'demo-controls';
|
|
200
|
+
const patterns = [
|
|
201
|
+
{ key: 'perfect', label: 'Perfect Uptime' },
|
|
202
|
+
{ key: 'problematic', label: 'Problematic' },
|
|
203
|
+
{ key: 'improving', label: 'Improving Trend' },
|
|
204
|
+
{ key: 'degrading', label: 'Degrading Trend' },
|
|
205
|
+
{ key: 'seasonal', label: 'Seasonal Pattern' }
|
|
206
|
+
];
|
|
207
|
+
patterns.forEach((pattern, index) => {
|
|
208
|
+
const button = document.createElement('button');
|
|
209
|
+
button.className = 'demo-button' + (index === 0 ? ' active' : '');
|
|
210
|
+
button.textContent = pattern.label;
|
|
211
|
+
button.onclick = () => {
|
|
212
|
+
controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active'));
|
|
213
|
+
button.classList.add('active');
|
|
214
|
+
statusMonth.loading = true;
|
|
215
|
+
setTimeout(() => {
|
|
216
|
+
statusMonth.monthlyData = generateMonthPattern(6, pattern.key);
|
|
217
|
+
statusMonth.loading = false;
|
|
218
|
+
updateStats();
|
|
219
|
+
}, 500);
|
|
220
|
+
};
|
|
221
|
+
controls.appendChild(button);
|
|
222
|
+
});
|
|
223
|
+
wrapperElement.appendChild(controls);
|
|
224
|
+
// Add statistics display
|
|
225
|
+
const statsDiv = document.createElement('div');
|
|
226
|
+
statsDiv.className = 'stats-display';
|
|
227
|
+
wrapperElement.appendChild(statsDiv);
|
|
228
|
+
const updateStats = () => {
|
|
229
|
+
const data = statusMonth.monthlyData || [];
|
|
230
|
+
const avgUptime = data.reduce((sum, month) => sum + month.overallUptime, 0) / data.length;
|
|
231
|
+
const totalIncidents = data.reduce((sum, month) => sum + month.totalIncidents, 0);
|
|
232
|
+
const worstMonth = data.reduce((worst, month) => month.overallUptime < worst.overallUptime ? month : worst, data[0]);
|
|
233
|
+
statsDiv.innerHTML = `
|
|
234
|
+
<div class="stat-card">
|
|
235
|
+
<div class="stat-value">${avgUptime.toFixed(3)}%</div>
|
|
236
|
+
<div class="stat-label">Avg Uptime</div>
|
|
237
|
+
</div>
|
|
238
|
+
<div class="stat-card">
|
|
239
|
+
<div class="stat-value">${totalIncidents}</div>
|
|
240
|
+
<div class="stat-label">Total Incidents</div>
|
|
241
|
+
</div>
|
|
242
|
+
<div class="stat-card">
|
|
243
|
+
<div class="stat-value">${data.length}</div>
|
|
244
|
+
<div class="stat-label">Months</div>
|
|
245
|
+
</div>
|
|
246
|
+
<div class="stat-card">
|
|
247
|
+
<div class="stat-value">${worstMonth ? worstMonth.overallUptime.toFixed(2) : '100'}%</div>
|
|
248
|
+
<div class="stat-label">Worst Month</div>
|
|
249
|
+
</div>
|
|
250
|
+
`;
|
|
251
|
+
};
|
|
252
|
+
updateStats();
|
|
253
|
+
// Handle day clicks
|
|
254
|
+
statusMonth.addEventListener('dayClick', (event) => {
|
|
255
|
+
const { date, uptime, incidents, status, totalDowntime } = event.detail;
|
|
256
|
+
alert(`Day Details for ${date}:\n\nUptime: ${uptime.toFixed(3)}%\nIncidents: ${incidents}\nStatus: ${status}\nDowntime: ${totalDowntime} minutes`);
|
|
257
|
+
});
|
|
258
|
+
}}
|
|
259
|
+
>
|
|
260
|
+
<upl-statuspage-statusmonth></upl-statuspage-statusmonth>
|
|
261
|
+
</dees-demowrapper>
|
|
262
|
+
</div>
|
|
263
|
+
|
|
264
|
+
<!-- Different Time Spans -->
|
|
265
|
+
<div class="demo-section">
|
|
266
|
+
<div class="demo-title">Different Time Spans</div>
|
|
267
|
+
<dees-demowrapper
|
|
268
|
+
.runAfterRender=${async (wrapperElement) => {
|
|
269
|
+
const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth');
|
|
270
|
+
// Generate data for different time spans
|
|
271
|
+
const generateTimeSpanData = (months) => {
|
|
272
|
+
const data = [];
|
|
273
|
+
const now = new Date();
|
|
274
|
+
for (let monthOffset = months - 1; monthOffset >= 0; monthOffset--) {
|
|
275
|
+
const monthDate = new Date(now.getFullYear(), now.getMonth() - monthOffset, 1);
|
|
276
|
+
const year = monthDate.getFullYear();
|
|
277
|
+
const month = monthDate.getMonth();
|
|
278
|
+
const monthKey = `${year}-${String(month + 1).padStart(2, '0')}`;
|
|
279
|
+
const daysInMonth = new Date(year, month + 1, 0).getDate();
|
|
280
|
+
const days = [];
|
|
281
|
+
let totalIncidents = 0;
|
|
282
|
+
let totalUptimeMinutes = 0;
|
|
283
|
+
for (let day = 1; day <= daysInMonth; day++) {
|
|
284
|
+
// Create realistic patterns
|
|
285
|
+
let uptime = 99.9 + Math.random() * 0.099;
|
|
286
|
+
let incidents = 0;
|
|
287
|
+
let status = 'operational';
|
|
288
|
+
if (Math.random() < 0.05) {
|
|
289
|
+
uptime = 95 + Math.random() * 4.9;
|
|
290
|
+
incidents = 1;
|
|
291
|
+
status = 'degraded';
|
|
292
|
+
}
|
|
293
|
+
else if (Math.random() < 0.01) {
|
|
294
|
+
uptime = 85 + Math.random() * 10;
|
|
295
|
+
incidents = 2;
|
|
296
|
+
status = 'partial_outage';
|
|
297
|
+
}
|
|
298
|
+
const downtime = Math.floor((100 - uptime) * 14.4);
|
|
299
|
+
totalIncidents += incidents;
|
|
300
|
+
totalUptimeMinutes += uptime * 14.4;
|
|
301
|
+
days.push({
|
|
302
|
+
date: `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`,
|
|
303
|
+
uptime,
|
|
304
|
+
incidents,
|
|
305
|
+
totalDowntime: downtime,
|
|
306
|
+
status
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
const overallUptime = totalUptimeMinutes / (daysInMonth * 1440) * 100;
|
|
310
|
+
data.push({
|
|
311
|
+
month: monthKey,
|
|
312
|
+
days,
|
|
313
|
+
overallUptime,
|
|
314
|
+
totalIncidents
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
return data;
|
|
318
|
+
};
|
|
319
|
+
// Initial setup
|
|
320
|
+
statusMonth.serviceId = 'multi-region-lb';
|
|
321
|
+
statusMonth.serviceName = 'Multi-Region Load Balancer';
|
|
322
|
+
statusMonth.monthlyData = generateTimeSpanData(3);
|
|
323
|
+
// Create time span controls
|
|
324
|
+
const controls = document.createElement('div');
|
|
325
|
+
controls.className = 'demo-controls';
|
|
326
|
+
const timeSpans = [
|
|
327
|
+
{ months: 3, label: 'Last 3 Months' },
|
|
328
|
+
{ months: 6, label: 'Last 6 Months' },
|
|
329
|
+
{ months: 12, label: 'Last 12 Months' },
|
|
330
|
+
{ months: 24, label: 'Last 24 Months' }
|
|
331
|
+
];
|
|
332
|
+
timeSpans.forEach((span, index) => {
|
|
333
|
+
const button = document.createElement('button');
|
|
334
|
+
button.className = 'demo-button' + (index === 0 ? ' active' : '');
|
|
335
|
+
button.textContent = span.label;
|
|
336
|
+
button.onclick = () => {
|
|
337
|
+
controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active'));
|
|
338
|
+
button.classList.add('active');
|
|
339
|
+
statusMonth.loading = true;
|
|
340
|
+
setTimeout(() => {
|
|
341
|
+
statusMonth.monthlyData = generateTimeSpanData(span.months);
|
|
342
|
+
statusMonth.loading = false;
|
|
343
|
+
}, 500);
|
|
344
|
+
};
|
|
345
|
+
controls.appendChild(button);
|
|
346
|
+
});
|
|
347
|
+
wrapperElement.appendChild(controls);
|
|
348
|
+
// Add info display
|
|
349
|
+
const info = document.createElement('div');
|
|
350
|
+
info.className = 'demo-info';
|
|
351
|
+
info.innerHTML = 'Click on different time spans to see historical uptime data. The component automatically adjusts the display based on the number of months.';
|
|
352
|
+
wrapperElement.appendChild(info);
|
|
353
|
+
}}
|
|
354
|
+
>
|
|
355
|
+
<upl-statuspage-statusmonth></upl-statuspage-statusmonth>
|
|
356
|
+
</dees-demowrapper>
|
|
357
|
+
</div>
|
|
358
|
+
|
|
359
|
+
<!-- Current Month Real-time Updates -->
|
|
360
|
+
<div class="demo-section">
|
|
361
|
+
<div class="demo-title">Current Month with Real-time Updates</div>
|
|
362
|
+
<dees-demowrapper
|
|
363
|
+
.runAfterRender=${async (wrapperElement) => {
|
|
364
|
+
const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth');
|
|
365
|
+
// Generate current month data
|
|
366
|
+
const generateCurrentMonthData = () => {
|
|
367
|
+
const now = new Date();
|
|
368
|
+
const year = now.getFullYear();
|
|
369
|
+
const month = now.getMonth();
|
|
370
|
+
const today = now.getDate();
|
|
371
|
+
const monthKey = `${year}-${String(month + 1).padStart(2, '0')}`;
|
|
372
|
+
const daysInMonth = new Date(year, month + 1, 0).getDate();
|
|
373
|
+
const days = [];
|
|
374
|
+
let totalIncidents = 0;
|
|
375
|
+
let totalUptimeMinutes = 0;
|
|
376
|
+
// Generate data only up to today
|
|
377
|
+
for (let day = 1; day <= today; day++) {
|
|
378
|
+
let uptime = 99.9 + Math.random() * 0.099;
|
|
379
|
+
let incidents = 0;
|
|
380
|
+
let status = 'operational';
|
|
381
|
+
// Today might have ongoing issues
|
|
382
|
+
if (day === today) {
|
|
383
|
+
if (Math.random() < 0.3) {
|
|
384
|
+
uptime = 95 + Math.random() * 4;
|
|
385
|
+
incidents = 1;
|
|
386
|
+
status = 'degraded';
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
else if (Math.random() < 0.05) {
|
|
390
|
+
uptime = 97 + Math.random() * 2.9;
|
|
391
|
+
incidents = 1;
|
|
392
|
+
status = 'degraded';
|
|
393
|
+
}
|
|
394
|
+
const downtime = Math.floor((100 - uptime) * 14.4);
|
|
395
|
+
totalIncidents += incidents;
|
|
396
|
+
totalUptimeMinutes += uptime * 14.4;
|
|
397
|
+
days.push({
|
|
398
|
+
date: `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`,
|
|
399
|
+
uptime,
|
|
400
|
+
incidents,
|
|
401
|
+
totalDowntime: downtime,
|
|
402
|
+
status
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
// Fill remaining days with placeholder
|
|
406
|
+
for (let day = today + 1; day <= daysInMonth; day++) {
|
|
407
|
+
days.push({
|
|
408
|
+
date: `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`,
|
|
409
|
+
uptime: 0,
|
|
410
|
+
incidents: 0,
|
|
411
|
+
totalDowntime: 0,
|
|
412
|
+
status: 'operational'
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
const overallUptime = today > 0 ? totalUptimeMinutes / (today * 1440) * 100 : 100;
|
|
416
|
+
return [{
|
|
417
|
+
month: monthKey,
|
|
418
|
+
days,
|
|
419
|
+
overallUptime,
|
|
420
|
+
totalIncidents
|
|
421
|
+
}];
|
|
422
|
+
};
|
|
423
|
+
// Initial setup
|
|
424
|
+
statusMonth.serviceId = 'realtime-monitor';
|
|
425
|
+
statusMonth.serviceName = 'Real-time Monitoring Service';
|
|
426
|
+
statusMonth.monthlyData = generateCurrentMonthData();
|
|
427
|
+
statusMonth.showCurrentDay = true;
|
|
428
|
+
// Update today's status periodically
|
|
429
|
+
const updateInterval = setInterval(() => {
|
|
430
|
+
const data = statusMonth.monthlyData;
|
|
431
|
+
if (data && data.length > 0) {
|
|
432
|
+
const currentMonth = data[0];
|
|
433
|
+
const today = new Date().getDate() - 1;
|
|
434
|
+
if (currentMonth.days[today]) {
|
|
435
|
+
// Simulate status changes
|
|
436
|
+
const rand = Math.random();
|
|
437
|
+
if (rand < 0.1) {
|
|
438
|
+
currentMonth.days[today].uptime = 95 + Math.random() * 4.9;
|
|
439
|
+
currentMonth.days[today].incidents = (currentMonth.days[today].incidents || 0) + 1;
|
|
440
|
+
currentMonth.days[today].status = 'degraded';
|
|
441
|
+
currentMonth.days[today].totalDowntime = Math.floor((100 - currentMonth.days[today].uptime) * 14.4);
|
|
442
|
+
// Recalculate overall uptime
|
|
443
|
+
let totalUptime = 0;
|
|
444
|
+
let validDays = 0;
|
|
445
|
+
currentMonth.days.forEach((day, index) => {
|
|
446
|
+
if (index <= today && day.uptime > 0) {
|
|
447
|
+
totalUptime += day.uptime;
|
|
448
|
+
validDays++;
|
|
449
|
+
}
|
|
450
|
+
});
|
|
451
|
+
currentMonth.overallUptime = validDays > 0 ? totalUptime / validDays : 100;
|
|
452
|
+
currentMonth.totalIncidents = currentMonth.days.reduce((sum, day) => sum + (day.incidents || 0), 0);
|
|
453
|
+
statusMonth.requestUpdate();
|
|
454
|
+
logUpdate('Status degraded - Uptime: ' + currentMonth.days[today].uptime.toFixed(2) + '%');
|
|
455
|
+
}
|
|
456
|
+
else if (rand < 0.05 && currentMonth.days[today].status !== 'operational') {
|
|
457
|
+
// Recover from issues
|
|
458
|
+
currentMonth.days[today].uptime = 99.9 + Math.random() * 0.099;
|
|
459
|
+
currentMonth.days[today].status = 'operational';
|
|
460
|
+
currentMonth.days[today].totalDowntime = Math.floor((100 - currentMonth.days[today].uptime) * 14.4);
|
|
461
|
+
statusMonth.requestUpdate();
|
|
462
|
+
logUpdate('Service recovered to operational status');
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}, 3000);
|
|
467
|
+
// Create controls
|
|
468
|
+
const controls = document.createElement('div');
|
|
469
|
+
controls.className = 'demo-controls';
|
|
470
|
+
controls.innerHTML = '<button class="demo-button" id="simulateOutage">Simulate Outage</button>' +
|
|
471
|
+
'<button class="demo-button" id="simulateRecovery">Simulate Recovery</button>' +
|
|
472
|
+
'<button class="demo-button" id="refreshData">Refresh Data</button>';
|
|
473
|
+
wrapperElement.appendChild(controls);
|
|
474
|
+
controls.querySelector('#simulateOutage')?.addEventListener('click', () => {
|
|
475
|
+
const data = statusMonth.monthlyData;
|
|
476
|
+
if (data && data.length > 0) {
|
|
477
|
+
const today = new Date().getDate() - 1;
|
|
478
|
+
data[0].days[today].uptime = 85 + Math.random() * 10;
|
|
479
|
+
data[0].days[today].incidents = (data[0].days[today].incidents || 0) + 1;
|
|
480
|
+
data[0].days[today].status = 'major_outage';
|
|
481
|
+
data[0].days[today].totalDowntime = Math.floor((100 - data[0].days[today].uptime) * 14.4);
|
|
482
|
+
statusMonth.requestUpdate();
|
|
483
|
+
logUpdate('Major outage simulated');
|
|
484
|
+
}
|
|
485
|
+
});
|
|
486
|
+
controls.querySelector('#simulateRecovery')?.addEventListener('click', () => {
|
|
487
|
+
const data = statusMonth.monthlyData;
|
|
488
|
+
if (data && data.length > 0) {
|
|
489
|
+
const today = new Date().getDate() - 1;
|
|
490
|
+
data[0].days[today].uptime = 99.95;
|
|
491
|
+
data[0].days[today].status = 'operational';
|
|
492
|
+
data[0].days[today].totalDowntime = Math.floor((100 - data[0].days[today].uptime) * 14.4);
|
|
493
|
+
statusMonth.requestUpdate();
|
|
494
|
+
logUpdate('Service recovered');
|
|
495
|
+
}
|
|
496
|
+
});
|
|
497
|
+
controls.querySelector('#refreshData')?.addEventListener('click', () => {
|
|
498
|
+
statusMonth.monthlyData = generateCurrentMonthData();
|
|
499
|
+
logUpdate('Data refreshed');
|
|
500
|
+
});
|
|
501
|
+
// Add update log
|
|
502
|
+
const logDiv = document.createElement('div');
|
|
503
|
+
logDiv.className = 'demo-info';
|
|
504
|
+
logDiv.style.maxHeight = '100px';
|
|
505
|
+
logDiv.style.overflowY = 'auto';
|
|
506
|
+
logDiv.innerHTML = '<strong>Update Log:</strong><br>';
|
|
507
|
+
wrapperElement.appendChild(logDiv);
|
|
508
|
+
const logUpdate = (message) => {
|
|
509
|
+
const time = new Date().toLocaleTimeString();
|
|
510
|
+
logDiv.innerHTML += '[' + time + '] ' + message + '<br>';
|
|
511
|
+
logDiv.scrollTop = logDiv.scrollHeight;
|
|
512
|
+
};
|
|
513
|
+
// Cleanup
|
|
514
|
+
wrapperElement.addEventListener('remove', () => {
|
|
515
|
+
clearInterval(updateInterval);
|
|
516
|
+
});
|
|
517
|
+
}}
|
|
518
|
+
>
|
|
519
|
+
<upl-statuspage-statusmonth></upl-statuspage-statusmonth>
|
|
520
|
+
</dees-demowrapper>
|
|
521
|
+
</div>
|
|
522
|
+
|
|
523
|
+
<!-- Edge Cases -->
|
|
524
|
+
<div class="demo-section">
|
|
525
|
+
<div class="demo-title">Edge Cases and Special Scenarios</div>
|
|
526
|
+
<dees-demowrapper
|
|
527
|
+
.runAfterRender=${async (wrapperElement) => {
|
|
528
|
+
const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth');
|
|
529
|
+
const scenarios = {
|
|
530
|
+
noData: {
|
|
531
|
+
name: 'No Data',
|
|
532
|
+
data: []
|
|
533
|
+
},
|
|
534
|
+
singleMonth: {
|
|
535
|
+
name: 'Single Month',
|
|
536
|
+
data: [{
|
|
537
|
+
month: '2024-01',
|
|
538
|
+
days: Array.from({ length: 31 }, (_, i) => ({
|
|
539
|
+
date: `2024-01-${String(i + 1).padStart(2, '0')}`,
|
|
540
|
+
uptime: 99.9 + Math.random() * 0.099,
|
|
541
|
+
incidents: 0,
|
|
542
|
+
totalDowntime: 0,
|
|
543
|
+
status: 'operational'
|
|
544
|
+
})),
|
|
545
|
+
overallUptime: 99.95,
|
|
546
|
+
totalIncidents: 0
|
|
547
|
+
}]
|
|
548
|
+
},
|
|
549
|
+
allDown: {
|
|
550
|
+
name: 'Complete Outage Month',
|
|
551
|
+
data: [{
|
|
552
|
+
month: '2024-01',
|
|
553
|
+
days: Array.from({ length: 31 }, (_, i) => ({
|
|
554
|
+
date: `2024-01-${String(i + 1).padStart(2, '0')}`,
|
|
555
|
+
uptime: 0,
|
|
556
|
+
incidents: 5,
|
|
557
|
+
totalDowntime: 1440,
|
|
558
|
+
status: 'major_outage'
|
|
559
|
+
})),
|
|
560
|
+
overallUptime: 0,
|
|
561
|
+
totalIncidents: 155
|
|
562
|
+
}]
|
|
563
|
+
},
|
|
564
|
+
maintenanceMonth: {
|
|
565
|
+
name: 'Maintenance Heavy Month',
|
|
566
|
+
data: [{
|
|
567
|
+
month: '2024-01',
|
|
568
|
+
days: Array.from({ length: 31 }, (_, i) => {
|
|
569
|
+
// Maintenance every weekend
|
|
570
|
+
const dayOfWeek = new Date(2024, 0, i + 1).getDay();
|
|
571
|
+
if (dayOfWeek === 0 || dayOfWeek === 6) {
|
|
572
|
+
return {
|
|
573
|
+
date: `2024-01-${String(i + 1).padStart(2, '0')}`,
|
|
574
|
+
uptime: 95,
|
|
575
|
+
incidents: 0,
|
|
576
|
+
totalDowntime: 72,
|
|
577
|
+
status: 'maintenance'
|
|
578
|
+
};
|
|
579
|
+
}
|
|
580
|
+
return {
|
|
581
|
+
date: `2024-01-${String(i + 1).padStart(2, '0')}`,
|
|
582
|
+
uptime: 99.95,
|
|
583
|
+
incidents: 0,
|
|
584
|
+
totalDowntime: 0.7,
|
|
585
|
+
status: 'operational'
|
|
586
|
+
};
|
|
587
|
+
}),
|
|
588
|
+
overallUptime: 98.2,
|
|
589
|
+
totalIncidents: 0
|
|
590
|
+
}]
|
|
591
|
+
},
|
|
592
|
+
mixedYear: {
|
|
593
|
+
name: 'Full Year Mixed',
|
|
594
|
+
data: Array.from({ length: 12 }, (_, monthIndex) => {
|
|
595
|
+
const year = 2023;
|
|
596
|
+
const month = monthIndex;
|
|
597
|
+
const daysInMonth = new Date(year, month + 1, 0).getDate();
|
|
598
|
+
// Different pattern each quarter
|
|
599
|
+
let monthPattern = 'operational';
|
|
600
|
+
if (monthIndex < 3)
|
|
601
|
+
monthPattern = 'degraded';
|
|
602
|
+
else if (monthIndex < 6)
|
|
603
|
+
monthPattern = 'improving';
|
|
604
|
+
else if (monthIndex < 9)
|
|
605
|
+
monthPattern = 'stable';
|
|
606
|
+
else
|
|
607
|
+
monthPattern = 'volatile';
|
|
608
|
+
const days = Array.from({ length: daysInMonth }, (_, dayIndex) => {
|
|
609
|
+
let uptime = 99.9;
|
|
610
|
+
let status = 'operational';
|
|
611
|
+
let incidents = 0;
|
|
612
|
+
if (monthPattern === 'degraded' && Math.random() < 0.3) {
|
|
613
|
+
uptime = 85 + Math.random() * 10;
|
|
614
|
+
status = 'degraded';
|
|
615
|
+
incidents = 1;
|
|
616
|
+
}
|
|
617
|
+
else if (monthPattern === 'volatile' && Math.random() < 0.2) {
|
|
618
|
+
uptime = 90 + Math.random() * 9;
|
|
619
|
+
status = Math.random() < 0.5 ? 'partial_outage' : 'degraded';
|
|
620
|
+
incidents = Math.floor(Math.random() * 3) + 1;
|
|
621
|
+
}
|
|
622
|
+
return {
|
|
623
|
+
date: `${year}-${String(month + 1).padStart(2, '0')}-${String(dayIndex + 1).padStart(2, '0')}`,
|
|
624
|
+
uptime,
|
|
625
|
+
incidents,
|
|
626
|
+
totalDowntime: Math.floor((100 - uptime) * 14.4),
|
|
627
|
+
status
|
|
628
|
+
};
|
|
629
|
+
});
|
|
630
|
+
const totalIncidents = days.reduce((sum, day) => sum + day.incidents, 0);
|
|
631
|
+
const overallUptime = days.reduce((sum, day) => sum + day.uptime, 0) / days.length;
|
|
632
|
+
return {
|
|
633
|
+
month: `${year}-${String(month + 1).padStart(2, '0')}`,
|
|
634
|
+
days,
|
|
635
|
+
overallUptime,
|
|
636
|
+
totalIncidents
|
|
637
|
+
};
|
|
638
|
+
})
|
|
639
|
+
}
|
|
640
|
+
};
|
|
641
|
+
// Initial setup
|
|
642
|
+
let currentScenario = 'singleMonth';
|
|
643
|
+
statusMonth.serviceId = 'edge-case-service';
|
|
644
|
+
statusMonth.serviceName = 'Edge Case Service';
|
|
645
|
+
statusMonth.monthlyData = scenarios[currentScenario].data;
|
|
646
|
+
// Create scenario controls
|
|
647
|
+
const controls = document.createElement('div');
|
|
648
|
+
controls.className = 'demo-controls';
|
|
649
|
+
Object.entries(scenarios).forEach(([key, scenario]) => {
|
|
650
|
+
const button = document.createElement('button');
|
|
651
|
+
button.className = 'demo-button' + (key === currentScenario ? ' active' : '');
|
|
652
|
+
button.textContent = scenario.name;
|
|
653
|
+
button.onclick = () => {
|
|
654
|
+
controls.querySelectorAll('.demo-button').forEach(btn => btn.classList.remove('active'));
|
|
655
|
+
button.classList.add('active');
|
|
656
|
+
currentScenario = key;
|
|
657
|
+
statusMonth.loading = true;
|
|
658
|
+
setTimeout(() => {
|
|
659
|
+
statusMonth.monthlyData = scenario.data;
|
|
660
|
+
statusMonth.loading = false;
|
|
661
|
+
}, 300);
|
|
662
|
+
};
|
|
663
|
+
controls.appendChild(button);
|
|
664
|
+
});
|
|
665
|
+
wrapperElement.appendChild(controls);
|
|
666
|
+
}}
|
|
667
|
+
>
|
|
668
|
+
<upl-statuspage-statusmonth></upl-statuspage-statusmonth>
|
|
669
|
+
</dees-demowrapper>
|
|
670
|
+
</div>
|
|
671
|
+
|
|
672
|
+
<!-- Loading and Navigation States -->
|
|
673
|
+
<div class="demo-section">
|
|
674
|
+
<div class="demo-title">Loading and Navigation Features</div>
|
|
675
|
+
<dees-demowrapper
|
|
676
|
+
.runAfterRender=${async (wrapperElement) => {
|
|
677
|
+
const statusMonth = wrapperElement.querySelector('upl-statuspage-statusmonth');
|
|
678
|
+
// Start with loading
|
|
679
|
+
statusMonth.loading = true;
|
|
680
|
+
statusMonth.serviceId = 'navigation-demo';
|
|
681
|
+
statusMonth.serviceName = 'Navigation Demo Service';
|
|
682
|
+
const controls = document.createElement('div');
|
|
683
|
+
controls.className = 'demo-controls';
|
|
684
|
+
controls.innerHTML = '<button class="demo-button" id="toggleLoading">Toggle Loading</button>' +
|
|
685
|
+
'<button class="demo-button" id="loadSuccess">Load Successfully</button>' +
|
|
686
|
+
'<button class="demo-button" id="loadError">Simulate Error</button>' +
|
|
687
|
+
'<button class="demo-button" id="toggleTooltip">Toggle Tooltip</button>';
|
|
688
|
+
wrapperElement.appendChild(controls);
|
|
689
|
+
controls.querySelector('#toggleLoading')?.addEventListener('click', () => {
|
|
690
|
+
statusMonth.loading = !statusMonth.loading;
|
|
691
|
+
});
|
|
692
|
+
controls.querySelector('#loadSuccess')?.addEventListener('click', () => {
|
|
693
|
+
statusMonth.loading = true;
|
|
694
|
+
setTimeout(() => {
|
|
695
|
+
const months = 6;
|
|
696
|
+
const data = [];
|
|
697
|
+
const now = new Date();
|
|
698
|
+
for (let i = months - 1; i >= 0; i--) {
|
|
699
|
+
const monthDate = new Date(now.getFullYear(), now.getMonth() - i, 1);
|
|
700
|
+
const year = monthDate.getFullYear();
|
|
701
|
+
const month = monthDate.getMonth();
|
|
702
|
+
const daysInMonth = new Date(year, month + 1, 0).getDate();
|
|
703
|
+
data.push({
|
|
704
|
+
month: `${year}-${String(month + 1).padStart(2, '0')}`,
|
|
705
|
+
days: Array.from({ length: daysInMonth }, (_, d) => ({
|
|
706
|
+
date: `${year}-${String(month + 1).padStart(2, '0')}-${String(d + 1).padStart(2, '0')}`,
|
|
707
|
+
uptime: 99 + Math.random(),
|
|
708
|
+
incidents: Math.random() < 0.05 ? 1 : 0,
|
|
709
|
+
totalDowntime: Math.random() < 0.05 ? Math.floor(Math.random() * 60) : 0,
|
|
710
|
+
status: Math.random() < 0.05 ? 'degraded' : 'operational'
|
|
711
|
+
})),
|
|
712
|
+
overallUptime: 99.5 + Math.random() * 0.4,
|
|
713
|
+
totalIncidents: Math.floor(Math.random() * 5)
|
|
714
|
+
});
|
|
715
|
+
}
|
|
716
|
+
statusMonth.monthlyData = data;
|
|
717
|
+
statusMonth.loading = false;
|
|
718
|
+
}, 1000);
|
|
719
|
+
});
|
|
720
|
+
controls.querySelector('#loadError')?.addEventListener('click', () => {
|
|
721
|
+
statusMonth.loading = true;
|
|
722
|
+
setTimeout(() => {
|
|
723
|
+
statusMonth.loading = false;
|
|
724
|
+
statusMonth.monthlyData = [];
|
|
725
|
+
statusMonth.errorMessage = 'Failed to load monthly uptime data';
|
|
726
|
+
}, 1500);
|
|
727
|
+
});
|
|
728
|
+
controls.querySelector('#toggleTooltip')?.addEventListener('click', () => {
|
|
729
|
+
statusMonth.showTooltip = !statusMonth.showTooltip;
|
|
730
|
+
const btn = controls.querySelector('#toggleTooltip');
|
|
731
|
+
if (btn)
|
|
732
|
+
btn.textContent = 'Toggle Tooltip (' + (statusMonth.showTooltip ? 'ON' : 'OFF') + ')';
|
|
733
|
+
});
|
|
734
|
+
// Month navigation
|
|
735
|
+
const navDiv = document.createElement('div');
|
|
736
|
+
navDiv.className = 'month-nav';
|
|
737
|
+
navDiv.innerHTML = '<button class="demo-button" id="prevMonth">← Previous</button>' +
|
|
738
|
+
'<span id="currentMonth">Loading...</span>' +
|
|
739
|
+
'<button class="demo-button" id="nextMonth">Next →</button>';
|
|
740
|
+
wrapperElement.appendChild(navDiv);
|
|
741
|
+
let currentMonthIndex = 0;
|
|
742
|
+
const updateNavigation = () => {
|
|
743
|
+
const data = statusMonth.monthlyData || [];
|
|
744
|
+
if (data.length > 0 && currentMonthIndex < data.length) {
|
|
745
|
+
const month = data[currentMonthIndex];
|
|
746
|
+
const currentMonthEl = navDiv.querySelector('#currentMonth');
|
|
747
|
+
if (currentMonthEl)
|
|
748
|
+
currentMonthEl.textContent = month.month;
|
|
749
|
+
const prevBtn = navDiv.querySelector('#prevMonth');
|
|
750
|
+
const nextBtn = navDiv.querySelector('#nextMonth');
|
|
751
|
+
if (prevBtn)
|
|
752
|
+
prevBtn.disabled = currentMonthIndex === 0;
|
|
753
|
+
if (nextBtn)
|
|
754
|
+
nextBtn.disabled = currentMonthIndex === data.length - 1;
|
|
755
|
+
}
|
|
756
|
+
};
|
|
757
|
+
navDiv.querySelector('#prevMonth')?.addEventListener('click', () => {
|
|
758
|
+
if (currentMonthIndex > 0) {
|
|
759
|
+
currentMonthIndex--;
|
|
760
|
+
updateNavigation();
|
|
761
|
+
// Highlight the month somehow
|
|
762
|
+
statusMonth.highlightMonth = statusMonth.monthlyData[currentMonthIndex].month;
|
|
763
|
+
}
|
|
764
|
+
});
|
|
765
|
+
navDiv.querySelector('#nextMonth')?.addEventListener('click', () => {
|
|
766
|
+
if (currentMonthIndex < (statusMonth.monthlyData?.length || 0) - 1) {
|
|
767
|
+
currentMonthIndex++;
|
|
768
|
+
updateNavigation();
|
|
769
|
+
statusMonth.highlightMonth = statusMonth.monthlyData[currentMonthIndex].month;
|
|
770
|
+
}
|
|
771
|
+
});
|
|
772
|
+
// Initial load
|
|
773
|
+
setTimeout(() => {
|
|
774
|
+
const data = Array.from({ length: 3 }, (_, i) => ({
|
|
775
|
+
month: `2024-${String(i + 1).padStart(2, '0')}`,
|
|
776
|
+
days: Array.from({ length: 31 }, (_, d) => ({
|
|
777
|
+
date: `2024-${String(i + 1).padStart(2, '0')}-${String(d + 1).padStart(2, '0')}`,
|
|
778
|
+
uptime: 99.5 + Math.random() * 0.5,
|
|
779
|
+
incidents: 0,
|
|
780
|
+
totalDowntime: 0,
|
|
781
|
+
status: 'operational'
|
|
782
|
+
})),
|
|
783
|
+
overallUptime: 99.7 + Math.random() * 0.3,
|
|
784
|
+
totalIncidents: Math.floor(Math.random() * 3)
|
|
785
|
+
}));
|
|
786
|
+
statusMonth.monthlyData = data;
|
|
787
|
+
statusMonth.loading = false;
|
|
788
|
+
statusMonth.showTooltip = true;
|
|
789
|
+
updateNavigation();
|
|
790
|
+
}, 1000);
|
|
791
|
+
}}
|
|
792
|
+
>
|
|
793
|
+
<upl-statuspage-statusmonth></upl-statuspage-statusmonth>
|
|
794
|
+
</dees-demowrapper>
|
|
795
|
+
</div>
|
|
796
|
+
</div>
|
|
797
|
+
`;
|
|
798
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsLXN0YXR1c3BhZ2Utc3RhdHVzbW9udGguZGVtby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy91cGwtc3RhdHVzcGFnZS1zdGF0dXNtb250aC5kZW1vLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUduRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBb0ZSLEtBQUssRUFBRSxjQUFtQixFQUFFLEVBQUU7SUFDOUMsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBUSxDQUFDO0lBRXRGLHFCQUFxQjtJQUNyQixNQUFNLG9CQUFvQixHQUFHLENBQUMsVUFBa0IsRUFBRSxPQUEyRSxFQUFvQixFQUFFO1FBQ2pKLE1BQU0sTUFBTSxHQUFxQixFQUFFLENBQUM7UUFDcEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUV2QixLQUFLLElBQUksV0FBVyxHQUFHLFVBQVUsR0FBRyxDQUFDLEVBQUUsV0FBVyxJQUFJLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQy9FLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkMsTUFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJ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
|