@skyhook-io/k8s-ui 1.2.4 → 1.3.1
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/package.json +4 -3
- package/src/components/dock/BottomDock.tsx +24 -6
- package/src/components/dock/DockContext.tsx +9 -1
- package/src/components/dock/LocalTerminalTab.tsx +1 -1
- package/src/components/dock/NodeTerminalTab.tsx +1 -1
- package/src/components/dock/TerminalTab.tsx +2 -2
- package/src/components/gitops/GitOpsActions.tsx +12 -11
- package/src/components/gitops/GitOpsStatusBadge.tsx +6 -6
- package/src/components/logs/LogCore.tsx +8 -8
- package/src/components/logs/LogsViewer.tsx +8 -3
- package/src/components/logs/WorkloadLogsViewer.tsx +37 -9
- package/src/components/logs/useLogStream.ts +20 -0
- package/src/components/resources/ResourcesSidebar.tsx +10 -10
- package/src/components/resources/ResourcesView.tsx +49 -48
- package/src/components/resources/renderers/AlertRenderer.tsx +2 -2
- package/src/components/resources/renderers/ArgoApplicationRenderer.tsx +2 -2
- package/src/components/resources/renderers/CNPGClusterRenderer.tsx +1 -1
- package/src/components/resources/renderers/CertificateRenderer.tsx +3 -3
- package/src/components/resources/renderers/CertificateRequestRenderer.tsx +3 -3
- package/src/components/resources/renderers/ChallengeRenderer.tsx +2 -2
- package/src/components/resources/renderers/ClusterExternalSecretRenderer.tsx +3 -3
- package/src/components/resources/renderers/ClusterIssuerRenderer.tsx +3 -3
- package/src/components/resources/renderers/ConfigAuditReportRenderer.tsx +2 -2
- package/src/components/resources/renderers/ContourHTTPProxyRenderer.tsx +1 -1
- package/src/components/resources/renderers/EventRenderer.tsx +1 -1
- package/src/components/resources/renderers/ExposedSecretReportRenderer.tsx +2 -2
- package/src/components/resources/renderers/ExternalSecretRenderer.tsx +2 -2
- package/src/components/resources/renderers/FluxHelmReleaseRenderer.tsx +1 -1
- package/src/components/resources/renderers/GRPCRouteRenderer.tsx +5 -5
- package/src/components/resources/renderers/GatewayClassRenderer.tsx +1 -1
- package/src/components/resources/renderers/GatewayRenderer.tsx +3 -3
- package/src/components/resources/renderers/GenericRenderer.tsx +1 -1
- package/src/components/resources/renderers/HPARenderer.tsx +1 -1
- package/src/components/resources/renderers/HTTPRouteRenderer.tsx +5 -5
- package/src/components/resources/renderers/HelmRepositoryRenderer.tsx +1 -1
- package/src/components/resources/renderers/IngressClassRenderer.tsx +1 -1
- package/src/components/resources/renderers/IngressRenderer.tsx +1 -1
- package/src/components/resources/renderers/IstioAuthorizationPolicyRenderer.tsx +10 -10
- package/src/components/resources/renderers/IstioDestinationRuleRenderer.tsx +1 -1
- package/src/components/resources/renderers/IstioGatewayRenderer.tsx +2 -2
- package/src/components/resources/renderers/IstioPeerAuthenticationRenderer.tsx +2 -2
- package/src/components/resources/renderers/IstioServiceEntryRenderer.tsx +6 -6
- package/src/components/resources/renderers/IstioVirtualServiceRenderer.tsx +5 -5
- package/src/components/resources/renderers/KarpenterEC2NodeClassRenderer.tsx +5 -5
- package/src/components/resources/renderers/KarpenterNodeClaimRenderer.tsx +2 -2
- package/src/components/resources/renderers/KarpenterNodePoolRenderer.tsx +4 -4
- package/src/components/resources/renderers/KedaScaledJobRenderer.tsx +3 -3
- package/src/components/resources/renderers/KedaScaledObjectRenderer.tsx +3 -3
- package/src/components/resources/renderers/KedaTriggerAuthRenderer.tsx +5 -5
- package/src/components/resources/renderers/KnativeConfigurationRenderer.tsx +2 -2
- package/src/components/resources/renderers/KnativeEventingRenderer.tsx +5 -5
- package/src/components/resources/renderers/KnativeFlowRenderer.tsx +4 -4
- package/src/components/resources/renderers/KnativeNetworkingRenderer.tsx +8 -8
- package/src/components/resources/renderers/KnativeRevisionRenderer.tsx +3 -3
- package/src/components/resources/renderers/KnativeRouteRenderer.tsx +1 -1
- package/src/components/resources/renderers/KnativeServiceRenderer.tsx +2 -2
- package/src/components/resources/renderers/KnativeSourceRenderer.tsx +6 -6
- package/src/components/resources/renderers/KustomizationRenderer.tsx +1 -1
- package/src/components/resources/renderers/KyvernoPolicyReportRenderer.tsx +4 -4
- package/src/components/resources/renderers/NetworkPolicyRenderer.tsx +6 -6
- package/src/components/resources/renderers/NodeRenderer.tsx +5 -5
- package/src/components/resources/renderers/OrderRenderer.tsx +3 -3
- package/src/components/resources/renderers/PersistentVolumeRenderer.tsx +1 -1
- package/src/components/resources/renderers/PodDisruptionBudgetRenderer.tsx +1 -1
- package/src/components/resources/renderers/PodMonitorRenderer.tsx +3 -3
- package/src/components/resources/renderers/PodRenderer.tsx +10 -10
- package/src/components/resources/renderers/PrometheusRuleRenderer.tsx +2 -2
- package/src/components/resources/renderers/RoleBindingRenderer.tsx +3 -3
- package/src/components/resources/renderers/RoleRenderer.tsx +8 -8
- package/src/components/resources/renderers/RolloutRenderer.tsx +1 -1
- package/src/components/resources/renderers/RuntimeClassRenderer.tsx +2 -2
- package/src/components/resources/renderers/SealedSecretRenderer.tsx +2 -2
- package/src/components/resources/renderers/SecretRenderer.tsx +3 -3
- package/src/components/resources/renderers/ServiceAccountRenderer.tsx +1 -1
- package/src/components/resources/renderers/ServiceMonitorRenderer.tsx +3 -3
- package/src/components/resources/renderers/ServiceRenderer.tsx +1 -1
- package/src/components/resources/renderers/SimpleRouteRenderer.tsx +5 -5
- package/src/components/resources/renderers/StorageClassRenderer.tsx +1 -1
- package/src/components/resources/renderers/TraefikIngressRouteRenderer.tsx +1 -1
- package/src/components/resources/renderers/VPARenderer.tsx +2 -2
- package/src/components/resources/renderers/VeleroBSLRenderer.tsx +2 -2
- package/src/components/resources/renderers/VeleroBackupRenderer.tsx +6 -6
- package/src/components/resources/renderers/VeleroRestoreRenderer.tsx +5 -5
- package/src/components/resources/renderers/VeleroScheduleRenderer.tsx +6 -6
- package/src/components/resources/renderers/VeleroVSLRenderer.tsx +1 -1
- package/src/components/resources/renderers/WebhookConfigRenderer.tsx +10 -10
- package/src/components/resources/renderers/WorkflowRenderer.tsx +2 -2
- package/src/components/resources/renderers/WorkflowTemplateRenderer.tsx +2 -2
- package/src/components/resources/renderers/WorkloadRenderer.tsx +1 -1
- package/src/components/resources/renderers/argo-cells.tsx +3 -3
- package/src/components/resources/renderers/certmanager-cells.tsx +6 -6
- package/src/components/resources/renderers/cnpg-cells.tsx +5 -5
- package/src/components/resources/renderers/eso-cells.tsx +4 -4
- package/src/components/resources/renderers/flux-cells.tsx +6 -6
- package/src/components/resources/renderers/istio-cells.tsx +9 -9
- package/src/components/resources/renderers/karpenter-cells.tsx +3 -3
- package/src/components/resources/renderers/keda-cells.tsx +2 -2
- package/src/components/resources/renderers/knative-cells.tsx +2 -2
- package/src/components/resources/renderers/kyverno-cells.tsx +3 -3
- package/src/components/resources/renderers/prometheus-cells.tsx +3 -3
- package/src/components/resources/renderers/trivy-cells.tsx +4 -4
- package/src/components/resources/renderers/velero-cells.tsx +4 -4
- package/src/components/shared/EditableYamlView.tsx +1 -1
- package/src/components/shared/ResourceActionsBar.tsx +17 -17
- package/src/components/shared/ResourceRendererDispatch.tsx +8 -7
- package/src/components/timeline/DiffViewer.tsx +131 -0
- package/src/components/timeline/TimelineList.tsx +817 -0
- package/src/components/timeline/index.ts +2 -0
- package/src/components/topology/GroupNode.tsx +189 -79
- package/src/components/topology/K8sResourceNode.tsx +5 -5
- package/src/components/topology/TopologyControls.tsx +2 -2
- package/src/components/topology/TopologyGraph.tsx +362 -62
- package/src/components/topology/layout.ts +288 -92
- package/src/components/topology/topology.css +112 -1
- package/src/components/ui/Badge.tsx +178 -0
- package/src/components/ui/HealthRing.tsx +70 -35
- package/src/components/ui/MetricsChart.tsx +2 -2
- package/src/components/ui/Toast.tsx +74 -27
- package/src/components/ui/drawer-components.tsx +12 -31
- package/src/components/workload/ResourceDetailDrawer.tsx +4 -4
- package/src/components/workload/WorkloadView.tsx +10 -10
- package/src/theme/components.css +195 -0
- package/src/theme/tailwind-theme.css +13 -13
- package/src/theme/variables.css +46 -29
- package/src/types/core.ts +41 -0
- package/src/utils/badge-colors.ts +54 -205
- package/src/utils/download.ts +18 -3
- package/src/utils/log-format.ts +0 -8
- package/tsconfig.json +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { clsx } from 'clsx'
|
|
2
|
+
import { SEVERITY_BADGE } from '../../utils/badge-colors'
|
|
2
3
|
import {
|
|
3
4
|
getPodStatus,
|
|
4
5
|
getWorkloadStatus,
|
|
@@ -550,9 +551,9 @@ export function getResourceStatus(kind: string, data: any): { text: string; colo
|
|
|
550
551
|
// Contour HTTPProxy
|
|
551
552
|
if (k === 'httpproxies') {
|
|
552
553
|
const s = getHTTPProxyStatus(data)
|
|
553
|
-
if (s.status === 'healthy') return { text: s.label, color:
|
|
554
|
-
if (s.status === 'unhealthy') return { text: s.label, color:
|
|
555
|
-
if (s.status === 'degraded') return { text: s.label, color:
|
|
554
|
+
if (s.status === 'healthy') return { text: s.label, color: SEVERITY_BADGE.success }
|
|
555
|
+
if (s.status === 'unhealthy') return { text: s.label, color: SEVERITY_BADGE.error }
|
|
556
|
+
if (s.status === 'degraded') return { text: s.label, color: SEVERITY_BADGE.warning }
|
|
556
557
|
return null
|
|
557
558
|
}
|
|
558
559
|
|
|
@@ -587,9 +588,9 @@ export function getResourceStatus(kind: string, data: any): { text: string; colo
|
|
|
587
588
|
const isWarning = warningPhases.includes(phase)
|
|
588
589
|
return {
|
|
589
590
|
text: phase,
|
|
590
|
-
color: isHealthy ?
|
|
591
|
-
isWarning ?
|
|
592
|
-
|
|
591
|
+
color: isHealthy ? SEVERITY_BADGE.success :
|
|
592
|
+
isWarning ? SEVERITY_BADGE.warning :
|
|
593
|
+
SEVERITY_BADGE.error
|
|
593
594
|
}
|
|
594
595
|
}
|
|
595
596
|
|
|
@@ -601,7 +602,7 @@ export function getResourceStatus(kind: string, data: any): { text: string; colo
|
|
|
601
602
|
const isReady = readyCondition.status === 'True'
|
|
602
603
|
return {
|
|
603
604
|
text: isReady ? 'Ready' : 'Not Ready',
|
|
604
|
-
color: isReady ?
|
|
605
|
+
color: isReady ? SEVERITY_BADGE.success : SEVERITY_BADGE.warning
|
|
605
606
|
}
|
|
606
607
|
}
|
|
607
608
|
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { memo } from 'react'
|
|
2
|
+
import { clsx } from 'clsx'
|
|
3
|
+
import { ArrowRight, Plus, Minus, RefreshCw } from 'lucide-react'
|
|
4
|
+
import type { DiffInfo, FieldChange } from '../../types'
|
|
5
|
+
|
|
6
|
+
interface DiffViewerProps {
|
|
7
|
+
diff: DiffInfo
|
|
8
|
+
compact?: boolean
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const DiffViewer = memo(function DiffViewer({ diff, compact = false }: DiffViewerProps) {
|
|
12
|
+
if (!diff || diff.fields.length === 0) {
|
|
13
|
+
return null
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (compact) {
|
|
17
|
+
return (
|
|
18
|
+
<div className="text-xs text-theme-text-secondary flex items-center gap-1">
|
|
19
|
+
<RefreshCw className="w-3 h-3" />
|
|
20
|
+
<span>{diff.summary || `${diff.fields.length} field(s) changed`}</span>
|
|
21
|
+
</div>
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<div className="space-y-2">
|
|
27
|
+
{/* Summary */}
|
|
28
|
+
{diff.summary && (
|
|
29
|
+
<div className="text-sm font-medium text-theme-text-secondary flex items-center gap-2">
|
|
30
|
+
<RefreshCw className="w-4 h-4 text-blue-400" />
|
|
31
|
+
{diff.summary}
|
|
32
|
+
</div>
|
|
33
|
+
)}
|
|
34
|
+
|
|
35
|
+
{/* Field changes */}
|
|
36
|
+
<div className="space-y-1.5">
|
|
37
|
+
{diff.fields.map((field, idx) => (
|
|
38
|
+
<FieldChangeRow key={`${field.path}-${idx}`} field={field} />
|
|
39
|
+
))}
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
)
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
interface FieldChangeRowProps {
|
|
46
|
+
field: FieldChange
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function FieldChangeRow({ field }: FieldChangeRowProps) {
|
|
50
|
+
const isAdded = field.oldValue === null || field.oldValue === undefined
|
|
51
|
+
const isRemoved = field.newValue === null || field.newValue === undefined
|
|
52
|
+
const isModified = !isAdded && !isRemoved
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
<div className="rounded bg-theme-surface/50 border border-theme-border px-3 py-2">
|
|
56
|
+
{/* Field path */}
|
|
57
|
+
<div className="text-xs font-mono text-theme-text-tertiary mb-1">{field.path}</div>
|
|
58
|
+
|
|
59
|
+
{/* Values */}
|
|
60
|
+
<div className="flex items-center gap-2 text-sm">
|
|
61
|
+
{isAdded ? (
|
|
62
|
+
<>
|
|
63
|
+
<Plus className="w-3.5 h-3.5 text-green-400 shrink-0" />
|
|
64
|
+
<span className="text-green-400">
|
|
65
|
+
{formatValue(field.newValue)}
|
|
66
|
+
</span>
|
|
67
|
+
</>
|
|
68
|
+
) : isRemoved ? (
|
|
69
|
+
<>
|
|
70
|
+
<Minus className="w-3.5 h-3.5 text-red-400 shrink-0" />
|
|
71
|
+
<span className="text-red-400 line-through">
|
|
72
|
+
{formatValue(field.oldValue)}
|
|
73
|
+
</span>
|
|
74
|
+
</>
|
|
75
|
+
) : isModified ? (
|
|
76
|
+
<>
|
|
77
|
+
<span className="text-red-400 line-through">
|
|
78
|
+
{formatValue(field.oldValue)}
|
|
79
|
+
</span>
|
|
80
|
+
<ArrowRight className="w-3.5 h-3.5 text-theme-text-tertiary shrink-0" />
|
|
81
|
+
<span className="text-green-400">
|
|
82
|
+
{formatValue(field.newValue)}
|
|
83
|
+
</span>
|
|
84
|
+
</>
|
|
85
|
+
) : null}
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function formatValue(value: unknown): string {
|
|
92
|
+
if (value === null || value === undefined) {
|
|
93
|
+
return 'null'
|
|
94
|
+
}
|
|
95
|
+
if (typeof value === 'object') {
|
|
96
|
+
try {
|
|
97
|
+
const str = JSON.stringify(value)
|
|
98
|
+
// Truncate long values
|
|
99
|
+
if (str.length > 100) {
|
|
100
|
+
return str.slice(0, 97) + '...'
|
|
101
|
+
}
|
|
102
|
+
return str
|
|
103
|
+
} catch {
|
|
104
|
+
return String(value)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return String(value)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Inline diff badge for use in event cards
|
|
111
|
+
interface DiffBadgeProps {
|
|
112
|
+
diff: DiffInfo
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export const DiffBadge = memo(function DiffBadge({ diff }: DiffBadgeProps) {
|
|
116
|
+
if (!diff || !diff.summary) {
|
|
117
|
+
return null
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return (
|
|
121
|
+
<span
|
|
122
|
+
className={clsx(
|
|
123
|
+
'badge',
|
|
124
|
+
'bg-skyhook-500/10 text-skyhook-400 border border-skyhook-500/20'
|
|
125
|
+
)}
|
|
126
|
+
>
|
|
127
|
+
<RefreshCw className="w-3 h-3" />
|
|
128
|
+
{diff.summary}
|
|
129
|
+
</span>
|
|
130
|
+
)
|
|
131
|
+
})
|