Compare commits

..

1 Commits

Author SHA1 Message Date
Titouan V
23fff31a05 Add a total line to the tooltip of charts with multiple values (#1280)
* base total

* only visible on certain charts

* remove unwanted changes
2025-11-04 15:44:30 -05:00
45 changed files with 477 additions and 3281 deletions

View File

@@ -37,16 +37,6 @@ func (t *DeltaTracker[K, V]) Set(id K, value V) {
t.current[id] = value
}
// Snapshot returns a copy of the current map.
// func (t *DeltaTracker[K, V]) Snapshot() map[K]V {
// t.RLock()
// defer t.RUnlock()
// copyMap := make(map[K]V, len(t.current))
// maps.Copy(copyMap, t.current)
// return copyMap
// }
// Deltas returns a map of all calculated deltas for the current interval.
func (t *DeltaTracker[K, V]) Deltas() map[K]V {
t.RLock()
@@ -63,15 +53,6 @@ func (t *DeltaTracker[K, V]) Deltas() map[K]V {
return deltas
}
// Previous returns the previously recorded value for the given key, if it exists.
func (t *DeltaTracker[K, V]) Previous(id K) (V, bool) {
t.RLock()
defer t.RUnlock()
value, ok := t.previous[id]
return value, ok
}
// Delta returns the delta for a single key.
// Returns 0 if the key doesn't exist or has no previous value.
func (t *DeltaTracker[K, V]) Delta(id K) V {

View File

@@ -25,16 +25,6 @@ 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
)
@@ -52,8 +42,6 @@ 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
@@ -65,11 +53,6 @@ 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
@@ -176,9 +159,8 @@ func (dm *dockerManager) getDockerStats(cacheTimeMs uint16) ([]*container.Stats,
}
}
// prepare network and disk trackers for next interval for this cache time
// prepare network trackers for next interval for this cache time
dm.cycleNetworkDeltasForCacheTime(cacheTimeMs)
dm.cycleDiskDeltasForCacheTime(cacheTimeMs)
return stats, nil
}
@@ -257,32 +239,6 @@ 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
@@ -328,50 +284,6 @@ 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 {
@@ -381,13 +293,11 @@ 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, read_delta, write_delta uint64, readTime time.Time) {
func updateContainerStatsValues(stats *container.Stats, cpuPct float64, usedMemory uint64, sent_delta, recv_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
}
@@ -410,64 +320,11 @@ 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
@@ -517,11 +374,8 @@ 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, read_delta, write_delta, res.Read)
updateContainerStatsValues(stats, cpuPct, usedMemory, sent_delta, recv_delta, res.Read)
// store per-cache-time read time for Windows CPU percent calc
dm.lastCpuReadTime[cacheTimeMs][ctr.IdShort] = res.Read
@@ -606,7 +460,6 @@ 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),
@@ -614,8 +467,6 @@ 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
@@ -670,49 +521,6 @@ 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 {

View File

@@ -172,24 +172,8 @@ func (a *Agent) sumAndTrackPerNicDeltas(cacheTimeMs uint16, msElapsed uint64, ne
tracker.Set(upKey, v.BytesSent)
tracker.Set(downKey, v.BytesRecv)
if msElapsed > 0 {
if prevVal, ok := tracker.Previous(upKey); ok {
var deltaBytes uint64
if v.BytesSent >= prevVal {
deltaBytes = v.BytesSent - prevVal
} else {
deltaBytes = v.BytesSent
}
upDelta = deltaBytes * 1000 / msElapsed
}
if prevVal, ok := tracker.Previous(downKey); ok {
var deltaBytes uint64
if v.BytesRecv >= prevVal {
deltaBytes = v.BytesRecv - prevVal
} else {
deltaBytes = v.BytesRecv
}
downDelta = deltaBytes * 1000 / msElapsed
}
upDelta = tracker.Delta(upKey) * 1000 / msElapsed
downDelta = tracker.Delta(downKey) * 1000 / msElapsed
}
systemStats.NetworkInterfaces[v.Name] = [4]uint64{upDelta, downDelta, v.BytesSent, v.BytesRecv}
}
@@ -228,10 +212,6 @@ func (a *Agent) applyNetworkTotals(
a.initializeNetIoStats()
delete(a.netIoStats, cacheTimeMs)
delete(a.netInterfaceDeltaTrackers, cacheTimeMs)
systemStats.NetworkSent = 0
systemStats.NetworkRecv = 0
systemStats.Bandwidth[0], systemStats.Bandwidth[1] = 0, 0
return
}
systemStats.NetworkSent = networkSentPs

View File

@@ -338,43 +338,6 @@ func TestSumAndTrackPerNicDeltas(t *testing.T) {
assert.Equal(t, uint64(7000), ni[1])
}
func TestSumAndTrackPerNicDeltasHandlesCounterReset(t *testing.T) {
a := &Agent{
netInterfaces: map[string]struct{}{"eth0": {}},
netInterfaceDeltaTrackers: make(map[uint16]*deltatracker.DeltaTracker[string, uint64]),
}
cache := uint16(77)
// First interval establishes baseline values
initial := []psutilNet.IOCountersStat{{Name: "eth0", BytesSent: 4_000, BytesRecv: 6_000}}
statsInitial := &system.Stats{}
a.ensureNetworkInterfacesMap(statsInitial)
_, _ = a.sumAndTrackPerNicDeltas(cache, 0, initial, statsInitial)
// Second interval increments counters normally so previous snapshot gets populated
increment := []psutilNet.IOCountersStat{{Name: "eth0", BytesSent: 9_000, BytesRecv: 11_000}}
statsIncrement := &system.Stats{}
a.ensureNetworkInterfacesMap(statsIncrement)
_, _ = a.sumAndTrackPerNicDeltas(cache, 1_000, increment, statsIncrement)
niIncrement, ok := statsIncrement.NetworkInterfaces["eth0"]
require.True(t, ok)
assert.Equal(t, uint64(5_000), niIncrement[0])
assert.Equal(t, uint64(5_000), niIncrement[1])
// Third interval simulates counter reset (values drop below previous totals)
reset := []psutilNet.IOCountersStat{{Name: "eth0", BytesSent: 1_200, BytesRecv: 1_500}}
statsReset := &system.Stats{}
a.ensureNetworkInterfacesMap(statsReset)
_, _ = a.sumAndTrackPerNicDeltas(cache, 1_000, reset, statsReset)
niReset, ok := statsReset.NetworkInterfaces["eth0"]
require.True(t, ok)
assert.Equal(t, uint64(1_200), niReset[0], "upload delta should match new counter value after reset")
assert.Equal(t, uint64(1_500), niReset[1], "download delta should match new counter value after reset")
}
func TestApplyNetworkTotals(t *testing.T) {
tests := []struct {
name string
@@ -478,13 +441,10 @@ func TestApplyNetworkTotals(t *testing.T) {
)
if tt.expectReset {
// Should have reset network tracking state - maps cleared and stats zeroed
assert.NotContains(t, a.netIoStats, cacheTimeMs, "cache entry should be cleared after reset")
// Should have reset network tracking state - delta trackers should be cleared
// Note: initializeNetIoStats resets the maps, then applyNetworkTotals sets nis back
assert.Contains(t, a.netIoStats, cacheTimeMs, "cache entry should exist after reset")
assert.NotContains(t, a.netInterfaceDeltaTrackers, cacheTimeMs, "tracker should be cleared on reset")
assert.Zero(t, systemStats.NetworkSent)
assert.Zero(t, systemStats.NetworkRecv)
assert.Zero(t, systemStats.Bandwidth[0])
assert.Zero(t, systemStats.Bandwidth[1])
} else {
// Should have applied stats
assert.Equal(t, tt.expectedNetworkSent, systemStats.NetworkSent)

View File

@@ -4,29 +4,25 @@ import "time"
// Docker container info from /containers/json
type ApiInfo struct {
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.)
Id string
IdShort string
Names []string
Status string
// 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
@@ -36,7 +32,6 @@ 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 {
@@ -103,58 +98,21 @@ 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"`
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"`
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:"-"`
}

View File

@@ -414,8 +414,6 @@ 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
}
}
@@ -427,8 +425,6 @@ 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

View File

@@ -69,7 +69,7 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
"integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": 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==",
"devOptional": true,
"dev": true,
"license": "ISC"
}
}

View File

@@ -29,6 +29,7 @@ export default function AreaChartDefault({
domain,
legend,
itemSorter,
showTotal = false,
}: // logRender = false,
{
chartData: ChartData
@@ -40,6 +41,7 @@ export default function AreaChartDefault({
domain?: [number, number]
legend?: boolean
itemSorter?: (a: any, b: any) => number
showTotal?: boolean
// logRender?: boolean
}) {
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
@@ -81,6 +83,7 @@ export default function AreaChartDefault({
<ChartTooltipContent
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
contentFormatter={contentFormatter}
showTotal={showTotal}
/>
}
/>
@@ -107,5 +110,5 @@ export default function AreaChartDefault({
</ChartContainer>
</div>
)
}, [chartData.systemStats.at(-1), yAxisWidth, maxToggled])
}, [chartData.systemStats.at(-1), yAxisWidth, maxToggled, showTotal])
}

View File

@@ -1,32 +1,20 @@
// import Spinner from '../spinner'
import { useStore } from "@nanostores/react"
import { memo, useMemo } from "react"
import React from "react"
import { Area, AreaChart, CartesianGrid, Line, LineChart, YAxis } from "recharts"
import { Badge } from "@/components/ui/badge"
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
import { type ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
import { Separator } from "@/components/ui/separator"
import { ChartType, Unit } from "@/lib/enums"
import { $containerColors, $containerFilter, $stackFilter, $userSettings } from "@/lib/stores"
import {
chartMargin,
cn,
decimalString,
formatBytes,
formatShortDate,
generateFallbackColor,
getSizeAndUnit,
toFixedFloat,
toFixedWithoutTrailingZeros,
} from "@/lib/utils"
import { $containerFilter, $userSettings } from "@/lib/stores"
import { chartMargin, cn, decimalString, formatBytes, formatShortDate, toFixedFloat } 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: propChartConfig,
chartConfig,
unit = "%",
}: {
dataKey: string
@@ -35,168 +23,13 @@ export default memo(function ContainerChart({
chartConfig: ChartConfig
unit?: string
}) {
const containerFilter = useStore($containerFilter)
const stackFilter = useStore($stackFilter)
const containerColors = useStore($containerColors)
const filter = useStore($containerFilter)
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(() => {
@@ -208,40 +41,9 @@ export default memo(function ContainerChart({
// tick formatter
if (chartType === ChartType.CPU) {
obj.tickFormatter = (value) => {
const val = `${toFixedWithoutTrailingZeros(value, 2)}${unit}`
const val = toFixedFloat(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) => {
@@ -255,12 +57,7 @@ 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">
@@ -275,74 +72,17 @@ 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
}
@@ -351,11 +91,12 @@ export default memo(function ContainerChart({
// Filter with set lookup
const filteredKeys = useMemo(() => {
if (!containerFilter || containerFilter.length === 0) {
if (!filter) {
return new Set<string>()
}
return new Set(Object.keys(containerChartConfig).filter((key) => !containerFilter.includes(key)))
}, [containerChartConfig, containerFilter])
const filterLower = filter.toLowerCase()
return new Set(Object.keys(chartConfig).filter((key) => !key.toLowerCase().includes(filterLower)))
}, [chartConfig, filter])
// console.log('rendered at', new Date())
@@ -363,228 +104,8 @@ 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 className="w-full h-full">
<div>
<ChartContainer
className={cn("h-full w-full absolute aspect-auto bg-card opacity-0 transition-opacity", {
"opacity-100": yAxisWidth,
@@ -615,14 +136,9 @@ 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={containerFilter.length > 0 ? containerFilter.join(",") : undefined}
contentFormatter={toolTipFormatter}
/>
}
content={<ChartTooltipContent filter={filter} contentFormatter={toolTipFormatter} showTotal={true} />}
/>
{filterableKeys.map((key) => {
{Object.keys(chartConfig).map((key) => {
const filtered = filteredKeys.has(key)
const fillOpacity = filtered ? 0.05 : 0.4
const strokeOpacity = filtered ? 0.1 : 1
@@ -633,11 +149,11 @@ export default memo(function ContainerChart({
dataKey={dataFunction.bind(null, key)}
name={key}
type="monotoneX"
fill={containerChartConfig[key].color}
fill={chartConfig[key].color}
fillOpacity={fillOpacity}
stroke={containerChartConfig[key].color}
stroke={chartConfig[key].color}
strokeOpacity={strokeOpacity}
activeDot={{ opacity: 1 }}
activeDot={{ opacity: filtered ? 0 : 1 }}
stackId="a"
/>
)
@@ -647,358 +163,3 @@ 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>
)
})

View File

@@ -1,257 +0,0 @@
"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>
)
}

View File

@@ -61,6 +61,7 @@ export default memo(function MemChart({ chartData, showMax }: { chartData: Chart
const { value: convertedValue, unit } = formatBytes(value * 1024, false, Unit.Bytes, true)
return decimalString(convertedValue, convertedValue >= 100 ? 1 : 2) + " " + unit
}}
showTotal={true}
/>
}
/>

View File

@@ -6,12 +6,10 @@ 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"
@@ -32,11 +30,9 @@ import {
$allSystemsById,
$allSystemsByName,
$chartTime,
$containerColors,
$containerFilter,
$direction,
$maxValues,
$stackFilter,
$systems,
$temperatureFilter,
$userSettings,
@@ -73,7 +69,6 @@ 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"
@@ -401,74 +396,17 @@ 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(() => {
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()
if (!netCardRef.current || !containerData.length) {
setBottomSpacing(0)
return
}
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
@@ -516,14 +454,7 @@ export default memo(function SystemDetail({ id }: { id: string }) {
const maxValSelect = isLongerChart ? <SelectAvgMax max={maxValues} /> : null
const showMax = maxValues && isLongerChart
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 containerFilterBar = containerData.length ? <FilterBar /> : null
const dataEmpty = !chartLoading && chartData.systemStats.length === 0
const lastGpuVals = Object.values(systemStats.at(-1)?.stats.g ?? {})
@@ -638,22 +569,6 @@ 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
@@ -679,6 +594,23 @@ 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}
@@ -689,6 +621,23 @@ 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>
@@ -735,6 +684,7 @@ export default memo(function SystemDetail({ id }: { id: string }) {
const { value: convertedValue, unit } = formatBytes(value, true, userSettings.unitDisk, false)
return `${decimalString(convertedValue, convertedValue >= 100 ? 1 : 2)} ${unit}`
}}
showTotal={true}
/>
</ChartCard>
@@ -788,9 +738,33 @@ export default memo(function SystemDetail({ id }: { id: string }) {
const { value, unit } = formatBytes(data.value, true, userSettings.unitNet, false)
return `${decimalString(value, value >= 100 ? 1 : 2)} ${unit}`
}}
showTotal={true}
/>
</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
@@ -1015,125 +989,6 @@ 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 */}
@@ -1164,121 +1019,38 @@ function GpuEnginesChart({ chartData }: { chartData: ChartData }) {
)
}
function FilterBar({
store = $containerFilter,
containerData,
mode = "container"
}: {
store?: typeof $containerFilter
containerData?: ChartData["containerData"]
mode?: "container" | "stack"
}) {
const selected = useStore(store)
function FilterBar({ store = $containerFilter }: { store?: typeof $containerFilter }) {
const containerFilter = useStore(store)
const { t } = useLingui()
const [open, setOpen] = useState(false)
// 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 debouncedStoreSet = useMemo(() => debounce((value: string) => store.set(value), 80), [store])
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])
const handleChange = useCallback(
(e: React.ChangeEvent<HTMLInputElement>) => debouncedStoreSet(e.target.value),
[debouncedStoreSet]
)
return (
<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>
<>
<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>
</>
)
}

View File

@@ -1,4 +1,5 @@
import type { JSX } from "react"
import { useLingui } from "@lingui/react/macro"
import * as React from "react"
import * as RechartsPrimitive from "recharts"
import { chartTimeData, cn } from "@/lib/utils"
@@ -97,9 +98,11 @@ const ChartTooltipContent = React.forwardRef<
nameKey?: string
labelKey?: string
unit?: string
filter?: string | string[]
filter?: string
contentFormatter?: (item: any, key: string) => React.ReactNode | string
truncate?: boolean
showTotal?: boolean
totalLabel?: React.ReactNode
}
>(
(
@@ -121,27 +124,96 @@ const ChartTooltipContent = React.forwardRef<
itemSorter,
contentFormatter: content = undefined,
truncate = false,
showTotal = false,
totalLabel,
},
ref
) => {
// const { config } = useChart()
const config = {}
const { t } = useLingui()
const totalLabelNode = totalLabel ?? t`Total`
const totalName = typeof totalLabelNode === "string" ? totalLabelNode : t`Total`
React.useMemo(() => {
if (filter) {
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()))
}
payload = payload?.filter((item) => (item.name as string)?.toLowerCase().includes(filter.toLowerCase()))
}
if (itemSorter) {
// @ts-expect-error
payload?.sort(itemSorter)
}
}, [itemSorter, payload, filter])
}, [itemSorter, payload])
const totalValueDisplay = React.useMemo(() => {
if (!showTotal || !payload?.length) {
return null
}
let totalValue = 0
let hasNumericValue = false
const aggregatedNestedValues: Record<string, number> = {}
for (const item of payload) {
const numericValue = typeof item.value === "number" ? item.value : Number(item.value)
if (Number.isFinite(numericValue)) {
totalValue += numericValue
hasNumericValue = true
}
if (content && item?.payload) {
const payloadKey = `${nameKey || item.name || item.dataKey || "value"}`
const nestedPayload = (item.payload as Record<string, unknown> | undefined)?.[payloadKey]
if (nestedPayload && typeof nestedPayload === "object") {
for (const [nestedKey, nestedValue] of Object.entries(nestedPayload)) {
if (typeof nestedValue === "number" && Number.isFinite(nestedValue)) {
aggregatedNestedValues[nestedKey] = (aggregatedNestedValues[nestedKey] ?? 0) + nestedValue
}
}
}
}
}
if (!hasNumericValue) {
return null
}
const totalKey = "__total__"
const totalItem: any = {
value: totalValue,
name: totalName,
dataKey: totalKey,
color,
}
if (content) {
const basePayload =
payload[0]?.payload && typeof payload[0].payload === "object"
? { ...(payload[0].payload as Record<string, unknown>) }
: {}
totalItem.payload = {
...basePayload,
[totalKey]: aggregatedNestedValues,
}
}
if (typeof formatter === "function") {
return formatter(
totalValue,
totalName,
totalItem,
payload.length,
totalItem.payload ?? payload[0]?.payload
)
}
if (content) {
return content(totalItem, totalKey)
}
return `${totalValue.toLocaleString()}${unit ?? ""}`
}, [color, content, formatter, nameKey, payload, showTotal, totalName, unit])
const tooltipLabel = React.useMemo(() => {
if (hideLabel || !payload?.length) {
@@ -180,6 +252,12 @@ const ChartTooltipContent = React.forwardRef<
)}
>
{!nestLabel ? tooltipLabel : null}
{totalValueDisplay ? (
<div className="flex items-center justify-between gap-2 font-medium text-foreground">
<span className="text-muted-foreground">{totalLabelNode}</span>
<span className="font-semibold">{totalValueDisplay}</span>
</div>
) : null}
<div className="grid gap-1.5">
{payload.map((item, index) => {
const key = `${nameKey || item.name || item.dataKey || "value"}`

View File

@@ -12,11 +12,6 @@ export enum ChartType {
Disk,
Network,
CPU,
Volume,
Health,
Uptime,
HealthUptime,
DiskIO,
}
/** Unit of measurement */

View File

@@ -53,13 +53,7 @@ export const $userSettings = map<UserSettings>({
listenKeys($userSettings, ["chartTime"], ({ chartTime }) => $chartTime.set(chartTime))
/** Container chart filter */
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>>({})
export const $containerFilter = atom("")
/** Temperature chart filter */
export const $temperatureFilter = atom("")

View File

@@ -290,45 +290,6 @@ 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

View File

@@ -267,10 +267,6 @@ 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 "انقر على نظام لعرض مزيد من المعلومات."
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 "وحدة القرص"
@@ -445,14 +433,6 @@ 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 "استخدام الذاكرة للدوكر"
@@ -461,14 +441,6 @@ 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 "التوثيق"
@@ -577,15 +549,8 @@ msgstr "فشل في إرسال إشعار الاختبار"
msgid "Failed to update alert"
msgstr "فشل في تحديث التنبيه"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "تصفية..."
@@ -762,10 +727,6 @@ 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 "لم يتم العثور على نتائج."
@@ -1030,10 +991,6 @@ msgstr "النظام"
msgid "System load averages over time"
msgstr "متوسط تحميل النظام مع مرور الوقت"
#: src/components/routes/system.tsx
msgid "System Stats"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "الأنظمة"
@@ -1128,6 +1085,11 @@ msgstr "تسمح الرموز المميزة للوكلاء بالاتصال و
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "تُستخدم الرموز المميزة والبصمات للمصادقة على اتصالات WebSocket إلى المحور."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "إجمالي البيانات المستلمة لكل واجهة"
@@ -1246,10 +1208,6 @@ 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 "في انتظار وجود سجلات كافية للعرض"

View File

@@ -267,10 +267,6 @@ 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 "Кликнете върху система, за да видите повече информация."
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 "Единица за диск"
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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 "Документация"
@@ -577,15 +549,8 @@ msgstr "Неуспешно изпрати тестова нотификация"
msgid "Failed to update alert"
msgstr "Неуспешно обнови тревога"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Филтрирай..."
@@ -762,10 +727,6 @@ 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 "Няма намерени резултати."
@@ -1030,10 +991,6 @@ msgstr "Система"
msgid "System load averages over time"
msgstr "Средно натоварване на системата във времето"
#: src/components/routes/system.tsx
msgid "System Stats"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Системи"
@@ -1128,6 +1085,11 @@ msgstr "Токените позволяват на агентите да се с
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Токените и пръстовите отпечатъци се използват за удостоверяване на WebSocket връзките към концентратора."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Общо получени данни за всеки интерфейс"
@@ -1246,10 +1208,6 @@ 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 "Изчаква се за достатъчно записи за показване"

View File

@@ -267,10 +267,6 @@ 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í."
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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"
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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"
@@ -577,15 +549,8 @@ msgstr "Nepodařilo se odeslat testovací oznámení"
msgid "Failed to update alert"
msgstr "Nepodařilo se aktualizovat upozornění"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Filtr..."
@@ -762,10 +727,6 @@ 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."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr "Tokeny umožňují agentům připojení a registraci. Otisky jsou stabil
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Tokeny a otisky slouží k ověření připojení WebSocket k uzlu."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Celkový přijatý objem dat pro každé rozhraní"
@@ -1246,10 +1208,6 @@ 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í"

View File

@@ -267,10 +267,6 @@ 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 ""
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 ""
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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"
@@ -577,15 +549,8 @@ msgstr "Afsendelse af testnotifikation mislykkedes"
msgid "Failed to update alert"
msgstr "Kunne ikke opdatere alarm"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Filter..."
@@ -762,10 +727,6 @@ 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."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Samlet modtaget data for hver interface"
@@ -1246,10 +1208,6 @@ 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"

View File

@@ -267,10 +267,6 @@ 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."
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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"
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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"
@@ -577,15 +549,8 @@ msgstr "Testbenachrichtigung konnte nicht gesendet werden"
msgid "Failed to update alert"
msgstr "Warnung konnte nicht aktualisiert werden"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Filter..."
@@ -762,10 +727,6 @@ 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."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr "Tokens ermöglichen es Agents, sich zu verbinden und zu registrieren. Fi
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Tokens und Fingerabdrücke werden verwendet, um WebSocket-Verbindungen zum Hub zu authentifizieren."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Gesamtdatenmenge für jede Schnittstelle empfangen"
@@ -1246,10 +1208,6 @@ 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"

View File

@@ -262,10 +262,6 @@ 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."
@@ -292,10 +288,6 @@ 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"
@@ -418,10 +410,6 @@ 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"
@@ -440,14 +428,6 @@ 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"
@@ -456,14 +436,6 @@ 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"
@@ -572,15 +544,8 @@ msgstr "Failed to send test notification"
msgid "Failed to update alert"
msgstr "Failed to update alert"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Filter..."
@@ -757,10 +722,6 @@ 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."
@@ -1025,10 +986,6 @@ 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"
@@ -1123,6 +1080,11 @@ msgstr "Tokens allow agents to connect and register. Fingerprints are stable ide
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr "Total"
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Total data received for each interface"
@@ -1241,10 +1203,6 @@ 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"

View File

@@ -267,10 +267,6 @@ 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."
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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"
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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"
@@ -577,15 +549,8 @@ msgstr "Error al enviar la notificación de prueba"
msgid "Failed to update alert"
msgstr "Error al actualizar la alerta"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Filtrar..."
@@ -762,10 +727,6 @@ 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."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr "Los tokens permiten que los agentes se conecten y registren. Las huellas
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Los tokens y las huellas digitales se utilizan para autenticar las conexiones WebSocket al hub."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Datos totales recibidos por cada interfaz"
@@ -1246,10 +1208,6 @@ 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"

View File

@@ -267,10 +267,6 @@ 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 "برای مشاهده اطلاعات بیشتر روی یک سیستم کلیک کنید."
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 "واحد دیسک"
@@ -445,14 +433,6 @@ 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 "میزان استفاده از حافظه داکر"
@@ -461,14 +441,6 @@ 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 "مستندات"
@@ -577,15 +549,8 @@ msgstr "ارسال اعلان آزمایشی ناموفق بود"
msgid "Failed to update alert"
msgstr "به‌روزرسانی هشدار ناموفق بود"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "فیلتر..."
@@ -762,10 +727,6 @@ 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 "هیچ نتیجه‌ای یافت نشد."
@@ -1030,10 +991,6 @@ msgstr "سیستم"
msgid "System load averages over time"
msgstr "میانگین بار سیستم در طول زمان"
#: src/components/routes/system.tsx
msgid "System Stats"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "سیستم‌ها"
@@ -1128,6 +1085,11 @@ msgstr "توکن‌ها به عامل‌ها اجازه اتصال و ثبت‌
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "توکن‌ها و اثرات انگشت برای احراز هویت اتصالات WebSocket به هاب استفاده می‌شوند."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "داده‌های کل دریافت شده برای هر رابط"
@@ -1246,10 +1208,6 @@ 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 "در انتظار رکوردهای کافی برای نمایش"

View File

@@ -267,10 +267,6 @@ 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 ""
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 ""
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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"
@@ -577,15 +549,8 @@ 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/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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Filtrer..."
@@ -762,10 +727,6 @@ 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é."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr "Les tokens permettent aux agents de se connecter et de s'enregistrer. Le
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Les tokens et les empreintes sont utilisés pour authentifier les connexions WebSocket vers le hub."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Données totales reçues pour chaque interface"
@@ -1246,10 +1208,6 @@ 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"

View File

@@ -267,10 +267,6 @@ 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 ""
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 ""
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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"
@@ -577,15 +549,8 @@ msgstr "Neuspješno slanje testne notifikacije"
msgid "Failed to update alert"
msgstr "Ažuriranje upozorenja nije uspjelo"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Filtriraj..."
@@ -762,10 +727,6 @@ 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."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Ukupni podaci primljeni za svako sučelje"
@@ -1246,10 +1208,6 @@ 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"

View File

@@ -267,10 +267,6 @@ 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 ""
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 ""
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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ó"
@@ -577,15 +549,8 @@ 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/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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Szűrő..."
@@ -762,10 +727,6 @@ 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."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Összes fogadott adat minden interfészenként"
@@ -1246,10 +1208,6 @@ 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"

View File

@@ -267,10 +267,6 @@ 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 ""
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 ""
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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"
@@ -577,15 +549,8 @@ msgstr "Villa í sendingu prufu skilaboða"
msgid "Failed to update alert"
msgstr "Mistókst að uppfæra tilkynningu"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Sía..."
@@ -762,10 +727,6 @@ 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."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr ""
@@ -1246,10 +1208,6 @@ 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"

View File

@@ -267,10 +267,6 @@ 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."
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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"
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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"
@@ -577,15 +549,8 @@ msgstr "Invio della notifica di test fallito"
msgid "Failed to update alert"
msgstr "Aggiornamento dell'avviso fallito"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Filtra..."
@@ -762,10 +727,6 @@ 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."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr "I token consentono agli agenti di connettersi e registrarsi. Le impronte
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "I token e le impronte digitali vengono utilizzati per autenticare le connessioni WebSocket all'hub."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Dati totali ricevuti per ogni interfaccia"
@@ -1246,10 +1208,6 @@ 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"

View File

@@ -267,10 +267,6 @@ 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 "システムをクリックして詳細を表示します。"
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 "ディスク単位"
@@ -445,14 +433,6 @@ 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メモリ使用率"
@@ -461,14 +441,6 @@ 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 "ドキュメント"
@@ -577,15 +549,8 @@ msgstr "テスト通知の送信に失敗しました"
msgid "Failed to update alert"
msgstr "アラートの更新に失敗しました"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "フィルター..."
@@ -762,10 +727,6 @@ 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 "結果が見つかりませんでした。"
@@ -1030,10 +991,6 @@ msgstr "システム"
msgid "System load averages over time"
msgstr "システムの負荷平均の推移"
#: src/components/routes/system.tsx
msgid "System Stats"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "システム"
@@ -1128,6 +1085,11 @@ msgstr "トークンはエージェントの接続と登録を可能にします
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "トークンとフィンガープリントは、ハブへのWebSocket接続の認証に使用されます。"
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "各インターフェースの総受信データ量"
@@ -1246,10 +1208,6 @@ 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 "表示するのに十分なレコードを待っています"

View File

@@ -267,10 +267,6 @@ 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 "더 많은 정보를 보려면 시스템을 클릭하세요."
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 "디스크 단위"
@@ -445,14 +433,6 @@ 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 메모리 사용량"
@@ -461,14 +441,6 @@ 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 "문서"
@@ -577,15 +549,8 @@ msgstr "테스트 알림 전송 실패"
msgid "Failed to update alert"
msgstr "알림 수정 실패"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "필터..."
@@ -762,10 +727,6 @@ 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 "결과가 없습니다."
@@ -1030,10 +991,6 @@ msgstr "시스템"
msgid "System load averages over time"
msgstr "시간에 따른 시스템 부하 평균"
#: src/components/routes/system.tsx
msgid "System Stats"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "시스템"
@@ -1128,6 +1085,11 @@ msgstr "토큰은 에이전트가 연결하고 등록할 수 있도록 합니다
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "토큰과 지문은 허브에 대한 WebSocket 연결을 인증하는 데 사용됩니다."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "각 인터페이스별 총합 다운로드 데이터량"
@@ -1246,10 +1208,6 @@ 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 "표시할 충분한 기록을 기다리는 중"

View File

@@ -267,10 +267,6 @@ 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."
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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"
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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"
@@ -577,15 +549,8 @@ msgstr "Versturen test notificatie mislukt"
msgid "Failed to update alert"
msgstr "Bijwerken waarschuwing mislukt"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Filter..."
@@ -762,10 +727,6 @@ 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."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr "Tokens staan agenten toe om verbinding te maken met en te registreren. V
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Tokens en vingerafdrukken worden gebruikt om WebSocket verbindingen te verifiëren naar de hub."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Totaal ontvangen gegevens per interface"
@@ -1246,10 +1208,6 @@ 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"

View File

@@ -267,10 +267,6 @@ 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 ""
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 ""
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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"
@@ -577,15 +549,8 @@ msgstr "Kunne ikke sende test-varsling"
msgid "Failed to update alert"
msgstr "Kunne ikke oppdatere alarm"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Filter..."
@@ -762,10 +727,6 @@ 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."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Totalt mottatt data for hvert grensesnitt"
@@ -1246,10 +1208,6 @@ 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"

View File

@@ -267,10 +267,6 @@ 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."
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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"
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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"
@@ -577,15 +549,8 @@ msgstr "Nie udało się wysłać testowego powiadomienia"
msgid "Failed to update alert"
msgstr "Nie udało się zaktualizować powiadomienia"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Filtruj..."
@@ -762,10 +727,6 @@ 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."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr "Tokeny umożliwiają agentom łączenie się i rejestrację. Odciski pal
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Tokeny i odciski palców (fingerprinty) służą do uwierzytelniania połączeń WebSocket z hubem."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Całkowita ilość danych odebranych dla każdego interfejsu"
@@ -1246,10 +1208,6 @@ 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"

View File

@@ -267,10 +267,6 @@ 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."
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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"
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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"
@@ -577,15 +549,8 @@ msgstr "Falha ao enviar notificação de teste"
msgid "Failed to update alert"
msgstr "Falha ao atualizar alerta"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Filtrar..."
@@ -762,10 +727,6 @@ 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."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr "Os tokens permitem que os agentes se conectem e registrem. As impressõe
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Tokens e impressões digitais são usados para autenticar conexões WebSocket ao hub."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Dados totais recebidos para cada interface"
@@ -1246,10 +1208,6 @@ 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"

View File

@@ -267,10 +267,6 @@ 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 "Нажмите на систему для просмотра дополнительной информации."
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 "Единицы измерения температуры"
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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 "Документация"
@@ -577,15 +549,8 @@ msgstr "Не удалось отправить тестовое уведомле
msgid "Failed to update alert"
msgstr "Не удалось обновить оповещение"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Фильтр..."
@@ -762,10 +727,6 @@ 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 "Результаты не найдены."
@@ -1030,10 +991,6 @@ msgstr "Система"
msgid "System load averages over time"
msgstr "Средняя загрузка системы за время"
#: src/components/routes/system.tsx
msgid "System Stats"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Системы"
@@ -1128,6 +1085,11 @@ msgstr "Токены позволяют агентам подключаться
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Токены и отпечатки используются для аутентификации соединений WebSocket с хабом."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Общий объем полученных данных для каждого интерфейса"
@@ -1246,10 +1208,6 @@ 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 "Ожидание достаточного количества записей для отображения"

View File

@@ -267,10 +267,6 @@ 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 ""
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 ""
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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"
@@ -577,15 +549,8 @@ msgstr "Pošiljanje testnega obvestila ni uspelo"
msgid "Failed to update alert"
msgstr "Opozorila ni bilo mogoče posodobiti"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Filter..."
@@ -762,10 +727,6 @@ 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."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Skupni prejeti podatki za vsak vmesnik"
@@ -1246,10 +1208,6 @@ 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"

View File

@@ -267,10 +267,6 @@ 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 ""
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 ""
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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"
@@ -577,15 +549,8 @@ msgstr "Kunde inte skicka testavisering"
msgid "Failed to update alert"
msgstr "Kunde inte uppdatera larm"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Filtrera..."
@@ -762,10 +727,6 @@ 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."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Totalt mottagen data för varje gränssnitt"
@@ -1246,10 +1208,6 @@ 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"

View File

@@ -267,10 +267,6 @@ 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."
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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"
@@ -445,14 +433,6 @@ 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ı"
@@ -461,14 +441,6 @@ 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"
@@ -577,15 +549,8 @@ msgstr "Test bildirimi gönderilemedi"
msgid "Failed to update alert"
msgstr "Uyarı güncellenemedi"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Filtrele..."
@@ -762,10 +727,6 @@ 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ı."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr "Token'lar agentların bağlanıp kaydolmasına izin verir. Parmak izleri
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Token'lar ve parmak izleri hub'a WebSocket bağlantılarını doğrulamak için kullanılır."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Her arayüz için alınan toplam veri"
@@ -1246,10 +1208,6 @@ 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"

View File

@@ -267,10 +267,6 @@ 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 "Натисніть на систему, щоб переглянути більше інформації."
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 "Одиниця виміру диска"
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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 "Документація"
@@ -577,15 +549,8 @@ msgstr "Не вдалося надіслати тестове сповіщенн
msgid "Failed to update alert"
msgstr "Не вдалося оновити сповіщення"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Фільтр..."
@@ -762,10 +727,6 @@ 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 "Результатів не знайдено."
@@ -1030,10 +991,6 @@ msgstr "Система"
msgid "System load averages over time"
msgstr "Середнє навантаження системи з часом"
#: src/components/routes/system.tsx
msgid "System Stats"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Системи"
@@ -1128,6 +1085,11 @@ msgstr "Токени дозволяють агентам підключатис
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Токени та відбитки використовуються для автентифікації WebSocket з'єднань до хабу."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Загальний обсяг отриманих даних для кожного інтерфейсу"
@@ -1246,10 +1208,6 @@ 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 "Очікування достатньої кількості записів для відображення"

View File

@@ -267,10 +267,6 @@ 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."
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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"
@@ -445,14 +433,6 @@ 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"
@@ -461,14 +441,6 @@ 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"
@@ -577,15 +549,8 @@ 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/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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "Lọc..."
@@ -762,10 +727,6 @@ 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ả."
@@ -1030,10 +991,6 @@ 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"
@@ -1128,6 +1085,11 @@ msgstr "Token cho phép các tác nhân kết nối và đăng ký. Vân tay là
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Token và vân tay được sử dụng để xác thực các kết nối WebSocket đến trung tâm."
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "Tổng dữ liệu nhận được cho mỗi giao diện"
@@ -1246,10 +1208,6 @@ 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ị"

View File

@@ -267,10 +267,6 @@ 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 "点击系统查看更多信息。"
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 "磁盘单位"
@@ -445,14 +433,6 @@ 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 内存使用"
@@ -461,14 +441,6 @@ 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 "文档"
@@ -577,15 +549,8 @@ msgstr "发送测试通知失败"
msgid "Failed to update alert"
msgstr "更新警报失败"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "过滤..."
@@ -762,10 +727,6 @@ 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 "未找到结果。"
@@ -1030,10 +991,6 @@ msgstr "系统"
msgid "System load averages over time"
msgstr "系统负载平均值随时间变化"
#: src/components/routes/system.tsx
msgid "System Stats"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "系统"
@@ -1128,6 +1085,11 @@ msgstr "令牌允许客户端连接和注册。指纹是每个系统唯一的稳
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "令牌与指纹用于验证到中心的 WebSocket 连接。"
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "每个接口的总接收数据量"
@@ -1246,10 +1208,6 @@ 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 "正在收集足够的数据来显示"

View File

@@ -267,10 +267,6 @@ 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 "點擊系統以查看更多資訊。"
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 "磁碟單位"
@@ -445,14 +433,6 @@ 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 記憶體使用率"
@@ -461,14 +441,6 @@ 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 "文件"
@@ -577,15 +549,8 @@ msgstr "發送測試通知失敗"
msgid "Failed to update alert"
msgstr "更新警報失敗"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "篩選..."
@@ -762,10 +727,6 @@ 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 "未找到結果。"
@@ -1030,10 +991,6 @@ msgstr "系統"
msgid "System load averages over time"
msgstr "系統平均負載隨時間變化"
#: src/components/routes/system.tsx
msgid "System Stats"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "系統"
@@ -1128,6 +1085,11 @@ msgstr "令牌允許代理程式連接和註冊。指紋是每個系統唯一的
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "令牌和指紋用於驗證到中心的WebSocket連接。"
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "每個介面的總接收資料量"
@@ -1246,10 +1208,6 @@ 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 "等待足夠的記錄以顯示"

View File

@@ -267,10 +267,6 @@ 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 "點擊系統以查看更多資訊。"
@@ -297,10 +293,6 @@ 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"
@@ -423,10 +415,6 @@ 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 "磁碟單位"
@@ -445,14 +433,6 @@ 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 記憶體使用率"
@@ -461,14 +441,6 @@ 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 "文件"
@@ -577,15 +549,8 @@ msgstr "發送測試通知失敗"
msgid "Failed to update alert"
msgstr "更新警報失敗"
#: 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/routes/system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Filter..."
msgstr "篩選..."
@@ -762,10 +727,6 @@ 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 "找不到結果。"
@@ -1030,10 +991,6 @@ msgstr "系統"
msgid "System load averages over time"
msgstr "系統平均負載隨時間變化"
#: src/components/routes/system.tsx
msgid "System Stats"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "系統"
@@ -1128,6 +1085,11 @@ msgstr "令牌允許代理程式連線和註冊。指紋是每個系統的唯一
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "令牌和指紋被用於驗證到 Hub 的 WebSocket 連線。"
#: src/components/ui/chart.tsx
#: src/components/ui/chart.tsx
msgid "Total"
msgstr ""
#: src/components/routes/system/network-sheet.tsx
msgid "Total data received for each interface"
msgstr "每個介面的總接收資料量"
@@ -1246,10 +1208,6 @@ 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 "等待足夠的記錄以顯示"

View File

@@ -168,13 +168,6 @@ 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
@@ -215,18 +208,6 @@ 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 {