mirror of
https://github.com/henrygd/beszel.git
synced 2025-12-08 12:35:31 +00:00
Compare commits
1 Commits
top-proces
...
928-contai
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
40165dca32 |
198
agent/docker.go
198
agent/docker.go
@@ -25,6 +25,16 @@ const (
|
||||
dockerTimeoutMs = 2100
|
||||
// Maximum realistic network speed (5 GB/s) to detect bad deltas
|
||||
maxNetworkSpeedBps uint64 = 5e9
|
||||
// Container and health constants
|
||||
composeProjectLabel = "com.docker.compose.project"
|
||||
healthStatusNone = "none"
|
||||
containerStateRunning = "running"
|
||||
containerStateUnknown = "unknown"
|
||||
volumeTypeVolume = "volume"
|
||||
diskOpRead = "read"
|
||||
diskOpReadCap = "Read"
|
||||
diskOpWrite = "write"
|
||||
diskOpWriteCap = "Write"
|
||||
// Maximum conceivable memory usage of a container (100TB) to detect bad memory stats
|
||||
maxMemoryUsage uint64 = 100 * 1024 * 1024 * 1024 * 1024
|
||||
)
|
||||
@@ -42,6 +52,8 @@ type dockerManager struct {
|
||||
buf *bytes.Buffer // Buffer to store and read response bodies
|
||||
decoder *json.Decoder // Reusable JSON decoder that reads from buf
|
||||
apiStats *container.ApiStats // Reusable API stats object
|
||||
volumeSizeCache map[string]float64 // Cached volume sizes (name -> size in MB)
|
||||
volumeSizeUpdated time.Time // Last time volume sizes were updated
|
||||
|
||||
// Cache-time-aware tracking for CPU stats (similar to cpu.go)
|
||||
// Maps cache time intervals to container-specific CPU usage tracking
|
||||
@@ -53,6 +65,11 @@ type dockerManager struct {
|
||||
// cacheTimeMs -> DeltaTracker for network bytes sent/received
|
||||
networkSentTrackers map[uint16]*deltatracker.DeltaTracker[string, uint64]
|
||||
networkRecvTrackers map[uint16]*deltatracker.DeltaTracker[string, uint64]
|
||||
|
||||
// Disk I/O delta trackers - one per cache time to avoid interference
|
||||
// cacheTimeMs -> DeltaTracker for disk bytes read/written
|
||||
diskReadTrackers map[uint16]*deltatracker.DeltaTracker[string, uint64]
|
||||
diskWriteTrackers map[uint16]*deltatracker.DeltaTracker[string, uint64]
|
||||
}
|
||||
|
||||
// userAgentRoundTripper is a custom http.RoundTripper that adds a User-Agent header to all requests
|
||||
@@ -159,8 +176,9 @@ func (dm *dockerManager) getDockerStats(cacheTimeMs uint16) ([]*container.Stats,
|
||||
}
|
||||
}
|
||||
|
||||
// prepare network trackers for next interval for this cache time
|
||||
// prepare network and disk trackers for next interval for this cache time
|
||||
dm.cycleNetworkDeltasForCacheTime(cacheTimeMs)
|
||||
dm.cycleDiskDeltasForCacheTime(cacheTimeMs)
|
||||
|
||||
return stats, nil
|
||||
}
|
||||
@@ -239,6 +257,32 @@ func (dm *dockerManager) cycleNetworkDeltasForCacheTime(cacheTimeMs uint16) {
|
||||
}
|
||||
}
|
||||
|
||||
// getDiskTracker returns the DeltaTracker for disk I/O for a specific cache time, creating it if needed
|
||||
func (dm *dockerManager) getDiskTracker(cacheTimeMs uint16, isRead bool) *deltatracker.DeltaTracker[string, uint64] {
|
||||
var trackers map[uint16]*deltatracker.DeltaTracker[string, uint64]
|
||||
if isRead {
|
||||
trackers = dm.diskReadTrackers
|
||||
} else {
|
||||
trackers = dm.diskWriteTrackers
|
||||
}
|
||||
|
||||
if trackers[cacheTimeMs] == nil {
|
||||
trackers[cacheTimeMs] = deltatracker.NewDeltaTracker[string, uint64]()
|
||||
}
|
||||
|
||||
return trackers[cacheTimeMs]
|
||||
}
|
||||
|
||||
// cycleDiskDeltasForCacheTime cycles the disk delta trackers for a specific cache time
|
||||
func (dm *dockerManager) cycleDiskDeltasForCacheTime(cacheTimeMs uint16) {
|
||||
if dm.diskReadTrackers[cacheTimeMs] != nil {
|
||||
dm.diskReadTrackers[cacheTimeMs].Cycle()
|
||||
}
|
||||
if dm.diskWriteTrackers[cacheTimeMs] != nil {
|
||||
dm.diskWriteTrackers[cacheTimeMs].Cycle()
|
||||
}
|
||||
}
|
||||
|
||||
// calculateNetworkStats calculates network sent/receive deltas using DeltaTracker
|
||||
func (dm *dockerManager) calculateNetworkStats(ctr *container.ApiInfo, apiStats *container.ApiStats, stats *container.Stats, initialized bool, name string, cacheTimeMs uint16) (uint64, uint64) {
|
||||
var total_sent, total_recv uint64
|
||||
@@ -284,6 +328,50 @@ func (dm *dockerManager) calculateNetworkStats(ctr *container.ApiInfo, apiStats
|
||||
return sent_delta, recv_delta
|
||||
}
|
||||
|
||||
// calculateDiskStats calculates disk read/write deltas using DeltaTracker
|
||||
func (dm *dockerManager) calculateDiskStats(ctr *container.ApiInfo, apiStats *container.ApiStats, stats *container.Stats, initialized bool, cacheTimeMs uint16) (uint64, uint64) {
|
||||
var total_read, total_write uint64
|
||||
for _, entry := range apiStats.BlkioStats.IoServiceBytesRecursive {
|
||||
switch entry.Op {
|
||||
case diskOpRead, diskOpReadCap:
|
||||
total_read += entry.Value
|
||||
case diskOpWrite, diskOpWriteCap:
|
||||
total_write += entry.Value
|
||||
}
|
||||
}
|
||||
|
||||
// Get the DeltaTracker for this specific cache time
|
||||
readTracker := dm.getDiskTracker(cacheTimeMs, true)
|
||||
writeTracker := dm.getDiskTracker(cacheTimeMs, false)
|
||||
|
||||
// Set current values in the cache-time-specific DeltaTracker
|
||||
readTracker.Set(ctr.IdShort, total_read)
|
||||
writeTracker.Set(ctr.IdShort, total_write)
|
||||
|
||||
// Get deltas (bytes since last measurement)
|
||||
read_delta_raw := readTracker.Delta(ctr.IdShort)
|
||||
write_delta_raw := writeTracker.Delta(ctr.IdShort)
|
||||
|
||||
// Calculate bytes per second if we have previous data
|
||||
var read_delta, write_delta uint64
|
||||
if initialized {
|
||||
millisecondsElapsed := uint64(time.Since(stats.PrevReadTime).Milliseconds())
|
||||
if millisecondsElapsed > 0 {
|
||||
if read_delta_raw > 0 {
|
||||
read_delta = read_delta_raw * 1000 / millisecondsElapsed
|
||||
}
|
||||
if write_delta_raw > 0 {
|
||||
write_delta = write_delta_raw * 1000 / millisecondsElapsed
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Store current disk values for legacy compatibility
|
||||
stats.PrevDisk.Read, stats.PrevDisk.Write = total_read, total_write
|
||||
|
||||
return read_delta, write_delta
|
||||
}
|
||||
|
||||
// validateCpuPercentage checks if CPU percentage is within valid range
|
||||
func validateCpuPercentage(cpuPct float64, containerName string) error {
|
||||
if cpuPct > 100 {
|
||||
@@ -293,11 +381,13 @@ func validateCpuPercentage(cpuPct float64, containerName string) error {
|
||||
}
|
||||
|
||||
// updateContainerStatsValues updates the final stats values
|
||||
func updateContainerStatsValues(stats *container.Stats, cpuPct float64, usedMemory uint64, sent_delta, recv_delta uint64, readTime time.Time) {
|
||||
func updateContainerStatsValues(stats *container.Stats, cpuPct float64, usedMemory uint64, sent_delta, recv_delta, read_delta, write_delta uint64, readTime time.Time) {
|
||||
stats.Cpu = twoDecimals(cpuPct)
|
||||
stats.Mem = bytesToMegabytes(float64(usedMemory))
|
||||
stats.NetworkSent = bytesToMegabytes(float64(sent_delta))
|
||||
stats.NetworkRecv = bytesToMegabytes(float64(recv_delta))
|
||||
stats.DiskRead = bytesToMegabytes(float64(read_delta))
|
||||
stats.DiskWrite = bytesToMegabytes(float64(write_delta))
|
||||
stats.PrevReadTime = readTime
|
||||
}
|
||||
|
||||
@@ -320,11 +410,64 @@ func (dm *dockerManager) updateContainerStats(ctr *container.ApiInfo, cacheTimeM
|
||||
dm.containerStatsMap[ctr.IdShort] = stats
|
||||
}
|
||||
|
||||
// Update name in case it changed
|
||||
stats.Name = name
|
||||
|
||||
// Set container metadata
|
||||
stats.IdShort = ctr.IdShort
|
||||
stats.Status = ctr.State
|
||||
if stats.Status == "" {
|
||||
stats.Status = containerStateUnknown
|
||||
}
|
||||
|
||||
// Set health status
|
||||
stats.Health = healthStatusNone
|
||||
if ctr.Health != "" {
|
||||
stats.Health = ctr.Health
|
||||
}
|
||||
|
||||
// Set Docker Compose project name
|
||||
if ctr.Labels != nil {
|
||||
if projectName, exists := ctr.Labels[composeProjectLabel]; exists {
|
||||
stats.Project = projectName
|
||||
}
|
||||
}
|
||||
|
||||
// Calculate uptime for running containers
|
||||
if ctr.StartedAt > 0 && stats.Status == containerStateRunning {
|
||||
startedTime := time.Unix(ctr.StartedAt, 0)
|
||||
stats.Uptime = twoDecimals(time.Since(startedTime).Seconds())
|
||||
} else {
|
||||
stats.Uptime = 0
|
||||
}
|
||||
|
||||
// Collect volume information and fetch sizes
|
||||
volumeCount := 0
|
||||
for _, mount := range ctr.Mounts {
|
||||
if mount.Type == volumeTypeVolume && mount.Name != "" {
|
||||
volumeCount++
|
||||
}
|
||||
}
|
||||
if volumeCount > 0 {
|
||||
stats.Volumes = make(map[string]float64, volumeCount)
|
||||
for _, mount := range ctr.Mounts {
|
||||
if mount.Type == volumeTypeVolume && mount.Name != "" {
|
||||
// Fetch volume size using Docker system df API
|
||||
size := dm.getVolumeSize(mount.Name)
|
||||
stats.Volumes[mount.Name] = size
|
||||
}
|
||||
}
|
||||
} else {
|
||||
stats.Volumes = nil
|
||||
}
|
||||
|
||||
// reset current stats
|
||||
stats.Cpu = 0
|
||||
stats.Mem = 0
|
||||
stats.NetworkSent = 0
|
||||
stats.NetworkRecv = 0
|
||||
stats.DiskRead = 0
|
||||
stats.DiskWrite = 0
|
||||
|
||||
res := dm.apiStats
|
||||
res.Networks = nil
|
||||
@@ -374,8 +517,11 @@ func (dm *dockerManager) updateContainerStats(ctr *container.ApiInfo, cacheTimeM
|
||||
}
|
||||
stats.PrevNet.Sent, stats.PrevNet.Recv = total_sent, total_recv
|
||||
|
||||
// Calculate disk I/O stats using DeltaTracker
|
||||
read_delta, write_delta := dm.calculateDiskStats(ctr, res, stats, initialized, cacheTimeMs)
|
||||
|
||||
// Update final stats values
|
||||
updateContainerStatsValues(stats, cpuPct, usedMemory, sent_delta, recv_delta, res.Read)
|
||||
updateContainerStatsValues(stats, cpuPct, usedMemory, sent_delta, recv_delta, read_delta, write_delta, res.Read)
|
||||
// store per-cache-time read time for Windows CPU percent calc
|
||||
dm.lastCpuReadTime[cacheTimeMs][ctr.IdShort] = res.Read
|
||||
|
||||
@@ -460,6 +606,7 @@ func newDockerManager(a *Agent) *dockerManager {
|
||||
sem: make(chan struct{}, 5),
|
||||
apiContainerList: []*container.ApiInfo{},
|
||||
apiStats: &container.ApiStats{},
|
||||
volumeSizeCache: make(map[string]float64),
|
||||
|
||||
// Initialize cache-time-aware tracking structures
|
||||
lastCpuContainer: make(map[uint16]map[string]uint64),
|
||||
@@ -467,6 +614,8 @@ func newDockerManager(a *Agent) *dockerManager {
|
||||
lastCpuReadTime: make(map[uint16]map[string]time.Time),
|
||||
networkSentTrackers: make(map[uint16]*deltatracker.DeltaTracker[string, uint64]),
|
||||
networkRecvTrackers: make(map[uint16]*deltatracker.DeltaTracker[string, uint64]),
|
||||
diskReadTrackers: make(map[uint16]*deltatracker.DeltaTracker[string, uint64]),
|
||||
diskWriteTrackers: make(map[uint16]*deltatracker.DeltaTracker[string, uint64]),
|
||||
}
|
||||
|
||||
// If using podman, return client
|
||||
@@ -521,6 +670,49 @@ func (dm *dockerManager) checkDockerVersion() {
|
||||
}
|
||||
}
|
||||
|
||||
// getVolumeSize returns the cached size of a Docker volume
|
||||
// Refreshes the cache every 5 minutes using the system df API
|
||||
// Returns size in MB (megabytes)
|
||||
func (dm *dockerManager) getVolumeSize(volumeName string) float64 {
|
||||
// Refresh cache if older than 5 minutes
|
||||
if time.Since(dm.volumeSizeUpdated) > 5*time.Minute {
|
||||
dm.refreshVolumeSizes()
|
||||
}
|
||||
|
||||
return dm.volumeSizeCache[volumeName]
|
||||
}
|
||||
|
||||
// refreshVolumeSizes fetches all volume sizes from Docker and updates the cache
|
||||
func (dm *dockerManager) refreshVolumeSizes() {
|
||||
type volumeInfo struct {
|
||||
Name string
|
||||
UsageData struct {
|
||||
Size int64
|
||||
}
|
||||
}
|
||||
type systemDfResponse struct {
|
||||
Volumes []volumeInfo
|
||||
}
|
||||
|
||||
resp, err := dm.client.Get("http://localhost/system/df")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
var dfData systemDfResponse
|
||||
if err := dm.decode(resp, &dfData); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// Update all volume sizes in cache
|
||||
for _, vol := range dfData.Volumes {
|
||||
// Convert bytes to MB (megabytes)
|
||||
dm.volumeSizeCache[vol.Name] = float64(vol.UsageData.Size) / 1_000_000
|
||||
}
|
||||
|
||||
dm.volumeSizeUpdated = time.Now()
|
||||
}
|
||||
|
||||
// Decodes Docker API JSON response using a reusable buffer and decoder. Not thread safe.
|
||||
func (dm *dockerManager) decode(resp *http.Response, d any) error {
|
||||
if dm.buf == nil {
|
||||
|
||||
@@ -4,25 +4,29 @@ import "time"
|
||||
|
||||
// Docker container info from /containers/json
|
||||
type ApiInfo struct {
|
||||
Id string
|
||||
IdShort string
|
||||
Names []string
|
||||
Status string
|
||||
Id string
|
||||
IdShort string
|
||||
Names []string
|
||||
Status string
|
||||
Health string `json:"Health,omitempty"` // Container health status
|
||||
Created int64 `json:"Created,omitempty"` // Container creation timestamp
|
||||
StartedAt int64 `json:"StartedAt,omitempty"` // Container start timestamp
|
||||
FinishedAt int64 `json:"FinishedAt,omitempty"` // Container finish timestamp
|
||||
State string `json:"State,omitempty"` // Container state (running, stopped, etc.)
|
||||
// Image string
|
||||
// ImageID string
|
||||
// Command string
|
||||
// Created int64
|
||||
// Ports []Port
|
||||
// SizeRw int64 `json:",omitempty"`
|
||||
// SizeRootFs int64 `json:",omitempty"`
|
||||
// Labels map[string]string
|
||||
Labels map[string]string
|
||||
// State string
|
||||
// HostConfig struct {
|
||||
// NetworkMode string `json:",omitempty"`
|
||||
// Annotations map[string]string `json:",omitempty"`
|
||||
// }
|
||||
// NetworkSettings *SummaryNetworkSettings
|
||||
// Mounts []MountPoint
|
||||
Mounts []MountPoint
|
||||
}
|
||||
|
||||
// Docker container resources from /containers/{id}/stats
|
||||
@@ -32,6 +36,7 @@ type ApiStats struct {
|
||||
Networks map[string]NetworkStats
|
||||
CPUStats CPUStats `json:"cpu_stats"`
|
||||
MemoryStats MemoryStats `json:"memory_stats"`
|
||||
BlkioStats BlkioStats `json:"blkio_stats"`
|
||||
}
|
||||
|
||||
func (s *ApiStats) CalculateCpuPercentLinux(prevCpuContainer uint64, prevCpuSystem uint64) float64 {
|
||||
@@ -98,21 +103,58 @@ type NetworkStats struct {
|
||||
TxBytes uint64 `json:"tx_bytes"`
|
||||
}
|
||||
|
||||
type BlkioStats struct {
|
||||
IoServiceBytesRecursive []BlkioStatEntry `json:"io_service_bytes_recursive"`
|
||||
IoServicedRecursive []BlkioStatEntry `json:"io_serviced_recursive"`
|
||||
}
|
||||
|
||||
type BlkioStatEntry struct {
|
||||
Major uint64 `json:"major"`
|
||||
Minor uint64 `json:"minor"`
|
||||
Op string `json:"op"`
|
||||
Value uint64 `json:"value"`
|
||||
}
|
||||
|
||||
type prevNetStats struct {
|
||||
Sent uint64
|
||||
Recv uint64
|
||||
}
|
||||
|
||||
type prevDiskStats struct {
|
||||
Read uint64
|
||||
Write uint64
|
||||
}
|
||||
|
||||
// Docker container stats
|
||||
type Stats struct {
|
||||
Name string `json:"n" cbor:"0,keyasint"`
|
||||
Cpu float64 `json:"c" cbor:"1,keyasint"`
|
||||
Mem float64 `json:"m" cbor:"2,keyasint"`
|
||||
NetworkSent float64 `json:"ns" cbor:"3,keyasint"`
|
||||
NetworkRecv float64 `json:"nr" cbor:"4,keyasint"`
|
||||
// PrevCpu [2]uint64 `json:"-"`
|
||||
CpuSystem uint64 `json:"-"`
|
||||
CpuContainer uint64 `json:"-"`
|
||||
PrevNet prevNetStats `json:"-"`
|
||||
PrevReadTime time.Time `json:"-"`
|
||||
Name string `json:"n" cbor:"0,keyasint"`
|
||||
Cpu float64 `json:"c" cbor:"1,keyasint"`
|
||||
Mem float64 `json:"m" cbor:"2,keyasint"`
|
||||
NetworkSent float64 `json:"ns" cbor:"3,keyasint"`
|
||||
NetworkRecv float64 `json:"nr" cbor:"4,keyasint"`
|
||||
DiskRead float64 `json:"dr" cbor:"5,keyasint"` // Disk read rate in MB/s
|
||||
DiskWrite float64 `json:"dw" cbor:"6,keyasint"` // Disk write rate in MB/s
|
||||
Volumes map[string]float64 `json:"v,omitempty" cbor:"7,keyasint"` // Volume name to size mapping
|
||||
Health string `json:"h,omitempty" cbor:"8,keyasint"` // Container health status
|
||||
Status string `json:"s,omitempty" cbor:"9,keyasint"` // Container status (running, stopped, etc.)
|
||||
Uptime float64 `json:"u,omitempty" cbor:"10,keyasint"` // Container uptime in seconds
|
||||
Project string `json:"p,omitempty" cbor:"11,keyasint"` // Docker Compose project name
|
||||
IdShort string `json:"idShort,omitempty" cbor:"12,keyasint"` // Container short ID for frontend
|
||||
CpuSystem uint64 `json:"-"`
|
||||
CpuContainer uint64 `json:"-"`
|
||||
PrevNet prevNetStats `json:"-"`
|
||||
PrevDisk prevDiskStats `json:"-"`
|
||||
PrevReadTime time.Time `json:"-"`
|
||||
}
|
||||
|
||||
// MountPoint represents a mount point in a container
|
||||
type MountPoint struct {
|
||||
Type string `json:"Type"`
|
||||
Name string `json:"Name"`
|
||||
Source string `json:"Source"`
|
||||
Destination string `json:"Destination"`
|
||||
Driver string `json:"Driver,omitempty"`
|
||||
Mode string `json:"Mode"`
|
||||
RW bool `json:"RW"`
|
||||
Propagation string `json:"Propagation"`
|
||||
}
|
||||
|
||||
@@ -414,6 +414,8 @@ func (rm *RecordManager) AverageContainerStats(db dbx.Builder, records RecordIds
|
||||
sums[stat.Name].Mem += stat.Mem
|
||||
sums[stat.Name].NetworkSent += stat.NetworkSent
|
||||
sums[stat.Name].NetworkRecv += stat.NetworkRecv
|
||||
sums[stat.Name].DiskRead += stat.DiskRead
|
||||
sums[stat.Name].DiskWrite += stat.DiskWrite
|
||||
}
|
||||
}
|
||||
|
||||
@@ -425,6 +427,8 @@ func (rm *RecordManager) AverageContainerStats(db dbx.Builder, records RecordIds
|
||||
Mem: twoDecimals(value.Mem / count),
|
||||
NetworkSent: twoDecimals(value.NetworkSent / count),
|
||||
NetworkRecv: twoDecimals(value.NetworkRecv / count),
|
||||
DiskRead: twoDecimals(value.DiskRead / count),
|
||||
DiskWrite: twoDecimals(value.DiskWrite / count),
|
||||
})
|
||||
}
|
||||
return result
|
||||
|
||||
156
internal/site/package-lock.json
generated
156
internal/site/package-lock.json
generated
@@ -69,7 +69,7 @@
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
|
||||
"integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@jridgewell/gen-mapping": "^0.3.5",
|
||||
@@ -83,7 +83,7 @@
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
|
||||
"integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-validator-identifier": "^7.27.1",
|
||||
@@ -98,7 +98,7 @@
|
||||
"version": "7.28.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz",
|
||||
"integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
@@ -108,7 +108,7 @@
|
||||
"version": "7.28.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz",
|
||||
"integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@ampproject/remapping": "^2.2.0",
|
||||
@@ -139,7 +139,7 @@
|
||||
"version": "7.28.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz",
|
||||
"integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/parser": "^7.28.3",
|
||||
@@ -156,7 +156,7 @@
|
||||
"version": "7.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
|
||||
"integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/compat-data": "^7.27.2",
|
||||
@@ -173,7 +173,7 @@
|
||||
"version": "7.28.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
|
||||
"integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
@@ -183,7 +183,7 @@
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
|
||||
"integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/traverse": "^7.27.1",
|
||||
@@ -197,7 +197,7 @@
|
||||
"version": "7.28.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
|
||||
"integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-module-imports": "^7.27.1",
|
||||
@@ -215,7 +215,7 @@
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
|
||||
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
@@ -225,7 +225,7 @@
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
|
||||
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
@@ -235,7 +235,7 @@
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
|
||||
"integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
@@ -245,7 +245,7 @@
|
||||
"version": "7.28.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz",
|
||||
"integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/template": "^7.27.2",
|
||||
@@ -259,7 +259,7 @@
|
||||
"version": "7.28.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz",
|
||||
"integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/types": "^7.28.2"
|
||||
@@ -287,7 +287,7 @@
|
||||
"version": "7.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
|
||||
"integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/code-frame": "^7.27.1",
|
||||
@@ -302,7 +302,7 @@
|
||||
"version": "7.28.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz",
|
||||
"integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/code-frame": "^7.27.1",
|
||||
@@ -321,7 +321,7 @@
|
||||
"version": "7.28.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz",
|
||||
"integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-string-parser": "^7.27.1",
|
||||
@@ -1020,7 +1020,7 @@
|
||||
"version": "29.6.3",
|
||||
"resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
|
||||
"integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@sinclair/typebox": "^0.27.8"
|
||||
@@ -1033,7 +1033,7 @@
|
||||
"version": "29.6.3",
|
||||
"resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
|
||||
"integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jest/schemas": "^29.6.3",
|
||||
@@ -1051,7 +1051,7 @@
|
||||
"version": "0.3.13",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
|
||||
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/sourcemap-codec": "^1.5.0",
|
||||
@@ -1073,7 +1073,7 @@
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
|
||||
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
@@ -1083,14 +1083,14 @@
|
||||
"version": "1.5.5",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
|
||||
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@jridgewell/trace-mapping": {
|
||||
"version": "0.3.30",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz",
|
||||
"integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/resolve-uri": "^3.1.0",
|
||||
@@ -1111,7 +1111,7 @@
|
||||
"version": "5.4.1",
|
||||
"resolved": "https://registry.npmjs.org/@lingui/babel-plugin-lingui-macro/-/babel-plugin-lingui-macro-5.4.1.tgz",
|
||||
"integrity": "sha512-9IO+PDvdneY8OCI8zvI1oDXpzryTMtyRv7uq9O0U1mFCvIPVd5dWQKQDu/CpgpYAc2+JG/izn5PNl9xzPc6ckw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.20.12",
|
||||
@@ -1331,7 +1331,7 @@
|
||||
"version": "5.4.1",
|
||||
"resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-5.4.1.tgz",
|
||||
"integrity": "sha512-aDkj/bMSr/mCL8Nr1TS52v0GLCuVa4YqtRz+WvUCFZw/ovVInX0hKq1TClx/bSlhu60FzB/CbclxFMBw8aLVUg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.20.13",
|
||||
@@ -2750,7 +2750,7 @@
|
||||
"version": "0.27.8",
|
||||
"resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
|
||||
"integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@swc/core": {
|
||||
@@ -3420,14 +3420,14 @@
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
|
||||
"integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/istanbul-lib-report": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
|
||||
"integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/istanbul-lib-coverage": "*"
|
||||
@@ -3437,7 +3437,7 @@
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
|
||||
"integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/istanbul-lib-report": "*"
|
||||
@@ -3447,7 +3447,7 @@
|
||||
"version": "24.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz",
|
||||
"integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"undici-types": "~7.10.0"
|
||||
@@ -3457,7 +3457,7 @@
|
||||
"version": "19.1.11",
|
||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.11.tgz",
|
||||
"integrity": "sha512-lr3jdBw/BGj49Eps7EvqlUaoeA0xpj3pc0RoJkHpYaCHkVK7i28dKyImLQb3JVlqs3aYSXf7qYuWOW/fgZnTXQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"csstype": "^3.0.2"
|
||||
@@ -3467,7 +3467,7 @@
|
||||
"version": "19.1.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.7.tgz",
|
||||
"integrity": "sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"@types/react": "^19.0.0"
|
||||
@@ -3477,7 +3477,7 @@
|
||||
"version": "17.0.33",
|
||||
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
|
||||
"integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/yargs-parser": "*"
|
||||
@@ -3487,7 +3487,7 @@
|
||||
"version": "21.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
|
||||
"integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@vitejs/plugin-react-swc": {
|
||||
@@ -3524,7 +3524,7 @@
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
||||
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"color-convert": "^2.0.1"
|
||||
@@ -3567,7 +3567,7 @@
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
|
||||
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "Python-2.0"
|
||||
},
|
||||
"node_modules/aria-hidden": {
|
||||
@@ -3662,7 +3662,7 @@
|
||||
"version": "4.25.1",
|
||||
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz",
|
||||
"integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
@@ -3733,7 +3733,7 @@
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
|
||||
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
@@ -3743,7 +3743,7 @@
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
|
||||
"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
@@ -3756,7 +3756,7 @@
|
||||
"version": "1.0.30001727",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz",
|
||||
"integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
@@ -3777,7 +3777,7 @@
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
|
||||
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ansi-styles": "^4.1.0",
|
||||
@@ -3889,7 +3889,7 @@
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"color-name": "~1.1.4"
|
||||
@@ -3902,7 +3902,7 @@
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/colors": {
|
||||
@@ -3919,14 +3919,14 @@
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
|
||||
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/cosmiconfig": {
|
||||
"version": "8.3.6",
|
||||
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
|
||||
"integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"import-fresh": "^3.3.0",
|
||||
@@ -4106,7 +4106,7 @@
|
||||
"version": "4.4.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
|
||||
"integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ms": "^2.1.3"
|
||||
@@ -4176,7 +4176,7 @@
|
||||
"version": "1.5.182",
|
||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.182.tgz",
|
||||
"integrity": "sha512-Lv65Btwv9W4J9pyODI6EWpdnhfvrve/us5h1WspW8B2Fb0366REPtY3hX7ounk1CkV/TBjWCEvCBBbYbmV0qCA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/emoji-regex": {
|
||||
@@ -4204,7 +4204,7 @@
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
|
||||
"integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"is-arrayish": "^0.2.1"
|
||||
@@ -4273,7 +4273,7 @@
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
|
||||
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
@@ -4361,7 +4361,7 @@
|
||||
"version": "1.0.0-beta.2",
|
||||
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
|
||||
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
@@ -4387,7 +4387,7 @@
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
@@ -4418,7 +4418,7 @@
|
||||
"version": "3.3.1",
|
||||
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
|
||||
"integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"parent-module": "^1.0.0",
|
||||
@@ -4461,7 +4461,7 @@
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
||||
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/is-binary-path": {
|
||||
@@ -4554,7 +4554,7 @@
|
||||
"version": "29.6.3",
|
||||
"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
|
||||
"integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
|
||||
@@ -4564,7 +4564,7 @@
|
||||
"version": "29.7.0",
|
||||
"resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
|
||||
"integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jest/types": "^29.6.3",
|
||||
@@ -4582,7 +4582,7 @@
|
||||
"version": "1.21.7",
|
||||
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
|
||||
"integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"jiti": "bin/jiti.js"
|
||||
@@ -4604,7 +4604,7 @@
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
|
||||
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"argparse": "^2.0.1"
|
||||
@@ -4617,7 +4617,7 @@
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
|
||||
"integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"jsesc": "bin/jsesc"
|
||||
@@ -4630,14 +4630,14 @@
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
|
||||
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/json5": {
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"json5": "lib/cli.js"
|
||||
@@ -4650,7 +4650,7 @@
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
|
||||
"integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
@@ -4899,7 +4899,7 @@
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
|
||||
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lodash": {
|
||||
@@ -4948,7 +4948,7 @@
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
|
||||
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"yallist": "^3.0.2"
|
||||
@@ -5059,7 +5059,7 @@
|
||||
"version": "2.1.3",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
||||
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/nanoid": {
|
||||
@@ -5100,7 +5100,7 @@
|
||||
"version": "2.0.19",
|
||||
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
|
||||
"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/normalize-path": {
|
||||
@@ -5196,7 +5196,7 @@
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
|
||||
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"callsites": "^3.0.0"
|
||||
@@ -5209,7 +5209,7 @@
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
|
||||
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/code-frame": "^7.0.0",
|
||||
@@ -5238,7 +5238,7 @@
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
|
||||
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
@@ -5248,7 +5248,7 @@
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
|
||||
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/picomatch": {
|
||||
@@ -5310,7 +5310,7 @@
|
||||
"version": "29.7.0",
|
||||
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
|
||||
"integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jest/schemas": "^29.6.3",
|
||||
@@ -5325,7 +5325,7 @@
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
|
||||
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
@@ -5571,7 +5571,7 @@
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
|
||||
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
@@ -5669,7 +5669,7 @@
|
||||
"version": "6.3.1",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
|
||||
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "ISC",
|
||||
"bin": {
|
||||
"semver": "bin/semver.js"
|
||||
@@ -5852,7 +5852,7 @@
|
||||
"version": "7.2.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
||||
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"has-flag": "^4.0.0"
|
||||
@@ -5986,7 +5986,7 @@
|
||||
"version": "5.9.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz",
|
||||
"integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0",
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
@@ -6000,14 +6000,14 @@
|
||||
"version": "7.10.0",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
|
||||
"integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/update-browserslist-db": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
|
||||
"integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
@@ -6339,7 +6339,7 @@
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
|
||||
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "ISC"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,20 +1,32 @@
|
||||
// import Spinner from '../spinner'
|
||||
import { useStore } from "@nanostores/react"
|
||||
import { memo, useMemo } from "react"
|
||||
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
|
||||
import React from "react"
|
||||
import { Area, AreaChart, CartesianGrid, Line, LineChart, YAxis } from "recharts"
|
||||
import { Badge } from "@/components/ui/badge"
|
||||
import { type ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
|
||||
import { Separator } from "@/components/ui/separator"
|
||||
import { ChartType, Unit } from "@/lib/enums"
|
||||
import { $containerFilter, $userSettings } from "@/lib/stores"
|
||||
import { chartMargin, cn, decimalString, formatBytes, formatShortDate, toFixedFloat } from "@/lib/utils"
|
||||
import { $containerColors, $containerFilter, $stackFilter, $userSettings } from "@/lib/stores"
|
||||
import {
|
||||
chartMargin,
|
||||
cn,
|
||||
decimalString,
|
||||
formatBytes,
|
||||
formatShortDate,
|
||||
generateFallbackColor,
|
||||
getSizeAndUnit,
|
||||
toFixedFloat,
|
||||
toFixedWithoutTrailingZeros,
|
||||
} from "@/lib/utils"
|
||||
import type { ChartData } from "@/types"
|
||||
import { Separator } from "../ui/separator"
|
||||
import { useYAxisWidth } from "./hooks"
|
||||
|
||||
export default memo(function ContainerChart({
|
||||
dataKey,
|
||||
chartData,
|
||||
chartType,
|
||||
chartConfig,
|
||||
chartConfig: propChartConfig,
|
||||
unit = "%",
|
||||
}: {
|
||||
dataKey: string
|
||||
@@ -23,13 +35,168 @@ export default memo(function ContainerChart({
|
||||
chartConfig: ChartConfig
|
||||
unit?: string
|
||||
}) {
|
||||
const filter = useStore($containerFilter)
|
||||
const containerFilter = useStore($containerFilter)
|
||||
const stackFilter = useStore($stackFilter)
|
||||
const containerColors = useStore($containerColors)
|
||||
const userSettings = useStore($userSettings)
|
||||
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
|
||||
|
||||
const { containerData } = chartData
|
||||
|
||||
const isNetChart = chartType === ChartType.Network
|
||||
const isVolumeChart = chartType === ChartType.Volume
|
||||
const isHealthChart = chartType === ChartType.Health
|
||||
const isUptimeChart = chartType === ChartType.Uptime
|
||||
const isHealthUptimeChart = chartType === ChartType.HealthUptime
|
||||
const isDiskIOChart = chartType === ChartType.DiskIO
|
||||
|
||||
// Centralized data processing for all chart types
|
||||
const chartDatasets = useMemo(() => {
|
||||
const volumeChartData = { data: [], colors: {} } as {
|
||||
data: Record<string, number | string>[]
|
||||
colors: Record<string, string>
|
||||
}
|
||||
const healthChartData = { data: [], colors: {} } as {
|
||||
data: Record<string, number | string>[]
|
||||
colors: Record<string, string>
|
||||
}
|
||||
const uptimeChartData = { data: [], colors: {} } as {
|
||||
data: Record<string, number | string>[]
|
||||
colors: Record<string, string>
|
||||
}
|
||||
const healthUptimeChartData = { data: [], colors: {} } as {
|
||||
data: Record<string, number | string>[]
|
||||
colors: Record<string, string>
|
||||
}
|
||||
const containerChartConfig = {} as Record<string, { label: string; color: string }>
|
||||
|
||||
const volumeSums: Record<string, number> = {}
|
||||
const volumeContainers: Record<string, string[]> = {}
|
||||
const allContainerNames = new Set<string>()
|
||||
const healthUptimeContainerNames = new Set<string>()
|
||||
|
||||
for (const containerStats of containerData) {
|
||||
if (!containerStats.created) {
|
||||
// For gaps in data
|
||||
volumeChartData.data.push({ created: "" })
|
||||
healthChartData.data.push({ created: "" })
|
||||
uptimeChartData.data.push({ created: "" })
|
||||
healthUptimeChartData.data.push({ created: "" })
|
||||
continue
|
||||
}
|
||||
|
||||
const volumeData = { created: containerStats.created } as Record<string, number | string>
|
||||
const healthData = { created: containerStats.created } as Record<string, number | string>
|
||||
const uptimeData = { created: containerStats.created } as Record<string, number | string>
|
||||
const healthUptimeData = { created: containerStats.created } as Record<string, number | string>
|
||||
|
||||
for (const [containerName, containerDataObj] of Object.entries(containerStats)) {
|
||||
if (containerName === "created") continue
|
||||
|
||||
// Apply container filter
|
||||
if (containerFilter.length > 0 && !containerFilter.includes(containerName)) {
|
||||
continue
|
||||
}
|
||||
|
||||
// Apply stack filter
|
||||
if (stackFilter.length > 0 && typeof containerDataObj === "object" && containerDataObj) {
|
||||
const stackName = (containerDataObj as any).p || "—"
|
||||
if (!stackFilter.includes(stackName)) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
allContainerNames.add(containerName)
|
||||
|
||||
if (typeof containerDataObj === "object" && containerDataObj) {
|
||||
// Volume
|
||||
if ("v" in containerDataObj && containerDataObj.v) {
|
||||
for (const [volumeName, volumeSize] of Object.entries(containerDataObj.v)) {
|
||||
if (typeof volumeSize === "number" && volumeSize > 0) {
|
||||
volumeData[volumeName] = ((volumeData[volumeName] as number) || 0) + volumeSize
|
||||
volumeSums[volumeName] = (volumeSums[volumeName] ?? 0) + volumeSize
|
||||
if (!volumeContainers[volumeName]) volumeContainers[volumeName] = []
|
||||
if (!volumeContainers[volumeName].includes(containerName))
|
||||
volumeContainers[volumeName].push(containerName)
|
||||
}
|
||||
}
|
||||
}
|
||||
// Health
|
||||
if ("h" in containerDataObj) {
|
||||
const healthStatus = ((containerDataObj.h as string) || "").toLowerCase()
|
||||
let healthValue = 0
|
||||
switch (healthStatus) {
|
||||
case "healthy":
|
||||
healthValue = 3
|
||||
break
|
||||
case "starting":
|
||||
healthValue = 2
|
||||
break
|
||||
case "unhealthy":
|
||||
healthValue = 1
|
||||
break
|
||||
default:
|
||||
healthValue = 0
|
||||
}
|
||||
healthData[containerName] = healthValue
|
||||
// Health+Uptime
|
||||
healthUptimeData[`${containerName}_health`] = healthValue
|
||||
healthUptimeContainerNames.add(containerName)
|
||||
}
|
||||
// Uptime
|
||||
if ("u" in containerDataObj && containerDataObj.u) {
|
||||
uptimeData[containerName] = (containerDataObj.u as number) / 3600
|
||||
// Health+Uptime
|
||||
healthUptimeData[`${containerName}_uptime`] = (containerDataObj.u as number) / 3600
|
||||
healthUptimeContainerNames.add(containerName)
|
||||
}
|
||||
}
|
||||
}
|
||||
volumeChartData.data.push(volumeData)
|
||||
healthChartData.data.push(healthData)
|
||||
uptimeChartData.data.push(uptimeData)
|
||||
healthUptimeChartData.data.push(healthUptimeData)
|
||||
}
|
||||
|
||||
// Only process volumes attached to containers
|
||||
const volumeKeys = Object.keys(volumeSums)
|
||||
.filter((key) => (volumeContainers[key] || []).length > 0)
|
||||
.sort((a, b) => volumeSums[b] - volumeSums[a])
|
||||
for (const key of volumeKeys) {
|
||||
const containers = volumeContainers[key] || []
|
||||
const firstContainer = containers[0]
|
||||
volumeChartData.colors[key] =
|
||||
containerColors[firstContainer] || generateFallbackColor(firstContainer)
|
||||
}
|
||||
const healthKeys = Object.keys(healthChartData.data[0] || {}).filter((key) => key !== "created")
|
||||
for (const key of healthKeys) {
|
||||
healthChartData.colors[key] = containerColors[key] || generateFallbackColor(key)
|
||||
}
|
||||
const uptimeKeys = Object.keys(uptimeChartData.data[0] || {}).filter((key) => key !== "created")
|
||||
for (const key of uptimeKeys) {
|
||||
uptimeChartData.colors[key] = containerColors[key] || generateFallbackColor(key)
|
||||
}
|
||||
for (const containerName of healthUptimeContainerNames) {
|
||||
const color = containerColors[containerName] || generateFallbackColor(containerName)
|
||||
healthUptimeChartData.colors[`${containerName}_uptime`] = color
|
||||
healthUptimeChartData.colors[`${containerName}_health`] = color
|
||||
}
|
||||
for (const containerName of allContainerNames) {
|
||||
const color = containerColors[containerName] || generateFallbackColor(containerName)
|
||||
containerChartConfig[containerName] = { label: containerName, color }
|
||||
}
|
||||
|
||||
return {
|
||||
volumeChartData,
|
||||
healthChartData,
|
||||
uptimeChartData,
|
||||
healthUptimeChartData,
|
||||
containerChartConfig,
|
||||
}
|
||||
}, [containerData, containerColors, containerFilter, stackFilter])
|
||||
|
||||
const { volumeChartData, healthChartData, uptimeChartData, healthUptimeChartData, containerChartConfig } =
|
||||
chartDatasets
|
||||
|
||||
// biome-ignore lint/correctness/useExhaustiveDependencies: not necessary
|
||||
const { toolTipFormatter, dataFunction, tickFormatter } = useMemo(() => {
|
||||
@@ -41,9 +208,40 @@ export default memo(function ContainerChart({
|
||||
// tick formatter
|
||||
if (chartType === ChartType.CPU) {
|
||||
obj.tickFormatter = (value) => {
|
||||
const val = toFixedFloat(value, 2) + unit
|
||||
const val = `${toFixedWithoutTrailingZeros(value, 2)}${unit}`
|
||||
return updateYAxisWidth(val)
|
||||
}
|
||||
} else if (isHealthChart) {
|
||||
obj.tickFormatter = (value) => {
|
||||
let healthLabel = "Unknown"
|
||||
switch (value) {
|
||||
case 3:
|
||||
healthLabel = "Healthy"
|
||||
break
|
||||
case 2:
|
||||
healthLabel = "Starting"
|
||||
break
|
||||
case 1:
|
||||
healthLabel = "Unhealthy"
|
||||
break
|
||||
case 0:
|
||||
healthLabel = "None"
|
||||
break
|
||||
}
|
||||
return updateYAxisWidth(healthLabel)
|
||||
}
|
||||
} else if (isUptimeChart) {
|
||||
obj.tickFormatter = (value) => {
|
||||
const hours = Math.floor(value)
|
||||
const minutes = Math.floor((value - hours) * 60)
|
||||
const label = `${hours}h ${minutes}m`
|
||||
return updateYAxisWidth(label)
|
||||
}
|
||||
} else if (isVolumeChart || isDiskIOChart) {
|
||||
obj.tickFormatter = (value) => {
|
||||
const { v, u } = getSizeAndUnit(value, false)
|
||||
return updateYAxisWidth(`${toFixedFloat(v, 2)}${u}${isDiskIOChart ? "/s" : ""}`)
|
||||
}
|
||||
} else {
|
||||
const chartUnit = isNetChart ? userSettings.unitNet : Unit.Bytes
|
||||
obj.tickFormatter = (val) => {
|
||||
@@ -57,7 +255,12 @@ export default memo(function ContainerChart({
|
||||
try {
|
||||
const sent = item?.payload?.[key]?.ns ?? 0
|
||||
const received = item?.payload?.[key]?.nr ?? 0
|
||||
const { value: receivedValue, unit: receivedUnit } = formatBytes(received, true, userSettings.unitNet, true)
|
||||
const { value: receivedValue, unit: receivedUnit } = formatBytes(
|
||||
received,
|
||||
true,
|
||||
userSettings.unitNet,
|
||||
true
|
||||
)
|
||||
const { value: sentValue, unit: sentUnit } = formatBytes(sent, true, userSettings.unitNet, true)
|
||||
return (
|
||||
<span className="flex">
|
||||
@@ -72,17 +275,74 @@ export default memo(function ContainerChart({
|
||||
return null
|
||||
}
|
||||
}
|
||||
} else if (isDiskIOChart) {
|
||||
obj.toolTipFormatter = (item: any, key: string) => {
|
||||
try {
|
||||
const read = item?.payload?.[key]?.dr ?? 0
|
||||
const write = item?.payload?.[key]?.dw ?? 0
|
||||
return (
|
||||
<span className="flex">
|
||||
{decimalString(read)} MB/s
|
||||
<span className="opacity-70 ms-0.5"> read </span>
|
||||
<Separator orientation="vertical" className="h-3 mx-1.5 bg-primary/40" />
|
||||
{decimalString(write)} MB/s
|
||||
<span className="opacity-70 ms-0.5"> write</span>
|
||||
</span>
|
||||
)
|
||||
} catch (e) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
} else if (chartType === ChartType.Memory) {
|
||||
obj.toolTipFormatter = (item: any) => {
|
||||
const { value, unit } = formatBytes(item.value, false, Unit.Bytes, true)
|
||||
return `${decimalString(value)} ${unit}`
|
||||
}
|
||||
} else if (isVolumeChart) {
|
||||
obj.toolTipFormatter = (item: any) => {
|
||||
const { v, u } = getSizeAndUnit(item.value, false)
|
||||
return `${decimalString(v, 2)}${u}`
|
||||
}
|
||||
} else if (isHealthChart) {
|
||||
obj.toolTipFormatter = (item: any) => {
|
||||
let healthLabel = "Unknown"
|
||||
switch (item.value) {
|
||||
case 3:
|
||||
healthLabel = "Healthy"
|
||||
break
|
||||
case 2:
|
||||
healthLabel = "Starting"
|
||||
break
|
||||
case 1:
|
||||
healthLabel = "Unhealthy"
|
||||
break
|
||||
case 0:
|
||||
healthLabel = "None"
|
||||
break
|
||||
}
|
||||
return healthLabel
|
||||
}
|
||||
} else if (isUptimeChart) {
|
||||
obj.toolTipFormatter = (item: any) => {
|
||||
const hours = Math.floor(item.value)
|
||||
const minutes = Math.floor((item.value - hours) * 60)
|
||||
const days = Math.floor(hours / 24)
|
||||
const remainingHours = hours % 24
|
||||
|
||||
if (days > 0) {
|
||||
return `${days}d ${remainingHours}h ${minutes}m`
|
||||
}
|
||||
return `${hours}h ${minutes}m`
|
||||
}
|
||||
} else {
|
||||
obj.toolTipFormatter = (item: any) => `${decimalString(item.value)} ${unit}`
|
||||
}
|
||||
// data function
|
||||
if (isNetChart) {
|
||||
obj.dataFunction = (key: string, data: any) => (data[key] ? data[key].nr + data[key].ns : null)
|
||||
} else if (isDiskIOChart) {
|
||||
obj.dataFunction = (key: string, data: any) =>
|
||||
data[key] ? (data[key].dr || 0) + (data[key].dw || 0) : null
|
||||
} else {
|
||||
obj.dataFunction = (key: string, data: any) => data[key]?.[dataKey] ?? null
|
||||
}
|
||||
@@ -91,12 +351,11 @@ export default memo(function ContainerChart({
|
||||
|
||||
// Filter with set lookup
|
||||
const filteredKeys = useMemo(() => {
|
||||
if (!filter) {
|
||||
if (!containerFilter || containerFilter.length === 0) {
|
||||
return new Set<string>()
|
||||
}
|
||||
const filterLower = filter.toLowerCase()
|
||||
return new Set(Object.keys(chartConfig).filter((key) => !key.toLowerCase().includes(filterLower)))
|
||||
}, [chartConfig, filter])
|
||||
return new Set(Object.keys(containerChartConfig).filter((key) => !containerFilter.includes(key)))
|
||||
}, [containerChartConfig, containerFilter])
|
||||
|
||||
// console.log('rendered at', new Date())
|
||||
|
||||
@@ -104,8 +363,228 @@ export default memo(function ContainerChart({
|
||||
return null
|
||||
}
|
||||
|
||||
// For volume charts, check if we have volume data
|
||||
if (isVolumeChart) {
|
||||
if (!volumeChartData || Object.keys(volumeChartData.colors).length === 0) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
// For health charts, check if we have health data
|
||||
if (isHealthChart) {
|
||||
if (!healthChartData || Object.keys(healthChartData.colors).length === 0) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
// For uptime charts, check if we have uptime data
|
||||
if (isUptimeChart) {
|
||||
if (!uptimeChartData || Object.keys(uptimeChartData.colors).length === 0) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
// For combined health+uptime chart
|
||||
if (isHealthUptimeChart) {
|
||||
if (!healthUptimeChartData || healthUptimeChartData.data.length === 0) return null
|
||||
return (
|
||||
<HealthUptimeTable
|
||||
containerData={containerData}
|
||||
healthUptimeChartData={healthUptimeChartData}
|
||||
containerColors={containerColors}
|
||||
filter={containerFilter}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
// Only show selected containers, or all if none selected
|
||||
const filterableKeys = isVolumeChart
|
||||
? Object.keys(containerChartConfig)
|
||||
: Object.keys(containerChartConfig).filter(
|
||||
(key) =>
|
||||
!(
|
||||
containerChartConfig[key] &&
|
||||
containerChartConfig[key].label &&
|
||||
containerChartConfig[key].label.startsWith("(orphaned volume)")
|
||||
)
|
||||
)
|
||||
|
||||
// Render volume chart
|
||||
if (isVolumeChart) {
|
||||
const colors = Object.keys(volumeChartData!.colors)
|
||||
return (
|
||||
<div className="w-full h-full">
|
||||
<ChartContainer
|
||||
className={cn("h-full w-full absolute bg-card opacity-0 transition-opacity", {
|
||||
"opacity-100": yAxisWidth,
|
||||
})}
|
||||
>
|
||||
<AreaChart
|
||||
accessibilityLayer
|
||||
data={volumeChartData!.data}
|
||||
margin={chartMargin}
|
||||
reverseStackOrder={true}
|
||||
>
|
||||
<CartesianGrid vertical={false} />
|
||||
<YAxis
|
||||
direction="ltr"
|
||||
orientation={chartData.orientation}
|
||||
className="tracking-tighter"
|
||||
domain={[0, "auto"]}
|
||||
width={yAxisWidth}
|
||||
tickFormatter={(value) => {
|
||||
const { v, u } = getSizeAndUnit(value, false)
|
||||
return updateYAxisWidth(`${toFixedFloat(v, 2)}${u}`)
|
||||
}}
|
||||
tickLine={false}
|
||||
axisLine={false}
|
||||
/>
|
||||
{xAxis(chartData)}
|
||||
<ChartTooltip
|
||||
animationEasing="ease-out"
|
||||
animationDuration={150}
|
||||
// @ts-expect-error
|
||||
itemSorter={(a, b) => b.value - a.value}
|
||||
content={
|
||||
<ChartTooltipContent
|
||||
truncate={true}
|
||||
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
||||
contentFormatter={toolTipFormatter}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
{colors.map((key) => (
|
||||
<Area
|
||||
key={key}
|
||||
dataKey={key}
|
||||
name={key}
|
||||
type="monotoneX"
|
||||
fill={volumeChartData!.colors[key]}
|
||||
fillOpacity={0.4}
|
||||
stroke={volumeChartData!.colors[key]}
|
||||
strokeOpacity={1}
|
||||
activeDot={{ opacity: 1 }}
|
||||
stackId="a"
|
||||
isAnimationActive={false}
|
||||
/>
|
||||
))}
|
||||
</AreaChart>
|
||||
</ChartContainer>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
// Render health chart
|
||||
if (isHealthChart) {
|
||||
const colors = Object.keys(healthChartData!.colors)
|
||||
return (
|
||||
<div className="w-full h-full">
|
||||
<ChartContainer
|
||||
className={cn("h-full w-full absolute bg-card opacity-0 transition-opacity", {
|
||||
"opacity-100": yAxisWidth,
|
||||
})}
|
||||
>
|
||||
<LineChart accessibilityLayer data={healthChartData!.data} margin={chartMargin}>
|
||||
<CartesianGrid vertical={false} />
|
||||
<YAxis
|
||||
direction="ltr"
|
||||
orientation={chartData.orientation}
|
||||
className="tracking-tighter"
|
||||
domain={[0, 3]}
|
||||
width={yAxisWidth}
|
||||
tickFormatter={tickFormatter}
|
||||
tickLine={false}
|
||||
axisLine={false}
|
||||
/>
|
||||
{xAxis(chartData)}
|
||||
<ChartTooltip
|
||||
animationEasing="ease-out"
|
||||
animationDuration={150}
|
||||
// @ts-expect-error
|
||||
itemSorter={(a, b) => b.value - a.value}
|
||||
content={
|
||||
<ChartTooltipContent
|
||||
truncate={true}
|
||||
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
||||
contentFormatter={toolTipFormatter}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
{colors.map((key) => (
|
||||
<Line
|
||||
key={key}
|
||||
dataKey={key}
|
||||
name={key}
|
||||
type="monotoneX"
|
||||
dot={false}
|
||||
strokeWidth={1.5}
|
||||
stroke={healthChartData!.colors[key]}
|
||||
isAnimationActive={false}
|
||||
/>
|
||||
))}
|
||||
</LineChart>
|
||||
</ChartContainer>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
// Render uptime chart
|
||||
if (isUptimeChart) {
|
||||
const colors = Object.keys(uptimeChartData!.colors)
|
||||
return (
|
||||
<div className="w-full h-full">
|
||||
<ChartContainer
|
||||
className={cn("h-full w-full absolute bg-card opacity-0 transition-opacity", {
|
||||
"opacity-100": yAxisWidth,
|
||||
})}
|
||||
>
|
||||
<LineChart accessibilityLayer data={uptimeChartData!.data} margin={chartMargin}>
|
||||
<CartesianGrid vertical={false} />
|
||||
<YAxis
|
||||
direction="ltr"
|
||||
orientation={chartData.orientation}
|
||||
className="tracking-tighter"
|
||||
domain={[0, "auto"]}
|
||||
width={yAxisWidth}
|
||||
tickFormatter={tickFormatter}
|
||||
tickLine={false}
|
||||
axisLine={false}
|
||||
/>
|
||||
{xAxis(chartData)}
|
||||
<ChartTooltip
|
||||
animationEasing="ease-out"
|
||||
animationDuration={150}
|
||||
// @ts-expect-error
|
||||
itemSorter={(a, b) => b.value - a.value}
|
||||
content={
|
||||
<ChartTooltipContent
|
||||
truncate={true}
|
||||
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
||||
contentFormatter={toolTipFormatter}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
{colors.map((key) => (
|
||||
<Line
|
||||
key={key}
|
||||
dataKey={key}
|
||||
name={key}
|
||||
type="monotoneX"
|
||||
dot={false}
|
||||
strokeWidth={1.5}
|
||||
stroke={uptimeChartData!.colors[key]}
|
||||
isAnimationActive={false}
|
||||
/>
|
||||
))}
|
||||
</LineChart>
|
||||
</ChartContainer>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
// Render regular container chart (Area chart)
|
||||
return (
|
||||
<div>
|
||||
<div className="w-full h-full">
|
||||
<ChartContainer
|
||||
className={cn("h-full w-full absolute aspect-auto bg-card opacity-0 transition-opacity", {
|
||||
"opacity-100": yAxisWidth,
|
||||
@@ -136,9 +615,14 @@ export default memo(function ContainerChart({
|
||||
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
|
||||
// @ts-expect-error
|
||||
itemSorter={(a, b) => b.value - a.value}
|
||||
content={<ChartTooltipContent filter={filter} contentFormatter={toolTipFormatter} />}
|
||||
content={
|
||||
<ChartTooltipContent
|
||||
filter={containerFilter.length > 0 ? containerFilter.join(",") : undefined}
|
||||
contentFormatter={toolTipFormatter}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
{Object.keys(chartConfig).map((key) => {
|
||||
{filterableKeys.map((key) => {
|
||||
const filtered = filteredKeys.has(key)
|
||||
const fillOpacity = filtered ? 0.05 : 0.4
|
||||
const strokeOpacity = filtered ? 0.1 : 1
|
||||
@@ -149,11 +633,11 @@ export default memo(function ContainerChart({
|
||||
dataKey={dataFunction.bind(null, key)}
|
||||
name={key}
|
||||
type="monotoneX"
|
||||
fill={chartConfig[key].color}
|
||||
fill={containerChartConfig[key].color}
|
||||
fillOpacity={fillOpacity}
|
||||
stroke={chartConfig[key].color}
|
||||
stroke={containerChartConfig[key].color}
|
||||
strokeOpacity={strokeOpacity}
|
||||
activeDot={{ opacity: filtered ? 0 : 1 }}
|
||||
activeDot={{ opacity: 1 }}
|
||||
stackId="a"
|
||||
/>
|
||||
)
|
||||
@@ -163,3 +647,358 @@ export default memo(function ContainerChart({
|
||||
</div>
|
||||
)
|
||||
})
|
||||
|
||||
// Extracted HealthUptimeTable component
|
||||
const HealthUptimeTable = React.memo(function HealthUptimeTable({
|
||||
containerData,
|
||||
healthUptimeChartData,
|
||||
containerColors,
|
||||
filter,
|
||||
}: {
|
||||
containerData: any[]
|
||||
healthUptimeChartData: { data: any[]; colors: Record<string, string> }
|
||||
containerColors: Record<string, string>
|
||||
filter: string[]
|
||||
}) {
|
||||
const stackFilter = useStore($stackFilter)
|
||||
// Get the latest data point for table display
|
||||
const latestData = healthUptimeChartData.data[healthUptimeChartData.data.length - 1]
|
||||
if (!latestData) return null
|
||||
|
||||
// Extract container data for table
|
||||
const containerTableData = React.useMemo(() => {
|
||||
const containerNames = new Set<string>()
|
||||
for (const key of Object.keys(latestData)) {
|
||||
if (key === "created") continue
|
||||
const containerName = key.replace(/_uptime$/, "").replace(/_health$/, "")
|
||||
// Skip orphaned volumes
|
||||
if (containerName.startsWith("(orphaned volume)")) continue
|
||||
containerNames.add(containerName)
|
||||
}
|
||||
const tableData = []
|
||||
for (const containerName of containerNames) {
|
||||
const uptimeKey = `${containerName}_uptime`
|
||||
const healthKey = `${containerName}_health`
|
||||
const uptimeHours = latestData[uptimeKey]
|
||||
const healthValue = latestData[healthKey] || 0
|
||||
let healthStatus = "Unknown"
|
||||
switch (healthValue) {
|
||||
case 3:
|
||||
healthStatus = "Healthy"
|
||||
break
|
||||
case 2:
|
||||
healthStatus = "Starting"
|
||||
break
|
||||
case 1:
|
||||
healthStatus = "Unhealthy"
|
||||
break
|
||||
case 0:
|
||||
healthStatus = "None"
|
||||
break
|
||||
}
|
||||
let uptimeDisplay = "N/A"
|
||||
if (typeof uptimeHours === "number" && !Number.isNaN(uptimeHours)) {
|
||||
const hours = Math.floor(uptimeHours)
|
||||
const minutes = Math.floor((uptimeHours - hours) * 60)
|
||||
const days = Math.floor(hours / 24)
|
||||
const remainingHours = hours % 24
|
||||
if (days > 0) {
|
||||
uptimeDisplay = `${days}d ${remainingHours}h ${minutes}m`
|
||||
} else {
|
||||
uptimeDisplay = `${hours}h ${minutes}m`
|
||||
}
|
||||
}
|
||||
let stackName = "—"
|
||||
let statusInfo = "—"
|
||||
let idShort = ""
|
||||
for (let i = containerData.length - 1; i >= 0; i--) {
|
||||
const containerStats = containerData[i]
|
||||
if (containerStats.created && containerStats[containerName]) {
|
||||
const containerDataObj = containerStats[containerName]
|
||||
if (typeof containerDataObj === "object" && containerDataObj) {
|
||||
if ("p" in containerDataObj) {
|
||||
stackName = containerDataObj.p as string
|
||||
}
|
||||
if ("s" in containerDataObj) {
|
||||
statusInfo = containerDataObj.s as string
|
||||
}
|
||||
if ("idShort" in containerDataObj) {
|
||||
idShort = containerDataObj.idShort as string
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
tableData.push({
|
||||
name: containerName,
|
||||
idShort,
|
||||
health: healthStatus,
|
||||
status: statusInfo,
|
||||
uptime: uptimeDisplay,
|
||||
uptimeHours: uptimeHours,
|
||||
healthValue: healthValue,
|
||||
stack: stackName,
|
||||
color: containerColors[containerName] || generateFallbackColor(containerName),
|
||||
})
|
||||
}
|
||||
return tableData
|
||||
}, [containerData, latestData, containerColors])
|
||||
|
||||
// Sort and filter state
|
||||
const [sortField, setSortField] = React.useState<"name" | "idShort" | "stack" | "health" | "status" | "uptime">(
|
||||
"uptime"
|
||||
)
|
||||
const [sortDirection, setSortDirection] = React.useState<"asc" | "desc">("desc")
|
||||
const [currentPage, setCurrentPage] = React.useState(1)
|
||||
const containersPerPage = 4
|
||||
|
||||
// Filtered data
|
||||
const filteredContainerData = React.useMemo(() => {
|
||||
let filtered = containerTableData
|
||||
|
||||
// Apply container filter
|
||||
if (Array.isArray(filter) && filter.length > 0) {
|
||||
filtered = filtered.filter((container) => filter.includes(container.name))
|
||||
}
|
||||
|
||||
// Apply stack filter
|
||||
if (Array.isArray(stackFilter) && stackFilter.length > 0) {
|
||||
filtered = filtered.filter((container) => stackFilter.includes(container.stack))
|
||||
}
|
||||
|
||||
return filtered
|
||||
}, [containerTableData, filter, stackFilter])
|
||||
|
||||
// Sorted data
|
||||
const sortedContainerData = React.useMemo(() => {
|
||||
return [...filteredContainerData].sort((a, b) => {
|
||||
let aValue: string | number
|
||||
let bValue: string | number
|
||||
switch (sortField) {
|
||||
case "name":
|
||||
aValue = a.name?.toLowerCase?.() || ""
|
||||
bValue = b.name?.toLowerCase?.() || ""
|
||||
break
|
||||
case "idShort":
|
||||
aValue = a.idShort || ""
|
||||
bValue = b.idShort || ""
|
||||
break
|
||||
case "stack":
|
||||
aValue = a.stack?.toLowerCase?.() || ""
|
||||
bValue = b.stack?.toLowerCase?.() || ""
|
||||
break
|
||||
case "health":
|
||||
aValue = typeof a.healthValue === "number" ? a.healthValue : 0
|
||||
bValue = typeof b.healthValue === "number" ? b.healthValue : 0
|
||||
break
|
||||
case "status":
|
||||
aValue = a.status?.toLowerCase?.() || ""
|
||||
bValue = b.status?.toLowerCase?.() || ""
|
||||
break
|
||||
case "uptime":
|
||||
aValue = typeof a.uptimeHours === "number" ? a.uptimeHours : 0
|
||||
bValue = typeof b.uptimeHours === "number" ? b.uptimeHours : 0
|
||||
break
|
||||
default:
|
||||
return 0
|
||||
}
|
||||
if (aValue < bValue) return sortDirection === "asc" ? -1 : 1
|
||||
if (aValue > bValue) return sortDirection === "asc" ? 1 : -1
|
||||
return 0
|
||||
})
|
||||
}, [filteredContainerData, sortField, sortDirection])
|
||||
|
||||
// Pagination
|
||||
const totalPages = Math.ceil(sortedContainerData.length / containersPerPage)
|
||||
const startIndex = (currentPage - 1) * containersPerPage
|
||||
const endIndex = startIndex + containersPerPage
|
||||
const currentContainers = sortedContainerData.slice(startIndex, endIndex)
|
||||
|
||||
// Handlers
|
||||
const handleSort = (field: "name" | "idShort" | "stack" | "health" | "status" | "uptime") => {
|
||||
if (sortField === field) {
|
||||
setSortDirection(sortDirection === "asc" ? "desc" : "asc")
|
||||
} else {
|
||||
setSortField(field)
|
||||
setSortDirection("asc")
|
||||
}
|
||||
}
|
||||
const getSortIcon = (field: "name" | "idShort" | "stack" | "health" | "status" | "uptime") => {
|
||||
if (sortField !== field) return "↑↓"
|
||||
return sortDirection === "asc" ? "↑" : "↓"
|
||||
}
|
||||
|
||||
React.useEffect(() => {
|
||||
setCurrentPage(1)
|
||||
}, [filteredContainerData, sortField, sortDirection])
|
||||
|
||||
return (
|
||||
<div className="w-full h-full flex flex-col opacity-100">
|
||||
<div className="flex-1 p-2 overflow-hidden">
|
||||
<div className="overflow-x-auto h-full">
|
||||
<table className="w-full text-xs table-fixed">
|
||||
<thead>
|
||||
<tr className="border-b border-border">
|
||||
<th
|
||||
className="text-left font-medium p-1 w-1/6 cursor-pointer hover:bg-muted/50 transition-colors select-none"
|
||||
onClick={() => handleSort("idShort")}
|
||||
>
|
||||
<div className="flex items-center gap-1">
|
||||
ID
|
||||
<span className="text-xs opacity-60">{getSortIcon("idShort")}</span>
|
||||
</div>
|
||||
</th>
|
||||
<th
|
||||
className="text-left font-medium p-1 w-1/4 cursor-pointer hover:bg-muted/50 transition-colors select-none"
|
||||
onClick={() => handleSort("name")}
|
||||
>
|
||||
<div className="flex items-center gap-1">
|
||||
Container
|
||||
<span className="text-xs opacity-60">{getSortIcon("name")}</span>
|
||||
</div>
|
||||
</th>
|
||||
<th
|
||||
className="text-left font-medium p-1 w-1/6 cursor-pointer hover:bg-muted/50 transition-colors select-none"
|
||||
onClick={() => handleSort("stack")}
|
||||
>
|
||||
<div className="flex items-center gap-1">
|
||||
Stack
|
||||
<span className="text-xs opacity-60">{getSortIcon("stack")}</span>
|
||||
</div>
|
||||
</th>
|
||||
<th
|
||||
className="text-left font-medium p-1 w-1/6 cursor-pointer hover:bg-muted/50 transition-colors select-none"
|
||||
onClick={() => handleSort("health")}
|
||||
>
|
||||
<div className="flex items-center gap-1">
|
||||
Health
|
||||
<span className="text-xs opacity-60">{getSortIcon("health")}</span>
|
||||
</div>
|
||||
</th>
|
||||
<th
|
||||
className="text-left font-medium p-1 w-1/6 cursor-pointer hover:bg-muted/50 transition-colors select-none"
|
||||
onClick={() => handleSort("status")}
|
||||
>
|
||||
<div className="flex items-center gap-1">
|
||||
Status
|
||||
<span className="text-xs opacity-60">{getSortIcon("status")}</span>
|
||||
</div>
|
||||
</th>
|
||||
<th
|
||||
className="text-left font-medium p-1 w-1/6 cursor-pointer hover:bg-muted/50 transition-colors select-none"
|
||||
onClick={() => handleSort("uptime")}
|
||||
>
|
||||
<div className="flex items-center gap-1">
|
||||
Uptime
|
||||
<span className="text-xs opacity-60">{getSortIcon("uptime")}</span>
|
||||
</div>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{currentContainers.map((container) => (
|
||||
<tr key={container.name} className="border-b border-border/30 hover:bg-muted/30">
|
||||
<td className="p-1 w-1/6 font-mono text-xs text-muted-foreground" title={container.idShort}>
|
||||
{container.idShort}
|
||||
</td>
|
||||
<td className="p-1 w-1/4">
|
||||
<div className="flex items-center gap-1.5">
|
||||
<div className="w-2.5 h-2.5 rounded-full flex-shrink-0" style={{ backgroundColor: container.color }} />
|
||||
<span className="text-xs truncate">{container.name}</span>
|
||||
</div>
|
||||
</td>
|
||||
<td className="p-1 w-1/6">
|
||||
<span className="text-xs text-muted-foreground truncate" title={container.stack}>
|
||||
{container.stack}
|
||||
</span>
|
||||
</td>
|
||||
<td className="p-1 w-1/6">
|
||||
<Badge
|
||||
className={cn("px-1.5 py-0.5 text-xs font-medium whitespace-nowrap border-0", {
|
||||
"bg-green-100 text-green-800 dark:bg-green-900/20 dark:text-green-400":
|
||||
container.healthValue === 3,
|
||||
"bg-yellow-100 text-yellow-800 dark:bg-yellow-900/20 dark:text-yellow-400":
|
||||
container.healthValue === 2,
|
||||
"bg-red-100 text-red-800 dark:bg-red-900/20 dark:text-red-400": container.healthValue === 1,
|
||||
"bg-gray-100 text-gray-800 dark:bg-gray-900/20 dark:text-gray-400": container.healthValue === 0,
|
||||
})}
|
||||
>
|
||||
{container.health}
|
||||
</Badge>
|
||||
</td>
|
||||
<td className="p-1 w-1/6">
|
||||
<Badge
|
||||
className={cn("px-1.5 py-0.5 text-xs font-medium whitespace-nowrap border-0", {
|
||||
"bg-green-100 text-green-800 dark:bg-green-900/20 dark:text-green-400":
|
||||
container.status?.toLowerCase() === "running",
|
||||
"bg-yellow-100 text-yellow-800 dark:bg-yellow-900/20 dark:text-yellow-400":
|
||||
container.status?.toLowerCase() === "paused" || container.status?.toLowerCase() === "restarting",
|
||||
"bg-red-100 text-red-800 dark:bg-red-900/20 dark:text-red-400":
|
||||
container.status?.toLowerCase().includes("exited") ||
|
||||
container.status?.toLowerCase().includes("dead") ||
|
||||
container.status?.toLowerCase().includes("removing"),
|
||||
"bg-gray-100 text-gray-800 dark:bg-gray-900/20 dark:text-gray-400":
|
||||
!container.status || container.status?.toLowerCase() === "created",
|
||||
})}
|
||||
title={container.status}
|
||||
>
|
||||
{container.status}
|
||||
</Badge>
|
||||
</td>
|
||||
<td className="p-1 w-1/6 text-xs whitespace-nowrap">{container.uptime}</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{/* Pagination Controls */}
|
||||
{totalPages > 1 && (
|
||||
<div className="flex items-center justify-between px-2 py-2 border-t border-border bg-muted/20">
|
||||
<div className="text-xs text-muted-foreground">
|
||||
Showing {startIndex + 1}-{Math.min(endIndex, sortedContainerData.length)} of{" "}
|
||||
{sortedContainerData.length} containers
|
||||
</div>
|
||||
<div className="flex items-center gap-1">
|
||||
<button
|
||||
onClick={() => setCurrentPage((prev) => Math.max(1, prev - 1))}
|
||||
disabled={currentPage === 1}
|
||||
className={cn(
|
||||
"px-2 py-1 text-xs rounded border transition-colors",
|
||||
"hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed",
|
||||
"border-border hover:border-border/60"
|
||||
)}
|
||||
>
|
||||
Previous
|
||||
</button>
|
||||
{Array.from({ length: totalPages }, (_, i) => i + 1).map((page) => (
|
||||
<button
|
||||
key={page}
|
||||
onClick={() => setCurrentPage(page)}
|
||||
className={cn(
|
||||
"px-2 py-1 text-xs rounded border transition-colors min-w-[28px]",
|
||||
page === currentPage
|
||||
? "bg-primary text-primary-foreground border-primary"
|
||||
: "border-border hover:bg-muted hover:border-border/60"
|
||||
)}
|
||||
>
|
||||
{page}
|
||||
</button>
|
||||
))}
|
||||
<button
|
||||
onClick={() => setCurrentPage((prev) => Math.min(totalPages, prev + 1))}
|
||||
disabled={currentPage === totalPages}
|
||||
className={cn(
|
||||
"px-2 py-1 text-xs rounded border transition-colors",
|
||||
"hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed",
|
||||
"border-border hover:border-border/60"
|
||||
)}
|
||||
>
|
||||
Next
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
})
|
||||
|
||||
257
internal/site/src/components/charts/container-health-table.tsx
Normal file
257
internal/site/src/components/charts/container-health-table.tsx
Normal file
@@ -0,0 +1,257 @@
|
||||
"use client"
|
||||
|
||||
import * as React from "react"
|
||||
import {
|
||||
ColumnDef,
|
||||
flexRender,
|
||||
getCoreRowModel,
|
||||
getPaginationRowModel,
|
||||
getSortedRowModel,
|
||||
SortingState,
|
||||
useReactTable,
|
||||
VisibilityState,
|
||||
} from "@tanstack/react-table"
|
||||
import { ArrowUpDown } from "lucide-react"
|
||||
|
||||
import { Button } from "@/components/ui/button"
|
||||
import {
|
||||
Table,
|
||||
TableBody,
|
||||
TableCell,
|
||||
TableHead,
|
||||
TableHeader,
|
||||
TableRow,
|
||||
} from "@/components/ui/table"
|
||||
import { Badge } from "@/components/ui/badge"
|
||||
import { cn } from "@/lib/utils"
|
||||
|
||||
export type DockerHealthRow = {
|
||||
id: string
|
||||
name: string
|
||||
stack: string
|
||||
health: string
|
||||
healthValue: number
|
||||
status: string
|
||||
uptime: string
|
||||
color: string
|
||||
}
|
||||
|
||||
type Props = {
|
||||
data: DockerHealthRow[]
|
||||
}
|
||||
|
||||
export function ContainerHealthTable({ data }: Props) {
|
||||
const [sorting, setSorting] = React.useState<SortingState>([])
|
||||
const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>({})
|
||||
const [rowSelection, setRowSelection] = React.useState({})
|
||||
|
||||
const columns = React.useMemo<ColumnDef<DockerHealthRow>[]>(() => [
|
||||
{
|
||||
accessorKey: "id",
|
||||
header: ({ column }) => (
|
||||
<Button
|
||||
variant="ghost"
|
||||
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
|
||||
>
|
||||
ID
|
||||
<ArrowUpDown className="ml-2 h-4 w-4" />
|
||||
</Button>
|
||||
),
|
||||
cell: ({ row }) => (
|
||||
<span className="font-mono text-xs text-muted-foreground" title={row.original.id}>{row.original.id}</span>
|
||||
),
|
||||
},
|
||||
{
|
||||
accessorKey: "name",
|
||||
header: ({ column }) => (
|
||||
<Button
|
||||
variant="ghost"
|
||||
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
|
||||
>
|
||||
Container
|
||||
<ArrowUpDown className="ml-2 h-4 w-4" />
|
||||
</Button>
|
||||
),
|
||||
cell: ({ row }) => (
|
||||
<div className="flex items-center gap-1.5">
|
||||
<div className="w-2.5 h-2.5 rounded-full flex-shrink-0" style={{ backgroundColor: row.original.color }} />
|
||||
<span className="text-xs truncate">{row.original.name}</span>
|
||||
</div>
|
||||
),
|
||||
},
|
||||
{
|
||||
accessorKey: "stack",
|
||||
header: ({ column }) => (
|
||||
<Button
|
||||
variant="ghost"
|
||||
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
|
||||
>
|
||||
Stack
|
||||
<ArrowUpDown className="ml-2 h-4 w-4" />
|
||||
</Button>
|
||||
),
|
||||
cell: ({ row }) => (
|
||||
<span className="text-xs text-muted-foreground truncate" title={row.original.stack}>{row.original.stack}</span>
|
||||
),
|
||||
},
|
||||
{
|
||||
accessorKey: "health",
|
||||
header: ({ column }) => (
|
||||
<Button
|
||||
variant="ghost"
|
||||
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
|
||||
>
|
||||
Health
|
||||
<ArrowUpDown className="ml-2 h-4 w-4" />
|
||||
</Button>
|
||||
),
|
||||
cell: ({ row }) => (
|
||||
<Badge className={cn(
|
||||
"px-1.5 py-0.5 text-xs font-medium whitespace-nowrap border-0",
|
||||
{
|
||||
"bg-green-100 text-green-800 dark:bg-green-900/20 dark:text-green-400": row.original.healthValue === 3,
|
||||
"bg-yellow-100 text-yellow-800 dark:bg-yellow-900/20 dark:text-yellow-400": row.original.healthValue === 2,
|
||||
"bg-red-100 text-red-800 dark:bg-red-900/20 dark:text-red-400": row.original.healthValue === 1,
|
||||
"bg-gray-100 text-gray-800 dark:bg-gray-900/20 dark:text-gray-400": row.original.healthValue === 0,
|
||||
}
|
||||
)}>{row.original.health}</Badge>
|
||||
),
|
||||
},
|
||||
{
|
||||
accessorKey: "status",
|
||||
header: ({ column }) => (
|
||||
<Button
|
||||
variant="ghost"
|
||||
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
|
||||
>
|
||||
Status
|
||||
<ArrowUpDown className="ml-2 h-4 w-4" />
|
||||
</Button>
|
||||
),
|
||||
cell: ({ row }) => (
|
||||
<Badge className={cn(
|
||||
"px-1.5 py-0.5 text-xs font-medium whitespace-nowrap border-0",
|
||||
{
|
||||
"bg-green-100 text-green-800 dark:bg-green-900/20 dark:text-green-400": row.original.status?.toLowerCase() === "running",
|
||||
"bg-yellow-100 text-yellow-800 dark:bg-yellow-900/20 dark:text-yellow-400": row.original.status?.toLowerCase() === "paused" || row.original.status?.toLowerCase() === "restarting",
|
||||
"bg-red-100 text-red-800 dark:bg-red-900/20 dark:text-red-400":
|
||||
row.original.status?.toLowerCase().includes("exited") ||
|
||||
row.original.status?.toLowerCase().includes("dead") ||
|
||||
row.original.status?.toLowerCase().includes("removing"),
|
||||
"bg-gray-100 text-gray-800 dark:bg-gray-900/20 dark:text-gray-400": !row.original.status || row.original.status?.toLowerCase() === "created",
|
||||
}
|
||||
)} title={row.original.status}>{row.original.status}</Badge>
|
||||
),
|
||||
},
|
||||
{
|
||||
accessorKey: "uptime",
|
||||
header: ({ column }) => (
|
||||
<Button
|
||||
variant="ghost"
|
||||
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
|
||||
>
|
||||
Uptime
|
||||
<ArrowUpDown className="ml-2 h-4 w-4" />
|
||||
</Button>
|
||||
),
|
||||
cell: ({ row }) => (
|
||||
<span className="text-xs whitespace-nowrap">{row.original.uptime}</span>
|
||||
),
|
||||
},
|
||||
], [])
|
||||
|
||||
const table = useReactTable({
|
||||
data,
|
||||
columns,
|
||||
onSortingChange: setSorting,
|
||||
getCoreRowModel: getCoreRowModel(),
|
||||
getPaginationRowModel: getPaginationRowModel(),
|
||||
getSortedRowModel: getSortedRowModel(),
|
||||
onColumnVisibilityChange: setColumnVisibility,
|
||||
onRowSelectionChange: setRowSelection,
|
||||
state: {
|
||||
sorting,
|
||||
columnVisibility,
|
||||
rowSelection,
|
||||
},
|
||||
})
|
||||
|
||||
React.useEffect(() => {
|
||||
table.setPageSize(5)
|
||||
}, [table])
|
||||
|
||||
return (
|
||||
<div className="w-full">
|
||||
<div className="rounded-md border">
|
||||
<Table>
|
||||
<TableHeader>
|
||||
{table.getHeaderGroups().map((headerGroup) => (
|
||||
<TableRow key={headerGroup.id}>
|
||||
{headerGroup.headers.map((header) => {
|
||||
return (
|
||||
<TableHead key={header.id}>
|
||||
{header.isPlaceholder
|
||||
? null
|
||||
: flexRender(
|
||||
header.column.columnDef.header,
|
||||
header.getContext()
|
||||
)}
|
||||
</TableHead>
|
||||
)
|
||||
})}
|
||||
</TableRow>
|
||||
))}
|
||||
</TableHeader>
|
||||
<TableBody>
|
||||
{table.getRowModel().rows?.length ? (
|
||||
table.getRowModel().rows.map((row) => (
|
||||
<TableRow
|
||||
key={row.id}
|
||||
data-state={row.getIsSelected() && "selected"}
|
||||
>
|
||||
{row.getVisibleCells().map((cell) => (
|
||||
<TableCell key={cell.id}>
|
||||
{flexRender(
|
||||
cell.column.columnDef.cell,
|
||||
cell.getContext()
|
||||
)}
|
||||
</TableCell>
|
||||
))}
|
||||
</TableRow>
|
||||
))
|
||||
) : (
|
||||
<TableRow>
|
||||
<TableCell
|
||||
colSpan={columns.length}
|
||||
className="h-24 text-center"
|
||||
>
|
||||
No results.
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
)}
|
||||
</TableBody>
|
||||
</Table>
|
||||
</div>
|
||||
<div className="flex items-center justify-end space-x-2 py-1">
|
||||
<div className="space-x-2">
|
||||
<Button
|
||||
variant="outline"
|
||||
size="sm"
|
||||
onClick={() => table.previousPage()}
|
||||
disabled={!table.getCanPreviousPage()}
|
||||
>
|
||||
Previous
|
||||
</Button>
|
||||
<Button
|
||||
variant="outline"
|
||||
size="sm"
|
||||
onClick={() => table.nextPage()}
|
||||
disabled={!table.getCanNextPage()}
|
||||
>
|
||||
Next
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -6,10 +6,12 @@ import { timeTicks } from "d3-time"
|
||||
import {
|
||||
ChevronRightSquareIcon,
|
||||
ClockArrowUp,
|
||||
Container as ContainerIcon,
|
||||
CpuIcon,
|
||||
GlobeIcon,
|
||||
LayoutGridIcon,
|
||||
MonitorIcon,
|
||||
Server as ServerIcon,
|
||||
XIcon,
|
||||
} from "lucide-react"
|
||||
import { subscribeKeys } from "nanostores"
|
||||
@@ -30,9 +32,11 @@ import {
|
||||
$allSystemsById,
|
||||
$allSystemsByName,
|
||||
$chartTime,
|
||||
$containerColors,
|
||||
$containerFilter,
|
||||
$direction,
|
||||
$maxValues,
|
||||
$stackFilter,
|
||||
$systems,
|
||||
$temperatureFilter,
|
||||
$userSettings,
|
||||
@@ -69,6 +73,7 @@ import { AppleIcon, ChartAverage, ChartMax, FreeBsdIcon, Rows, TuxIcon, WebSocke
|
||||
import { Input } from "../ui/input"
|
||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../ui/select"
|
||||
import { Separator } from "../ui/separator"
|
||||
import { Tabs, TabsContent, TabsList, TabsTrigger } from "../ui/tabs"
|
||||
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "../ui/tooltip"
|
||||
import NetworkSheet from "./system/network-sheet"
|
||||
import LineChartDefault from "../charts/line-chart"
|
||||
@@ -396,17 +401,74 @@ export default memo(function SystemDetail({ id }: { id: string }) {
|
||||
}, [system, t])
|
||||
|
||||
/** Space for tooltip if more than 12 containers */
|
||||
// biome-ignore lint/correctness/useExhaustiveDependencies: filters accessed via .get()
|
||||
useEffect(() => {
|
||||
if (!netCardRef.current || !containerData.length) {
|
||||
setBottomSpacing(0)
|
||||
return
|
||||
const calculateSpacing = () => {
|
||||
if (!netCardRef.current || !containerData.length) {
|
||||
setBottomSpacing(0)
|
||||
return
|
||||
}
|
||||
|
||||
// Count visible containers after applying filters
|
||||
const containerFilter = $containerFilter.get()
|
||||
const stackFilter = $stackFilter.get()
|
||||
let visibleCount = 0
|
||||
|
||||
if (containerData[0]) {
|
||||
for (const [key, value] of Object.entries(containerData[0])) {
|
||||
if (key === "created") continue
|
||||
|
||||
// Apply container filter
|
||||
if (containerFilter.length > 0 && !containerFilter.includes(key)) {
|
||||
continue
|
||||
}
|
||||
|
||||
// Apply stack filter
|
||||
if (stackFilter.length > 0 && typeof value === "object" && value) {
|
||||
const stackName = (value as any).p || "—"
|
||||
if (!stackFilter.includes(stackName)) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
visibleCount++
|
||||
}
|
||||
}
|
||||
|
||||
// Only add spacing if there are more than 12 visible containers
|
||||
if (visibleCount > 12) {
|
||||
const tooltipHeight = (visibleCount - 11) * 17.8 - 40
|
||||
const wrapperEl = chartWrapRef.current as HTMLDivElement
|
||||
const wrapperRect = wrapperEl.getBoundingClientRect()
|
||||
const chartRect = netCardRef.current.getBoundingClientRect()
|
||||
const distanceToBottom = wrapperRect.bottom - chartRect.bottom
|
||||
const spacing = Math.max(0, tooltipHeight - distanceToBottom)
|
||||
setBottomSpacing(spacing)
|
||||
} else {
|
||||
setBottomSpacing(0)
|
||||
}
|
||||
}
|
||||
|
||||
// Initial calculation
|
||||
calculateSpacing()
|
||||
|
||||
// Subscribe to filter changes to recalculate
|
||||
// Use requestAnimationFrame to wait for chart re-render, then add small delay for layout
|
||||
const unsubContainer = $containerFilter.subscribe(() => {
|
||||
requestAnimationFrame(() => {
|
||||
setTimeout(calculateSpacing, 100)
|
||||
})
|
||||
})
|
||||
const unsubStack = $stackFilter.subscribe(() => {
|
||||
requestAnimationFrame(() => {
|
||||
setTimeout(calculateSpacing, 100)
|
||||
})
|
||||
})
|
||||
|
||||
return () => {
|
||||
unsubContainer()
|
||||
unsubStack()
|
||||
}
|
||||
const tooltipHeight = (Object.keys(containerData[0]).length - 11) * 17.8 - 40
|
||||
const wrapperEl = chartWrapRef.current as HTMLDivElement
|
||||
const wrapperRect = wrapperEl.getBoundingClientRect()
|
||||
const chartRect = netCardRef.current.getBoundingClientRect()
|
||||
const distanceToBottom = wrapperRect.bottom - chartRect.bottom
|
||||
setBottomSpacing(tooltipHeight - distanceToBottom)
|
||||
}, [containerData])
|
||||
|
||||
// keyboard navigation between systems
|
||||
@@ -454,7 +516,14 @@ export default memo(function SystemDetail({ id }: { id: string }) {
|
||||
const maxValSelect = isLongerChart ? <SelectAvgMax max={maxValues} /> : null
|
||||
const showMax = maxValues && isLongerChart
|
||||
|
||||
const containerFilterBar = containerData.length ? <FilterBar /> : null
|
||||
const containerFilterBar = containerData.length ? <FilterBar containerData={containerData} /> : null
|
||||
const stackFilterBar = containerData.length ? <FilterBar containerData={containerData} store={$stackFilter} mode="stack" /> : null
|
||||
const combinedFilterBar = containerData.length ? (
|
||||
<div className="flex gap-2">
|
||||
<FilterBar containerData={containerData} />
|
||||
<FilterBar containerData={containerData} store={$stackFilter} mode="stack" />
|
||||
</div>
|
||||
) : null
|
||||
|
||||
const dataEmpty = !chartLoading && chartData.systemStats.length === 0
|
||||
const lastGpuVals = Object.values(systemStats.at(-1)?.stats.g ?? {})
|
||||
@@ -569,6 +638,22 @@ export default memo(function SystemDetail({ id }: { id: string }) {
|
||||
</div>
|
||||
</Card>
|
||||
|
||||
|
||||
{/* Tabbed interface for system and Docker stats */}
|
||||
<Tabs defaultValue="system" className="w-full">
|
||||
<TabsList className="grid w-full grid-cols-2 mb-4">
|
||||
<TabsTrigger value="system" className="flex items-center gap-2">
|
||||
<ServerIcon className="h-4 w-4" />
|
||||
{t`System Stats`}
|
||||
</TabsTrigger>
|
||||
<TabsTrigger value="docker" className="flex items-center gap-2">
|
||||
<ContainerIcon className="h-4 w-4" />
|
||||
{dockerOrPodman(t`Docker Stats`, system)}
|
||||
</TabsTrigger>
|
||||
</TabsList>
|
||||
|
||||
{/* System Stats Tab */}
|
||||
<TabsContent value="system" className="space-y-4">
|
||||
{/* main charts */}
|
||||
<div className="grid xl:grid-cols-2 gap-4">
|
||||
<ChartCard
|
||||
@@ -594,23 +679,6 @@ export default memo(function SystemDetail({ id }: { id: string }) {
|
||||
/>
|
||||
</ChartCard>
|
||||
|
||||
{containerFilterBar && (
|
||||
<ChartCard
|
||||
empty={dataEmpty}
|
||||
grid={grid}
|
||||
title={dockerOrPodman(t`Docker CPU Usage`, system)}
|
||||
description={t`Average CPU utilization of containers`}
|
||||
cornerEl={containerFilterBar}
|
||||
>
|
||||
<ContainerChart
|
||||
chartData={chartData}
|
||||
dataKey="c"
|
||||
chartType={ChartType.CPU}
|
||||
chartConfig={containerChartConfigs.cpu}
|
||||
/>
|
||||
</ChartCard>
|
||||
)}
|
||||
|
||||
<ChartCard
|
||||
empty={dataEmpty}
|
||||
grid={grid}
|
||||
@@ -621,23 +689,6 @@ export default memo(function SystemDetail({ id }: { id: string }) {
|
||||
<MemChart chartData={chartData} showMax={showMax} />
|
||||
</ChartCard>
|
||||
|
||||
{containerFilterBar && (
|
||||
<ChartCard
|
||||
empty={dataEmpty}
|
||||
grid={grid}
|
||||
title={dockerOrPodman(t`Docker Memory Usage`, system)}
|
||||
description={dockerOrPodman(t`Memory usage of docker containers`, system)}
|
||||
cornerEl={containerFilterBar}
|
||||
>
|
||||
<ContainerChart
|
||||
chartData={chartData}
|
||||
dataKey="m"
|
||||
chartType={ChartType.Memory}
|
||||
chartConfig={containerChartConfigs.memory}
|
||||
/>
|
||||
</ChartCard>
|
||||
)}
|
||||
|
||||
<ChartCard empty={dataEmpty} grid={grid} title={t`Disk Usage`} description={t`Usage of root partition`}>
|
||||
<DiskChart chartData={chartData} dataKey="stats.du" diskSize={systemStats.at(-1)?.stats.d ?? NaN} />
|
||||
</ChartCard>
|
||||
@@ -740,29 +791,6 @@ export default memo(function SystemDetail({ id }: { id: string }) {
|
||||
/>
|
||||
</ChartCard>
|
||||
|
||||
{containerFilterBar && containerData.length > 0 && (
|
||||
<div
|
||||
ref={netCardRef}
|
||||
className={cn({
|
||||
"col-span-full": !grid,
|
||||
})}
|
||||
>
|
||||
<ChartCard
|
||||
empty={dataEmpty}
|
||||
title={dockerOrPodman(t`Docker Network I/O`, system)}
|
||||
description={dockerOrPodman(t`Network traffic of docker containers`, system)}
|
||||
cornerEl={containerFilterBar}
|
||||
>
|
||||
<ContainerChart
|
||||
chartData={chartData}
|
||||
chartType={ChartType.Network}
|
||||
dataKey="n"
|
||||
chartConfig={containerChartConfigs.network}
|
||||
/>
|
||||
</ChartCard>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Swap chart */}
|
||||
{(systemStats.at(-1)?.stats.su ?? 0) > 0 && (
|
||||
<ChartCard
|
||||
@@ -987,6 +1015,125 @@ export default memo(function SystemDetail({ id }: { id: string }) {
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
</TabsContent>
|
||||
|
||||
{/* Docker Stats Tab */}
|
||||
<TabsContent value="docker" className="space-y-4">
|
||||
{/* Centralized filter bar for all Docker charts */}
|
||||
{combinedFilterBar && (
|
||||
<div className="flex justify-end gap-2 pb-2">
|
||||
{combinedFilterBar}
|
||||
</div>
|
||||
)}
|
||||
<div className="grid xl:grid-cols-2 gap-4">
|
||||
{containerFilterBar && (
|
||||
<ChartCard
|
||||
empty={dataEmpty}
|
||||
grid={grid}
|
||||
title={dockerOrPodman(t`Docker CPU Usage`, system)}
|
||||
description={t`Average CPU utilization of containers`}
|
||||
>
|
||||
<ContainerChart
|
||||
chartData={chartData}
|
||||
dataKey="c"
|
||||
chartType={ChartType.CPU}
|
||||
chartConfig={containerChartConfigs.cpu}
|
||||
/>
|
||||
</ChartCard>
|
||||
)}
|
||||
|
||||
{containerFilterBar && (
|
||||
<ChartCard
|
||||
empty={dataEmpty}
|
||||
grid={grid}
|
||||
title={dockerOrPodman(t`Docker Memory Usage`, system)}
|
||||
description={dockerOrPodman(t`Memory usage of docker containers`, system)}
|
||||
>
|
||||
<ContainerChart
|
||||
chartData={chartData}
|
||||
dataKey="m"
|
||||
chartType={ChartType.Memory}
|
||||
chartConfig={containerChartConfigs.memory}
|
||||
/>
|
||||
</ChartCard>
|
||||
)}
|
||||
|
||||
{containerFilterBar && containerData.length > 0 && (
|
||||
<div
|
||||
ref={netCardRef}
|
||||
className={cn({
|
||||
"col-span-full": !grid,
|
||||
})}
|
||||
>
|
||||
<ChartCard
|
||||
empty={dataEmpty}
|
||||
title={dockerOrPodman(t`Docker Network I/O`, system)}
|
||||
description={dockerOrPodman(t`Network traffic of docker containers`, system)}
|
||||
>
|
||||
<ContainerChart
|
||||
chartData={chartData}
|
||||
chartType={ChartType.Network}
|
||||
dataKey="n"
|
||||
chartConfig={containerChartConfigs.network}
|
||||
/>
|
||||
</ChartCard>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Docker Disk I/O chart */}
|
||||
{containerFilterBar && (
|
||||
<ChartCard
|
||||
empty={dataEmpty}
|
||||
grid={grid}
|
||||
title={dockerOrPodman(t`Docker Disk I/O`, system)}
|
||||
description={dockerOrPodman(t`Disk read/write rates of docker containers`, system)}
|
||||
>
|
||||
<ContainerChart
|
||||
chartData={chartData}
|
||||
chartType={ChartType.DiskIO}
|
||||
dataKey="d"
|
||||
chartConfig={{}}
|
||||
unit=" MB/s"
|
||||
/>
|
||||
</ChartCard>
|
||||
)}
|
||||
|
||||
{/* Docker Volumes chart */}
|
||||
{containerFilterBar && (
|
||||
<ChartCard
|
||||
empty={dataEmpty}
|
||||
grid={grid}
|
||||
title={dockerOrPodman(t`Docker Volumes`, system)}
|
||||
description={dockerOrPodman(t`Volume usage of docker containers`, system)}
|
||||
>
|
||||
<ContainerChart
|
||||
chartData={chartData}
|
||||
chartType={ChartType.Volume}
|
||||
dataKey="v"
|
||||
chartConfig={{}}
|
||||
/>
|
||||
</ChartCard>
|
||||
)}
|
||||
|
||||
{/* Docker Health & Uptime chart */}
|
||||
{containerFilterBar && (
|
||||
<ChartCard
|
||||
empty={dataEmpty}
|
||||
grid={grid}
|
||||
title={dockerOrPodman(t`Docker Health & Uptime`, system)}
|
||||
description={dockerOrPodman(t`Container health status and uptime`, system)}
|
||||
>
|
||||
<ContainerChart
|
||||
chartData={chartData}
|
||||
chartType={ChartType.HealthUptime}
|
||||
dataKey="h"
|
||||
chartConfig={{}}
|
||||
/>
|
||||
</ChartCard>
|
||||
)}
|
||||
</div>
|
||||
</TabsContent>
|
||||
</Tabs>
|
||||
</div>
|
||||
|
||||
{/* add space for tooltip if more than 12 containers */}
|
||||
@@ -1017,38 +1164,121 @@ function GpuEnginesChart({ chartData }: { chartData: ChartData }) {
|
||||
)
|
||||
}
|
||||
|
||||
function FilterBar({ store = $containerFilter }: { store?: typeof $containerFilter }) {
|
||||
const containerFilter = useStore(store)
|
||||
function FilterBar({
|
||||
store = $containerFilter,
|
||||
containerData,
|
||||
mode = "container"
|
||||
}: {
|
||||
store?: typeof $containerFilter
|
||||
containerData?: ChartData["containerData"]
|
||||
mode?: "container" | "stack"
|
||||
}) {
|
||||
const selected = useStore(store)
|
||||
const { t } = useLingui()
|
||||
const [open, setOpen] = useState(false)
|
||||
|
||||
const debouncedStoreSet = useMemo(() => debounce((value: string) => store.set(value), 80), [store])
|
||||
// Extract all unique container names or stack names from current data
|
||||
const availableItems = useMemo(() => {
|
||||
const items = new Set<string>()
|
||||
if (containerData) {
|
||||
for (const dataPoint of containerData) {
|
||||
if (dataPoint.created) {
|
||||
for (const [key, value] of Object.entries(dataPoint)) {
|
||||
if (key !== "created") {
|
||||
if (mode === "stack" && typeof value === "object" && value) {
|
||||
// Extract stack/project name
|
||||
const stackName = (value as any).p || "—"
|
||||
items.add(stackName)
|
||||
} else if (mode === "container") {
|
||||
// Add container name
|
||||
items.add(key)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return Array.from(items).sort()
|
||||
}, [containerData, mode])
|
||||
|
||||
const handleChange = useCallback(
|
||||
(e: React.ChangeEvent<HTMLInputElement>) => debouncedStoreSet(e.target.value),
|
||||
[debouncedStoreSet]
|
||||
)
|
||||
const toggleItem = useCallback((item: string) => {
|
||||
const current = store.get()
|
||||
if (current.includes(item)) {
|
||||
store.set(current.filter(i => i !== item))
|
||||
} else {
|
||||
store.set([...current, item])
|
||||
}
|
||||
}, [store])
|
||||
|
||||
const clearAll = useCallback(() => {
|
||||
store.set([])
|
||||
setOpen(false)
|
||||
}, [store])
|
||||
|
||||
// Close dropdown when clicking outside
|
||||
useEffect(() => {
|
||||
if (!open) return
|
||||
const handleClickOutside = (e: MouseEvent) => {
|
||||
const target = e.target as HTMLElement
|
||||
if (!target.closest('[data-filter-dropdown]')) {
|
||||
setOpen(false)
|
||||
}
|
||||
}
|
||||
document.addEventListener('mousedown', handleClickOutside)
|
||||
return () => document.removeEventListener('mousedown', handleClickOutside)
|
||||
}, [open])
|
||||
|
||||
return (
|
||||
<>
|
||||
<Input
|
||||
placeholder={t`Filter...`}
|
||||
className="ps-4 pe-8 w-full sm:w-44"
|
||||
onChange={handleChange}
|
||||
value={containerFilter}
|
||||
/>
|
||||
{containerFilter && (
|
||||
<Button
|
||||
type="button"
|
||||
variant="ghost"
|
||||
size="icon"
|
||||
aria-label="Clear"
|
||||
className="absolute right-1 top-1/2 -translate-y-1/2 h-7 w-7 text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-gray-100"
|
||||
onClick={() => store.set("")}
|
||||
>
|
||||
<XIcon className="h-4 w-4" />
|
||||
</Button>
|
||||
<div className="relative" data-filter-dropdown>
|
||||
<Button
|
||||
variant="outline"
|
||||
size="sm"
|
||||
className="h-9 w-full sm:w-44 justify-between"
|
||||
onClick={() => setOpen(!open)}
|
||||
>
|
||||
<span className="truncate">
|
||||
{selected.length === 0
|
||||
? (mode === "stack" ? t`Filter stacks...` : t`Filter containers...`)
|
||||
: `${selected.length} selected`
|
||||
}
|
||||
</span>
|
||||
<ChevronRightSquareIcon className="ml-2 h-4 w-4 opacity-50" />
|
||||
</Button>
|
||||
{open && (
|
||||
<div className="absolute z-50 mt-1 w-full sm:w-64 bg-popover border rounded-md shadow-md">
|
||||
<div className="p-2 space-y-1 max-h-64 overflow-y-auto">
|
||||
{availableItems.length === 0 ? (
|
||||
<div className="py-6 text-center text-sm text-muted-foreground">
|
||||
{t`No items available`}
|
||||
</div>
|
||||
) : (
|
||||
availableItems.map((item) => (
|
||||
<div
|
||||
key={item}
|
||||
className="flex items-center space-x-2 rounded-sm px-2 py-1.5 cursor-pointer hover:bg-accent"
|
||||
onClick={() => toggleItem(item)}
|
||||
>
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={selected.includes(item)}
|
||||
onChange={() => {}}
|
||||
className="h-4 w-4"
|
||||
/>
|
||||
<span className="text-sm truncate flex-1">{item}</span>
|
||||
</div>
|
||||
))
|
||||
)}
|
||||
</div>
|
||||
{selected.length > 0 && (
|
||||
<div className="border-t p-2">
|
||||
<Button variant="ghost" size="sm" className="w-full" onClick={clearAll}>
|
||||
{t`Clear all`}
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ const ChartTooltipContent = React.forwardRef<
|
||||
nameKey?: string
|
||||
labelKey?: string
|
||||
unit?: string
|
||||
filter?: string
|
||||
filter?: string | string[]
|
||||
contentFormatter?: (item: any, key: string) => React.ReactNode | string
|
||||
truncate?: boolean
|
||||
}
|
||||
@@ -129,13 +129,19 @@ const ChartTooltipContent = React.forwardRef<
|
||||
|
||||
React.useMemo(() => {
|
||||
if (filter) {
|
||||
payload = payload?.filter((item) => (item.name as string)?.toLowerCase().includes(filter.toLowerCase()))
|
||||
if (Array.isArray(filter)) {
|
||||
// Array filter: only show items that are in the filter array
|
||||
payload = payload?.filter((item) => filter.includes(item.name as string))
|
||||
} else {
|
||||
// String filter: show items that match the string (backward compatibility)
|
||||
payload = payload?.filter((item) => (item.name as string)?.toLowerCase().includes(filter.toLowerCase()))
|
||||
}
|
||||
}
|
||||
if (itemSorter) {
|
||||
// @ts-expect-error
|
||||
payload?.sort(itemSorter)
|
||||
}
|
||||
}, [itemSorter, payload])
|
||||
}, [itemSorter, payload, filter])
|
||||
|
||||
const tooltipLabel = React.useMemo(() => {
|
||||
if (hideLabel || !payload?.length) {
|
||||
|
||||
@@ -12,6 +12,11 @@ export enum ChartType {
|
||||
Disk,
|
||||
Network,
|
||||
CPU,
|
||||
Volume,
|
||||
Health,
|
||||
Uptime,
|
||||
HealthUptime,
|
||||
DiskIO,
|
||||
}
|
||||
|
||||
/** Unit of measurement */
|
||||
|
||||
@@ -53,7 +53,13 @@ export const $userSettings = map<UserSettings>({
|
||||
listenKeys($userSettings, ["chartTime"], ({ chartTime }) => $chartTime.set(chartTime))
|
||||
|
||||
/** Container chart filter */
|
||||
export const $containerFilter = atom("")
|
||||
export const $containerFilter = atom<string[]>([])
|
||||
|
||||
/** Stack chart filter */
|
||||
export const $stackFilter = atom<string[]>([])
|
||||
|
||||
/** Container color mapping for consistent colors across charts */
|
||||
export const $containerColors = atom<Record<string, string>>({})
|
||||
|
||||
/** Temperature chart filter */
|
||||
export const $temperatureFilter = atom("")
|
||||
|
||||
@@ -290,6 +290,45 @@ export function formatBytes(
|
||||
|
||||
export const chartMargin = { top: 12 }
|
||||
|
||||
export function toFixedWithoutTrailingZeros(num: number, decimals: number): string {
|
||||
const str = num.toFixed(decimals)
|
||||
return str.replace(/\.?0+$/, "")
|
||||
}
|
||||
|
||||
export const getSizeAndUnit = (n: number, isGigabytes = true) => {
|
||||
const sizeInGB = isGigabytes ? n : n / 1_000
|
||||
|
||||
if (sizeInGB >= 1_000) {
|
||||
return { v: sizeInGB / 1_000, u: " TB" }
|
||||
}
|
||||
if (sizeInGB >= 1) {
|
||||
return { v: sizeInGB, u: " GB" }
|
||||
}
|
||||
return { v: isGigabytes ? sizeInGB * 1_000 : n, u: " MB" }
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a consistent fallback color for containers without assigned colors
|
||||
* @param name Container name or identifier
|
||||
* @returns HSL color string
|
||||
*/
|
||||
export function generateFallbackColor(name: string): string {
|
||||
// Use a simple hash of the name to generate consistent colors
|
||||
let hash = 0
|
||||
for (let i = 0; i < name.length; i++) {
|
||||
const char = name.charCodeAt(i)
|
||||
hash = (hash << 5) - hash + char
|
||||
hash = hash & hash // Convert to 32-bit integer
|
||||
}
|
||||
|
||||
// Generate hue, saturation, and lightness from the hash
|
||||
const hue = Math.abs(hash) % 360
|
||||
const saturation = 65 + (Math.abs(hash) % 3) * 10 // 65%, 75%, 85%
|
||||
const lightness = 50 + (Math.abs(hash) % 3) * 10 // 50%, 60%, 70%
|
||||
|
||||
return `hsl(${hue}, ${saturation}%, ${lightness}%)`
|
||||
}
|
||||
|
||||
/**
|
||||
* Retuns value of system host, truncating full path if socket.
|
||||
* @example
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "تحقق من السجلات لمزيد من التفاصيل."
|
||||
msgid "Check your notification service"
|
||||
msgstr "تحقق من خدمة الإشعارات الخاصة بك"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "انقر على نظام لعرض مزيد من المعلومات."
|
||||
@@ -293,6 +297,10 @@ msgstr "تأكيد كلمة المرور"
|
||||
msgid "Connection is down"
|
||||
msgstr "الاتصال مقطوع"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "القرص"
|
||||
msgid "Disk I/O"
|
||||
msgstr "إدخال/إخراج القرص"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "وحدة القرص"
|
||||
@@ -433,6 +445,14 @@ msgstr "استخدام القرص لـ {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "استخدام المعالج للدوكر"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "استخدام الذاكرة للدوكر"
|
||||
@@ -441,6 +461,14 @@ msgstr "استخدام الذاكرة للدوكر"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "إدخال/إخراج الشبكة للدوكر"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "التوثيق"
|
||||
@@ -549,8 +577,15 @@ msgstr "فشل في إرسال إشعار الاختبار"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "فشل في تحديث التنبيه"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "تصفية..."
|
||||
@@ -727,6 +762,10 @@ msgstr "حركة مرور الشبكة للواجهات العامة"
|
||||
msgid "Network unit"
|
||||
msgstr "وحدة الشبكة"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "لم يتم العثور على نتائج."
|
||||
@@ -991,6 +1030,10 @@ msgstr "النظام"
|
||||
msgid "System load averages over time"
|
||||
msgstr "متوسط تحميل النظام مع مرور الوقت"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "الأنظمة"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "عرض أحدث 200 تنبيه."
|
||||
msgid "Visible Fields"
|
||||
msgstr "الأعمدة الظاهرة"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "في انتظار وجود سجلات كافية للعرض"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Провери log-овете за повече информация."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Провери услугата си за удостоверяване"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "Кликнете върху система, за да видите повече информация."
|
||||
@@ -293,6 +297,10 @@ msgstr "Потвърди парола"
|
||||
msgid "Connection is down"
|
||||
msgstr "Връзката е прекъсната"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Диск"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Диск I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "Единица за диск"
|
||||
@@ -433,6 +445,14 @@ msgstr "Изполване на диск от {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Използване на процесор от docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Изполване на памет от docker"
|
||||
@@ -441,6 +461,14 @@ msgstr "Изполване на памет от docker"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Мрежов I/O използван от docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Документация"
|
||||
@@ -549,8 +577,15 @@ msgstr "Неуспешно изпрати тестова нотификация"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Неуспешно обнови тревога"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Филтрирай..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Мрежов трафик на публични интерфейси"
|
||||
msgid "Network unit"
|
||||
msgstr "Единица за измерване на скорост"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Няма намерени резултати."
|
||||
@@ -991,6 +1030,10 @@ msgstr "Система"
|
||||
msgid "System load averages over time"
|
||||
msgstr "Средно натоварване на системата във времето"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Системи"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "Прегледайте последните си 200 сигнала."
|
||||
msgid "Visible Fields"
|
||||
msgstr "Видими полета"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Изчаква се за достатъчно записи за показване"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Pro více informací zkontrolujte logy."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Zkontrolujte službu upozornění"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "Klikněte na systém pro zobrazení více informací."
|
||||
@@ -293,6 +297,10 @@ msgstr "Potvrdit heslo"
|
||||
msgid "Connection is down"
|
||||
msgstr "Připojení je nedostupné"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Disk"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Disk I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "Disková jednotka"
|
||||
@@ -433,6 +445,14 @@ msgstr "Využití disku {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Využití CPU Dockeru"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Využití paměti Dockeru"
|
||||
@@ -441,6 +461,14 @@ msgstr "Využití paměti Dockeru"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Síťové I/O Dockeru"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Dokumentace"
|
||||
@@ -549,8 +577,15 @@ msgstr "Nepodařilo se odeslat testovací oznámení"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Nepodařilo se aktualizovat upozornění"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Filtr..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Síťový provoz veřejných rozhraní"
|
||||
msgid "Network unit"
|
||||
msgstr "Síťová jednotka"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Nenalezeny žádné výskyty."
|
||||
@@ -991,6 +1030,10 @@ msgstr "Systém"
|
||||
msgid "System load averages over time"
|
||||
msgstr "Průměry zatížení systému v průběhu času"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Systémy"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "Zobrazit vašich 200 nejnovějších upozornění."
|
||||
msgid "Visible Fields"
|
||||
msgstr "Viditelné sloupce"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Čeká se na dostatek záznamů k zobrazení"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Tjek logfiler for flere detaljer."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Tjek din notifikationstjeneste"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr ""
|
||||
@@ -293,6 +297,10 @@ msgstr "Bekræft adgangskode"
|
||||
msgid "Connection is down"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Disk"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Disk I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr ""
|
||||
@@ -433,6 +445,14 @@ msgstr "Diskforbrug af {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Docker CPU forbrug"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Docker Hukommelsesforbrug"
|
||||
@@ -441,6 +461,14 @@ msgstr "Docker Hukommelsesforbrug"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Docker Netværk I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Dokumentation"
|
||||
@@ -549,8 +577,15 @@ msgstr "Afsendelse af testnotifikation mislykkedes"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Kunne ikke opdatere alarm"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Filter..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Netværkstrafik af offentlige grænseflader"
|
||||
msgid "Network unit"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Ingen resultater fundet."
|
||||
@@ -991,6 +1030,10 @@ msgstr "System"
|
||||
msgid "System load averages over time"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Systemer"
|
||||
@@ -1203,6 +1246,10 @@ msgstr ""
|
||||
msgid "Visible Fields"
|
||||
msgstr "Synlige felter"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Venter på nok posteringer til at vise"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Überprüfe die Protokolle für weitere Details."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Überprüfe deinen Benachrichtigungsdienst"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "Klicke auf ein System, um weitere Informationen zu sehen."
|
||||
@@ -293,6 +297,10 @@ msgstr "Passwort bestätigen"
|
||||
msgid "Connection is down"
|
||||
msgstr "Verbindung unterbrochen"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Festplatte"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Festplatten-I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "Festplatteneinheit"
|
||||
@@ -433,6 +445,14 @@ msgstr "Festplattennutzung von {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Docker-CPU-Auslastung"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Docker-Arbeitsspeichernutzung"
|
||||
@@ -441,6 +461,14 @@ msgstr "Docker-Arbeitsspeichernutzung"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Docker-Netzwerk-I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Dokumentation"
|
||||
@@ -549,8 +577,15 @@ msgstr "Testbenachrichtigung konnte nicht gesendet werden"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Warnung konnte nicht aktualisiert werden"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Filter..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Netzwerkverkehr der öffentlichen Schnittstellen"
|
||||
msgid "Network unit"
|
||||
msgstr "Netzwerkeinheit"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Keine Ergebnisse gefunden."
|
||||
@@ -991,6 +1030,10 @@ msgstr "System"
|
||||
msgid "System load averages over time"
|
||||
msgstr "Systemlastdurchschnitt im Zeitverlauf"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Systeme"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "Sieh dir die neusten 200 Alarme an."
|
||||
msgid "Visible Fields"
|
||||
msgstr "Sichtbare Spalten"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Warten auf genügend Datensätze zur Anzeige"
|
||||
|
||||
@@ -262,6 +262,10 @@ msgstr "Check logs for more details."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Check your notification service"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr "Clear all"
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "Click on a system to view more information."
|
||||
@@ -288,6 +292,10 @@ msgstr "Confirm password"
|
||||
msgid "Connection is down"
|
||||
msgstr "Connection is down"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr "Container health status and uptime"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -410,6 +418,10 @@ msgstr "Disk"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Disk I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr "Disk read/write rates of docker containers"
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "Disk unit"
|
||||
@@ -428,6 +440,14 @@ msgstr "Disk usage of {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Docker CPU Usage"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr "Docker Disk I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr "Docker Health & Uptime"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Docker Memory Usage"
|
||||
@@ -436,6 +456,14 @@ msgstr "Docker Memory Usage"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Docker Network I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr "Docker Stats"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr "Docker Volumes"
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Documentation"
|
||||
@@ -544,8 +572,15 @@ msgstr "Failed to send test notification"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Failed to update alert"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr "Filter containers..."
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr "Filter stacks..."
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Filter..."
|
||||
@@ -722,6 +757,10 @@ msgstr "Network traffic of public interfaces"
|
||||
msgid "Network unit"
|
||||
msgstr "Network unit"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr "No items available"
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "No results found."
|
||||
@@ -986,6 +1025,10 @@ msgstr "System"
|
||||
msgid "System load averages over time"
|
||||
msgstr "System load averages over time"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr "System Stats"
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Systems"
|
||||
@@ -1198,6 +1241,10 @@ msgstr "View your 200 most recent alerts."
|
||||
msgid "Visible Fields"
|
||||
msgstr "Visible Fields"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr "Volume usage of docker containers"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Waiting for enough records to display"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Revise los registros para más detalles."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Verifique su servicio de notificaciones"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "Haga clic en un sistema para ver más información."
|
||||
@@ -293,6 +297,10 @@ msgstr "Confirmar contraseña"
|
||||
msgid "Connection is down"
|
||||
msgstr "La conexión está caída"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Disco"
|
||||
msgid "Disk I/O"
|
||||
msgstr "E/S de Disco"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "Unidad de disco"
|
||||
@@ -433,6 +445,14 @@ msgstr "Uso de disco de {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Uso de CPU de Docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Uso de Memoria de Docker"
|
||||
@@ -441,6 +461,14 @@ msgstr "Uso de Memoria de Docker"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "E/S de Red de Docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Documentación"
|
||||
@@ -549,8 +577,15 @@ msgstr "Error al enviar la notificación de prueba"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Error al actualizar la alerta"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Filtrar..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Tráfico de red de interfaces públicas"
|
||||
msgid "Network unit"
|
||||
msgstr "Unidad de red"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "No se encontraron resultados."
|
||||
@@ -991,6 +1030,10 @@ msgstr "Sistema"
|
||||
msgid "System load averages over time"
|
||||
msgstr "Promedios de carga del sistema a lo largo del tiempo"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Sistemas"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "Ver sus 200 alertas más recientes."
|
||||
msgid "Visible Fields"
|
||||
msgstr "Columnas visibles"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Esperando suficientes registros para mostrar"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "برای جزئیات بیشتر، لاگها را بررسی کنی
|
||||
msgid "Check your notification service"
|
||||
msgstr "سرویس اطلاعرسانی خود را بررسی کنید"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "برای مشاهده اطلاعات بیشتر روی یک سیستم کلیک کنید."
|
||||
@@ -293,6 +297,10 @@ msgstr "تأیید رمز عبور"
|
||||
msgid "Connection is down"
|
||||
msgstr "اتصال قطع است"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "دیسک"
|
||||
msgid "Disk I/O"
|
||||
msgstr "ورودی/خروجی دیسک"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "واحد دیسک"
|
||||
@@ -433,6 +445,14 @@ msgstr "میزان استفاده از دیسک {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "میزان استفاده از CPU داکر"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "میزان استفاده از حافظه داکر"
|
||||
@@ -441,6 +461,14 @@ msgstr "میزان استفاده از حافظه داکر"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "ورودی/خروجی شبکه داکر"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "مستندات"
|
||||
@@ -549,8 +577,15 @@ msgstr "ارسال اعلان آزمایشی ناموفق بود"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "بهروزرسانی هشدار ناموفق بود"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "فیلتر..."
|
||||
@@ -727,6 +762,10 @@ msgstr "ترافیک شبکه رابطهای عمومی"
|
||||
msgid "Network unit"
|
||||
msgstr "واحد شبکه"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "هیچ نتیجهای یافت نشد."
|
||||
@@ -991,6 +1030,10 @@ msgstr "سیستم"
|
||||
msgid "System load averages over time"
|
||||
msgstr "میانگین بار سیستم در طول زمان"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "سیستمها"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "۲۰۰ هشدار اخیر خود را مشاهده کنید."
|
||||
msgid "Visible Fields"
|
||||
msgstr "فیلدهای قابل مشاهده"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "در انتظار رکوردهای کافی برای نمایش"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Vérifiez les journaux pour plus de détails."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Vérifiez votre service de notification"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr ""
|
||||
@@ -293,6 +297,10 @@ msgstr "Confirmer le mot de passe"
|
||||
msgid "Connection is down"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Disque"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Entrée/Sortie disque"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr ""
|
||||
@@ -433,6 +445,14 @@ msgstr "Utilisation du disque de {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Utilisation du CPU Docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Utilisation de la mémoire Docker"
|
||||
@@ -441,6 +461,14 @@ msgstr "Utilisation de la mémoire Docker"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Entrée/Sortie réseau Docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Documentation"
|
||||
@@ -549,8 +577,15 @@ msgstr "Échec de l'envoi de la notification de test"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Échec de la mise à jour de l'alerte"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Filtrer..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Trafic réseau des interfaces publiques"
|
||||
msgid "Network unit"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Aucun résultat trouvé."
|
||||
@@ -991,6 +1030,10 @@ msgstr "Système"
|
||||
msgid "System load averages over time"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Systèmes"
|
||||
@@ -1203,6 +1246,10 @@ msgstr ""
|
||||
msgid "Visible Fields"
|
||||
msgstr "Colonnes visibles"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "En attente de suffisamment d'enregistrements à afficher"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Provjerite logove za više detalja."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Provjerite Vaš servis notifikacija"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr ""
|
||||
@@ -293,6 +297,10 @@ msgstr "Potvrdite lozinku"
|
||||
msgid "Connection is down"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Disk"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Disk I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr ""
|
||||
@@ -433,6 +445,14 @@ msgstr "Iskorištenost diska od {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Iskorištenost Docker Procesora"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Iskorištenost Docker Memorije"
|
||||
@@ -441,6 +461,14 @@ msgstr "Iskorištenost Docker Memorije"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Docker Mrežni I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Dokumentacija"
|
||||
@@ -549,8 +577,15 @@ msgstr "Neuspješno slanje testne notifikacije"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Ažuriranje upozorenja nije uspjelo"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Filtriraj..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Mrežni promet javnih sučelja"
|
||||
msgid "Network unit"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Nema rezultata."
|
||||
@@ -991,6 +1030,10 @@ msgstr "Sistem"
|
||||
msgid "System load averages over time"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Sistemi"
|
||||
@@ -1203,6 +1246,10 @@ msgstr ""
|
||||
msgid "Visible Fields"
|
||||
msgstr "Vidljiva polja"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Čeka se na više podataka prije prikaza"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Ellenőrizd a naplót a további részletekért."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Ellenőrizd az értesítési szolgáltatásodat"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr ""
|
||||
@@ -293,6 +297,10 @@ msgstr "Jelszó megerősítése"
|
||||
msgid "Connection is down"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Lemez"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Lemez I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr ""
|
||||
@@ -433,6 +445,14 @@ msgstr "Lemezhasználat a {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Docker CPU használat"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Docker memória használat"
|
||||
@@ -441,6 +461,14 @@ msgstr "Docker memória használat"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Docker hálózat I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Dokumentáció"
|
||||
@@ -549,8 +577,15 @@ msgstr "Teszt értesítés elküldése sikertelen"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Nem sikerült frissíteni a riasztást"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Szűrő..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Nyilvános interfészek hálózati forgalma"
|
||||
msgid "Network unit"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Nincs találat."
|
||||
@@ -991,6 +1030,10 @@ msgstr "Rendszer"
|
||||
msgid "System load averages over time"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Rendszer"
|
||||
@@ -1203,6 +1246,10 @@ msgstr ""
|
||||
msgid "Visible Fields"
|
||||
msgstr "Látható mezők"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Elegendő rekordra várva a megjelenítéshez"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Skoðaðu logga til að sjá meiri upplýsingar."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Athugaðu tilkynningaþjónustuna þína"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr ""
|
||||
@@ -293,6 +297,10 @@ msgstr "Staðfestu lykilorð"
|
||||
msgid "Connection is down"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Diskur"
|
||||
msgid "Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr ""
|
||||
@@ -433,6 +445,14 @@ msgstr "Diska notkun af {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Docker CPU notkun"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Minnisnotkun Docker"
|
||||
@@ -441,6 +461,14 @@ msgstr "Minnisnotkun Docker"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Skjal"
|
||||
@@ -549,8 +577,15 @@ msgstr "Villa í sendingu prufu skilaboða"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Mistókst að uppfæra tilkynningu"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Sía..."
|
||||
@@ -727,6 +762,10 @@ msgstr ""
|
||||
msgid "Network unit"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Engar niðurstöður fundust."
|
||||
@@ -991,6 +1030,10 @@ msgstr "Kerfi"
|
||||
msgid "System load averages over time"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Kerfi"
|
||||
@@ -1203,6 +1246,10 @@ msgstr ""
|
||||
msgid "Visible Fields"
|
||||
msgstr "Sjáanlegir reitir"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Bíður eftir nægum upplýsingum til að sýna"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Controlla i log per maggiori dettagli."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Controlla il tuo servizio di notifica"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "Clicca su un sistema per visualizzare più informazioni."
|
||||
@@ -293,6 +297,10 @@ msgstr "Conferma password"
|
||||
msgid "Connection is down"
|
||||
msgstr "La connessione è interrotta"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Disco"
|
||||
msgid "Disk I/O"
|
||||
msgstr "I/O Disco"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "Unità disco"
|
||||
@@ -433,6 +445,14 @@ msgstr "Utilizzo del disco di {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Utilizzo CPU Docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Utilizzo Memoria Docker"
|
||||
@@ -441,6 +461,14 @@ msgstr "Utilizzo Memoria Docker"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "I/O di Rete Docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Documentazione"
|
||||
@@ -549,8 +577,15 @@ msgstr "Invio della notifica di test fallito"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Aggiornamento dell'avviso fallito"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Filtra..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Traffico di rete delle interfacce pubbliche"
|
||||
msgid "Network unit"
|
||||
msgstr "Unità rete"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Nessun risultato trovato."
|
||||
@@ -991,6 +1030,10 @@ msgstr "Sistema"
|
||||
msgid "System load averages over time"
|
||||
msgstr "Medie di carico del sistema nel tempo"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Sistemi"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "Visualizza i tuoi 200 avvisi più recenti."
|
||||
msgid "Visible Fields"
|
||||
msgstr "Colonne visibili"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "In attesa di abbastanza record da visualizzare"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "詳細についてはログを確認してください。"
|
||||
msgid "Check your notification service"
|
||||
msgstr "通知サービスを確認してください"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "システムをクリックして詳細を表示します。"
|
||||
@@ -293,6 +297,10 @@ msgstr "パスワードを確認"
|
||||
msgid "Connection is down"
|
||||
msgstr "接続が切断されました"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "ディスク"
|
||||
msgid "Disk I/O"
|
||||
msgstr "ディスクI/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "ディスク単位"
|
||||
@@ -433,6 +445,14 @@ msgstr "{extraFsName}のディスク使用率"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Docker CPU使用率"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Dockerメモリ使用率"
|
||||
@@ -441,6 +461,14 @@ msgstr "Dockerメモリ使用率"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "DockerネットワークI/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "ドキュメント"
|
||||
@@ -549,8 +577,15 @@ msgstr "テスト通知の送信に失敗しました"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "アラートの更新に失敗しました"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "フィルター..."
|
||||
@@ -727,6 +762,10 @@ msgstr "パブリックインターフェースのネットワークトラフィ
|
||||
msgid "Network unit"
|
||||
msgstr "ネットワーク単位"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "結果が見つかりませんでした。"
|
||||
@@ -991,6 +1030,10 @@ msgstr "システム"
|
||||
msgid "System load averages over time"
|
||||
msgstr "システムの負荷平均の推移"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "システム"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "直近200件のアラートを表示します。"
|
||||
msgid "Visible Fields"
|
||||
msgstr "表示列"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "表示するのに十分なレコードを待っています"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "자세한 내용은 로그를 확인하세요."
|
||||
msgid "Check your notification service"
|
||||
msgstr "알림 서비스를 확인하세요."
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "더 많은 정보를 보려면 시스템을 클릭하세요."
|
||||
@@ -293,6 +297,10 @@ msgstr "비밀번호 확인"
|
||||
msgid "Connection is down"
|
||||
msgstr "연결이 끊겼습니다"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "디스크"
|
||||
msgid "Disk I/O"
|
||||
msgstr "디스크 I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "디스크 단위"
|
||||
@@ -433,6 +445,14 @@ msgstr "{extraFsName}의 디스크 사용량"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Docker CPU 사용량"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Docker 메모리 사용량"
|
||||
@@ -441,6 +461,14 @@ msgstr "Docker 메모리 사용량"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Docker 네트워크 I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "문서"
|
||||
@@ -549,8 +577,15 @@ msgstr "테스트 알림 전송 실패"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "알림 수정 실패"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "필터..."
|
||||
@@ -727,6 +762,10 @@ msgstr "공용 인터페이스의 네트워크 트래픽"
|
||||
msgid "Network unit"
|
||||
msgstr "네트워크 단위"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "결과가 없습니다."
|
||||
@@ -991,6 +1030,10 @@ msgstr "시스템"
|
||||
msgid "System load averages over time"
|
||||
msgstr "시간에 따른 시스템 부하 평균"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "시스템"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "최근 200개의 알림을 봅니다."
|
||||
msgid "Visible Fields"
|
||||
msgstr "표시할 열"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "표시할 충분한 기록을 기다리는 중"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Controleer de logs voor meer details."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Controleer je meldingsservice"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "Klik op een systeem om meer informatie te bekijken."
|
||||
@@ -293,6 +297,10 @@ msgstr "Bevestig wachtwoord"
|
||||
msgid "Connection is down"
|
||||
msgstr "Verbinding is niet actief"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Schijf"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Schijf I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "Schijf eenheid"
|
||||
@@ -433,6 +445,14 @@ msgstr "Schijfgebruik van {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Docker CPU-gebruik"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Docker geheugengebruik"
|
||||
@@ -441,6 +461,14 @@ msgstr "Docker geheugengebruik"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Docker netwerk I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Documentatie"
|
||||
@@ -549,8 +577,15 @@ msgstr "Versturen test notificatie mislukt"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Bijwerken waarschuwing mislukt"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Filter..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Netwerkverkeer van publieke interfaces"
|
||||
msgid "Network unit"
|
||||
msgstr "Netwerk eenheid"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Geen resultaten gevonden."
|
||||
@@ -991,6 +1030,10 @@ msgstr "Systeem"
|
||||
msgid "System load averages over time"
|
||||
msgstr "Gemiddelde systeembelasting na verloop van tijd"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Systemen"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "Bekijk je 200 meest recente meldingen."
|
||||
msgid "Visible Fields"
|
||||
msgstr "Zichtbare kolommen"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Wachtend op genoeg records om weer te geven"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Sjekk loggene for flere detaljer."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Sjekk din meldingstjeneste"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr ""
|
||||
@@ -293,6 +297,10 @@ msgstr "Bekreft passord"
|
||||
msgid "Connection is down"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Disk"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Disk I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr ""
|
||||
@@ -433,6 +445,14 @@ msgstr "Diskbruk av {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Docker CPU-bruk"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Docker Minnebruk"
|
||||
@@ -441,6 +461,14 @@ msgstr "Docker Minnebruk"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Docker Nettverks-I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Dokumentasjon"
|
||||
@@ -549,8 +577,15 @@ msgstr "Kunne ikke sende test-varsling"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Kunne ikke oppdatere alarm"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Filter..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Nettverkstrafikk av eksterne nettverksgrensesnitt"
|
||||
msgid "Network unit"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Ingen resultater funnet."
|
||||
@@ -991,6 +1030,10 @@ msgstr "System"
|
||||
msgid "System load averages over time"
|
||||
msgstr "Systembelastning gjennomsnitt over tid"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Systemer"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "Vis de 200 siste varslene."
|
||||
msgid "Visible Fields"
|
||||
msgstr "Synlige Felter"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Venter på nok registreringer til å vise"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Sprawdź logi, aby uzyskać więcej informacji."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Sprawdź swój serwis powiadomień"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "Kliknij na system, aby zobaczyć więcej informacji."
|
||||
@@ -293,6 +297,10 @@ msgstr "Potwierdź hasło"
|
||||
msgid "Connection is down"
|
||||
msgstr "Brak połączenia"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Dysk"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Dysk I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "Jednostka dysku"
|
||||
@@ -433,6 +445,14 @@ msgstr "Wykorzystanie dysku {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Wykorzystanie procesora przez Docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Wykorzystanie pamięci przez Docker"
|
||||
@@ -441,6 +461,14 @@ msgstr "Wykorzystanie pamięci przez Docker"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Sieć Docker I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Dokumentacja"
|
||||
@@ -549,8 +577,15 @@ msgstr "Nie udało się wysłać testowego powiadomienia"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Nie udało się zaktualizować powiadomienia"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Filtruj..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Ruch sieciowy interfejsów publicznych"
|
||||
msgid "Network unit"
|
||||
msgstr "Jednostka sieciowa"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Brak wyników."
|
||||
@@ -991,6 +1030,10 @@ msgstr "System"
|
||||
msgid "System load averages over time"
|
||||
msgstr "Średnie obciążenie systemu w czasie"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Systemy"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "Wyświetl 200 ostatnich alertów."
|
||||
msgid "Visible Fields"
|
||||
msgstr "Widoczne kolumny"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Oczekiwanie na wystarczającą liczbę rekordów do wyświetlenia"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Verifique os logs para mais detalhes."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Verifique seu serviço de notificação"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "Clique em um sistema para ver mais informações."
|
||||
@@ -293,6 +297,10 @@ msgstr "Confirmar senha"
|
||||
msgid "Connection is down"
|
||||
msgstr "A conexão está inativa"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Disco"
|
||||
msgid "Disk I/O"
|
||||
msgstr "E/S de Disco"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "Unidade de disco"
|
||||
@@ -433,6 +445,14 @@ msgstr "Uso de disco de {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Uso de CPU do Docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Uso de Memória do Docker"
|
||||
@@ -441,6 +461,14 @@ msgstr "Uso de Memória do Docker"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "E/S de Rede do Docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Documentação"
|
||||
@@ -549,8 +577,15 @@ msgstr "Falha ao enviar notificação de teste"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Falha ao atualizar alerta"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Filtrar..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Tráfego de rede das interfaces públicas"
|
||||
msgid "Network unit"
|
||||
msgstr "Unidade de rede"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Nenhum resultado encontrado."
|
||||
@@ -991,6 +1030,10 @@ msgstr "Sistema"
|
||||
msgid "System load averages over time"
|
||||
msgstr "Médias de carga do sistema ao longo do tempo"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Sistemas"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "Veja os seus 200 alertas mais recentes."
|
||||
msgid "Visible Fields"
|
||||
msgstr "Campos Visíveis"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Aguardando registros suficientes para exibir"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Проверьте журналы для получения более
|
||||
msgid "Check your notification service"
|
||||
msgstr "Проверьте ваш сервис уведомлений"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "Нажмите на систему для просмотра дополнительной информации."
|
||||
@@ -293,6 +297,10 @@ msgstr "Подтвердите пароль"
|
||||
msgid "Connection is down"
|
||||
msgstr "Нет соединения"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Диск"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Дисковый ввод/вывод"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "Единицы измерения температуры"
|
||||
@@ -433,6 +445,14 @@ msgstr "Использование диска {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Использование CPU Docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Использование памяти Docker"
|
||||
@@ -441,6 +461,14 @@ msgstr "Использование памяти Docker"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Сетевой ввод/вывод Docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Документация"
|
||||
@@ -549,8 +577,15 @@ msgstr "Не удалось отправить тестовое уведомле
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Не удалось обновить оповещение"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Фильтр..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Сетевой трафик публичных интерфейсов"
|
||||
msgid "Network unit"
|
||||
msgstr "Единицы измерения скорости сети"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Результаты не найдены."
|
||||
@@ -991,6 +1030,10 @@ msgstr "Система"
|
||||
msgid "System load averages over time"
|
||||
msgstr "Средняя загрузка системы за время"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Системы"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "Просмотреть 200 последних оповещений."
|
||||
msgid "Visible Fields"
|
||||
msgstr "Видимые столбцы"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Ожидание достаточного количества записей для отображения"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Za več podrobnosti preverite dnevnike."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Preverite storitev obveščanja"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr ""
|
||||
@@ -293,6 +297,10 @@ msgstr "Potrdite geslo"
|
||||
msgid "Connection is down"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Disk"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Disk I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr ""
|
||||
@@ -433,6 +445,14 @@ msgstr "Poraba diska za {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Docker CPU poraba"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Docker poraba spomina"
|
||||
@@ -441,6 +461,14 @@ msgstr "Docker poraba spomina"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Docker I/O mreže"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Dokumentacija"
|
||||
@@ -549,8 +577,15 @@ msgstr "Pošiljanje testnega obvestila ni uspelo"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Opozorila ni bilo mogoče posodobiti"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Filter..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Omrežni promet javnih vmesnikov"
|
||||
msgid "Network unit"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Ni rezultatov."
|
||||
@@ -991,6 +1030,10 @@ msgstr "Sistemsko"
|
||||
msgid "System load averages over time"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Sistemi"
|
||||
@@ -1203,6 +1246,10 @@ msgstr ""
|
||||
msgid "Visible Fields"
|
||||
msgstr "Vidna polja"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Čakam na dovolj zapisov za prikaz"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Kontrollera loggarna för mer information."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Kontrollera din aviseringstjänst"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr ""
|
||||
@@ -293,6 +297,10 @@ msgstr "Bekräfta lösenord"
|
||||
msgid "Connection is down"
|
||||
msgstr "Ej ansluten"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Disk"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Disk I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr ""
|
||||
@@ -433,6 +445,14 @@ msgstr "Diskanvändning av {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Docker CPU-användning"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Docker Minnesanvändning"
|
||||
@@ -441,6 +461,14 @@ msgstr "Docker Minnesanvändning"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Docker Nätverks-I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Dokumentation"
|
||||
@@ -549,8 +577,15 @@ msgstr "Kunde inte skicka testavisering"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Kunde inte uppdatera larm"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Filtrera..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Nätverkstrafik för publika gränssnitt"
|
||||
msgid "Network unit"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Inga resultat hittades."
|
||||
@@ -991,6 +1030,10 @@ msgstr "System"
|
||||
msgid "System load averages over time"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "System"
|
||||
@@ -1203,6 +1246,10 @@ msgstr ""
|
||||
msgid "Visible Fields"
|
||||
msgstr "Synliga fält"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Väntar på tillräckligt med poster att visa"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Daha fazla ayrıntı için günlükleri kontrol edin."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Bildirim hizmetinizi kontrol edin"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "Daha fazla bilgi görmek için bir sisteme tıklayın."
|
||||
@@ -293,6 +297,10 @@ msgstr "Şifreyi onayla"
|
||||
msgid "Connection is down"
|
||||
msgstr "Bağlantı kesildi"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Disk"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Disk G/Ç"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "Disk birimi"
|
||||
@@ -433,6 +445,14 @@ msgstr "{extraFsName} disk kullanımı"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Docker CPU Kullanımı"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Docker Bellek Kullanımı"
|
||||
@@ -441,6 +461,14 @@ msgstr "Docker Bellek Kullanımı"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Docker Ağ G/Ç"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Dokümantasyon"
|
||||
@@ -549,8 +577,15 @@ msgstr "Test bildirimi gönderilemedi"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Uyarı güncellenemedi"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Filtrele..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Genel arayüzlerin ağ trafiği"
|
||||
msgid "Network unit"
|
||||
msgstr "Ağ birimi"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Sonuç bulunamadı."
|
||||
@@ -991,6 +1030,10 @@ msgstr "Sistem"
|
||||
msgid "System load averages over time"
|
||||
msgstr "Zaman içindeki sistem yükü ortalamaları"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Sistemler"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "En son 200 uyarınızı görüntüleyin."
|
||||
msgid "Visible Fields"
|
||||
msgstr "Görünür Alanlar"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Görüntülemek için yeterli kayıt bekleniyor"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Перевірте журнали для отримання додатк
|
||||
msgid "Check your notification service"
|
||||
msgstr "Перевірте свій сервіс сповіщень"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "Натисніть на систему, щоб переглянути більше інформації."
|
||||
@@ -293,6 +297,10 @@ msgstr "Підтвердьте пароль"
|
||||
msgid "Connection is down"
|
||||
msgstr "З'єднання розірвано"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Диск"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Дисковий ввід/вивід"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "Одиниця виміру диска"
|
||||
@@ -433,6 +445,14 @@ msgstr "Використання диска {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Використання ЦП Docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Використання пам'яті Docker"
|
||||
@@ -441,6 +461,14 @@ msgstr "Використання пам'яті Docker"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Мережевий ввід/вивід Docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Документація"
|
||||
@@ -549,8 +577,15 @@ msgstr "Не вдалося надіслати тестове сповіщенн
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Не вдалося оновити сповіщення"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Фільтр..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Мережевий трафік публічних інтерфейсі
|
||||
msgid "Network unit"
|
||||
msgstr "Одиниця виміру мережі"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Результатів не знайдено."
|
||||
@@ -991,6 +1030,10 @@ msgstr "Система"
|
||||
msgid "System load averages over time"
|
||||
msgstr "Середнє навантаження системи з часом"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Системи"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "Переглянути 200 останніх сповіщень."
|
||||
msgid "Visible Fields"
|
||||
msgstr "Видимі стовпці"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Очікування достатньої кількості записів для відображення"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "Kiểm tra nhật ký để biết thêm chi tiết."
|
||||
msgid "Check your notification service"
|
||||
msgstr "Kiểm tra dịch vụ thông báo của bạn"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "Nhấp vào hệ thống để xem thêm thông tin."
|
||||
@@ -293,6 +297,10 @@ msgstr "Xác nhận mật khẩu"
|
||||
msgid "Connection is down"
|
||||
msgstr "Mất kết nối"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "Đĩa"
|
||||
msgid "Disk I/O"
|
||||
msgstr "Đĩa I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "Đơn vị đĩa"
|
||||
@@ -433,6 +445,14 @@ msgstr "Sử dụng đĩa của {extraFsName}"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Sử dụng CPU Docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Sử dụng Bộ nhớ Docker"
|
||||
@@ -441,6 +461,14 @@ msgstr "Sử dụng Bộ nhớ Docker"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Mạng I/O Docker"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "Tài liệu"
|
||||
@@ -549,8 +577,15 @@ msgstr "Gửi thông báo thử nghiệm thất bại"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "Cập nhật cảnh báo thất bại"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "Lọc..."
|
||||
@@ -727,6 +762,10 @@ msgstr "Lưu lượng mạng của các giao diện công cộng"
|
||||
msgid "Network unit"
|
||||
msgstr "Đơn vị mạng"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "Không tìm thấy kết quả."
|
||||
@@ -991,6 +1030,10 @@ msgstr "Hệ thống"
|
||||
msgid "System load averages over time"
|
||||
msgstr "Tải trung bình của hệ thống theo thời gian"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "Các hệ thống"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "Xem 200 cảnh báo gần đây nhất của bạn."
|
||||
msgid "Visible Fields"
|
||||
msgstr "Các cột hiển thị"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "Đang chờ đủ bản ghi để hiển thị"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "检查日志以获取更多详细信息。"
|
||||
msgid "Check your notification service"
|
||||
msgstr "检查您的通知服务"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "点击系统查看更多信息。"
|
||||
@@ -293,6 +297,10 @@ msgstr "确认密码"
|
||||
msgid "Connection is down"
|
||||
msgstr "连接已断开"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "磁盘"
|
||||
msgid "Disk I/O"
|
||||
msgstr "磁盘 I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "磁盘单位"
|
||||
@@ -433,6 +445,14 @@ msgstr "{extraFsName}的磁盘使用"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Docker CPU 使用"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Docker 内存使用"
|
||||
@@ -441,6 +461,14 @@ msgstr "Docker 内存使用"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Docker 网络 I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "文档"
|
||||
@@ -549,8 +577,15 @@ msgstr "发送测试通知失败"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "更新警报失败"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "过滤..."
|
||||
@@ -727,6 +762,10 @@ msgstr "公共接口的网络流量"
|
||||
msgid "Network unit"
|
||||
msgstr "网络单位"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "未找到结果。"
|
||||
@@ -991,6 +1030,10 @@ msgstr "系统"
|
||||
msgid "System load averages over time"
|
||||
msgstr "系统负载平均值随时间变化"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "系统"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "查看您最近的200个警报。"
|
||||
msgid "Visible Fields"
|
||||
msgstr "可见列"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "正在收集足够的数据来显示"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "檢查日誌以取得更多資訊。"
|
||||
msgid "Check your notification service"
|
||||
msgstr "檢查您的通知服務"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "點擊系統以查看更多資訊。"
|
||||
@@ -293,6 +297,10 @@ msgstr "確認密碼"
|
||||
msgid "Connection is down"
|
||||
msgstr "連線中斷"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "磁碟"
|
||||
msgid "Disk I/O"
|
||||
msgstr "磁碟 I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "磁碟單位"
|
||||
@@ -433,6 +445,14 @@ msgstr "{extraFsName} 的磁碟使用量"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Docker CPU 使用率"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Docker 記憶體使用率"
|
||||
@@ -441,6 +461,14 @@ msgstr "Docker 記憶體使用率"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Docker 網絡 I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "文件"
|
||||
@@ -549,8 +577,15 @@ msgstr "發送測試通知失敗"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "更新警報失敗"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "篩選..."
|
||||
@@ -727,6 +762,10 @@ msgstr "公共接口的網絡流量"
|
||||
msgid "Network unit"
|
||||
msgstr "網路單位"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "未找到結果。"
|
||||
@@ -991,6 +1030,10 @@ msgstr "系統"
|
||||
msgid "System load averages over time"
|
||||
msgstr "系統平均負載隨時間變化"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "系統"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "檢視最近 200 則警報。"
|
||||
msgid "Visible Fields"
|
||||
msgstr "可見欄位"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "等待足夠的記錄以顯示"
|
||||
|
||||
@@ -267,6 +267,10 @@ msgstr "檢查系統記錄以取得更多資訊。"
|
||||
msgid "Check your notification service"
|
||||
msgstr "檢查您的通知服務"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Clear all"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Click on a system to view more information."
|
||||
msgstr "點擊系統以查看更多資訊。"
|
||||
@@ -293,6 +297,10 @@ msgstr "確認密碼"
|
||||
msgid "Connection is down"
|
||||
msgstr "連線中斷"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Container health status and uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table-columns.tsx
|
||||
msgid "Continue"
|
||||
@@ -415,6 +423,10 @@ msgstr "磁碟"
|
||||
msgid "Disk I/O"
|
||||
msgstr "磁碟 I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Disk read/write rates of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/general.tsx
|
||||
msgid "Disk unit"
|
||||
msgstr "磁碟單位"
|
||||
@@ -433,6 +445,14 @@ msgstr "{extraFsName}的磁碟使用量"
|
||||
msgid "Docker CPU Usage"
|
||||
msgstr "Docker CPU 使用率"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Disk I/O"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Health & Uptime"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Memory Usage"
|
||||
msgstr "Docker 記憶體使用率"
|
||||
@@ -441,6 +461,14 @@ msgstr "Docker 記憶體使用率"
|
||||
msgid "Docker Network I/O"
|
||||
msgstr "Docker 網路 I/O"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Docker Volumes"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "Documentation"
|
||||
msgstr "文件"
|
||||
@@ -549,8 +577,15 @@ msgstr "發送測試通知失敗"
|
||||
msgid "Failed to update alert"
|
||||
msgstr "更新警報失敗"
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter containers..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Filter stacks..."
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/settings/alerts-history-data-table.tsx
|
||||
#: src/components/systems-table/systems-table.tsx
|
||||
msgid "Filter..."
|
||||
msgstr "篩選..."
|
||||
@@ -727,6 +762,10 @@ msgstr "公開介面的網路流量"
|
||||
msgid "Network unit"
|
||||
msgstr "網路單位"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "No items available"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/command-palette.tsx
|
||||
msgid "No results found."
|
||||
msgstr "找不到結果。"
|
||||
@@ -991,6 +1030,10 @@ msgstr "系統"
|
||||
msgid "System load averages over time"
|
||||
msgstr "系統平均負載隨時間變化"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "System Stats"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/navbar.tsx
|
||||
msgid "Systems"
|
||||
msgstr "系統"
|
||||
@@ -1203,6 +1246,10 @@ msgstr "檢視最近 200 則警報。"
|
||||
msgid "Visible Fields"
|
||||
msgstr "顯示欄位"
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Volume usage of docker containers"
|
||||
msgstr ""
|
||||
|
||||
#: src/components/routes/system.tsx
|
||||
msgid "Waiting for enough records to display"
|
||||
msgstr "等待足夠的記錄以顯示"
|
||||
|
||||
19
internal/site/src/types.d.ts
vendored
19
internal/site/src/types.d.ts
vendored
@@ -168,6 +168,13 @@ export interface GPUData {
|
||||
e?: Record<string, number>
|
||||
}
|
||||
|
||||
export interface VolumeData {
|
||||
/** name */
|
||||
n: string
|
||||
/** size (mb) */
|
||||
s: number
|
||||
}
|
||||
|
||||
export interface ExtraFsStats {
|
||||
/** disk size (gb) */
|
||||
d: number
|
||||
@@ -208,6 +215,18 @@ interface ContainerStats {
|
||||
ns: number
|
||||
// network received (mb)
|
||||
nr: number
|
||||
// volumes (volume name to size in MB)
|
||||
v?: Record<string, number>
|
||||
// health status
|
||||
h?: string
|
||||
// status (running, stopped, etc.)
|
||||
s?: string
|
||||
// uptime in seconds
|
||||
u?: number
|
||||
// project name
|
||||
p?: string
|
||||
// container short id
|
||||
idShort?: string
|
||||
}
|
||||
|
||||
export interface SystemStatsRecord extends RecordModel {
|
||||
|
||||
Reference in New Issue
Block a user