Merge branch 'main' of https://github.com/fredodiable/homepage
This commit is contained in:
commit
5f0dc843db
970
package-lock.json
generated
970
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -30,10 +30,12 @@
|
|||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-i18next": "^11.18.6",
|
"react-i18next": "^11.18.6",
|
||||||
"react-icons": "^4.4.0",
|
"react-icons": "^4.4.0",
|
||||||
|
"recharts": "^2.7.2",
|
||||||
"shvl": "^3.0.0",
|
"shvl": "^3.0.0",
|
||||||
"swr": "^1.3.0",
|
"swr": "^1.3.0",
|
||||||
"systeminformation": "^5.17.12",
|
"systeminformation": "^5.17.12",
|
||||||
"tough-cookie": "^4.1.2",
|
"tough-cookie": "^4.1.2",
|
||||||
|
"urbackup-server-api": "^0.8.9",
|
||||||
"winston": "^3.8.2",
|
"winston": "^3.8.2",
|
||||||
"xml-js": "^1.6.11"
|
"xml-js": "^1.6.11"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -310,7 +310,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"quicklaunch": {
|
"quicklaunch": {
|
||||||
"bookmark": "مفضلة",
|
"bookmark": "مفضلة",
|
||||||
@ -656,14 +662,32 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
"succeeded": "Succeeded",
|
"succeeded": "Succeeded",
|
||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Total Observed",
|
"totalObserved": "Total Observed",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Total d'observats",
|
"totalObserved": "Total d'observats",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"totalUsed": "Used Storage",
|
||||||
|
"noRecent": "Out of Date"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -322,7 +322,13 @@
|
|||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used",
|
"used": "Used",
|
||||||
"load": "Load",
|
"load": "Load",
|
||||||
"warn": "Warn"
|
"warn": "Warn",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"quicklaunch": {
|
"quicklaunch": {
|
||||||
"bookmark": "Záložka",
|
"bookmark": "Záložka",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"name": "Name",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -79,7 +79,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"wmo": {
|
"wmo": {
|
||||||
"1-day": "Hovedsageligt solrigt",
|
"1-day": "Hovedsageligt solrigt",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Warnung",
|
"warn": "Warnung",
|
||||||
"total": "Gesamt",
|
"total": "Gesamt",
|
||||||
"free": "Frei",
|
"free": "Frei",
|
||||||
"used": "Verwendet"
|
"used": "Verwendet",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Gesamt beobachtet",
|
"totalObserved": "Gesamt beobachtet",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping",
|
||||||
|
"maxPlayers": "Max players"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -369,7 +369,13 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used",
|
"used": "Used",
|
||||||
"load": "Load"
|
"load": "Load",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"quicklaunch": {
|
"quicklaunch": {
|
||||||
"bookmark": "Bookmark",
|
"bookmark": "Bookmark",
|
||||||
@ -656,7 +662,18 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved",
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +681,13 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -266,7 +266,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"quicklaunch": {
|
"quicklaunch": {
|
||||||
"bookmark": "Bookmark",
|
"bookmark": "Bookmark",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Advertir",
|
"warn": "Advertir",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Libre",
|
"free": "Libre",
|
||||||
"used": "Utilizado"
|
"used": "Utilizado",
|
||||||
|
"crit": "Crít.",
|
||||||
|
"read": "Leer",
|
||||||
|
"write": "Escribir",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Memoria",
|
||||||
|
"swap": "Intercambiar"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Total Observados",
|
"totalObserved": "Total Observados",
|
||||||
@ -656,14 +662,32 @@
|
|||||||
"seriesCount": "Serie",
|
"seriesCount": "Serie",
|
||||||
"totalFiles": "Archivos"
|
"totalFiles": "Archivos"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Nombre",
|
||||||
|
"map": "Mapa",
|
||||||
|
"currentPlayers": "Jugadores actuales",
|
||||||
|
"players": "Jugadores",
|
||||||
|
"maxPlayers": "Jugadores máximos",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Resultado",
|
"result": "Resultado",
|
||||||
"status": "Estado",
|
"status": "Estado",
|
||||||
"buildId": "ID de la compilación",
|
"buildId": "Identificador de la construcción",
|
||||||
"succeeded": "Con éxito",
|
"succeeded": "Exitoso",
|
||||||
"notStarted": "No iniciado",
|
"notStarted": "Sin empezar",
|
||||||
"failed": "Fallido",
|
"failed": "Fallido",
|
||||||
"canceled": "Cancelado",
|
"canceled": "Cancelado",
|
||||||
"inProgress": "En proceso"
|
"inProgress": "En curso",
|
||||||
|
"totalPrs": "RP totales",
|
||||||
|
"myPrs": "Mis logros",
|
||||||
|
"approved": "Aprobados"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "De acuerdo",
|
||||||
|
"errored": "Errores",
|
||||||
|
"noRecent": "Caducado",
|
||||||
|
"totalUsed": "Almacenamiento usado"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -431,7 +431,13 @@
|
|||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used",
|
"used": "Used",
|
||||||
"days": "d",
|
"days": "d",
|
||||||
"hours": "h"
|
"hours": "h",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"quicklaunch": {
|
"quicklaunch": {
|
||||||
"bookmark": "Bookmark",
|
"bookmark": "Bookmark",
|
||||||
@ -656,14 +662,32 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
|
"notStarted": "Not Started",
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
"succeeded": "Succeeded",
|
"succeeded": "Succeeded",
|
||||||
"notStarted": "Not Started",
|
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Total Observed",
|
"totalObserved": "Total Observed",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"load": "Load",
|
"load": "Load",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Total Observed",
|
"totalObserved": "Total Observed",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -256,7 +256,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"quicklaunch": {
|
"quicklaunch": {
|
||||||
"bookmark": "Bookmark",
|
"bookmark": "Bookmark",
|
||||||
@ -656,7 +662,17 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
|
"myPrs": "My PRs",
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +680,14 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"load": "Opterećenje",
|
"load": "Opterećenje",
|
||||||
"warn": "Upozori",
|
"warn": "Upozori",
|
||||||
"total": "Ukupno",
|
"total": "Ukupno",
|
||||||
"free": "Slobodno"
|
"free": "Slobodno",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Ukupno promatrano",
|
"totalObserved": "Ukupno promatrano",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Serije",
|
"seriesCount": "Serije",
|
||||||
"totalFiles": "Datoteke"
|
"totalFiles": "Datoteke"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage",
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Figyelmeztet",
|
"warn": "Figyelmeztet",
|
||||||
"total": "Összes",
|
"total": "Összes",
|
||||||
"free": "Szabad",
|
"free": "Szabad",
|
||||||
"used": "Felhasznált"
|
"used": "Felhasznált",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Összes Megfigyelt",
|
"totalObserved": "Összes Megfigyelt",
|
||||||
@ -656,14 +662,32 @@
|
|||||||
"seriesCount": "Sorozatok",
|
"seriesCount": "Sorozatok",
|
||||||
"totalFiles": "Fájlok"
|
"totalFiles": "Fájlok"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
"result": "Eredmény",
|
"ping": "Ping",
|
||||||
"status": "Állapot",
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
|
"status": "Status",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved",
|
||||||
|
"result": "Result",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
"succeeded": "Sikeres",
|
"succeeded": "Succeeded",
|
||||||
"notStarted": "Nincs elindítva",
|
"notStarted": "Not Started",
|
||||||
"failed": "Sikertelen",
|
"failed": "Failed",
|
||||||
"canceled": "Megszakítva",
|
"canceled": "Canceled",
|
||||||
"inProgress": "Folyamatban"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -222,7 +222,13 @@
|
|||||||
"wait": "Please wait",
|
"wait": "Please wait",
|
||||||
"used": "Used",
|
"used": "Used",
|
||||||
"days": "d",
|
"days": "d",
|
||||||
"hours": "h"
|
"hours": "h",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"quicklaunch": {
|
"quicklaunch": {
|
||||||
"bookmark": "Bookmark",
|
"bookmark": "Bookmark",
|
||||||
@ -494,9 +500,9 @@
|
|||||||
},
|
},
|
||||||
"weather": {
|
"weather": {
|
||||||
"wait": "Harap tunggu",
|
"wait": "Harap tunggu",
|
||||||
"current": "Current Location",
|
"current": "Lokasi Saat Ini",
|
||||||
"allow": "Click to allow",
|
"allow": "Klik untuk mengizinkan",
|
||||||
"updating": "Updating"
|
"updating": "Memperbarui"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"placeholder": "Telusuri…"
|
"placeholder": "Telusuri…"
|
||||||
@ -590,11 +596,11 @@
|
|||||||
"cpu": "CPU",
|
"cpu": "CPU",
|
||||||
"mem": "MEM",
|
"mem": "MEM",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Luang",
|
||||||
"used": "Used",
|
"used": "Digunakan",
|
||||||
"load": "Load",
|
"load": "Load",
|
||||||
"temp": "TEMP",
|
"temp": "TEMP",
|
||||||
"max": "Max",
|
"max": "Maks",
|
||||||
"uptime": "UP",
|
"uptime": "UP",
|
||||||
"months": "mo",
|
"months": "mo",
|
||||||
"hours": "h",
|
"hours": "h",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Avviso",
|
"warn": "Avviso",
|
||||||
"total": "Totale",
|
"total": "Totale",
|
||||||
"free": "Libero",
|
"free": "Libero",
|
||||||
"used": "Usato"
|
"used": "Usato",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Totale Osservato",
|
"totalObserved": "Totale Osservato",
|
||||||
@ -656,14 +662,32 @@
|
|||||||
"seriesCount": "Serie",
|
"seriesCount": "Serie",
|
||||||
"totalFiles": "File"
|
"totalFiles": "File"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
"succeeded": "Succeeded",
|
"succeeded": "Succeeded",
|
||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,7 +25,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"autobrr": {
|
"autobrr": {
|
||||||
"filters": "フィルター",
|
"filters": "フィルター",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -315,7 +315,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"quicklaunch": {
|
"quicklaunch": {
|
||||||
"bookmark": "Bookmark",
|
"bookmark": "Bookmark",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"ping": "Ping",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -304,7 +304,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"quicklaunch": {
|
"quicklaunch": {
|
||||||
"bookmark": "Bookmark",
|
"bookmark": "Bookmark",
|
||||||
@ -656,14 +662,32 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved",
|
||||||
"succeeded": "Succeeded",
|
"succeeded": "Succeeded",
|
||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed"
|
||||||
"canceled": "Canceled",
|
},
|
||||||
"result": "Result",
|
"urbackup": {
|
||||||
"inProgress": "In Progress"
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -75,7 +75,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"quicklaunch": {
|
"quicklaunch": {
|
||||||
"bookmark": "Tandabuku",
|
"bookmark": "Tandabuku",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Total Observed",
|
"totalObserved": "Total Observed",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Filer"
|
"totalFiles": "Filer"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Totaal waargenomen",
|
"totalObserved": "Totaal waargenomen",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"diffsDetected": "Wykryto różnic",
|
"diffsDetected": "Wykryto różnic",
|
||||||
@ -656,14 +662,32 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
"result": "Result",
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
"succeeded": "Succeeded",
|
"succeeded": "Succeeded",
|
||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved",
|
||||||
|
"result": "Result",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -91,7 +91,7 @@
|
|||||||
"transcoding": "Transcodificando",
|
"transcoding": "Transcodificando",
|
||||||
"bitrate": "Taxa de bits",
|
"bitrate": "Taxa de bits",
|
||||||
"no_active": "Sem transmissões ativas",
|
"no_active": "Sem transmissões ativas",
|
||||||
"plex_connection_error": "Check Plex Connection"
|
"plex_connection_error": "Verifique a conexão do Plex"
|
||||||
},
|
},
|
||||||
"nzbget": {
|
"nzbget": {
|
||||||
"rate": "Taxa",
|
"rate": "Taxa",
|
||||||
@ -114,21 +114,21 @@
|
|||||||
"wanted": "Desejado",
|
"wanted": "Desejado",
|
||||||
"queued": "Na fila",
|
"queued": "Na fila",
|
||||||
"series": "Séries",
|
"series": "Séries",
|
||||||
"queue": "Queue",
|
"queue": "Fila",
|
||||||
"unknown": "Unknown"
|
"unknown": "Desconhecido"
|
||||||
},
|
},
|
||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Desejado",
|
"wanted": "Desejado",
|
||||||
"queued": "Na fila",
|
"queued": "Na fila",
|
||||||
"movies": "Filmes",
|
"movies": "Filmes",
|
||||||
"missing": "Faltando",
|
"missing": "Faltando",
|
||||||
"queue": "Queue",
|
"queue": "Fila",
|
||||||
"unknown": "Unknown"
|
"unknown": "Desconhecido"
|
||||||
},
|
},
|
||||||
"lidarr": {
|
"lidarr": {
|
||||||
"wanted": "Desejado",
|
"wanted": "Desejado",
|
||||||
"queued": "Na fila",
|
"queued": "Na fila",
|
||||||
"artists": "Artists"
|
"artists": "Artistas"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Desejado",
|
"wanted": "Desejado",
|
||||||
@ -159,7 +159,7 @@
|
|||||||
"queries": "Consultas",
|
"queries": "Consultas",
|
||||||
"blocked": "Bloqueados",
|
"blocked": "Bloqueados",
|
||||||
"gravity": "Gravidade",
|
"gravity": "Gravidade",
|
||||||
"blocked_percent": "Blocked %"
|
"blocked_percent": "Bloqueado %"
|
||||||
},
|
},
|
||||||
"adguard": {
|
"adguard": {
|
||||||
"queries": "Consultas",
|
"queries": "Consultas",
|
||||||
@ -244,11 +244,17 @@
|
|||||||
"uptime": "LIGADO",
|
"uptime": "LIGADO",
|
||||||
"days": "d",
|
"days": "d",
|
||||||
"hours": "h",
|
"hours": "h",
|
||||||
"load": "Load",
|
"load": "Carga",
|
||||||
"warn": "Warn",
|
"warn": "Aviso",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Livre",
|
||||||
"used": "Used"
|
"used": "Usado",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Observados",
|
"totalObserved": "Observados",
|
||||||
@ -524,8 +530,8 @@
|
|||||||
"memoryusage": "Memória Utilizada",
|
"memoryusage": "Memória Utilizada",
|
||||||
"freespace": "Espaço Livre",
|
"freespace": "Espaço Livre",
|
||||||
"activeusers": "Usuários Ativos",
|
"activeusers": "Usuários Ativos",
|
||||||
"numfiles": "Files",
|
"numfiles": "Arquivos",
|
||||||
"numshares": "Shared Items"
|
"numshares": "Itens Compartilhados"
|
||||||
},
|
},
|
||||||
"kopia": {
|
"kopia": {
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
@ -582,81 +588,90 @@
|
|||||||
"switches_on": "Interruptores Ligados"
|
"switches_on": "Interruptores Ligados"
|
||||||
},
|
},
|
||||||
"freshrss": {
|
"freshrss": {
|
||||||
"subscriptions": "Subscriptions",
|
"subscriptions": "Assinaturas",
|
||||||
"unread": "Unread"
|
"unread": "Não lida"
|
||||||
},
|
},
|
||||||
"channelsdvrserver": {
|
"channelsdvrserver": {
|
||||||
"shows": "Shows",
|
"shows": "Shows",
|
||||||
"recordings": "Recordings",
|
"recordings": "Gravações",
|
||||||
"scheduled": "Scheduled",
|
"scheduled": "Agendado",
|
||||||
"passes": "Passes"
|
"passes": "Passes"
|
||||||
},
|
},
|
||||||
"whatsupdocker": {
|
"whatsupdocker": {
|
||||||
"monitoring": "Monitoring",
|
"monitoring": "Monitorando",
|
||||||
"updates": "Updates"
|
"updates": "Atualizações"
|
||||||
},
|
},
|
||||||
"tailscale": {
|
"tailscale": {
|
||||||
"address": "Address",
|
"address": "Endereço",
|
||||||
"expires": "Expires",
|
"expires": "Expira",
|
||||||
"never": "Never",
|
"never": "Nunca",
|
||||||
"last_seen": "Last Seen",
|
"last_seen": "Visto pela última vez",
|
||||||
"now": "Now",
|
"now": "Agora",
|
||||||
"years": "{{number}}y",
|
"years": "{{number}}a",
|
||||||
"weeks": "{{number}}w",
|
"weeks": "{{number}}s",
|
||||||
"hours": "{{number}}h",
|
"hours": "{{number}}h",
|
||||||
"days": "{{number}}d",
|
"days": "{{number}}d",
|
||||||
"minutes": "{{number}}m",
|
"minutes": "{{number}}m",
|
||||||
"seconds": "{{number}}s",
|
"seconds": "{{number}}s",
|
||||||
"ago": "{{value}} Ago"
|
"ago": "{{value}} Atrás"
|
||||||
},
|
},
|
||||||
"qnap": {
|
"qnap": {
|
||||||
"systemTempC": "System Temp",
|
"systemTempC": "Temp Sistema",
|
||||||
"cpuUsage": "CPU Usage",
|
"cpuUsage": "Uso CPU",
|
||||||
"memUsage": "MEM Usage",
|
"memUsage": "Uso MEM",
|
||||||
"poolUsage": "Pool Usage",
|
"poolUsage": "Pool Usage",
|
||||||
"volumeUsage": "Volume Usage",
|
"volumeUsage": "Uso Volume",
|
||||||
"invalid": "Invalid"
|
"invalid": "Invalido"
|
||||||
},
|
},
|
||||||
"pfsense": {
|
"pfsense": {
|
||||||
"load": "Load Avg",
|
"load": "Média de carga",
|
||||||
"memory": "Mem Usage",
|
"memory": "Uso Mem",
|
||||||
"wanStatus": "WAN Status",
|
"wanStatus": "WAN Status",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"down": "Down",
|
"down": "Down",
|
||||||
"temp": "Temp",
|
"temp": "Temp",
|
||||||
"disk": "Disk Usage",
|
"disk": "Uso de disco",
|
||||||
"wanIP": "WAN IP"
|
"wanIP": "WAN IP"
|
||||||
},
|
},
|
||||||
"caddy": {
|
"caddy": {
|
||||||
"upstreams": "Upstreams",
|
"upstreams": "Upstreams",
|
||||||
"requests": "Current requests",
|
"requests": "Solicitações atuais",
|
||||||
"requests_failed": "Failed requests"
|
"requests_failed": "Solicitações com falha"
|
||||||
},
|
},
|
||||||
"evcc": {
|
"evcc": {
|
||||||
"pv_power": "Production",
|
"pv_power": "Produção",
|
||||||
"battery_soc": "Battery",
|
"battery_soc": "Bateria",
|
||||||
"grid_power": "Grid",
|
"grid_power": "Grade",
|
||||||
"home_power": "Consumption",
|
"home_power": "Consumo",
|
||||||
"charge_power": "Charger",
|
"charge_power": "Carregador",
|
||||||
"watt_hour": "Wh"
|
"watt_hour": "Wh"
|
||||||
},
|
},
|
||||||
"pialert": {
|
"pialert": {
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"connected": "Connected",
|
"connected": "Conectado",
|
||||||
"new_devices": "New Devices",
|
"new_devices": "Novos dispositivos",
|
||||||
"down_alerts": "Down Alerts"
|
"down_alerts": "Alertas de Quedas"
|
||||||
},
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue Count",
|
"downloadCount": "Fila",
|
||||||
"downloadSpeed": "Download Speed",
|
"downloadSpeed": "Velocidade de download",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Restante",
|
||||||
"downloadTotalBytes": "Size"
|
"downloadTotalBytes": "Tamanho"
|
||||||
},
|
},
|
||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Arquivos"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Nome",
|
||||||
|
"map": "Mapa",
|
||||||
|
"currentPlayers": "Jogadores atuais",
|
||||||
|
"players": "Jogadores",
|
||||||
|
"maxPlayers": "Jogadores Max",
|
||||||
|
"bots": "Robos",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -261,7 +261,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Total Observado",
|
"totalObserved": "Total Observado",
|
||||||
@ -665,14 +671,32 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
|
"approved": "Approved",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
"succeeded": "Succeeded",
|
"succeeded": "Succeeded",
|
||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Total Observed",
|
"totalObserved": "Total Observed",
|
||||||
@ -656,14 +662,32 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved",
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
"succeeded": "Succeeded",
|
"succeeded": "Succeeded",
|
||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed"
|
||||||
"canceled": "Canceled",
|
},
|
||||||
"inProgress": "In Progress"
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Всего наблюдаемых",
|
"totalObserved": "Всего наблюдаемых",
|
||||||
@ -656,14 +662,32 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
"inProgress": "In Progress",
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
"succeeded": "Succeeded",
|
"succeeded": "Succeeded",
|
||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled"
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -412,7 +412,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"quicklaunch": {
|
"quicklaunch": {
|
||||||
"bookmark": "Bookmark",
|
"bookmark": "Bookmark",
|
||||||
@ -656,14 +662,32 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"inProgress": "In Progress",
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
"succeeded": "Succeeded",
|
|
||||||
"notStarted": "Not Started",
|
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -364,7 +364,13 @@
|
|||||||
"load": "Obremenitev",
|
"load": "Obremenitev",
|
||||||
"warn": "Opoz.",
|
"warn": "Opoz.",
|
||||||
"total": "Skupaj",
|
"total": "Skupaj",
|
||||||
"used": "V uporabi"
|
"used": "V uporabi",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
"users": "Uporabniki",
|
"users": "Uporabniki",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Serije",
|
"seriesCount": "Serije",
|
||||||
"totalFiles": "Datoteke"
|
"totalFiles": "Datoteke"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Total Observed",
|
"totalObserved": "Total Observed",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Total Observed",
|
"totalObserved": "Total Observed",
|
||||||
@ -656,7 +662,17 @@
|
|||||||
"totalFiles": "Files",
|
"totalFiles": "Files",
|
||||||
"seriesCount": "Series"
|
"seriesCount": "Series"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
|
"approved": "Approved",
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +680,14 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "మొత్తం గమనించబడింది",
|
"totalObserved": "మొత్తం గమనించబడింది",
|
||||||
@ -656,14 +662,32 @@
|
|||||||
"totalFiles": "Files",
|
"totalFiles": "Files",
|
||||||
"seriesCount": "Series"
|
"seriesCount": "Series"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
"succeeded": "Succeeded",
|
"succeeded": "Succeeded",
|
||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -324,7 +324,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"quicklaunch": {
|
"quicklaunch": {
|
||||||
"bookmark": "Bookmark",
|
"bookmark": "Bookmark",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Uyarı",
|
"warn": "Uyarı",
|
||||||
"total": "Toplam",
|
"total": "Toplam",
|
||||||
"free": "Boş",
|
"free": "Boş",
|
||||||
"used": "Kullanım"
|
"used": "Kullanım",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Toplam Gözlenen",
|
"totalObserved": "Toplam Gözlenen",
|
||||||
@ -656,14 +662,32 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
"succeeded": "Succeeded",
|
"succeeded": "Succeeded",
|
||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed"
|
||||||
"canceled": "Canceled",
|
},
|
||||||
"inProgress": "In Progress"
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -372,7 +372,13 @@
|
|||||||
"warn": "Увага",
|
"warn": "Увага",
|
||||||
"total": "Всього",
|
"total": "Всього",
|
||||||
"free": "Вільний",
|
"free": "Вільний",
|
||||||
"used": "Використовується"
|
"used": "Використовується",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"quicklaunch": {
|
"quicklaunch": {
|
||||||
"bookmark": "Закладка",
|
"bookmark": "Закладка",
|
||||||
@ -656,14 +662,32 @@
|
|||||||
"seriesCount": "Серій",
|
"seriesCount": "Серій",
|
||||||
"totalFiles": "Файлів"
|
"totalFiles": "Файлів"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
"failed": "Невдача",
|
"name": "Назва",
|
||||||
"result": "Результат",
|
"map": "Мапа",
|
||||||
"status": "Стан",
|
"currentPlayers": "Поточні гравці",
|
||||||
"buildId": "ID збірки",
|
"players": "Гравці",
|
||||||
"succeeded": "Успішно",
|
"maxPlayers": "Максимум гравців",
|
||||||
"notStarted": "Не розпочато",
|
"bots": "Ботів",
|
||||||
"canceled": "Скасовано",
|
"ping": "Пінг"
|
||||||
"inProgress": "В процесі"
|
},
|
||||||
|
"azuredevops": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Total Observed",
|
"totalObserved": "Total Observed",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "Total Observed",
|
"totalObserved": "Total Observed",
|
||||||
@ -656,7 +662,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
@ -664,6 +679,15 @@
|
|||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"canceled": "Canceled",
|
||||||
"inProgress": "In Progress"
|
"inProgress": "In Progress",
|
||||||
|
"totalPrs": "Total PRs",
|
||||||
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -248,7 +248,13 @@
|
|||||||
"warn": "Warn",
|
"warn": "Warn",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "Read",
|
||||||
|
"write": "Write",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "Mem",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "观察到的总数",
|
"totalObserved": "观察到的总数",
|
||||||
@ -656,14 +662,32 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
|
"name": "Name",
|
||||||
|
"map": "Map",
|
||||||
|
"currentPlayers": "Current players",
|
||||||
|
"players": "Players",
|
||||||
|
"maxPlayers": "Max players",
|
||||||
|
"bots": "Bots",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"azuredevops": {
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress",
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"buildId": "Build ID",
|
"buildId": "Build ID",
|
||||||
"succeeded": "Succeeded",
|
"succeeded": "Succeeded",
|
||||||
"notStarted": "Not Started",
|
"notStarted": "Not Started",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"canceled": "Canceled",
|
"totalPrs": "Total PRs",
|
||||||
"inProgress": "In Progress"
|
"myPrs": "My PRs",
|
||||||
|
"approved": "Approved"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "Errors",
|
||||||
|
"noRecent": "Out of Date",
|
||||||
|
"totalUsed": "Used Storage"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -45,7 +45,7 @@
|
|||||||
"transcoding": "轉碼",
|
"transcoding": "轉碼",
|
||||||
"bitrate": "位元率",
|
"bitrate": "位元率",
|
||||||
"no_active": "無播放活動",
|
"no_active": "無播放活動",
|
||||||
"plex_connection_error": "Check Plex Connection"
|
"plex_connection_error": "檢查Plex的連接狀態"
|
||||||
},
|
},
|
||||||
"jellyseerr": {
|
"jellyseerr": {
|
||||||
"pending": "待下載",
|
"pending": "待下載",
|
||||||
@ -90,15 +90,15 @@
|
|||||||
"wanted": "關注中",
|
"wanted": "關注中",
|
||||||
"queued": "已加入佇列",
|
"queued": "已加入佇列",
|
||||||
"missing": "缺少",
|
"missing": "缺少",
|
||||||
"queue": "Queue",
|
"queue": "佇列",
|
||||||
"unknown": "Unknown"
|
"unknown": "未知的"
|
||||||
},
|
},
|
||||||
"sonarr": {
|
"sonarr": {
|
||||||
"wanted": "關注中",
|
"wanted": "關注中",
|
||||||
"queued": "已加入佇列",
|
"queued": "已加入佇列",
|
||||||
"series": "影集",
|
"series": "影集",
|
||||||
"queue": "Queue",
|
"queue": "佇列",
|
||||||
"unknown": "Unknown"
|
"unknown": "未知的"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "關注中",
|
"wanted": "關注中",
|
||||||
@ -178,7 +178,7 @@
|
|||||||
"lidarr": {
|
"lidarr": {
|
||||||
"wanted": "關注中",
|
"wanted": "關注中",
|
||||||
"queued": "已加入佇列",
|
"queued": "已加入佇列",
|
||||||
"artists": "Artists"
|
"artists": "創作者"
|
||||||
},
|
},
|
||||||
"adguard": {
|
"adguard": {
|
||||||
"queries": "查詢",
|
"queries": "查詢",
|
||||||
@ -248,7 +248,13 @@
|
|||||||
"used": "已使用",
|
"used": "已使用",
|
||||||
"load": "負載量",
|
"load": "負載量",
|
||||||
"warn": "警告",
|
"warn": "警告",
|
||||||
"total": "總共"
|
"total": "總共",
|
||||||
|
"crit": "Crit",
|
||||||
|
"read": "讀取",
|
||||||
|
"write": "寫入",
|
||||||
|
"gpu": "GPU",
|
||||||
|
"mem": "記憶體",
|
||||||
|
"swap": "Swap"
|
||||||
},
|
},
|
||||||
"changedetectionio": {
|
"changedetectionio": {
|
||||||
"totalObserved": "總監測數",
|
"totalObserved": "總監測數",
|
||||||
@ -647,23 +653,41 @@
|
|||||||
"down_alerts": "離線警告"
|
"down_alerts": "離線警告"
|
||||||
},
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue Count",
|
"downloadCount": "下載佇列",
|
||||||
"downloadSpeed": "Download Speed",
|
"downloadSpeed": "下載速率",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "剩餘",
|
||||||
"downloadTotalBytes": "Size"
|
"downloadTotalBytes": "總下載量"
|
||||||
},
|
},
|
||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "叢刊",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "檔案"
|
||||||
},
|
},
|
||||||
"azurePipelines": {
|
"gamedig": {
|
||||||
"result": "Result",
|
"name": "名稱",
|
||||||
"status": "Status",
|
"map": "地圖",
|
||||||
"buildId": "Build ID",
|
"currentPlayers": "當前玩家數",
|
||||||
"succeeded": "Succeeded",
|
"players": "玩家",
|
||||||
"notStarted": "Not Started",
|
"maxPlayers": "玩家數上限",
|
||||||
"failed": "Failed",
|
"bots": "機器人",
|
||||||
"canceled": "Canceled",
|
"ping": "Ping"
|
||||||
"inProgress": "In Progress"
|
},
|
||||||
|
"azuredevops": {
|
||||||
|
"result": "結果",
|
||||||
|
"status": "狀態",
|
||||||
|
"buildId": "組建編號",
|
||||||
|
"succeeded": "成功",
|
||||||
|
"notStarted": "尚未啟用",
|
||||||
|
"failed": "失敗",
|
||||||
|
"canceled": "取消",
|
||||||
|
"inProgress": "執行中",
|
||||||
|
"totalPrs": "總提取要求",
|
||||||
|
"myPrs": "我的提取要求",
|
||||||
|
"approved": "已核准"
|
||||||
|
},
|
||||||
|
"urbackup": {
|
||||||
|
"ok": "Ok",
|
||||||
|
"errored": "錯誤",
|
||||||
|
"noRecent": "已過時",
|
||||||
|
"totalUsed": "已使用空間"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { useContext } from "react";
|
import { useContext } from "react";
|
||||||
|
import classNames from "classnames";
|
||||||
|
|
||||||
import { SettingsContext } from "utils/contexts/settings";
|
import { SettingsContext } from "utils/contexts/settings";
|
||||||
import ResolvedIcon from "components/resolvedicon";
|
import ResolvedIcon from "components/resolvedicon";
|
||||||
@ -16,7 +17,10 @@ export default function Item({ bookmark }) {
|
|||||||
className="block w-full text-left cursor-pointer transition-all h-15 mb-3 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10"
|
className="block w-full text-left cursor-pointer transition-all h-15 mb-3 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10"
|
||||||
>
|
>
|
||||||
<div className="flex">
|
<div className="flex">
|
||||||
<div className="flex-shrink-0 flex items-center justify-center w-11 bg-theme-500/10 dark:bg-theme-900/50 text-theme-700 hover:text-theme-700 dark:text-theme-200 text-sm font-medium rounded-l-md">
|
<div className={classNames(
|
||||||
|
settings.cardBlur !== undefined && `backdrop-blur${settings.cardBlur.length ? '-' : ""}${settings.cardBlur}`,
|
||||||
|
"flex-shrink-0 flex items-center justify-center w-11 bg-theme-500/10 dark:bg-theme-900/50 text-theme-700 hover:text-theme-700 dark:text-theme-200 text-sm font-medium rounded-l-md"
|
||||||
|
)}>
|
||||||
{bookmark.icon &&
|
{bookmark.icon &&
|
||||||
<div className="flex-shrink-0 w-5 h-5">
|
<div className="flex-shrink-0 w-5 h-5">
|
||||||
<ResolvedIcon icon={bookmark.icon} alt={bookmark.abbr} />
|
<ResolvedIcon icon={bookmark.icon} alt={bookmark.abbr} />
|
||||||
@ -24,7 +28,10 @@ export default function Item({ bookmark }) {
|
|||||||
}
|
}
|
||||||
{!bookmark.icon && bookmark.abbr}
|
{!bookmark.icon && bookmark.abbr}
|
||||||
</div>
|
</div>
|
||||||
<div className="flex-1 flex items-center justify-between rounded-r-md ">
|
<div className={classNames(
|
||||||
|
settings.cardBlur !== undefined && `backdrop-blur${settings.cardBlur.length ? '-' : ""}${settings.cardBlur}`,
|
||||||
|
"flex-1 flex items-center justify-between rounded-r-md"
|
||||||
|
)}>
|
||||||
<div className="flex-1 grow pl-3 py-2 text-xs">{bookmark.name}</div>
|
<div className="flex-1 grow pl-3 py-2 text-xs">{bookmark.name}</div>
|
||||||
<div className="px-2 py-2 truncate text-theme-500 dark:text-theme-300 text-xs">{hostname}</div>
|
<div className="px-2 py-2 truncate text-theme-500 dark:text-theme-300 text-xs">{hostname}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -145,7 +145,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classNames(
|
<div className={classNames(
|
||||||
"relative z-20 ease-in-out duration-300 transition-opacity",
|
"relative z-40 ease-in-out duration-300 transition-opacity",
|
||||||
hidden && !isOpen && "hidden",
|
hidden && !isOpen && "hidden",
|
||||||
!hidden && isOpen && "opacity-100",
|
!hidden && isOpen && "opacity-100",
|
||||||
!isOpen && "opacity-0",
|
!isOpen && "opacity-0",
|
||||||
|
|||||||
@ -16,12 +16,13 @@ export default function ServicesGroup({ group, services, layout, fiveColumns, di
|
|||||||
className={classNames(
|
className={classNames(
|
||||||
layout?.style === "row" ? "basis-full" : "basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4",
|
layout?.style === "row" ? "basis-full" : "basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4",
|
||||||
layout?.style !== "row" && fiveColumns ? "3xl:basis-1/5" : "",
|
layout?.style !== "row" && fiveColumns ? "3xl:basis-1/5" : "",
|
||||||
"flex-1 p-1"
|
layout?.header === false ? "flex-1 px-1 -my-1" : "flex-1 p-1",
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<Disclosure defaultOpen>
|
<Disclosure defaultOpen>
|
||||||
{({ open }) => (
|
{({ open }) => (
|
||||||
<>
|
<>
|
||||||
|
{ layout?.header !== false &&
|
||||||
<Disclosure.Button disabled={disableCollapse} className="flex w-full select-none items-center group">
|
<Disclosure.Button disabled={disableCollapse} className="flex w-full select-none items-center group">
|
||||||
{layout?.icon &&
|
{layout?.icon &&
|
||||||
<div className="flex-shrink-0 mr-2 w-7 h-7">
|
<div className="flex-shrink-0 mr-2 w-7 h-7">
|
||||||
@ -35,6 +36,7 @@ export default function ServicesGroup({ group, services, layout, fiveColumns, di
|
|||||||
open ? '' : 'rotate-90'
|
open ? '' : 'rotate-90'
|
||||||
)} />
|
)} />
|
||||||
</Disclosure.Button>
|
</Disclosure.Button>
|
||||||
|
}
|
||||||
<Transition
|
<Transition
|
||||||
// Otherwise the transition group does display: none and cancels animation
|
// Otherwise the transition group does display: none and cancels animation
|
||||||
className="!block"
|
className="!block"
|
||||||
|
|||||||
@ -32,11 +32,13 @@ export default function Item({ service, group }) {
|
|||||||
return (
|
return (
|
||||||
<li key={service.name}>
|
<li key={service.name}>
|
||||||
<div
|
<div
|
||||||
className={`${
|
className={classNames(
|
||||||
hasLink ? "cursor-pointer " : " "
|
settings.cardBlur !== undefined && `backdrop-blur${settings.cardBlur.length ? '-' : ""}${settings.cardBlur}`,
|
||||||
}transition-all h-15 mb-2 p-1 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10 relative`}
|
hasLink && "cursor-pointer",
|
||||||
|
'transition-all h-15 mb-2 p-1 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10 relative overflow-clip'
|
||||||
|
)}
|
||||||
>
|
>
|
||||||
<div className="flex select-none">
|
<div className="flex select-none z-0">
|
||||||
{service.icon &&
|
{service.icon &&
|
||||||
(hasLink ? (
|
(hasLink ? (
|
||||||
<a
|
<a
|
||||||
@ -60,21 +62,21 @@ export default function Item({ service, group }) {
|
|||||||
rel="noreferrer"
|
rel="noreferrer"
|
||||||
className="flex-1 flex items-center justify-between rounded-r-md "
|
className="flex-1 flex items-center justify-between rounded-r-md "
|
||||||
>
|
>
|
||||||
<div className="flex-1 px-2 py-2 text-sm text-left">
|
<div className="flex-1 px-2 py-2 text-sm text-left z-10">
|
||||||
{service.name}
|
{service.name}
|
||||||
<p className="text-theme-500 dark:text-theme-300 text-xs font-light">{service.description}</p>
|
<p className="text-theme-500 dark:text-theme-300 text-xs font-light">{service.description}</p>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
) : (
|
) : (
|
||||||
<div className="flex-1 flex items-center justify-between rounded-r-md ">
|
<div className="flex-1 flex items-center justify-between rounded-r-md ">
|
||||||
<div className="flex-1 px-2 py-2 text-sm text-left">
|
<div className="flex-1 px-2 py-2 text-sm text-left z-10">
|
||||||
{service.name}
|
{service.name}
|
||||||
<p className="text-theme-500 dark:text-theme-300 text-xs font-light">{service.description}</p>
|
<p className="text-theme-500 dark:text-theme-300 text-xs font-light">{service.description}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="absolute top-0 right-0 w-1/2 flex flex-row justify-end gap-2 mr-2">
|
<div className="absolute top-0 right-0 w-1/2 flex flex-row justify-end gap-2 mr-2 z-30">
|
||||||
{service.ping && (
|
{service.ping && (
|
||||||
<div className="flex-shrink-0 flex items-center justify-center cursor-pointer">
|
<div className="flex-shrink-0 flex items-center justify-center cursor-pointer">
|
||||||
<Ping group={group} service={service.name} />
|
<Ping group={group} service={service.name} />
|
||||||
|
|||||||
@ -19,7 +19,7 @@ export default function Container({ error = false, children, service }) {
|
|||||||
|
|
||||||
let visibleChildren = childrenArray;
|
let visibleChildren = childrenArray;
|
||||||
let fields = service?.widget?.fields;
|
let fields = service?.widget?.fields;
|
||||||
if (typeof service.widget.fields === 'string') fields = JSON.parse(service.widget.fields);
|
if (typeof fields === 'string') fields = JSON.parse(service.widget.fields);
|
||||||
const type = service?.widget?.type;
|
const type = service?.widget?.type;
|
||||||
if (fields && type) {
|
if (fields && type) {
|
||||||
// if the field contains a "." then it most likely contains a common loc value
|
// if the field contains a "." then it most likely contains a common loc value
|
||||||
|
|||||||
@ -37,7 +37,7 @@ export default function Widget({ options }) {
|
|||||||
<Resource icon={FaMemory} label={t("glances.wait")} percentage="0" />
|
<Resource icon={FaMemory} label={t("glances.wait")} percentage="0" />
|
||||||
{ options.cputemp && <Resource icon={FaThermometerHalf} label={t("glances.wait")} percentage="0" /> }
|
{ options.cputemp && <Resource icon={FaThermometerHalf} label={t("glances.wait")} percentage="0" /> }
|
||||||
{ options.disk && !Array.isArray(options.disk) && <Resource key={options.disk} icon={FiHardDrive} label={t("glances.wait")} percentage="0" /> }
|
{ options.disk && !Array.isArray(options.disk) && <Resource key={options.disk} icon={FiHardDrive} label={t("glances.wait")} percentage="0" /> }
|
||||||
{ options.disk && Array.isArray(options.disk) && options.disk.map((disk) => <Resource key={`disk_${disk.mnt_point}`} icon={FiHardDrive} label={t("glances.wait")} percentage="0" /> ) }
|
{ options.disk && Array.isArray(options.disk) && options.disk.map((disk) => <Resource key={`disk_${disk}`} icon={FiHardDrive} label={t("glances.wait")} percentage="0" /> ) }
|
||||||
{ options.uptime && <Resource icon={FaRegClock} label={t("glances.wait")} percentage="0" /> }
|
{ options.uptime && <Resource icon={FaRegClock} label={t("glances.wait")} percentage="0" /> }
|
||||||
{ options.label && <WidgetLabel label={options.label} /> }
|
{ options.label && <WidgetLabel label={options.label} /> }
|
||||||
</Resources>;
|
</Resources>;
|
||||||
@ -108,7 +108,7 @@ export default function Widget({ options }) {
|
|||||||
expanded={options.expanded}
|
expanded={options.expanded}
|
||||||
/>
|
/>
|
||||||
{disks.map((disk) => (
|
{disks.map((disk) => (
|
||||||
<Resource key={`disk_${disk.mnt_point}`}
|
<Resource key={`disk_${disk.mnt_point ?? disk.device_name}`}
|
||||||
icon={FiHardDrive}
|
icon={FiHardDrive}
|
||||||
value={t("common.bytes", { value: disk.free })}
|
value={t("common.bytes", { value: disk.free })}
|
||||||
label={t("glances.free")}
|
label={t("glances.free")}
|
||||||
|
|||||||
@ -5,11 +5,11 @@ import { useTranslation } from "next-i18next";
|
|||||||
import Resource from "../widget/resource";
|
import Resource from "../widget/resource";
|
||||||
import Error from "../widget/error";
|
import Error from "../widget/error";
|
||||||
|
|
||||||
export default function Cpu({ expanded }) {
|
export default function Cpu({ expanded, refresh = 1500 }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const { data, error } = useSWR(`/api/widgets/resources?type=cpu`, {
|
const { data, error } = useSWR(`/api/widgets/resources?type=cpu`, {
|
||||||
refreshInterval: 1500,
|
refreshInterval: refresh,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (error || data?.error) {
|
if (error || data?.error) {
|
||||||
|
|||||||
@ -9,11 +9,11 @@ function convertToFahrenheit(t) {
|
|||||||
return t * 9/5 + 32
|
return t * 9/5 + 32
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function CpuTemp({ expanded, units }) {
|
export default function CpuTemp({ expanded, units, refresh = 1500 }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const { data, error } = useSWR(`/api/widgets/resources?type=cputemp`, {
|
const { data, error } = useSWR(`/api/widgets/resources?type=cputemp`, {
|
||||||
refreshInterval: 1500,
|
refreshInterval: refresh,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (error || data?.error) {
|
if (error || data?.error) {
|
||||||
|
|||||||
@ -5,11 +5,11 @@ import { useTranslation } from "next-i18next";
|
|||||||
import Resource from "../widget/resource";
|
import Resource from "../widget/resource";
|
||||||
import Error from "../widget/error";
|
import Error from "../widget/error";
|
||||||
|
|
||||||
export default function Disk({ options, expanded }) {
|
export default function Disk({ options, expanded, refresh = 1500 }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const { data, error } = useSWR(`/api/widgets/resources?type=disk&target=${options.disk}`, {
|
const { data, error } = useSWR(`/api/widgets/resources?type=disk&target=${options.disk}`, {
|
||||||
refreshInterval: 1500,
|
refreshInterval: refresh,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (error || data?.error) {
|
if (error || data?.error) {
|
||||||
|
|||||||
@ -5,11 +5,11 @@ import { useTranslation } from "next-i18next";
|
|||||||
import Resource from "../widget/resource";
|
import Resource from "../widget/resource";
|
||||||
import Error from "../widget/error";
|
import Error from "../widget/error";
|
||||||
|
|
||||||
export default function Memory({ expanded }) {
|
export default function Memory({ expanded, refresh = 1500 }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const { data, error } = useSWR(`/api/widgets/resources?type=memory`, {
|
const { data, error } = useSWR(`/api/widgets/resources?type=memory`, {
|
||||||
refreshInterval: 1500,
|
refreshInterval: refresh,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (error || data?.error) {
|
if (error || data?.error) {
|
||||||
|
|||||||
@ -9,16 +9,19 @@ import Uptime from "./uptime";
|
|||||||
|
|
||||||
export default function Resources({ options }) {
|
export default function Resources({ options }) {
|
||||||
const { expanded, units } = options;
|
const { expanded, units } = options;
|
||||||
|
let { refresh } = options;
|
||||||
|
if (!refresh) refresh = 1500;
|
||||||
|
refresh = Math.max(refresh, 1000);
|
||||||
return <Container options={options}>
|
return <Container options={options}>
|
||||||
<Raw>
|
<Raw>
|
||||||
<div className="flex flex-row self-center flex-wrap justify-between">
|
<div className="flex flex-row self-center flex-wrap justify-between">
|
||||||
{options.cpu && <Cpu expanded={expanded} />}
|
{options.cpu && <Cpu expanded={expanded} refresh={refresh} />}
|
||||||
{options.memory && <Memory expanded={expanded} />}
|
{options.memory && <Memory expanded={expanded} refresh={refresh} />}
|
||||||
{Array.isArray(options.disk)
|
{Array.isArray(options.disk)
|
||||||
? options.disk.map((disk) => <Disk key={disk} options={{ disk }} expanded={expanded} />)
|
? options.disk.map((disk) => <Disk key={disk} options={{ disk }} expanded={expanded} refresh={refresh} />)
|
||||||
: options.disk && <Disk options={options} expanded={expanded} />}
|
: options.disk && <Disk options={options} expanded={expanded} refresh={refresh} />}
|
||||||
{options.cputemp && <CpuTemp expanded={expanded} units={units} />}
|
{options.cputemp && <CpuTemp expanded={expanded} units={units} refresh={refresh} />}
|
||||||
{options.uptime && <Uptime />}
|
{options.uptime && <Uptime refresh={refresh} />}
|
||||||
</div>
|
</div>
|
||||||
{options.label && (
|
{options.label && (
|
||||||
<div className="ml-6 pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{options.label}</div>
|
<div className="ml-6 pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{options.label}</div>
|
||||||
|
|||||||
@ -5,11 +5,11 @@ import { useTranslation } from "next-i18next";
|
|||||||
import Resource from "../widget/resource";
|
import Resource from "../widget/resource";
|
||||||
import Error from "../widget/error";
|
import Error from "../widget/error";
|
||||||
|
|
||||||
export default function Uptime() {
|
export default function Uptime({ refresh = 1500 }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const { data, error } = useSWR(`/api/widgets/resources?type=uptime`, {
|
const { data, error } = useSWR(`/api/widgets/resources?type=uptime`, {
|
||||||
refreshInterval: 1500,
|
refreshInterval: refresh,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (error || data?.error) {
|
if (error || data?.error) {
|
||||||
|
|||||||
@ -15,7 +15,7 @@ export default function Resource({ children, icon, value, label, expandedValue =
|
|||||||
<div className="pr-1">{expandedLabel}</div>
|
<div className="pr-1">{expandedLabel}</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
{ percentage && <UsageBar percent={percentage} /> }
|
{ percentage >= 0 && <UsageBar percent={percentage} /> }
|
||||||
{ children }
|
{ children }
|
||||||
</div>
|
</div>
|
||||||
</div>;
|
</div>;
|
||||||
|
|||||||
@ -293,6 +293,9 @@ export function cleanServiceGroups(groups) {
|
|||||||
node, // Proxmox
|
node, // Proxmox
|
||||||
snapshotHost, // kopia
|
snapshotHost, // kopia
|
||||||
snapshotPath,
|
snapshotPath,
|
||||||
|
userEmail, // azuredevops
|
||||||
|
repositoryId,
|
||||||
|
metric, // glances
|
||||||
} = cleanedService.widget;
|
} = cleanedService.widget;
|
||||||
|
|
||||||
let fieldsList = fields;
|
let fieldsList = fields;
|
||||||
@ -312,6 +315,11 @@ export function cleanServiceGroups(groups) {
|
|||||||
service_group: serviceGroup.name,
|
service_group: serviceGroup.name,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (type === "azuredevops") {
|
||||||
|
if (userEmail) cleanedService.widget.userEmail = userEmail;
|
||||||
|
if (repositoryId) cleanedService.widget.repositoryId = repositoryId;
|
||||||
|
}
|
||||||
|
|
||||||
if (type === "coinmarketcap") {
|
if (type === "coinmarketcap") {
|
||||||
if (currency) cleanedService.widget.currency = currency;
|
if (currency) cleanedService.widget.currency = currency;
|
||||||
if (symbols) cleanedService.widget.symbols = symbols;
|
if (symbols) cleanedService.widget.symbols = symbols;
|
||||||
@ -351,6 +359,9 @@ export function cleanServiceGroups(groups) {
|
|||||||
if (snapshotHost) cleanedService.widget.snapshotHost = snapshotHost;
|
if (snapshotHost) cleanedService.widget.snapshotHost = snapshotHost;
|
||||||
if (snapshotPath) cleanedService.widget.snapshotPath = snapshotPath;
|
if (snapshotPath) cleanedService.widget.snapshotPath = snapshotPath;
|
||||||
}
|
}
|
||||||
|
if (type === "glances") {
|
||||||
|
if (metric) cleanedService.widget.metric = metric;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return cleanedService;
|
return cleanedService;
|
||||||
|
|||||||
@ -5,7 +5,7 @@ export function formatApiCall(url, args) {
|
|||||||
return args[key] || "";
|
return args[key] || "";
|
||||||
};
|
};
|
||||||
|
|
||||||
return url.replace(/\/+$/, "").replace(find, replace);
|
return url.replace(/\/+$/, "").replace(find, replace).replace(find,replace);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getURLSearchParams(widget, endpoint) {
|
function getURLSearchParams(widget, endpoint) {
|
||||||
|
|||||||
@ -62,8 +62,10 @@ export default async function credentialedProxyHandler(req, res, map) {
|
|||||||
headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`;
|
headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (widget.type === "azurePipelines") {
|
else if (widget.type === "azuredevops") {
|
||||||
headers.Authorization = `Basic ${Buffer.from(`$:${widget.key}`).toString("base64")}`;
|
headers.Authorization = `Basic ${Buffer.from(`$:${widget.key}`).toString("base64")}`;
|
||||||
|
} else if (widget.type === "glances") {
|
||||||
|
headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`;
|
||||||
} else {
|
} else {
|
||||||
headers["X-API-Key"] = `${widget.key}`;
|
headers["X-API-Key"] = `${widget.key}`;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,10 +9,10 @@ const widget = {
|
|||||||
endpoint: "core/users?page_size=1",
|
endpoint: "core/users?page_size=1",
|
||||||
},
|
},
|
||||||
login: {
|
login: {
|
||||||
endpoint: "events/events/per_month/?action=login&query={}",
|
endpoint: "events/events/per_month/?action=login",
|
||||||
},
|
},
|
||||||
login_failed: {
|
login_failed: {
|
||||||
endpoint: "events/events/per_month/?action=login_failed&query={}",
|
endpoint: "events/events/per_month/?action=login_failed",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,36 +0,0 @@
|
|||||||
import { useTranslation } from "next-i18next";
|
|
||||||
|
|
||||||
import Container from "components/services/widget/container";
|
|
||||||
import Block from "components/services/widget/block";
|
|
||||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
|
||||||
|
|
||||||
export default function Component({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const { widget } = service;
|
|
||||||
|
|
||||||
const { data: pipelineData, error: pipelineError } = useWidgetAPI(widget);
|
|
||||||
|
|
||||||
if (pipelineError) {
|
|
||||||
return <Container service={service} error={pipelineError} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!pipelineData || !Array.isArray(pipelineData.value)) {
|
|
||||||
return (
|
|
||||||
<Container service={service}>
|
|
||||||
<Block label="azurePipelines.result" />
|
|
||||||
<Block label="azurePipelines.buildId" />
|
|
||||||
</Container>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Container service={service}>
|
|
||||||
{pipelineData.value[0].result ?
|
|
||||||
<Block label="azurePipelines.result" value={t(`azurePipelines.${pipelineData.value[0].result.toString()}`)} /> :
|
|
||||||
<Block label="azurePipelines.status" value={t(`azurePipelines.${pipelineData.value[0].status.toString()}`)} />
|
|
||||||
}
|
|
||||||
<Block label="azurePipelines.buildId" value= { pipelineData.value[0].id } />
|
|
||||||
</Container>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
|
||||||
|
|
||||||
const widget = {
|
|
||||||
api: "https://dev.azure.com/{organization}/{project}/_apis/build/Builds?branchName={branchName}&definitions={definitionId}",
|
|
||||||
proxyHandler: credentialedProxyHandler,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default widget;
|
|
||||||
65
src/widgets/azuredevops/component.jsx
Normal file
65
src/widgets/azuredevops/component.jsx
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import Container from "components/services/widget/container";
|
||||||
|
import Block from "components/services/widget/block";
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { widget } = service;
|
||||||
|
const { userEmail, repositoryId } = widget;
|
||||||
|
const includePR = userEmail !== undefined && repositoryId !== undefined;
|
||||||
|
const { data: prData, error: prError } = useWidgetAPI(widget, includePR ? "pr" : null);
|
||||||
|
const { data: pipelineData, error: pipelineError } = useWidgetAPI(widget, "pipeline");
|
||||||
|
|
||||||
|
if (
|
||||||
|
pipelineError ||
|
||||||
|
(includePR && (prError || prData?.errorCode !== undefined))
|
||||||
|
) {
|
||||||
|
let finalError = pipelineError ?? prError;
|
||||||
|
if (includePR && prData?.errorCode !== null) {
|
||||||
|
// pr call failed possibly with more specific message
|
||||||
|
finalError = { message: prData?.message ?? 'Error communicating with Azure API' }
|
||||||
|
}
|
||||||
|
return <Container service={service} error={finalError} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pipelineData || !Array.isArray(pipelineData.value) || (includePR && !prData)) {
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
<Block label="azuredevops.result" />
|
||||||
|
<Block label="azuredevops.totalPrs" />
|
||||||
|
<Block label="azuredevops.myPrs" />
|
||||||
|
<Block label="azuredevops.approved" />
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
{pipelineData.value[0].result ? (
|
||||||
|
<Block label="azuredevops.result" value={t(`azuredevops.${pipelineData.value[0].result.toString()}`)} />
|
||||||
|
) : (
|
||||||
|
<Block label="azuredevops.status" value={t(`azuredevops.${pipelineData.value[0].status.toString()}`)} />
|
||||||
|
)}
|
||||||
|
|
||||||
|
{includePR && <Block label="azuredevops.totalPrs" value={t("common.number", { value: prData.count })} />}
|
||||||
|
{includePR && <Block
|
||||||
|
label="azuredevops.myPrs"
|
||||||
|
value={t("common.number", {
|
||||||
|
value: prData.value?.filter((item) => item.createdBy.uniqueName.toLowerCase() === userEmail.toLowerCase())
|
||||||
|
.length,
|
||||||
|
})}
|
||||||
|
/>}
|
||||||
|
{includePR && <Block
|
||||||
|
label="azuredevops.approved"
|
||||||
|
value={t("common.number", {
|
||||||
|
value: prData.value
|
||||||
|
?.filter((item) => item.createdBy.uniqueName.toLowerCase() === userEmail.toLowerCase())
|
||||||
|
.filter((item) => item.reviewers.some((reviewer) => reviewer.vote === 10)).length,
|
||||||
|
})}
|
||||||
|
/>}
|
||||||
|
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
18
src/widgets/azuredevops/widget.js
Normal file
18
src/widgets/azuredevops/widget.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||||
|
|
||||||
|
const widget = {
|
||||||
|
api: "https://dev.azure.com/{organization}/{project}/_apis/{endpoint}",
|
||||||
|
proxyHandler: credentialedProxyHandler,
|
||||||
|
|
||||||
|
mappings: {
|
||||||
|
pr: {
|
||||||
|
endpoint: "git/repositories/{repositoryId}/pullrequests"
|
||||||
|
},
|
||||||
|
|
||||||
|
pipeline: {
|
||||||
|
endpoint: "build/Builds?branchName={branchName}&definitions={definitionId}&$top=1"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default widget;
|
||||||
@ -5,7 +5,7 @@ const components = {
|
|||||||
audiobookshelf: dynamic(() => import("./audiobookshelf/component")),
|
audiobookshelf: dynamic(() => import("./audiobookshelf/component")),
|
||||||
authentik: dynamic(() => import("./authentik/component")),
|
authentik: dynamic(() => import("./authentik/component")),
|
||||||
autobrr: dynamic(() => import("./autobrr/component")),
|
autobrr: dynamic(() => import("./autobrr/component")),
|
||||||
azurePipelines: dynamic(() => import("./azurePipelines/component")),
|
azuredevops: dynamic(() => import("./azuredevops/component")),
|
||||||
bazarr: dynamic(() => import("./bazarr/component")),
|
bazarr: dynamic(() => import("./bazarr/component")),
|
||||||
caddy: dynamic(() => import("./caddy/component")),
|
caddy: dynamic(() => import("./caddy/component")),
|
||||||
changedetectionio: dynamic(() => import("./changedetectionio/component")),
|
changedetectionio: dynamic(() => import("./changedetectionio/component")),
|
||||||
@ -24,6 +24,7 @@ const components = {
|
|||||||
freshrss: dynamic(() => import("./freshrss/component")),
|
freshrss: dynamic(() => import("./freshrss/component")),
|
||||||
gamedig: dynamic(() => import("./gamedig/component")),
|
gamedig: dynamic(() => import("./gamedig/component")),
|
||||||
ghostfolio: dynamic(() => import("./ghostfolio/component")),
|
ghostfolio: dynamic(() => import("./ghostfolio/component")),
|
||||||
|
glances: dynamic(() => import("./glances/component")),
|
||||||
gluetun: dynamic(() => import("./gluetun/component")),
|
gluetun: dynamic(() => import("./gluetun/component")),
|
||||||
gotify: dynamic(() => import("./gotify/component")),
|
gotify: dynamic(() => import("./gotify/component")),
|
||||||
grafana: dynamic(() => import("./grafana/component")),
|
grafana: dynamic(() => import("./grafana/component")),
|
||||||
@ -90,6 +91,7 @@ const components = {
|
|||||||
unifi: dynamic(() => import("./unifi/component")),
|
unifi: dynamic(() => import("./unifi/component")),
|
||||||
unmanic: dynamic(() => import("./unmanic/component")),
|
unmanic: dynamic(() => import("./unmanic/component")),
|
||||||
uptimekuma: dynamic(() => import("./uptimekuma/component")),
|
uptimekuma: dynamic(() => import("./uptimekuma/component")),
|
||||||
|
urbackup: dynamic(() => import("./urbackup/component")),
|
||||||
watchtower: dynamic(() => import("./watchtower/component")),
|
watchtower: dynamic(() => import("./watchtower/component")),
|
||||||
whatsupdocker: dynamic(() => import("./whatsupdocker/component")),
|
whatsupdocker: dynamic(() => import("./whatsupdocker/component")),
|
||||||
xteve: dynamic(() => import("./xteve/component")),
|
xteve: dynamic(() => import("./xteve/component")),
|
||||||
|
|||||||
44
src/widgets/glances/component.jsx
Normal file
44
src/widgets/glances/component.jsx
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import Memory from "./metrics/memory";
|
||||||
|
import Cpu from "./metrics/cpu";
|
||||||
|
import Sensor from "./metrics/sensor";
|
||||||
|
import Net from "./metrics/net";
|
||||||
|
import Process from "./metrics/process";
|
||||||
|
import Disk from "./metrics/disk";
|
||||||
|
import GPU from "./metrics/gpu";
|
||||||
|
import Info from "./metrics/info";
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { widget } = service;
|
||||||
|
|
||||||
|
if (widget.metric === "info") {
|
||||||
|
return <Info service={service} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (widget.metric === "memory") {
|
||||||
|
return <Memory service={service} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (widget.metric === "process") {
|
||||||
|
return <Process service={service} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (widget.metric.match(/^network:/)) {
|
||||||
|
return <Net service={service} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (widget.metric.match(/^sensor:/)) {
|
||||||
|
return <Sensor service={service} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (widget.metric.match(/^disk:/)) {
|
||||||
|
return <Disk service={service} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (widget.metric.match(/^gpu:/)) {
|
||||||
|
return <GPU service={service} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (widget.metric === "cpu") {
|
||||||
|
return <Cpu service={service} />;
|
||||||
|
}
|
||||||
|
}
|
||||||
7
src/widgets/glances/components/block.jsx
Normal file
7
src/widgets/glances/components/block.jsx
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
export default function Block({ position, children }) {
|
||||||
|
return (
|
||||||
|
<div className={`absolute ${position} z-20 text-sm pointer-events-none`}>
|
||||||
|
{children}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
48
src/widgets/glances/components/chart.jsx
Normal file
48
src/widgets/glances/components/chart.jsx
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
import { PureComponent } from "react";
|
||||||
|
import { AreaChart, Area, ResponsiveContainer, Tooltip } from "recharts";
|
||||||
|
|
||||||
|
import CustomTooltip from "./custom_tooltip";
|
||||||
|
|
||||||
|
class Chart extends PureComponent {
|
||||||
|
render() {
|
||||||
|
const { dataPoints, formatter, label } = this.props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="absolute -top-1 -left-1 h-[120px] w-[calc(100%+0.5em)] z-0">
|
||||||
|
<div className="overflow-clip z-10 w-full h-full">
|
||||||
|
<ResponsiveContainer width="100%" height="100%">
|
||||||
|
<AreaChart data={dataPoints}>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="color" x1="0" y1="0" x2="0" y2="1">
|
||||||
|
<stop offset="5%" stopColor="rgb(var(--color-500))" stopOpacity={0.4}/>
|
||||||
|
<stop offset="95%" stopColor="rgb(var(--color-500))" stopOpacity={0.1}/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<Area
|
||||||
|
name={label[0]}
|
||||||
|
isAnimationActive={false}
|
||||||
|
type="monotoneX"
|
||||||
|
dataKey="value"
|
||||||
|
stroke="rgb(var(--color-500))"
|
||||||
|
fillOpacity={1} fill="url(#color)"
|
||||||
|
baseLine={0}
|
||||||
|
/>
|
||||||
|
<Tooltip
|
||||||
|
allowEscapeViewBox={{ x: false, y: false }}
|
||||||
|
formatter={formatter}
|
||||||
|
content={<CustomTooltip formatter={formatter} />}
|
||||||
|
classNames="rounded-md text-xs p-0.5"
|
||||||
|
contentStyle={{
|
||||||
|
backgroundColor: "rgb(var(--color-800))",
|
||||||
|
color: "rgb(var(--color-100))"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</AreaChart>
|
||||||
|
</ResponsiveContainer>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Chart;
|
||||||
63
src/widgets/glances/components/chart_dual.jsx
Normal file
63
src/widgets/glances/components/chart_dual.jsx
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
import { PureComponent } from "react";
|
||||||
|
import { AreaChart, Area, ResponsiveContainer, Tooltip } from "recharts";
|
||||||
|
|
||||||
|
import CustomTooltip from "./custom_tooltip";
|
||||||
|
|
||||||
|
class ChartDual extends PureComponent {
|
||||||
|
render() {
|
||||||
|
const { dataPoints, formatter, stack, label, stackOffset } = this.props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="absolute -top-1 -left-1 h-[120px] w-[calc(100%+0.5em)] z-0">
|
||||||
|
<div className="overflow-clip z-10 w-full h-full">
|
||||||
|
<ResponsiveContainer width="100%" height="100%">
|
||||||
|
<AreaChart data={dataPoints} stackOffset={stackOffset ?? "none"}>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="colorA" x1="0" y1="0" x2="0" y2="1">
|
||||||
|
<stop offset="5%" stopColor="rgb(var(--color-800))" stopOpacity={0.8}/>
|
||||||
|
<stop offset="95%" stopColor="rgb(var(--color-800))" stopOpacity={0.5}/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="colorB" x1="0" y1="0" x2="0" y2="1">
|
||||||
|
<stop offset="5%" stopColor="rgb(var(--color-500))" stopOpacity={0.4}/>
|
||||||
|
<stop offset="95%" stopColor="rgb(var(--color-500))" stopOpacity={0.1}/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<Area
|
||||||
|
name={label[0]}
|
||||||
|
stackId={(stack && stack[0]) ?? "1"}
|
||||||
|
isAnimationActive={false}
|
||||||
|
type="monotoneX"
|
||||||
|
dataKey="a"
|
||||||
|
stroke="rgb(var(--color-700))"
|
||||||
|
fillOpacity={1} fill="url(#colorA)"
|
||||||
|
/>
|
||||||
|
<Area
|
||||||
|
name={label[1]}
|
||||||
|
stackId={(stack && stack[1]) ?? "1"}
|
||||||
|
isAnimationActive={false}
|
||||||
|
type="monotoneX"
|
||||||
|
dataKey="b"
|
||||||
|
stroke="rgb(var(--color-500))"
|
||||||
|
fillOpacity={1} fill="url(#colorB)"
|
||||||
|
/>
|
||||||
|
<Tooltip
|
||||||
|
allowEscapeViewBox={{ x: false, y: false }}
|
||||||
|
formatter={formatter}
|
||||||
|
content={<CustomTooltip formatter={formatter} />}
|
||||||
|
classNames="rounded-md text-xs p-0.5"
|
||||||
|
contentStyle={{
|
||||||
|
backgroundColor: "rgb(var(--color-800))",
|
||||||
|
color: "rgb(var(--color-100))"
|
||||||
|
}}
|
||||||
|
|
||||||
|
/>
|
||||||
|
</AreaChart>
|
||||||
|
</ResponsiveContainer>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ChartDual;
|
||||||
9
src/widgets/glances/components/container.jsx
Normal file
9
src/widgets/glances/components/container.jsx
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
export default function Container({ children, className = "" }) {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{children}
|
||||||
|
<div className={`absolute top-0 right-0 bottom-0 left-0 overflow-clip pointer-events-none ${className}`} />
|
||||||
|
<div className="h-[68px] overflow-clip" />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
15
src/widgets/glances/components/custom_tooltip.jsx
Normal file
15
src/widgets/glances/components/custom_tooltip.jsx
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
export default function Tooltip({ active, payload, formatter }) {
|
||||||
|
if (active && payload && payload.length) {
|
||||||
|
return (
|
||||||
|
<div className="bg-theme-800/80 rounded-md text-theme-200 px-2 py-0">
|
||||||
|
{payload.map((pld, id) => (
|
||||||
|
<div key={Math.random()} className="first-of-type:pt-0 pt-0.5">
|
||||||
|
<div>{formatter(pld.value)} {payload[id].name}</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
9
src/widgets/glances/components/error.jsx
Normal file
9
src/widgets/glances/components/error.jsx
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
export default function Error() {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
return <div className="absolute bottom-2 left-2 z-20 text-red-400 text-xs opacity-75">
|
||||||
|
{t("widget.api_error")}
|
||||||
|
</div>;
|
||||||
|
}
|
||||||
91
src/widgets/glances/metrics/cpu.jsx
Normal file
91
src/widgets/glances/metrics/cpu.jsx
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
import dynamic from "next/dynamic";
|
||||||
|
import { useState, useEffect } from "react";
|
||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import Error from "../components/error";
|
||||||
|
import Container from "../components/container";
|
||||||
|
import Block from "../components/block";
|
||||||
|
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
const Chart = dynamic(() => import("../components/chart"), { ssr: false });
|
||||||
|
|
||||||
|
const pointsLimit = 15;
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ value: 0 }, 0, pointsLimit));
|
||||||
|
|
||||||
|
const { data, error } = useWidgetAPI(service.widget, 'cpu', {
|
||||||
|
refreshInterval: 1000,
|
||||||
|
});
|
||||||
|
|
||||||
|
const { data: systemData, error: systemError } = useWidgetAPI(service.widget, 'system');
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (data) {
|
||||||
|
setDataPoints((prevDataPoints) => {
|
||||||
|
const newDataPoints = [...prevDataPoints, { value: data.total }];
|
||||||
|
if (newDataPoints.length > pointsLimit) {
|
||||||
|
newDataPoints.shift();
|
||||||
|
}
|
||||||
|
return newDataPoints;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, [data]);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
return <Container><Error error={error} /></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container>
|
||||||
|
<Chart
|
||||||
|
dataPoints={dataPoints}
|
||||||
|
label={[t("resources.used")]}
|
||||||
|
formatter={(value) => t("common.number", {
|
||||||
|
value,
|
||||||
|
style: "unit",
|
||||||
|
unit: "percent",
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{systemData && !systemError && (
|
||||||
|
<Block position="bottom-3 left-3">
|
||||||
|
{systemData.linux_distro && (
|
||||||
|
<div className="text-xs opacity-50">
|
||||||
|
{systemData.linux_distro}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{systemData.os_version && (
|
||||||
|
<div className="text-xs opacity-50">
|
||||||
|
{systemData.os_version}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{systemData.hostname && (
|
||||||
|
<div className="text-xs opacity-75">
|
||||||
|
{systemData.hostname}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</Block>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<Block position="bottom-3 right-3">
|
||||||
|
<div className="text-xs font-bold opacity-75">
|
||||||
|
{t("common.number", {
|
||||||
|
value: data.total,
|
||||||
|
style: "unit",
|
||||||
|
unit: "percent",
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
})} {t("resources.used")}
|
||||||
|
</div>
|
||||||
|
</Block>
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
102
src/widgets/glances/metrics/disk.jsx
Normal file
102
src/widgets/glances/metrics/disk.jsx
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
import dynamic from "next/dynamic";
|
||||||
|
import { useState, useEffect } from "react";
|
||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import Error from "../components/error";
|
||||||
|
import Container from "../components/container";
|
||||||
|
import Block from "../components/block";
|
||||||
|
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
const ChartDual = dynamic(() => import("../components/chart_dual"), { ssr: false });
|
||||||
|
|
||||||
|
const pointsLimit = 15;
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { widget } = service;
|
||||||
|
const [, diskName] = widget.metric.split(':');
|
||||||
|
|
||||||
|
const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ read_bytes: 0, write_bytes: 0, time_since_update: 0 }, 0, pointsLimit));
|
||||||
|
const [ratePoints, setRatePoints] = useState(new Array(pointsLimit).fill({ a: 0, b: 0 }, 0, pointsLimit));
|
||||||
|
|
||||||
|
const { data, error } = useWidgetAPI(service.widget, 'diskio', {
|
||||||
|
refreshInterval: 1000,
|
||||||
|
});
|
||||||
|
|
||||||
|
const calculateRates = (d) => d.map(item => ({
|
||||||
|
a: item.read_bytes / item.time_since_update,
|
||||||
|
b: item.write_bytes / item.time_since_update
|
||||||
|
}));
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (data) {
|
||||||
|
const diskData = data.find((item) => item.disk_name === diskName);
|
||||||
|
|
||||||
|
setDataPoints((prevDataPoints) => {
|
||||||
|
const newDataPoints = [...prevDataPoints, diskData];
|
||||||
|
if (newDataPoints.length > pointsLimit) {
|
||||||
|
newDataPoints.shift();
|
||||||
|
}
|
||||||
|
return newDataPoints;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, [data, diskName]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setRatePoints(calculateRates(dataPoints));
|
||||||
|
}, [dataPoints]);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
return <Container><Error error={error} /></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
const diskData = data.find((item) => item.disk_name === diskName);
|
||||||
|
|
||||||
|
if (!diskData) {
|
||||||
|
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
const diskRates = calculateRates(dataPoints);
|
||||||
|
const currentRate = diskRates[diskRates.length - 1];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container>
|
||||||
|
<ChartDual
|
||||||
|
dataPoints={ratePoints}
|
||||||
|
label={[t("glances.read"), t("glances.write")]}
|
||||||
|
max={diskData.critical}
|
||||||
|
formatter={(value) => t("common.bitrate", {
|
||||||
|
value,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{currentRate && !error && (
|
||||||
|
<Block position="bottom-3 left-3">
|
||||||
|
<div className="text-xs opacity-50">
|
||||||
|
{t("common.bitrate", {
|
||||||
|
value: currentRate.a,
|
||||||
|
})} {t("glances.read")}
|
||||||
|
</div>
|
||||||
|
<div className="text-xs opacity-50">
|
||||||
|
{t("common.bitrate", {
|
||||||
|
value: currentRate.b,
|
||||||
|
})} {t("glances.write")}
|
||||||
|
</div>
|
||||||
|
</Block>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<Block position="bottom-3 right-3">
|
||||||
|
<div className="text-xs opacity-75">
|
||||||
|
{t("common.bitrate", {
|
||||||
|
value: currentRate.a + currentRate.b,
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</Block>
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
104
src/widgets/glances/metrics/gpu.jsx
Normal file
104
src/widgets/glances/metrics/gpu.jsx
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
import dynamic from "next/dynamic";
|
||||||
|
import { useState, useEffect } from "react";
|
||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import Error from "../components/error";
|
||||||
|
import Container from "../components/container";
|
||||||
|
import Block from "../components/block";
|
||||||
|
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
const ChartDual = dynamic(() => import("../components/chart_dual"), { ssr: false });
|
||||||
|
|
||||||
|
const pointsLimit = 15;
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { widget } = service;
|
||||||
|
const [, gpuName] = widget.metric.split(':');
|
||||||
|
|
||||||
|
const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ a: 0, b: 0 }, 0, pointsLimit));
|
||||||
|
|
||||||
|
const { data, error } = useWidgetAPI(widget, 'gpu', {
|
||||||
|
refreshInterval: 1000,
|
||||||
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (data) {
|
||||||
|
// eslint-disable-next-line eqeqeq
|
||||||
|
const gpuData = data.find((item) => item[item.key] == gpuName);
|
||||||
|
|
||||||
|
if (gpuData) {
|
||||||
|
setDataPoints((prevDataPoints) => {
|
||||||
|
const newDataPoints = [...prevDataPoints, { a: gpuData.mem, b: gpuData.proc }];
|
||||||
|
if (newDataPoints.length > pointsLimit) {
|
||||||
|
newDataPoints.shift();
|
||||||
|
}
|
||||||
|
return newDataPoints;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [data, gpuName]);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
return <Container><Error error={error} /></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line eqeqeq
|
||||||
|
const gpuData = data.find((item) => item[item.key] == gpuName);
|
||||||
|
|
||||||
|
if (!gpuData) {
|
||||||
|
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container>
|
||||||
|
<ChartDual
|
||||||
|
dataPoints={dataPoints}
|
||||||
|
label={[t("glances.mem"), t("glances.gpu")]}
|
||||||
|
stack={['mem', 'proc']}
|
||||||
|
formatter={(value) => t("common.percent", {
|
||||||
|
value,
|
||||||
|
maximumFractionDigits: 1,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Block position="bottom-3 left-3">
|
||||||
|
{gpuData && gpuData.name && (
|
||||||
|
<div className="text-xs opacity-50">
|
||||||
|
{gpuData.name}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<div className="text-xs opacity-75">
|
||||||
|
{t("common.number", {
|
||||||
|
value: gpuData.mem,
|
||||||
|
maximumFractionDigits: 1,
|
||||||
|
})}% {t("glances.mem")} {t("resources.used")}
|
||||||
|
</div>
|
||||||
|
</Block>
|
||||||
|
|
||||||
|
<Block position="bottom-3 right-3">
|
||||||
|
<div className="text-xs opacity-75">
|
||||||
|
{t("common.number", {
|
||||||
|
value: gpuData.proc,
|
||||||
|
maximumFractionDigits: 1,
|
||||||
|
})}% {t("glances.gpu")}
|
||||||
|
</div>
|
||||||
|
</Block>
|
||||||
|
|
||||||
|
<Block position="top-3 right-3">
|
||||||
|
<div className="text-xs opacity-75">
|
||||||
|
{t("common.number", {
|
||||||
|
value: gpuData.temperature,
|
||||||
|
maximumFractionDigits: 1,
|
||||||
|
})}°
|
||||||
|
</div>
|
||||||
|
</Block>
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
115
src/widgets/glances/metrics/info.jsx
Normal file
115
src/widgets/glances/metrics/info.jsx
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import Error from "../components/error";
|
||||||
|
import Container from "../components/container";
|
||||||
|
import Block from "../components/block";
|
||||||
|
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const { data: quicklookData, errorL: quicklookError } = useWidgetAPI(service.widget, 'quicklook', {
|
||||||
|
refreshInterval: 1000,
|
||||||
|
});
|
||||||
|
|
||||||
|
const { data: systemData, errorL: systemError } = useWidgetAPI(service.widget, 'system', {
|
||||||
|
refreshInterval: 30000,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (quicklookError) {
|
||||||
|
return <Container><Error error={quicklookError} /></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (systemError) {
|
||||||
|
return <Container><Error error={systemError} /></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
const dataCharts = [];
|
||||||
|
|
||||||
|
if (quicklookData) {
|
||||||
|
quicklookData.percpu.forEach((cpu, index) => {
|
||||||
|
dataCharts.push({
|
||||||
|
name: `CPU ${index}`,
|
||||||
|
cpu: cpu.total,
|
||||||
|
mem: quicklookData.mem,
|
||||||
|
swap: quicklookData.swap,
|
||||||
|
proc: quicklookData.cpu,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container className="bg-gradient-to-br from-theme-500/30 via-theme-600/20 to-theme-700/10">
|
||||||
|
<Block position="top-3 right-3">
|
||||||
|
{quicklookData && quicklookData.cpu_name && (
|
||||||
|
<div className="text-[0.6rem] opacity-50">
|
||||||
|
{quicklookData.cpu_name}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</Block>
|
||||||
|
<Block position="bottom-3 left-3">
|
||||||
|
{systemData && systemData.linux_distro && (
|
||||||
|
<div className="text-xs opacity-50">
|
||||||
|
{systemData.linux_distro}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{systemData && systemData.os_version && (
|
||||||
|
<div className="text-xs opacity-50">
|
||||||
|
{systemData.os_version}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{systemData && systemData.hostname && (
|
||||||
|
<div className="text-xs opacity-75">
|
||||||
|
{systemData.hostname}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</Block>
|
||||||
|
|
||||||
|
<Block position="bottom-3 right-3 w-[4rem]">
|
||||||
|
{quicklookData && quicklookData.cpu && (
|
||||||
|
<div className="text-xs opacity-25 flex place-content-between">
|
||||||
|
<div>{t("glances.cpu")}</div>
|
||||||
|
<div className="opacity-75">
|
||||||
|
{t("common.number", {
|
||||||
|
value: quicklookData.cpu,
|
||||||
|
style: "unit",
|
||||||
|
unit: "percent",
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{quicklookData && quicklookData.mem && (
|
||||||
|
<div className="text-xs opacity-25 flex place-content-between">
|
||||||
|
<div>{t("glances.mem")}</div>
|
||||||
|
<div className="opacity-75">
|
||||||
|
{t("common.number", {
|
||||||
|
value: quicklookData.mem,
|
||||||
|
style: "unit",
|
||||||
|
unit: "percent",
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{quicklookData && quicklookData.swap && (
|
||||||
|
<div className="text-xs opacity-25 flex place-content-between">
|
||||||
|
<div>{t("glances.swap")}</div>
|
||||||
|
<div className="opacity-75">
|
||||||
|
{t("common.number", {
|
||||||
|
value: quicklookData.swap,
|
||||||
|
style: "unit",
|
||||||
|
unit: "percent",
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</Block>
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
92
src/widgets/glances/metrics/memory.jsx
Normal file
92
src/widgets/glances/metrics/memory.jsx
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
import dynamic from "next/dynamic";
|
||||||
|
import { useState, useEffect } from "react";
|
||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import Error from "../components/error";
|
||||||
|
import Container from "../components/container";
|
||||||
|
import Block from "../components/block";
|
||||||
|
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
const ChartDual = dynamic(() => import("../components/chart_dual"), { ssr: false });
|
||||||
|
|
||||||
|
const pointsLimit = 15;
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ value: 0 }, 0, pointsLimit));
|
||||||
|
|
||||||
|
const { data, error } = useWidgetAPI(service.widget, 'mem', {
|
||||||
|
refreshInterval: 1000,
|
||||||
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (data) {
|
||||||
|
setDataPoints((prevDataPoints) => {
|
||||||
|
const newDataPoints = [...prevDataPoints, { a: data.used, b: data.free }];
|
||||||
|
if (newDataPoints.length > pointsLimit) {
|
||||||
|
newDataPoints.shift();
|
||||||
|
}
|
||||||
|
return newDataPoints;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, [data]);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
return <Container><Error error={error} /></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container>
|
||||||
|
<ChartDual
|
||||||
|
dataPoints={dataPoints}
|
||||||
|
max={data.total}
|
||||||
|
label={[t("resources.used"), t("resources.free")]}
|
||||||
|
formatter={(value) => t("common.bytes", {
|
||||||
|
value,
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
binary: true,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{data && !error && (
|
||||||
|
<Block position="bottom-3 left-3">
|
||||||
|
{data.free && (
|
||||||
|
<div className="text-xs opacity-50">
|
||||||
|
{t("common.bytes", {
|
||||||
|
value: data.free,
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
binary: true,
|
||||||
|
})} {t("resources.free")}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{data.total && (
|
||||||
|
<div className="text-xs opacity-50">
|
||||||
|
{t("common.bytes", {
|
||||||
|
value: data.total,
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
binary: true,
|
||||||
|
})} {t("resources.total")}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</Block>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<Block position="bottom-3 right-3">
|
||||||
|
<div className="text-xs font-bold opacity-75">
|
||||||
|
{t("common.bytes", {
|
||||||
|
value: data.used,
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
binary: true,
|
||||||
|
})} {t("resources.used")}
|
||||||
|
</div>
|
||||||
|
</Block>
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
92
src/widgets/glances/metrics/net.jsx
Normal file
92
src/widgets/glances/metrics/net.jsx
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
import dynamic from "next/dynamic";
|
||||||
|
import { useState, useEffect } from "react";
|
||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import Error from "../components/error";
|
||||||
|
import Container from "../components/container";
|
||||||
|
import Block from "../components/block";
|
||||||
|
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
const ChartDual = dynamic(() => import("../components/chart_dual"), { ssr: false });
|
||||||
|
|
||||||
|
const pointsLimit = 15;
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { widget } = service;
|
||||||
|
const [, interfaceName] = widget.metric.split(':');
|
||||||
|
|
||||||
|
const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ value: 0 }, 0, pointsLimit));
|
||||||
|
|
||||||
|
const { data, error } = useWidgetAPI(widget, 'network', {
|
||||||
|
refreshInterval: 1000,
|
||||||
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (data) {
|
||||||
|
const interfaceData = data.find((item) => item[item.key] === interfaceName);
|
||||||
|
|
||||||
|
if (interfaceData) {
|
||||||
|
setDataPoints((prevDataPoints) => {
|
||||||
|
const newDataPoints = [...prevDataPoints, { a: interfaceData.tx, b: interfaceData.rx }];
|
||||||
|
if (newDataPoints.length > pointsLimit) {
|
||||||
|
newDataPoints.shift();
|
||||||
|
}
|
||||||
|
return newDataPoints;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [data, interfaceName]);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
return <Container><Error error={error} /></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
const interfaceData = data.find((item) => item[item.key] === interfaceName);
|
||||||
|
|
||||||
|
if (!interfaceData) {
|
||||||
|
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container>
|
||||||
|
<ChartDual
|
||||||
|
dataPoints={dataPoints}
|
||||||
|
label={[t("docker.tx"), t("docker.rx")]}
|
||||||
|
formatter={(value) => t("common.byterate", {
|
||||||
|
value,
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Block position="bottom-3 left-3">
|
||||||
|
{interfaceData && interfaceData.interface_name && (
|
||||||
|
<div className="text-xs opacity-50">
|
||||||
|
{interfaceData.interface_name}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<div className="text-xs opacity-75">
|
||||||
|
{t("common.bitrate", {
|
||||||
|
value: interfaceData.tx,
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
})} {t("docker.tx")}
|
||||||
|
</div>
|
||||||
|
</Block>
|
||||||
|
|
||||||
|
<Block position="bottom-3 right-3">
|
||||||
|
<div className="text-xs opacity-75">
|
||||||
|
{t("common.bitrate", {
|
||||||
|
value: interfaceData.rx,
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
})} {t("docker.rx")}
|
||||||
|
</div>
|
||||||
|
</Block>
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
66
src/widgets/glances/metrics/process.jsx
Normal file
66
src/widgets/glances/metrics/process.jsx
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import Error from "../components/error";
|
||||||
|
import Container from "../components/container";
|
||||||
|
import Block from "../components/block";
|
||||||
|
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
import ResolvedIcon from "components/resolvedicon";
|
||||||
|
|
||||||
|
const statusMap = {
|
||||||
|
"R": <ResolvedIcon icon="mdi-circle" width={32} height={32} />, // running
|
||||||
|
"S": <ResolvedIcon icon="mdi-circle-outline" width={32} height={32} />, // sleeping
|
||||||
|
"D": <ResolvedIcon icon="mdi-circle-double" width={32} height={32} />, // disk sleep
|
||||||
|
"Z": <ResolvedIcon icon="mdi-circle-opacity" width={32} height={32} />, // zombie
|
||||||
|
"T": <ResolvedIcon icon="mdi-decagram-outline" width={32} height={32} />, // traced
|
||||||
|
"t": <ResolvedIcon icon="mdi-hexagon-outline" width={32} height={32} />, // traced
|
||||||
|
"X": <ResolvedIcon icon="mdi-rhombus-outline" width={32} height={32} />, // dead
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const { data, error } = useWidgetAPI(service.widget, 'processlist', {
|
||||||
|
refreshInterval: 1000,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
return <Container><Error error={error} /></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
data.splice(5);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container>
|
||||||
|
<Block position="top-4 right-3 left-3">
|
||||||
|
<div className="flex items-center text-xs">
|
||||||
|
<div className="grow" />
|
||||||
|
<div className="w-14 text-right italic">{t("resources.cpu")}</div>
|
||||||
|
<div className="w-14 text-right">{t("resources.mem")}</div>
|
||||||
|
</div>
|
||||||
|
</Block>
|
||||||
|
|
||||||
|
<Block position="bottom-4 right-3 left-3">
|
||||||
|
<div className="pointer-events-none text-theme-900 dark:text-theme-200">
|
||||||
|
{ data.map((item) => <div key={item.pid} className="text-[0.75rem] h-[0.8rem]">
|
||||||
|
<div className="flex items-center">
|
||||||
|
<div className="w-3 h-3 mr-1.5 opacity-50">
|
||||||
|
{statusMap[item.status]}
|
||||||
|
</div>
|
||||||
|
<div className="opacity-75 grow">{item.name}</div>
|
||||||
|
<div className="opacity-25 w-14 text-right">{item.cpu_percent.toFixed(1)}%</div>
|
||||||
|
<div className="opacity-25 w-14 text-right">{t("common.bytes", {
|
||||||
|
value: item.memory_info[0],
|
||||||
|
maximumFractionDigits: 0,
|
||||||
|
})}</div>
|
||||||
|
</div>
|
||||||
|
</div>) }
|
||||||
|
</div>
|
||||||
|
</Block>
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
88
src/widgets/glances/metrics/sensor.jsx
Normal file
88
src/widgets/glances/metrics/sensor.jsx
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
import dynamic from "next/dynamic";
|
||||||
|
import { useState, useEffect } from "react";
|
||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import Error from "../components/error";
|
||||||
|
import Container from "../components/container";
|
||||||
|
import Block from "../components/block";
|
||||||
|
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
const Chart = dynamic(() => import("../components/chart"), { ssr: false });
|
||||||
|
|
||||||
|
const pointsLimit = 15;
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { widget } = service;
|
||||||
|
const [, sensorName] = widget.metric.split(':');
|
||||||
|
|
||||||
|
const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ value: 0 }, 0, pointsLimit));
|
||||||
|
|
||||||
|
const { data, error } = useWidgetAPI(service.widget, 'sensors', {
|
||||||
|
refreshInterval: 1000,
|
||||||
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (data) {
|
||||||
|
const sensorData = data.find((item) => item.label === sensorName);
|
||||||
|
setDataPoints((prevDataPoints) => {
|
||||||
|
const newDataPoints = [...prevDataPoints, { value: sensorData.value }];
|
||||||
|
if (newDataPoints.length > pointsLimit) {
|
||||||
|
newDataPoints.shift();
|
||||||
|
}
|
||||||
|
return newDataPoints;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, [data, sensorName]);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
return <Container><Error error={error} /></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
const sensorData = data.find((item) => item.label === sensorName);
|
||||||
|
|
||||||
|
if (!sensorData) {
|
||||||
|
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container>
|
||||||
|
<Chart
|
||||||
|
dataPoints={dataPoints}
|
||||||
|
label={[sensorData.unit]}
|
||||||
|
max={sensorData.critical}
|
||||||
|
formatter={(value) => t("common.number", {
|
||||||
|
value,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{sensorData && !error && (
|
||||||
|
<Block position="bottom-3 left-3">
|
||||||
|
{sensorData.warning && (
|
||||||
|
<div className="text-xs opacity-50">
|
||||||
|
{sensorData.warning}{sensorData.unit} {t("glances.warn")}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{sensorData.critical && (
|
||||||
|
<div className="text-xs opacity-50">
|
||||||
|
{sensorData.critical} {sensorData.unit} {t("glances.crit")}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</Block>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<Block position="bottom-3 right-3">
|
||||||
|
<div className="text-xs opacity-75">
|
||||||
|
{t("common.number", {
|
||||||
|
value: sensorData.value,
|
||||||
|
})} {sensorData.unit}
|
||||||
|
</div>
|
||||||
|
</Block>
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
8
src/widgets/glances/widget.js
Normal file
8
src/widgets/glances/widget.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||||
|
|
||||||
|
const widget = {
|
||||||
|
api: "{url}/api/3/{endpoint}",
|
||||||
|
proxyHandler: credentialedProxyHandler,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default widget;
|
||||||
93
src/widgets/urbackup/component.jsx
Normal file
93
src/widgets/urbackup/component.jsx
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
import Container from "components/services/widget/container";
|
||||||
|
import Block from "components/services/widget/block";
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
const Status = Object.freeze({
|
||||||
|
ok: Symbol("Ok"),
|
||||||
|
errored: Symbol("Errored"),
|
||||||
|
noRecent: Symbol("No Recent Backups")
|
||||||
|
});
|
||||||
|
|
||||||
|
function hasRecentBackups(client, maxDays){
|
||||||
|
const days = maxDays || 3;
|
||||||
|
const diffTime = days*24*60*60 // 7 days
|
||||||
|
const recentFile = (client.lastbackup > (Date.now() / 1000 - diffTime));
|
||||||
|
const recentImage = client.image_not_supported || client.image_disabled || (client.lastbackup_image > (Date.now() / 1000 - diffTime));
|
||||||
|
return (recentFile && recentImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
function determineStatuses(urbackupData) {
|
||||||
|
let ok = 0;
|
||||||
|
let errored = 0;
|
||||||
|
let noRecent = 0;
|
||||||
|
let status;
|
||||||
|
urbackupData.clientStatuses.forEach((client) => {
|
||||||
|
status = Status.noRecent;
|
||||||
|
if (hasRecentBackups(client, urbackupData.maxDays)) {
|
||||||
|
status = (client.file_ok && (client.image_ok || client.image_not_supported || client.image_disabled)) ? Status.ok : Status.errored;
|
||||||
|
}
|
||||||
|
switch (status) {
|
||||||
|
case Status.ok:
|
||||||
|
ok += 1;
|
||||||
|
break;
|
||||||
|
case Status.errored:
|
||||||
|
errored += 1;
|
||||||
|
break;
|
||||||
|
case Status.noRecent:
|
||||||
|
noRecent += 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let totalUsage = false;
|
||||||
|
|
||||||
|
// calculate total disk space if provided
|
||||||
|
if (urbackupData.diskUsage) {
|
||||||
|
totalUsage = 0.0;
|
||||||
|
urbackupData.diskUsage.forEach((client) => {
|
||||||
|
totalUsage += client.used;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return { ok, errored, noRecent, totalUsage };
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const { widget } = service;
|
||||||
|
|
||||||
|
const showDiskUsage = widget.fields?.includes('totalUsed')
|
||||||
|
|
||||||
|
const { data: urbackupData, error: urbackupError } = useWidgetAPI(widget, "status");
|
||||||
|
|
||||||
|
if (urbackupError) {
|
||||||
|
return <Container service={service} error={urbackupError} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!urbackupData) {
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
<Block label="urbackup.ok" />
|
||||||
|
<Block label="urbackup.errored" />
|
||||||
|
<Block label="urbackup.noRecent" />
|
||||||
|
{showDiskUsage && <Block label="urbackup.totalUsed" />}
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const statusData = determineStatuses(urbackupData, widget);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
<Block label="urbackup.ok" value={t("common.number", { value: parseInt(statusData.ok, 10) })} />
|
||||||
|
<Block label="urbackup.errored" value={t("common.number", { value: parseInt(statusData.errored, 10) })} />
|
||||||
|
<Block label="urbackup.noRecent" value={t("common.number", { value: parseInt(statusData.noRecent, 10) })} />
|
||||||
|
{showDiskUsage && <Block label="urbackup.totalUsed" value={t("common.bbytes", {value: parseFloat(statusData.totalUsage, 10)})} />}
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
33
src/widgets/urbackup/proxy.js
Normal file
33
src/widgets/urbackup/proxy.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import {UrbackupServer} from "urbackup-server-api";
|
||||||
|
|
||||||
|
import getServiceWidget from "utils/config/service-helpers";
|
||||||
|
|
||||||
|
export default async function urbackupProxyHandler(req, res) {
|
||||||
|
const {group, service} = req.query;
|
||||||
|
const serviceWidget = await getServiceWidget(group, service);
|
||||||
|
|
||||||
|
const server = new UrbackupServer({
|
||||||
|
url: serviceWidget.url,
|
||||||
|
username: serviceWidget.username,
|
||||||
|
password: serviceWidget.password
|
||||||
|
});
|
||||||
|
|
||||||
|
await (async () => {
|
||||||
|
try {
|
||||||
|
const allClients = await server.getStatus({includeRemoved: false});
|
||||||
|
let diskUsage = false
|
||||||
|
if (serviceWidget.fields?.includes("totalUsed")) {
|
||||||
|
diskUsage = await server.getUsage();
|
||||||
|
}
|
||||||
|
res.status(200).send({
|
||||||
|
clientStatuses: allClients,
|
||||||
|
diskUsage,
|
||||||
|
maxDays: serviceWidget.maxDays
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
res.status(500).json({ error: "Error communicating with UrBackup server" })
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
7
src/widgets/urbackup/widget.js
Normal file
7
src/widgets/urbackup/widget.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import urbackupProxyHandler from "./proxy";
|
||||||
|
|
||||||
|
const widget = {
|
||||||
|
proxyHandler: urbackupProxyHandler,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default widget;
|
||||||
@ -2,7 +2,7 @@ import adguard from "./adguard/widget";
|
|||||||
import audiobookshelf from "./audiobookshelf/widget";
|
import audiobookshelf from "./audiobookshelf/widget";
|
||||||
import authentik from "./authentik/widget";
|
import authentik from "./authentik/widget";
|
||||||
import autobrr from "./autobrr/widget";
|
import autobrr from "./autobrr/widget";
|
||||||
import azurePipelines from "./azurePipelines/widget";
|
import azuredevops from "./azuredevops/widget";
|
||||||
import bazarr from "./bazarr/widget";
|
import bazarr from "./bazarr/widget";
|
||||||
import caddy from "./caddy/widget";
|
import caddy from "./caddy/widget";
|
||||||
import changedetectionio from "./changedetectionio/widget";
|
import changedetectionio from "./changedetectionio/widget";
|
||||||
@ -19,6 +19,7 @@ import flood from "./flood/widget";
|
|||||||
import freshrss from "./freshrss/widget";
|
import freshrss from "./freshrss/widget";
|
||||||
import gamedig from "./gamedig/widget";
|
import gamedig from "./gamedig/widget";
|
||||||
import ghostfolio from "./ghostfolio/widget";
|
import ghostfolio from "./ghostfolio/widget";
|
||||||
|
import glances from "./glances/widget";
|
||||||
import gluetun from "./gluetun/widget";
|
import gluetun from "./gluetun/widget";
|
||||||
import gotify from "./gotify/widget";
|
import gotify from "./gotify/widget";
|
||||||
import grafana from "./grafana/widget";
|
import grafana from "./grafana/widget";
|
||||||
@ -87,13 +88,14 @@ import uptimekuma from "./uptimekuma/widget";
|
|||||||
import watchtower from "./watchtower/widget";
|
import watchtower from "./watchtower/widget";
|
||||||
import whatsupdocker from "./whatsupdocker/widget";
|
import whatsupdocker from "./whatsupdocker/widget";
|
||||||
import xteve from "./xteve/widget";
|
import xteve from "./xteve/widget";
|
||||||
|
import urbackup from "./urbackup/widget";
|
||||||
|
|
||||||
const widgets = {
|
const widgets = {
|
||||||
adguard,
|
adguard,
|
||||||
audiobookshelf,
|
audiobookshelf,
|
||||||
authentik,
|
authentik,
|
||||||
autobrr,
|
autobrr,
|
||||||
azurePipelines,
|
azuredevops,
|
||||||
bazarr,
|
bazarr,
|
||||||
caddy,
|
caddy,
|
||||||
changedetectionio,
|
changedetectionio,
|
||||||
@ -110,6 +112,7 @@ const widgets = {
|
|||||||
freshrss,
|
freshrss,
|
||||||
gamedig,
|
gamedig,
|
||||||
ghostfolio,
|
ghostfolio,
|
||||||
|
glances,
|
||||||
gluetun,
|
gluetun,
|
||||||
gotify,
|
gotify,
|
||||||
grafana,
|
grafana,
|
||||||
@ -177,6 +180,7 @@ const widgets = {
|
|||||||
unifi_console: unifi,
|
unifi_console: unifi,
|
||||||
unmanic,
|
unmanic,
|
||||||
uptimekuma,
|
uptimekuma,
|
||||||
|
urbackup,
|
||||||
watchtower,
|
watchtower,
|
||||||
whatsupdocker,
|
whatsupdocker,
|
||||||
xteve,
|
xteve,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user