@wakastellar/ui 2.3.4 → 2.4.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/blocks/dashboard/index.d.ts +4 -1
- package/dist/blocks/empty-states/index.d.ts +4 -1
- package/dist/blocks/error-pages/index.d.ts +4 -1
- package/dist/blocks/index.d.ts +1 -1
- package/dist/blocks/landing/index.d.ts +4 -1
- package/dist/blocks/pricing/index.d.ts +5 -1
- package/dist/blocks/sidebar/index.d.ts +5 -1
- package/dist/index.cjs.js +130 -130
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +7905 -7856
- package/dist/stories/Button.d.ts +14 -0
- package/dist/stories/Button.stories.d.ts +8 -0
- package/dist/stories/Header.d.ts +11 -0
- package/dist/stories/Header.stories.d.ts +6 -0
- package/dist/stories/Page.d.ts +2 -0
- package/dist/stories/Page.stories.d.ts +6 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/link.d.ts +23 -0
- package/package.json +11 -3
- package/src/blocks/activity-timeline/ActivityTimeline.stories.tsx +460 -0
- package/src/blocks/apm-overview/APMOverview.stories.tsx +435 -0
- package/src/blocks/auth-2fa/Auth2FA.stories.tsx +308 -0
- package/src/blocks/calendar-view/CalendarView.stories.tsx +398 -0
- package/src/blocks/chat/Chat.stories.tsx +466 -0
- package/src/blocks/chat-interface/ChatInterface.stories.tsx +412 -0
- package/src/blocks/checkout-flow/CheckoutFlow.stories.tsx +408 -0
- package/src/blocks/cicd-builder/CICDBuilder.stories.tsx +499 -0
- package/src/blocks/cloud-cost-dashboard/CloudCostDashboard.stories.tsx +356 -0
- package/src/blocks/container-orchestrator/ContainerOrchestrator.stories.tsx +461 -0
- package/src/blocks/dashboard/Dashboard.stories.tsx +559 -0
- package/src/blocks/dashboard/index.tsx +68 -27
- package/src/blocks/dashboard-kpi/DashboardKPI.stories.tsx +422 -0
- package/src/blocks/database-admin/DatabaseAdmin.stories.tsx +393 -0
- package/src/blocks/deployment-dashboard/DeploymentDashboard.stories.tsx +457 -0
- package/src/blocks/empty-states/EmptyStates.stories.tsx +467 -0
- package/src/blocks/empty-states/index.tsx +26 -8
- package/src/blocks/error-pages/ErrorPages.stories.tsx +401 -0
- package/src/blocks/error-pages/index.tsx +26 -8
- package/src/blocks/faq/FAQ.stories.tsx +416 -0
- package/src/blocks/file-manager/FileManager.stories.tsx +413 -0
- package/src/blocks/footer/Footer.stories.tsx +328 -0
- package/src/blocks/gitops-sync-status/GitOpsSyncStatus.stories.tsx +529 -0
- package/src/blocks/header/WakaHeader.stories.tsx +455 -0
- package/src/blocks/headtab/Headtab.stories.tsx +369 -0
- package/src/blocks/i18n-editor/I18nEditor.stories.tsx +451 -0
- package/src/blocks/incident-manager/IncidentManager.stories.tsx +464 -0
- package/src/blocks/index.ts +1 -1
- package/src/blocks/infrastructure-map/InfrastructureMap.stories.tsx +533 -0
- package/src/blocks/kanban-board/KanbanBoard.stories.tsx +494 -0
- package/src/blocks/landing/WakaLanding.stories.tsx +449 -0
- package/src/blocks/landing/index.tsx +125 -66
- package/src/blocks/language-selector/LanguageSelector.stories.tsx +345 -0
- package/src/blocks/layout/Layout.stories.tsx +373 -0
- package/src/blocks/login/Login.stories.tsx +443 -0
- package/src/blocks/on-call-schedule/OnCallSchedule.stories.tsx +381 -0
- package/src/blocks/player-profile/PlayerProfile.stories.tsx +316 -0
- package/src/blocks/pricing/WakaPricing.stories.tsx +530 -0
- package/src/blocks/pricing/index.tsx +38 -4
- package/src/blocks/profile/Profile.stories.tsx +371 -0
- package/src/blocks/release-notes/ReleaseNotes.stories.tsx +431 -0
- package/src/blocks/settings/Settings.stories.tsx +520 -0
- package/src/blocks/sidebar/WakaSidebar.stories.tsx +513 -0
- package/src/blocks/sidebar/index.tsx +49 -20
- package/src/blocks/theme-creator-block/ThemeCreatorBlock.stories.tsx +370 -0
- package/src/blocks/user-management/UserManagement.stories.tsx +411 -0
- package/src/blocks/wizard/Wizard.stories.tsx +683 -0
- package/src/components/accordion/Accordion.stories.tsx +93 -0
- package/src/components/alert/Alert.stories.tsx +95 -0
- package/src/components/alert-dialog/AlertDialog.stories.tsx +126 -0
- package/src/components/aspect-ratio/AspectRatio.stories.tsx +118 -0
- package/src/components/avatar/Avatar.stories.tsx +104 -0
- package/src/components/button/Button.stories.tsx +12 -1
- package/src/components/calendar/Calendar.stories.tsx +102 -0
- package/src/components/card/Card.stories.tsx +125 -0
- package/src/components/checkbox/Checkbox.stories.tsx +100 -0
- package/src/components/code/Code.stories.tsx +402 -0
- package/src/components/collapsible/Collapsible.stories.tsx +123 -0
- package/src/components/command/Command.stories.tsx +207 -0
- package/src/components/context-menu/ContextMenu.stories.tsx +220 -0
- package/src/components/dialog/Dialog.stories.tsx +157 -0
- package/src/components/dropdown-menu/DropdownMenu.stories.tsx +225 -0
- package/src/components/form/Form.stories.tsx +413 -0
- package/src/components/hover-card/HoverCard.stories.tsx +148 -0
- package/src/components/input-otp/InputOTP.stories.tsx +255 -0
- package/src/components/label/Label.stories.tsx +68 -0
- package/src/components/menubar/Menubar.stories.tsx +278 -0
- package/src/components/navigation-menu/NavigationMenu.stories.tsx +202 -0
- package/src/components/popover/Popover.stories.tsx +199 -0
- package/src/components/progress/Progress.stories.tsx +104 -0
- package/src/components/radio-group/RadioGroup.stories.tsx +138 -0
- package/src/components/scroll-area/ScrollArea.stories.tsx +153 -0
- package/src/components/select/Select.stories.tsx +146 -0
- package/src/components/separator/Separator.stories.tsx +117 -0
- package/src/components/sheet/Sheet.stories.tsx +195 -0
- package/src/components/skeleton/Skeleton.stories.tsx +114 -0
- package/src/components/slider/Slider.stories.tsx +157 -0
- package/src/components/switch/Switch.stories.tsx +114 -0
- package/src/components/table/Table.stories.tsx +153 -0
- package/src/components/tabs/Tabs.stories.tsx +155 -0
- package/src/components/textarea/Textarea.stories.tsx +116 -0
- package/src/components/toast/Toast.stories.tsx +160 -0
- package/src/components/toggle/Toggle.stories.tsx +125 -0
- package/src/components/tooltip/Tooltip.stories.tsx +133 -0
- package/src/components/typography/Typography.stories.tsx +207 -0
- package/src/components/waka-3d-pie-chart/Waka3DPieChart.stories.tsx +308 -0
- package/src/components/waka-achievement-unlock/WakaAchievementUnlock.stories.tsx +353 -0
- package/src/components/waka-artifact-list/WakaArtifactList.stories.tsx +258 -0
- package/src/components/waka-autocomplete/WakaAutocomplete.stories.tsx +224 -0
- package/src/components/waka-badge-showcase/WakaBadgeShowcase.stories.tsx +269 -0
- package/src/components/waka-barcode/WakaBarcode.stories.tsx +227 -0
- package/src/components/waka-bottom-sheet/WakaBottomSheet.stories.tsx +408 -0
- package/src/components/waka-breadcrumb/WakaBreadcrumb.stories.tsx +237 -0
- package/src/components/waka-build-matrix/WakaBuildMatrix.stories.tsx +328 -0
- package/src/components/waka-carousel/WakaCarousel.stories.tsx +296 -0
- package/src/components/waka-charts/WakaCharts.stories.tsx +519 -0
- package/src/components/waka-color-picker/WakaColorPicker.stories.tsx +200 -0
- package/src/components/waka-combobox/WakaCombobox.stories.tsx +250 -0
- package/src/components/waka-container-list/WakaContainerList.stories.tsx +315 -0
- package/src/components/waka-contribution-graph/WakaContributionGraph.stories.tsx +354 -0
- package/src/components/waka-cost-breakdown/WakaCostBreakdown.stories.tsx +348 -0
- package/src/components/waka-daily-reward/WakaDailyReward.stories.tsx +365 -0
- package/src/components/waka-database-card/WakaDatabaseCard.stories.tsx +306 -0
- package/src/components/waka-date-range-picker/WakaDateRangePicker.stories.tsx +339 -0
- package/src/components/waka-datetime-picker/WakaDateTimePicker.stories.tsx +317 -0
- package/src/components/waka-deployment-lane/WakaDeploymentLane.stories.tsx +292 -0
- package/src/components/waka-dock/WakaDock.stories.tsx +332 -0
- package/src/components/waka-drawer/WakaDrawer.stories.tsx +437 -0
- package/src/components/waka-env-var-editor/WakaEnvVarEditor.stories.tsx +263 -0
- package/src/components/waka-error-shake/WakaErrorShake.stories.tsx +410 -0
- package/src/components/waka-file-upload/WakaFileUpload.stories.tsx +239 -0
- package/src/components/waka-flow-diagram/WakaFlowDiagram.stories.tsx +365 -0
- package/src/components/waka-funnel-chart/WakaFunnelChart.stories.tsx +281 -0
- package/src/components/waka-glow-card/WakaGlowCard.stories.tsx +274 -0
- package/src/components/waka-haptic-button/WakaHapticButton.stories.tsx +349 -0
- package/src/components/waka-health-pulse/WakaHealthPulse.stories.tsx +293 -0
- package/src/components/waka-heatmap/WakaHeatmap.stories.tsx +376 -0
- package/src/components/waka-image/WakaImage.stories.tsx +255 -0
- package/src/components/waka-incident-timeline/WakaIncidentTimeline.stories.tsx +300 -0
- package/src/components/waka-kanban/WakaKanban.stories.tsx +399 -0
- package/src/components/waka-kubernetes-overview/WakaKubernetesOverview.stories.tsx +281 -0
- package/src/components/waka-leaderboard/WakaLeaderboard.stories.tsx +300 -0
- package/src/components/waka-level-progress/WakaLevelProgress.stories.tsx +313 -0
- package/src/components/waka-loading-orbit/WakaLoadingOrbit.stories.tsx +413 -0
- package/src/components/waka-log-viewer/WakaLogViewer.stories.tsx +312 -0
- package/src/components/waka-loot-box/WakaLootBox.stories.tsx +374 -0
- package/src/components/waka-metric-sparkline/WakaMetricSparkline.stories.tsx +312 -0
- package/src/components/waka-migration-list/WakaMigrationList.stories.tsx +289 -0
- package/src/components/waka-modal/WakaModal.stories.tsx +434 -0
- package/src/components/waka-morph-button/WakaMorphButton.stories.tsx +405 -0
- package/src/components/waka-network-topology/WakaNetworkTopology.stories.tsx +364 -0
- package/src/components/waka-notifications/WakaNotifications.stories.tsx +290 -0
- package/src/components/waka-number-input/WakaNumberInput.stories.tsx +282 -0
- package/src/components/waka-pagination/WakaPagination.stories.tsx +328 -0
- package/src/components/waka-password-strength/WakaPasswordStrength.stories.tsx +318 -0
- package/src/components/waka-pipeline-view/WakaPipelineView.stories.tsx +386 -0
- package/src/components/waka-player-card/WakaPlayerCard.stories.tsx +333 -0
- package/src/components/waka-pod-card/WakaPodCard.stories.tsx +435 -0
- package/src/components/waka-qrcode/WakaQRCode.stories.tsx +232 -0
- package/src/components/waka-query-explain/WakaQueryExplain.stories.tsx +407 -0
- package/src/components/waka-quest-card/WakaQuestCard.stories.tsx +394 -0
- package/src/components/waka-quota-bar/WakaQuotaBar.stories.tsx +435 -0
- package/src/components/waka-radar-score/WakaRadarScore.stories.tsx +372 -0
- package/src/components/waka-resource-gauge/WakaResourceGauge.stories.tsx +366 -0
- package/src/components/waka-rich-text-editor/WakaRichTextEditor.stories.tsx +238 -0
- package/src/components/waka-sankey-diagram/WakaSankeyDiagram.stories.tsx +389 -0
- package/src/components/waka-scratch-card/WakaScratchCard.stories.tsx +388 -0
- package/src/components/waka-secret-card/WakaSecretCard.stories.tsx +314 -0
- package/src/components/waka-segmented-control/WakaSegmentedControl.stories.tsx +309 -0
- package/src/components/waka-server-rack/WakaServerRack.stories.tsx +382 -0
- package/src/components/waka-service-graph/WakaServiceGraph.stories.tsx +262 -0
- package/src/components/waka-skeleton-wave/WakaSkeletonWave.stories.tsx +321 -0
- package/src/components/waka-skill-tree/WakaSkillTree.stories.tsx +308 -0
- package/src/components/waka-spin-wheel/WakaSpinWheel.stories.tsx +368 -0
- package/src/components/waka-spinner/WakaSpinner.stories.tsx +156 -0
- package/src/components/waka-stat/WakaStat.stories.tsx +334 -0
- package/src/components/waka-status-matrix/WakaStatusMatrix.stories.tsx +331 -0
- package/src/components/waka-stepper/WakaStepper.stories.tsx +468 -0
- package/src/components/waka-streak-counter/WakaStreakCounter.stories.tsx +235 -0
- package/src/components/waka-success-explosion/WakaSuccessExplosion.stories.tsx +389 -0
- package/src/components/waka-tabs-morph/WakaTabsMorph.stories.tsx +471 -0
- package/src/components/waka-terminal-output/WakaTerminalOutput.stories.tsx +351 -0
- package/src/components/waka-test-report/WakaTestReport.stories.tsx +322 -0
- package/src/components/waka-tilt-card/WakaTiltCard.stories.tsx +300 -0
- package/src/components/waka-time-picker/WakaTimePicker.stories.tsx +227 -0
- package/src/components/waka-timeline/WakaTimeline.stories.tsx +383 -0
- package/src/components/waka-tournament-bracket/WakaTournamentBracket.stories.tsx +375 -0
- package/src/components/waka-trace-viewer/WakaTraceViewer.stories.tsx +445 -0
- package/src/components/waka-tree/WakaTree.stories.tsx +359 -0
- package/src/components/waka-treemap-chart/WakaTreemapChart.stories.tsx +378 -0
- package/src/components/waka-typewriter/WakaTypewriter.stories.tsx +366 -0
- package/src/components/waka-versus-card/WakaVersusCard.stories.tsx +530 -0
- package/src/components/waka-video/WakaVideo.stories.tsx +203 -0
- package/src/components/waka-virtual-list/WakaVirtualList.stories.tsx +273 -0
- package/src/components/waka-xp-bar/WakaXPBar.stories.tsx +305 -0
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
2
|
+
import {
|
|
3
|
+
IncidentManager,
|
|
4
|
+
defaultIncidents,
|
|
5
|
+
} from './index'
|
|
6
|
+
import type { Incident, IncidentSeverity, IncidentStatus, IncidentResponder, IncidentEvent } from './index'
|
|
7
|
+
import * as React from 'react'
|
|
8
|
+
|
|
9
|
+
const meta: Meta<typeof IncidentManager> = {
|
|
10
|
+
title: 'Blocks/IncidentManager',
|
|
11
|
+
component: IncidentManager,
|
|
12
|
+
parameters: {
|
|
13
|
+
layout: 'fullscreen',
|
|
14
|
+
docs: {
|
|
15
|
+
description: {
|
|
16
|
+
component:
|
|
17
|
+
'An incident management dashboard for tracking and responding to production incidents with severity levels, responder assignments, timeline events, and incident lifecycle management.',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
tags: ['autodocs'],
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export default meta
|
|
25
|
+
type Story = StoryObj<typeof IncidentManager>
|
|
26
|
+
|
|
27
|
+
export const Default: Story = {
|
|
28
|
+
render: () => (
|
|
29
|
+
<div className="p-6">
|
|
30
|
+
<IncidentManager
|
|
31
|
+
incidents={defaultIncidents}
|
|
32
|
+
onCreateIncident={() => console.log('Create incident')}
|
|
33
|
+
onAcknowledge={(incident) => console.log('Acknowledge:', incident.title)}
|
|
34
|
+
onResolve={(incident) => console.log('Resolve:', incident.title)}
|
|
35
|
+
onEscalate={(incident) => console.log('Escalate:', incident.title)}
|
|
36
|
+
/>
|
|
37
|
+
</div>
|
|
38
|
+
),
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const NoActiveIncidents: Story = {
|
|
42
|
+
render: () => {
|
|
43
|
+
const resolvedIncidents: Incident[] = [
|
|
44
|
+
{
|
|
45
|
+
id: '1',
|
|
46
|
+
title: 'API latency spike',
|
|
47
|
+
description: 'Resolved - Root cause was database connection pool exhaustion',
|
|
48
|
+
severity: 'high',
|
|
49
|
+
status: 'resolved',
|
|
50
|
+
service: 'api-gateway',
|
|
51
|
+
createdAt: new Date(Date.now() - 6 * 3600000),
|
|
52
|
+
acknowledgedAt: new Date(Date.now() - 5.5 * 3600000),
|
|
53
|
+
resolvedAt: new Date(Date.now() - 4 * 3600000),
|
|
54
|
+
responders: [
|
|
55
|
+
{ id: '1', name: 'Alice Chen', role: 'On-Call Engineer', status: 'available' },
|
|
56
|
+
],
|
|
57
|
+
events: [
|
|
58
|
+
{ id: 'e1', type: 'status_change', timestamp: new Date(Date.now() - 4 * 3600000), content: 'Incident resolved' },
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: '2',
|
|
63
|
+
title: 'Authentication service timeout',
|
|
64
|
+
severity: 'medium',
|
|
65
|
+
status: 'closed',
|
|
66
|
+
service: 'auth-service',
|
|
67
|
+
createdAt: new Date(Date.now() - 24 * 3600000),
|
|
68
|
+
resolvedAt: new Date(Date.now() - 20 * 3600000),
|
|
69
|
+
responders: [],
|
|
70
|
+
events: [],
|
|
71
|
+
},
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<div className="p-6">
|
|
76
|
+
<IncidentManager
|
|
77
|
+
incidents={resolvedIncidents}
|
|
78
|
+
onCreateIncident={() => console.log('Create incident')}
|
|
79
|
+
/>
|
|
80
|
+
</div>
|
|
81
|
+
)
|
|
82
|
+
},
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export const CriticalIncident: Story = {
|
|
86
|
+
render: () => {
|
|
87
|
+
const criticalIncidents: Incident[] = [
|
|
88
|
+
{
|
|
89
|
+
id: '1',
|
|
90
|
+
title: 'Complete service outage - Production down',
|
|
91
|
+
description: 'All production services are unreachable. Users receiving 503 errors across the board.',
|
|
92
|
+
severity: 'critical',
|
|
93
|
+
status: 'investigating',
|
|
94
|
+
service: 'all-services',
|
|
95
|
+
createdAt: new Date(Date.now() - 15 * 60000),
|
|
96
|
+
acknowledgedAt: new Date(Date.now() - 12 * 60000),
|
|
97
|
+
impact: 'Total outage affecting all 50,000+ active users',
|
|
98
|
+
affectedUsers: 52000,
|
|
99
|
+
slackChannel: 'incident-critical-001',
|
|
100
|
+
runbookUrl: 'https://runbooks.example.com/total-outage',
|
|
101
|
+
responders: [
|
|
102
|
+
{ id: '1', name: 'John Doe', role: 'Incident Commander', status: 'engaged' },
|
|
103
|
+
{ id: '2', name: 'Jane Smith', role: 'Site Reliability Engineer', status: 'engaged' },
|
|
104
|
+
{ id: '3', name: 'Bob Wilson', role: 'Platform Engineer', status: 'engaged' },
|
|
105
|
+
{ id: '4', name: 'Alice Chen', role: 'Database Admin', status: 'engaged' },
|
|
106
|
+
],
|
|
107
|
+
events: [
|
|
108
|
+
{ id: 'e1', type: 'status_change', timestamp: new Date(Date.now() - 15 * 60000), content: 'Incident triggered by alerting system' },
|
|
109
|
+
{ id: 'e2', type: 'escalation', timestamp: new Date(Date.now() - 14 * 60000), content: 'Escalated to all on-call teams' },
|
|
110
|
+
{ id: 'e3', type: 'assignment', timestamp: new Date(Date.now() - 13 * 60000), content: 'John Doe assigned as Incident Commander' },
|
|
111
|
+
{ id: 'e4', type: 'status_change', timestamp: new Date(Date.now() - 12 * 60000), content: 'Incident acknowledged' },
|
|
112
|
+
{ id: 'e5', type: 'comment', timestamp: new Date(Date.now() - 10 * 60000), content: 'Identified: Cloud provider network issue', user: 'Jane Smith' },
|
|
113
|
+
{ id: 'e6', type: 'runbook', timestamp: new Date(Date.now() - 8 * 60000), content: 'Executing failover runbook' },
|
|
114
|
+
],
|
|
115
|
+
},
|
|
116
|
+
...defaultIncidents.slice(1),
|
|
117
|
+
]
|
|
118
|
+
|
|
119
|
+
return (
|
|
120
|
+
<div className="p-6">
|
|
121
|
+
<IncidentManager
|
|
122
|
+
incidents={criticalIncidents}
|
|
123
|
+
onAcknowledge={(incident) => console.log('Acknowledge:', incident.title)}
|
|
124
|
+
onResolve={(incident) => console.log('Resolve:', incident.title)}
|
|
125
|
+
onEscalate={(incident) => console.log('Escalate:', incident.title)}
|
|
126
|
+
/>
|
|
127
|
+
</div>
|
|
128
|
+
)
|
|
129
|
+
},
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export const MultipleActiveIncidents: Story = {
|
|
133
|
+
render: () => {
|
|
134
|
+
const manyIncidents: Incident[] = [
|
|
135
|
+
{
|
|
136
|
+
id: '1',
|
|
137
|
+
title: 'Database replication lag exceeds threshold',
|
|
138
|
+
severity: 'critical',
|
|
139
|
+
status: 'investigating',
|
|
140
|
+
service: 'postgres-replica',
|
|
141
|
+
createdAt: new Date(Date.now() - 30 * 60000),
|
|
142
|
+
affectedUsers: 8000,
|
|
143
|
+
responders: [
|
|
144
|
+
{ id: '1', name: 'DBA Team', role: 'Database Admin', status: 'engaged' },
|
|
145
|
+
],
|
|
146
|
+
events: [
|
|
147
|
+
{ id: 'e1', type: 'status_change', timestamp: new Date(Date.now() - 30 * 60000), content: 'Incident triggered' },
|
|
148
|
+
],
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
id: '2',
|
|
152
|
+
title: 'Memory leak detected in user-service',
|
|
153
|
+
severity: 'high',
|
|
154
|
+
status: 'acknowledged',
|
|
155
|
+
service: 'user-service',
|
|
156
|
+
createdAt: new Date(Date.now() - 45 * 60000),
|
|
157
|
+
affectedUsers: 3500,
|
|
158
|
+
responders: [
|
|
159
|
+
{ id: '2', name: 'Platform Team', role: 'Platform Engineer', status: 'engaged' },
|
|
160
|
+
],
|
|
161
|
+
events: [],
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
id: '3',
|
|
165
|
+
title: 'CDN cache miss rate spike',
|
|
166
|
+
severity: 'high',
|
|
167
|
+
status: 'triggered',
|
|
168
|
+
service: 'cdn',
|
|
169
|
+
createdAt: new Date(Date.now() - 10 * 60000),
|
|
170
|
+
responders: [],
|
|
171
|
+
events: [],
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
id: '4',
|
|
175
|
+
title: 'Elevated 5xx errors on checkout flow',
|
|
176
|
+
severity: 'medium',
|
|
177
|
+
status: 'investigating',
|
|
178
|
+
service: 'checkout-service',
|
|
179
|
+
createdAt: new Date(Date.now() - 60 * 60000),
|
|
180
|
+
affectedUsers: 500,
|
|
181
|
+
responders: [
|
|
182
|
+
{ id: '3', name: 'Backend Team', role: 'Backend Engineer', status: 'engaged' },
|
|
183
|
+
],
|
|
184
|
+
events: [],
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
id: '5',
|
|
188
|
+
title: 'SSL certificate expiring in 7 days',
|
|
189
|
+
severity: 'low',
|
|
190
|
+
status: 'acknowledged',
|
|
191
|
+
service: 'api-gateway',
|
|
192
|
+
createdAt: new Date(Date.now() - 2 * 3600000),
|
|
193
|
+
responders: [],
|
|
194
|
+
events: [],
|
|
195
|
+
},
|
|
196
|
+
]
|
|
197
|
+
|
|
198
|
+
return (
|
|
199
|
+
<div className="p-6">
|
|
200
|
+
<IncidentManager
|
|
201
|
+
incidents={manyIncidents}
|
|
202
|
+
onCreateIncident={() => console.log('Create incident')}
|
|
203
|
+
onAcknowledge={(incident) => console.log('Acknowledge:', incident.title)}
|
|
204
|
+
onResolve={(incident) => console.log('Resolve:', incident.title)}
|
|
205
|
+
/>
|
|
206
|
+
</div>
|
|
207
|
+
)
|
|
208
|
+
},
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export const WithAllStatuses: Story = {
|
|
212
|
+
render: () => {
|
|
213
|
+
const allStatusIncidents: Incident[] = [
|
|
214
|
+
{
|
|
215
|
+
id: '1',
|
|
216
|
+
title: 'New alert: High CPU usage',
|
|
217
|
+
severity: 'medium',
|
|
218
|
+
status: 'triggered',
|
|
219
|
+
service: 'compute-cluster',
|
|
220
|
+
createdAt: new Date(Date.now() - 2 * 60000),
|
|
221
|
+
responders: [],
|
|
222
|
+
events: [],
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
id: '2',
|
|
226
|
+
title: 'API rate limiting activated',
|
|
227
|
+
severity: 'medium',
|
|
228
|
+
status: 'acknowledged',
|
|
229
|
+
service: 'api-gateway',
|
|
230
|
+
createdAt: new Date(Date.now() - 15 * 60000),
|
|
231
|
+
acknowledgedAt: new Date(Date.now() - 10 * 60000),
|
|
232
|
+
responders: [{ id: '1', name: 'On-Call', role: 'Engineer', status: 'engaged' }],
|
|
233
|
+
events: [],
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
id: '3',
|
|
237
|
+
title: 'Search indexing delays',
|
|
238
|
+
severity: 'high',
|
|
239
|
+
status: 'investigating',
|
|
240
|
+
service: 'search-service',
|
|
241
|
+
createdAt: new Date(Date.now() - 30 * 60000),
|
|
242
|
+
responders: [{ id: '2', name: 'Search Team', role: 'Engineer', status: 'engaged' }],
|
|
243
|
+
events: [],
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
id: '4',
|
|
247
|
+
title: 'Payment gateway timeout',
|
|
248
|
+
severity: 'critical',
|
|
249
|
+
status: 'identified',
|
|
250
|
+
service: 'payment-service',
|
|
251
|
+
createdAt: new Date(Date.now() - 45 * 60000),
|
|
252
|
+
impact: 'Third-party provider experiencing issues',
|
|
253
|
+
responders: [{ id: '3', name: 'Payments Team', role: 'Engineer', status: 'engaged' }],
|
|
254
|
+
events: [],
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
id: '5',
|
|
258
|
+
title: 'Cache invalidation issue',
|
|
259
|
+
severity: 'medium',
|
|
260
|
+
status: 'resolved',
|
|
261
|
+
service: 'redis-cluster',
|
|
262
|
+
createdAt: new Date(Date.now() - 3 * 3600000),
|
|
263
|
+
resolvedAt: new Date(Date.now() - 2 * 3600000),
|
|
264
|
+
responders: [],
|
|
265
|
+
events: [],
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
id: '6',
|
|
269
|
+
title: 'DNS resolution delays',
|
|
270
|
+
severity: 'low',
|
|
271
|
+
status: 'closed',
|
|
272
|
+
service: 'dns',
|
|
273
|
+
createdAt: new Date(Date.now() - 24 * 3600000),
|
|
274
|
+
resolvedAt: new Date(Date.now() - 20 * 3600000),
|
|
275
|
+
responders: [],
|
|
276
|
+
events: [],
|
|
277
|
+
},
|
|
278
|
+
]
|
|
279
|
+
|
|
280
|
+
return (
|
|
281
|
+
<div className="p-6">
|
|
282
|
+
<IncidentManager
|
|
283
|
+
incidents={allStatusIncidents}
|
|
284
|
+
onAcknowledge={(incident) => console.log('Acknowledge:', incident.title)}
|
|
285
|
+
onResolve={(incident) => console.log('Resolve:', incident.title)}
|
|
286
|
+
/>
|
|
287
|
+
</div>
|
|
288
|
+
)
|
|
289
|
+
},
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
export const Interactive: Story = {
|
|
293
|
+
render: () => {
|
|
294
|
+
const [incidents, setIncidents] = React.useState<Incident[]>(defaultIncidents)
|
|
295
|
+
|
|
296
|
+
const handleAcknowledge = (incident: Incident) => {
|
|
297
|
+
setIncidents(prev =>
|
|
298
|
+
prev.map(i =>
|
|
299
|
+
i.id === incident.id
|
|
300
|
+
? {
|
|
301
|
+
...i,
|
|
302
|
+
status: 'acknowledged' as IncidentStatus,
|
|
303
|
+
acknowledgedAt: new Date(),
|
|
304
|
+
events: [
|
|
305
|
+
...i.events,
|
|
306
|
+
{
|
|
307
|
+
id: `e-${Date.now()}`,
|
|
308
|
+
type: 'status_change' as const,
|
|
309
|
+
timestamp: new Date(),
|
|
310
|
+
content: 'Incident acknowledged',
|
|
311
|
+
},
|
|
312
|
+
],
|
|
313
|
+
}
|
|
314
|
+
: i
|
|
315
|
+
)
|
|
316
|
+
)
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
const handleResolve = (incident: Incident) => {
|
|
320
|
+
setIncidents(prev =>
|
|
321
|
+
prev.map(i =>
|
|
322
|
+
i.id === incident.id
|
|
323
|
+
? {
|
|
324
|
+
...i,
|
|
325
|
+
status: 'resolved' as IncidentStatus,
|
|
326
|
+
resolvedAt: new Date(),
|
|
327
|
+
events: [
|
|
328
|
+
...i.events,
|
|
329
|
+
{
|
|
330
|
+
id: `e-${Date.now()}`,
|
|
331
|
+
type: 'status_change' as const,
|
|
332
|
+
timestamp: new Date(),
|
|
333
|
+
content: 'Incident resolved',
|
|
334
|
+
},
|
|
335
|
+
],
|
|
336
|
+
}
|
|
337
|
+
: i
|
|
338
|
+
)
|
|
339
|
+
)
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const handleCreate = () => {
|
|
343
|
+
const newIncident: Incident = {
|
|
344
|
+
id: `inc-${Date.now()}`,
|
|
345
|
+
title: 'New incident created',
|
|
346
|
+
severity: 'medium',
|
|
347
|
+
status: 'triggered',
|
|
348
|
+
service: 'unknown',
|
|
349
|
+
createdAt: new Date(),
|
|
350
|
+
responders: [],
|
|
351
|
+
events: [
|
|
352
|
+
{
|
|
353
|
+
id: `e-${Date.now()}`,
|
|
354
|
+
type: 'status_change',
|
|
355
|
+
timestamp: new Date(),
|
|
356
|
+
content: 'Incident created manually',
|
|
357
|
+
},
|
|
358
|
+
],
|
|
359
|
+
}
|
|
360
|
+
setIncidents(prev => [newIncident, ...prev])
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
return (
|
|
364
|
+
<div className="p-6">
|
|
365
|
+
<IncidentManager
|
|
366
|
+
incidents={incidents}
|
|
367
|
+
onCreateIncident={handleCreate}
|
|
368
|
+
onAcknowledge={handleAcknowledge}
|
|
369
|
+
onResolve={handleResolve}
|
|
370
|
+
onEscalate={(incident) => alert(`Escalating: ${incident.title}`)}
|
|
371
|
+
/>
|
|
372
|
+
</div>
|
|
373
|
+
)
|
|
374
|
+
},
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
export const OnCallDashboard: Story = {
|
|
378
|
+
render: () => (
|
|
379
|
+
<div className="min-h-screen bg-muted/30">
|
|
380
|
+
<header className="bg-background border-b px-6 py-4">
|
|
381
|
+
<div className="flex items-center justify-between">
|
|
382
|
+
<div>
|
|
383
|
+
<h1 className="font-bold text-xl">On-Call Dashboard</h1>
|
|
384
|
+
<p className="text-sm text-muted-foreground">Incident Response & Management</p>
|
|
385
|
+
</div>
|
|
386
|
+
<nav className="flex gap-4 text-sm">
|
|
387
|
+
<a href="#" className="text-foreground font-medium">Active Incidents</a>
|
|
388
|
+
<a href="#" className="text-muted-foreground hover:text-foreground">On-Call Schedule</a>
|
|
389
|
+
<a href="#" className="text-muted-foreground hover:text-foreground">Runbooks</a>
|
|
390
|
+
<a href="#" className="text-muted-foreground hover:text-foreground">Post-Mortems</a>
|
|
391
|
+
</nav>
|
|
392
|
+
</div>
|
|
393
|
+
</header>
|
|
394
|
+
<main className="p-6">
|
|
395
|
+
<IncidentManager
|
|
396
|
+
incidents={defaultIncidents}
|
|
397
|
+
onCreateIncident={() => console.log('Create incident')}
|
|
398
|
+
onAcknowledge={(incident) => console.log('Acknowledge:', incident.title)}
|
|
399
|
+
onResolve={(incident) => console.log('Resolve:', incident.title)}
|
|
400
|
+
onEscalate={(incident) => console.log('Escalate:', incident.title)}
|
|
401
|
+
/>
|
|
402
|
+
</main>
|
|
403
|
+
</div>
|
|
404
|
+
),
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
export const PostMortemReview: Story = {
|
|
408
|
+
render: () => {
|
|
409
|
+
const historicalIncidents: Incident[] = [
|
|
410
|
+
{
|
|
411
|
+
id: '1',
|
|
412
|
+
title: 'Major outage - Payment processing failure',
|
|
413
|
+
description: 'Complete payment system unavailable for 2 hours due to database failover issue',
|
|
414
|
+
severity: 'critical',
|
|
415
|
+
status: 'closed',
|
|
416
|
+
service: 'payment-service',
|
|
417
|
+
createdAt: new Date(Date.now() - 7 * 24 * 3600000),
|
|
418
|
+
acknowledgedAt: new Date(Date.now() - 7 * 24 * 3600000 + 5 * 60000),
|
|
419
|
+
resolvedAt: new Date(Date.now() - 7 * 24 * 3600000 + 2 * 3600000),
|
|
420
|
+
impact: '$250,000 in lost transactions',
|
|
421
|
+
affectedUsers: 45000,
|
|
422
|
+
responders: [
|
|
423
|
+
{ id: '1', name: 'John Doe', role: 'Incident Commander', status: 'available' },
|
|
424
|
+
{ id: '2', name: 'Jane Smith', role: 'DBA', status: 'available' },
|
|
425
|
+
],
|
|
426
|
+
events: Array.from({ length: 15 }, (_, i) => ({
|
|
427
|
+
id: `e-${i}`,
|
|
428
|
+
type: 'comment' as const,
|
|
429
|
+
timestamp: new Date(Date.now() - 7 * 24 * 3600000 + i * 10 * 60000),
|
|
430
|
+
content: `Event ${i + 1} during incident response`,
|
|
431
|
+
})),
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
id: '2',
|
|
435
|
+
title: 'API performance degradation',
|
|
436
|
+
severity: 'high',
|
|
437
|
+
status: 'closed',
|
|
438
|
+
service: 'api-gateway',
|
|
439
|
+
createdAt: new Date(Date.now() - 14 * 24 * 3600000),
|
|
440
|
+
resolvedAt: new Date(Date.now() - 14 * 24 * 3600000 + 45 * 60000),
|
|
441
|
+
affectedUsers: 12000,
|
|
442
|
+
responders: [],
|
|
443
|
+
events: [],
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
id: '3',
|
|
447
|
+
title: 'Data sync failure',
|
|
448
|
+
severity: 'medium',
|
|
449
|
+
status: 'closed',
|
|
450
|
+
service: 'sync-service',
|
|
451
|
+
createdAt: new Date(Date.now() - 21 * 24 * 3600000),
|
|
452
|
+
resolvedAt: new Date(Date.now() - 21 * 24 * 3600000 + 30 * 60000),
|
|
453
|
+
responders: [],
|
|
454
|
+
events: [],
|
|
455
|
+
},
|
|
456
|
+
]
|
|
457
|
+
|
|
458
|
+
return (
|
|
459
|
+
<div className="p-6">
|
|
460
|
+
<IncidentManager incidents={historicalIncidents} />
|
|
461
|
+
</div>
|
|
462
|
+
)
|
|
463
|
+
},
|
|
464
|
+
}
|
package/src/blocks/index.ts
CHANGED
|
@@ -23,7 +23,7 @@ export type { LoginProps, LoginConfig, LoginColorConfig, LoginThemeConfig, Login
|
|
|
23
23
|
|
|
24
24
|
// Sidebar
|
|
25
25
|
export { WakaSidebar, useSidebar, SidebarLayout } from './sidebar'
|
|
26
|
-
export type { WakaSidebarProps, SidebarMenuItem, SidebarUserConfig, SidebarLogoConfig, SidebarLayoutProps } from './sidebar'
|
|
26
|
+
export type { WakaSidebarProps, SidebarMenuItem, SidebarUserConfig, SidebarLogoConfig, SidebarLayoutProps, LinkComponentProps } from './sidebar'
|
|
27
27
|
|
|
28
28
|
// Header
|
|
29
29
|
export { WakaHeader } from './header'
|